incus-mirror/cmd/incusd/main.go
Marc Schiffbauer f4a47f992e
incusd: Rename forkstart to forklxc and forklimits to forkqemu
Signed-off-by: Marc Schiffbauer <mschiff@gentoo.org>
2026-06-25 18:17:22 -04:00

210 lines
6.0 KiB
Go

package main
import (
"os"
cowsql "github.com/cowsql/go-cowsql"
"github.com/spf13/cobra"
"github.com/lxc/incus/v7/internal/rsync"
"github.com/lxc/incus/v7/internal/server/daemon"
"github.com/lxc/incus/v7/internal/server/events"
"github.com/lxc/incus/v7/internal/server/operations"
"github.com/lxc/incus/v7/internal/server/response"
"github.com/lxc/incus/v7/internal/version"
"github.com/lxc/incus/v7/shared/logger"
)
type cmdGlobal struct {
cmd *cobra.Command
flagHelp bool
flagVersion bool
flagLogFile string
flagLogDebug bool
flagLogSyslog bool
flagLogTrace []string
flagLogVerbose bool
}
func (c *cmdGlobal) run(_ *cobra.Command, _ []string) error {
// Configure cowsql to *not* disable internal SQLite locking, since we
// use SQLite both through cowsql and through go-cowsql, potentially
// from different threads at the same time. We need to call this
// function as early as possible since this is a global setting in
// SQLite, which can't be changed afterwise.
err := cowsql.ConfigMultiThread()
if err != nil {
return err
}
// Set logging global variables
daemon.Debug = c.flagLogDebug
rsync.Debug = c.flagLogDebug
daemon.Verbose = c.flagLogVerbose
// Set debug for the operations package
operations.Init(daemon.Debug)
// Set debug for the response package
response.Init(daemon.Debug)
// Setup logger
syslog := ""
if c.flagLogSyslog {
syslog = "incus"
}
err = logger.InitLogger(c.flagLogFile, syslog, c.flagLogVerbose, c.flagLogDebug, events.NewEventHandler())
if err != nil {
return err
}
return nil
}
// rawArgs returns the raw unprocessed arguments from os.Args after the command name arg is found.
func (c *cmdGlobal) rawArgs(cmd *cobra.Command) []string {
for i, arg := range os.Args {
if arg == cmd.Name() && len(os.Args)-1 > i {
return os.Args[i+1:]
}
}
return []string{}
}
func main() {
// daemon command (main)
daemonCmd := cmdDaemon{}
app := daemonCmd.command()
app.SilenceUsage = true
app.CompletionOptions = cobra.CompletionOptions{DisableDefaultCmd: true}
// Workaround for main command
app.Args = cobra.ArbitraryArgs
// Workaround for being called through "incus admin cluster".
if len(os.Args) >= 3 && os.Args[0] == "incusd" && os.Args[1] == "admin" && os.Args[2] == "cluster" {
app.Use = "incus"
}
// Global flags
globalCmd := cmdGlobal{cmd: app}
daemonCmd.global = &globalCmd
app.PersistentPreRunE = globalCmd.run
app.PersistentFlags().BoolVar(&globalCmd.flagVersion, "version", false, "Print version number")
app.PersistentFlags().BoolVarP(&globalCmd.flagHelp, "help", "h", false, "Print help")
app.PersistentFlags().StringVar(&globalCmd.flagLogFile, "logfile", "", "Path to the log file"+"``")
app.PersistentFlags().BoolVar(&globalCmd.flagLogSyslog, "syslog", false, "Log to syslog")
app.PersistentFlags().StringArrayVar(&globalCmd.flagLogTrace, "trace", []string{}, "Log tracing targets"+"``")
app.PersistentFlags().BoolVarP(&globalCmd.flagLogDebug, "debug", "d", false, "Show all debug messages")
app.PersistentFlags().BoolVarP(&globalCmd.flagLogVerbose, "verbose", "v", false, "Show all information messages")
// Version handling
app.SetVersionTemplate("{{.Version}}\n")
app.Version = version.Version
// activateifneeded sub-command
activateifneededCmd := cmdActivateifneeded{global: &globalCmd}
app.AddCommand(activateifneededCmd.command())
// callhook sub-command
callhookCmd := cmdCallhook{global: &globalCmd}
app.AddCommand(callhookCmd.command())
// forkconsole sub-command
forkconsoleCmd := cmdForkconsole{global: &globalCmd}
app.AddCommand(forkconsoleCmd.command())
// forkexec sub-command
forkexecCmd := cmdForkexec{global: &globalCmd}
app.AddCommand(forkexecCmd.command())
// forkfile sub-command
forkfileCmd := cmdForkfile{global: &globalCmd}
app.AddCommand(forkfileCmd.command())
// forkqemu sub-command
forkqemuCmd := cmdForkqemu{global: &globalCmd}
app.AddCommand(forkqemuCmd.command())
// forkmigrate sub-command
forkmigrateCmd := cmdForkmigrate{global: &globalCmd}
app.AddCommand(forkmigrateCmd.command())
// forksyscall sub-command
forksyscallCmd := cmdForksyscall{global: &globalCmd}
app.AddCommand(forksyscallCmd.command())
// forkcoresched sub-command
forkbpfCmd := cmdForkbpf{global: &globalCmd}
app.AddCommand(forkbpfCmd.command())
// forkcoresched sub-command
forkcoreschedCmd := cmdForkcoresched{global: &globalCmd}
app.AddCommand(forkcoreschedCmd.command())
// forkmount sub-command
forkmountCmd := cmdForkmount{global: &globalCmd}
app.AddCommand(forkmountCmd.command())
// forknet sub-command
forknetCmd := cmdForknet{global: &globalCmd}
app.AddCommand(forknetCmd.command())
// forkproxy sub-command
forkproxyCmd := cmdForkproxy{global: &globalCmd}
app.AddCommand(forkproxyCmd.command())
// forklxc sub-command
forklxcCmd := cmdForklxc{global: &globalCmd}
app.AddCommand(forklxcCmd.command())
// forkuevent sub-command
forkueventCmd := cmdForkuevent{global: &globalCmd}
app.AddCommand(forkueventCmd.command())
// forkzfs sub-command
forkzfsCmd := cmdForkZFS{global: &globalCmd}
app.AddCommand(forkzfsCmd.command())
// manpage sub-command
manpageCmd := cmdManpage{global: &globalCmd}
app.AddCommand(manpageCmd.command())
// migratedumpsuccess sub-command
migratedumpsuccessCmd := cmdMigratedumpsuccess{global: &globalCmd}
app.AddCommand(migratedumpsuccessCmd.command())
// netcat sub-command
netcatCmd := cmdNetcat{global: &globalCmd}
app.AddCommand(netcatCmd.command())
// shutdown sub-command
shutdownCmd := cmdShutdown{global: &globalCmd}
app.AddCommand(shutdownCmd.command())
// version sub-command
versionCmd := cmdVersion{global: &globalCmd}
app.AddCommand(versionCmd.command())
// waitready sub-command
waitreadyCmd := cmdWaitready{global: &globalCmd}
app.AddCommand(waitreadyCmd.command())
// cluster sub-command (also admin cluster)
adminCmd := cmdAdmin{global: &globalCmd}
app.AddCommand(adminCmd.command())
clusterCmd := cmdCluster{global: &globalCmd}
app.AddCommand(clusterCmd.command())
// Run the main command and handle errors
err := app.Execute()
if err != nil {
os.Exit(1)
}
}