From ffc8928d2e0a357d42c45f5bef1d01cfddbe9490 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 7 Apr 2020 09:00:10 +0200 Subject: [PATCH] update to new rootdev API related to https://github.com/gokrazy/gokrazy/issues/52 --- go.mod | 15 +++++++++++++++ go.sum | 34 +++++++++++++++++++++++++++++++++ mount.go | 2 +- reboot_amd64.go | 2 +- status.go | 2 +- update.go | 50 ++++++++++++------------------------------------- 6 files changed, 64 insertions(+), 41 deletions(-) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5726841 --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module github.com/gokrazy/gokrazy + +go 1.14 + +require ( + github.com/beevik/ntp v0.2.0 + github.com/gokrazy/internal v0.0.0-20200407065509-37efc446ad44 + github.com/google/go-cmp v0.4.0 // indirect + github.com/google/gopacket v1.1.16 + github.com/mdlayher/raw v0.0.0-20190303161257-764d452d77af + github.com/rtr7/dhcp4 v0.0.0-20181120124042-778e8c2e24a5 + github.com/stretchr/testify v1.5.1 // indirect + golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 + golang.org/x/sys v0.0.0-20200406155108-e3b113bbe6a4 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..75d1673 --- /dev/null +++ b/go.sum @@ -0,0 +1,34 @@ +github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw= +github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gopacket v1.1.16 h1:u6Afvia5C5srlLcbTwpHaFW918asLYPxieziOaWwz8M= +github.com/google/gopacket v1.1.16/go.mod h1:UCLx9mCmAwsVbn6qQl1WIEt2SO7Nd2fD0th1TBAsqBw= +github.com/mdlayher/raw v0.0.0-20190303161257-764d452d77af h1:20h/EjkLGn9mV5nX9MFnGhbbeEhIGnOKPShJfBtVkVQ= +github.com/mdlayher/raw v0.0.0-20190303161257-764d452d77af/go.mod h1:rC/yE65s/DoHB6BzVOUBNYBGTg772JVytyAytffIZkY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rtr7/dhcp4 v0.0.0-20181120124042-778e8c2e24a5 h1:/kzTBQ20DbbhSNaBXiFEk2gPrGhY26kajwC1ro/Vlh8= +github.com/rtr7/dhcp4 v0.0.0-20181120124042-778e8c2e24a5/go.mod h1:FwstIpm6vX98QgtR8KEwZcVjiRn2WP76LjXAHj84fK0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200406155108-e3b113bbe6a4 h1:c1Sgqkh8v6ZxafNGG64r8C8UisIW2TKMJN8P86tKjr0= +golang.org/x/sys v0.0.0-20200406155108-e3b113bbe6a4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/mount.go b/mount.go index 1140eae..62c66b1 100644 --- a/mount.go +++ b/mount.go @@ -94,7 +94,7 @@ func mountfs() error { } } - dev := rootdev.MustFind() + "4" + dev := rootdev.Partition(rootdev.Perm) if err := syscall.Mount(dev, "/perm", "ext4", 0, ""); err != nil { log.Printf("Could not mount permanent storage partition %s: %v", dev, err) } diff --git a/reboot_amd64.go b/reboot_amd64.go index 31f86c6..e6e6c07 100644 --- a/reboot_amd64.go +++ b/reboot_amd64.go @@ -17,7 +17,7 @@ func kexecReboot() error { return err } - if err := syscall.Mount(rootdev.MustFind()+"1", tmpdir, "vfat", 0, ""); err != nil { + if err := syscall.Mount(rootdev.Partition(rootdev.Boot), tmpdir, "vfat", 0, ""); err != nil { return err } diff --git a/status.go b/status.go index 68b497d..2751029 100644 --- a/status.go +++ b/status.go @@ -174,7 +174,7 @@ func initStatus(services []*service) { Hostname string }{ Services: services, - PermDev: rootdev.MustFind() + "4", + PermDev: rootdev.Partition(rootdev.Perm), PermUsed: int64(st.Bsize) * int64(st.Blocks-st.Bfree), PermAvail: int64(st.Bsize) * int64(st.Bavail), PermTotal: int64(st.Bsize) * int64(st.Blocks), diff --git a/update.go b/update.go index e42ca73..0afc8d6 100644 --- a/update.go +++ b/update.go @@ -4,12 +4,10 @@ import ( "crypto/sha256" "fmt" "io" - "io/ioutil" "log" "net/http" "os" "regexp" - "strings" "sync" "syscall" "time" @@ -20,14 +18,10 @@ import ( "github.com/gokrazy/internal/rootdev" ) -var ( - rootRe = regexp.MustCompile(`(?:root|ubd0)=/dev/(?:mmcblk0p|sda|loop0p)([2-3])`) +var rootRe = regexp.MustCompile(`root=[^ ]+`) - inactiveRootPartition string -) - -func switchRootPartition(newRootPartition string) error { - f, err := os.OpenFile(rootdev.MustFind()+"1", os.O_RDWR, 0600) +func switchRootPartition(newRootPartition int) error { + f, err := os.OpenFile(rootdev.Partition(rootdev.Boot), os.O_RDWR, 0600) if err != nil { return err } @@ -51,7 +45,7 @@ func switchRootPartition(newRootPartition string) error { return err } - rep := rootRe.ReplaceAllLiteral(b, []byte("root="+rootdev.MustFind()+newRootPartition)) + rep := rootRe.ReplaceAllLiteral(b, []byte("root="+rootdev.PartitionCmdline(newRootPartition))) if _, err := f.Write(rep); err != nil { return err } @@ -95,7 +89,7 @@ func nonConcurrentUpdateHandler(dest string) func(http.ResponseWriter, *http.Req } } -func nonConcurrentSwitchHandler(newRootPartition string) func(http.ResponseWriter, *http.Request) { +func nonConcurrentSwitchHandler(newRootPartition int) func(http.ResponseWriter, *http.Request) { var mu sync.Mutex return func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { @@ -115,37 +109,17 @@ func nonConcurrentSwitchHandler(newRootPartition string) func(http.ResponseWrite } func initUpdate() error { - cmdline, err := ioutil.ReadFile("/proc/cmdline") - if err != nil { - return err - } - - matches := rootRe.FindStringSubmatch(string(cmdline)) - if matches == nil { - return fmt.Errorf("identify 2/3 partition: kernel command line %q did not match %v", string(cmdline), rootRe) - } - - rootPartition := matches[1] - switch rootPartition { - case "2": - inactiveRootPartition = "3" - case "3": - inactiveRootPartition = "2" - default: - return fmt.Errorf("root partition %q (from %q) is unexpectedly neither 2 nor 3", rootPartition, matches[0]) - } - - http.HandleFunc("/update/boot", nonConcurrentUpdateHandler(rootdev.MustFind()+"1")) - http.HandleFunc("/update/mbr", nonConcurrentUpdateHandler(strings.TrimSuffix(rootdev.MustFind(), "p"))) - http.HandleFunc("/update/root", nonConcurrentUpdateHandler(rootdev.MustFind()+inactiveRootPartition)) - http.HandleFunc("/update/switch", nonConcurrentSwitchHandler(inactiveRootPartition)) + http.HandleFunc("/update/mbr", nonConcurrentUpdateHandler(rootdev.BlockDevice())) + http.HandleFunc("/update/root", nonConcurrentUpdateHandler(rootdev.Partition(rootdev.InactiveRootPartition()))) + http.HandleFunc("/update/switch", nonConcurrentSwitchHandler(rootdev.InactiveRootPartition())) // bakery updates only the boot partition, which would reset the active root // partition to 2. - updateHandler := nonConcurrentUpdateHandler(rootdev.MustFind() + "1") + updateHandler := nonConcurrentUpdateHandler(rootdev.Partition(rootdev.Boot)) + http.HandleFunc("/update/boot", updateHandler) http.HandleFunc("/update/bootonly", func(w http.ResponseWriter, r *http.Request) { updateHandler(w, r) - if err := switchRootPartition(rootPartition); err != nil { - log.Printf("switching root partition to %q failed: %v", rootPartition, err) + if err := switchRootPartition(rootdev.ActiveRootPartition()); err != nil { + log.Printf("switching root partition to %d failed: %v", rootdev.ActiveRootPartition(), err) http.Error(w, err.Error(), http.StatusInternalServerError) return }