package garage import ( "crypto/ed25519" "crypto/rand" "fmt" "net" "strconv" ) // RemotePeer describes all information necessary to connect to a given garage // node. type RemotePeer struct { ID string IP string RPCPort int S3APIPort int } // LocalPeer describes the configuration of a local garage instance. type LocalPeer struct { RemotePeer AdminPort int } // GeneratePeerKey generates and returns a public/private key pair for a garage // instance. func GeneratePeerKey() (pubKey, privKey []byte) { pubKey, privKey, err := ed25519.GenerateKey(rand.Reader) if err != nil { panic(err) } return pubKey, privKey } // RPCAddr returns the address of the peer's RPC port. func (p RemotePeer) RPCAddr() string { return net.JoinHostPort(p.IP, strconv.Itoa(p.RPCPort)) } // RPCPeerAddr returns the full peer address (e.g. "id@ip:port") of the garage // node for use in communicating over RPC. func (p RemotePeer) RPCPeerAddr() string { return fmt.Sprintf("%s@%s", p.ID, p.RPCAddr()) } // S3APIAddr returns the address of the peer's S3 API port. func (p RemotePeer) S3APIAddr() string { return net.JoinHostPort(p.IP, strconv.Itoa(p.S3APIPort)) } // AdminAddr returns the address of the peer's S3 API port. func (p LocalPeer) AdminAddr() string { return net.JoinHostPort(p.IP, strconv.Itoa(p.AdminPort)) }