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