| // Copyright 2016 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "fmt" |
| "sort" |
| |
| "v.io/v23" |
| "v.io/v23/context" |
| "v.io/x/lib/cmdline" |
| "v.io/x/ref/lib/v23cmd" |
| ) |
| |
| var ( |
| cmdDiscoveryScan = &cmdline.Command{ |
| Runner: v23cmd.RunnerFunc(runDiscoveryScan), |
| Name: "scan", |
| Short: "Scan for advertised v23 services", |
| Long: ` |
| Scans for advertised v23 services that match the provided query. The set of |
| protocols over which services are scanned for depends on the platform on which |
| this command is being run. As of May 2016, services advertised over mDNS should |
| be scannable on all platforms but services advertised over BluetoothLE would |
| be scannable only on OS X. |
| `, |
| ArgsName: "[<query>]", |
| ArgsLong: ` |
| <query> scans for services that match the provided query. An empty query causes |
| all services to be scanned for. See https://godoc.org/v.io/v23/discovery#T for |
| details. |
| |
| Sample queries: |
| v.InterfaceName = "v.io/i" |
| v.InterfaceName = "v.io/i" AND v.Attributes["a"] = "v" |
| v.Attributes["a"] = "v1" OR v.Attributes["a"] = "v2" |
| `, |
| } |
| cmdDiscovery = &cmdline.Command{ |
| Name: "discovery", |
| Short: "Scan and advertise using the v23 discovery API", |
| Children: []*cmdline.Command{cmdDiscoveryScan}, |
| } |
| ) |
| |
| func runDiscoveryScan(ctx *context.T, env *cmdline.Env, args []string) error { |
| var query string |
| switch len(args) { |
| case 0: |
| query = "" |
| case 1: |
| query = args[0] |
| default: |
| return env.UsageErrorf("got %d arguments, expected at most 1", len(args)) |
| } |
| d, err := v23.NewDiscovery(ctx) |
| if err != nil { |
| return err |
| } |
| updates, err := d.Scan(ctx, query) |
| if err != nil { |
| return err |
| } |
| for u := range updates { |
| if u.IsLost() { |
| fmt.Fprintln(env.Stdout, "LOST:", u.Id(), "\n") |
| continue |
| } |
| // Pretty print as multi-line text |
| fmt.Fprintln(env.Stdout, "FOUND:") |
| ad := u.Advertisement() |
| fmt.Fprintln(env.Stdout, "Id: ", ad.Id) |
| fmt.Fprintln(env.Stdout, "InterfaceName:", ad.InterfaceName) |
| if len(ad.Addresses) > 0 { |
| fmt.Fprintln(env.Stdout, "Addresses: ", "{") |
| for _, a := range ad.Addresses { |
| fmt.Fprintln(env.Stdout, " ", a) |
| } |
| fmt.Fprintln(env.Stdout, "}") |
| } |
| if len(ad.Attributes) > 0 { |
| fmt.Fprintln(env.Stdout, "Attributes: ", "{") |
| var keys []string |
| for k := range ad.Attributes { |
| keys = append(keys, k) |
| } |
| sort.Strings(keys) |
| for _, k := range keys { |
| fmt.Fprintf(env.Stdout, " %q: %q\n", k, ad.Attributes[k]) |
| } |
| fmt.Fprintln(env.Stdout, "}") |
| } |
| if len(ad.Attachments) > 0 { |
| fmt.Fprintln(env.Stdout, "Attachments: ", "{") |
| var keys []string |
| for k := range ad.Attachments { |
| keys = append(keys, k) |
| } |
| sort.Strings(keys) |
| for _, k := range keys { |
| fmt.Fprintf(env.Stdout, " %q: (%d bytes)\n", k, len(ad.Attachments[k])) |
| } |
| fmt.Fprintln(env.Stdout, "}") |
| } |
| fmt.Fprintln(env.Stdout) |
| } |
| return nil |
| } |