github.com/stampzilla/stampzilla-go@v2.0.0-rc9+incompatible/nodes/stampzilla-updater/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "io/ioutil" 6 "log" 7 "os" 8 "os/signal" 9 "path" 10 "strings" 11 "sync" 12 "syscall" 13 "time" 14 15 "github.com/google/go-github/github" 16 "github.com/stampzilla/stampzilla-go/stampzilla/installer" 17 ) 18 19 const ( 20 gitPath = "/home/stampzilla/go/src/github.com/stampzilla/stampzilla-go" 21 ) 22 23 func main() { 24 //installer := installer.NewInstaller() 25 //installer.GoGet("github.com/stampzilla/stampzilla-go/nodes/stampzilla-enocean", true) 26 //return 27 28 wg := &sync.WaitGroup{} 29 quit := make(chan struct{}) 30 go signalHandler(wg, quit) 31 go update(wg) 32 33 ticker := time.NewTicker(30 * time.Minute) 34 go func() { 35 for { 36 select { 37 case <-ticker.C: 38 go update(wg) 39 case <-quit: 40 wg.Wait() 41 ticker.Stop() 42 return 43 } 44 } 45 }() 46 47 select { 48 case <-quit: 49 return 50 } 51 } 52 53 func update(wg *sync.WaitGroup) { 54 wg.Add(1) 55 defer wg.Done() 56 57 if NewCommitExists() { 58 log.Println("New commit exists. Checking if we need to update") 59 installer, err := installer.New(installer.SourceCode) 60 if err != nil { 61 log.Println(err) 62 return 63 } 64 65 nodes, err := ioutil.ReadDir("/home/stampzilla/go/bin") 66 if err != nil { 67 log.Println(err) 68 return 69 } 70 for _, n := range nodes { 71 if !strings.Contains(n.Name(), "stampzilla-") { 72 continue 73 } 74 repoDate, err := getLatestCommitTimeInFolder(path.Join("nodes", n.Name())) 75 if err != nil { 76 log.Println(err) 77 return 78 } 79 80 if repoDate.After(n.ModTime()) { 81 log.Printf("Update date: %s for node: %s\n", repoDate, n.Name()) 82 //installer.GoGet("github.com/stampzilla/stampzilla-go/nodes/"+n.Name(), true) 83 installer.Update(n.Name()) 84 } 85 } 86 } 87 } 88 89 func getLatestCommitTimeInFolder(folder string) (*time.Time, error) { 90 client := github.NewClient(nil) 91 ctx := context.Background() 92 commits, _, err := client.Repositories.ListCommits(ctx, "stampzilla", "stampzilla-go", 93 &github.CommitsListOptions{ 94 Path: folder, 95 SHA: "master", 96 }) 97 98 if err != nil { 99 return nil, err 100 } 101 return commits[0].Commit.Committer.Date, nil 102 } 103 104 func NewCommitExists() bool { 105 remoteSha1, err := getLatestServerCommit() 106 if err != nil { 107 log.Println(err) 108 return false 109 } 110 localSha1, err := getLatestLocalCommit() 111 if err != nil { 112 log.Println(err) 113 return false 114 } 115 if remoteSha1 != localSha1 { 116 return true 117 } 118 return false 119 } 120 121 func getLatestServerCommit() (sha1 string, err error) { 122 result, err := installer.Run("git", "--git-dir", path.Join(gitPath, ".git"), "ls-remote", "origin", "master") 123 sha1 = strings.Fields(result)[0] 124 return 125 } 126 127 func getLatestLocalCommit() (sha1 string, err error) { 128 result, err := installer.Run("git", "--git-dir", path.Join(gitPath, ".git"), "rev-parse", "HEAD") 129 sha1 = strings.Fields(result)[0] 130 return 131 } 132 func signalHandler(wg *sync.WaitGroup, quit chan struct{}) { 133 ch := make(chan os.Signal, 10) 134 signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT) 135 for { 136 <-ch 137 log.Println("Shutdown requested. Finishing what we where doing...") 138 wg.Wait() 139 log.Println("Shutting down") 140 close(quit) 141 return 142 } 143 }