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  }