mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-05-27 12:52:27 +02:00
cmd/ctrld: check elevated privilege for service mode
This commit is contained in:
committed by
Cuong Manh Le
parent
d830706692
commit
065a391ff4
+22
-16
@@ -176,9 +176,10 @@ func initCLI() {
|
|||||||
rootCmd.AddCommand(runCmd)
|
rootCmd.AddCommand(runCmd)
|
||||||
|
|
||||||
startCmd := &cobra.Command{
|
startCmd := &cobra.Command{
|
||||||
Use: "start",
|
PreRun: checkHasElevatedPrivilege,
|
||||||
Short: "Start the ctrld service",
|
Use: "start",
|
||||||
Args: cobra.NoArgs,
|
Short: "Start the ctrld service",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
sc := &service.Config{}
|
sc := &service.Config{}
|
||||||
*sc = *svcConfig
|
*sc = *svcConfig
|
||||||
@@ -239,9 +240,10 @@ func initCLI() {
|
|||||||
startCmd.Flags().StringVarP(&iface, "iface", "", "", `Update DNS setting for iface, "auto" means the default interface gateway`)
|
startCmd.Flags().StringVarP(&iface, "iface", "", "", `Update DNS setting for iface, "auto" means the default interface gateway`)
|
||||||
|
|
||||||
stopCmd := &cobra.Command{
|
stopCmd := &cobra.Command{
|
||||||
Use: "stop",
|
PreRun: checkHasElevatedPrivilege,
|
||||||
Short: "Stop the ctrld service",
|
Use: "stop",
|
||||||
Args: cobra.NoArgs,
|
Short: "Stop the ctrld service",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
s, err := service.New(&prog{}, svcConfig)
|
s, err := service.New(&prog{}, svcConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -256,9 +258,10 @@ func initCLI() {
|
|||||||
stopCmd.Flags().StringVarP(&iface, "iface", "", "", `Reset DNS setting for iface, "auto" means the default interface gateway`)
|
stopCmd.Flags().StringVarP(&iface, "iface", "", "", `Reset DNS setting for iface, "auto" means the default interface gateway`)
|
||||||
|
|
||||||
restartCmd := &cobra.Command{
|
restartCmd := &cobra.Command{
|
||||||
Use: "restart",
|
PreRun: checkHasElevatedPrivilege,
|
||||||
Short: "Restart the ctrld service",
|
Use: "restart",
|
||||||
Args: cobra.NoArgs,
|
Short: "Restart the ctrld service",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
s, err := service.New(&prog{}, svcConfig)
|
s, err := service.New(&prog{}, svcConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -298,9 +301,10 @@ func initCLI() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uninstallCmd := &cobra.Command{
|
uninstallCmd := &cobra.Command{
|
||||||
Use: "uninstall",
|
PreRun: checkHasElevatedPrivilege,
|
||||||
Short: "Uninstall the ctrld service",
|
Use: "uninstall",
|
||||||
Args: cobra.NoArgs,
|
Short: "Uninstall the ctrld service",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
s, err := service.New(&prog{}, svcConfig)
|
s, err := service.New(&prog{}, svcConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -379,8 +383,9 @@ func initCLI() {
|
|||||||
serviceCmd.AddCommand(interfacesCmd)
|
serviceCmd.AddCommand(interfacesCmd)
|
||||||
rootCmd.AddCommand(serviceCmd)
|
rootCmd.AddCommand(serviceCmd)
|
||||||
startCmdAlias := &cobra.Command{
|
startCmdAlias := &cobra.Command{
|
||||||
Use: "start",
|
PreRun: checkHasElevatedPrivilege,
|
||||||
Short: "Quick start service and configure DNS on interface",
|
Use: "start",
|
||||||
|
Short: "Quick start service and configure DNS on interface",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if !cmd.Flags().Changed("iface") {
|
if !cmd.Flags().Changed("iface") {
|
||||||
os.Args = append(os.Args, "--iface="+ifaceStartStop)
|
os.Args = append(os.Args, "--iface="+ifaceStartStop)
|
||||||
@@ -392,8 +397,9 @@ func initCLI() {
|
|||||||
startCmdAlias.Flags().AddFlagSet(startCmd.Flags())
|
startCmdAlias.Flags().AddFlagSet(startCmd.Flags())
|
||||||
rootCmd.AddCommand(startCmdAlias)
|
rootCmd.AddCommand(startCmdAlias)
|
||||||
stopCmdAlias := &cobra.Command{
|
stopCmdAlias := &cobra.Command{
|
||||||
Use: "stop",
|
PreRun: checkHasElevatedPrivilege,
|
||||||
Short: "Quick stop service and remove DNS from interface",
|
Use: "stop",
|
||||||
|
Short: "Quick stop service and remove DNS from interface",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if !cmd.Flags().Changed("iface") {
|
if !cmd.Flags().Changed("iface") {
|
||||||
os.Args = append(os.Args, "--iface="+ifaceStartStop)
|
os.Args = append(os.Args, "--iface="+ifaceStartStop)
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
func stderrMsg(msg string) {
|
func stderrMsg(msg string) {
|
||||||
@@ -29,3 +31,15 @@ func doTasks(tasks []task) bool {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkHasElevatedPrivilege(cmd *cobra.Command, args []string) {
|
||||||
|
ok, err := hasElevatedPrivilege()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("could not detect user privilege: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Please relaunch process with admin/root privilege.")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func hasElevatedPrivilege() (bool, error) {
|
||||||
|
return os.Geteuid() == 0, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "golang.org/x/sys/windows"
|
||||||
|
|
||||||
|
func hasElevatedPrivilege() (bool, error) {
|
||||||
|
var sid *windows.SID
|
||||||
|
if err := windows.AllocateAndInitializeSid(
|
||||||
|
&windows.SECURITY_NT_AUTHORITY,
|
||||||
|
2,
|
||||||
|
windows.SECURITY_BUILTIN_DOMAIN_RID,
|
||||||
|
windows.DOMAIN_ALIAS_RID_ADMINS,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&sid,
|
||||||
|
); err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
token := windows.Token(0)
|
||||||
|
return token.IsMember(sid)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user