initial commit
This commit is contained in:
commit
19b1834943
51
.air.toml
Normal file
51
.air.toml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
root = "."
|
||||||
|
testdata_dir = "testdata"
|
||||||
|
tmp_dir = "tmp"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
args_bin = []
|
||||||
|
bin = "./tmp/main"
|
||||||
|
cmd = "go build -o ./tmp/main ."
|
||||||
|
delay = 1000
|
||||||
|
exclude_dir = ["assets", "tmp", "vendor", "testdata"]
|
||||||
|
exclude_file = []
|
||||||
|
exclude_regex = ["_test.go"]
|
||||||
|
exclude_unchanged = false
|
||||||
|
follow_symlink = false
|
||||||
|
full_bin = ""
|
||||||
|
include_dir = []
|
||||||
|
include_ext = ["go", "tpl", "tmpl", "html"]
|
||||||
|
include_file = ["config.toml"]
|
||||||
|
kill_delay = "0s"
|
||||||
|
log = "build-errors.log"
|
||||||
|
poll = false
|
||||||
|
poll_interval = 0
|
||||||
|
post_cmd = []
|
||||||
|
pre_cmd = []
|
||||||
|
rerun = false
|
||||||
|
rerun_delay = 500
|
||||||
|
send_interrupt = false
|
||||||
|
stop_on_error = false
|
||||||
|
|
||||||
|
[color]
|
||||||
|
app = ""
|
||||||
|
build = "yellow"
|
||||||
|
main = "magenta"
|
||||||
|
runner = "green"
|
||||||
|
watcher = "cyan"
|
||||||
|
|
||||||
|
[log]
|
||||||
|
main_only = false
|
||||||
|
time = false
|
||||||
|
|
||||||
|
[misc]
|
||||||
|
clean_on_exit = false
|
||||||
|
|
||||||
|
[proxy]
|
||||||
|
app_port = 0
|
||||||
|
enabled = false
|
||||||
|
proxy_port = 0
|
||||||
|
|
||||||
|
[screen]
|
||||||
|
clear_on_rebuild = false
|
||||||
|
keep_scroll = true
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
tmp/
|
||||||
|
ctrl
|
45
config.go
Normal file
45
config.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/BurntSushi/toml"
|
||||||
|
)
|
||||||
|
|
||||||
|
type httpFeature struct {
|
||||||
|
Host string
|
||||||
|
Port int
|
||||||
|
}
|
||||||
|
|
||||||
|
type sshFeature struct {
|
||||||
|
SSHKeyPath string
|
||||||
|
SSHKeyPassphrasePath string
|
||||||
|
}
|
||||||
|
|
||||||
|
type wolTarget struct {
|
||||||
|
Name string
|
||||||
|
MAC string
|
||||||
|
}
|
||||||
|
|
||||||
|
type limitsFeature struct {
|
||||||
|
RemoteCmds []string
|
||||||
|
WolHosts []wolTarget
|
||||||
|
}
|
||||||
|
|
||||||
|
type tomlConfig struct {
|
||||||
|
HTTP httpFeature `toml:"http"`
|
||||||
|
SSH sshFeature `toml:"ssh"`
|
||||||
|
Limits limitsFeature `toml:"limits"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func readConfig(path string) *tomlConfig {
|
||||||
|
var conf tomlConfig
|
||||||
|
_, err := toml.DecodeFile(path, &conf)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// log.Println(meta.Keys())
|
||||||
|
|
||||||
|
return &conf
|
||||||
|
}
|
18
config.toml
Normal file
18
config.toml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
[http]
|
||||||
|
port = 8082
|
||||||
|
host = "localhost"
|
||||||
|
|
||||||
|
[ssh]
|
||||||
|
sshKeyPath = "path/to/key/file"
|
||||||
|
sshKeyPassphrasePath = "path/to/key/passphrase"
|
||||||
|
|
||||||
|
[limits]
|
||||||
|
remoteCmds = ["systemctl suspend"]
|
||||||
|
|
||||||
|
# wolHosts = [
|
||||||
|
# {name = "w00t", mac = "01:10:10:aa:bb:cc"},
|
||||||
|
# ]
|
||||||
|
|
||||||
|
[[limits.wolHosts]]
|
||||||
|
name = "w00t"
|
||||||
|
mac = "01:10:10:aa:bb:cc"
|
5
flag.go
Normal file
5
flag.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "flag"
|
||||||
|
|
||||||
|
var configFlag = flag.String("config", "./config.toml", "path to config.toml file")
|
5
go.mod
Normal file
5
go.mod
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module git.dotya.ml/wanderer/ctrl
|
||||||
|
|
||||||
|
go 1.22.4
|
||||||
|
|
||||||
|
require github.com/BurntSushi/toml v1.4.0 // indirect
|
2
go.sum
Normal file
2
go.sum
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
|
||||||
|
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
6
main.go
Normal file
6
main.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// ctrl let's me control aspects of functioning of my other devices - via SSH.
|
||||||
|
package main
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
run()
|
||||||
|
}
|
93
run.go
Normal file
93
run.go
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
port = 8081
|
||||||
|
host = "localhost"
|
||||||
|
)
|
||||||
|
|
||||||
|
const tmplDir = "templates"
|
||||||
|
|
||||||
|
func run() {
|
||||||
|
log.Println("starting ctrl")
|
||||||
|
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
c := readConfig(*configFlag)
|
||||||
|
|
||||||
|
if c.HTTP.Port > 0 {
|
||||||
|
port = c.HTTP.Port
|
||||||
|
}
|
||||||
|
log.Println("port:", port)
|
||||||
|
|
||||||
|
if c.HTTP.Host != "" {
|
||||||
|
host = c.HTTP.Host
|
||||||
|
}
|
||||||
|
log.Println("host:", host)
|
||||||
|
|
||||||
|
if len(c.Limits.RemoteCmds) != 0 {
|
||||||
|
log.Println("available cmmands:", c.Limits.RemoteCmds)
|
||||||
|
} else {
|
||||||
|
log.Println("no remote commands configured")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(c.Limits.WolHosts) != 0 {
|
||||||
|
log.Println("configured WoL hosts:")
|
||||||
|
for _, w := range c.Limits.WolHosts {
|
||||||
|
log.Println("\tname:", w.Name, "mac:", w.MAC)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Println("no WoL hosts configured")
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("ssh key path:", c.SSH.SSHKeyPath)
|
||||||
|
log.Println("ssh key passphrase path:", c.SSH.SSHKeyPassphrasePath)
|
||||||
|
|
||||||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.Method != "GET" && r.Method != "POST" {
|
||||||
|
http.Error(w, "method is not supported.", http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
http.ServeFile(w, r, r.URL.Path[1:])
|
||||||
|
})
|
||||||
|
|
||||||
|
done := make(chan os.Signal, 1)
|
||||||
|
|
||||||
|
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
|
||||||
|
log.Println("starting server on host:", host, "port:", port)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
if err := http.ListenAndServe(strings.Join([]string{host, strconv.Itoa(port)}, ":"), nil); err != nil {
|
||||||
|
|
||||||
|
log.Println("could not start server on port", port, "error", err)
|
||||||
|
|
||||||
|
done <- nil
|
||||||
|
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
log.Println("started server on port", port)
|
||||||
|
|
||||||
|
<-done
|
||||||
|
|
||||||
|
log.Println("stopping HTTP server")
|
||||||
|
|
||||||
|
// ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
|
||||||
|
// defer func() { cancel() }()
|
||||||
|
|
||||||
|
// if err := h.Shutdown(ctx); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||||
|
// log.Println("could not stop server", "error", err)
|
||||||
|
// }
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user