in cmd/collector/collector.go [24:92]
func main() {
var err error
defer handleExit()
defer LOG.Close()
defer utils.Goodbye()
// argument options
configuration := flag.String("conf", "", "configure file absolute path")
verbose := flag.Int("verbose", 0, "where log goes to: 0 - file,1 - file+stdout,2 - stdout")
version := flag.Bool("version", false, "show version")
flag.Parse()
if *configuration == "" || *version == true {
fmt.Println(utils.BRANCH)
panic(Exit{0})
}
var file *os.File
if file, err = os.Open(*configuration); err != nil {
crash(fmt.Sprintf("Configure file open failed. %v", err), -1)
}
defer file.Close()
// read fcv and do comparison
if _, err := conf.CheckFcv(*configuration, utils.FcvConfiguration.FeatureCompatibleVersion); err != nil {
crash(err.Error(), -5)
}
configure := nimo.NewConfigLoader(file)
configure.SetDateFormat(utils.GolangSecurityTime)
if err := configure.Load(&conf.Options); err != nil {
crash(fmt.Sprintf("Configure file %s parse failed. %v", *configuration, err), -2)
}
// verify collector options and revise
if err = SanitizeOptions(); err != nil {
crash(fmt.Sprintf("Conf.Options check failed: %s", err.Error()), -4)
}
if err := utils.InitialLogger(conf.Options.LogDirectory, conf.Options.LogFileName,
conf.Options.LogLevel, conf.Options.LogFlush, *verbose); err != nil {
crash(fmt.Sprintf("initial log.dir[%v] log.name[%v] failed[%v].", conf.Options.LogDirectory,
conf.Options.LogFileName, err), -2)
} else {
LOG.Info("log init succ. log.dir[%v] log.name[%v] log.level[%v]",
conf.Options.LogDirectory, conf.Options.LogFileName, conf.Options.LogLevel)
}
LOG.Info("MongoDB Version Source[%v] Target[%v]", conf.Options.SourceDBVersion, conf.Options.TargetDBVersion)
conf.Options.Version = utils.BRANCH
nimo.Profiling(int(conf.Options.SystemProfilePort))
signalProfile, _ := strconv.Atoi(utils.SIGNALPROFILE)
signalStack, _ := strconv.Atoi(utils.SIGNALSTACK)
if signalProfile > 0 {
nimo.RegisterSignalForProfiling(syscall.Signal(signalProfile)) // syscall.SIGUSR2
nimo.RegisterSignalForPrintStack(syscall.Signal(signalStack), func(bytes []byte) { // syscall.SIGUSR1
LOG.Info(string(bytes))
})
}
utils.Welcome()
utils.Mkdirs(conf.Options.LogDirectory)
// get exclusive process lock and write pid
if utils.WritePidById(conf.Options.LogDirectory, conf.Options.Id) {
startup()
}
}