2019-12-28 03:49:42 +03:00
|
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
2022-11-27 21:20:29 +03:00
|
|
|
// SPDX-License-Identifier: MIT
|
2019-12-28 03:49:42 +03:00
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
2023-01-13 00:56:56 +03:00
|
|
|
"regexp"
|
2019-12-28 03:49:42 +03:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
|
|
|
|
"github.com/urfave/cli"
|
|
|
|
)
|
|
|
|
|
|
|
|
// EnvironmentPrefix environment variables prefixed with this represent ini values to write
|
2023-01-13 00:56:56 +03:00
|
|
|
const EnvironmentPrefix = "^(FORGEJO|GITEA)"
|
2019-12-28 03:49:42 +03:00
|
|
|
|
|
|
|
func main() {
|
|
|
|
app := cli.NewApp()
|
|
|
|
app.Name = "environment-to-ini"
|
|
|
|
app.Usage = "Use provided environment to update configuration ini"
|
2023-01-13 00:56:56 +03:00
|
|
|
app.Description = `As a helper to allow docker users to update the Forgejo configuration
|
2019-12-28 03:49:42 +03:00
|
|
|
through the environment, this command allows environment variables to
|
|
|
|
be mapped to values in the ini.
|
|
|
|
|
2023-01-13 00:56:56 +03:00
|
|
|
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
|
2019-12-28 03:49:42 +03:00
|
|
|
will be mapped to the ini section "[section_name]" and the key
|
|
|
|
"KEY_NAME" with the value as provided.
|
|
|
|
|
2023-01-13 00:56:56 +03:00
|
|
|
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME__FILE"
|
2023-05-24 06:37:22 +03:00
|
|
|
will be mapped to the ini section "[section_name]" and the key
|
|
|
|
"KEY_NAME" with the value loaded from the specified file.
|
|
|
|
|
2019-12-28 03:49:42 +03:00
|
|
|
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
|
|
|
|
...
|
|
|
|
"""
|
|
|
|
|
2023-01-13 00:56:56 +03:00
|
|
|
You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
|
|
|
|
and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
|
2019-12-28 03:49:42 +03:00
|
|
|
on the configuration cheat sheet.`
|
|
|
|
app.Flags = []cli.Flag{
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "custom-path, C",
|
|
|
|
Value: setting.CustomPath,
|
|
|
|
Usage: "Custom path file path",
|
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "config, c",
|
|
|
|
Value: setting.CustomConf,
|
|
|
|
Usage: "Custom configuration file path",
|
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "work-path, w",
|
|
|
|
Value: setting.AppWorkPath,
|
2023-01-13 00:56:56 +03:00
|
|
|
Usage: "Set the forgejo working path",
|
2019-12-28 03:49:42 +03:00
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "out, o",
|
|
|
|
Value: "",
|
|
|
|
Usage: "Destination file to write to",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "clear",
|
|
|
|
Usage: "Clears the matched variables from the environment",
|
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "prefix, p",
|
|
|
|
Value: EnvironmentPrefix,
|
|
|
|
Usage: "Environment prefix to look for - will be suffixed by __ (2 underscores)",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
app.Action = runEnvironmentToIni
|
|
|
|
setting.SetCustomPathAndConf("", "", "")
|
|
|
|
|
|
|
|
err := app.Run(os.Args)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Failed to run app with %s: %v", os.Args, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-13 00:56:56 +03:00
|
|
|
func splitEnvironmentVariable(prefixRegexp *regexp.Regexp, kv string) (string, string) {
|
|
|
|
idx := strings.IndexByte(kv, '=')
|
|
|
|
if idx < 0 {
|
|
|
|
return "", ""
|
|
|
|
}
|
|
|
|
k := kv[:idx]
|
|
|
|
loc := prefixRegexp.FindStringIndex(k)
|
|
|
|
if loc == nil {
|
|
|
|
return "", ""
|
|
|
|
}
|
|
|
|
return k[loc[1]:], kv[idx+1:]
|
|
|
|
}
|
|
|
|
|
2019-12-28 03:49:42 +03:00
|
|
|
func runEnvironmentToIni(c *cli.Context) error {
|
|
|
|
providedCustom := c.String("custom-path")
|
|
|
|
providedConf := c.String("config")
|
|
|
|
providedWorkPath := c.String("work-path")
|
|
|
|
setting.SetCustomPathAndConf(providedCustom, providedConf, providedWorkPath)
|
|
|
|
|
2023-06-02 12:27:30 +03:00
|
|
|
cfg, err := setting.NewConfigProviderFromFile(&setting.Options{CustomConf: setting.CustomConf, AllowEmpty: true})
|
2020-11-28 05:42:08 +03:00
|
|
|
if err != nil {
|
2023-06-02 12:27:30 +03:00
|
|
|
log.Fatal("Failed to load custom conf '%s': %v", setting.CustomConf, err)
|
2020-11-28 05:42:08 +03:00
|
|
|
}
|
2019-12-28 03:49:42 +03:00
|
|
|
|
2023-05-24 06:37:22 +03:00
|
|
|
prefixGitea := c.String("prefix") + "__"
|
|
|
|
suffixFile := "__FILE"
|
|
|
|
changed := setting.EnvironmentToConfig(cfg, prefixGitea, suffixFile, os.Environ())
|
2021-05-14 02:01:05 +03:00
|
|
|
|
2023-05-24 06:37:22 +03:00
|
|
|
// try to save the config file
|
2019-12-28 03:49:42 +03:00
|
|
|
destination := c.String("out")
|
|
|
|
if len(destination) == 0 {
|
|
|
|
destination = setting.CustomConf
|
|
|
|
}
|
2021-05-14 02:01:05 +03:00
|
|
|
if destination != setting.CustomConf || changed {
|
2021-12-01 10:50:01 +03:00
|
|
|
log.Info("Settings saved to: %q", destination)
|
2021-05-14 02:01:05 +03:00
|
|
|
err = cfg.SaveTo(destination)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-12-28 03:49:42 +03:00
|
|
|
}
|
2023-05-24 06:37:22 +03:00
|
|
|
|
|
|
|
// clear Gitea's specific environment variables if requested
|
2019-12-28 03:49:42 +03:00
|
|
|
if c.Bool("clear") {
|
2023-01-13 00:56:56 +03:00
|
|
|
prefixRegexp := regexp.MustCompile(prefixGitea)
|
2019-12-28 03:49:42 +03:00
|
|
|
for _, kv := range os.Environ() {
|
2023-01-13 00:56:56 +03:00
|
|
|
eKey, _ := splitEnvironmentVariable(prefixRegexp, kv)
|
|
|
|
if eKey == "" {
|
2019-12-28 03:49:42 +03:00
|
|
|
continue
|
|
|
|
}
|
2023-01-13 00:56:56 +03:00
|
|
|
_ = os.Unsetenv(eKey)
|
2019-12-28 03:49:42 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-24 06:37:22 +03:00
|
|
|
return nil
|
2019-12-28 03:49:42 +03:00
|
|
|
}
|