github.com/Tri-stone/burrow@v0.25.0/keys/core.go (about) 1 package keys 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path" 8 "path/filepath" 9 "strings" 10 ) 11 12 const ( 13 DefaultHost = "localhost" 14 DefaultPort = "10997" 15 DefaultHashType = "sha256" 16 DefaultKeysDir = ".keys" 17 TestPort = "0" 18 ) 19 20 func returnDataDir(dir string) (string, error) { 21 dir = path.Join(dir, "data") 22 dir, err := filepath.Abs(dir) 23 if err != nil { 24 return "", err 25 } 26 return dir, checkMakeDataDir(dir) 27 } 28 29 func returnNamesDir(dir string) (string, error) { 30 dir = path.Join(dir, "names") 31 dir, err := filepath.Abs(dir) 32 if err != nil { 33 return "", err 34 } 35 return dir, checkMakeDataDir(dir) 36 } 37 38 //---------------------------------------------------------------- 39 func writeKey(keyDir string, addr, keyJson []byte) ([]byte, error) { 40 dir, err := returnDataDir(keyDir) 41 if err != nil { 42 return nil, fmt.Errorf("Failed to get keys dir: %v", err) 43 } 44 if err := WriteKeyFile(addr, dir, keyJson); err != nil { 45 return nil, err 46 } 47 return addr, nil 48 } 49 50 //---------------------------------------------------------------- 51 // manage names for keys 52 53 func coreNameAdd(keysDir, name, addr string) error { 54 namesDir, err := returnNamesDir(keysDir) 55 if err != nil { 56 return err 57 } 58 dataDir, err := returnDataDir(keysDir) 59 if err != nil { 60 return err 61 } 62 if _, err := os.Stat(path.Join(dataDir, addr+".json")); err != nil { 63 return fmt.Errorf("Unknown key %s", addr) 64 } 65 return ioutil.WriteFile(path.Join(namesDir, name), []byte(addr), 0600) 66 } 67 68 func coreNameList(keysDir string) (map[string]string, error) { 69 dir, err := returnNamesDir(keysDir) 70 if err != nil { 71 return nil, err 72 } 73 names := make(map[string]string) 74 fs, err := ioutil.ReadDir(dir) 75 if err != nil { 76 return nil, err 77 } 78 for _, f := range fs { 79 b, err := ioutil.ReadFile(path.Join(dir, f.Name())) 80 if err != nil { 81 return nil, err 82 } 83 names[f.Name()] = string(b) 84 } 85 return names, nil 86 } 87 88 func coreAddrList(keysDir string) (map[int]string, error) { 89 dir, err := returnDataDir(keysDir) 90 if err != nil { 91 return nil, err 92 } 93 addrs := make(map[int]string) 94 fs, err := ioutil.ReadDir(dir) 95 if err != nil { 96 return nil, err 97 } 98 for i := 0; i < len(fs); i++ { 99 addrs[i] = fs[i].Name() 100 } 101 return addrs, nil 102 } 103 104 func coreNameRm(keysDir string, name string) error { 105 dir, err := returnNamesDir(keysDir) 106 if err != nil { 107 return err 108 } 109 return os.Remove(path.Join(dir, name)) 110 } 111 112 func coreNameGet(keysDir, name string) (string, error) { 113 dir, err := returnNamesDir(keysDir) 114 if err != nil { 115 return "", err 116 } 117 b, err := ioutil.ReadFile(path.Join(dir, name)) 118 if err != nil { 119 return "", err 120 } 121 return string(b), nil 122 } 123 124 func checkMakeDataDir(dir string) error { 125 if _, err := os.Stat(dir); err != nil { 126 err = os.MkdirAll(dir, 0700) 127 if err != nil { 128 return err 129 } 130 } 131 return nil 132 } 133 134 // return addr from name or addr 135 func getNameAddr(keysDir, name, addr string) (string, error) { 136 if name == "" && addr == "" { 137 return "", fmt.Errorf("at least one of name or addr must be provided") 138 } 139 140 // name takes precedent if both are given 141 var err error 142 if name != "" { 143 addr, err = coreNameGet(keysDir, name) 144 if err != nil { 145 return "", err 146 } 147 } 148 return strings.ToUpper(addr), nil 149 }