github.com/swiftstack/proxyfs@v0.0.0-20201223034610-5434d919416e/evtlog/pfsevtlogd/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "os/signal" 8 "syscall" 9 "time" 10 11 "golang.org/x/sys/unix" 12 13 "github.com/swiftstack/ProxyFS/conf" 14 "github.com/swiftstack/ProxyFS/evtlog" 15 "github.com/swiftstack/ProxyFS/transitions" 16 ) 17 18 func usage() { 19 fmt.Println("pfsevtlogd -?") 20 fmt.Println(" Prints this help text") 21 fmt.Println("pfsevtlogd [-D] ConfFile [ConfFileOverrides]*") 22 fmt.Println(" -D requests that just the Shared Memory Object be deleted") 23 fmt.Println(" ConfFile specifies the .conf file as also passed to proxyfsd et. al.") 24 fmt.Println(" ConfFileOverrides is an optional list of modifications to ConfFile to apply") 25 } 26 27 func main() { 28 var ( 29 args []string 30 confMap conf.ConfMap 31 err error 32 formattedRecord string 33 justDeleteSharedMemoryObject bool 34 numDroppedRecords uint64 35 outputFile *os.File 36 outputPath string 37 pollDelay time.Duration 38 signalChan chan os.Signal 39 ) 40 41 if (2 == len(os.Args)) && ("-?" == os.Args[1]) { 42 usage() 43 os.Exit(0) 44 } 45 46 if (1 < len(os.Args)) && ("-D" == os.Args[1]) { 47 justDeleteSharedMemoryObject = true 48 args = os.Args[2:] 49 } else { 50 justDeleteSharedMemoryObject = false 51 args = os.Args[1:] 52 } 53 54 if len(args) < 1 { 55 log.Fatalf("no .conf file specified") 56 } 57 58 confMap, err = conf.MakeConfMapFromFile(args[0]) 59 if nil != err { 60 log.Fatalf("failed to load config: %v", err) 61 } 62 63 err = confMap.UpdateFromStrings(args[1:]) 64 if nil != err { 65 log.Fatalf("failed to apply config overrides: %v", err) 66 } 67 68 // Upgrade confMap if necessary 69 err = transitions.UpgradeConfMapIfNeeded(confMap) 70 if nil != err { 71 log.Fatalf("Failed to upgrade config: %v", err) 72 } 73 74 err = transitions.Up(confMap) 75 if nil != err { 76 log.Fatalf("transitions.Up() failed: %v", err) 77 } 78 79 if justDeleteSharedMemoryObject { 80 evtlog.MarkForDeletion() 81 err = transitions.Down(confMap) 82 if nil != err { 83 log.Fatalf("transitions.Down() failed: %v", err) 84 } 85 os.Exit(0) 86 } 87 88 pollDelay, err = confMap.FetchOptionValueDuration("EventLog", "DaemonPollDelay") 89 if nil != err { 90 log.Fatalf("confMap.FetchOptionValueDuration(\"EventLog\", \"DaemonPollDelay\") failed: %v", err) 91 } 92 93 outputPath, err = confMap.FetchOptionValueString("EventLog", "DaemonOutputPath") 94 if nil == err { 95 outputFile, err = os.OpenFile(outputPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, syscall.S_IRUSR|syscall.S_IWUSR) 96 } else { 97 outputFile = os.Stdout 98 } 99 100 signalChan = make(chan os.Signal, 1) 101 102 signal.Notify(signalChan, unix.SIGINT, unix.SIGTERM) 103 104 for { 105 formattedRecord, numDroppedRecords = evtlog.Retrieve() 106 107 if 0 != numDroppedRecords { 108 fmt.Fprintf(outputFile, "*** numDroppedRecords == 0x%016X\n", numDroppedRecords) 109 } 110 111 if "" == formattedRecord { 112 select { 113 case _ = <-signalChan: 114 err = outputFile.Close() 115 if nil != err { 116 log.Fatalf("outputFile.Close() failed: %v", err) 117 } 118 119 err = transitions.Down(confMap) 120 if nil != err { 121 log.Fatalf("transitions.Down() failed: %v", err) 122 } 123 124 os.Exit(0) 125 case _ = <-time.After(pollDelay): 126 // Just loop back to attempt evtlog.Retrieve() 127 } 128 } else { 129 fmt.Fprintf(outputFile, "%s\n", formattedRecord) 130 } 131 } 132 }