store: make state (de)serialization internal

This hides the state hanlding in the store package. As before, it
can be disabled by passing `nil` instead of the path to the state
file.

Signed-off-by: Tom Gundersen <teg@jklm.no>
This commit is contained in:
Tom Gundersen 2019-10-05 21:29:55 +02:00 committed by Lars Karlitski
parent ad637b46f8
commit 68ade23fcc
4 changed files with 65 additions and 65 deletions

View file

@ -2,10 +2,8 @@ package main
import (
"flag"
"io/ioutil"
"log"
"os"
"path/filepath"
"osbuild-composer/internal/jobqueue"
"osbuild-composer/internal/rpmmd"
@ -15,13 +13,13 @@ import (
"github.com/coreos/go-systemd/activation"
)
const StateFile = "/var/lib/osbuild-composer/state.json"
func main() {
var verbose bool
flag.BoolVar(&verbose, "v", false, "Print access log")
flag.Parse()
stateFile := "/var/lib/osbuild-composer/state.json"
listeners, err := activation.Listeners()
if err != nil {
panic(err)
@ -55,60 +53,11 @@ func main() {
panic(err)
}
state, err := ioutil.ReadFile(StateFile)
if err != nil && !os.IsNotExist(err) {
log.Fatalf("cannot read state: %v", err)
}
stateChannel := make(chan []byte, 10)
store := store.New(state, stateChannel)
store := store.New(&stateFile)
jobAPI := jobqueue.New(logger, store)
weldrAPI := weldr.New(repo, packages, logger, store)
go func() {
for {
err := writeFileAtomically(StateFile, <-stateChannel, 0755)
if err != nil {
log.Fatalf("cannot write state: %v", err)
}
}
}()
go jobAPI.Serve(jobListener)
weldrAPI.Serve(weldrListener)
}
func writeFileAtomically(filename string, data []byte, mode os.FileMode) error {
dir, name := filepath.Dir(filename), filepath.Base(filename)
tmpfile, err := ioutil.TempFile(dir, name+"-*.tmp")
if err != nil {
return err
}
_, err = tmpfile.Write(data)
if err != nil {
os.Remove(tmpfile.Name())
return err
}
err = tmpfile.Chmod(mode)
if err != nil {
return err
}
err = tmpfile.Close()
if err != nil {
os.Remove(tmpfile.Name())
return err
}
err = os.Rename(tmpfile.Name(), filename)
if err != nil {
os.Remove(tmpfile.Name())
return err
}
return nil
}