protomolecule/main.go
2021-05-31 00:31:52 -07:00

116 lines
2.4 KiB
Go

package main
import (
"flag"
"os"
"os/signal"
"protomolecule/src/dust"
"protomolecule/src/eros"
"protomolecule/src/protogen"
projVars "protomolecule/src/vars"
"syscall"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
// ScanMgr will keep track of concurrently running scans
var ScanMgr *protogen.Meta
func listen() {
flag.Parse()
if *projVars.AFlag {
projVars.AttackMode = true
}
if *projVars.DFlag {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
if *projVars.TFlag {
projVars.TrackingMode = true
}
if *projVars.MFlag != "0" {
projVars.ManuFile = *projVars.MFlag
}
}
func obey() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
log.Warn().Msg("Interrupt detected, shutting down gracefully...")
eros.Slumber()
os.Exit(0)
}()
}
func init() {
// Initializing an instance of our scan manager to keep track of concurrent scans
// NOTE: Devices are kept track of per Scan via a nested map of eros.Device instances
//
// TODO: Get all of this management stuff into its own package (structs and maps and initialization of the former)
// TODO: Name these structs and maps and instances more uniformly and idiomatically
dust.PrintBanner()
ScanMgr = &protogen.Meta{
Count: 0,
Scans: make(map[int]*protogen.Scan),
}
// setup json logfile
// TODO: make this a command line argument
var logDir string = "./.logs/"
err := os.MkdirAll(logDir, 0755)
if err != nil {
panic(err.Error())
}
Now := time.Now()
date := Now.Format(time.RFC3339)
logFileName := date + ".log"
lf, err := os.OpenFile(logDir+logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(err.Error())
}
// define pretty printer
consoleWriter := zerolog.ConsoleWriter{Out: os.Stderr}
// initialize simultaneous pretty printing and json logging
multi := zerolog.MultiLevelWriter(consoleWriter, lf)
log.Logger = zerolog.New(multi).With().Timestamp().Logger()
// suppress debug messages unless -d is called
zerolog.SetGlobalLevel(zerolog.InfoLevel)
listen()
obey()
log.Debug().Msg("Logging initialized")
// see ./src/eros
log.Debug().Msg("Initializing database engine")
eros.Awaken()
if *projVars.MFlag != "0" {
eros.ManufLoad()
}
}
func main() {
defer eros.Slumber()
var scan *protogen.Scan
scan = ScanMgr.NewScan()
//time.Sleep(30 * time.Millisecond)
dust.Must("Scan", scan.Start())
}