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  }