diff --git a/.goreleaser-windows.yml b/.goreleaser-windows.yml index ce28a9cfe3..fb4140b814 100644 --- a/.goreleaser-windows.yml +++ b/.goreleaser-windows.yml @@ -22,20 +22,11 @@ builds: goarch: - amd64 - 386 + - arm64 env: - CGO_ENABLED=1 main: ./cmd/skywire/ ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} -X github.com/skycoin/skywire/pkg/visor.BuildTag={{.Os}} - binary: apps/skysocks - goos: - - windows - goarch: - - amd64 - - 386 - env: - - CGO_ENABLED=0 - main: ./cmd/apps/skysocks - ldflags: -s -w -X github.com/skycoin/skywire-utilities/pkg/buildinfo.version=v{{.Version}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.commit={{.ShortCommit}} -X github.com/skycoin/skywire-utilities/pkg/buildinfo.date={{.Date}} archives: diff --git a/cmd/apps/skysocks-client/commands/skysocks-client.go b/cmd/apps/skysocks-client/commands/skysocks-client.go index ee17d59186..e4f3068613 100644 --- a/cmd/apps/skysocks-client/commands/skysocks-client.go +++ b/cmd/apps/skysocks-client/commands/skysocks-client.go @@ -5,15 +5,17 @@ import ( "context" "errors" "fmt" - "io" "log" "net" "net/http" "net/url" "os" + "os/signal" + "runtime" "time" "github.com/elazarl/goproxy" + ipc "github.com/james-barrow/golang-ipc" "github.com/spf13/cobra" "github.com/skycoin/skywire-utilities/pkg/buildinfo" @@ -43,7 +45,6 @@ func init() { RootCmd.Flags().StringVar(&addr, "addr", visorconfig.SkysocksClientAddr, "Client address to listen on") RootCmd.Flags().StringVar(&serverPK, "srv", "", "PubKey of the server to connect to") RootCmd.Flags().StringVar(&httpAddr, "http", "", "http proxy mode") - } // RootCmd is the root command for skysocks @@ -83,41 +84,63 @@ var RootCmd = &cobra.Command{ setAppErr(appCl, err) os.Exit(1) } + defer setAppStatus(appCl, appserver.AppDetailedStatusStopped) setAppPort(appCl, appCl.Config().RoutingPort) - for { - conn, err := dialServer(ctx, appCl, pk) - if err != nil { - print(fmt.Sprintf("Failed to dial to a server: %v\n", err)) - setAppErr(appCl, err) - os.Exit(1) - } - fmt.Printf("Connected to %v\n", pk) - client, err := skysocks.NewClient(conn, appCl) + conn, err := dialServer(ctx, appCl, pk) + if err != nil { + print(fmt.Sprintf("Failed to dial to a server: %v\n", err)) + setAppErr(appCl, err) + os.Exit(1) + } + + fmt.Printf("Connected to %v\n", pk) + client, err := skysocks.NewClient(conn, appCl) + if err != nil { + print(fmt.Sprintf("Failed to create a new client: %v\n", err)) + setAppErr(appCl, err) + os.Exit(1) + } + var closeSignal bool + if runtime.GOOS == "windows" { + ipcClient, err := ipc.StartClient(visorconfig.SkysocksName, nil) if err != nil { - print(fmt.Sprintf("Failed to create a new client: %v\n", err)) setAppErr(appCl, err) + print(fmt.Sprintf("Error creating ipc server for skysocks: %v\n", err)) os.Exit(1) } + go func() { + client.ListenIPC(ipcClient) + closeSignal = true + }() + } else { + termCh := make(chan os.Signal, 1) + signal.Notify(termCh, os.Interrupt) + go func() { + <-termCh + if err := client.Close(); err != nil { + print(fmt.Sprintf("%v\n", err)) + os.Exit(1) + } + closeSignal = true + }() + } - fmt.Printf("Serving proxy client %v\n", addr) - setAppStatus(appCl, appserver.AppDetailedStatusRunning) - httpCtx, httpCancel := context.WithCancel(ctx) - if httpAddr != "" { - go httpProxy(httpCtx, httpAddr, addr) - } + fmt.Printf("Serving proxy client %v\n", addr) + setAppStatus(appCl, appserver.AppDetailedStatusRunning) + httpCtx, httpCancel := context.WithCancel(ctx) + if httpAddr != "" { + go httpProxy(httpCtx, httpAddr, addr) + } + defer httpCancel() + for { if err := client.ListenAndServe(addr); err != nil { print(fmt.Sprintf("Error serving proxy client: %v\n", err)) } - httpCancel() - // need to filter this out, cause usually client failure means app conn is already closed - if err := conn.Close(); err != nil && err != io.ErrClosedPipe { - print(fmt.Sprintf("Error closing app conn: %v\n", err)) + if closeSignal { + break } - - fmt.Println("Reconnecting to skysocks server") - setAppStatus(appCl, appserver.AppDetailedStatusReconnecting) } }, } diff --git a/cmd/skywire-cli/commands/proxy/proxy.go b/cmd/skywire-cli/commands/proxy/proxy.go index a32d7ae394..05075417df 100644 --- a/cmd/skywire-cli/commands/proxy/proxy.go +++ b/cmd/skywire-cli/commands/proxy/proxy.go @@ -78,7 +78,7 @@ var startCmd = &cobra.Command{ internal.PrintFatalError(cmd.Flags(), fmt.Errorf("Error occurs during set args to custom skysocks client")) } } else { - err = rpcClient.AddApp(clientName, "skysocks-client") + err = rpcClient.AddApp(clientName, "skywire") if err != nil { internal.PrintFatalError(cmd.Flags(), fmt.Errorf("Error during add new app")) } @@ -109,8 +109,9 @@ var startCmd = &cobra.Command{ clientName = "skysocks-client" // change defaul skysocks-proxy app -srv arg and run it } else { - // error - return + internal.Catch(cmd.Flags(), rpcClient.StartApp("skysocks-client")) + internal.PrintOutput(cmd.Flags(), nil, "Starting.") + clientName = "skysocks-client" } ctx, cancel := cmdutil.SignalContext(context.Background(), &logrus.Logger{}) @@ -201,33 +202,35 @@ var statusCmd = &cobra.Command{ var jsonAppStatus []appState fmt.Fprintf(w, "---- All Proxy List -----------------------------------------------------\n\n") for _, state := range states { - if state.AppConfig.Binary == binaryName { - status := "stopped" - if state.Status == appserver.AppStatusRunning { - status = "running" - } - if state.Status == appserver.AppStatusErrored { - status = "errored" - } - jsonAppStatus = append(jsonAppStatus, appState{ - Name: state.Name, - Status: status, - AutoStart: state.AutoStart, - Args: state.Args, - AppPort: state.Port, - }) - var tmpAddr string - var tmpSrv string - for idx, arg := range state.Args { - if arg == "-srv" { - tmpSrv = state.Args[idx+1] + for _, v := range state.AppConfig.Args { + if v == binaryName { + status := "stopped" + if state.Status == appserver.AppStatusRunning { + status = "running" + } + if state.Status == appserver.AppStatusErrored { + status = "errored" } - if arg == "-addr" { - tmpAddr = "127.0.0.1" + state.Args[idx+1] + jsonAppStatus = append(jsonAppStatus, appState{ + Name: state.Name, + Status: status, + AutoStart: state.AutoStart, + Args: state.Args, + AppPort: state.Port, + }) + var tmpAddr string + var tmpSrv string + for idx, arg := range state.Args { + if arg == "--srv" { + tmpSrv = state.Args[idx+1] + } + if arg == "--addr" { + tmpAddr = "127.0.0.1" + state.Args[idx+1] + } } + _, err = fmt.Fprintf(w, "Name: %s\nStatus: %s\nServer: %s\nAddress: %s\nAppPort: %d\nAutoStart: %t\n\n", state.Name, status, tmpSrv, tmpAddr, state.Port, state.AutoStart) + internal.Catch(cmd.Flags(), err) } - _, err = fmt.Fprintf(w, "Name: %s\nStatus: %s\nServer: %s\nAddress: %s\nAppPort: %d\nAutoStart: %t\n\n", state.Name, status, tmpSrv, tmpAddr, state.Port, state.AutoStart) - internal.Catch(cmd.Flags(), err) } } fmt.Fprintf(w, "-------------------------------------------------------------------------\n") diff --git a/pkg/skyenv/skyenv.go b/pkg/skyenv/skyenv.go index 338257834c..518a592a5c 100644 --- a/pkg/skyenv/skyenv.go +++ b/pkg/skyenv/skyenv.go @@ -80,7 +80,7 @@ const ( AppSrvAddr = "localhost:5505" // AppSrvAddr ... ServiceDiscUpdateInterval = time.Minute // ServiceDiscUpdateInterval ... - AppBinPath = "./build" // AppBinPath ... + AppBinPath = "./" // AppBinPath ... LogLevel = "info" // LogLevel ... // Routing constants diff --git a/pkg/skyenv/skyenv_darwin.go b/pkg/skyenv/skyenv_darwin.go index e54193b325..47723a1adf 100644 --- a/pkg/skyenv/skyenv_darwin.go +++ b/pkg/skyenv/skyenv_darwin.go @@ -16,7 +16,7 @@ const ( // PackageConfig contains installation paths (for mac) func PackageConfig() PkgConfig { pkgConfig := PkgConfig{ - LauncherBinPath: "/Applications/Skywire.app/Contents/MacOS/bin", //apps are now subcommands of the skywire binary "/Applications/Skywire.app/Contents/MacOS/apps", + LauncherBinPath: "/Applications/Skywire.app/Contents/MacOS", //apps are now subcommands of the skywire binary "/Applications/Skywire.app/Contents/MacOS/apps", LocalPath: "/Library/Application Support/Skywire/local", Hypervisor: Hypervisor{ DbPath: "/Library/Application Support/Skywire/users.db", diff --git a/pkg/skyenv/skyenv_windows.go b/pkg/skyenv/skyenv_windows.go index 7510266da7..ebf339f517 100644 --- a/pkg/skyenv/skyenv_windows.go +++ b/pkg/skyenv/skyenv_windows.go @@ -16,7 +16,7 @@ const ( // PackageConfig contains installation paths (for windows) func PackageConfig() PkgConfig { pkgConfig := PkgConfig{ - LauncherBinPath: "C:/Program Files/Skywire/bin", //apps are now subcommands of the skywire binary "C:/Program Files/Skywire/apps", + LauncherBinPath: "C:/Program Files/Skywire", LocalPath: "C:/Program Files/Skywire/local", Hypervisor: Hypervisor{ DbPath: "C:/Program Files/Skywire/users.db", diff --git a/pkg/visor/api.go b/pkg/visor/api.go index 52496aa798..8cfc5e379c 100644 --- a/pkg/visor/api.go +++ b/pkg/visor/api.go @@ -637,8 +637,10 @@ func (v *Visor) StopSkysocksClients() error { } if v.procM != nil { for _, app := range v.conf.Launcher.Apps { - if app.Binary == visorconfig.SkysocksClientName { - v.appL.StopApp(app.Name) //nolint + for _, args := range app.Args { + if args == visorconfig.SkysocksClientName { + v.appL.StopApp(app.Name) //nolint + } } } return nil diff --git a/pkg/visor/visorconfig/values_darwin.go b/pkg/visor/visorconfig/values_darwin.go index 71967309e5..39dcd7ca96 100644 --- a/pkg/visor/visorconfig/values_darwin.go +++ b/pkg/visor/visorconfig/values_darwin.go @@ -16,7 +16,7 @@ import ( // UserConfig contains installation paths for running skywire as the user func UserConfig() skyenv.PkgConfig { usrConfig := skyenv.PkgConfig{ - LauncherBinPath: "/Applications/Skywire.app/Contents/MacOS/apps", + LauncherBinPath: "/Applications/Skywire.app/Contents/MacOS", LocalPath: HomePath() + "/.skywire/local", Hypervisor: skyenv.Hypervisor{ DbPath: HomePath() + "/.skywire/users.db", diff --git a/pkg/visor/visorconfig/values_windows.go b/pkg/visor/visorconfig/values_windows.go index 6cc4cfb18d..e2e23a6469 100644 --- a/pkg/visor/visorconfig/values_windows.go +++ b/pkg/visor/visorconfig/values_windows.go @@ -16,7 +16,7 @@ import ( // UserConfig contains installation paths for running skywire as the user func UserConfig() skyenv.PkgConfig { usrConfig := skyenv.PkgConfig{ - LauncherBinPath: "C:/Program Files/Skywire/apps", + LauncherBinPath: "C:/Program Files/Skywire", LocalPath: HomePath() + "/.skywire/local", Hypervisor: skyenv.Hypervisor{ DbPath: HomePath() + "/.skywire/users.db",