Skip to content

Commit

Permalink
fix routes
Browse files Browse the repository at this point in the history
  • Loading branch information
reddec committed Mar 19, 2021
1 parent 999edec commit 433cf2e
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 31 deletions.
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,34 @@

Idea to create a easy-to-use wrapper over [tinc vpn](https://www.tinc-vpn.org).

## Quick start (linux only)

[skip to installation](#installation)

### Automatic

**node 1**

tinc-boot run


**node 2**

follow command from previous operation

### Custom token

**node 1**

tinc-boot -t MYSECRET run

**node 2**

tinc-boot run -t MYSECRET --join http://<node1>:8665


## Overview

Tinc VPN - is full-mesh, auto-healing, time-proofed VPN system without single point of failure, with high-throughput and
serious cryptography.
All nodes in a Tinc network are fully equal. New nodes discovering full topology through any entry point.
Expand Down
17 changes: 8 additions & 9 deletions cmd/tinc-boot/run/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,8 @@ func (cmd *Cmd) Execute([]string) error {
defer instance.Stop()

// setup boot/greeting service
var generatedToken bool
if cmd.Token == "" {
cmd.Token = utils.RandStringRunes(64)
generatedToken = true
}
var proto = "http"
if cmd.TLS {
Expand All @@ -222,12 +220,8 @@ func (cmd *Cmd) Execute([]string) error {
"Use one of this commands to join the network",
"",
}
visibleToken := cmd.Token
if !generatedToken {
visibleToken = "<TOKEN>"
}
for _, address := range cmd.advertise() {
lines = append(lines, os.Args[0]+" run -t "+visibleToken+" --join "+proto+"://"+address+":"+port)
lines = append(lines, os.Args[0]+" run -t "+cmd.Token+" --join "+proto+"://"+address+":"+port)
}
fmt.Println(strings.Join(lines, "\n"))

Expand All @@ -246,6 +240,9 @@ func (cmd *Cmd) Execute([]string) error {
log.Println("failed save discovery metadata after exchange:", err)
}
}
client.Complete = func() {
instance.Reload()
}
greetClients.Add(1)
go func(client *boot.Client) {
defer greetClients.Done()
Expand All @@ -257,10 +254,12 @@ func (cmd *Cmd) Execute([]string) error {
greetHandler := boot.NewServer(daemonConfig, token)
greetHandler.Joined = func(info boot.Envelope) {
// refresh discovery
ssd.ReplaceIfNewer(discovery.Entity{
if ssd.ReplaceIfNewer(discovery.Entity{
Name: info.Name,
Version: 0,
}, nil)
}, nil) {
instance.Reload()
}
if err := ssd.Save(); err != nil {
log.Println("failed save discovery metadata:", err)
}
Expand Down
4 changes: 4 additions & 0 deletions tincd/boot/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func NewClient(url string, config *daemon.Config, token Token) *Client {

type Client struct {
Exchanged func(name string)
Complete func()
token Token
url string
config *daemon.Config
Expand All @@ -37,6 +38,9 @@ func (cl *Client) Run(ctx context.Context, retry time.Duration) {
log.Println("failed join:", err)
} else {
log.Println("join complete")
if callback := cl.Complete; callback != nil {
callback()
}
return
}
select {
Expand Down
8 changes: 8 additions & 0 deletions tincd/daemon/network_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,11 @@ func setAddress(interfaceName string, ip string) error {
func enableInterface(interfaceName string) error {
return exec.Command("ip", "link", "set", "dev", interfaceName, "up").Run()
}

func setRouting(interfaceName string, subnet string) error {
return exec.Command("ip", "route", "add", subnet, "dev", interfaceName).Run()
}

func removeRouting(interfaceName string, subnet string) error {
return exec.Command("ip", "route", "del", subnet, "dev", interfaceName).Run()
}
121 changes: 99 additions & 22 deletions tincd/daemon/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"strconv"
"strings"
"sync"
"syscall"
"time"

"github.com/reddec/tinc-boot/tincd/config"
Expand Down Expand Up @@ -91,15 +92,16 @@ func (dm *Config) Spawn(ctx context.Context) (*Daemon, error) {

child, cancel := context.WithCancel(ctx)
d := &Daemon{
name: main.Name,
main: main,
self: node,
config: dm,
cancel: cancel,
done: make(chan struct{}),
status: StatusInit,
ip: ip,
deviceName: main.Interface,
name: main.Name,
main: main,
self: node,
config: dm,
cancel: cancel,
done: make(chan struct{}),
reloadSignal: make(chan struct{}, 1),
status: StatusInit,
ip: ip,
deviceName: main.Interface,
}
d.events.SubnetAdded.handlers = append(d.events.SubnetAdded.handlers, dm.events.SubnetAdded.handlers...)
d.events.SubnetRemoved.handlers = append(d.events.SubnetRemoved.handlers, dm.events.SubnetRemoved.handlers...)
Expand Down Expand Up @@ -244,16 +246,17 @@ const (
// It's impossible to restart same daemon again. To recreate daemon with exactly same parameters use:
// daemon.Config().Spawn(ctx, daemon.Name()).
type Daemon struct {
name string
config *Config
self *config.Node
main *config.Main
ip string
deviceName string
cancel func()
status Status
done chan struct{}
events Events
name string
config *Config
self *config.Node
main *config.Main
ip string
deviceName string
cancel func()
status Status
done chan struct{}
events Events
reloadSignal chan struct{}
}

// Events from daemon.
Expand Down Expand Up @@ -292,6 +295,15 @@ func (dm *Daemon) Name() string {
return dm.name
}

// Reload hosts.
func (dm *Daemon) Reload() {
select {
case dm.reloadSignal <- struct{}{}:
default:

}
}

func (dm *Daemon) setStatus(status Status) {
log.Println("daemon", dm.name, "status:", status)
dm.status = status
Expand Down Expand Up @@ -340,7 +352,33 @@ func (dm *Daemon) run(ctx context.Context) error {
Main: *dm.main,
})

if err := cmd.Run(); err != nil {
err := cmd.Start()
if err != nil {
return fmt.Errorf("start: %w", err)
}

done := make(chan struct{})
wg.Add(1)
go func() {
defer wg.Done()

for {
select {
case <-done:
return
case <-dm.reloadSignal:
err := cmd.Process.Signal(syscall.Signal(1)) // Sig hup
if err != nil {
log.Println("failed reload hosts:", err)
} else {
log.Println("hosts reloaded")
}
}
}
}()

defer close(done)
if err := cmd.Wait(); err != nil {
return fmt.Errorf("run service: %w", err)
}

Expand All @@ -349,12 +387,25 @@ func (dm *Daemon) run(ctx context.Context) error {

func (dm *Daemon) scanner(stream io.Reader) {
reader := bufio.NewScanner(stream)
routes := make(map[string]bool)
for reader.Scan() {
line := reader.Text()
if event := IsSubnetAdded(line); event != nil {
dm.events.SubnetAdded.emit(*event)
if !routes[event.Peer.Subnet] {
if err := setRouting(dm.deviceName, event.Peer.Subnet); err != nil {
log.Println("failed setup route to", event.Peer.Node, ":", err)
}
dm.events.SubnetAdded.emit(*event)
routes[event.Peer.Subnet] = true
}
} else if event := IsSubnetRemoved(line); event != nil {
dm.events.SubnetRemoved.emit(*event)
if routes[event.Peer.Subnet] {
if err := removeRouting(dm.deviceName, event.Peer.Subnet); err != nil {
log.Println("failed remove route to", event.Peer.Node, ":", err)
}
dm.events.SubnetRemoved.emit(*event)
delete(routes, event.Peer.Subnet)
}
} else if event := IsReady(line); event != nil {
dm.events.Ready.emit()
if err := dm.setupNetwork(); err != nil {
Expand Down Expand Up @@ -385,6 +436,32 @@ func (dm *Daemon) setupNetwork() error {
return nil
}

//
//func (dm *Daemon) reloadRoutes() error {
// hosts, err := dm.config.Hosts()
// if err != nil {
// return fmt.Errorf("read hosts: %w", err)
// }
// if dm.routes == nil {
// dm.routes = make(map[string]bool)
// }
// for hostName, info := range hosts {
// var node config.Node
// if err := config.Unmarshal(info, &node); err != nil {
// return fmt.Errorf("parse node %s config: %w", hostName, err)
// }
// ip := strings.TrimSpace(strings.Split(node.Subnet, "/")[0])
// if dm.routes[ip] {
// continue
// }
// if err := setRouting(dm.deviceName, ip); err != nil {
// return fmt.Errorf("setup routing for host %s: %w", hostName, err)
// }
// dm.routes[ip] = true
// }
// return nil
//}

// event:"Configured"
// event:"Stopped"
type Configuration struct {
Expand Down

0 comments on commit 433cf2e

Please sign in to comment.