add config, add pidfile, prevent daemon from runnig more than once

pull/3/head
Simon Let 7 years ago
parent 9bc4e957de
commit 2f6f5d32a3
  1. 10
      Makefile
  2. 19
      collect/resh-collect.go
  3. 3
      common/resh-common.go
  4. 1
      config.toml
  5. 114
      daemon/resh-daemon.go

@ -4,8 +4,9 @@ SHELL=/bin/bash
build: submodules resh-collect resh-daemon build: submodules resh-collect resh-daemon
install: build | $(HOME)/.resh $(HOME)/.resh/bin install: build | $(HOME)/.resh $(HOME)/.resh/bin $(HOME)/.config/resh
cp submodules/bash-preexec/bash-preexec.sh ~/.bash-preexec.sh -f cp submodules/bash-preexec/bash-preexec.sh ~/.bash-preexec.sh -f
cp config.toml ~/.config/resh.toml -f
cp bashrc.sh ~/.resh/bashrc -f cp bashrc.sh ~/.resh/bashrc -f
cp resh-* ~/.resh/bin/ -f cp resh-* ~/.resh/bin/ -f
grep '[[ -f ~/.resh/bashrc ]] && source ~/.resh/bashrc' ~/.bashrc ||\ grep '[[ -f ~/.resh/bashrc ]] && source ~/.resh/bashrc' ~/.bashrc ||\
@ -23,11 +24,8 @@ resh-collect: collect/resh-collect.go common/resh-common.go
go build -o $@ $< go build -o $@ $<
$(HOME)/.resh: $(HOME)/.resh $(HOME)/.resh/bin $(HOME)/.config/resh:
mkdir $(HOME)/.resh mkdir -p $@
$(HOME)/.resh/bin:
mkdir $(HOME)/.resh/bin
.PHONY: submodules build install .PHONY: submodules build install

