Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "log"
  7. "os"
  8.  
  9. dockerapi "github.com/fsouza/go-dockerclient"
  10. )
  11.  
  12. const dockerSock = "unix:///var/run/docker.sock"
  13. const hostsFile = "/etc/hosts"
  14. const customHostsFile = "./myhosts"
  15.  
  16. type host struct {
  17. Name string
  18. IP string
  19. }
  20.  
  21. var hosts map[string]host
  22. var customHosts string
  23. var docker *dockerapi.Client
  24.  
  25. func main() {
  26.  
  27. hosts = make(map[string]host)
  28.  
  29. var err error
  30. docker, err = dockerapi.NewClient(dockerSock)
  31. if err != nil {
  32. log.Fatal("Error openning:", dockerSock, err)
  33. }
  34.  
  35. events := make(chan *dockerapi.APIEvents)
  36. err = docker.AddEventListener(events)
  37. if err != nil {
  38. log.Fatal("Error subscribing to events:", err)
  39. }
  40.  
  41. customHosts, err = readFile(customHostsFile)
  42. if err != nil {
  43. // inform but don't exit
  44. fmt.Println("Error reading file", customHostsFile, err)
  45. }
  46.  
  47. containers, err := docker.ListContainers(dockerapi.ListContainersOptions{})
  48.  
  49. for _, container := range containers {
  50. fmt.Println("FOUND CONTAINER", container.ID)
  51. addContainer(container.ID)
  52. }
  53.  
  54. for evt := range events {
  55. switch evt.Status {
  56. case "start":
  57. fmt.Println("FOUND CONTAINER [ADD]", evt.ID)
  58. addContainer(evt.ID)
  59. break
  60.  
  61. case "die":
  62. fmt.Println("FOUND CONTAINER [DIE]", evt.ID)
  63. removeContainer(evt.ID)
  64. break
  65. default:
  66. //fmt.Println("EVENT NOT CAUGHT", evt)
  67. }
  68. }
  69.  
  70. log.Fatal("Oops! we exited")
  71. }
  72.  
  73. func addContainer(ID string) {
  74. container, err := docker.InspectContainer(ID)
  75. if err != nil {
  76. fmt.Println("Inspect failed on", ID, err)
  77. return
  78. }
  79.  
  80. hosts[ID] = host{
  81. Name: string(container.Name[1:]),
  82. IP: container.NetworkSettings.IPAddress,
  83. }
  84.  
  85. fmt.Println("Added container:", hosts[ID])
  86.  
  87. // write file
  88. writeHostFile()
  89. }
  90.  
  91. func removeContainer(ID string) {
  92. delete(hosts, ID)
  93.  
  94. // write file
  95. writeHostFile()
  96. }
  97.  
  98. func readFile(filename string) (string, error) {
  99. file, err := os.Open(filename)
  100. if err != nil {
  101. return "", err
  102. }
  103. defer file.Close()
  104.  
  105. stats, statsErr := file.Stat()
  106. if statsErr != nil {
  107. return "", statsErr
  108. }
  109. var size = stats.Size()
  110. fw := make([]byte, size)
  111.  
  112. bufr := bufio.NewReader(file)
  113. _, err = bufr.Read(fw)
  114. return string(fw), err
  115. }
  116.  
  117. func writeHostFile() {
  118.  
  119. content := customHosts + "\n\n\n\n"
  120. for _, h := range hosts {
  121. content += h.IP + " " + h.Name + "\n"
  122. }
  123.  
  124. /*err := ioutil.WriteFile(hostsFile, []byte(content), 0644)
  125. if err != nil {
  126. log.Fatal("Error writing host file", hostsFile, content, err)
  127. }*/
  128.  
  129. fmt.Println(content)
  130.  
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement