summaryrefslogtreecommitdiff
path: root/examples/docker/admin/cmd/ponzu/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'examples/docker/admin/cmd/ponzu/main.go')
-rw-r--r--examples/docker/admin/cmd/ponzu/main.go293
1 files changed, 293 insertions, 0 deletions
diff --git a/examples/docker/admin/cmd/ponzu/main.go b/examples/docker/admin/cmd/ponzu/main.go
new file mode 100644
index 0000000..b3dc708
--- /dev/null
+++ b/examples/docker/admin/cmd/ponzu/main.go
@@ -0,0 +1,293 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+
+ "github.com/ponzu-cms/ponzu/system/admin"
+ "github.com/ponzu-cms/ponzu/system/api"
+ "github.com/ponzu-cms/ponzu/system/api/analytics"
+ "github.com/ponzu-cms/ponzu/system/db"
+ "github.com/ponzu-cms/ponzu/system/tls"
+
+ _ "github.com/ponzu-cms/ponzu/content"
+)
+
+var (
+ usage = usageHeader + usageNew + usageGenerate +
+ usageBuild + usageRun + usageUpgrade + usageAdd + usageVersion
+ port int
+ httpsport int
+ https bool
+ devhttps bool
+ cli bool
+
+ // for ponzu internal / core development
+ dev bool
+ fork string
+ gocmd string
+)
+
+func main() {
+ flag.Usage = func() {
+ fmt.Println(usage)
+ }
+
+ flag.IntVar(&port, "port", 8080, "port for ponzu to bind its HTTP listener")
+ flag.IntVar(&httpsport, "httpsport", 443, "port for ponzu to bind its HTTPS listener")
+ flag.BoolVar(&https, "https", false, "enable automatic TLS/SSL certificate management")
+ flag.BoolVar(&devhttps, "devhttps", false, "[dev environment] enable automatic TLS/SSL certificate management")
+ flag.BoolVar(&dev, "dev", false, "modify environment for Ponzu core development")
+ flag.BoolVar(&cli, "cli", false, "specify that information should be returned about the CLI, not project")
+ flag.StringVar(&fork, "fork", "", "modify repo source for Ponzu core development")
+ flag.StringVar(&gocmd, "gocmd", "go", "custom go command if using beta or new release of Go")
+ flag.Parse()
+
+ args := flag.Args()
+
+ if len(args) < 1 {
+ fmt.Println(usage)
+ os.Exit(0)
+ }
+
+ switch args[0] {
+ case "help", "h":
+ if len(args) < 2 {
+ fmt.Println(usageHelp)
+ fmt.Println(usage)
+ os.Exit(0)
+ }
+
+ switch args[1] {
+ case "new":
+ fmt.Println(usageNew)
+ os.Exit(0)
+
+ case "generate", "gen", "g":
+ fmt.Println(usageGenerate)
+ os.Exit(0)
+
+ case "build":
+ fmt.Println(usageBuild)
+ os.Exit(0)
+
+ case "run":
+ fmt.Println(usageRun)
+ os.Exit(0)
+
+ case "upgrade":
+ fmt.Println(usageUpgrade)
+ os.Exit(0)
+
+ case "version", "v":
+ fmt.Println(usageVersion)
+ os.Exit(0)
+
+ case "add", "a":
+ fmt.Println(usageAdd)
+ os.Exit(0)
+ }
+
+ case "new":
+ if len(args) < 2 {
+ fmt.Println(usageNew)
+ os.Exit(0)
+ }
+
+ err := newProjectInDir(args[1])
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ case "generate", "gen", "g":
+ if len(args) < 3 {
+ fmt.Println(usageGenerate)
+ os.Exit(0)
+ }
+
+ // check what we are asked to generate
+ switch args[1] {
+ case "content", "c":
+ err := generateContentType(args[2:])
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ default:
+ msg := fmt.Sprintf("Generator '%s' is not implemented.", args[1])
+ fmt.Println(msg)
+ }
+
+ case "build":
+ err := buildPonzuServer(args)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ case "run":
+ var addTLS string
+ if https {
+ addTLS = "--https"
+ } else {
+ addTLS = "--https=false"
+ }
+
+ if devhttps {
+ addTLS = "--devhttps"
+ }
+
+ var services string
+ if len(args) > 1 {
+ services = args[1]
+ } else {
+ services = "admin,api"
+ }
+
+ name := buildOutputName()
+ buildPathName := strings.Join([]string{".", name}, string(filepath.Separator))
+ serve := exec.Command(buildPathName,
+ fmt.Sprintf("--port=%d", port),
+ fmt.Sprintf("--httpsport=%d", httpsport),
+ addTLS,
+ "serve",
+ services,
+ )
+ serve.Stderr = os.Stderr
+ serve.Stdout = os.Stdout
+
+ err := serve.Run()
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ case "serve", "s":
+ db.Init()
+ defer db.Close()
+
+ analytics.Init()
+ defer analytics.Close()
+
+ if len(args) > 1 {
+ services := strings.Split(args[1], ",")
+
+ for _, service := range services {
+ if service == "api" {
+ api.Run()
+ } else if service == "admin" {
+ admin.Run()
+ } else {
+ fmt.Println("To execute 'ponzu serve', you must specify which service to run.")
+ fmt.Println("$ ponzu --help")
+ os.Exit(1)
+ }
+ }
+ }
+
+ // save the https port the system is listening on
+ err := db.PutConfig("https_port", fmt.Sprintf("%d", httpsport))
+ if err != nil {
+ log.Fatalln("System failed to save config. Please try to run again.", err)
+ }
+
+ // cannot run production HTTPS and development HTTPS together
+ if devhttps {
+ fmt.Println("Enabling self-signed HTTPS... [DEV]")
+
+ go tls.EnableDev()
+ fmt.Println("Server listening on https://localhost:10443 for requests... [DEV]")
+ fmt.Println("----")
+ fmt.Println("If your browser rejects HTTPS requests, try allowing insecure connections on localhost.")
+ fmt.Println("on Chrome, visit chrome://flags/#allow-insecure-localhost")
+
+ } else if https {
+ fmt.Println("Enabling HTTPS...")
+
+ go tls.Enable()
+ fmt.Printf("Server listening on :%s for HTTPS requests...\n", db.ConfigCache("https_port").(string))
+ }
+
+ // save the https port the system is listening on so internal system can make
+ // HTTP api calls while in dev or production w/o adding more cli flags
+ err = db.PutConfig("http_port", fmt.Sprintf("%d", port))
+ if err != nil {
+ log.Fatalln("System failed to save config. Please try to run again.", err)
+ }
+
+ fmt.Printf("Server listening on :%d for HTTP requests...\n", port)
+ fmt.Println("\nvisit `/admin` to get started.")
+ log.Fatalln(http.ListenAndServe(fmt.Sprintf(":%d", port), nil))
+
+ case "version", "v":
+ // read ponzu.json value to Stdout
+
+ p, err := ponzu(cli)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ fmt.Fprintf(os.Stdout, "Ponzu v%s\n", p["version"])
+
+ case "upgrade":
+ // confirm since upgrade will replace Ponzu core files
+ path, err := os.Getwd()
+ if err != nil {
+ fmt.Println("Failed to find current directory.", err)
+ os.Exit(1)
+ }
+
+ fmt.Println("Only files you added to this directory, 'addons' and 'content' will be preserved.")
+ fmt.Println("Upgrade this project? (y/N):")
+
+ answer, err := getAnswer()
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ switch answer {
+ case "n", "no", "\r\n", "\n", "":
+ fmt.Println("")
+
+ case "y", "yes":
+ err := upgradePonzuProjectDir(path)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ default:
+ fmt.Println("Input not recognized. No upgrade made. Answer as 'y' or 'n' only.")
+ }
+
+ case "add", "a":
+ // expecting two args, add and the go gettable package uri
+ if len(args) < 2 {
+ fmt.Println(usageAdd)
+ os.Exit(0)
+ }
+
+ err := getAddon(args)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ case "":
+ fmt.Println(usage)
+ fmt.Println(usageHelp)
+
+ default:
+ fmt.Println(usage)
+ fmt.Println(usageHelp)
+ }
+}