Neale Pickett
·
2016-05-18
spongyd.go
1package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "os"
8 "path"
9 "path/filepath"
10 "time"
11)
12
13var running bool = true
14var verbose bool = false
15var maxlogsize uint
16
17func debug(format string, a ...interface{}) {
18 if verbose {
19 log.Printf(format, a...)
20 }
21}
22
23func exists(filename string) bool {
24 _, err := os.Stat(filename); if err != nil {
25 return false
26 }
27 return true
28}
29
30func runsvdir(dirname string) {
31 services := make(map[string]*Network)
32
33 dir, err := os.Open(dirname)
34 if err != nil {
35 log.Fatal(err)
36 }
37 defer dir.Close()
38
39 log.Printf("Starting in %s\n", dirname)
40 for running {
41 dn, err := dir.Readdirnames(0); if err != nil {
42 log.Fatal(err)
43 }
44
45 found := make(map[string]bool)
46 for _, fn := range dn {
47 fpath := path.Join(dirname, fn)
48 if _, ok := services[fpath]; ! ok {
49 if exists(path.Join(fpath, "down")) {
50 continue
51 }
52 if ! exists(path.Join(fpath, "server")) {
53 continue
54 }
55
56 log.Printf("Found new network %s", fpath)
57 newnet := NewNetwork(fpath)
58 services[fpath] = newnet
59 go newnet.Connect()
60 }
61 found[fpath] = true
62 }
63
64 // If anything vanished, disconnect it
65 for fpath, nw := range services {
66 if _, ok := found[fpath]; ! ok {
67 log.Printf("Removing vanished network %s", fpath)
68 nw.Close()
69 }
70 }
71
72 _, _ = dir.Seek(0, 0)
73 time.Sleep(20 * time.Second)
74 }
75}
76
77func usage() {
78 fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] BASEPATH\n", os.Args[0])
79 fmt.Fprintf(os.Stderr, "\n")
80 fmt.Fprintf(os.Stderr, "BASEPATH is the path to your IRC directory (see README)\n")
81 fmt.Fprintf(os.Stderr, "\n")
82 fmt.Fprintf(os.Stderr, "OPTIONS:\n")
83 flag.PrintDefaults()
84}
85
86func main() {
87 flag.Usage = usage
88 flag.UintVar(&maxlogsize, "logsize", 6000, "Log entries before rotating")
89 flag.BoolVar(&verbose, "verbose", false, "Verbose logging")
90 notime := flag.Bool("notime", false, "Don't timestamp debugging messages")
91 flag.Parse()
92 if flag.NArg() != 1 {
93 usage()
94 os.Exit(2)
95 }
96 basePath, err := filepath.Abs(flag.Arg(0))
97 if err != nil {
98 log.Fatal(err)
99 }
100 if *notime {
101 log.SetFlags(0)
102 }
103
104 runsvdir(basePath)
105
106 running = false
107 log.Print("Exiting for some reason!")
108}