43cb339605
Run scans in background with progress/status updates and store scan metrics in memory or PostgreSQL. Made-with: Cursor
69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
"net/http"
|
|
|
|
"nettopo-go/internal/api"
|
|
"nettopo-go/internal/config"
|
|
"nettopo-go/internal/scans"
|
|
"nettopo-go/internal/store"
|
|
|
|
_ "github.com/jackc/pgx/v5/stdlib"
|
|
)
|
|
|
|
func main() {
|
|
cfg := config.FromEnv()
|
|
scanStore, dbClose := makeStore(cfg)
|
|
if dbClose != nil {
|
|
defer dbClose()
|
|
}
|
|
|
|
runner := scans.NewRunner(scanStore)
|
|
handler := api.NewHandler(scanStore, runner)
|
|
|
|
server := &http.Server{
|
|
Addr: cfg.HTTPAddr,
|
|
Handler: handler.Routes(),
|
|
}
|
|
|
|
log.Printf("nettopo API is starting on %s", cfg.HTTPAddr)
|
|
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
log.Fatalf("server failed: %v", err)
|
|
}
|
|
}
|
|
|
|
func makeStore(cfg config.Config) (scans.Store, func()) {
|
|
if cfg.StoreBackend != "postgres" {
|
|
log.Printf("store backend: memory")
|
|
return scans.NewMemoryStore(), nil
|
|
}
|
|
|
|
if cfg.DBDSN == "" {
|
|
log.Fatalf("STORE_BACKEND=postgres requires DB_DSN")
|
|
}
|
|
|
|
db, err := sql.Open("pgx", cfg.DBDSN)
|
|
if err != nil {
|
|
log.Fatalf("db open failed: %v", err)
|
|
}
|
|
|
|
if err = db.Ping(); err != nil {
|
|
_ = db.Close()
|
|
log.Fatalf("db ping failed: %v", err)
|
|
}
|
|
|
|
if cfg.RunMigrations {
|
|
if err = store.RunMigrations(db); err != nil {
|
|
_ = db.Close()
|
|
log.Fatalf("db migration failed: %v", err)
|
|
}
|
|
}
|
|
|
|
log.Printf("store backend: postgres")
|
|
return scans.NewPostgresStore(db), func() {
|
|
_ = db.Close()
|
|
}
|
|
}
|