summaryrefslogtreecommitdiff
path: root/cmd/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/main.go')
-rw-r--r--cmd/main.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/cmd/main.go b/cmd/main.go
new file mode 100644
index 0000000..b9baf84
--- /dev/null
+++ b/cmd/main.go
@@ -0,0 +1,88 @@
+package caddycmd
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "log"
+ "net"
+ "os"
+ "runtime/debug"
+)
+
+// Main executes the main function of the caddy command.
+func Main() {
+ if len(os.Args) <= 1 {
+ fmt.Println(usageString())
+ return
+ }
+
+ subcommand, ok := commands[os.Args[1]]
+ if !ok {
+ fmt.Printf("%q is not a valid command\n", os.Args[1])
+ os.Exit(2)
+ }
+
+ if exitCode, err := subcommand(); err != nil {
+ log.Println(err)
+ os.Exit(exitCode)
+ }
+}
+
+// commandFunc is a function that executes
+// a subcommand. It returns an exit code and
+// any associated error.
+type commandFunc func() (int, error)
+
+var commands = map[string]commandFunc{
+ "start": cmdStart,
+ "stop": cmdStop,
+ "run": cmdRun,
+ "version": cmdVersion,
+ "list-modules": cmdListModules,
+ "environ": cmdEnviron,
+}
+
+func usageString() string {
+ buf := new(bytes.Buffer)
+ buf.WriteString("usage: caddy <command> [<args>]")
+ flag.CommandLine.SetOutput(buf)
+ flag.CommandLine.PrintDefaults()
+ return buf.String()
+}
+
+// handlePingbackConn reads from conn and ensures it matches
+// the bytes in expect, or returns an error if it doesn't.
+func handlePingbackConn(conn net.Conn, expect []byte) error {
+ defer conn.Close()
+ confirmationBytes, err := ioutil.ReadAll(io.LimitReader(conn, 32))
+ if err != nil {
+ return err
+ }
+ if !bytes.Equal(confirmationBytes, expect) {
+ return fmt.Errorf("wrong confirmation: %x", confirmationBytes)
+ }
+ return nil
+}
+
+// getGoBuildModule returns the build info of Caddy
+// from debug.BuildInfo (requires Go modules). If
+// no version information is available, a non-nil
+// value will still be returned, but with an
+// unknown version.
+func getGoBuildModule() *debug.Module {
+ bi, ok := debug.ReadBuildInfo()
+ if ok {
+ // The recommended way to build Caddy involves
+ // creating a separate main module, which
+ // TODO: track related Go issue: https://github.com/golang/go/issues/29228
+ for _, mod := range bi.Deps {
+ if mod.Path == "github.com/mholt/caddy" {
+ return mod
+ }
+ }
+ }
+ return &debug.Module{Version: "unknown"}
+}