aboutsummaryrefslogtreecommitdiff
path: root/src/daemonizer/windows_daemonizer.inl
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2015-03-24 08:50:08 +0200
committerRiccardo Spagni <ric@spagni.net>2015-03-24 08:53:05 +0200
commitd7286395c97afd9d33d6170c1cf24f1e38140b37 (patch)
tree5513e1477d68755a44e0b0c7d34542b1c75eb99d /src/daemonizer/windows_daemonizer.inl
parentupdated gtest to latest (diff)
parentMerge upstream to daemonize changes (diff)
downloadmonero-d7286395c97afd9d33d6170c1cf24f1e38140b37.tar.xz
Merge pull request #243
51e3579 Fixed bug in static linking boost on MINGW (Thomas Winget) f78bb00 Hopefully fixes build on Windows for real this time (Thomas Winget) 2b0583b Hopefully fixes build on Windows (Thomas Winget) 9dab105 DNS checkpoint loading for testnet should now be correct (Thomas Winget) 52f9629 sending commands to forked daemon works on testnet now (Thomas Winget) 76289d0 Fix tests building -- function signatures changed (Thomas Winget) db53e19 revert stop_daemon method to use correct exit (Thomas Winget) 96cbecf RPC calls for background daemon added in (Thomas Winget) 9193d6f Daemonize changes pulled in -- daemon builds (Thomas Winget)
Diffstat (limited to 'src/daemonizer/windows_daemonizer.inl')
-rw-r--r--src/daemonizer/windows_daemonizer.inl156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/daemonizer/windows_daemonizer.inl b/src/daemonizer/windows_daemonizer.inl
new file mode 100644
index 000000000..c099f4097
--- /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 <shlobj.h>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+
+namespace daemonizer
+{
+ namespace
+ {
+ const command_line::arg_descriptor<bool> arg_install_service = {
+ "install-service"
+ , "Install Windows service"
+ };
+ const command_line::arg_descriptor<bool> arg_uninstall_service = {
+ "uninstall-service"
+ , "Uninstall Windows service"
+ };
+ const command_line::arg_descriptor<bool> arg_start_service = {
+ "start-service"
+ , "Start Windows service"
+ };
+ const command_line::arg_descriptor<bool> arg_stop_service = {
+ "stop-service"
+ , "Stop Windows service"
+ };
+ const command_line::arg_descriptor<bool> 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::has_arg(vm, arg_is_service))
+ {
+ if (command_line::has_arg(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 <typename T_executor>
+ 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::has_arg(vm, arg_is_service))
+ {
+ // TODO - Set the service status here for return codes
+ windows::t_service_runner<typename T_executor::t_daemon>::run(
+ executor.name()
+ , executor.create_daemon(vm)
+ );
+ return true;
+ }
+ else if (command_line::has_arg(vm, arg_install_service))
+ {
+ if (windows::ensure_admin(arguments))
+ {
+ arguments += " --run-as-service";
+ return windows::install_service(executor.name(), arguments);
+ }
+ }
+ 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::has_arg(vm, arg_start_service))
+ {
+ if (windows::ensure_admin(arguments))
+ {
+ return windows::start_service(executor.name());
+ }
+ }
+ else if (command_line::has_arg(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;
+ }
+}