diff options
Diffstat (limited to 'contrib/environment-to-ini')
-rw-r--r-- | contrib/environment-to-ini/README | 47 | ||||
-rw-r--r-- | contrib/environment-to-ini/environment-to-ini.go | 111 |
2 files changed, 158 insertions, 0 deletions
diff --git a/contrib/environment-to-ini/README b/contrib/environment-to-ini/README new file mode 100644 index 00000000..f1d3f2ae --- /dev/null +++ b/contrib/environment-to-ini/README @@ -0,0 +1,47 @@ +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 diff --git a/contrib/environment-to-ini/environment-to-ini.go b/contrib/environment-to-ini/environment-to-ini.go new file mode 100644 index 00000000..f8593e49 --- /dev/null +++ b/contrib/environment-to-ini/environment-to-ini.go @@ -0,0 +1,111 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package main + +import ( + "os" + + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/urfave/cli/v2" +) + +func main() { + app := cli.NewApp() + 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 forgejo configuration + through the environment, this command allows environment variables to + be mapped to values in the ini. + + Environment variables of the form "FORGEJO__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 "FORGEJO__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: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false" + and "FORGEJO__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 forgejo working path", + }, + &cli.StringFlag{ + Name: "out", + Aliases: []string{"o"}, + Value: "", + Usage: "Destination file to write to", + }, + } + app.Action = runEnvironmentToIni + err := app.Run(os.Args) + if err != nil { + log.Fatal("Failed to run app with %s: %v", os.Args, err) + } +} + +func runEnvironmentToIni(c *cli.Context) 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 +} |