From 9193d6fb5be92df732af18b08b1e052f84cc2f9d Mon Sep 17 00:00:00 2001 From: Thomas Winget Date: Thu, 29 Jan 2015 17:10:53 -0500 Subject: Daemonize changes pulled in -- daemon builds many RPC functions added by the daemonize changes (and related changes on the upstream dev branch that were not merged) were commented out (apart from return). Other than that, this *should* work...at any rate, it builds, and that's something. --- src/daemonizer/windows_daemonizer.inl | 156 ++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/daemonizer/windows_daemonizer.inl (limited to 'src/daemonizer/windows_daemonizer.inl') diff --git a/src/daemonizer/windows_daemonizer.inl b/src/daemonizer/windows_daemonizer.inl new file mode 100644 index 000000000..65c1e4195 --- /dev/null +++ b/src/daemonizer/windows_daemonizer.inl @@ -0,0 +1,156 @@ +#pragma once + +#include "common/util.h" +#include "daemonizer/windows_service.h" +#include "daemonizer/windows_service_runner.h" + +#include +#include +#include + +namespace daemonizer +{ + namespace + { + const command_line::arg_descriptor arg_install_service = { + "install-service" + , "Install Windows service" + }; + const command_line::arg_descriptor arg_uninstall_service = { + "uninstall-service" + , "Uninstall Windows service" + }; + const command_line::arg_descriptor arg_start_service = { + "start-service" + , "Start Windows service" + }; + const command_line::arg_descriptor arg_stop_service = { + "stop-service" + , "Stop Windows service" + }; + const command_line::arg_descriptor arg_is_service = { + "run-as-service" + , "Hidden -- true if running as windows service" + }; + + std::string get_argument_string(int argc, char const * argv[]) + { + std::string result = ""; + for (int i = 1; i < argc; ++i) + { + result += " " + std::string{argv[i]}; + } + return result; + } + } + + inline void init_options( + boost::program_options::options_description & hidden_options + , boost::program_options::options_description & normal_options + ) + { + command_line::add_arg(normal_options, arg_install_service); + command_line::add_arg(normal_options, arg_uninstall_service); + command_line::add_arg(normal_options, arg_start_service); + command_line::add_arg(normal_options, arg_stop_service); + command_line::add_arg(hidden_options, arg_is_service); + } + + inline boost::filesystem::path get_default_data_dir() + { + bool admin; + if (!windows::check_admin(admin)) + { + admin = false; + } + if (admin) + { + return boost::filesystem::absolute( + tools::get_special_folder_path(CSIDL_COMMON_APPDATA, true) + "\\" + CRYPTONOTE_NAME + ); + } + else + { + return boost::filesystem::absolute( + tools::get_special_folder_path(CSIDL_APPDATA, true) + "\\" + CRYPTONOTE_NAME + ); + } + } + + inline boost::filesystem::path get_relative_path_base( + boost::program_options::variables_map const & vm + ) + { + if (command_line::arg_present(vm, arg_is_service)) + { + if (command_line::arg_present(vm, command_line::arg_data_dir)) + { + return command_line::get_arg(vm, command_line::arg_data_dir); + } + else + { + return tools::get_default_data_dir(); + } + } + else + { + return boost::filesystem::current_path(); + } + } + + template + inline bool daemonize( + int argc, char const * argv[] + , T_executor && executor // universal ref + , boost::program_options::variables_map const & vm + ) + { + std::string arguments = get_argument_string(argc, argv); + + if (command_line::arg_present(vm, arg_is_service)) + { + // TODO - Set the service status here for return codes + windows::t_service_runner::run( + executor.name() + , executor.create_daemon(vm) + ); + return true; + } + else if (command_line::arg_present(vm, arg_install_service)) + { + if (windows::ensure_admin(arguments)) + { + arguments += " --run-as-service"; + return windows::install_service(executor.name(), arguments); + } + } + else if (command_line::arg_present(vm, arg_uninstall_service)) + { + if (windows::ensure_admin(arguments)) + { + return windows::uninstall_service(executor.name()); + } + } + else if (command_line::arg_present(vm, arg_start_service)) + { + if (windows::ensure_admin(arguments)) + { + return windows::start_service(executor.name()); + } + } + else if (command_line::arg_present(vm, arg_stop_service)) + { + if (windows::ensure_admin(arguments)) + { + return windows::stop_service(executor.name()); + } + } + else // interactive + { + //LOG_PRINT_L0(CRYPTONOTE_NAME << " v" << MONERO_VERSION_FULL); + return executor.run_interactive(vm); + } + + return false; + } +} -- cgit v1.2.3 From 2b0583b2c6ffb5e80f7d02ea384f039bfc88363c Mon Sep 17 00:00:00 2001 From: Thomas Winget Date: Fri, 20 Mar 2015 16:40:54 -0400 Subject: Hopefully fixes build on Windows --- src/daemonizer/windows_daemonizer.inl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/daemonizer/windows_daemonizer.inl') diff --git a/src/daemonizer/windows_daemonizer.inl b/src/daemonizer/windows_daemonizer.inl index 65c1e4195..5091ca948 100644 --- a/src/daemonizer/windows_daemonizer.inl +++ b/src/daemonizer/windows_daemonizer.inl @@ -81,9 +81,9 @@ namespace daemonizer boost::program_options::variables_map const & vm ) { - if (command_line::arg_present(vm, arg_is_service)) + if (command_line::has_arg(vm, arg_is_service)) { - if (command_line::arg_present(vm, command_line::arg_data_dir)) + if (command_line::has_arg(vm, command_line::arg_data_dir)) { return command_line::get_arg(vm, command_line::arg_data_dir); } -- cgit v1.2.3 From f78bb00943b5d8ca1a81204cc1756d12f2e89f75 Mon Sep 17 00:00:00 2001 From: Thomas Winget Date: Fri, 20 Mar 2015 16:56:55 -0400 Subject: Hopefully fixes build on Windows for real this time --- src/daemonizer/windows_daemonizer.inl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/daemonizer/windows_daemonizer.inl') diff --git a/src/daemonizer/windows_daemonizer.inl b/src/daemonizer/windows_daemonizer.inl index 5091ca948..c099f4097 100644 --- a/src/daemonizer/windows_daemonizer.inl +++ b/src/daemonizer/windows_daemonizer.inl @@ -107,7 +107,7 @@ namespace daemonizer { std::string arguments = get_argument_string(argc, argv); - if (command_line::arg_present(vm, arg_is_service)) + if (command_line::has_arg(vm, arg_is_service)) { // TODO - Set the service status here for return codes windows::t_service_runner::run( @@ -116,7 +116,7 @@ namespace daemonizer ); return true; } - else if (command_line::arg_present(vm, arg_install_service)) + else if (command_line::has_arg(vm, arg_install_service)) { if (windows::ensure_admin(arguments)) { @@ -124,21 +124,21 @@ namespace daemonizer return windows::install_service(executor.name(), arguments); } } - else if (command_line::arg_present(vm, arg_uninstall_service)) + else if (command_line::has_arg(vm, arg_uninstall_service)) { if (windows::ensure_admin(arguments)) { return windows::uninstall_service(executor.name()); } } - else if (command_line::arg_present(vm, arg_start_service)) + else if (command_line::has_arg(vm, arg_start_service)) { if (windows::ensure_admin(arguments)) { return windows::start_service(executor.name()); } } - else if (command_line::arg_present(vm, arg_stop_service)) + else if (command_line::has_arg(vm, arg_stop_service)) { if (windows::ensure_admin(arguments)) { -- cgit v1.2.3