82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package apkupdater
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os/exec"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
|
|
|
|
type PackageUpdater interface {
|
|
Update()
|
|
Run()
|
|
Stop()
|
|
ValidPackages() bool
|
|
}
|
|
|
|
type AlpineLinuxPackageUpdate struct {
|
|
Interval time.Duration
|
|
Packages []string
|
|
doneChan chan string
|
|
apkLock *sync.Mutex
|
|
}
|
|
|
|
func (u *AlpineLinuxPackageUpdate) Update() {
|
|
|
|
u.apkLock.Lock()
|
|
log.Println("Updating packages...")
|
|
cmd := exec.Command("apk", u.Packages...)
|
|
stdout, err := cmd.Output()
|
|
u.apkLock.Unlock()
|
|
if err != nil {
|
|
log.Println(err.Error())
|
|
}
|
|
if cmd.ProcessState.ExitCode() != 1 {
|
|
log.Printf("Update command returned exit status %d\n", cmd.ProcessState.ExitCode())
|
|
log.Println(string(stdout))
|
|
}
|
|
log.Println("Done updating packges")
|
|
}
|
|
|
|
func (u *AlpineLinuxPackageUpdate) Run() {
|
|
|
|
go func() {
|
|
mainloop:
|
|
for {
|
|
select {
|
|
case <- u.doneChan:
|
|
fmt.Println("Stopping updater...")
|
|
break mainloop
|
|
case <- time.After(u.Interval):
|
|
u.Update()
|
|
}
|
|
}
|
|
fmt.Println("Updater stopped")
|
|
}()
|
|
log.Println("Started Alpine linux package updater")
|
|
}
|
|
|
|
func (u *AlpineLinuxPackageUpdate) ValidPackages() bool {
|
|
return true
|
|
}
|
|
|
|
func (u *AlpineLinuxPackageUpdate) Stop() {
|
|
u.doneChan <- ""
|
|
}
|
|
|
|
func NewAlpineLinuxPackageUpdater (
|
|
interval time.Duration,
|
|
packages []string,
|
|
) AlpineLinuxPackageUpdate {
|
|
return AlpineLinuxPackageUpdate{
|
|
Interval: interval,
|
|
Packages: packages,
|
|
doneChan: make(chan string),
|
|
apkLock: &sync.Mutex{},
|
|
}
|
|
}
|
|
|