dhcp: add --pidfile option to DHCP client daemon
authorDan Williams <dcbw@redhat.com>
Sat, 27 May 2017 04:48:29 +0000 (23:48 -0500)
committerDan Williams <dcbw@redhat.com>
Thu, 15 Jun 2017 02:41:43 +0000 (21:41 -0500)
plugins/ipam/dhcp/README.md
plugins/ipam/dhcp/daemon.go
plugins/ipam/dhcp/main.go

index 885eb09..55e5396 100644 (file)
@@ -16,6 +16,9 @@ $ rm -f /run/cni/dhcp.sock
 $ ./dhcp daemon
 ```
 
+If given `-pidfile <path>` arguments after 'daemon', the dhcp plugin will write
+its PID to the given file.
+
 Alternatively, you can use systemd socket activation protocol.
 Be sure that the .socket file uses /run/cni/dhcp.sock as the socket path.
 
index c6660b7..0b1dadf 100644 (file)
@@ -18,7 +18,7 @@ import (
        "encoding/json"
        "errors"
        "fmt"
-       "log"
+       "io/ioutil"
        "net"
        "net/http"
        "net/rpc"
@@ -141,19 +141,29 @@ func getListener() (net.Listener, error) {
        }
 }
 
-func runDaemon() {
+func runDaemon(pidfilePath string) error {
        // since other goroutines (on separate threads) will change namespaces,
        // ensure the RPC server does not get scheduled onto those
        runtime.LockOSThread()
 
+       // Write the pidfile
+       if pidfilePath != "" {
+               if !filepath.IsAbs(pidfilePath) {
+                       return fmt.Errorf("Error writing pidfile %q: path not absolute", pidfilePath)
+               }
+               if err := ioutil.WriteFile(pidfilePath, []byte(fmt.Sprintf("%d", os.Getpid())), 0644); err != nil {
+                       return fmt.Errorf("Error writing pidfile %q: %v", pidfilePath, err)
+               }
+       }
+
        l, err := getListener()
        if err != nil {
-               log.Printf("Error getting listener: %v", err)
-               return
+               return fmt.Errorf("Error getting listener: %v", err)
        }
 
        dhcp := newDHCP()
        rpc.Register(dhcp)
        rpc.HandleHTTP()
        http.Serve(l, nil)
+       return nil
 }
index 9289957..2e55c27 100644 (file)
@@ -15,7 +15,9 @@
 package main
 
 import (
+       "flag"
        "fmt"
+       "log"
        "net/rpc"
        "os"
        "path/filepath"
@@ -30,7 +32,15 @@ const socketPath = "/run/cni/dhcp.sock"
 
 func main() {
        if len(os.Args) > 1 && os.Args[1] == "daemon" {
-               runDaemon()
+               var pidfilePath string
+               daemonFlags := flag.NewFlagSet("daemon", flag.ExitOnError)
+               daemonFlags.StringVar(&pidfilePath, "pidfile", "", "optional path to write daemon PID to")
+               daemonFlags.Parse(os.Args[2:])
+
+               if err := runDaemon(pidfilePath); err != nil {
+                       log.Printf(err.Error())
+                       os.Exit(1)
+               }
        } else {
                skel.PluginMain(cmdAdd, cmdDel, version.All)
        }