diff --git a/cmd/captured/filterexpr.go b/cmd/captured/filterexpr.go index 5dc1448..f05b4a6 100644 --- a/cmd/captured/filterexpr.go +++ b/cmd/captured/filterexpr.go @@ -21,11 +21,11 @@ import ( "fmt" "go/format" "io" - "io/ioutil" "log" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcap" + "github.com/google/renameio" ) // udp and (port 67 or port 68) # dhcpv4 @@ -57,7 +57,7 @@ func main() { if err != nil { log.Fatal(err) } - if err := ioutil.WriteFile("GENERATED_filterexpr.go", gofmt, 0644); err != nil { + if err := renameio.WriteFile("GENERATED_filterexpr.go", gofmt, 0644); err != nil { log.Fatal(err) } } diff --git a/cmd/dhcp4/dhcp4.go b/cmd/dhcp4/dhcp4.go index de7b277..ea71b1a 100644 --- a/cmd/dhcp4/dhcp4.go +++ b/cmd/dhcp4/dhcp4.go @@ -30,6 +30,7 @@ import ( "github.com/google/gopacket" "github.com/google/gopacket/layers" + "github.com/google/renameio" "github.com/jpillora/backoff" "github.com/rtr7/router7/internal/dhcp4" "github.com/rtr7/router7/internal/notify" @@ -83,7 +84,7 @@ func logic() error { if err != nil { return err } - if err := ioutil.WriteFile(leasePath, b, 0644); err != nil { + if err := renameio.WriteFile(leasePath, b, 0644); err != nil { return fmt.Errorf("persisting lease to %s: %v", leasePath, err) } buf := gopacket.NewSerializeBuffer() @@ -94,7 +95,7 @@ func logic() error { }, c.Ack, ) - if err := ioutil.WriteFile(ackFn, buf.Bytes(), 0644); err != nil { + if err := renameio.WriteFile(ackFn, buf.Bytes(), 0644); err != nil { return fmt.Errorf("persisting DHCPACK to %s: %v", ackFn, err) } if err := notify.Process("/user/netconfigd", syscall.SIGUSR1); err != nil { diff --git a/cmd/dhcp4d/dhcp4d.go b/cmd/dhcp4d/dhcp4d.go index 6c6e553..10fdb14 100644 --- a/cmd/dhcp4d/dhcp4d.go +++ b/cmd/dhcp4d/dhcp4d.go @@ -27,6 +27,7 @@ import ( "time" "github.com/gokrazy/gokrazy" + "github.com/google/renameio" "github.com/krolaw/dhcp4" "github.com/krolaw/dhcp4/conn" "github.com/prometheus/client_golang/prometheus" @@ -125,8 +126,7 @@ func logic() error { errs <- err return } - // TODO: write atomically - if err := ioutil.WriteFile("/perm/dhcp4d/leases.json", b, 0644); err != nil { + if err := renameio.WriteFile("/perm/dhcp4d/leases.json", b, 0644); err != nil { errs <- err } updateNonExpired(leases) diff --git a/cmd/dhcp6/dhcp6.go b/cmd/dhcp6/dhcp6.go index d5f0f14..1fad918 100644 --- a/cmd/dhcp6/dhcp6.go +++ b/cmd/dhcp6/dhcp6.go @@ -26,6 +26,7 @@ import ( "syscall" "time" + "github.com/google/renameio" "github.com/rtr7/router7/internal/dhcp6" "github.com/rtr7/router7/internal/notify" "github.com/rtr7/router7/internal/teelogger" @@ -34,8 +35,8 @@ import ( var log = teelogger.NewConsole() func logic() error { - const configPath = "/perm/dhcp6/wire/lease.json" - if err := os.MkdirAll(filepath.Dir(configPath), 0755); err != nil { + const leasePath = "/perm/dhcp6/wire/lease.json" + if err := os.MkdirAll(filepath.Dir(leasePath), 0755); err != nil { return err } @@ -64,7 +65,7 @@ func logic() error { if err != nil { return err } - if err := ioutil.WriteFile(configPath, b, 0644); err != nil { + if err := renameio.WriteFile(leasePath, b, 0644); err != nil { return err } if err := notify.Process("/user/netconfigd", syscall.SIGUSR1); err != nil { diff --git a/internal/netconfig/netconfig.go b/internal/netconfig/netconfig.go index c23a5db..8cb8f5b 100644 --- a/internal/netconfig/netconfig.go +++ b/internal/netconfig/netconfig.go @@ -30,6 +30,7 @@ import ( "github.com/google/nftables" "github.com/google/nftables/binaryutil" "github.com/google/nftables/expr" + "github.com/google/renameio" "github.com/vishvananda/netlink" "golang.org/x/sys/unix" @@ -287,7 +288,7 @@ func applyInterfaces(dir, root string) error { if err := os.Remove(fn); err != nil && !os.IsNotExist(err) { return err } - if err := ioutil.WriteFile(fn, b, 0644); err != nil { + if err := renameio.WriteFile(fn, b, 0644); err != nil { return err } }