Use new arg "-notifypid" for more robust daemonization
No more string matching on the parent command line!
This commit is contained in:
parent
273d8086ae
commit
51fcf61630
1
TODO.md
1
TODO.md
@ -1,4 +1,3 @@
|
||||
* More robust daemonization, add cli parameter "--sendusr1=pid"
|
||||
* Add test filesystem for "--masterkey" containing an "It works!" file
|
||||
* Add fcntl file locking to make multiple concurrent mounts safe
|
||||
* add test case
|
||||
|
@ -21,7 +21,8 @@ func waitForUsr1() {
|
||||
func daemonize() {
|
||||
go waitForUsr1()
|
||||
name := os.Args[0]
|
||||
newArgs := []string{"-f"}
|
||||
notifyArg := fmt.Sprintf("-notifypid=%d", os.Getpid())
|
||||
newArgs := []string{"-f", notifyArg}
|
||||
newArgs = append(newArgs, os.Args[1:]...)
|
||||
c := exec.Command(name, newArgs...)
|
||||
c.Stdout = os.Stdout
|
||||
|
10
main.go
10
main.go
@ -68,7 +68,7 @@ type argContainer struct {
|
||||
plaintextnames, quiet bool
|
||||
masterkey, mountpoint, cipherdir string
|
||||
cpuprofile *string
|
||||
sendusr1 int
|
||||
notifypid int
|
||||
}
|
||||
|
||||
var flagSet *flag.FlagSet
|
||||
@ -93,7 +93,7 @@ func main() {
|
||||
flagSet.BoolVar(&args.quiet, "q", false, "Quiet - silence informational messages")
|
||||
flagSet.StringVar(&args.masterkey, "masterkey", "", "Mount with explicit master key")
|
||||
args.cpuprofile = flagSet.String("cpuprofile", "", "Write cpu profile to specified file")
|
||||
flagSet.IntVar(&args.sendusr1, "sendusr1", 0,
|
||||
flagSet.IntVar(&args.notifypid, "notifypid", 0,
|
||||
"Send USR1 to the specified process after successful mount - used internally for daemonization")
|
||||
flagSet.Parse(os.Args[1:])
|
||||
if args.version {
|
||||
@ -221,8 +221,10 @@ func main() {
|
||||
}
|
||||
|
||||
cryptfs.Info.Println("Filesystem ready.")
|
||||
// Send notification to our parent
|
||||
sendUsr1()
|
||||
// Send USR1 notification
|
||||
if args.notifypid > 0 {
|
||||
sendUsr1(args.notifypid)
|
||||
}
|
||||
// Wait for SIGING in the background and unmount ourselves if we get it
|
||||
// This prevents a dangling "Transport endpoint is not connected" mountpoint
|
||||
handleSigint(srv, args.mountpoint)
|
||||
|
33
sendusr1.go
33
sendusr1.go
@ -1,38 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
const (
|
||||
wrapperContains = "gocryptfs\000"
|
||||
)
|
||||
|
||||
// Send USR1 to the parent process. This notifies it that the
|
||||
// mounting has completed sucessfully.
|
||||
//
|
||||
// Checks /proc/$PPID/cmdline to make sure we do not kill an unrelated process.
|
||||
func sendUsr1() {
|
||||
ppid := os.Getppid()
|
||||
fn := fmt.Sprintf("/proc/%d/cmdline", ppid)
|
||||
cmdline, err := ioutil.ReadFile(fn)
|
||||
// Send signal USR1 to "pid" (usually our parent process). This notifies it
|
||||
// that the mounting has completed sucessfully.
|
||||
func sendUsr1(pid int) {
|
||||
p, err := os.FindProcess(pid)
|
||||
if err != nil {
|
||||
fmt.Printf("sendUsr1: ReadFile: %v\n", err)
|
||||
fmt.Printf("sendUsr1: FindProcess: %v\n", err)
|
||||
return
|
||||
}
|
||||
if bytes.Contains(cmdline, []byte(wrapperContains)) {
|
||||
p, err := os.FindProcess(ppid)
|
||||
if err != nil {
|
||||
fmt.Printf("sendUsr1: FindProcess: %v\n", err)
|
||||
return
|
||||
}
|
||||
err = p.Signal(syscall.SIGUSR1)
|
||||
if err != nil {
|
||||
fmt.Printf("sendUsr1: Signal: %v\n", err)
|
||||
}
|
||||
err = p.Signal(syscall.SIGUSR1)
|
||||
if err != nil {
|
||||
fmt.Printf("sendUsr1: Signal: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user