add hpeer for non-node peers
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
9b07492180
commit
332378e3ff
20 changed files with 1348 additions and 195 deletions
93
peer/peer.go
Normal file
93
peer/peer.go
Normal file
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
Copyright 2019 Stellar Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package peer
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/stellarproject/heimdall"
|
||||
"github.com/stellarproject/heimdall/client"
|
||||
)
|
||||
|
||||
const (
|
||||
wireguardConfigDir = "/etc/wireguard"
|
||||
)
|
||||
|
||||
// Peer is the non-node peer
|
||||
type Peer struct {
|
||||
cfg *heimdall.PeerConfig
|
||||
}
|
||||
|
||||
// NewPeer returns a new peer
|
||||
func NewPeer(cfg *heimdall.PeerConfig) (*Peer, error) {
|
||||
return &Peer{
|
||||
cfg: cfg,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Run starts the peer
|
||||
func (p *Peer) Run() error {
|
||||
// initial sync
|
||||
logrus.Infof("connecting to peer %s", p.cfg.Address)
|
||||
if err := p.sync(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
doneCh := make(chan bool)
|
||||
errCh := make(chan error)
|
||||
|
||||
t := time.NewTicker(p.cfg.UpdateInterval)
|
||||
go func() {
|
||||
for range t.C {
|
||||
if err := p.sync(); err != nil {
|
||||
errCh <- err
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
select {
|
||||
case <-doneCh:
|
||||
case err := <-errCh:
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stop stops the peer
|
||||
func (p *Peer) Stop() error {
|
||||
// TODO
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Peer) getWireguardConfigPath() string {
|
||||
return filepath.Join(wireguardConfigDir, p.cfg.InterfaceName+".conf")
|
||||
}
|
||||
|
||||
func (p *Peer) getTunnelName() string {
|
||||
return p.cfg.InterfaceName
|
||||
}
|
||||
|
||||
func (p *Peer) getClient(addr string) (*client.Client, error) {
|
||||
return client.NewClient(p.cfg.ID, addr)
|
||||
}
|
99
peer/sync.go
Normal file
99
peer/sync.go
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
Copyright 2019 Stellar Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package peer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/stellarproject/heimdall"
|
||||
v1 "github.com/stellarproject/heimdall/api/v1"
|
||||
"github.com/stellarproject/heimdall/wg"
|
||||
)
|
||||
|
||||
func (p *Peer) sync() error {
|
||||
c, err := p.getClient(p.cfg.Address)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
resp, err := c.Connect()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
peers := []*v1.Peer{}
|
||||
for _, peer := range resp.Peers {
|
||||
// don't add self
|
||||
if peer.ID == p.cfg.ID {
|
||||
continue
|
||||
}
|
||||
peers = append(peers, peer)
|
||||
}
|
||||
|
||||
// generate wireguard config
|
||||
wireguardCfg := &wg.Config{
|
||||
Iface: p.cfg.InterfaceName,
|
||||
Address: resp.Address,
|
||||
PrivateKey: resp.KeyPair.PrivateKey,
|
||||
Peers: peers,
|
||||
DNS: resp.DNS,
|
||||
}
|
||||
|
||||
wireguardConfigPath := p.getWireguardConfigPath()
|
||||
tmpCfg, err := wg.GeneratePeerConfig(wireguardCfg, wireguardConfigPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
h, err := heimdall.HashConfig(tmpCfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
e, err := heimdall.HashConfig(wireguardConfigPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// if config has not change skip update
|
||||
if h == e {
|
||||
return nil
|
||||
}
|
||||
|
||||
logrus.Debugf("updating peer config to version %s", h)
|
||||
// update wireguard config
|
||||
if err := os.Rename(tmpCfg, wireguardConfigPath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// reload wireguard
|
||||
if err := wg.RestartTunnel(ctx, p.getTunnelName()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue