This commit is contained in:
6543 2023-02-09 19:14:53 +01:00
parent 75942990ac
commit 3c0ee7e8a3
9 changed files with 192 additions and 70 deletions

View file

@ -4,6 +4,8 @@ import (
"fmt"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/urfave/cli/v2"
"codeberg.org/codeberg/pages/server/database"
@ -23,6 +25,11 @@ var Certs = &cli.Command{
Usage: "remove a certificate from the database",
Action: removeCert,
},
{
Name: "migrate",
Usage: "migrate from \"pogreb\" driver to dbms driver",
Action: migrateCerts,
},
},
Flags: []cli.Flag{
// Cert Storage
@ -35,35 +42,83 @@ var Certs = &cli.Command{
},
&cli.StringFlag{
Name: "db-type",
Value: "sqlite",
Value: "", // TODO: "sqlite3" in next version
EnvVars: []string{"DB_TYPE"},
},
&cli.StringFlag{
Name: "db-conn",
Value: "", // TODO: "certs.sqlite", in next version
Value: "certs.sqlite",
EnvVars: []string{"DB_CONN"},
},
&cli.BoolFlag{
Name: "verbose",
Usage: "print trace info",
EnvVars: []string{"VERBOSE"},
Value: false,
},
},
}
func listCerts(ctx *cli.Context) error {
keyDatabase, err := database.NewPogreb(ctx.String("db-pogreb"))
if err != nil {
return fmt.Errorf("could not create database: %v", err)
func migrateCerts(ctx *cli.Context) error {
dbType := ctx.String("db-type")
if dbType == "" {
dbType = "sqlite3"
}
dbConn := ctx.String("db-conn")
dbPogrebConn := ctx.String("db-pogreb")
verbose := ctx.Bool("verbose")
log.Level(zerolog.InfoLevel)
if verbose {
log.Level(zerolog.TraceLevel)
}
items, err := keyDatabase.Items(0, 0)
xormDB, err := database.NewXormDB(dbType, dbConn)
if err != nil {
return fmt.Errorf("could not connect to database: %w", err)
}
defer xormDB.Close()
pogrebDB, err := database.NewPogreb(dbPogrebConn)
if err != nil {
return fmt.Errorf("could not open database: %w", err)
}
defer pogrebDB.Close()
fmt.Printf("Start migration from \"%s\" to \"%s:%s\" ...\n", dbPogrebConn, dbType, dbConn)
certs, err := pogrebDB.Items(0, 0)
if err != nil {
return err
}
fmt.Printf("Name\tDomain\tValidTill\n\n")
for _, cert := range items {
if cert.Name[0] == '.' {
cert.Name = "*" + cert.Name
for _, cert := range certs {
if err := xormDB.Put(cert.Domain, cert.Raw()); err != nil {
return err
}
fmt.Printf("%s\t%s\t%s\n",
cert.Name,
}
fmt.Println("... done")
return nil
}
func listCerts(ctx *cli.Context) error {
certDB, err := openCertDB(ctx)
if err != nil {
return err
}
items, err := certDB.Items(0, 0)
if err != nil {
return err
}
fmt.Printf("Domain\tValidTill\n\n")
for _, cert := range items {
if cert.Domain[0] == '.' {
cert.Domain = "*" + cert.Domain
}
fmt.Printf("%s\t%s\n",
cert.Domain,
time.Unix(cert.ValidTill, 0).Format(time.RFC3339))
}
@ -77,19 +132,48 @@ func removeCert(ctx *cli.Context) error {
domains := ctx.Args().Slice()
keyDatabase, err := database.NewPogreb(ctx.String("db-pogreb"))
certDB, err := openCertDB(ctx)
if err != nil {
return fmt.Errorf("could not create database: %v", err)
return err
}
for _, domain := range domains {
fmt.Printf("Removing domain %s from the database...\n", domain)
if err := keyDatabase.Delete(domain); err != nil {
if err := certDB.Delete(domain); err != nil {
return err
}
}
if err := keyDatabase.Close(); err != nil {
if err := certDB.Close(); err != nil {
return err
}
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
}

View file

@ -131,12 +131,12 @@ var ServeFlags = []cli.Flag{
},
&cli.StringFlag{
Name: "db-type",
Value: "sqlite",
Value: "", // TODO: "sqlite3" in next version
EnvVars: []string{"DB_TYPE"},
},
&cli.StringFlag{
Name: "db-conn",
Value: "", // TODO: "certs.sqlite", in next version
Value: "certs.sqlite",
EnvVars: []string{"DB_CONN"},
},
}

View file

@ -75,12 +75,34 @@ func Serve(ctx *cli.Context) error {
}
// Init ssl cert database
dbPogrebDB := ctx.String("db-pogreb")
certDB, err := database.NewPogreb(dbPogrebDB)
if err != nil {
return fmt.Errorf("could not create database: %v", err)
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)
}
}
defer certDB.Close() //nolint:errcheck // database has no close ... sync behave like it
defer certDB.Close()
keyCache := cache.NewKeyValueCache()
challengeCache := cache.NewKeyValueCache()