96#if qStroika_Foundation_Common_Platform_POSIX
97 using Execution::SignalID;
151 struct ServiceDescription;
157 class SimpleIApplicationRepHelper;
162#if qStroika_Foundation_Common_Platform_POSIX
164 class BasicUNIXServiceImpl;
173#if qStroika_Foundation_Common_Platform_Windows
175 class WindowsService;
188 explicit Main (
const shared_ptr<IApplicationRep>& appRep,
197 nonvirtual
const Main& operator= (
const Main&) =
delete;
245 nonvirtual
State GetState ()
const;
263 nonvirtual
void Install ();
268 nonvirtual
void UnInstall ();
301 nonvirtual
void RunDirectly (
const optional<Time::Duration>& runFor = {});
336 virtual void ReReadConfiguration ();
341 virtual void Pause ();
346 virtual void Continue ();
351 nonvirtual ServiceDescription GetServiceDescription ()
const;
357 struct CommandOptions;
360 nonvirtual
const IServiceIntegrationRep& GetServiceRep_ ()
const;
361 nonvirtual IServiceIntegrationRep& GetServiceRep_ ();
362 nonvirtual
const IApplicationRep& GetAppRep_ ()
const;
363 nonvirtual IApplicationRep& GetAppRep_ ();
366 shared_ptr<IServiceIntegrationRep> fServiceRep_;
371 struct Main::ServiceDescription {
372 String fRegistrationName;
378 struct Main::CommandNames {
382 static inline constexpr string_view kInstall =
"Install"sv;
386 static inline constexpr string_view kUnInstall =
"UnInstall"sv;
395 static inline constexpr string_view kRunAsService =
"Run-As-Service"sv;
407 static inline constexpr string_view kRunDirectly =
"Run-Directly"sv;
415 static inline constexpr string_view kStart =
"Start"sv;
420 static inline constexpr string_view kStop =
"Stop"sv;
426 static inline constexpr string_view kForcedStop =
"ForcedStop"sv;
429 static inline constexpr string_view kRestart =
"Restart"sv;
431 static inline constexpr string_view kForcedRestart =
"ForcedRestart"sv;
434 static inline constexpr string_view kReloadConfiguration =
"Reload-Configuration"sv;
437 static inline constexpr string_view kPause =
"Pause"sv;
440 static inline constexpr string_view kContinue =
"Continue"sv;
442 static inline constexpr string_view kRunFor =
"runFor"sv;
443 static inline constexpr string_view kStatus =
"Status"sv;
446 struct Main::CommandOptions {
448 .fHelpOptionText =
"Register the service as installed"sv};
450 .fHelpOptionText =
"Unregister the service installation"sv};
452 .fLongName = CommandNames::kRunAsService, .fHelpOptionText =
"Run as a service daemon - as of run by OS service manager"sv};
456 .fHelpOptionText =
"Request OS service manager start the service."sv};
458 .fHelpOptionText =
"Request service manager stop the running service."sv};
460 .fLongName = CommandNames::kForcedStop,
461 .fHelpOptionText =
"Request service manager stop the running service (aggressively if it doesn't respond)."sv};
464 .fHelpOptionText =
"ForcedStop followed by Start."s};
466 .fHelpOptionText =
"Request service reload its configuration."sv};
468 .fHelpOptionText =
"Request OS service manager pause a service."sv};
470 .fHelpOptionText =
"Request OS service manager continue a paused service."sv};
473 .fSupportsArgument =
true,
474 .fHelpArgName =
"NSECONDS"sv,
475 .fHelpOptionText =
"Run for the argument number of seconds, and quietly quit."sv};
477 .fHelpOptionText =
"Check the status of the running service"sv};
479 static inline const initializer_list<Execution::CommandLine::Option> kAll{
480 kInstall, kUnInstall, kRunAsService, kRunDirectly, kStart, kStop, kForcedStop,
481 kRestart, kForcedRestart, kReloadConfiguration, kPause, kContinue, kRunFor, kStatus};
494 enum class MajorOperation {
504 eReloadConfiguration,
511 optional<MajorOperation> fMajorOperation;
575 virtual void MainLoop (
const function<
void ()>& startedCB) = 0;
578 virtual void OnReReadConfigurationRequest ();
583 virtual String GetServiceStatusMessage ()
const;
586 virtual ServiceDescription GetServiceDescription ()
const = 0;
593 SimpleIApplicationRepHelper () =
default;
619 virtual void _Attach (
const shared_ptr<IApplicationRep>& appRep) = 0;
624 virtual shared_ptr<IApplicationRep> _GetAttachedAppRep ()
const = 0;
630 virtual State _GetState ()
const = 0;
660 virtual void _RunAsService () = 0;
665 virtual void _RunDirectly (
const optional<Time::Duration>& runFor) = 0;
685 virtual pid_t _GetServicePID ()
const = 0;
702 virtual void _Attach (
const shared_ptr<IApplicationRep>& appRep)
override;
703 virtual shared_ptr<IApplicationRep> _GetAttachedAppRep ()
const override;
705 virtual State _GetState ()
const override;
708 virtual void _RunAsService ()
override;
709 virtual void _RunDirectly (
const optional<Time::Duration>& runFor)
override;
713 virtual pid_t _GetServicePID ()
const override;
716 shared_ptr<Main::IServiceIntegrationRep> fDelegateTo_;
725 virtual void _Attach (
const shared_ptr<IApplicationRep>& appRep)
override;
726 virtual shared_ptr<IApplicationRep> _GetAttachedAppRep ()
const override;
728 virtual State _GetState ()
const override;
731 virtual void _RunAsService ()
override;
732 virtual void _RunDirectly (
const optional<Time::Duration>& runFor)
override;
736 virtual pid_t _GetServicePID ()
const override;
739 shared_ptr<IApplicationRep> fAppRep_;
742#if qStroika_Foundation_Common_Platform_POSIX
748 BasicUNIXServiceImpl ();
749 ~BasicUNIXServiceImpl ();
752 virtual void _Attach (
const shared_ptr<IApplicationRep>& appRep)
override;
753 virtual shared_ptr<IApplicationRep> _GetAttachedAppRep ()
const override;
755 virtual State _GetState ()
const override;
756 virtual void _Install ()
override;
757 virtual void _UnInstall ()
override;
758 virtual void _RunAsService ()
override;
759 virtual void _RunDirectly (
const optional<Time::Duration>& runFor)
override;
763 virtual pid_t _GetServicePID ()
const override;
766 virtual filesystem::path _GetPIDFileName ()
const;
771 virtual void _CleanupDeadService ();
774 nonvirtual
void SetupSignalHanlders_ (
bool install);
792 static constexpr SignalID kSIG_ReReadConfiguration = SIGHUP;
796 nonvirtual
void SignalHandler_ (SignalID signum);
800 nonvirtual
bool _CheckShouldReReadConfig ()
const;
801 nonvirtual
void _DidReReadConfig ();
804 bool fMustReReadConfig{
false};
812#if qStroika_Foundation_Common_Platform_Windows
819 class Main::WindowsService :
public Main::IServiceIntegrationRep {
824 virtual void _Attach (
const shared_ptr<IApplicationRep>& appRep)
override;
825 virtual shared_ptr<IApplicationRep> _GetAttachedAppRep ()
const override;
827 virtual State _GetState ()
const override;
828 virtual void _Install ()
override;
829 virtual void _UnInstall ()
override;
830 virtual void _RunAsService ()
override;
831 virtual void _RunDirectly (
const optional<Time::Duration>& runFor)
override;
835 virtual pid_t _GetServicePID ()
const override;
839 nonvirtual
bool IsInstalled_ () const noexcept;
840 nonvirtual
void SetServiceStatus_ (DWORD dwState) noexcept;
841 nonvirtual
void ServiceMain_ (DWORD dwArgc, LPTSTR* lpszArgv) noexcept;
842 static
void WINAPI StaticServiceMain_ (DWORD dwArgc, LPTSTR* lpszArgv) noexcept;
843 nonvirtual
void Handler_ (DWORD dwOpcode) noexcept;
844 static
void WINAPI StaticHandler_ (DWORD dwOpcode) noexcept;
845 nonvirtual
void OnStopRequest_ () noexcept;
848 static WindowsService* s_SvcRunningTHIS_;
849 Execution::Thread::Ptr fRunThread_;
850 SERVICE_STATUS_HANDLE fServiceStatusHandle_{
nullptr};
851 SERVICE_STATUS fServiceStatus_{};
852 shared_ptr<IApplicationRep> fAppRep_;
virtual void MainLoop(const function< void()> &startedCB)=0
virtual void _Attach(const shared_ptr< IApplicationRep > &appRep)=0
virtual void _Attach(const shared_ptr< IApplicationRep > &appRep) override
virtual void _Attach(const shared_ptr< IApplicationRep > &appRep) override
static shared_ptr< IServiceIntegrationRep > mkDefaultServiceIntegrationRep()
nonvirtual Containers::Set< ServiceIntegrationFeatures > GetServiceIntegrationFeatures() const
nonvirtual pid_t GetServicePID() const
nonvirtual void RunDirectly(const optional< Time::Duration > &runFor={})
nonvirtual void ForcedRestart(Time::DurationSeconds timeout=Time::kInfinity, Time::DurationSeconds unforcedStopTimeout=Time::kInfinity)
nonvirtual void ForcedStop(Time::DurationSeconds timeout)
nonvirtual void Run(const CommandArgs &args, const Streams::OutputStream::Ptr< Characters::Character > &out=nullptr)