diff --git a/cmd/skywire-visor/commands/root.go b/cmd/skywire-visor/commands/root.go index d6783b978d..be4062370a 100644 --- a/cmd/skywire-visor/commands/root.go +++ b/cmd/skywire-visor/commands/root.go @@ -2,8 +2,10 @@ package commands import ( "context" + "embed" "fmt" "io" + "io/fs" "io/ioutil" "net/http" _ "net/http/pprof" // nolint:gosec // https://golang.org/doc/diagnostics.html#profiling @@ -15,9 +17,6 @@ import ( "syscall" "time" - "embed" - "io/fs" - "github.com/pkg/profile" "github.com/skycoin/dmsg/buildinfo" "github.com/skycoin/dmsg/cmdutil" diff --git a/pkg/visor/api.go b/pkg/visor/api.go index 1f18dec412..25e6303d5c 100644 --- a/pkg/visor/api.go +++ b/pkg/visor/api.go @@ -56,6 +56,7 @@ type API interface { Transport(tid uuid.UUID) (*TransportSummary, error) AddTransport(remote cipher.PubKey, tpType string, timeout time.Duration) (*TransportSummary, error) RemoveTransport(tid uuid.UUID) error + SetPublicAutoconnect(pAc bool) error DiscoverTransportsByPK(pk cipher.PubKey) ([]*transport.Entry, error) DiscoverTransportByID(id uuid.UUID) (*transport.Entry, error) @@ -168,6 +169,7 @@ type Summary struct { PersistentTransports []transport.PersistentTransports `json:"persistent_transports"` SkybianBuildVersion string `json:"skybian_build_version"` BuildTag string `json:"build_tag"` + PublicAutoconnect bool `json:"public_autoconnect"` } // BuildTag variable that will set when building binary @@ -220,6 +222,7 @@ func (v *Visor) Summary() (*Summary, error) { PersistentTransports: pts, SkybianBuildVersion: skybianBuildVersion, BuildTag: BuildTag, + PublicAutoconnect: v.conf.Transport.PublicAutoconnect, } return summary, nil @@ -817,3 +820,8 @@ func (v *Visor) SetPersistentTransports(pTps []transport.PersistentTransports) e func (v *Visor) GetPersistentTransports() ([]transport.PersistentTransports, error) { return v.conf.GetPersistentTransports() } + +// SetPublicAutoconnect sets public_autoconnect config of visor +func (v *Visor) SetPublicAutoconnect(pAc bool) error { + return v.conf.UpdatePublicAutoconnect(pAc) +} diff --git a/pkg/visor/hypervisor.go b/pkg/visor/hypervisor.go index f3d9bbd734..956d208e8e 100644 --- a/pkg/visor/hypervisor.go +++ b/pkg/visor/hypervisor.go @@ -246,6 +246,7 @@ func (hv *Hypervisor) makeMux() chi.Router { r.Get("/visors/{pk}/transports/{tid}", hv.getTransport()) r.Delete("/visors/{pk}/transports/{tid}", hv.deleteTransport()) r.Delete("/visors/{pk}/transports/", hv.deleteTransports()) + r.Put("/visors/{pk}/public-autoconnect", hv.putPublicAutoconnect()) r.Get("/visors/{pk}/routes", hv.getRoutes()) r.Post("/visors/{pk}/routes", hv.postRoute()) r.Get("/visors/{pk}/routes/{rid}", hv.getRoute()) @@ -864,6 +865,30 @@ func (hv *Hypervisor) deleteTransports() http.HandlerFunc { }) } +func (hv *Hypervisor) putPublicAutoconnect() http.HandlerFunc { + return hv.withCtx(hv.visorCtx, func(w http.ResponseWriter, r *http.Request, ctx *httpCtx) { + var reqBody publicAutoconnectReq + + if err := httputil.ReadJSON(r, &reqBody); err != nil { + if err != io.EOF { + hv.log(r).Warnf("putPublicAutoconnect request: %v", err) + } + httputil.WriteJSON(w, r, http.StatusBadRequest, usermanager.ErrMalformedRequest) + return + } + + if err := ctx.API.SetPublicAutoconnect(reqBody.PublicAutoconnect); err != nil { + httputil.WriteJSON(w, r, http.StatusInternalServerError, err) + return + } + httputil.WriteJSON(w, r, http.StatusOK, struct{}{}) + }) +} + +type publicAutoconnectReq struct { + PublicAutoconnect bool `json:"public_autoconnect"` +} + type routingRuleResp struct { Key routing.RouteID `json:"key"` Rule string `json:"rule"` diff --git a/pkg/visor/init.go b/pkg/visor/init.go index bb9e57c0c3..fad046c1e9 100644 --- a/pkg/visor/init.go +++ b/pkg/visor/init.go @@ -665,7 +665,7 @@ func initPublicVisor(_ context.Context, v *Visor, log *logging.Logger) error { } func initPublicVisors(ctx context.Context, v *Visor, log *logging.Logger) error { - if !v.conf.Transport.AutoconnectPublic { + if !v.conf.Transport.PublicAutoconnect { return nil } serviceDisc := v.conf.Launcher.ServiceDisc diff --git a/pkg/visor/rpc_client.go b/pkg/visor/rpc_client.go index 51cc9fce12..01775fa734 100644 --- a/pkg/visor/rpc_client.go +++ b/pkg/visor/rpc_client.go @@ -289,6 +289,13 @@ func (rc *rpcClient) DiscoverTransportByID(id uuid.UUID) (*transport.Entry, erro return &entry, err } +// SetPublicAutoconnect implements API. +func (rc *rpcClient) SetPublicAutoconnect(pAc bool) error { + return rc.Call("SetPublicAutoconnect", &publicAutoconnectReq{ + PublicAutoconnect: pAc, + }, &struct{}{}) +} + // RoutingRules calls RoutingRules. func (rc *rpcClient) RoutingRules() ([]routing.Rule, error) { entries := make([]routing.Rule, 0) @@ -889,6 +896,11 @@ func (mc *mockRPCClient) DiscoverTransportByID(uuid.UUID) (*transport.Entry, err return nil, ErrNotImplemented } +// SetPublicAutoconnect implements API. +func (mc *mockRPCClient) SetPublicAutoconnect(_ bool) error { + return nil +} + // RoutingRules implements API. func (mc *mockRPCClient) RoutingRules() ([]routing.Rule, error) { return mc.rt.AllRules(), nil diff --git a/pkg/visor/visorconfig/v1.go b/pkg/visor/visorconfig/v1.go index 63d352208d..493175ddf3 100644 --- a/pkg/visor/visorconfig/v1.go +++ b/pkg/visor/visorconfig/v1.go @@ -80,7 +80,7 @@ type V1Dmsgpty struct { type V1Transport struct { Discovery string `json:"discovery"` AddressResolver string `json:"address_resolver"` - AutoconnectPublic bool `json:"public_autoconnect"` + PublicAutoconnect bool `json:"public_autoconnect"` TransportSetup []cipher.PubKey `json:"transport_setup_nodes"` } @@ -205,6 +205,15 @@ func (v1 *V1) GetPersistentTransports() ([]transport.PersistentTransports, error return v1.PersistentTransports, nil } +// UpdatePublicAutoconnect updates public_autoconnect in config +func (v1 *V1) UpdatePublicAutoconnect(pAc bool) error { + v1.mu.Lock() + v1.Transport.PublicAutoconnect = pAc + v1.mu.Unlock() + + return v1.flush(v1) +} + // updateStringArg updates the cli non-boolean flag of the specified app config and also within the launcher. // It removes argName from app args if value is an empty string. // The updated config gets flushed to file if there are any changes.