update to new rootdev API
related to https://github.com/gokrazy/gokrazy/issues/52
This commit is contained in:
parent
6beb2e16aa
commit
ffc8928d2e
15
go.mod
Normal file
15
go.mod
Normal file
@ -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
|
||||
)
|
34
go.sum
Normal file
34
go.sum
Normal file
@ -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=
|
2
mount.go
2
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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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),
|
||||
|
50
update.go
50
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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user