2021-12-03 02:12:51 +01:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2021-12-03 04:15:48 +01:00
|
|
|
"fmt"
|
2023-02-09 17:52:30 +01:00
|
|
|
"time"
|
2022-03-27 21:54:06 +02:00
|
|
|
|
2023-02-09 19:14:53 +01:00
|
|
|
"github.com/rs/zerolog"
|
|
|
|
"github.com/rs/zerolog/log"
|
2021-12-03 02:12:51 +01:00
|
|
|
"github.com/urfave/cli/v2"
|
|
|
|
|
2021-12-03 04:15:48 +01:00
|
|
|
"codeberg.org/codeberg/pages/server/database"
|
2021-12-03 02:12:51 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
var Certs = &cli.Command{
|
2022-03-20 23:18:00 +01:00
|
|
|
Name: "certs",
|
|
|
|
Usage: "manage certs manually",
|
|
|
|
Subcommands: []*cli.Command{
|
2022-03-27 21:54:06 +02:00
|
|
|
{
|
2022-03-20 23:18:00 +01:00
|
|
|
Name: "list",
|
|
|
|
Usage: "list all certificates in the database",
|
|
|
|
Action: listCerts,
|
|
|
|
},
|
2022-03-27 21:54:06 +02:00
|
|
|
{
|
2022-03-20 23:18:00 +01:00
|
|
|
Name: "remove",
|
|
|
|
Usage: "remove a certificate from the database",
|
|
|
|
Action: removeCert,
|
|
|
|
},
|
2023-02-09 19:14:53 +01:00
|
|
|
{
|
|
|
|
Name: "migrate",
|
|
|
|
Usage: "migrate from \"pogreb\" driver to dbms driver",
|
|
|
|
Action: migrateCerts,
|
|
|
|
},
|
2022-03-20 23:18:00 +01:00
|
|
|
},
|
2023-02-09 14:21:26 +01:00
|
|
|
Flags: []cli.Flag{
|
|
|
|
// Cert Storage
|
|
|
|
// TODO: remove in next version
|
|
|
|
&cli.StringFlag{
|
|
|
|
// DEPRICATED
|
|
|
|
Name: "db-pogreb",
|
|
|
|
Value: "key-database.pogreb",
|
|
|
|
EnvVars: []string{"DB_POGREB"},
|
|
|
|
},
|
2023-02-09 15:19:16 +01:00
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "db-type",
|
2023-02-09 19:14:53 +01:00
|
|
|
Value: "", // TODO: "sqlite3" in next version
|
2023-02-09 15:19:16 +01:00
|
|
|
EnvVars: []string{"DB_TYPE"},
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "db-conn",
|
2023-02-09 19:14:53 +01:00
|
|
|
Value: "certs.sqlite",
|
2023-02-09 15:19:16 +01:00
|
|
|
EnvVars: []string{"DB_CONN"},
|
|
|
|
},
|
2023-02-09 19:14:53 +01:00
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "verbose",
|
|
|
|
Usage: "print trace info",
|
|
|
|
EnvVars: []string{"VERBOSE"},
|
|
|
|
Value: false,
|
|
|
|
},
|
2023-02-09 14:21:26 +01:00
|
|
|
},
|
2021-12-03 02:12:51 +01:00
|
|
|
}
|
|
|
|
|
2023-02-09 19:14:53 +01:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, cert := range certs {
|
|
|
|
if err := xormDB.Put(cert.Domain, cert.Raw()); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("... done")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-03-20 23:18:00 +01:00
|
|
|
func listCerts(ctx *cli.Context) error {
|
2023-02-09 19:14:53 +01:00
|
|
|
certDB, err := openCertDB(ctx)
|
2022-03-20 23:18:00 +01:00
|
|
|
if err != nil {
|
2023-02-09 19:14:53 +01:00
|
|
|
return err
|
2022-03-20 23:18:00 +01:00
|
|
|
}
|
2021-12-03 02:12:51 +01:00
|
|
|
|
2023-02-09 19:14:53 +01:00
|
|
|
items, err := certDB.Items(0, 0)
|
2023-02-09 17:52:30 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2023-02-09 19:14:53 +01:00
|
|
|
fmt.Printf("Domain\tValidTill\n\n")
|
2023-02-09 17:52:30 +01:00
|
|
|
for _, cert := range items {
|
2023-02-09 19:14:53 +01:00
|
|
|
if cert.Domain[0] == '.' {
|
|
|
|
cert.Domain = "*" + cert.Domain
|
2021-12-03 02:12:51 +01:00
|
|
|
}
|
2023-02-09 19:14:53 +01:00
|
|
|
fmt.Printf("%s\t%s\n",
|
2023-02-09 17:52:30 +01:00
|
|
|
cert.Domain,
|
|
|
|
time.Unix(cert.ValidTill, 0).Format(time.RFC3339))
|
2022-03-20 23:18:00 +01:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func removeCert(ctx *cli.Context) error {
|
|
|
|
if ctx.Args().Len() < 1 {
|
|
|
|
return fmt.Errorf("'certs remove' requires at least one domain as an argument")
|
|
|
|
}
|
|
|
|
|
|
|
|
domains := ctx.Args().Slice()
|
|
|
|
|
2023-02-09 19:14:53 +01:00
|
|
|
certDB, err := openCertDB(ctx)
|
2022-03-20 23:18:00 +01:00
|
|
|
if err != nil {
|
2023-02-09 19:14:53 +01:00
|
|
|
return err
|
2022-03-20 23:18:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, domain := range domains {
|
|
|
|
fmt.Printf("Removing domain %s from the database...\n", domain)
|
2023-02-09 19:14:53 +01:00
|
|
|
if err := certDB.Delete(domain); err != nil {
|
2022-03-20 23:18:00 +01:00
|
|
|
return err
|
2021-12-03 02:12:51 +01:00
|
|
|
}
|
2022-03-20 23:18:00 +01:00
|
|
|
}
|
2023-02-09 19:14:53 +01:00
|
|
|
if err := certDB.Close(); err != nil {
|
2022-03-20 23:18:00 +01:00
|
|
|
return err
|
2021-12-03 02:12:51 +01:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2023-02-09 19:14:53 +01:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|