summaryrefslogtreecommitdiffstats
path: root/contrib/environment-to-ini
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--contrib/environment-to-ini/README47
-rw-r--r--contrib/environment-to-ini/environment-to-ini.go111
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 0000000..f1d3f2a
--- /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 0000000..f8593e4
--- /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
+}