* support flags commands, move to cmd * fix target name * test for happy path importer * add export cmd * fix wrong import, lint warns * increase test timeout * add sellp to allow main test server to start * implement all cmds * handle backup/restore errors * fix import status check, hide secret from logs * backup cmd err tests * randimize test port * avoid dup code in Last controller * add target to make all bin archives * remove container in make * add smiple scripts to simplify commands, update readme * add docs on dockerless, enforce app user * add restore info * move last to lastCommentsScope const
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
// Package cmd has all top-level commands dispatched by main's flag.Parse
|
|
// The entry point of each command is Execute function
|
|
package cmd
|
|
|
|
import (
|
|
"bytes"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"text/template"
|
|
"time"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// fileParser used to convert template strings like blah-{{.SITE}}-{{.YYYYMMDD}} the final format
|
|
type fileParser struct {
|
|
site string
|
|
file string
|
|
path string
|
|
}
|
|
|
|
// parse apply template and also concat path and file. In case if file contains path separator path will be ignored
|
|
func (p *fileParser) parse(now time.Time) (string, error) {
|
|
|
|
fileTemplate := struct {
|
|
YYYYMMDD string
|
|
YYYY string
|
|
YYYYMM string
|
|
MM string
|
|
DD string
|
|
TS string
|
|
UNIX int64
|
|
SITE string
|
|
}{
|
|
YYYYMMDD: now.Format("20060102"),
|
|
YYYY: now.Format("2006"),
|
|
YYYYMM: now.Format("200601"),
|
|
MM: now.Format("01"),
|
|
DD: now.Format("02"),
|
|
UNIX: now.Unix(),
|
|
SITE: p.site,
|
|
TS: now.Format("20060102T150405"),
|
|
}
|
|
|
|
bb := bytes.Buffer{}
|
|
fname := p.file
|
|
if !strings.Contains(p.file, string(filepath.Separator)) {
|
|
fname = filepath.Join(p.path, p.file)
|
|
}
|
|
|
|
if err := template.Must(template.New("bb").Parse(fname)).Execute(&bb, fileTemplate); err != nil {
|
|
return "", errors.Wrapf(err, "failed to parse %q", fname)
|
|
}
|
|
return bb.String(), nil
|
|
}
|
|
|
|
// resetEnv clears sensitive env vars
|
|
func resetEnv(envs ...string) {
|
|
for _, env := range envs {
|
|
if err := os.Unsetenv(env); err != nil {
|
|
log.Printf("[WARN] can't unset env %s, %s", env, err)
|
|
}
|
|
}
|
|
}
|