mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	Allow updating AdminListen during runtime
This commit is contained in:
		
							parent
							
								
									7fae1c993a
								
							
						
					
					
						commit
						f96747181d
					
				
					 2 changed files with 125 additions and 110 deletions
				
			
		| 
						 | 
					@ -76,46 +76,7 @@ func generateConfig(isAutoconf bool) *nodeConfig {
 | 
				
			||||||
	return &cfg
 | 
						return &cfg
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Generates a new configuration and returns it in HJSON format. This is used
 | 
					func readConfig(useconf *bool, useconffile *string, normaliseconf *bool) *nodeConfig {
 | 
				
			||||||
// with -genconf.
 | 
					 | 
				
			||||||
func doGenconf(isjson bool) string {
 | 
					 | 
				
			||||||
	cfg := generateConfig(false)
 | 
					 | 
				
			||||||
	var bs []byte
 | 
					 | 
				
			||||||
	var err error
 | 
					 | 
				
			||||||
	if isjson {
 | 
					 | 
				
			||||||
		bs, err = json.MarshalIndent(cfg, "", "  ")
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		bs, err = hjson.Marshal(cfg)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		panic(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return string(bs)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// The main function is responsible for configuring and starting Yggdrasil.
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	// Configure the command line parameters.
 | 
					 | 
				
			||||||
	genconf := flag.Bool("genconf", false, "print a new config to stdout")
 | 
					 | 
				
			||||||
	useconf := flag.Bool("useconf", false, "read HJSON/JSON config from stdin")
 | 
					 | 
				
			||||||
	useconffile := flag.String("useconffile", "", "read HJSON/JSON config from specified file path")
 | 
					 | 
				
			||||||
	normaliseconf := flag.Bool("normaliseconf", false, "use in combination with either -useconf or -useconffile, outputs your configuration normalised")
 | 
					 | 
				
			||||||
	confjson := flag.Bool("json", false, "print configuration from -genconf or -normaliseconf as JSON instead of HJSON")
 | 
					 | 
				
			||||||
	autoconf := flag.Bool("autoconf", false, "automatic mode (dynamic IP, peer with IPv6 neighbors)")
 | 
					 | 
				
			||||||
	version := flag.Bool("version", false, "prints the version of this build")
 | 
					 | 
				
			||||||
	flag.Parse()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var cfg *nodeConfig
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case *version:
 | 
					 | 
				
			||||||
		fmt.Println("Build name:", yggdrasil.GetBuildName())
 | 
					 | 
				
			||||||
		fmt.Println("Build version:", yggdrasil.GetBuildVersion())
 | 
					 | 
				
			||||||
		os.Exit(0)
 | 
					 | 
				
			||||||
	case *autoconf:
 | 
					 | 
				
			||||||
		// Use an autoconf-generated config, this will give us random keys and
 | 
					 | 
				
			||||||
		// port numbers, and will use an automatically selected TUN/TAP interface.
 | 
					 | 
				
			||||||
		cfg = generateConfig(true)
 | 
					 | 
				
			||||||
	case *useconffile != "" || *useconf:
 | 
					 | 
				
			||||||
	// Use a configuration file. If -useconf, the configuration will be read
 | 
						// Use a configuration file. If -useconf, the configuration will be read
 | 
				
			||||||
	// from stdin. If -useconffile, the configuration will be read from the
 | 
						// from stdin. If -useconffile, the configuration will be read from the
 | 
				
			||||||
	// filesystem.
 | 
						// filesystem.
 | 
				
			||||||
| 
						 | 
					@ -148,7 +109,7 @@ func main() {
 | 
				
			||||||
	// then parse the configuration we loaded above on top of it. The effect
 | 
						// then parse the configuration we loaded above on top of it. The effect
 | 
				
			||||||
	// of this is that any configuration item that is missing from the provided
 | 
						// of this is that any configuration item that is missing from the provided
 | 
				
			||||||
	// configuration will use a sane default.
 | 
						// configuration will use a sane default.
 | 
				
			||||||
		cfg = generateConfig(false)
 | 
						cfg := generateConfig(false)
 | 
				
			||||||
	var dat map[string]interface{}
 | 
						var dat map[string]interface{}
 | 
				
			||||||
	if err := hjson.Unmarshal(config, &dat); err != nil {
 | 
						if err := hjson.Unmarshal(config, &dat); err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
| 
						 | 
					@ -224,6 +185,53 @@ func main() {
 | 
				
			||||||
	if err = mapstructure.Decode(dat, &cfg); err != nil {
 | 
						if err = mapstructure.Decode(dat, &cfg); err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return cfg
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Generates a new configuration and returns it in HJSON format. This is used
 | 
				
			||||||
 | 
					// with -genconf.
 | 
				
			||||||
 | 
					func doGenconf(isjson bool) string {
 | 
				
			||||||
 | 
						cfg := generateConfig(false)
 | 
				
			||||||
 | 
						var bs []byte
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						if isjson {
 | 
				
			||||||
 | 
							bs, err = json.MarshalIndent(cfg, "", "  ")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							bs, err = hjson.Marshal(cfg)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return string(bs)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// The main function is responsible for configuring and starting Yggdrasil.
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						// Configure the command line parameters.
 | 
				
			||||||
 | 
						genconf := flag.Bool("genconf", false, "print a new config to stdout")
 | 
				
			||||||
 | 
						useconf := flag.Bool("useconf", false, "read HJSON/JSON config from stdin")
 | 
				
			||||||
 | 
						useconffile := flag.String("useconffile", "", "read HJSON/JSON config from specified file path")
 | 
				
			||||||
 | 
						normaliseconf := flag.Bool("normaliseconf", false, "use in combination with either -useconf or -useconffile, outputs your configuration normalised")
 | 
				
			||||||
 | 
						confjson := flag.Bool("json", false, "print configuration from -genconf or -normaliseconf as JSON instead of HJSON")
 | 
				
			||||||
 | 
						autoconf := flag.Bool("autoconf", false, "automatic mode (dynamic IP, peer with IPv6 neighbors)")
 | 
				
			||||||
 | 
						version := flag.Bool("version", false, "prints the version of this build")
 | 
				
			||||||
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var cfg *nodeConfig
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case *version:
 | 
				
			||||||
 | 
							fmt.Println("Build name:", yggdrasil.GetBuildName())
 | 
				
			||||||
 | 
							fmt.Println("Build version:", yggdrasil.GetBuildVersion())
 | 
				
			||||||
 | 
							os.Exit(0)
 | 
				
			||||||
 | 
						case *autoconf:
 | 
				
			||||||
 | 
							// Use an autoconf-generated config, this will give us random keys and
 | 
				
			||||||
 | 
							// port numbers, and will use an automatically selected TUN/TAP interface.
 | 
				
			||||||
 | 
							cfg = generateConfig(true)
 | 
				
			||||||
 | 
						case *useconffile != "" || *useconf:
 | 
				
			||||||
 | 
							// Read the configuration from either stdin or from the filesystem
 | 
				
			||||||
 | 
							cfg = readConfig(useconf, useconffile, normaliseconf)
 | 
				
			||||||
		// If the -normaliseconf option was specified then remarshal the above
 | 
							// If the -normaliseconf option was specified then remarshal the above
 | 
				
			||||||
		// configuration and print it back to stdout. This lets the user update
 | 
							// configuration and print it back to stdout. This lets the user update
 | 
				
			||||||
		// their configuration file with newly mapped names (like above) or to
 | 
							// their configuration file with newly mapped names (like above) or to
 | 
				
			||||||
| 
						 | 
					@ -327,7 +335,12 @@ func main() {
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		select {
 | 
							select {
 | 
				
			||||||
		case _ = <-r:
 | 
							case _ = <-r:
 | 
				
			||||||
 | 
								if *useconffile != "" {
 | 
				
			||||||
 | 
									cfg = readConfig(useconf, useconffile, normaliseconf)
 | 
				
			||||||
				n.core.UpdateConfig(cfg)
 | 
									n.core.UpdateConfig(cfg)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									logger.Println("Reloading config at runtime is only possible with -useconffile")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		case _ = <-c:
 | 
							case _ = <-c:
 | 
				
			||||||
			goto exit
 | 
								goto exit
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,9 @@ func (a *admin) init(c *Core) {
 | 
				
			||||||
			case e := <-a.reconfigure:
 | 
								case e := <-a.reconfigure:
 | 
				
			||||||
				a.core.configMutex.RLock()
 | 
									a.core.configMutex.RLock()
 | 
				
			||||||
				if a.core.config.AdminListen != a.core.configOld.AdminListen {
 | 
									if a.core.config.AdminListen != a.core.configOld.AdminListen {
 | 
				
			||||||
					a.core.log.Println("AdminListen has changed!")
 | 
										a.listenaddr = a.core.config.AdminListen
 | 
				
			||||||
 | 
										a.close()
 | 
				
			||||||
 | 
										a.start()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				a.core.configMutex.RUnlock()
 | 
									a.core.configMutex.RUnlock()
 | 
				
			||||||
				e <- nil
 | 
									e <- nil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue