From a656335a2270fceb92887c21ea0e6a04d9da9c17 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 9 Feb 2023 21:27:47 +0100 Subject: [PATCH] dedup & fix --- cmd/certs.go | 51 +------- cmd/flags.go | 276 ++++++++++++++++++++------------------- cmd/main.go | 29 +--- cmd/setup.go | 40 ++++++ integration/main_test.go | 2 +- main.go | 2 +- server/database/xorm.go | 2 +- 7 files changed, 189 insertions(+), 213 deletions(-) create mode 100644 cmd/setup.go diff --git a/cmd/certs.go b/cmd/certs.go index 3bbab36..b7fe1b4 100644 --- a/cmd/certs.go +++ b/cmd/certs.go @@ -31,32 +31,14 @@ var Certs = &cli.Command{ Action: migrateCerts, }, }, - Flags: []cli.Flag{ - // Cert Storage - // TODO: remove in next version - &cli.StringFlag{ - // DEPRICATED - Name: "db-pogreb", - Value: "key-database.pogreb", - EnvVars: []string{"DB_POGREB"}, - }, - &cli.StringFlag{ - Name: "db-type", - Value: "", // TODO: "sqlite3" in next version - EnvVars: []string{"DB_TYPE"}, - }, - &cli.StringFlag{ - Name: "db-conn", - Value: "certs.sqlite", - EnvVars: []string{"DB_CONN"}, - }, + Flags: append(CertStorageFlags, []cli.Flag{ &cli.BoolFlag{ Name: "verbose", Usage: "print trace info", EnvVars: []string{"VERBOSE"}, Value: false, }, - }, + }...), } func migrateCerts(ctx *cli.Context) error { @@ -148,32 +130,3 @@ func removeCert(ctx *cli.Context) error { } return nil } - -func openCertDB(ctx *cli.Context) (certDB database.CertDB, err error) { - if ctx.String("db-type") != "" { - certDB, err = database.NewXormDB(ctx.String("db-type"), ctx.String("db-conn")) - if err != nil { - return nil, fmt.Errorf("could not connect to database: %w", err) - } - } else { - // TODO: remove in next version - fmt.Println(` -###################### -## W A R N I N G !!! # -###################### - -You use "pogreb" witch is deprecated and will be removed in the next version. -Please switch to sqlite, mysql or postgres !!! - -The simplest way is, to use './pages certs migrate' and set environment var DB_TYPE to 'sqlite' on next start. - -`) - log.Error().Msg("depricated \"pogreb\" used\n") - - certDB, err = database.NewPogreb(ctx.String("db-pogreb")) - if err != nil { - return nil, fmt.Errorf("could not create database: %w", err) - } - } - return certDB, nil -} diff --git a/cmd/flags.go b/cmd/flags.go index e2b4bbf..40bb053 100644 --- a/cmd/flags.go +++ b/cmd/flags.go @@ -4,139 +4,149 @@ import ( "github.com/urfave/cli/v2" ) -var ServeFlags = []cli.Flag{ - // MainDomainSuffix specifies the main domain (starting with a dot) for which subdomains shall be served as static - // pages, or used for comparison in CNAME lookups. Static pages can be accessed through - // https://{owner}.{MainDomain}[/{repo}], with repo defaulting to "pages". - &cli.StringFlag{ - Name: "pages-domain", - Usage: "specifies the main domain (starting with a dot) for which subdomains shall be served as static pages", - EnvVars: []string{"PAGES_DOMAIN"}, - Value: "codeberg.page", - }, - // GiteaRoot specifies the root URL of the Gitea instance, without a trailing slash. - &cli.StringFlag{ - Name: "gitea-root", - Usage: "specifies the root URL of the Gitea instance, without a trailing slash.", - EnvVars: []string{"GITEA_ROOT"}, - Value: "https://codeberg.org", - }, - // GiteaApiToken specifies an api token for the Gitea instance - &cli.StringFlag{ - Name: "gitea-api-token", - Usage: "specifies an api token for the Gitea instance", - EnvVars: []string{"GITEA_API_TOKEN"}, - Value: "", - }, - // RawDomain specifies the domain from which raw repository content shall be served in the following format: - // https://{RawDomain}/{owner}/{repo}[/{branch|tag|commit}/{version}]/{filepath...} - // (set to []byte(nil) to disable raw content hosting) - &cli.StringFlag{ - Name: "raw-domain", - Usage: "specifies the domain from which raw repository content shall be served, not set disable raw content hosting", - EnvVars: []string{"RAW_DOMAIN"}, - Value: "raw.codeberg.page", - }, - // RawInfoPage will be shown (with a redirect) when trying to access RawDomain directly (or without owner/repo/path). - &cli.StringFlag{ - Name: "raw-info-page", - Usage: "will be shown (with a redirect) when trying to access $RAW_DOMAIN directly (or without owner/repo/path)", - EnvVars: []string{"RAW_INFO_PAGE"}, - Value: "https://docs.codeberg.org/codeberg-pages/raw-content/", - }, +var ( + CertStorageFlags = []cli.Flag{ + &cli.StringFlag{ + // TODO: remove in next version + // DEPRICATED + Name: "db-pogreb", + Value: "key-database.pogreb", + EnvVars: []string{"DB_POGREB"}, + }, + &cli.StringFlag{ + Name: "db-type", + Value: "", // TODO: "sqlite3" in next version + EnvVars: []string{"DB_TYPE"}, + }, + &cli.StringFlag{ + Name: "db-conn", + Value: "certs.sqlite", + EnvVars: []string{"DB_CONN"}, + }, + } - // Server - &cli.StringFlag{ - Name: "host", - Usage: "specifies host of listening address", - EnvVars: []string{"HOST"}, - Value: "[::]", - }, - &cli.StringFlag{ - Name: "port", - Usage: "specifies port of listening address", - EnvVars: []string{"PORT"}, - Value: "443", - }, - &cli.BoolFlag{ - Name: "enable-http-server", - // TODO: desc - EnvVars: []string{"ENABLE_HTTP_SERVER"}, - }, - // Server Options - &cli.BoolFlag{ - Name: "enable-lfs-support", - Usage: "enable lfs support, require gitea v1.17.0 as backend", - EnvVars: []string{"ENABLE_LFS_SUPPORT"}, - Value: true, - }, - &cli.BoolFlag{ - Name: "enable-symlink-support", - Usage: "follow symlinks if enabled, require gitea v1.18.0 as backend", - EnvVars: []string{"ENABLE_SYMLINK_SUPPORT"}, - Value: true, - }, - &cli.StringFlag{ - Name: "log-level", - Value: "warn", - Usage: "specify at which log level should be logged. Possible options: info, warn, error, fatal", - EnvVars: []string{"LOG_LEVEL"}, - }, + ServerFlags = append(CertStorageFlags, []cli.Flag{ + // ############# + // ### Gitea ### + // ############# + // GiteaRoot specifies the root URL of the Gitea instance, without a trailing slash. + &cli.StringFlag{ + Name: "gitea-root", + Usage: "specifies the root URL of the Gitea instance, without a trailing slash.", + EnvVars: []string{"GITEA_ROOT"}, + Value: "https://codeberg.org", + }, + // GiteaApiToken specifies an api token for the Gitea instance + &cli.StringFlag{ + Name: "gitea-api-token", + Usage: "specifies an api token for the Gitea instance", + EnvVars: []string{"GITEA_API_TOKEN"}, + Value: "", + }, - // ACME - &cli.StringFlag{ - Name: "acme-api-endpoint", - EnvVars: []string{"ACME_API"}, - Value: "https://acme-v02.api.letsencrypt.org/directory", - }, - &cli.StringFlag{ - Name: "acme-email", - EnvVars: []string{"ACME_EMAIL"}, - Value: "noreply@example.email", - }, - &cli.BoolFlag{ - Name: "acme-use-rate-limits", - // TODO: Usage - EnvVars: []string{"ACME_USE_RATE_LIMITS"}, - Value: true, - }, - &cli.BoolFlag{ - Name: "acme-accept-terms", - // TODO: Usage - EnvVars: []string{"ACME_ACCEPT_TERMS"}, - }, - &cli.StringFlag{ - Name: "acme-eab-kid", - // TODO: Usage - EnvVars: []string{"ACME_EAB_KID"}, - }, - &cli.StringFlag{ - Name: "acme-eab-hmac", - // TODO: Usage - EnvVars: []string{"ACME_EAB_HMAC"}, - }, - &cli.StringFlag{ - Name: "dns-provider", - // TODO: Usage - EnvVars: []string{"DNS_PROVIDER"}, - }, + // ########################### + // ### Page Server Domains ### + // ########################### + // MainDomainSuffix specifies the main domain (starting with a dot) for which subdomains shall be served as static + // pages, or used for comparison in CNAME lookups. Static pages can be accessed through + // https://{owner}.{MainDomain}[/{repo}], with repo defaulting to "pages". + &cli.StringFlag{ + Name: "pages-domain", + Usage: "specifies the main domain (starting with a dot) for which subdomains shall be served as static pages", + EnvVars: []string{"PAGES_DOMAIN"}, + Value: "codeberg.page", + }, + // RawDomain specifies the domain from which raw repository content shall be served in the following format: + // https://{RawDomain}/{owner}/{repo}[/{branch|tag|commit}/{version}]/{filepath...} + // (set to []byte(nil) to disable raw content hosting) + &cli.StringFlag{ + Name: "raw-domain", + Usage: "specifies the domain from which raw repository content shall be served, not set disable raw content hosting", + EnvVars: []string{"RAW_DOMAIN"}, + Value: "raw.codeberg.page", + }, + // RawInfoPage will be shown (with a redirect) when trying to access RawDomain directly (or without owner/repo/path). + &cli.StringFlag{ + Name: "raw-info-page", + Usage: "will be shown (with a redirect) when trying to access $RAW_DOMAIN directly (or without owner/repo/path)", + EnvVars: []string{"RAW_INFO_PAGE"}, + Value: "https://docs.codeberg.org/codeberg-pages/raw-content/", + }, - // Cert Storage - // TODO: remove in next version - &cli.StringFlag{ - // DEPRICATED - Name: "db-pogreb", - Value: "key-database.pogreb", - EnvVars: []string{"DB_POGREB"}, - }, - &cli.StringFlag{ - Name: "db-type", - Value: "", // TODO: "sqlite3" in next version - EnvVars: []string{"DB_TYPE"}, - }, - &cli.StringFlag{ - Name: "db-conn", - Value: "certs.sqlite", - EnvVars: []string{"DB_CONN"}, - }, -} + // Server + &cli.StringFlag{ + Name: "host", + Usage: "specifies host of listening address", + EnvVars: []string{"HOST"}, + Value: "[::]", + }, + &cli.StringFlag{ + Name: "port", + Usage: "specifies port of listening address", + EnvVars: []string{"PORT"}, + Value: "443", + }, + &cli.BoolFlag{ + Name: "enable-http-server", + // TODO: desc + EnvVars: []string{"ENABLE_HTTP_SERVER"}, + }, + // Server Options + &cli.BoolFlag{ + Name: "enable-lfs-support", + Usage: "enable lfs support, require gitea v1.17.0 as backend", + EnvVars: []string{"ENABLE_LFS_SUPPORT"}, + Value: true, + }, + &cli.BoolFlag{ + Name: "enable-symlink-support", + Usage: "follow symlinks if enabled, require gitea v1.18.0 as backend", + EnvVars: []string{"ENABLE_SYMLINK_SUPPORT"}, + Value: true, + }, + &cli.StringFlag{ + Name: "log-level", + Value: "warn", + Usage: "specify at which log level should be logged. Possible options: info, warn, error, fatal", + EnvVars: []string{"LOG_LEVEL"}, + }, + + // ACME + &cli.StringFlag{ + Name: "acme-api-endpoint", + EnvVars: []string{"ACME_API"}, + Value: "https://acme-v02.api.letsencrypt.org/directory", + }, + &cli.StringFlag{ + Name: "acme-email", + EnvVars: []string{"ACME_EMAIL"}, + Value: "noreply@example.email", + }, + &cli.BoolFlag{ + Name: "acme-use-rate-limits", + // TODO: Usage + EnvVars: []string{"ACME_USE_RATE_LIMITS"}, + Value: true, + }, + &cli.BoolFlag{ + Name: "acme-accept-terms", + // TODO: Usage + EnvVars: []string{"ACME_ACCEPT_TERMS"}, + }, + &cli.StringFlag{ + Name: "acme-eab-kid", + // TODO: Usage + EnvVars: []string{"ACME_EAB_KID"}, + }, + &cli.StringFlag{ + Name: "acme-eab-hmac", + // TODO: Usage + EnvVars: []string{"ACME_EAB_HMAC"}, + }, + &cli.StringFlag{ + Name: "dns-provider", + // TODO: Usage + EnvVars: []string{"DNS_PROVIDER"}, + }, + }...) +) diff --git a/cmd/main.go b/cmd/main.go index 263c3df..4bceb16 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -18,7 +18,6 @@ import ( "codeberg.org/codeberg/pages/server" "codeberg.org/codeberg/pages/server/cache" "codeberg.org/codeberg/pages/server/certificates" - "codeberg.org/codeberg/pages/server/database" "codeberg.org/codeberg/pages/server/gitea" "codeberg.org/codeberg/pages/server/handler" ) @@ -75,33 +74,7 @@ func Serve(ctx *cli.Context) error { } // Init ssl cert database - var certDB database.CertDB - if ctx.String("db-type") != "" { - log.Trace().Msg("use xorm mode") - certDB, err = database.NewXormDB(ctx.String("db-type"), ctx.String("db-conn")) - if err != nil { - return fmt.Errorf("could not connect to database: %w", err) - } - } else { - // TODO: remove in next version - fmt.Println(` -###################### -## W A R N I N G !!! # -###################### - -You use "pogreb" witch is deprecated and will be removed in the next version. -Please switch to sqlite, mysql or postgres !!! - -The simplest way is, to use './pages certs migrate' and set environment var DB_TYPE to 'sqlite' on next start. - -`) - log.Error().Msg("depricated \"pogreb\" used\n") - - certDB, err = database.NewPogreb(ctx.String("db-pogreb")) - if err != nil { - return fmt.Errorf("could not create database: %w", err) - } - } + certDB, err := openCertDB(ctx) defer certDB.Close() keyCache := cache.NewKeyValueCache() diff --git a/cmd/setup.go b/cmd/setup.go new file mode 100644 index 0000000..963353d --- /dev/null +++ b/cmd/setup.go @@ -0,0 +1,40 @@ +package cmd + +import ( + "fmt" + + "github.com/rs/zerolog/log" + "github.com/urfave/cli/v2" + + "codeberg.org/codeberg/pages/server/database" +) + +func openCertDB(ctx *cli.Context) (certDB database.CertDB, err error) { + if ctx.String("db-type") != "" { + log.Trace().Msg("use xorm mode") + certDB, err = database.NewXormDB(ctx.String("db-type"), ctx.String("db-conn")) + if err != nil { + return nil, fmt.Errorf("could not connect to database: %w", err) + } + } else { + // TODO: remove in next version + fmt.Println(` +###################### +## W A R N I N G !!! # +###################### + +You use "pogreb" witch is deprecated and will be removed in the next version. +Please switch to sqlite, mysql or postgres !!! + +The simplest way is, to use './pages certs migrate' and set environment var DB_TYPE to 'sqlite' on next start. + +`) + log.Error().Msg("depricated \"pogreb\" used\n") + + certDB, err = database.NewPogreb(ctx.String("db-pogreb")) + if err != nil { + return nil, fmt.Errorf("could not create database: %w", err) + } + } + return certDB, nil +} diff --git a/integration/main_test.go b/integration/main_test.go index 406b33a..608be34 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -44,7 +44,7 @@ func startServer(ctx context.Context) error { app := cli.NewApp() app.Name = "pages-server" app.Action = cmd.Serve - app.Flags = cmd.ServeFlags + app.Flags = cmd.ServerFlags go func() { if err := app.RunContext(ctx, args); err != nil { diff --git a/main.go b/main.go index 2836b86..8eac1fb 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,7 @@ func main() { app.Version = version app.Usage = "pages server" app.Action = cmd.Serve - app.Flags = cmd.ServeFlags + app.Flags = cmd.ServerFlags app.Commands = []*cli.Command{ cmd.Certs, } diff --git a/server/database/xorm.go b/server/database/xorm.go index 5e7296c..398df0e 100644 --- a/server/database/xorm.go +++ b/server/database/xorm.go @@ -90,7 +90,7 @@ func (x xDB) Compact() (string, error) { // Items return al certs from db, if pageSize is 0 it does not use limit func (x xDB) Items(page, pageSize int) ([]*Cert, error) { // paginated return - if pageSize >= 0 { + if pageSize > 0 { certs := make([]*Cert, 0, pageSize) if page >= 0 { page = 1