836e69735d
Host types have been moved within the `bootstrap` package. Refactored how boostrap FS is interacted with. There is now a `Bootstrap` struct which has pre-loaded all data within the bootstrap FS. This helps centralize the logic around reading the data (though not yet completely). Choosing of the garage node to interact with no longer occurs in like three different places. It occurs at the environment level now, and is aided by the new `garage.Peer` type.
67 lines
1.8 KiB
Go
67 lines
1.8 KiB
Go
package garage
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
)
|
|
|
|
// Peer describes all information necessary to connect to a given garage node.
|
|
type Peer struct {
|
|
IP string
|
|
RPCPort int
|
|
S3APIPort int
|
|
}
|
|
|
|
// RPCPeerKey deterministically generates a public/private keys which can
|
|
// be used as a garage node key.
|
|
//
|
|
// DANGER: This function will deterministically produce public/private keys
|
|
// given some arbitrary input. This is NEVER what you want. It's only being used
|
|
// in cryptic-net for a very specific purpose for which I think it's ok and is
|
|
// very necessary, and people are probably _still_ going to yell at me.
|
|
//
|
|
func (p Peer) RPCPeerKey() (pubKey, privKey []byte) {
|
|
input := []byte(net.JoinHostPort(p.IP, strconv.Itoa(p.RPCPort)))
|
|
|
|
// Append the length of the input to the input, so that the input "foo"
|
|
// doesn't generate the same key as the input "foofoo".
|
|
input = strconv.AppendInt(input, int64(len(input)), 10)
|
|
|
|
pubKey, privKey, err := ed25519.GenerateKey(NewInfiniteReader(input))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return pubKey, privKey
|
|
}
|
|
|
|
// RPCPeerID returns the peer ID of the garage node for use in communicating
|
|
// over RPC.
|
|
//
|
|
// DANGER: See warning on RPCPeerKey.
|
|
func (p Peer) RPCPeerID() string {
|
|
pubKey, _ := p.RPCPeerKey()
|
|
return hex.EncodeToString(pubKey)
|
|
}
|
|
|
|
// RPCAddr returns the address of the peer's RPC port.
|
|
func (p Peer) 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.
|
|
//
|
|
// DANGER: See warning on RPCPeerKey.
|
|
func (p Peer) RPCPeerAddr() string {
|
|
return fmt.Sprintf("%s@%s", p.RPCPeerID(), p.RPCAddr())
|
|
}
|
|
|
|
// S3APIAddr returns the address of the peer's S3 API port.
|
|
func (p Peer) S3APIAddr() string {
|
|
return net.JoinHostPort(p.IP, strconv.Itoa(p.S3APIPort))
|
|
}
|