Docker template generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dotege.go 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/client"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "time"
  9. )
  10. type Container struct {
  11. Id string
  12. Name string
  13. Labels map[string]string
  14. }
  15. func monitorSignals() <-chan bool {
  16. signals := make(chan os.Signal, 1)
  17. done := make(chan bool, 1)
  18. signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
  19. go func() {
  20. sig := <-signals
  21. fmt.Printf("Received %s signal\n", sig)
  22. done <- true
  23. }()
  24. return done
  25. }
  26. func main() {
  27. done := monitorSignals()
  28. containerChan := make(chan Container, 1)
  29. expiryChan := make(chan string, 1)
  30. cli, err := client.NewEnvClient()
  31. if err != nil {
  32. panic(err)
  33. }
  34. templateGenerator := NewTemplateGenerator()
  35. templateGenerator.AddTemplate(TemplateConfig{
  36. Source: "./templates/domains.txt.tpl",
  37. Destination: "domains.txt",
  38. })
  39. monitor := NewContainerMonitor(cli, containerChan, expiryChan)
  40. go monitor.Monitor()
  41. go func() {
  42. containers := make(map[string]Container)
  43. timer := time.NewTimer(time.Hour)
  44. timer.Stop()
  45. for {
  46. select {
  47. case container := <-containerChan:
  48. containers[container.Name] = container
  49. timer.Reset(100 * time.Millisecond)
  50. case name := <-expiryChan:
  51. delete(containers, name)
  52. timer.Reset(100 * time.Millisecond)
  53. case <-timer.C:
  54. templateGenerator.Generate(Context{Containers: containers})
  55. }
  56. }
  57. }()
  58. <-done
  59. err = cli.Close()
  60. if err != nil {
  61. panic(err)
  62. }
  63. }