source: code/trunk/cmd/sojuctl/main.go@ 228

Last change on this file since 228 was 98, checked in by contact, 5 years ago

Rename project to soju

File size: 1.6 KB
Line 
1package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "os"
8
9 "git.sr.ht/~emersion/soju"
10 "git.sr.ht/~emersion/soju/config"
11 "golang.org/x/crypto/bcrypt"
12 "golang.org/x/crypto/ssh/terminal"
13)
14
15const usage = `usage: sojuctl [-config path] <action> [options...]
16
17 create-user <username> Create a new user
18 help Show this help message
19`
20
21func init() {
22 flag.Usage = func() {
23 fmt.Fprintf(flag.CommandLine.Output(), usage)
24 }
25}
26
27func main() {
28 var configPath string
29 flag.StringVar(&configPath, "config", "", "path to configuration file")
30 flag.Parse()
31
32 var cfg *config.Server
33 if configPath != "" {
34 var err error
35 cfg, err = config.Load(configPath)
36 if err != nil {
37 log.Fatalf("failed to load config file: %v", err)
38 }
39 } else {
40 cfg = config.Defaults()
41 }
42
43 db, err := soju.OpenSQLDB(cfg.SQLDriver, cfg.SQLSource)
44 if err != nil {
45 log.Fatalf("failed to open database: %v", err)
46 }
47
48 switch cmd := flag.Arg(0); cmd {
49 case "create-user":
50 username := flag.Arg(1)
51 if username == "" {
52 flag.Usage()
53 os.Exit(1)
54 }
55
56 fmt.Printf("Password: ")
57 password, err := terminal.ReadPassword(int(os.Stdin.Fd()))
58 if err != nil {
59 log.Fatalf("failed to read password: %v", err)
60 }
61 fmt.Printf("\n")
62
63 hashed, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
64 if err != nil {
65 log.Fatalf("failed to hash password: %v", err)
66 }
67
68 user := soju.User{
69 Username: username,
70 Password: string(hashed),
71 }
72 if err := db.CreateUser(&user); err != nil {
73 log.Fatalf("failed to create user: %v", err)
74 }
75 default:
76 flag.Usage()
77 if cmd != "help" {
78 os.Exit(1)
79 }
80 }
81}
Note: See TracBrowser for help on using the repository browser.