diff --git a/cmd/cli/commands.go b/cmd/cli/commands.go index 1707153..eee5349 100644 --- a/cmd/cli/commands.go +++ b/cmd/cli/commands.go @@ -32,6 +32,46 @@ import ( // dialSocketControlServerTimeout is the default timeout to wait when ping control server. const dialSocketControlServerTimeout = 30 * time.Second +// CommandRunner interface for dependency injection and testing +type CommandRunner interface { + RunServiceCommand(cmd *cobra.Command, args []string) error + RunLogCommand(cmd *cobra.Command, args []string) error + RunStatusCommand(cmd *cobra.Command, args []string) error + RunUpgradeCommand(cmd *cobra.Command, args []string) error + RunClientsCommand(cmd *cobra.Command, args []string) error + RunInterfacesCommand(cmd *cobra.Command, args []string) error +} + +// ServiceManager handles service operations +type ServiceManager struct { + prog *prog + svc service.Service +} + +// NewServiceManager creates a new service manager +func NewServiceManager() (*ServiceManager, error) { + p := &prog{} + + // Create a proper service configuration + svcConfig := &service.Config{ + Name: ctrldServiceName, + DisplayName: "Control-D Helper Service", + Description: "A highly configurable, multi-protocol DNS forwarding proxy", + Option: service.KeyValue{}, + } + + s, err := newService(p, svcConfig) + if err != nil { + return nil, fmt.Errorf("failed to create service: %w", err) + } + return &ServiceManager{prog: p, svc: s}, nil +} + +// Status returns the current service status +func (sm *ServiceManager) Status() (service.Status, error) { + return sm.svc.Status() +} + func initLogCmd() *cobra.Command { warnRuntimeLoggingNotEnabled := func() { mainLog.Load().Warn().Msg("runtime debug logging is not enabled")