Files
goforever/goforever.go

132 lines
2.4 KiB
Go

// goforever - processes management
// Copyright (c) 2013 Garrett Woodworth (https://github.com/gwoo).
package main
import (
"flag"
"fmt"
"log"
"os"
"github.com/gwoo/greq"
)
var d = flag.Bool("d", false, "Daemonize goforever. Must be first flag")
var conf = flag.String("conf", "goforever.toml", "Path to config file.")
var config *Config
var daemon *Process
var Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
flag.PrintDefaults()
usage := `
Process subcommands
list List processes.
show <process> Show a process.
start <process> Start a process.
stop <process> Stop a process.
restart <process> Restart a process.
end Stop goforever and all processes
`
fmt.Fprintln(os.Stderr, usage)
}
func init() {
flag.Parse()
setConfig()
setHost()
daemon = &Process{
Name: "goforever",
Args: []string{},
Command: "goforever",
Pidfile: config.Pidfile,
Logfile: config.Logfile,
Errfile: config.Errfile,
Respawn: 1,
}
flag.Usage = Usage
}
func main() {
if *d == true {
daemon.Args = append(daemon.Args, os.Args[2:]...)
daemon.start(daemon.Name)
return
}
if len(flag.Args()) > 0 {
fmt.Printf("%s\n", Cli())
return
}
if len(flag.Args()) == 0 {
RunDaemon()
HttpServer()
return
}
}
func Cli() string {
var o []byte
var err error
sub := flag.Arg(0)
name := flag.Arg(1)
if sub == "list" {
o, _, err = greq.Get("/")
}
if name != "" {
switch sub {
case "show":
o, _, err = greq.Get("/" + name)
case "start":
o, _, err = greq.Post("/"+name, nil)
case "stop":
o, _, err = greq.Delete("/" + name)
case "restart":
o, _, err = greq.Put("/"+name, nil)
}
}
if err != nil {
fmt.Printf("Process error: %s", err)
}
return string(o)
}
func RunDaemon() {
daemon.children = make(map[string]*Process, 0)
for _, name := range config.Keys() {
daemon.children[name] = config.Get(name)
}
daemon.run()
}
func setConfig() {
var err error
config, err = LoadConfig(*conf)
if err != nil {
log.Fatalf("%s", err)
return
}
if config.Username == "" {
log.Fatalf("Config error: %s", "Please provide a username.")
return
}
if config.Password == "" {
log.Fatalf("Config error: %s", "Please provide a password.")
return
}
if config.Port == "" {
config.Port = "2224"
}
}
func setHost() {
scheme := "https"
if isHttps() == false {
scheme = "http"
}
greq.Host = fmt.Sprintf("%s://%s:%s@0.0:%s",
scheme, config.Username, config.Password, config.Port,
)
}