cli: parse and resolve flags
Copy all flags from upstream. The machinectl flag is dropped as it does nothing. the flag package is used to reduce complexity since we do not care about compatibility with upstream. Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
This commit is contained in:
commit
491cc16d53
|
@ -0,0 +1,25 @@
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
/ego
|
||||||
|
|
||||||
|
# Test binary, built with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Dependency directories (remove the comment below to include it)
|
||||||
|
# vendor/
|
||||||
|
|
||||||
|
# Go workspace file
|
||||||
|
go.work
|
||||||
|
go.work.sum
|
||||||
|
|
||||||
|
# env file
|
||||||
|
.env
|
||||||
|
.idea
|
||||||
|
.vscode
|
|
@ -0,0 +1,67 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/user"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ego *user.User
|
||||||
|
command []string
|
||||||
|
verbose bool
|
||||||
|
method = machinectl
|
||||||
|
|
||||||
|
userName string
|
||||||
|
methodFlags [2]bool
|
||||||
|
printVersion bool
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
machinectl uint8 = iota
|
||||||
|
machinectlBare
|
||||||
|
sudo
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
flag.StringVar(&userName, "u", "ego", "Specify a username")
|
||||||
|
flag.BoolVar(&methodFlags[0], "sudo", false, "Use 'sudo' to change user")
|
||||||
|
flag.BoolVar(&methodFlags[1], "bare", false, "Use 'machinectl' but skip xdg-desktop-portal setup")
|
||||||
|
flag.BoolVar(&verbose, "v", false, "Verbose output")
|
||||||
|
flag.BoolVar(&printVersion, "V", false, "Print version")
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyArgs() {
|
||||||
|
if printVersion {
|
||||||
|
fmt.Println(Version)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
command = flag.Args()
|
||||||
|
|
||||||
|
switch { // zero value is machinectl
|
||||||
|
case methodFlags[0]:
|
||||||
|
method = sudo
|
||||||
|
case methodFlags[1]:
|
||||||
|
method = machinectlBare
|
||||||
|
}
|
||||||
|
|
||||||
|
if u, err := user.Lookup(userName); err != nil {
|
||||||
|
if errors.As(err, new(user.UnknownUserError)) {
|
||||||
|
fmt.Println("unknown user", userName)
|
||||||
|
} else {
|
||||||
|
// unreachable
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
os.Exit(1)
|
||||||
|
} else {
|
||||||
|
ego = u
|
||||||
|
}
|
||||||
|
|
||||||
|
if verbose {
|
||||||
|
fmt.Println("Running command", command, "as user", ego.Username, "("+ego.Uid+")")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue