@@ -76,12 +76,13 @@ func (s *Server) GetStatus() interface{} {
7676 Incomers : make (map [string ]shttp.WSConnStatus ),
7777 Outgoers : make (map [string ]shttp.WSConnStatus ),
7878 }
79- for host , peer := range s .replicationEndpoint .conns {
80- if host == peer .GetHost () {
81- peersStatus .Incomers [host ] = peer .GetStatus ()
82- } else {
83- peersStatus .Outgoers [host ] = peer .GetStatus ()
84- }
79+
80+ for _ , speaker := range s .replicationEndpoint .in .GetSpeakers () {
81+ peersStatus .Incomers [speaker .GetRemoteHost ()] = speaker .GetStatus ()
82+ }
83+
84+ for _ , speaker := range s .replicationEndpoint .out .GetSpeakers () {
85+ peersStatus .Outgoers [speaker .GetRemoteHost ()] = speaker .GetStatus ()
8586 }
8687
8788 return & types.AnalyzerStatus {
@@ -190,7 +191,7 @@ func NewServerFromConfig() (*Server, error) {
190191 for {
191192 host := config .GetString ("host_id" )
192193 if err = etcdClient .SetInt64 (fmt .Sprintf ("/analyzer:%s/start-time" , host ), time .Now ().Unix ()); err != nil {
193- logging .GetLogger ().Errorf ("Etcd server not ready: %s" , err . Error () )
194+ logging .GetLogger ().Errorf ("Etcd server not ready: %s" , err )
194195 time .Sleep (time .Second )
195196 } else {
196197 break
@@ -228,83 +229,97 @@ func NewServerFromConfig() (*Server, error) {
228229
229230 g := graph .NewGraphFromConfig (cached , common .AnalyzerService )
230231
231- authOptions := NewAnalyzerAuthenticationOpts ()
232+ clusterAuthOptions := AnalyzerClusterAuthenticationOpts ()
233+
234+ clusterAuthBackendName := config .GetString ("analyzer.auth.cluster.backend" )
235+ clusterAuthBackend , err := shttp .NewAuthenticationBackendByName (clusterAuthBackendName )
236+ if err != nil {
237+ return nil , err
238+ }
239+ // force admin user for the cluster backend to ensure that all the user connection through
240+ // "cluster" endpoints will be admin
241+ clusterAuthBackend .SetDefaultUserRole ("admin" )
232242
233- agentWSServer := shttp . NewWSStructServer ( shttp . NewWSServer ( hserver , "/ws/agent" ) )
234- _ , err = NewTopologyAgentEndpoint ( agentWSServer , authOptions , cached , g )
243+ apiAuthBackendName := config . GetString ( "analyzer.auth.api.backend" )
244+ apiAuthBackend , err := shttp . NewAuthenticationBackendByName ( apiAuthBackendName )
235245 if err != nil {
236246 return nil , err
237247 }
238248
239- publisherWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/publisher" ))
240- _ , err = NewTopologyPublisherEndpoint (publisherWSServer , authOptions , g )
249+ hserver .RegisterLoginRoute (apiAuthBackend )
250+
251+ agentWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/agent" , clusterAuthBackend ))
252+ _ , err = NewTopologyAgentEndpoint (agentWSServer , cached , g )
241253 if err != nil {
242254 return nil , err
243255 }
244256
245- replicationWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/replication" ))
246- replicationEndpoint , err := NewTopologyReplicationEndpoint ( replicationWSServer , authOptions , cached , g )
257+ publisherWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/publisher" , apiAuthBackend ))
258+ _ , err = NewTopologyPublisherEndpoint ( publisherWSServer , g )
247259 if err != nil {
248260 return nil , err
249261 }
250262
251263 tableClient := flow .NewTableClient (agentWSServer )
252264
253265 storage , err := storage .NewStorageFromConfig (etcdClient )
266+
267+ replicationWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/replication" , clusterAuthBackend ))
268+ replicationEndpoint , err := NewTopologyReplicationEndpoint (replicationWSServer , clusterAuthOptions , cached , g )
254269 if err != nil {
255270 return nil , err
256271 }
257272
258- // declare all extension available throught API and filtering
273+ // declare all extension available through API and filtering
259274 tr := traversal .NewGremlinTraversalParser ()
260275 tr .AddTraversalExtension (ge .NewMetricsTraversalExtension ())
261276 tr .AddTraversalExtension (ge .NewRawPacketsTraversalExtension ())
262277 tr .AddTraversalExtension (ge .NewFlowTraversalExtension (tableClient , storage ))
263278 tr .AddTraversalExtension (ge .NewSocketsTraversalExtension ())
264279 tr .AddTraversalExtension (ge .NewDescendantsTraversalExtension ())
265280
266- subscriberWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/subscriber" ))
281+ subscriberWSServer := shttp .NewWSStructServer (shttp .NewWSServer (hserver , "/ws/subscriber" , apiAuthBackend ))
267282 topology .NewTopologySubscriberEndpoint (subscriberWSServer , g , tr )
268283
269284 probeBundle , err := NewTopologyProbeBundleFromConfig (g )
270285 if err != nil {
271286 return nil , err
272287 }
273288
274- apiServer , err := api .NewAPI (hserver , etcdClient .KeysAPI , common .AnalyzerService )
289+ apiServer , err := api .NewAPI (hserver , etcdClient .KeysAPI , common .AnalyzerService , apiAuthBackend )
275290 if err != nil {
276291 return nil , err
277292 }
278293
279- captureAPIHandler , err := api .RegisterCaptureAPI (apiServer , g )
294+ captureAPIHandler , err := api .RegisterCaptureAPI (apiServer , g , apiAuthBackend )
280295 if err != nil {
281296 return nil , err
282297 }
283298
284- metadataAPIHandler , err := api .RegisterUserMetadataAPI (apiServer , g )
299+ metadataAPIHandler , err := api .RegisterUserMetadataAPI (apiServer , g , apiAuthBackend )
285300 if err != nil {
286301 return nil , err
287302 }
288303
289- piAPIHandler , err := api .RegisterPacketInjectorAPI (g , apiServer )
304+ piAPIHandler , err := api .RegisterPacketInjectorAPI (g , apiServer , apiAuthBackend )
290305 if err != nil {
291306 return nil , err
292307 }
293308 piClient := packet_injector .NewPacketInjectorClient (agentWSServer , etcdClient , piAPIHandler , g )
294309
295- if _ , err = api .RegisterAlertAPI (apiServer ); err != nil {
310+ if _ , err = api .RegisterAlertAPI (apiServer , apiAuthBackend ); err != nil {
296311 return nil , err
297312 }
298313
299- if _ , err := api .RegisterWorkflowAPI (apiServer ); err != nil {
314+ if _ , err := api .RegisterWorkflowAPI (apiServer , apiAuthBackend ); err != nil {
300315 return nil , err
301316 }
302317
303318 onDemandClient := ondemand .NewOnDemandProbeClient (g , captureAPIHandler , agentWSServer , subscriberWSServer , etcdClient )
304319
305320 metadataManager := metadata .NewUserMetadataManager (g , metadataAPIHandler )
306321
307- flowServer , err := NewFlowServer (hserver , g , storage , probeBundle )
322+ flowServer , err := NewFlowServer (hserver , g , storage , probeBundle , clusterAuthBackend )
308323 if err != nil {
309324 return nil , err
310325 }
@@ -334,22 +349,34 @@ func NewServerFromConfig() (*Server, error) {
334349
335350 s .createStartupCapture (captureAPIHandler )
336351
337- api .RegisterTopologyAPI (hserver , g , tr )
338- api .RegisterPcapAPI (hserver , storage )
339- api .RegisterConfigAPI (hserver )
340- api .RegisterStatusAPI (hserver , s )
352+ api .RegisterTopologyAPI (hserver , g , tr , apiAuthBackend )
353+ api .RegisterPcapAPI (hserver , storage , apiAuthBackend )
354+ api .RegisterConfigAPI (hserver , apiAuthBackend )
355+ api .RegisterStatusAPI (hserver , s , apiAuthBackend )
341356
342- if err := dede .RegisterHandler ("terminal" , "/dede" , hserver .Router ); err != nil {
343- return nil , err
357+ if config .GetBool ("analyzer.ssh_enabled" ) {
358+ if err := dede .RegisterHandler ("terminal" , "/dede" , hserver .Router ); err != nil {
359+ return nil , err
360+ }
361+ }
362+
363+ // server index for the following url as the client side will redirect
364+ // the user to the correct page
365+ routes := []shttp.Route {
366+ {Path : "/topology" , Method : "GET" , HandlerFunc : hserver .ServeIndex },
367+ {Path : "/conversation" , Method : "GET" , HandlerFunc : hserver .ServeIndex },
368+ {Path : "/discovery" , Method : "GET" , HandlerFunc : hserver .ServeIndex },
369+ {Path : "/preference" , Method : "GET" , HandlerFunc : hserver .ServeIndex },
370+ {Path : "/status" , Method : "GET" , HandlerFunc : hserver .ServeIndex },
344371 }
372+ hserver .RegisterRoutes (routes , shttp .NewNoAuthenticationBackend ())
345373
346374 return s , nil
347375}
348376
349- // NewAnalyzerAuthenticationOpts returns an object to authenticate to the analyzer
350- func NewAnalyzerAuthenticationOpts () * shttp.AuthenticationOpts {
377+ func AnalyzerClusterAuthenticationOpts () * shttp.AuthenticationOpts {
351378 return & shttp.AuthenticationOpts {
352- Username : config .GetString ("auth.analyzer_username " ),
353- Password : config .GetString ("auth.analyzer_password " ),
379+ Username : config .GetString ("analyzer. auth.cluster.username " ),
380+ Password : config .GetString ("analyzer. auth.cluster.password " ),
354381 }
355382}
0 commit comments