config.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. "code.google.com/p/gcfg"
  8. "gopkg.in/fsnotify.v1"
  9. )
  10. type AppConfig struct {
  11. StatHat struct {
  12. ApiKey string
  13. }
  14. Flags struct {
  15. HasStatHat bool
  16. }
  17. GeoIP struct {
  18. Directory string
  19. }
  20. }
  21. var Config = new(AppConfig)
  22. func configWatcher(fileName string) {
  23. configReader(fileName)
  24. watcher, err := fsnotify.NewWatcher()
  25. if err != nil {
  26. fmt.Println(err)
  27. return
  28. }
  29. if err := watcher.Add(*flagconfig); err != nil {
  30. fmt.Println(err)
  31. return
  32. }
  33. for {
  34. select {
  35. case ev := <-watcher.Events:
  36. if ev.Name == fileName {
  37. // Write = when the file is updated directly
  38. // Rename = when it's updated atomicly
  39. // Chmod = for `touch`
  40. if ev.Op&fsnotify.Write == fsnotify.Write ||
  41. ev.Op&fsnotify.Rename == fsnotify.Rename ||
  42. ev.Op&fsnotify.Chmod == fsnotify.Chmod {
  43. time.Sleep(200 * time.Millisecond)
  44. configReader(fileName)
  45. }
  46. }
  47. case err := <-watcher.Errors:
  48. log.Println("fsnotify error:", err)
  49. }
  50. }
  51. }
  52. var lastReadConfig time.Time
  53. func configReader(fileName string) error {
  54. stat, err := os.Stat(fileName)
  55. if err != nil {
  56. log.Printf("Failed to find config file: %s\n", err)
  57. return err
  58. }
  59. if !stat.ModTime().After(lastReadConfig) {
  60. return err
  61. }
  62. lastReadConfig = time.Now()
  63. log.Printf("Loading config: %s\n", fileName)
  64. cfg := new(AppConfig)
  65. err = gcfg.ReadFileInto(cfg, fileName)
  66. if err != nil {
  67. log.Printf("Failed to parse config data: %s\n", err)
  68. return err
  69. }
  70. cfg.Flags.HasStatHat = len(cfg.StatHat.ApiKey) > 0
  71. // log.Println("STATHAT APIKEY:", cfg.StatHat.ApiKey)
  72. // log.Println("STATHAT FLAG :", cfg.Flags.HasStatHat)
  73. Config = cfg
  74. return nil
  75. }