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  }