wip: add version command to exec
This commit is contained in:
parent
db251da5f6
commit
3dbac84f36
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,6 +1,4 @@
|
|||||||
/cmd/wingmate/wingmate
|
/cmd/wingmate/wingmate
|
||||||
/cmd/wingmate/version.txt
|
/cmd/wingmate/version.txt
|
||||||
/cmd/pidproxy/pidproxy
|
/cmd/pidproxy/pidproxy
|
||||||
/cmd/pidproxy/version.txt
|
/cmd/exec/exec
|
||||||
/cmd/exec/exec
|
|
||||||
/cmd/exec/version.txt
|
|
||||||
@ -3,7 +3,6 @@ all:
|
|||||||
go build -v
|
go build -v
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm version.txt
|
|
||||||
go clean -i -cache -testcache
|
go clean -i -cache -testcache
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
|||||||
138
cmd/exec/exec.go
138
cmd/exec/exec.go
@ -1,79 +1,82 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
_ "embed"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"gitea.suyono.dev/suyono/wingmate"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.suyono.dev/suyono/wingmate"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type execApp struct {
|
||||||
|
childArgs []string
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
setsidFlag = "setsid"
|
setsidFlag = "setsid"
|
||||||
EnvSetsid = "SETSID"
|
EnvSetsid = "SETSID"
|
||||||
userFlag = "user"
|
userFlag = "user"
|
||||||
EnvUser = "USER"
|
EnvUser = "USER"
|
||||||
|
versionFlag = "version"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
rootCmd = &cobra.Command{
|
|
||||||
Use: "wmexec",
|
|
||||||
RunE: execCmd,
|
|
||||||
}
|
|
||||||
|
|
||||||
childArgs []string
|
//go:embed version.txt
|
||||||
|
version string
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
found bool
|
selfArgs []string
|
||||||
i int
|
childArgs []string
|
||||||
arg string
|
app *execApp
|
||||||
selfArgs []string
|
rootCmd *cobra.Command
|
||||||
|
versionCmd *cobra.Command
|
||||||
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
app = &execApp{}
|
||||||
|
|
||||||
|
rootCmd = &cobra.Command{
|
||||||
|
Use: "wmexec",
|
||||||
|
SilenceUsage: true,
|
||||||
|
RunE: app.execCmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
versionCmd = &cobra.Command{
|
||||||
|
Use: "version",
|
||||||
|
RunE: app.versionCmd,
|
||||||
|
}
|
||||||
|
|
||||||
rootCmd.PersistentFlags().BoolP(setsidFlag, "s", false, "set to true to run setsid() before exec")
|
rootCmd.PersistentFlags().BoolP(setsidFlag, "s", false, "set to true to run setsid() before exec")
|
||||||
viper.BindPFlag(EnvSetsid, rootCmd.PersistentFlags().Lookup(setsidFlag))
|
viper.BindPFlag(EnvSetsid, rootCmd.PersistentFlags().Lookup(setsidFlag))
|
||||||
|
|
||||||
rootCmd.PersistentFlags().StringP(userFlag, "u", "", "\"user:[group]\"")
|
rootCmd.PersistentFlags().StringP(userFlag, "u", "", "\"user:[group]\"")
|
||||||
viper.BindPFlag(EnvUser, rootCmd.PersistentFlags().Lookup(userFlag))
|
viper.BindPFlag(EnvUser, rootCmd.PersistentFlags().Lookup(userFlag))
|
||||||
|
|
||||||
|
rootCmd.PersistentFlags().Bool(versionFlag, false, "print version")
|
||||||
|
viper.BindPFlag(versionFlag, rootCmd.PersistentFlags().Lookup(versionFlag))
|
||||||
|
|
||||||
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
||||||
viper.BindEnv(EnvUser)
|
viper.BindEnv(EnvUser)
|
||||||
viper.BindEnv(EnvSetsid)
|
viper.BindEnv(EnvSetsid)
|
||||||
viper.SetDefault(EnvSetsid, false)
|
viper.SetDefault(EnvSetsid, false)
|
||||||
viper.SetDefault(EnvUser, "")
|
viper.SetDefault(EnvUser, "")
|
||||||
|
|
||||||
found = false
|
rootCmd.AddCommand(versionCmd)
|
||||||
for i, arg = range os.Args {
|
|
||||||
if arg == "--" {
|
|
||||||
found = true
|
|
||||||
if len(os.Args) <= i+1 {
|
|
||||||
log.Println("invalid argument")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
selfArgs = os.Args[1:i]
|
|
||||||
childArgs = os.Args[i+1:]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !found {
|
|
||||||
log.Println("invalid argument")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(childArgs) == 0 {
|
|
||||||
log.Println("invalid argument")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
selfArgs, childArgs, err = argSplit()
|
||||||
|
app.childArgs = childArgs
|
||||||
|
app.err = err
|
||||||
rootCmd.SetArgs(selfArgs)
|
rootCmd.SetArgs(selfArgs)
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@ -81,7 +84,56 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func execCmd(cmd *cobra.Command, args []string) error {
|
func argSplit() ([]string, []string, error) {
|
||||||
|
var (
|
||||||
|
i int
|
||||||
|
arg string
|
||||||
|
selfArgs []string
|
||||||
|
childArgs []string
|
||||||
|
)
|
||||||
|
found := false
|
||||||
|
for i, arg = range os.Args {
|
||||||
|
if arg == "--" {
|
||||||
|
found = true
|
||||||
|
if i+1 == len(os.Args) {
|
||||||
|
return nil, nil, errors.New("invalid argument")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(os.Args[i+1:]) == 0 {
|
||||||
|
return nil, nil, errors.New("invalid argument")
|
||||||
|
}
|
||||||
|
|
||||||
|
selfArgs = os.Args[1:i]
|
||||||
|
childArgs = os.Args[i+1:]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
return nil, nil, errors.New("invalid argument")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return selfArgs, childArgs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *execApp) versionCmd(cmd *cobra.Command, args []string) error {
|
||||||
|
e.printVersion()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *execApp) printVersion() {
|
||||||
|
fmt.Print(version)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *execApp) execCmd(cmd *cobra.Command, args []string) error {
|
||||||
|
if viper.GetBool(versionFlag) {
|
||||||
|
e.printVersion()
|
||||||
|
}
|
||||||
|
|
||||||
|
if e.err != nil {
|
||||||
|
return e.err
|
||||||
|
}
|
||||||
|
|
||||||
if viper.GetBool(EnvSetsid) {
|
if viper.GetBool(EnvSetsid) {
|
||||||
_, _ = unix.Setsid()
|
_, _ = unix.Setsid()
|
||||||
}
|
}
|
||||||
@ -119,13 +171,13 @@ func execCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if path, err = exec.LookPath(childArgs[0]); err != nil {
|
if path, err = exec.LookPath(e.childArgs[0]); err != nil {
|
||||||
if !errors.Is(err, exec.ErrDot) {
|
if !errors.Is(err, exec.ErrDot) {
|
||||||
return fmt.Errorf("lookpath: %w", err)
|
return fmt.Errorf("lookpath: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = unix.Exec(path, childArgs, os.Environ()); err != nil {
|
if err = unix.Exec(path, e.childArgs, os.Environ()); err != nil {
|
||||||
return fmt.Errorf("exec: %w", err)
|
return fmt.Errorf("exec: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
cmd/exec/version.txt
Normal file
1
cmd/exec/version.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
v0.1.0-9-gdb251da
|
||||||
Loading…
x
Reference in New Issue
Block a user