spongy/spongyd/spongyd.go

108 lines
2.1 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"os"
"path"
"path/filepath"
"time"
)
var running bool = true
var verbose bool = false
var maxlogsize uint
func debug(format string, a ...interface{}) {
if verbose {
log.Printf(format, a...)
}
}
func exists(filename string) bool {
_, err := os.Stat(filename); if err != nil {
return false
}
return true
}
func runsvdir(dirname string) {
services := make(map[string]*Network)
dir, err := os.Open(dirname)
if err != nil {
log.Fatal(err)
}
defer dir.Close()
log.Printf("Starting in %s\n", dirname)
for running {
dn, err := dir.Readdirnames(0); if err != nil {
log.Fatal(err)
}
found := make(map[string]bool)
for _, fn := range dn {
fpath := path.Join(dirname, fn)
if _, ok := services[fpath]; ! ok {
if exists(path.Join(fpath, "down")) {
continue
}
if ! exists(path.Join(fpath, "server")) {
continue
}
log.Printf("Found new network %s", fpath)
newnet := NewNetwork(fpath)
services[fpath] = newnet
go newnet.Connect()
}
found[fpath] = true
}
// If anything vanished, disconnect it
for fpath, nw := range services {
if _, ok := found[fpath]; ! ok {
log.Printf("Removing vanished network %s", fpath)
nw.Close()
}
}
_, _ = dir.Seek(0, 0)
time.Sleep(20 * time.Second)
}
}
func usage() {
fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] BASEPATH\n", os.Args[0])
fmt.Fprintf(os.Stderr, "\n")
fmt.Fprintf(os.Stderr, "BASEPATH is the path to your IRC directory (see README)\n")
fmt.Fprintf(os.Stderr, "\n")
fmt.Fprintf(os.Stderr, "OPTIONS:\n")
flag.PrintDefaults()
}
func main() {
flag.Usage = usage
flag.UintVar(&maxlogsize, "logsize", 6000, "Log entries before rotating")
flag.BoolVar(&verbose, "verbose", false, "Verbose logging")
notime := flag.Bool("notime", false, "Don't timestamp debugging messages")
flag.Parse()
if flag.NArg() != 1 {
usage()
os.Exit(2)
}
basePath, err := filepath.Abs(flag.Arg(0))
if err != nil {
log.Fatal(err)
}
if *notime {
log.SetFlags(0)
}
runsvdir(basePath)
running = false
}