@ -5,14 +5,27 @@ import (
"encoding/json" "encoding/json"
"os" "os"
"os/exec" "os/exec"
"os/user"
"path/filepath"
"log" "log"
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
common "github.com/curusarn/resh/common" common "github.com/curusarn/resh/common"
"github.com/BurntSushi/toml"
) )
func main() { func main() {
usr, _ := user.Current()
dir := usr.HomeDir
configPath := filepath.Join(dir, "/.config/resh.toml")
var config common.Config
if _, err := toml.DecodeFile(configPath, &config); err != nil {
log.Println("Error reading config", err)
return
}
exitCode, err := strconv.Atoi(os.Args[1]) exitCode, err := strconv.Atoi(os.Args[1])
if err != nil { if err != nil {
// log this // log this
@ -27,16 +40,16 @@ func main() {
Shell: os.Getenv("SHELL"), Shell: os.Getenv("SHELL"),
ExitCode: exitCode, ExitCode: exitCode,
} }
sendRecord(rec) sendRecord(rec, strconv.Itoa(config.Port))
} }
func sendRecord(r common.Record) { func sendRecord(r common.Record, port string) {
recJson, err := json.Marshal(r) recJson, err := json.Marshal(r)
if err != nil { if err != nil {
log.Fatal("1 ", err) log.Fatal("1 ", err)
} }
req, err := http.NewRequest("POST", "http://localhost:8888", req, err := http.NewRequest("POST", "http://localhost:" + port + "/record",
bytes.NewBuffer(recJson)) bytes.NewBuffer(recJson))
if err != nil { if err != nil {
log.Fatal("2 ", err) log.Fatal("2 ", err)

@ -9,3 +9,6 @@ type Record struct {
Logs []string `json: logs` Logs []string `json: logs`
} }
type Config struct {
Port int
}

@ -0,0 +1 @@
port = 8888

@ -2,14 +2,65 @@ package main
import ( import (
"encoding/json" "encoding/json"
//"flag"
"log" "log"
"io/ioutil" "io/ioutil"
"path/filepath"
"os"
"os/exec"
"os/user"
"strconv"
"strings"
//"syscall"
"net/http" "net/http"
common "github.com/curusarn/resh/common" common "github.com/curusarn/resh/common"
"github.com/BurntSushi/toml"
) )
func main() { func main() {
server() usr, _ := user.Current()
dir := usr.HomeDir
pidfilePath := filepath.Join(dir, ".resh/resh.pid")
configPath := filepath.Join(dir, "/.config/resh.toml")
var config common.Config
if _, err := toml.DecodeFile(configPath, &config); err != nil {
log.Println("Error reading config", err)
return
}
res, err := isDaemonRunning(config.Port)
if err != nil {
log.Println("Error while checking if the daemon is runnnig", err)
}
if res {
log.Println("Daemon is already runnnig - exiting!")
return
}
_, err = os.Stat(pidfilePath)
if err == nil {
log.Println("Pidfile exists")
// kill daemon
err = killDaemon(pidfilePath)
if err != nil {
log.Println("Error while killing daemon", err)
}
}
err = ioutil.WriteFile(pidfilePath, []byte(strconv.Itoa(os.Getpid())), 0644)
if err != nil {
log.Fatal("Could not create pidfile", err)
}
server(config.Port)
err = os.Remove(pidfilePath)
if err != nil {
log.Println("Could not delete pidfile", err)
}
}
func statusHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("OK\n"))
log.Printf("Status OK\n")
} }
func recordHandler(w http.ResponseWriter, r *http.Request) { func recordHandler(w http.ResponseWriter, r *http.Request) {
@ -25,6 +76,7 @@ func recordHandler(w http.ResponseWriter, r *http.Request) {
err = json.Unmarshal(jsn, &record) err = json.Unmarshal(jsn, &record)
if err != nil { if err != nil {
log.Println("Decoding error: ", err) log.Println("Decoding error: ", err)
log.Println("Payload: ", jsn)
return return
} }
@ -35,7 +87,61 @@ func recordHandler(w http.ResponseWriter, r *http.Request) {
// fmt.Println("exit_code:", r.ExitCode) // fmt.Println("exit_code:", r.ExitCode)
} }
func server() { func server(port int) {
http.HandleFunc("/", recordHandler) http.HandleFunc("/status", statusHandler)
http.ListenAndServe(":8888", nil) http.HandleFunc("/record", recordHandler)
http.ListenAndServe(":" + strconv.Itoa(port) , nil)
}
func killDaemon(pidfile string) error {
dat, err := ioutil.ReadFile(pidfile)
if err != nil {
log.Println("Reading pid file failed", err)
}
log.Print(string(dat))
pid, err := strconv.Atoi(strings.TrimSuffix(string(dat), "\n"))
if err != nil {
log.Fatal("Pidfile contents are malformed", err)
}
cmd := exec.Command("kill", strconv.Itoa(pid))
err = cmd.Run()
if err != nil {
log.Printf("Command finished with error: %v", err)
return err
}
return nil
}
func isDaemonRunning(port int) (bool, error) {
url := "http://localhost:" + strconv.Itoa(port) + "/status"
resp, err := http.Get(url)
if err != nil {
log.Println("Error while checking daemon status - " +
"it's probably not runnig!", err)
return false, err
}
defer resp.Body.Close()
return true, nil
//body, err := ioutil.ReadAll(resp.Body)
// dat, err := ioutil.ReadFile(pidfile)
// if err != nil {
// log.Println("Reading pid file failed", err)
// return false, err
// }
// log.Print(string(dat))
// pid, err := strconv.ParseInt(string(dat), 10, 64)
// if err != nil {
// log.Fatal(err)
// }
// process, err := os.FindProcess(int(pid))
// if err != nil {
// log.Printf("Failed to find process: %s\n", err)
// return false, err
// } else {
// err := process.Signal(syscall.Signal(0))
// log.Printf("process.Signal on pid %d returned: %v\n", pid, err)
// }
// return true, nil
} }

Loading…
Cancel
Save