spongy

A Unixy IRC client
git clone https://git.woozle.org/neale/spongy.git

spongy / spongyd
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}