config.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "code.google.com/p/gcfg"
  4. "fmt"
  5. "github.com/howeyc/fsnotify"
  6. "log"
  7. "os"
  8. "time"
  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.Watch(*flagconfig); err != nil {
  30. fmt.Println(err)
  31. return
  32. }
  33. for {
  34. select {
  35. case ev := <-watcher.Event:
  36. if ev.Name == fileName {
  37. if ev.IsCreate() || ev.IsModify() || ev.IsRename() {
  38. time.Sleep(200 * time.Millisecond)
  39. configReader(fileName)
  40. }
  41. }
  42. case err := <-watcher.Error:
  43. log.Println("fsnotify error:", err)
  44. }
  45. }
  46. }
  47. var lastReadConfig time.Time
  48. func configReader(fileName string) error {
  49. stat, err := os.Stat(fileName)
  50. if err != nil {
  51. log.Printf("Failed to find config file: %s\n", err)
  52. return err
  53. }
  54. if !stat.ModTime().After(lastReadConfig) {
  55. return err
  56. }
  57. lastReadConfig = time.Now()
  58. log.Printf("Loading config: %s\n", fileName)
  59. cfg := new(AppConfig)
  60. err = gcfg.ReadFileInto(cfg, fileName)
  61. if err != nil {
  62. log.Printf("Failed to parse config data: %s\n", err)
  63. return err
  64. }
  65. cfg.Flags.HasStatHat = len(cfg.StatHat.ApiKey) > 0
  66. // log.Println("STATHAT APIKEY:", cfg.StatHat.ApiKey)
  67. // log.Println("STATHAT FLAG :", cfg.Flags.HasStatHat)
  68. Config = cfg
  69. return nil
  70. }