@@ -17,48 +17,73 @@ package main
17
17
import (
18
18
"context"
19
19
"fmt"
20
- "net"
21
20
"strconv"
22
21
"time"
23
22
24
23
"github.com/spf13/cobra"
25
24
26
25
"github.com/scionproto/scion/pkg/addr"
27
- "github.com/scionproto/scion/pkg/log "
26
+ "github.com/scionproto/scion/pkg/daemon "
28
27
"github.com/scionproto/scion/pkg/private/serrors"
29
28
"github.com/scionproto/scion/private/app"
30
29
"github.com/scionproto/scion/private/app/flag"
31
30
"github.com/scionproto/scion/private/tracing"
32
- "github.com/scionproto/scion/scion/fabrid"
33
31
)
34
32
35
33
func newFabrid (pather CommandPather ) * cobra.Command {
36
34
var envFlags flag.SCIONEnvironment
37
35
var flags struct {
38
36
timeout time.Duration
39
- cfg fabrid.Config
40
- extended bool
41
- json bool
42
37
logLevel string
43
38
noColor bool
44
39
tracer string
45
40
format string
46
41
}
47
42
48
43
var cmd = & cobra.Command {
49
- Use : "fabrid" ,
44
+ Use : "fabrid identifier [remote_as] " ,
50
45
Short : "Display FABRID policy information" ,
51
46
Args : cobra .RangeArgs (1 , 2 ),
52
- Example : fmt .Sprintf (` %[1]s showpaths 1-ff00:0:110 --extended
53
- %[1]s showpaths 1-ff00:0:110 --local 127.0.0.55 --json
54
- %[1]s showpaths 1-ff00:0:111 --sequence="0-0#2 0*" # outgoing IfID=2
55
- %[1]s showpaths 1-ff00:0:111 --sequence="0* 0-0#41" # incoming IfID=41 at dstIA
56
- %[1]s showpaths 1-ff00:0:111 --sequence="0* 1-ff00:0:112 0*" # 1-ff00:0:112 on the path
57
- %[1]s showpaths 1-ff00:0:110 --no-probe` , pather .CommandPath ()),
58
- Long : `'fabrid' lists available policies at a remote AS, or shows the
59
- description of a specific policy.` ,
47
+ Example : fmt .Sprintf (` %[1]s fabrid G1001
48
+ %[1]s fabrid L1101 1-ff00:0:110
49
+ %[1]s fabrid L1101 1-ff00:0:110 --log.level debug'` , pather .CommandPath ()),
50
+ Long : `'fabrid' fetches the description of a global or local FABRID policy.` ,
60
51
RunE : func (cmd * cobra.Command , args []string ) error {
61
- if err := app .SetupLog (flags .logLevel ); err != nil {
52
+ if len (args [0 ]) < 2 {
53
+ return serrors .New ("Invalid identifier format" , "identifier" , args [0 ])
54
+ }
55
+
56
+ identifierPrefix := args [0 ][0 ]
57
+ var isLocal bool
58
+ switch identifierPrefix {
59
+ case 'L' :
60
+ isLocal = true
61
+ case 'G' :
62
+ isLocal = false
63
+ default :
64
+ return serrors .New ("invalid identifier prefix" , "prefix" , string (identifierPrefix ))
65
+ }
66
+
67
+ identifier , err := strconv .ParseUint (args [0 ][1 :], 10 , 32 )
68
+ if err != nil {
69
+ return serrors .New ("invalid identifier format" , "identifier" , args [0 ])
70
+ }
71
+
72
+ if isLocal && len (args ) == 1 {
73
+ return serrors .New ("missing destination ISD-AS for local policy" )
74
+ }
75
+ var dst addr.IA
76
+ if len (args ) > 1 {
77
+ if ! isLocal {
78
+ return serrors .New (
79
+ "unexpected argument. Global policies require no destination AS." )
80
+ }
81
+ dst , err = addr .ParseIA (args [1 ])
82
+ if err != nil {
83
+ return serrors .WrapStr ("invalid destination ISD-AS" , err )
84
+ }
85
+ }
86
+ if err = app .SetupLog (flags .logLevel ); err != nil {
62
87
return serrors .WrapStr ("setting up logging" , err )
63
88
}
64
89
closer , err := setupTracer ("fabrid" , flags .tracer )
@@ -67,88 +92,51 @@ description of a specific policy.`,
67
92
}
68
93
defer closer ()
69
94
70
- if flags .json && ! cmd .Flags ().Lookup ("format" ).Changed {
71
- flags .format = "json"
72
- }
73
-
74
95
cmd .SilenceUsage = true
75
96
76
- if err : = envFlags .LoadExternalVars (); err != nil {
97
+ if err = envFlags .LoadExternalVars (); err != nil {
77
98
return err
78
99
}
79
100
80
- flags .cfg .Daemon = envFlags .Daemon ()
81
- flags .cfg .Local = net .IP (envFlags .Local ().AsSlice ())
82
- log .Debug ("Resolved SCION environment flags" ,
83
- "daemon" , flags .cfg .Daemon ,
84
- "local" , flags .cfg .Local ,
85
- )
101
+ daemonAddr := envFlags .Daemon ()
86
102
87
103
span , traceCtx := tracing .CtxWith (context .Background (), "run" )
88
104
defer span .Finish ()
105
+ span .SetTag ("dst.isd_as" , dst )
89
106
90
107
ctx , cancel := context .WithTimeout (traceCtx , flags .timeout )
91
108
defer cancel ()
92
- if len (args ) == 1 {
93
- identifier , err := strconv .ParseUint (args [0 ], 10 , 32 )
94
- if err != nil {
95
- return serrors .WrapStr ("invalid policy identifier" , err )
96
- }
97
- _ , err = fabrid .Run (ctx , false , nil , uint32 (identifier ), flags .cfg )
98
- if err != nil {
99
- return err
100
- }
101
109
102
- } else if len (args ) == 2 {
103
- dst , err := addr .ParseIA (args [0 ])
104
- if err != nil {
105
- return serrors .WrapStr ("invalid destination ISD-AS" , err )
106
- }
107
- identifier , err := strconv .ParseUint (args [1 ], 10 , 32 )
108
- if err != nil {
109
- return serrors .WrapStr ("invalid policy identifier" , err )
110
- }
111
- _ , err = fabrid .Run (ctx , true , & dst , uint32 (identifier ), flags .cfg )
112
- if err != nil {
113
- return err
114
- }
115
- span .SetTag ("dst.isd_as" , dst )
110
+ var description string
111
+ daemonService := & daemon.Service {
112
+ Address : daemonAddr ,
116
113
}
117
- switch flags . format {
118
- case "human" :
119
- return nil
120
- case "json" :
121
- return serrors . New ( "Not implemented" , "format" , flags . format )
122
- case "yaml" :
123
- return serrors . New ( "Not implemented" , "format" , flags . format )
124
- default :
125
- return serrors .New ( "output format not supported" , "format" , flags . format )
114
+ sdConn , err := daemonService . Connect ( ctx )
115
+ if err != nil {
116
+ return serrors . WrapStr ( "connecting to the SCION Daemon" , err , "addr" , daemonAddr )
117
+ }
118
+ defer sdConn . Close ( )
119
+
120
+ description , err = sdConn . PolicyDescription ( ctx , isLocal , uint32 ( identifier ), & dst )
121
+ if err != nil {
122
+ return serrors .WrapStr ( "retrieving description from the SCION Daemon" , err )
126
123
}
124
+ // Output the description
125
+ if isLocal {
126
+ fmt .Printf ("Policy L%d@%s\n %s\n " , identifier , dst , description )
127
+ } else {
128
+ fmt .Printf ("Policy G%d\n %s\n " , identifier , description )
129
+ }
130
+ return nil
127
131
},
128
132
}
129
133
130
134
envFlags .Register (cmd .Flags ())
131
135
cmd .Flags ().DurationVar (& flags .timeout , "timeout" , 5 * time .Second , "Timeout" )
132
- cmd .Flags ().StringVar (& flags .cfg .Sequence , "sequence" , "" , app .SequenceUsage )
133
- cmd .Flags ().IntVarP (& flags .cfg .MaxPaths , "maxpaths" , "m" , 10 ,
134
- "Maximum number of paths that are displayed" )
135
- cmd .Flags ().BoolVarP (& flags .extended , "extended" , "e" , false ,
136
- "Show extended path meta data information" )
137
- cmd .Flags ().BoolVarP (& flags .cfg .Refresh , "refresh" , "r" , false ,
138
- "Set refresh flag for SCION Daemon path request" )
139
- cmd .Flags ().BoolVar (& flags .cfg .NoProbe , "no-probe" , false ,
140
- "Do not probe the paths and print the health status" )
141
- cmd .Flags ().BoolVarP (& flags .json , "json" , "j" , false ,
142
- "Write the output as machine readable json" )
143
136
cmd .Flags ().StringVar (& flags .format , "format" , "human" ,
144
137
"Specify the output format (human|json|yaml)" )
145
138
cmd .Flags ().BoolVar (& flags .noColor , "no-color" , false , "disable colored output" )
146
139
cmd .Flags ().StringVar (& flags .logLevel , "log.level" , "" , app .LogLevelUsage )
147
140
cmd .Flags ().StringVar (& flags .tracer , "tracing.agent" , "" , "Tracing agent address" )
148
- cmd .Flags ().BoolVar (& flags .cfg .Epic , "epic" , false , "Enable EPIC." )
149
- err := cmd .Flags ().MarkDeprecated ("json" , "json flag is deprecated, use format flag" )
150
- if err != nil {
151
- panic (err )
152
- }
153
141
return cmd
154
142
}
0 commit comments