mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	Intorduce "config edit-ini" sub command to help maintaining INI config file (#35735)
Ref: #32669. Helps addressing https://gitea.com/gitea/helm-chart/issues/356.
This commit is contained in:
		| @@ -1,47 +0,0 @@ | ||||
| Environment To Ini | ||||
| ================== | ||||
|  | ||||
| Multiple docker users have requested that the Gitea docker is changed | ||||
| to permit arbitrary configuration via environment variables. | ||||
|  | ||||
| Gitea needs to use an ini file for configuration because the running | ||||
| environment that starts the docker may not be the same as that used | ||||
| by the hooks. An ini file also gives a good default and means that | ||||
| users do not have to completely provide a full environment. | ||||
|  | ||||
| With those caveats above, this command provides a generic way of | ||||
| converting suitably structured environment variables into any ini | ||||
| value. | ||||
|  | ||||
| To use the command is very simple just run it and the default gitea | ||||
| app.ini will be rewritten to take account of the variables provided, | ||||
| however there are various options to give slightly different | ||||
| behavior and these can be interrogated with the `-h` option. | ||||
|  | ||||
| The environment variables should be of the form: | ||||
|  | ||||
| 	GITEA__SECTION_NAME__KEY_NAME | ||||
|  | ||||
| Note, SECTION_NAME in the notation above is case-insensitive. | ||||
|  | ||||
| Environment variables are usually restricted to a reduced character | ||||
| set "0-9A-Z_" - in order to allow the setting of sections with | ||||
| characters outside of that set, they should be escaped as following: | ||||
| "_0X2E_" for "." and "_0X2D_" for "-". The entire section and key names  | ||||
| can be escaped as a UTF8 byte string if necessary. E.g. to configure: | ||||
|  | ||||
| 	""" | ||||
| 	... | ||||
| 	[log.console] | ||||
| 	COLORIZE=false | ||||
| 	STDERR=true | ||||
| 	... | ||||
| 	""" | ||||
|  | ||||
| You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false" | ||||
| and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found | ||||
| on the configuration cheat sheet. | ||||
|  | ||||
| To build locally, run: | ||||
|  | ||||
| 	go build contrib/environment-to-ini/environment-to-ini.go | ||||
| @@ -1,112 +0,0 @@ | ||||
| // Copyright 2019 The Gitea Authors. All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	app := cli.Command{} | ||||
| 	app.Name = "environment-to-ini" | ||||
| 	app.Usage = "Use provided environment to update configuration ini" | ||||
| 	app.Description = `As a helper to allow docker users to update the gitea configuration | ||||
| 	through the environment, this command allows environment variables to | ||||
| 	be mapped to values in the ini. | ||||
|  | ||||
| 	Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME" | ||||
| 	will be mapped to the ini section "[section_name]" and the key | ||||
| 	"KEY_NAME" with the value as provided. | ||||
|  | ||||
| 	Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME__FILE" | ||||
| 	will be mapped to the ini section "[section_name]" and the key | ||||
| 	"KEY_NAME" with the value loaded from the specified file. | ||||
|  | ||||
| 	Environment variables are usually restricted to a reduced character | ||||
| 	set "0-9A-Z_" - in order to allow the setting of sections with | ||||
| 	characters outside of that set, they should be escaped as following: | ||||
| 	"_0X2E_" for ".". The entire section and key names can be escaped as | ||||
| 	a UTF8 byte string if necessary. E.g. to configure: | ||||
|  | ||||
| 		""" | ||||
| 		... | ||||
| 		[log.console] | ||||
| 		COLORIZE=false | ||||
| 		STDERR=true | ||||
| 		... | ||||
| 		""" | ||||
|  | ||||
| 	You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false" | ||||
| 	and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found | ||||
| 	on the configuration cheat sheet.` | ||||
| 	app.Flags = []cli.Flag{ | ||||
| 		&cli.StringFlag{ | ||||
| 			Name:    "custom-path", | ||||
| 			Aliases: []string{"C"}, | ||||
| 			Value:   setting.CustomPath, | ||||
| 			Usage:   "Custom path file path", | ||||
| 		}, | ||||
| 		&cli.StringFlag{ | ||||
| 			Name:    "config", | ||||
| 			Aliases: []string{"c"}, | ||||
| 			Value:   setting.CustomConf, | ||||
| 			Usage:   "Custom configuration file path", | ||||
| 		}, | ||||
| 		&cli.StringFlag{ | ||||
| 			Name:    "work-path", | ||||
| 			Aliases: []string{"w"}, | ||||
| 			Value:   setting.AppWorkPath, | ||||
| 			Usage:   "Set the gitea working path", | ||||
| 		}, | ||||
| 		&cli.StringFlag{ | ||||
| 			Name:    "out", | ||||
| 			Aliases: []string{"o"}, | ||||
| 			Value:   "", | ||||
| 			Usage:   "Destination file to write to", | ||||
| 		}, | ||||
| 	} | ||||
| 	app.Action = runEnvironmentToIni | ||||
| 	err := app.Run(context.Background(), os.Args) | ||||
| 	if err != nil { | ||||
| 		log.Fatal("Failed to run app with %s: %v", os.Args, err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func runEnvironmentToIni(_ context.Context, c *cli.Command) error { | ||||
| 	// the config system may change the environment variables, so get a copy first, to be used later | ||||
| 	env := append([]string{}, os.Environ()...) | ||||
| 	setting.InitWorkPathAndCfgProvider(os.Getenv, setting.ArgWorkPathAndCustomConf{ | ||||
| 		WorkPath:   c.String("work-path"), | ||||
| 		CustomPath: c.String("custom-path"), | ||||
| 		CustomConf: c.String("config"), | ||||
| 	}) | ||||
|  | ||||
| 	cfg, err := setting.NewConfigProviderFromFile(setting.CustomConf) | ||||
| 	if err != nil { | ||||
| 		log.Fatal("Failed to load custom conf '%s': %v", setting.CustomConf, err) | ||||
| 	} | ||||
|  | ||||
| 	changed := setting.EnvironmentToConfig(cfg, env) | ||||
|  | ||||
| 	// try to save the config file | ||||
| 	destination := c.String("out") | ||||
| 	if len(destination) == 0 { | ||||
| 		destination = setting.CustomConf | ||||
| 	} | ||||
| 	if destination != setting.CustomConf || changed { | ||||
| 		log.Info("Settings saved to: %q", destination) | ||||
| 		err = cfg.SaveTo(destination) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user