diff options
Diffstat (limited to 'xenstore')
-rw-r--r-- | xenstore/xenstore.go | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/xenstore/xenstore.go b/xenstore/xenstore.go new file mode 100644 index 0000000..c6fe1a5 --- /dev/null +++ b/xenstore/xenstore.go @@ -0,0 +1,123 @@ +package main + +import ( + xenstoreclient "../xenstoreclient" + "fmt" + "os" + "strings" +) + +func die(format string, a ...interface{}) { + fmt.Fprintf(os.Stderr, format, a...) + fmt.Fprintln(os.Stderr) + os.Exit(1) +} + +func usage() { + die( + `Usage: xenstore read key [ key ... ] + write key value [ key value ... ] + rm key [ key ... ] + exists key [ key ... ]`) +} + +func new_xs() xenstoreclient.XenStoreClient { + xs, err := xenstoreclient.NewXenstore(0) + if err != nil { + die("xenstore.Open error: %v", err) + } + + return xs +} + +func xs_read(script_name string, args []string) { + if len(args) == 0 || args[0] == "-h" { + die("Usage: %s key [ key ... ]", script_name) + } + + xs := new_xs() + for _, key := range args[:] { + result, err := xs.Read(key) + if err != nil { + die("%s error: %v", script_name, err) + } + + fmt.Println(result) + } +} + +func xs_write(script_name string, args []string) { + if len(args) == 0 || args[0] == "-h" || len(args)%2 != 0 { + die("Usage: %s key value [ key value ... ]", script_name) + } + + xs := new_xs() + for i := 0; i < len(args); i += 2 { + key := args[i] + value := args[i+1] + + err := xs.Write(key, value) + if err != nil { + die("%s error: %v", script_name, err) + } + } +} + +func xs_rm(script_name string, args []string) { + if len(args) == 0 || args[0] == "-h" { + die("Usage: %s key [ key ... ]", script_name) + } + + xs := new_xs() + for _, key := range args[:] { + err := xs.Rm(key) + if err != nil { + die("%s error: %v", script_name, err) + } + } +} + +func xs_exists(script_name string, args []string) { + if len(args) == 0 || args[0] == "-h" { + die("Usage: %s key [ key ... ]", script_name) + } + + xs := new_xs() + for _, key := range args[:] { + _, err := xs.Read(key) + if err != nil { + die("%s error: %v", script_name, err) + } + } +} + +func main() { + var operation string + var args []string + + script_name := os.Args[0] + if strings.Contains(script_name, "-") { + operation = script_name[strings.LastIndex(script_name, "-")+1:] + args = os.Args[1:] + } else { + if len(os.Args) < 2 { + usage() + } + operation = os.Args[1] + script_name = script_name + " " + operation + args = os.Args[2:] + } + + switch operation { + case "read": + xs_read(script_name, args) + case "write": + xs_write(script_name, args) + case "rm": + xs_rm(script_name, args) + case "exists": + xs_exists(script_name, args) + default: + usage() + } +} |