Make watcher scan all directories for client, start adding user
management to server with socket communication via admin binary
This commit is contained in:
		
							
								
								
									
										48
									
								
								server/admin/admin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								server/admin/admin.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| type AdminCommand struct { | ||||
| 	cmd         string | ||||
| 	fn          func(args []string) | ||||
| 	explanation string | ||||
| } | ||||
|  | ||||
| var commands []AdminCommand = []AdminCommand{ | ||||
| 	AdminCommand{ | ||||
| 		cmd:         "useradd", | ||||
| 		fn:          UserAdd, | ||||
| 		explanation: "Add a user", | ||||
| 	}, | ||||
| 	AdminCommand{ | ||||
| 		cmd:         "userdel", | ||||
| 		fn:          UserDel, | ||||
| 		explanation: "Remove a user", | ||||
| 	}, | ||||
| 	AdminCommand{ | ||||
| 		cmd:         "usermod", | ||||
| 		fn:          UserMod, | ||||
| 		explanation: "Modify a user", | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	if len(os.Args) > 1 { | ||||
| 		cmd := os.Args[1] | ||||
| 		for _, c := range commands { | ||||
| 			if c.cmd == cmd { | ||||
| 				c.fn(os.Args[2:]) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 		fmt.Println("Invalid subcommand specified, please pick from the following:") | ||||
| 	} else { | ||||
| 		fmt.Println("No subcommand specified, please pick one from the following:") | ||||
| 	} | ||||
| 	for _, c := range commands { | ||||
| 		fmt.Printf("\t%s\t\t%s\n", c.cmd, c.explanation) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										27
									
								
								server/admin/rpc.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								server/admin/rpc.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"net" | ||||
| 	"net/rpc" | ||||
| 	"log" | ||||
| 	"syscall" | ||||
| ) | ||||
|  | ||||
| func RPCCall(method string, args interface{}, reply interface{}) error { | ||||
| 	socket := "/tmp/asink.sock" | ||||
| 	client, err := rpc.DialHTTP("unix", socket) | ||||
| 	if err != nil { | ||||
| 		if err2, ok := err.(*net.OpError); ok { | ||||
| 			if err2.Err == syscall.ENOENT { | ||||
| 				log.Fatal("The socket ("+socket+") was not found") | ||||
| 			} else if err2.Err == syscall.ECONNREFUSED { | ||||
| 				log.Fatal("A connection was refused to "+socket+". Please check the permissions and ensure the server is running.") | ||||
| 			} | ||||
| 		} | ||||
| 		return err | ||||
| 	} | ||||
| 	defer client.Close() | ||||
|  | ||||
| 	err = client.Call(method, args, reply) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										153
									
								
								server/admin/users.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								server/admin/users.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"asink/server" | ||||
| 	"code.google.com/p/gopass" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| type boolIsSetFlag struct { | ||||
| 	Value bool | ||||
| 	IsSet bool //true if explicitly set from the command-line, false otherwise | ||||
| } | ||||
|  | ||||
| func newBoolIsSetFlag(defaultValue bool) *boolIsSetFlag { | ||||
| 	b := new(boolIsSetFlag) | ||||
| 	b.Value = defaultValue | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| func (b *boolIsSetFlag) Set(value string) error { | ||||
| 	v, err := strconv.ParseBool(value) | ||||
| 	b.Value = v | ||||
| 	b.IsSet = true | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func (b *boolIsSetFlag) String() string { return fmt.Sprintf("%v", *b) } | ||||
|  | ||||
| func (b *boolIsSetFlag) IsBoolFlag() bool { return true } | ||||
|  | ||||
| func UserAdd(args []string) { | ||||
| 	flags := flag.NewFlagSet("useradd", flag.ExitOnError) | ||||
| 	admin := flags.Bool("admin", false, "User should be an administrator") | ||||
| 	flags.Parse(args) | ||||
|  | ||||
| 	if flags.NArg() != 1 { | ||||
| 		fmt.Println("Error: please supply a username (and only one)") | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	passwordOne, err := gopass.GetPass("Enter password for new user: ") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	passwordTwo, err := gopass.GetPass("Enter the same password again: ") | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	if passwordOne != passwordTwo { | ||||
| 		fmt.Println("Error: Passwords do not match. Please try again.") | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	user := new(server.User) | ||||
|  | ||||
| 	if *admin { | ||||
| 		user.Role = server.ADMIN | ||||
| 	} else { | ||||
| 		user.Role = server.NORMAL | ||||
| 	} | ||||
| 	user.Username = flags.Arg(0) | ||||
| 	user.PWHash = server.HashPassword(passwordOne) | ||||
|  | ||||
| 	fmt.Println(user) | ||||
| 	i := 99 | ||||
| 	err = RPCCall("UserModifier.AddUser", user, &i) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func UserDel(args []string) { | ||||
| 	if len(args) != 1 { | ||||
| 		fmt.Println("Error: please supply a username (and only one)") | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	user := new(server.User) | ||||
| 	user.Username = args[0] | ||||
|  | ||||
| 	fmt.Println(user) | ||||
| 	i := 99 | ||||
| 	err := RPCCall("UserModifier.RemoveUser", user, &i) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func UserMod(args []string) { | ||||
| 	rpcargs := new(server.UserModifierArgs) | ||||
| 	rpcargs.Current = new(server.User) | ||||
| 	rpcargs.Updated = new(server.User) | ||||
|  | ||||
| 	admin := newBoolIsSetFlag(false) | ||||
|  | ||||
| 	flags := flag.NewFlagSet("usermod", flag.ExitOnError) | ||||
| 	flags.Var(admin, "admin", "User should be an administrator") | ||||
| 	flags.BoolVar(&rpcargs.UpdatePassword, "password", false, "Change the user's password") | ||||
| 	flags.BoolVar(&rpcargs.UpdatePassword, "p", false, "Change the user's password (short version)") | ||||
| 	flags.BoolVar(&rpcargs.UpdateLogin, "login", false, "Change the user's username") | ||||
| 	flags.BoolVar(&rpcargs.UpdateLogin, "l", false, "Change the user's username (short version)") | ||||
| 	flags.Parse(args) | ||||
|  | ||||
| 	//set the UpdateAdmin flag based on whether it was present on the command-line | ||||
|  | ||||
| 	if flags.NArg() != 1 { | ||||
| 		fmt.Println("Error: please supply a username (and only one)") | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 	rpcargs.Current.Username = flags.Arg(0) | ||||
|  | ||||
| 	if rpcargs.UpdateLogin == true { | ||||
| 		fmt.Print("New login: ") | ||||
| 		fmt.Scanf("%s", &rpcargs.Updated.Username) | ||||
| 	} | ||||
|  | ||||
| 	if rpcargs.UpdatePassword { | ||||
| 		passwordOne, err := gopass.GetPass("Enter new password for user: ") | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		passwordTwo, err := gopass.GetPass("Enter the same password again: ") | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  | ||||
| 		if passwordOne != passwordTwo { | ||||
| 			fmt.Println("Error: Passwords do not match. Please try again.") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		rpcargs.Updated.PWHash = server.HashPassword(passwordOne) | ||||
| 	} | ||||
|  | ||||
| 	rpcargs.UpdateRole = admin.IsSet | ||||
| 	if admin.Value { | ||||
| 		rpcargs.Updated.Role = server.ADMIN | ||||
| 	} else { | ||||
| 		rpcargs.Updated.Role = server.NORMAL | ||||
| 	} | ||||
|  | ||||
| 	fmt.Println(rpcargs) | ||||
| 	i := 99 | ||||
| 	err := RPCCall("UserModifier.ModifyUser", rpcargs, &i) | ||||
| 	if err != nil { | ||||
| 		fmt.Println(reflect.TypeOf(err)) | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user