mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	Use Core.config in init functions
This commit is contained in:
		
							parent
							
								
									219fb96553
								
							
						
					
					
						commit
						fa7c4117b4
					
				
					 4 changed files with 56 additions and 62 deletions
				
			
		| 
						 | 
					@ -52,7 +52,7 @@ func (a *admin) addHandler(name string, args []string, handler func(admin_info)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// init runs the initial admin setup.
 | 
					// init runs the initial admin setup.
 | 
				
			||||||
func (a *admin) init(c *Core, listenaddr string) {
 | 
					func (a *admin) init(c *Core) {
 | 
				
			||||||
	a.core = c
 | 
						a.core = c
 | 
				
			||||||
	a.reconfigure = make(chan bool, 1)
 | 
						a.reconfigure = make(chan bool, 1)
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
| 
						 | 
					@ -69,7 +69,9 @@ func (a *admin) init(c *Core, listenaddr string) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	a.listenaddr = listenaddr
 | 
						a.core.configMutex.RLock()
 | 
				
			||||||
 | 
						a.listenaddr = a.core.config.AdminListen
 | 
				
			||||||
 | 
						a.core.configMutex.RUnlock()
 | 
				
			||||||
	a.addHandler("list", []string{}, func(in admin_info) (admin_info, error) {
 | 
						a.addHandler("list", []string{}, func(in admin_info) (admin_info, error) {
 | 
				
			||||||
		handlers := make(map[string]interface{})
 | 
							handlers := make(map[string]interface{})
 | 
				
			||||||
		for _, handler := range a.handlers {
 | 
							for _, handler := range a.handlers {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ var buildName string
 | 
				
			||||||
var buildVersion string
 | 
					var buildVersion string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type module interface {
 | 
					type module interface {
 | 
				
			||||||
	init(*config.NodeConfig) error
 | 
						init(*Core, *config.NodeConfig) error
 | 
				
			||||||
	start() error
 | 
						start() error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,12 +32,10 @@ type Core struct {
 | 
				
			||||||
	config      config.NodeConfig // Active config
 | 
						config      config.NodeConfig // Active config
 | 
				
			||||||
	configOld   config.NodeConfig // Previous config
 | 
						configOld   config.NodeConfig // Previous config
 | 
				
			||||||
	configMutex sync.RWMutex      // Protects both config and configOld
 | 
						configMutex sync.RWMutex      // Protects both config and configOld
 | 
				
			||||||
	// Core-specific config
 | 
					 | 
				
			||||||
	boxPub      crypto.BoxPubKey
 | 
						boxPub      crypto.BoxPubKey
 | 
				
			||||||
	boxPriv     crypto.BoxPrivKey
 | 
						boxPriv     crypto.BoxPrivKey
 | 
				
			||||||
	sigPub      crypto.SigPubKey
 | 
						sigPub      crypto.SigPubKey
 | 
				
			||||||
	sigPriv     crypto.SigPrivKey
 | 
						sigPriv     crypto.SigPrivKey
 | 
				
			||||||
	// Modules
 | 
					 | 
				
			||||||
	switchTable switchTable
 | 
						switchTable switchTable
 | 
				
			||||||
	peers       peers
 | 
						peers       peers
 | 
				
			||||||
	sessions    sessions
 | 
						sessions    sessions
 | 
				
			||||||
| 
						 | 
					@ -48,15 +46,11 @@ type Core struct {
 | 
				
			||||||
	multicast   multicast
 | 
						multicast   multicast
 | 
				
			||||||
	nodeinfo    nodeinfo
 | 
						nodeinfo    nodeinfo
 | 
				
			||||||
	tcp         tcpInterface
 | 
						tcp         tcpInterface
 | 
				
			||||||
	// Other bits
 | 
					 | 
				
			||||||
	log         *log.Logger
 | 
						log         *log.Logger
 | 
				
			||||||
	ifceExpr    []*regexp.Regexp // the zone of link-local IPv6 peers must match this
 | 
						ifceExpr    []*regexp.Regexp // the zone of link-local IPv6 peers must match this
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Core) init(bpub *crypto.BoxPubKey,
 | 
					func (c *Core) init() error {
 | 
				
			||||||
	bpriv *crypto.BoxPrivKey,
 | 
					 | 
				
			||||||
	spub *crypto.SigPubKey,
 | 
					 | 
				
			||||||
	spriv *crypto.SigPrivKey) {
 | 
					 | 
				
			||||||
	// TODO separate init and start functions
 | 
						// TODO separate init and start functions
 | 
				
			||||||
	//  Init sets up structs
 | 
						//  Init sets up structs
 | 
				
			||||||
	//  Start launches goroutines that depend on structs being set up
 | 
						//  Start launches goroutines that depend on structs being set up
 | 
				
			||||||
| 
						 | 
					@ -64,16 +58,45 @@ func (c *Core) init(bpub *crypto.BoxPubKey,
 | 
				
			||||||
	if c.log == nil {
 | 
						if c.log == nil {
 | 
				
			||||||
		c.log = log.New(ioutil.Discard, "", 0)
 | 
							c.log = log.New(ioutil.Discard, "", 0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.boxPub, c.boxPriv = *bpub, *bpriv
 | 
					
 | 
				
			||||||
	c.sigPub, c.sigPriv = *spub, *spriv
 | 
						boxPubHex, err := hex.DecodeString(c.config.EncryptionPublicKey)
 | 
				
			||||||
	c.admin.core = c
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						boxPrivHex, err := hex.DecodeString(c.config.EncryptionPrivateKey)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sigPubHex, err := hex.DecodeString(c.config.SigningPublicKey)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sigPrivHex, err := hex.DecodeString(c.config.SigningPrivateKey)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						copy(c.boxPub[:], boxPubHex)
 | 
				
			||||||
 | 
						copy(c.boxPriv[:], boxPrivHex)
 | 
				
			||||||
 | 
						copy(c.sigPub[:], sigPubHex)
 | 
				
			||||||
 | 
						copy(c.sigPriv[:], sigPrivHex)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c.admin.init(c)
 | 
				
			||||||
 | 
						c.nodeinfo.init(c)
 | 
				
			||||||
	c.searches.init(c)
 | 
						c.searches.init(c)
 | 
				
			||||||
	c.dht.init(c)
 | 
						c.dht.init(c)
 | 
				
			||||||
	c.sessions.init(c)
 | 
						c.sessions.init(c)
 | 
				
			||||||
	c.multicast.init(c)
 | 
						c.multicast.init(c)
 | 
				
			||||||
	c.peers.init(c)
 | 
						c.peers.init(c)
 | 
				
			||||||
	c.router.init(c)
 | 
						c.router.init(c)
 | 
				
			||||||
	c.switchTable.init(c, c.sigPub) // TODO move before peers? before router?
 | 
						c.switchTable.init(c) // TODO move before peers? before router?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := c.tcp.init(c); err != nil {
 | 
				
			||||||
 | 
							c.log.Println("Failed to start TCP interface")
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateConfig updates the configuration in Core and then signals the
 | 
					// UpdateConfig updates the configuration in Core and then signals the
 | 
				
			||||||
| 
						 | 
					@ -133,42 +156,10 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
 | 
				
			||||||
	c.configOld = c.config
 | 
						c.configOld = c.config
 | 
				
			||||||
	c.configMutex.Unlock()
 | 
						c.configMutex.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var boxPub crypto.BoxPubKey
 | 
						c.init()
 | 
				
			||||||
	var boxPriv crypto.BoxPrivKey
 | 
					 | 
				
			||||||
	var sigPub crypto.SigPubKey
 | 
					 | 
				
			||||||
	var sigPriv crypto.SigPrivKey
 | 
					 | 
				
			||||||
	boxPubHex, err := hex.DecodeString(nc.EncryptionPublicKey)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	boxPrivHex, err := hex.DecodeString(nc.EncryptionPrivateKey)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sigPubHex, err := hex.DecodeString(nc.SigningPublicKey)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sigPrivHex, err := hex.DecodeString(nc.SigningPrivateKey)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	copy(boxPub[:], boxPubHex)
 | 
					 | 
				
			||||||
	copy(boxPriv[:], boxPrivHex)
 | 
					 | 
				
			||||||
	copy(sigPub[:], sigPubHex)
 | 
					 | 
				
			||||||
	copy(sigPriv[:], sigPrivHex)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c.init(&boxPub, &boxPriv, &sigPub, &sigPriv)
 | 
					 | 
				
			||||||
	c.admin.init(c, nc.AdminListen)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	c.nodeinfo.init(c)
 | 
					 | 
				
			||||||
	c.nodeinfo.setNodeInfo(nc.NodeInfo, nc.NodeInfoPrivacy)
 | 
						c.nodeinfo.setNodeInfo(nc.NodeInfo, nc.NodeInfoPrivacy)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := c.tcp.init(c, nc.Listen, nc.ReadTimeout); err != nil {
 | 
					 | 
				
			||||||
		c.log.Println("Failed to start TCP interface")
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if nc.SwitchOptions.MaxTotalQueueSize >= SwitchQueueTotalMinSize {
 | 
						if nc.SwitchOptions.MaxTotalQueueSize >= SwitchQueueTotalMinSize {
 | 
				
			||||||
		c.switchTable.queueTotalMaxSize = nc.SwitchOptions.MaxTotalQueueSize
 | 
							c.switchTable.queueTotalMaxSize = nc.SwitchOptions.MaxTotalQueueSize
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -201,7 +192,7 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for _, source := range nc.TunnelRouting.IPv6Sources {
 | 
							for _, source := range nc.TunnelRouting.IPv6Sources {
 | 
				
			||||||
			if c.router.cryptokey.addSourceSubnet(source); err != nil {
 | 
								if err := c.router.cryptokey.addSourceSubnet(source); err != nil {
 | 
				
			||||||
				panic(err)
 | 
									panic(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -211,7 +202,7 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for _, source := range nc.TunnelRouting.IPv4Sources {
 | 
							for _, source := range nc.TunnelRouting.IPv4Sources {
 | 
				
			||||||
			if c.router.cryptokey.addSourceSubnet(source); err != nil {
 | 
								if err := c.router.cryptokey.addSourceSubnet(source); err != nil {
 | 
				
			||||||
				panic(err)
 | 
									panic(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -182,12 +182,12 @@ type switchTable struct {
 | 
				
			||||||
const SwitchQueueTotalMinSize = 4 * 1024 * 1024
 | 
					const SwitchQueueTotalMinSize = 4 * 1024 * 1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Initializes the switchTable struct.
 | 
					// Initializes the switchTable struct.
 | 
				
			||||||
func (t *switchTable) init(core *Core, key crypto.SigPubKey) {
 | 
					func (t *switchTable) init(core *Core) {
 | 
				
			||||||
	now := time.Now()
 | 
						now := time.Now()
 | 
				
			||||||
	t.core = core
 | 
						t.core = core
 | 
				
			||||||
	t.reconfigure = make(chan bool, 1)
 | 
						t.reconfigure = make(chan bool, 1)
 | 
				
			||||||
	t.key = key
 | 
						t.key = t.core.sigPub
 | 
				
			||||||
	locator := switchLocator{root: key, tstamp: now.Unix()}
 | 
						locator := switchLocator{root: t.key, tstamp: now.Unix()}
 | 
				
			||||||
	peers := make(map[switchPort]peerInfo)
 | 
						peers := make(map[switchPort]peerInfo)
 | 
				
			||||||
	t.data = switchData{locator: locator, peers: peers}
 | 
						t.data = switchData{locator: locator, peers: peers}
 | 
				
			||||||
	t.updater.Store(&sync.Once{})
 | 
						t.updater.Store(&sync.Once{})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@ type tcpInterface struct {
 | 
				
			||||||
	core        *Core
 | 
						core        *Core
 | 
				
			||||||
	serv        net.Listener
 | 
						serv        net.Listener
 | 
				
			||||||
	tcp_timeout time.Duration
 | 
						tcp_timeout time.Duration
 | 
				
			||||||
 | 
						tcp_addr    string
 | 
				
			||||||
	mutex       sync.Mutex // Protecting the below
 | 
						mutex       sync.Mutex // Protecting the below
 | 
				
			||||||
	calls       map[string]struct{}
 | 
						calls       map[string]struct{}
 | 
				
			||||||
	conns       map[tcpInfo](chan struct{})
 | 
						conns       map[tcpInfo](chan struct{})
 | 
				
			||||||
| 
						 | 
					@ -80,15 +81,15 @@ func (iface *tcpInterface) connectSOCKS(socksaddr, peeraddr string) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Initializes the struct.
 | 
					// Initializes the struct.
 | 
				
			||||||
func (iface *tcpInterface) init(core *Core, addr string, readTimeout int32) (err error) {
 | 
					func (iface *tcpInterface) init(core *Core) (err error) {
 | 
				
			||||||
	iface.core = core
 | 
						iface.core = core
 | 
				
			||||||
 | 
						iface.tcp_addr = iface.core.config.Listen
 | 
				
			||||||
	iface.tcp_timeout = time.Duration(readTimeout) * time.Millisecond
 | 
						iface.tcp_timeout = time.Duration(iface.core.config.ReadTimeout) * time.Millisecond
 | 
				
			||||||
	if iface.tcp_timeout >= 0 && iface.tcp_timeout < default_tcp_timeout {
 | 
						if iface.tcp_timeout >= 0 && iface.tcp_timeout < default_tcp_timeout {
 | 
				
			||||||
		iface.tcp_timeout = default_tcp_timeout
 | 
							iface.tcp_timeout = default_tcp_timeout
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	iface.serv, err = net.Listen("tcp", addr)
 | 
						iface.serv, err = net.Listen("tcp", iface.tcp_addr)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		iface.calls = make(map[string]struct{})
 | 
							iface.calls = make(map[string]struct{})
 | 
				
			||||||
		iface.conns = make(map[tcpInfo](chan struct{}))
 | 
							iface.conns = make(map[tcpInfo](chan struct{}))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue