AdGuardHome/internal/next/cmd/cmd.go
Dimitry Kolyshev b05d0fdb93 Pull request: AGDNS-2965-next-use-signal-handler
Merge in DNS/adguard-home from AGDNS-2965-next-use-signal-handler to master

Squashed commit of the following:

commit dcf089a18c
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Jun 20 11:20:45 2025 +0300

    next/cmd: fix

commit aff109ce97
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Jun 19 11:35:33 2025 +0300

    all: upd golibs

commit 17ed979270
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Thu Jun 19 08:13:02 2025 +0300

    next/cmd: imp code

commit 6da81fea8c
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Wed Jun 18 11:49:55 2025 +0300

    next/cmd: move pid file logic to serviceMgr

commit 470a29d837
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Wed Jun 18 11:36:47 2025 +0300

    next/cmd: imp code, renaming

commit 6c71890e73
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Tue Jun 17 15:28:19 2025 +0300

    next/cmd: service manager
2025-06-23 10:52:39 +03:00

89 lines
2.1 KiB
Go

// Package cmd is the AdGuard Home entry point. It assembles the configuration
// file manager, sets up signal processing logic, and so on.
//
// TODO(a.garipov): Move to the upper-level internal/.
package cmd
import (
"context"
"io/fs"
"os"
"time"
"github.com/AdguardTeam/AdGuardHome/internal/next/configmgr"
"github.com/AdguardTeam/AdGuardHome/internal/version"
"github.com/AdguardTeam/golibs/errors"
"github.com/AdguardTeam/golibs/logutil/slogutil"
"github.com/AdguardTeam/golibs/service"
)
// Main is the entry point of AdGuard Home.
func Main(embeddedFrontend fs.FS) {
ctx := context.Background()
start := time.Now()
cmdName := os.Args[0]
opts, err := parseOptions(cmdName, os.Args[1:])
exitCode, needExit := processOptions(opts, cmdName, err)
if needExit {
os.Exit(exitCode)
}
baseLogger := newBaseLogger(opts)
baseLogger.InfoContext(
ctx,
"starting adguard home",
"version", version.Version(),
"pid", os.Getpid(),
)
if opts.workDir != "" {
baseLogger.InfoContext(ctx, "changing working directory", "dir", opts.workDir)
err = os.Chdir(opts.workDir)
errors.Check(err)
}
frontend, err := frontendFromOpts(ctx, baseLogger, opts, embeddedFrontend)
errors.Check(err)
startCtx, startCancel := context.WithTimeout(ctx, defaultTimeoutStart)
defer startCancel()
confMgrConf := &configmgr.Config{
BaseLogger: baseLogger,
Logger: baseLogger.With(slogutil.KeyPrefix, "configmgr"),
Frontend: frontend,
WebAddr: opts.webAddr,
Start: start,
FileName: opts.confFile,
}
svc, err := newServiceMgr(ctx, &serviceMgrConfig{
confMgrConf: confMgrConf,
logger: baseLogger.With(slogutil.KeyPrefix, "svc"),
pidFilePath: opts.pidFile,
})
errors.Check(err)
errors.Check(svc.Start(startCtx))
sigHdlr := service.NewSignalHandler(&service.SignalHandlerConfig{
Logger: baseLogger.With(slogutil.KeyPrefix, service.SignalHandlerPrefix),
})
sigHdlr.AddService(svc)
sigHdlr.AddRefresher(svc)
os.Exit(sigHdlr.Handle(ctx))
}
// Default timeouts.
//
// TODO(a.garipov): Make configurable.
const (
defaultTimeoutStart = 1 * time.Minute
)