From 491cc16d53c897908244606bc0d77a6ace8c22a1 Mon Sep 17 00:00:00 2001 From: Ophestra Umiker Date: Tue, 9 Jul 2024 15:39:40 +0900 Subject: [PATCH] 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 --- .gitignore | 25 ++++++++++++++++++++ cli.go | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 3 +++ main.go | 12 ++++++++++ 4 files changed, 107 insertions(+) create mode 100644 .gitignore create mode 100644 cli.go create mode 100644 go.mod create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae08513 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/cli.go b/cli.go new file mode 100644 index 0000000..e85917e --- /dev/null +++ b/cli.go @@ -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+")") + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c3d7971 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.ophivana.moe/cat/ego + +go 1.22 diff --git a/main.go b/main.go new file mode 100644 index 0000000..159d6d7 --- /dev/null +++ b/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "flag" +) + +var Version = "impure" + +func main() { + flag.Parse() + copyArgs() +}