From a9f7ea4bb4b6d2a3059d3292fc5f95a07b492c53 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 2 Feb 2024 17:41:06 +0000 Subject: [PATCH] Deploy code docs to GitHub Pages for workflow run 2248 Commit: 15b06c1c7cbdf0c1abeff5ab35afa1b75b883e20 --- _application_8cs_source.html | 574 +++--- _basic_watchdog_8cs_source.html | 4 +- _byond_installation_8cs_source.html | 189 +- _command_pipe_manager_8cs_source.html | 2 +- _delegating_engine_installer_8cs_source.html | 6 +- _dotnet_dump_service_8cs.html | 108 + _dotnet_dump_service_8cs_source.html | 133 ++ _engine_executable_lock_8cs_source.html | 53 +- _engine_installation_base_8cs_source.html | 151 +- _engine_installer_base_8cs_source.html | 4 +- _engine_manager_8cs_source.html | 302 +-- _host_exit_code_8cs_source.html | 2 +- _i_dotnet_dump_service_8cs.html | 109 + _i_dotnet_dump_service_8cs_source.html | 100 + _i_engine_installation_8cs_source.html | 33 +- _i_engine_installer_8cs_source.html | 20 +- _i_o_manager_extensions_8cs.html | 109 + _i_o_manager_extensions_8cs_source.html | 117 ++ _i_session_controller_8cs_source.html | 23 +- _installation_extensions_8cs_source.html | 2 +- _instance_factory_8cs_source.html | 467 ++--- _open_dream_installation_8cs_source.html | 243 +-- _open_dream_installer_8cs_source.html | 623 +++--- _pipe_commands_8cs_source.html | 2 +- _posix_byond_installer_8cs_source.html | 4 +- _service_lifetime_8cs_source.html | 2 +- _session_controller_8cs_source.html | 1659 +++++++-------- _session_controller_factory_8cs_source.html | 946 ++++----- ...rver_8_api_8_assembly_info_8cs_source.html | 2 +- ...r_8_common_8_assembly_info_8cs_source.html | 2 +- ..._8_server_8_host_2_program_8cs_source.html | 2 +- ...r_8_host_2_system_2_dotnet_helper_8cs.html | 109 + ...t_2_system_2_dotnet_helper_8cs_source.html | 129 ++ ...ver_8_host_8_assembly_info_8cs_source.html | 2 +- ...r_8_host_8_common_2_dotnet_helper_8cs.html | 2 +- ...t_8_common_2_dotnet_helper_8cs_source.html | 4 +- ...t_8_common_8_assembly_info_8cs_source.html | 2 +- ...8_host_8_service_2_program_8cs_source.html | 2 +- _watchdog_8cs_source.html | 2 +- _watchdog_base_8cs_source.html | 46 +- _windows_byond_installer_8cs_source.html | 94 +- _windows_open_dream_installer_8cs_source.html | 136 +- annotated.html | 56 +- changelog.yml | 6 + ...1_1_api_1_1_models_1_1_engine_version.html | 8 +- ...76a2503f8e4371139e9abe80df44d2_icgraph.map | 2 +- ...76a2503f8e4371139e9abe80df44d2_icgraph.md5 | 2 +- ...rver_1_1_api_1_1_models_1_1_entity_id.html | 2 +- ...1_models_1_1_internal_1_1_compile_job.html | 4 +- ...al_1_1_dream_daemon_launch_parameters.html | 20 +- ...station_1_1_server_1_1_api_1_1_routes.html | 4 +- ..._extensions_1_1_value_task_extensions.html | 10 +- ...adbd94d764754bd3e6c566a5fe7fe3_icgraph.map | 8 +- ...adbd94d764754bd3e6c566a5fe7fe3_icgraph.md5 | 2 +- ...engine_1_1_byond_installation-members.html | 5 +- ...nts_1_1_engine_1_1_byond_installation.html | 203 +- ...gine_1_1_byond_installer_base-members.html | 2 +- ...s_1_1_engine_1_1_byond_installer_base.html | 17 +- ...1_delegating_engine_installer-members.html | 2 +- ...ngine_1_1_delegating_engine_installer.html | 28 +- ...ne_1_1_engine_executable_lock-members.html | 3 +- ...1_1_engine_1_1_engine_executable_lock.html | 34 + ..._1_1_engine_installation_base-members.html | 3 +- ...1_engine_1_1_engine_installation_base.html | 159 +- ...ine_1_1_engine_installer_base-members.html | 2 +- ..._1_1_engine_1_1_engine_installer_base.html | 42 +- ...0a63f182a77bc1a099f3c7f8cd6849_icgraph.map | 6 +- ...0a63f182a77bc1a099f3c7f8cd6849_icgraph.md5 | 2 +- ...1_1_engine_1_1_engine_manager-members.html | 2 +- ...ponents_1_1_engine_1_1_engine_manager.html | 342 ++-- ...303d46d250191f69bb5251c89ca301d_cgraph.map | 2 +- ...303d46d250191f69bb5251c89ca301d_cgraph.md5 | 1 + ...303d46d250191f69bb5251c89ca301d_cgraph.png | Bin ...03d46d250191f69bb5251c89ca301d_icgraph.map | 0 ...03d46d250191f69bb5251c89ca301d_icgraph.md5 | 0 ...03d46d250191f69bb5251c89ca301d_icgraph.png | Bin ...d2a758adff2c72db49e822c8f6ceccf_cgraph.map | 4 +- ...d2a758adff2c72db49e822c8f6ceccf_cgraph.md5 | 2 +- ...03c2123e6edceee48d8b4897be532c6_cgraph.map | 4 +- ...03c2123e6edceee48d8b4897be532c6_cgraph.md5 | 2 +- ...2cedaccbf100b9dcf3922a9443f8f19_cgraph.map | 4 +- ...2cedaccbf100b9dcf3922a9443f8f19_cgraph.md5 | 2 +- ...9c62d0233e9ece106eee44289e3c055_cgraph.md5 | 1 - ...e_1_1_open_dream_installation-members.html | 3 +- ..._1_engine_1_1_open_dream_installation.html | 123 +- ...gine_1_1_open_dream_installer-members.html | 2 +- ...s_1_1_engine_1_1_open_dream_installer.html | 603 +++--- ...059bc8156f7b07e59b423dad178e45_icgraph.map | 4 +- ...059bc8156f7b07e59b423dad178e45_icgraph.md5 | 2 +- ...b3454e1b0d55e9fda7da0b792e5ae78_cgraph.md5 | 1 - ...b3454e1b0d55e9fda7da0b792e5ae78_cgraph.png | Bin 154248 -> 0 bytes ...bbfa8809316fbf016f231d630ad56f3_cgraph.map | 23 +- ...bbfa8809316fbf016f231d630ad56f3_cgraph.md5 | 1 + ...bbfa8809316fbf016f231d630ad56f3_cgraph.png | Bin 0 -> 156980 bytes ...2865608a7386b98313efadfcf0a903_icgraph.map | 2 +- ...2865608a7386b98313efadfcf0a903_icgraph.md5 | 2 +- ...ine_1_1_posix_byond_installer-members.html | 2 +- ..._1_1_engine_1_1_posix_byond_installer.html | 43 +- ...8b3d4659e9a7927e6661cca2e08ec8f_cgraph.map | 0 ...8b3d4659e9a7927e6661cca2e08ec8f_cgraph.md5 | 0 ...8b3d4659e9a7927e6661cca2e08ec8f_cgraph.png | Bin ...2e9e7a8217a4198fc5d74c5789c78e_icgraph.map | 2 +- ...2e9e7a8217a4198fc5d74c5789c78e_icgraph.md5 | 2 +- ...e_1_1_windows_byond_installer-members.html | 4 +- ..._1_engine_1_1_windows_byond_installer.html | 178 +- ...d9b73db73414af3553f16b5bc4bc37_icgraph.map | 4 +- ...d9b73db73414af3553f16b5bc4bc37_icgraph.md5 | 2 +- ...246ed532bfa00b0e471a7fa51f2c17_icgraph.md5 | 1 - ...68c1e9ab92857d3bced172e22850b24_cgraph.map | 2 +- ...68c1e9ab92857d3bced172e22850b24_cgraph.md5 | 1 + ...68c1e9ab92857d3bced172e22850b24_cgraph.png | Bin ...b1078675acc49bd3beea10b2dcf0075_cgraph.map | 0 ...b1078675acc49bd3beea10b2dcf0075_cgraph.md5 | 0 ...b1078675acc49bd3beea10b2dcf0075_cgraph.png | Bin ...1078675acc49bd3beea10b2dcf0075_icgraph.map | 2 +- ...1078675acc49bd3beea10b2dcf0075_icgraph.md5 | 1 + ...1078675acc49bd3beea10b2dcf0075_icgraph.png | Bin ...db765cab1e3405e710040bdcb223085_cgraph.map | 2 +- ...db765cab1e3405e710040bdcb223085_cgraph.md5 | 2 +- ...544ff92a28679177759cf0a0f16a31_icgraph.map | 2 +- ...544ff92a28679177759cf0a0f16a31_icgraph.md5 | 2 +- ...bb08c2eb8e00b430ef4cf683468c90_icgraph.map | 2 +- ...bb08c2eb8e00b430ef4cf683468c90_icgraph.md5 | 2 +- ...696117e411ba59dd94692141e3885c6_cgraph.md5 | 1 - ..._windows_open_dream_installer-members.html | 4 +- ...gine_1_1_windows_open_dream_installer.html | 205 +- ...feac2268b4c3375e79162b461908e8f_cgraph.map | 0 ...feac2268b4c3375e79162b461908e8f_cgraph.md5 | 0 ...feac2268b4c3375e79162b461908e8f_cgraph.png | Bin ...eac2268b4c3375e79162b461908e8f_icgraph.map | 2 +- ...eac2268b4c3375e79162b461908e8f_icgraph.md5 | 1 + ...eac2268b4c3375e79162b461908e8f_icgraph.png | Bin ...34a7299ca217f93f49b4be99ae2188_icgraph.md5 | 1 - ...fd28aaba98525c2eed2f1ff7a670bc1_cgraph.map | 2 +- ...fd28aaba98525c2eed2f1ff7a670bc1_cgraph.md5 | 1 + ...fd28aaba98525c2eed2f1ff7a670bc1_cgraph.png | Bin ...44c356e8e1919479866587c37951dde_cgraph.md5 | 1 - ..._1_1_host_1_1_components_1_1_instance.html | 2 +- ...mponents_1_1_instance_factory-members.html | 43 +- ...t_1_1_components_1_1_instance_factory.html | 534 ++--- ...ents_1_1_instance_factory__coll__graph.map | 57 +- ...ents_1_1_instance_factory__coll__graph.md5 | 2 +- ...ents_1_1_instance_factory__coll__graph.png | Bin 334862 -> 340058 bytes ...erop_1_1_bridge_1_1_bridge_parameters.html | 12 +- ...op_1_1_bridge_1_1_runtime_information.html | 12 +- ...mponents_1_1_interop_1_1_chat_message.html | 2 +- ...onents_1_1_interop_1_1_chunk_set_info.html | 2 +- ..._1_components_1_1_interop_1_1_chunker.html | 4 +- ...nts_1_1_interop_1_1_d_m_api_constants.html | 14 +- ...ts_1_1_interop_1_1_d_m_api_parameters.html | 2 +- ...ents_1_1_interop_1_1_d_m_api_response.html | 2 +- ...nents_1_1_interop_1_1_message_content.html | 2 +- ...nterop_1_1_topic_1_1_topic_parameters.html | 6 +- ...1_session_1_1_combined_topic_response.html | 2 +- ..._1_1_session_1_1_reattach_information.html | 10 +- ...ession_1_1_session_controller-members.html | 12 +- ...ts_1_1_session_1_1_session_controller.html | 1800 +++++++++-------- ...on_1_1_session_controller__coll__graph.map | 59 +- ...on_1_1_session_controller__coll__graph.md5 | 2 +- ...on_1_1_session_controller__coll__graph.png | Bin 216618 -> 228596 bytes ...3461712a40946a3ac6590529df9e2e_icgraph.map | 2 +- ...3461712a40946a3ac6590529df9e2e_icgraph.md5 | 2 +- ...0f2dd7d15d1061be790cadd1e44a092_cgraph.map | 0 ...0f2dd7d15d1061be790cadd1e44a092_cgraph.md5 | 0 ...0f2dd7d15d1061be790cadd1e44a092_cgraph.png | Bin ...642e3229a7f07751fa9064bba5049a0_cgraph.map | 5 + ...642e3229a7f07751fa9064bba5049a0_cgraph.md5 | 1 + ...642e3229a7f07751fa9064bba5049a0_cgraph.png | Bin 0 -> 16130 bytes ...969c596f06eb501dfd16ab3e0cab93_icgraph.map | 2 +- ...969c596f06eb501dfd16ab3e0cab93_icgraph.md5 | 2 +- ..._1_session_controller_factory-members.html | 37 +- ...ession_1_1_session_controller_factory.html | 939 +++++---- ...ession_controller_factory__coll__graph.map | 13 +- ...ession_controller_factory__coll__graph.md5 | 2 +- ...ession_controller_factory__coll__graph.png | Bin 208987 -> 229962 bytes ...nents_1_1_watchdog_1_1_basic_watchdog.html | 6 +- ...onents_1_1_watchdog_1_1_watchdog_base.html | 42 +- ...nfiguration_1_1_general_configuration.html | 8 +- ...nfiguration_1_1_session_configuration.html | 4 +- ...trollers_1_1_control_panel_controller.html | 2 +- ...ver_1_1_host_1_1_core_1_1_application.html | 546 ++--- ...ns_1_1_i_o_manager_extensions-members.html | 90 + ...extensions_1_1_i_o_manager_extensions.html | 177 ++ ...59efcb9fca5ac36396eb21dbd3b40c6_cgraph.map | 4 + ...59efcb9fca5ac36396eb21dbd3b40c6_cgraph.md5 | 1 + ...59efcb9fca5ac36396eb21dbd3b40c6_cgraph.png | Bin 0 -> 10717 bytes ..._1_1_extensions_1_1_socket_extensions.html | 2 +- ...st_1_1_jobs_1_1_job_progress_reporter.html | 6 +- ...36a80d9d56a20711468d9b8e27e3c1_icgraph.map | 2 +- ...36a80d9d56a20711468d9b8e27e3c1_icgraph.md5 | 2 +- ..._models_1_1_reattach_information_base.html | 8 +- ...perties_1_1_master_versions_attribute.html | 4 +- ...ystem_1_1_dotnet_dump_service-members.html | 92 + ...st_1_1_system_1_1_dotnet_dump_service.html | 279 +++ ...m_1_1_dotnet_dump_service__coll__graph.map | 5 + ...m_1_1_dotnet_dump_service__coll__graph.md5 | 1 + ...m_1_1_dotnet_dump_service__coll__graph.png | Bin 0 -> 14524 bytes ..._1_dotnet_dump_service__inherit__graph.map | 4 + ..._1_dotnet_dump_service__inherit__graph.md5 | 1 + ..._1_dotnet_dump_service__inherit__graph.png | Bin 0 -> 7545 bytes ..._1_1_system_1_1_dotnet_helper-members.html | 90 + ...1_1_host_1_1_system_1_1_dotnet_helper.html | 206 ++ ...ce9bc97f5e0fe832f2a1a5653365b64_cgraph.map | 4 + ...ce9bc97f5e0fe832f2a1a5653365b64_cgraph.md5 | 1 + ...ce9bc97f5e0fe832f2a1a5653365b64_cgraph.png | Bin 0 -> 8971 bytes ...e9bc97f5e0fe832f2a1a5653365b64_icgraph.map | 4 + ...e9bc97f5e0fe832f2a1a5653365b64_icgraph.md5 | 1 + ...e9bc97f5e0fe832f2a1a5653365b64_icgraph.png | Bin 0 -> 9574 bytes ..._host_1_1_system_1_1_process_executor.html | 6 +- ...06b74b2bb7f77e8e6880c681d8c12f_icgraph.map | 2 +- ...06b74b2bb7f77e8e6880c681d8c12f_icgraph.md5 | 2 +- ...ff78981191a9e243f82df1376db860_icgraph.map | 2 +- ...ff78981191a9e243f82df1376db860_icgraph.md5 | 2 +- ..._1_system_1_1_windows_firewall_helper.html | 10 +- ...46ef24242576e5459ccaa30d473a59_icgraph.map | 8 +- ...46ef24242576e5459ccaa30d473a59_icgraph.md5 | 2 +- ...1_1_host_1_1_utils_1_1_fifo_semaphore.html | 4 +- ..._1_1_utils_1_1_semaphore_slim_context.html | 2 +- ...773d588476671bbe480f096d839c91_icgraph.map | 2 +- ...773d588476671bbe480f096d839c91_icgraph.md5 | 2 +- ..._1_1_utils_1_1_serilog_context_helper.html | 2 +- ...t_1_1_utils_1_1_swagger_configuration.html | 2 +- classes.html | 4 +- dir_3d220027e29e19c608b6d51ce3029c32.html | 6 + dir_5ae0a4770cfe9bc511dad7df7deabb23.html | 2 + dir_6f30e6edd07ec356128627ca61aea4cc.html | 2 +- files.html | 58 +- functions.html | 4 +- functions_c.html | 6 +- functions_d.html | 8 +- functions_func.html | 4 +- functions_func_d.html | 2 + functions_func_g.html | 2 + functions_func_i.html | 6 +- functions_func_s.html | 4 +- functions_g.html | 6 +- functions_h.html | 4 +- functions_i.html | 6 +- functions_l.html | 2 +- functions_n.html | 3 +- functions_prop_d.html | 1 + functions_prop_u.html | 1 + functions_s.html | 10 +- functions_t.html | 3 +- functions_u.html | 1 + functions_vars_d.html | 1 + functions_vars_l.html | 2 +- hierarchy.html | 1562 +++++++------- inherit_graph_138.map | 2 +- inherit_graph_138.md5 | 2 +- inherit_graph_138.png | Bin 4397 -> 4653 bytes inherit_graph_139.map | 2 +- inherit_graph_139.md5 | 2 +- inherit_graph_139.png | Bin 4084 -> 4397 bytes inherit_graph_140.map | 2 +- inherit_graph_140.md5 | 2 +- inherit_graph_140.png | Bin 4717 -> 4084 bytes inherit_graph_141.map | 2 +- inherit_graph_141.md5 | 2 +- inherit_graph_141.png | Bin 4328 -> 4717 bytes inherit_graph_142.map | 2 +- inherit_graph_142.md5 | 2 +- inherit_graph_142.png | Bin 4129 -> 4328 bytes inherit_graph_143.map | 2 +- inherit_graph_143.md5 | 2 +- inherit_graph_143.png | Bin 4426 -> 4129 bytes inherit_graph_144.map | 2 +- inherit_graph_144.md5 | 2 +- inherit_graph_144.png | Bin 4798 -> 4426 bytes inherit_graph_145.map | 3 +- inherit_graph_145.md5 | 2 +- inherit_graph_145.png | Bin 4722 -> 4798 bytes inherit_graph_146.map | 5 +- inherit_graph_146.md5 | 2 +- inherit_graph_146.png | Bin 15572 -> 4722 bytes inherit_graph_147.map | 6 +- inherit_graph_147.md5 | 2 +- inherit_graph_147.png | Bin 6059 -> 15572 bytes inherit_graph_148.map | 6 +- inherit_graph_148.md5 | 2 +- inherit_graph_148.png | Bin 14697 -> 6059 bytes inherit_graph_149.map | 5 +- inherit_graph_149.md5 | 2 +- inherit_graph_149.png | Bin 5794 -> 14697 bytes inherit_graph_150.map | 5 +- inherit_graph_150.md5 | 2 +- inherit_graph_150.png | Bin 9942 -> 5794 bytes inherit_graph_151.map | 5 +- inherit_graph_151.md5 | 2 +- inherit_graph_151.png | Bin 6670 -> 9942 bytes inherit_graph_152.map | 3 +- inherit_graph_152.md5 | 2 +- inherit_graph_152.png | Bin 4344 -> 6670 bytes inherit_graph_153.map | 4 +- inherit_graph_153.md5 | 2 +- inherit_graph_153.png | Bin 17647 -> 4344 bytes inherit_graph_154.map | 7 +- inherit_graph_154.md5 | 2 +- inherit_graph_154.png | Bin 18886 -> 17647 bytes inherit_graph_155.map | 11 +- inherit_graph_155.md5 | 2 +- inherit_graph_155.png | Bin 36946 -> 18886 bytes inherit_graph_156.map | 12 +- inherit_graph_156.md5 | 2 +- inherit_graph_156.png | Bin 29445 -> 36946 bytes inherit_graph_157.map | 6 +- inherit_graph_157.md5 | 2 +- inherit_graph_157.png | Bin 5198 -> 29445 bytes inherit_graph_158.map | 2 +- inherit_graph_158.md5 | 2 +- inherit_graph_158.png | Bin 4159 -> 5198 bytes inherit_graph_159.map | 2 +- inherit_graph_159.md5 | 2 +- inherit_graph_159.png | Bin 4525 -> 4159 bytes inherit_graph_160.map | 2 +- inherit_graph_160.md5 | 2 +- inherit_graph_160.png | Bin 2720 -> 4525 bytes inherit_graph_161.map | 3 +- inherit_graph_161.md5 | 2 +- inherit_graph_161.png | Bin 9645 -> 2720 bytes inherit_graph_162.map | 5 +- inherit_graph_162.md5 | 2 +- inherit_graph_162.png | Bin 16662 -> 9645 bytes inherit_graph_163.map | 5 +- inherit_graph_163.md5 | 2 +- inherit_graph_163.png | Bin 8408 -> 16662 bytes inherit_graph_164.map | 4 +- inherit_graph_164.md5 | 2 +- inherit_graph_164.png | Bin 9215 -> 8408 bytes inherit_graph_165.map | 9 +- inherit_graph_165.md5 | 2 +- inherit_graph_165.png | Bin 40800 -> 9215 bytes inherit_graph_166.map | 8 +- inherit_graph_166.md5 | 2 +- inherit_graph_166.png | Bin 4088 -> 40800 bytes inherit_graph_167.map | 2 +- inherit_graph_167.md5 | 2 +- inherit_graph_167.png | Bin 3479 -> 4088 bytes inherit_graph_168.map | 2 +- inherit_graph_168.md5 | 2 +- inherit_graph_168.png | Bin 4179 -> 3479 bytes inherit_graph_169.map | 3 +- inherit_graph_169.md5 | 2 +- inherit_graph_169.png | Bin 6278 -> 4179 bytes inherit_graph_170.map | 3 +- inherit_graph_170.md5 | 2 +- inherit_graph_170.png | Bin 4420 -> 6278 bytes inherit_graph_171.map | 2 +- inherit_graph_171.md5 | 2 +- inherit_graph_171.png | Bin 5149 -> 4420 bytes inherit_graph_172.map | 2 +- inherit_graph_172.md5 | 2 +- inherit_graph_172.png | Bin 4878 -> 5149 bytes inherit_graph_173.map | 2 +- inherit_graph_173.md5 | 2 +- inherit_graph_173.png | Bin 4909 -> 4878 bytes inherit_graph_174.map | 3 +- inherit_graph_174.md5 | 2 +- inherit_graph_174.png | Bin 9803 -> 4909 bytes inherit_graph_175.map | 3 +- inherit_graph_175.md5 | 2 +- inherit_graph_175.png | Bin 8304 -> 3793 bytes inherit_graph_176.map | 4 +- inherit_graph_176.md5 | 2 +- inherit_graph_176.png | Bin 8145 -> 9803 bytes inherit_graph_177.map | 5 +- inherit_graph_177.md5 | 2 +- inherit_graph_177.png | Bin 14312 -> 9013 bytes inherit_graph_178.map | 3 +- inherit_graph_178.md5 | 2 +- inherit_graph_178.png | Bin 4294 -> 8304 bytes inherit_graph_179.map | 3 +- inherit_graph_179.md5 | 2 +- inherit_graph_179.png | Bin 4658 -> 8145 bytes inherit_graph_180.map | 4 +- inherit_graph_180.md5 | 2 +- inherit_graph_180.png | Bin 4246 -> 14312 bytes inherit_graph_181.map | 2 +- inherit_graph_181.md5 | 2 +- inherit_graph_181.png | Bin 4589 -> 4294 bytes inherit_graph_182.map | 3 +- inherit_graph_182.md5 | 2 +- inherit_graph_182.png | Bin 8967 -> 4658 bytes inherit_graph_183.map | 4 +- inherit_graph_183.md5 | 2 +- inherit_graph_183.png | Bin 8539 -> 4246 bytes inherit_graph_184.map | 3 +- inherit_graph_184.md5 | 2 +- inherit_graph_184.png | Bin 9218 -> 4589 bytes inherit_graph_185.map | 4 +- inherit_graph_185.md5 | 2 +- inherit_graph_185.png | Bin 8540 -> 8967 bytes inherit_graph_186.map | 5 +- inherit_graph_186.md5 | 2 +- inherit_graph_186.png | Bin 8046 -> 8539 bytes inherit_graph_187.map | 3 +- inherit_graph_187.md5 | 2 +- inherit_graph_187.png | Bin 6478 -> 9218 bytes inherit_graph_188.map | 3 +- inherit_graph_188.md5 | 2 +- inherit_graph_188.png | Bin 4408 -> 8540 bytes inherit_graph_189.map | 4 +- inherit_graph_189.md5 | 2 +- inherit_graph_189.png | Bin 10192 -> 8046 bytes inherit_graph_190.map | 2 +- inherit_graph_190.md5 | 2 +- inherit_graph_190.png | Bin 9112 -> 6478 bytes inherit_graph_191.map | 2 +- inherit_graph_191.md5 | 2 +- inherit_graph_191.png | Bin 7322 -> 4408 bytes inherit_graph_192.map | 6 +- inherit_graph_192.md5 | 2 +- inherit_graph_192.png | Bin 26197 -> 10192 bytes inherit_graph_193.map | 3 +- inherit_graph_193.md5 | 2 +- inherit_graph_193.png | Bin 5272 -> 9112 bytes inherit_graph_194.map | 3 +- inherit_graph_194.md5 | 2 +- inherit_graph_194.png | Bin 5688 -> 7322 bytes inherit_graph_195.map | 6 + inherit_graph_195.md5 | 1 + inherit_graph_195.png | Bin 0 -> 26197 bytes inherit_graph_196.map | 4 + inherit_graph_196.md5 | 1 + inherit_graph_196.png | Bin 0 -> 5272 bytes inherit_graph_197.map | 4 + inherit_graph_197.md5 | 1 + inherit_graph_197.png | Bin 0 -> 5688 bytes inherits.html | 130 +- ...omponents_1_1_chat_1_1_i_chat_manager.html | 4 +- ...s_1_1_chat_1_1_i_chat_manager_factory.html | 2 +- ..._1_1_chat_1_1_i_chat_tracking_context.html | 6 +- ...d4bf60a56058a56804994741cceff5_icgraph.map | 2 +- ...d4bf60a56058a56804994741cceff5_icgraph.md5 | 2 +- ...nts_1_1_deployment_1_1_i_dmb_provider.html | 10 +- ..._1_1_i_engine_executable_lock-members.html | 3 +- ...1_engine_1_1_i_engine_executable_lock.html | 5 +- ...ine_1_1_i_engine_installation-members.html | 3 +- ..._1_1_engine_1_1_i_engine_installation.html | 48 +- ...engine_1_1_i_engine_installation_data.html | 4 +- ...12d13d543fde6cbb64c9085f9370b7_icgraph.map | 2 +- ...12d13d543fde6cbb64c9085f9370b7_icgraph.md5 | 2 +- ...engine_1_1_i_engine_installer-members.html | 2 +- ...nts_1_1_engine_1_1_i_engine_installer.html | 33 +- ...100637a7abd23c97157b7a4deb4736_icgraph.map | 2 +- ...100637a7abd23c97157b7a4deb4736_icgraph.md5 | 2 +- ...982c374c0d5d56779125fce7c933be_icgraph.map | 2 +- ...982c374c0d5d56779125fce7c933be_icgraph.md5 | 1 + ...982c374c0d5d56779125fce7c933be_icgraph.png | Bin ...d4d33b897f1228ce90a2d430d9e880_icgraph.md5 | 1 - ...nents_1_1_engine_1_1_i_engine_manager.html | 2 +- ...nents_1_1_events_1_1_i_event_consumer.html | 2 +- ...1_1_components_1_1_i_instance_manager.html | 2 +- ...rop_1_1_bridge_1_1_i_bridge_registrar.html | 4 +- ...6d6072e7a96ece183b77544c9bfe4b_icgraph.map | 2 +- ...6d6072e7a96ece183b77544c9bfe4b_icgraph.md5 | 2 +- ...1_repository_1_1_i_repository_manager.html | 4 +- ...tory_1_1_i_repository_manager_factory.html | 2 +- ...sion_1_1_i_session_controller-members.html | 39 +- ..._1_1_session_1_1_i_session_controller.html | 32 + ..._1_session_1_1_i_topic_client_factory.html | 2 +- ...s_1_1_watchdog_1_1_i_watchdog_factory.html | 2 +- ...t_1_1_core_1_1_i_server_port_provider.html | 2 +- ...1_1_i_o_1_1_i_filesystem_link_factory.html | 2 +- ...er_1_1_host_1_1_i_o_1_1_i_i_o_manager.html | 144 +- ...49e071c50bd39000bb7db1d02fc2e3_icgraph.map | 2 +- ...49e071c50bd39000bb7db1d02fc2e3_icgraph.md5 | 2 +- ...6d5a54db205d2d1d45a927d57f5182_icgraph.map | 2 +- ...6d5a54db205d2d1d45a927d57f5182_icgraph.md5 | 2 +- ...a442b5dff16f5e7a730ec354e81d78_icgraph.map | 8 +- ...a442b5dff16f5e7a730ec354e81d78_icgraph.md5 | 2 +- ...6f4eb5c679683b7e519847a6c3574e_icgraph.map | 67 +- ...6f4eb5c679683b7e519847a6c3574e_icgraph.md5 | 2 +- ...6f4eb5c679683b7e519847a6c3574e_icgraph.png | Bin 436962 -> 449538 bytes ...ff052035f4d3d0c689d0e89d8deecd_icgraph.map | 2 +- ...ff052035f4d3d0c689d0e89d8deecd_icgraph.md5 | 2 +- ...ebf958ad54ba63a6b74a1d4d75a6f2_icgraph.map | 2 +- ...ebf958ad54ba63a6b74a1d4d75a6f2_icgraph.md5 | 2 +- ...aa1b9dbeb6af3744e568095c4376e7_icgraph.map | 6 +- ...aa1b9dbeb6af3744e568095c4376e7_icgraph.md5 | 2 +- ...d1ad47e4ba1c1f7407f5dd50a81de8_icgraph.map | 2 +- ...d1ad47e4ba1c1f7407f5dd50a81de8_icgraph.md5 | 2 +- ...eb8b83ea3f4b13a183b6ac55b35a70_icgraph.map | 8 +- ...eb8b83ea3f4b13a183b6ac55b35a70_icgraph.md5 | 2 +- ...e0dda4b7fbad4c77f48ba3b2681dc7_icgraph.map | 4 +- ...e0dda4b7fbad4c77f48ba3b2681dc7_icgraph.md5 | 2 +- ...de873180481f7afa206b6282158d62_icgraph.map | 33 +- ...de873180481f7afa206b6282158d62_icgraph.md5 | 2 +- ...de873180481f7afa206b6282158d62_icgraph.png | Bin 151188 -> 154827 bytes ...dc6ae8e69047b801a7344b17d0cc37_icgraph.map | 2 +- ...dc6ae8e69047b801a7344b17d0cc37_icgraph.md5 | 2 +- ...e08438da658a3c0afddbb7960e4faa_icgraph.map | 2 +- ...e08438da658a3c0afddbb7960e4faa_icgraph.md5 | 2 +- ...host_1_1_i_o_1_1_i_post_write_handler.html | 2 +- ...7c03596e21a07e06d7bc3735c6884f_icgraph.map | 2 +- ...7c03596e21a07e06d7bc3735c6884f_icgraph.md5 | 2 +- ...1_1_security_1_1_i_cryptography_suite.html | 2 +- ...host_1_1_security_1_1_i_token_factory.html | 2 +- ...m_1_1_i_assembly_information_provider.html | 4 +- ...tem_1_1_i_dotnet_dump_service-members.html | 90 + ..._1_1_system_1_1_i_dotnet_dump_service.html | 174 ++ ..._i_dotnet_dump_service__inherit__graph.map | 4 + ..._i_dotnet_dump_service__inherit__graph.md5 | 1 + ..._i_dotnet_dump_service__inherit__graph.png | Bin 0 -> 9535 bytes ...3e6886542a8c4d273f887ca134b1aa_icgraph.map | 4 + ...3e6886542a8c4d273f887ca134b1aa_icgraph.md5 | 1 + ...3e6886542a8c4d273f887ca134b1aa_icgraph.png | Bin 0 -> 9889 bytes ..._1_system_1_1_i_network_prompt_reaper.html | 2 +- ..._1_1_system_1_1_i_platform_identifier.html | 2 +- ...ver_1_1_host_1_1_system_1_1_i_process.html | 10 +- ..._1_host_1_1_system_1_1_i_process_base.html | 25 +- ...a5f52164b7c397bcefda36c8b99bbe_icgraph.map | 4 + ...a5f52164b7c397bcefda36c8b99bbe_icgraph.md5 | 1 + ...a5f52164b7c397bcefda36c8b99bbe_icgraph.png | Bin 0 -> 10214 bytes ...860a501568835fac115772ee87902d_icgraph.map | 10 +- ...860a501568835fac115772ee87902d_icgraph.md5 | 2 +- ...ost_1_1_system_1_1_i_process_executor.html | 16 +- ...aaca1c9368096a2366a7a14143d177_icgraph.map | 8 +- ...aaca1c9368096a2366a7a14143d177_icgraph.md5 | 2 +- ..._1_host_1_1_utils_1_1_i_async_delayer.html | 4 +- ...604334bd297d47506dc23e0d115977_icgraph.map | 2 +- ...604334bd297d47506dc23e0d115977_icgraph.md5 | 2 +- ...er_1_1_host_1_1_components_1_1_engine.html | 116 +- ...on_1_1_server_1_1_host_1_1_extensions.html | 3 + ...tation_1_1_server_1_1_host_1_1_system.html | 8 + namespaces.html | 56 +- search/all_11.js | 105 +- search/all_13.js | 277 +-- search/all_14.js | 214 +- search/all_15.js | 91 +- search/all_16.js | 137 +- search/all_18.js | 115 +- search/all_2.js | 240 ++- search/all_3.js | 59 +- search/all_4.js | 588 +++--- search/all_5.js | 185 +- search/all_6.js | 4 +- search/all_7.js | 87 +- search/all_8.js | 213 +- search/all_9.js | 39 +- search/all_a.js | 667 +++--- search/all_b.js | 19 +- search/all_d.js | 16 +- search/all_f.js | 8 +- search/classes_3.js | 28 +- search/classes_8.js | 268 +-- search/files_5.js | 37 +- search/files_a.js | 250 +-- search/functions_0.js | 4 +- search/functions_12.js | 4 +- search/functions_3.js | 50 +- search/functions_6.js | 138 +- search/functions_8.js | 6 +- search/properties_12.js | 27 +- search/properties_3.js | 11 +- search/variables_2.js | 8 +- search/variables_3.js | 23 +- search/variables_b.js | 2 +- 558 files changed, 12021 insertions(+), 9181 deletions(-) create mode 100644 _dotnet_dump_service_8cs.html create mode 100644 _dotnet_dump_service_8cs_source.html create mode 100644 _i_dotnet_dump_service_8cs.html create mode 100644 _i_dotnet_dump_service_8cs_source.html create mode 100644 _i_o_manager_extensions_8cs.html create mode 100644 _i_o_manager_extensions_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_system_2_dotnet_helper_8cs.html create mode 100644 _tgstation_8_server_8_host_2_system_2_dotnet_helper_8cs_source.html rename _dotnet_helper_8cs.html => _tgstation_8_server_8_host_8_common_2_dotnet_helper_8cs.html (97%) rename _dotnet_helper_8cs_source.html => _tgstation_8_server_8_host_8_common_2_dotnet_helper_8cs_source.html (95%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_ae9c62d0233e9ece106eee44289e3c055_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_a0303d46d250191f69bb5251c89ca301d_cgraph.map (97%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_a0303d46d250191f69bb5251c89ca301d_cgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_ae9c62d0233e9ece106eee44289e3c055_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_a0303d46d250191f69bb5251c89ca301d_cgraph.png (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_ae9c62d0233e9ece106eee44289e3c055_icgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_a0303d46d250191f69bb5251c89ca301d_icgraph.map (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_ae9c62d0233e9ece106eee44289e3c055_icgraph.md5 => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_a0303d46d250191f69bb5251c89ca301d_icgraph.md5 (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_ae9c62d0233e9ece106eee44289e3c055_icgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_a0303d46d250191f69bb5251c89ca301d_icgraph.png (100%) delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_engine_manager_ae9c62d0233e9ece106eee44289e3c055_cgraph.md5 delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_open_dream_installer_a6b3454e1b0d55e9fda7da0b792e5ae78_cgraph.md5 delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_open_dream_installer_a6b3454e1b0d55e9fda7da0b792e5ae78_cgraph.png rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_open_dream_installer_a6b3454e1b0d55e9fda7da0b792e5ae78_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_open_dream_installer_a6bbfa8809316fbf016f231d630ad56f3_cgraph.map (85%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_open_dream_installer_a6bbfa8809316fbf016f231d630ad56f3_cgraph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_open_dream_installer_a6bbfa8809316fbf016f231d630ad56f3_cgraph.png rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_posix_byond_installer_add5c0dbae1b68b81b1ddad5f73307e7f_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_posix_byond_installer_a98b3d4659e9a7927e6661cca2e08ec8f_cgraph.map (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_posix_byond_installer_add5c0dbae1b68b81b1ddad5f73307e7f_cgraph.md5 => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_posix_byond_installer_a98b3d4659e9a7927e6661cca2e08ec8f_cgraph.md5 (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_posix_byond_installer_add5c0dbae1b68b81b1ddad5f73307e7f_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_posix_byond_installer_a98b3d4659e9a7927e6661cca2e08ec8f_cgraph.png (100%) delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a1a246ed532bfa00b0e471a7fa51f2c17_icgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_af696117e411ba59dd94692141e3885c6_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a268c1e9ab92857d3bced172e22850b24_cgraph.map (98%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a268c1e9ab92857d3bced172e22850b24_cgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_af696117e411ba59dd94692141e3885c6_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a268c1e9ab92857d3bced172e22850b24_cgraph.png (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a1a246ed532bfa00b0e471a7fa51f2c17_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a4b1078675acc49bd3beea10b2dcf0075_cgraph.map (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a1a246ed532bfa00b0e471a7fa51f2c17_cgraph.md5 => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a4b1078675acc49bd3beea10b2dcf0075_cgraph.md5 (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a1a246ed532bfa00b0e471a7fa51f2c17_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a4b1078675acc49bd3beea10b2dcf0075_cgraph.png (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a1a246ed532bfa00b0e471a7fa51f2c17_icgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a4b1078675acc49bd3beea10b2dcf0075_icgraph.map (93%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a4b1078675acc49bd3beea10b2dcf0075_icgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a1a246ed532bfa00b0e471a7fa51f2c17_icgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_a4b1078675acc49bd3beea10b2dcf0075_icgraph.png (100%) delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_byond_installer_af696117e411ba59dd94692141e3885c6_cgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_ab934a7299ca217f93f49b4be99ae2188_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_aafeac2268b4c3375e79162b461908e8f_cgraph.map (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_ab934a7299ca217f93f49b4be99ae2188_cgraph.md5 => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_aafeac2268b4c3375e79162b461908e8f_cgraph.md5 (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_ab934a7299ca217f93f49b4be99ae2188_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_aafeac2268b4c3375e79162b461908e8f_cgraph.png (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_ab934a7299ca217f93f49b4be99ae2188_icgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_aafeac2268b4c3375e79162b461908e8f_icgraph.map (90%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_aafeac2268b4c3375e79162b461908e8f_icgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_ab934a7299ca217f93f49b4be99ae2188_icgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_aafeac2268b4c3375e79162b461908e8f_icgraph.png (100%) delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_ab934a7299ca217f93f49b4be99ae2188_icgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_af44c356e8e1919479866587c37951dde_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_abfd28aaba98525c2eed2f1ff7a670bc1_cgraph.map (96%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_abfd28aaba98525c2eed2f1ff7a670bc1_cgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_af44c356e8e1919479866587c37951dde_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_abfd28aaba98525c2eed2f1ff7a670bc1_cgraph.png (100%) delete mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_windows_open_dream_installer_af44c356e8e1919479866587c37951dde_cgraph.md5 rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_a03b7fcc306123e90e2afd2eb8b40798d_cgraph.map => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_a20f2dd7d15d1061be790cadd1e44a092_cgraph.map (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_a03b7fcc306123e90e2afd2eb8b40798d_cgraph.md5 => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_a20f2dd7d15d1061be790cadd1e44a092_cgraph.md5 (100%) rename class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_a03b7fcc306123e90e2afd2eb8b40798d_cgraph.png => class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_a20f2dd7d15d1061be790cadd1e44a092_cgraph.png (100%) create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_aa642e3229a7f07751fa9064bba5049a0_cgraph.map create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_aa642e3229a7f07751fa9064bba5049a0_cgraph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_controller_aa642e3229a7f07751fa9064bba5049a0_cgraph.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_extensions_1_1_i_o_manager_extensions-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_extensions_1_1_i_o_manager_extensions.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_extensions_1_1_i_o_manager_extensions_a459efcb9fca5ac36396eb21dbd3b40c6_cgraph.map create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_extensions_1_1_i_o_manager_extensions_a459efcb9fca5ac36396eb21dbd3b40c6_cgraph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_extensions_1_1_i_o_manager_extensions_a459efcb9fca5ac36396eb21dbd3b40c6_cgraph.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service__coll__graph.map create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service__coll__graph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service__coll__graph.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service__inherit__graph.map create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service__inherit__graph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_dump_service__inherit__graph.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper_a6ce9bc97f5e0fe832f2a1a5653365b64_cgraph.map create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper_a6ce9bc97f5e0fe832f2a1a5653365b64_cgraph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper_a6ce9bc97f5e0fe832f2a1a5653365b64_cgraph.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper_a6ce9bc97f5e0fe832f2a1a5653365b64_icgraph.map create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper_a6ce9bc97f5e0fe832f2a1a5653365b64_icgraph.md5 create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_system_1_1_dotnet_helper_a6ce9bc97f5e0fe832f2a1a5653365b64_icgraph.png create mode 100644 inherit_graph_195.map create mode 100644 inherit_graph_195.md5 create mode 100644 inherit_graph_195.png create mode 100644 inherit_graph_196.map create mode 100644 inherit_graph_196.md5 create mode 100644 inherit_graph_196.png create mode 100644 inherit_graph_197.map create mode 100644 inherit_graph_197.md5 create mode 100644 inherit_graph_197.png rename interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_i_engine_installer_a9ad4d33b897f1228ce90a2d430d9e880_icgraph.map => interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_i_engine_installer_a96982c374c0d5d56779125fce7c933be_icgraph.map (90%) create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_i_engine_installer_a96982c374c0d5d56779125fce7c933be_icgraph.md5 rename interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_i_engine_installer_a9ad4d33b897f1228ce90a2d430d9e880_icgraph.png => interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_i_engine_installer_a96982c374c0d5d56779125fce7c933be_icgraph.png (100%) delete mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_engine_1_1_i_engine_installer_a9ad4d33b897f1228ce90a2d430d9e880_icgraph.md5 create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service__inherit__graph.map create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service__inherit__graph.md5 create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service__inherit__graph.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service_aa93e6886542a8c4d273f887ca134b1aa_icgraph.map create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service_aa93e6886542a8c4d273f887ca134b1aa_icgraph.md5 create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_dotnet_dump_service_aa93e6886542a8c4d273f887ca134b1aa_icgraph.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_process_base_a10a5f52164b7c397bcefda36c8b99bbe_icgraph.map create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_process_base_a10a5f52164b7c397bcefda36c8b99bbe_icgraph.md5 create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_system_1_1_i_process_base_a10a5f52164b7c397bcefda36c8b99bbe_icgraph.png diff --git a/_application_8cs_source.html b/_application_8cs_source.html index baa4937b64..188cba67ca 100644 --- a/_application_8cs_source.html +++ b/_application_8cs_source.html @@ -413,289 +413,288 @@ $(function() {
365 }
366
367 // only global repo manager should be for the OD repo
-
368 var openDreamRepositoryDirectory = ioManager.ConcatPath(
-
369 Environment.GetFolderPath(
-
370 Environment.SpecialFolder.LocalApplicationData,
-
371 Environment.SpecialFolderOption.DoNotVerify),
-
372 assemblyInformationProvider.VersionPrefix,
-
373 "OpenDreamRepository");
-
374 services.AddSingleton(
-
375 services => services
-
376 .GetRequiredService<IRepositoryManagerFactory>()
-
377 .CreateRepositoryManager(
-
378 new ResolvingIOManager(
-
379 services.GetRequiredService<IIOManager>(),
-
380 openDreamRepositoryDirectory),
-
381 new NoopEventConsumer()));
-
382
-
383 services.AddSingleton(
-
384 serviceProvider => new Dictionary<EngineType, IEngineInstaller>
-
385 {
-
386 { EngineType.Byond, serviceProvider.GetRequiredService<ByondInstallerBase>() },
-
387 { EngineType.OpenDream, serviceProvider.GetRequiredService<OpenDreamInstaller>() },
-
388 }
-
389 .ToFrozenDictionary());
-
390 services.AddSingleton<IEngineInstaller, DelegatingEngineInstaller>();
-
391
-
392 if (postSetupServices.InternalConfiguration.UsingSystemD)
-
393 services.AddHostedService<SystemDManager>();
-
394
-
395 // configure file transfer services
-
396 services.AddSingleton<FileTransferService>();
-
397 services.AddSingleton<IFileTransferStreamHandler>(x => x.GetRequiredService<FileTransferService>());
-
398 services.AddSingleton<IFileTransferTicketProvider>(x => x.GetRequiredService<FileTransferService>());
-
399 services.AddTransient<IActionResultExecutor<LimitedStreamResult>, LimitedStreamResultExecutor>();
-
400
-
401 // configure swarm service
-
402 services.AddSingleton<SwarmService>();
-
403 services.AddSingleton<ISwarmService>(x => x.GetRequiredService<SwarmService>());
-
404 services.AddSingleton<ISwarmOperations>(x => x.GetRequiredService<SwarmService>());
-
405 services.AddSingleton<ISwarmServiceController>(x => x.GetRequiredService<SwarmService>());
-
406
-
407 // configure component services
-
408 services.AddSingleton<IPortAllocator, PortAllocator>();
-
409 services.AddSingleton<IInstanceFactory, InstanceFactory>();
-
410 services.AddSingleton<IGitRemoteFeaturesFactory, GitRemoteFeaturesFactory>();
-
411 services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
-
412 services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
-
413 services.AddSingleton<IRepositoryManagerFactory, RepostoryManagerFactory>();
-
414 services.AddSingleton<IRemoteDeploymentManagerFactory, RemoteDeploymentManagerFactory>();
-
415 services.AddChatProviderFactory();
-
416 services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
-
417 services.AddSingleton<IServerUpdater, ServerUpdater>();
-
418 services.AddSingleton<IServerUpdateInitiator, ServerUpdateInitiator>();
-
419
-
420 // configure misc services
-
421 services.AddSingleton<IProcessExecutor, ProcessExecutor>();
-
422 services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
-
423 services.AddSingleton<IServerPortProvider, ServerPortProivder>();
-
424 services.AddSingleton<ITopicClientFactory, TopicClientFactory>();
-
425 services.AddHostedService<CommandPipeManager>();
-
426
-
427 services.AddFileDownloader();
-
428 services.AddGitHub();
-
429
-
430 // configure root services
-
431 services.AddSingleton<JobService>();
-
432 services.AddSingleton<IJobService>(provider => provider.GetRequiredService<JobService>());
-
433 services.AddSingleton<IJobsHubUpdater>(provider => provider.GetRequiredService<JobService>());
-
434 services.AddSingleton<IJobManager>(x => x.GetRequiredService<IJobService>());
-
435 services.AddSingleton<JobsHubGroupMapper>();
-
436 services.AddSingleton<IPermissionsUpdateNotifyee>(provider => provider.GetRequiredService<JobsHubGroupMapper>());
-
437 services.AddSingleton<IHostedService>(x => x.GetRequiredService<JobsHubGroupMapper>()); // bit of a hack, but we need this to load immediated
-
438
-
439 services.AddSingleton<InstanceManager>();
-
440 services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
-
441 services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
-
442 }
-
443
-
456 public void Configure(
-
457 IApplicationBuilder applicationBuilder,
-
458 IServerControl serverControl,
-
459 ITokenFactory tokenFactory,
-
460 IServerPortProvider serverPortProvider,
-
461 IAssemblyInformationProvider assemblyInformationProvider,
-
462 IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
-
463 IOptions<GeneralConfiguration> generalConfigurationOptions,
-
464 IOptions<SwarmConfiguration> swarmConfigurationOptions,
-
465 ILogger<Application> logger)
-
466 {
-
467 ArgumentNullException.ThrowIfNull(applicationBuilder);
-
468 ArgumentNullException.ThrowIfNull(serverControl);
-
469
-
470 this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
-
471
-
472 ArgumentNullException.ThrowIfNull(serverPortProvider);
-
473 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
-
474
-
475 var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
-
476 var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
477 var swarmConfiguration = swarmConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(swarmConfigurationOptions));
-
478
-
479 ArgumentNullException.ThrowIfNull(logger);
-
480
-
481 logger.LogDebug("Content Root: {contentRoot}", hostingEnvironment.ContentRootPath);
-
482 logger.LogTrace("Web Root: {webRoot}", hostingEnvironment.WebRootPath);
-
483
-
484 // setup the HTTP request pipeline
-
485 // Add additional logging context to the request
-
486 applicationBuilder.UseAdditionalRequestLoggingContext(swarmConfiguration);
-
487
-
488 // Wrap exceptions in a 500 (ErrorMessage) response
-
489 applicationBuilder.UseServerErrorHandling();
-
490
-
491 // Add the X-Powered-By response header
-
492 applicationBuilder.UseServerBranding(assemblyInformationProvider);
-
493
-
494 // Add the X-Accel-Buffering response header
-
495 applicationBuilder.UseDisabledNginxProxyBuffering();
-
496
-
497 // suppress OperationCancelledExceptions, they are just aborted HTTP requests
-
498 applicationBuilder.UseCancelledRequestSuppression();
-
499
-
500 // 503 requests made while the application is starting
-
501 applicationBuilder.UseAsyncInitialization<IInstanceManager>(
-
502 (instanceManager, cancellationToken) => instanceManager.Ready.WaitAsync(cancellationToken));
-
503
-
504 if (generalConfiguration.HostApiDocumentation)
-
505 {
-
506 var siteDocPath = Routes.ApiRoot + $"doc/{SwaggerConfiguration.DocumentName}.json";
-
507 if (!String.IsNullOrWhiteSpace(controlPanelConfiguration.PublicPath))
-
508 siteDocPath = controlPanelConfiguration.PublicPath.TrimEnd('/') + siteDocPath;
-
509
-
510 applicationBuilder.UseSwagger(options =>
-
511 {
-
512 options.RouteTemplate = Routes.ApiRoot + "doc/{documentName}.{json|yaml}";
-
513 });
-
514 applicationBuilder.UseSwaggerUI(options =>
-
515 {
-
516 options.RoutePrefix = SwaggerConfiguration.DocumentationSiteRouteExtension;
-
517 options.SwaggerEndpoint(siteDocPath, "TGS API");
-
518 });
-
519 logger.LogTrace("Swagger API generation enabled");
-
520 }
-
521
-
522 // spa loading if necessary
-
523 if (controlPanelConfiguration.Enable)
-
524 {
-
525 logger.LogInformation("Web control panel enabled.");
-
526 applicationBuilder.UseFileServer(new FileServerOptions
-
527 {
-
528 RequestPath = ControlPanelController.ControlPanelRoute,
-
529 EnableDefaultFiles = true,
-
530 EnableDirectoryBrowsing = false,
-
531 RedirectToAppendTrailingSlash = false,
-
532 });
-
533 }
-
534 else
-
535#if NO_WEBPANEL
-
536 logger.LogDebug("Web control panel was not included in TGS build!");
-
537#else
-
538 logger.LogTrace("Web control panel disabled!");
-
539#endif
-
540
-
541 // Enable endpoint routing
-
542 applicationBuilder.UseRouting();
-
543
-
544 // Set up CORS based on configuration if necessary
-
545 Action<CorsPolicyBuilder>? corsBuilder = null;
-
546 if (controlPanelConfiguration.AllowAnyOrigin)
-
547 {
-
548 logger.LogTrace("Access-Control-Allow-Origin: *");
-
549 corsBuilder = builder => builder.SetIsOriginAllowed(_ => true);
-
550 }
-
551 else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
-
552 {
-
553 logger.LogTrace("Access-Control-Allow-Origin: {allowedOrigins}", String.Join(',', controlPanelConfiguration.AllowedOrigins));
-
554 corsBuilder = builder => builder.WithOrigins([.. controlPanelConfiguration.AllowedOrigins]);
-
555 }
-
556
-
557 var originalBuilder = corsBuilder;
-
558 corsBuilder = builder =>
-
559 {
-
560 builder
-
561 .AllowAnyHeader()
-
562 .AllowAnyMethod()
-
563 .AllowCredentials()
-
564 .SetPreflightMaxAge(TimeSpan.FromDays(1));
-
565 originalBuilder?.Invoke(builder);
-
566 };
-
567 applicationBuilder.UseCors(corsBuilder);
-
568
-
569 // validate the API version
-
570 applicationBuilder.UseApiCompatibility();
-
571
-
572 // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
-
573 applicationBuilder.UseAuthentication();
-
574
-
575 // enable authorization on endpoints
-
576 applicationBuilder.UseAuthorization();
-
577
-
578 // suppress and log database exceptions
-
579 applicationBuilder.UseDbConflictHandling();
-
580
-
581 // setup endpoints
-
582 applicationBuilder.UseEndpoints(endpoints =>
-
583 {
-
584 // access to the signalR jobs hub
-
585 endpoints.MapHub<JobsHub>(
-
586 Routes.JobsHub,
-
587 options =>
-
588 {
-
589 options.Transports = HttpTransportType.ServerSentEvents;
-
590 options.CloseOnAuthenticationExpiration = true;
-
591 })
-
592 .RequireAuthorization()
-
593 .RequireCors(corsBuilder);
-
594
-
595 // majority of handling is done in the controllers
-
596 endpoints.MapControllers();
-
597 });
-
598
-
599 // 404 anything that gets this far
-
600 // End of request pipeline setup
-
601 logger.LogTrace("Configuration version: {configVersion}", GeneralConfiguration.CurrentConfigVersion);
-
602 logger.LogTrace("DMAPI Interop version: {interopVersion}", DMApiConstants.InteropVersion);
-
603 if (controlPanelConfiguration.Enable)
-
604 logger.LogTrace("Webpanel version: {webCPVersion}", MasterVersionsAttribute.Instance.RawWebpanelVersion);
-
605
-
606 logger.LogDebug("Starting hosting on port {httpApiPort}...", serverPortProvider.HttpApiPort);
-
607 }
-
608
-
610 protected override void ConfigureHostedService(IServiceCollection services)
-
611 => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
-
612
-
617 void ConfigureAuthenticationPipeline(IServiceCollection services)
-
618 {
-
619 services.AddHttpContextAccessor();
-
620 services.AddScoped<IApiHeadersProvider, ApiHeadersProvider>();
-
621 services.AddScoped<AuthenticationContextFactory>();
-
622 services.AddScoped<IAuthenticationContextFactory>(provider => provider.GetRequiredService<AuthenticationContextFactory>());
-
623
-
624 // what if you
-
625 // wanted to just do this:
-
626 // return provider.GetRequiredService<AuthenticationContextFactory>().CurrentAuthenticationContext
-
627 // But M$ said
-
628 // https://stackoverflow.com/questions/56792917/scoped-services-in-asp-net-core-with-signalr-hubs
-
629 services.AddScoped(provider => (provider
-
630 .GetRequiredService<IHttpContextAccessor>()
-
631 .HttpContext ?? throw new InvalidOperationException($"Unable to resolve {nameof(IAuthenticationContext)} due to no HttpContext being available!"))
-
632 .RequestServices
-
633 .GetRequiredService<AuthenticationContextFactory>()
-
634 .CurrentAuthenticationContext);
-
635 services.AddScoped<IClaimsTransformation, AuthenticationContextClaimsTransformation>();
-
636
-
637 services
-
638 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
-
639 .AddJwtBearer(jwtBearerOptions =>
-
640 {
-
641 // this line isn't actually run until the first request is made
-
642 // at that point tokenFactory will be populated
-
643 jwtBearerOptions.TokenValidationParameters = tokenFactory?.ValidationParameters ?? throw new InvalidOperationException("tokenFactory not initialized!");
-
644 jwtBearerOptions.MapInboundClaims = false;
-
645 jwtBearerOptions.Events = new JwtBearerEvents
-
646 {
-
647 OnMessageReceived = context =>
-
648 {
-
649 if (String.IsNullOrWhiteSpace(context.Token))
-
650 {
-
651 var accessToken = context.Request.Query["access_token"];
-
652 var path = context.HttpContext.Request.Path;
-
653
-
654 if (!String.IsNullOrWhiteSpace(accessToken) &&
-
655 path.StartsWithSegments(Routes.HubsRoot, StringComparison.OrdinalIgnoreCase))
-
656 {
-
657 context.Token = accessToken;
-
658 }
-
659 }
-
660
-
661 return Task.CompletedTask;
-
662 },
-
663 };
-
664 });
-
665 }
-
666 }
-
667}
+
368 // god help me if we need more
+
369 var openDreamRepositoryDirectory = ioManager.ConcatPath(
+
370 ioManager.GetPathInLocalDirectory(assemblyInformationProvider),
+
371 "OpenDreamRepository");
+
372 services.AddSingleton(
+
373 services => services
+
374 .GetRequiredService<IRepositoryManagerFactory>()
+
375 .CreateRepositoryManager(
+
376 new ResolvingIOManager(
+
377 services.GetRequiredService<IIOManager>(),
+
378 openDreamRepositoryDirectory),
+
379 new NoopEventConsumer()));
+
380
+
381 services.AddSingleton(
+
382 serviceProvider => new Dictionary<EngineType, IEngineInstaller>
+
383 {
+
384 { EngineType.Byond, serviceProvider.GetRequiredService<ByondInstallerBase>() },
+
385 { EngineType.OpenDream, serviceProvider.GetRequiredService<OpenDreamInstaller>() },
+
386 }
+
387 .ToFrozenDictionary());
+
388 services.AddSingleton<IEngineInstaller, DelegatingEngineInstaller>();
+
389
+
390 if (postSetupServices.InternalConfiguration.UsingSystemD)
+
391 services.AddHostedService<SystemDManager>();
+
392
+
393 // configure file transfer services
+
394 services.AddSingleton<FileTransferService>();
+
395 services.AddSingleton<IFileTransferStreamHandler>(x => x.GetRequiredService<FileTransferService>());
+
396 services.AddSingleton<IFileTransferTicketProvider>(x => x.GetRequiredService<FileTransferService>());
+
397 services.AddTransient<IActionResultExecutor<LimitedStreamResult>, LimitedStreamResultExecutor>();
+
398
+
399 // configure swarm service
+
400 services.AddSingleton<SwarmService>();
+
401 services.AddSingleton<ISwarmService>(x => x.GetRequiredService<SwarmService>());
+
402 services.AddSingleton<ISwarmOperations>(x => x.GetRequiredService<SwarmService>());
+
403 services.AddSingleton<ISwarmServiceController>(x => x.GetRequiredService<SwarmService>());
+
404
+
405 // configure component services
+
406 services.AddSingleton<IPortAllocator, PortAllocator>();
+
407 services.AddSingleton<IInstanceFactory, InstanceFactory>();
+
408 services.AddSingleton<IGitRemoteFeaturesFactory, GitRemoteFeaturesFactory>();
+
409 services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
+
410 services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
+
411 services.AddSingleton<IRepositoryManagerFactory, RepostoryManagerFactory>();
+
412 services.AddSingleton<IRemoteDeploymentManagerFactory, RemoteDeploymentManagerFactory>();
+
413 services.AddChatProviderFactory();
+
414 services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
+
415 services.AddSingleton<IServerUpdater, ServerUpdater>();
+
416 services.AddSingleton<IServerUpdateInitiator, ServerUpdateInitiator>();
+
417 services.AddSingleton<IDotnetDumpService, DotnetDumpService>();
+
418
+
419 // configure misc services
+
420 services.AddSingleton<IProcessExecutor, ProcessExecutor>();
+
421 services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
+
422 services.AddSingleton<IServerPortProvider, ServerPortProivder>();
+
423 services.AddSingleton<ITopicClientFactory, TopicClientFactory>();
+
424 services.AddHostedService<CommandPipeManager>();
+
425
+
426 services.AddFileDownloader();
+
427 services.AddGitHub();
+
428
+
429 // configure root services
+
430 services.AddSingleton<JobService>();
+
431 services.AddSingleton<IJobService>(provider => provider.GetRequiredService<JobService>());
+
432 services.AddSingleton<IJobsHubUpdater>(provider => provider.GetRequiredService<JobService>());
+
433 services.AddSingleton<IJobManager>(x => x.GetRequiredService<IJobService>());
+
434 services.AddSingleton<JobsHubGroupMapper>();
+
435 services.AddSingleton<IPermissionsUpdateNotifyee>(provider => provider.GetRequiredService<JobsHubGroupMapper>());
+
436 services.AddSingleton<IHostedService>(x => x.GetRequiredService<JobsHubGroupMapper>()); // bit of a hack, but we need this to load immediated
+
437
+
438 services.AddSingleton<InstanceManager>();
+
439 services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
+
440 services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
+
441 }
+
442
+
455 public void Configure(
+
456 IApplicationBuilder applicationBuilder,
+
457 IServerControl serverControl,
+
458 ITokenFactory tokenFactory,
+
459 IServerPortProvider serverPortProvider,
+
460 IAssemblyInformationProvider assemblyInformationProvider,
+
461 IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
+
462 IOptions<GeneralConfiguration> generalConfigurationOptions,
+
463 IOptions<SwarmConfiguration> swarmConfigurationOptions,
+
464 ILogger<Application> logger)
+
465 {
+
466 ArgumentNullException.ThrowIfNull(applicationBuilder);
+
467 ArgumentNullException.ThrowIfNull(serverControl);
+
468
+
469 this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
+
470
+
471 ArgumentNullException.ThrowIfNull(serverPortProvider);
+
472 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
+
473
+
474 var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
+
475 var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
476 var swarmConfiguration = swarmConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(swarmConfigurationOptions));
+
477
+
478 ArgumentNullException.ThrowIfNull(logger);
+
479
+
480 logger.LogDebug("Content Root: {contentRoot}", hostingEnvironment.ContentRootPath);
+
481 logger.LogTrace("Web Root: {webRoot}", hostingEnvironment.WebRootPath);
+
482
+
483 // setup the HTTP request pipeline
+
484 // Add additional logging context to the request
+
485 applicationBuilder.UseAdditionalRequestLoggingContext(swarmConfiguration);
+
486
+
487 // Wrap exceptions in a 500 (ErrorMessage) response
+
488 applicationBuilder.UseServerErrorHandling();
+
489
+
490 // Add the X-Powered-By response header
+
491 applicationBuilder.UseServerBranding(assemblyInformationProvider);
+
492
+
493 // Add the X-Accel-Buffering response header
+
494 applicationBuilder.UseDisabledNginxProxyBuffering();
+
495
+
496 // suppress OperationCancelledExceptions, they are just aborted HTTP requests
+
497 applicationBuilder.UseCancelledRequestSuppression();
+
498
+
499 // 503 requests made while the application is starting
+
500 applicationBuilder.UseAsyncInitialization<IInstanceManager>(
+
501 (instanceManager, cancellationToken) => instanceManager.Ready.WaitAsync(cancellationToken));
+
502
+
503 if (generalConfiguration.HostApiDocumentation)
+
504 {
+
505 var siteDocPath = Routes.ApiRoot + $"doc/{SwaggerConfiguration.DocumentName}.json";
+
506 if (!String.IsNullOrWhiteSpace(controlPanelConfiguration.PublicPath))
+
507 siteDocPath = controlPanelConfiguration.PublicPath.TrimEnd('/') + siteDocPath;
+
508
+
509 applicationBuilder.UseSwagger(options =>
+
510 {
+
511 options.RouteTemplate = Routes.ApiRoot + "doc/{documentName}.{json|yaml}";
+
512 });
+
513 applicationBuilder.UseSwaggerUI(options =>
+
514 {
+
515 options.RoutePrefix = SwaggerConfiguration.DocumentationSiteRouteExtension;
+
516 options.SwaggerEndpoint(siteDocPath, "TGS API");
+
517 });
+
518 logger.LogTrace("Swagger API generation enabled");
+
519 }
+
520
+
521 // spa loading if necessary
+
522 if (controlPanelConfiguration.Enable)
+
523 {
+
524 logger.LogInformation("Web control panel enabled.");
+
525 applicationBuilder.UseFileServer(new FileServerOptions
+
526 {
+
527 RequestPath = ControlPanelController.ControlPanelRoute,
+
528 EnableDefaultFiles = true,
+
529 EnableDirectoryBrowsing = false,
+
530 RedirectToAppendTrailingSlash = false,
+
531 });
+
532 }
+
533 else
+
534#if NO_WEBPANEL
+
535 logger.LogDebug("Web control panel was not included in TGS build!");
+
536#else
+
537 logger.LogTrace("Web control panel disabled!");
+
538#endif
+
539
+
540 // Enable endpoint routing
+
541 applicationBuilder.UseRouting();
+
542
+
543 // Set up CORS based on configuration if necessary
+
544 Action<CorsPolicyBuilder>? corsBuilder = null;
+
545 if (controlPanelConfiguration.AllowAnyOrigin)
+
546 {
+
547 logger.LogTrace("Access-Control-Allow-Origin: *");
+
548 corsBuilder = builder => builder.SetIsOriginAllowed(_ => true);
+
549 }
+
550 else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
+
551 {
+
552 logger.LogTrace("Access-Control-Allow-Origin: {allowedOrigins}", String.Join(',', controlPanelConfiguration.AllowedOrigins));
+
553 corsBuilder = builder => builder.WithOrigins([.. controlPanelConfiguration.AllowedOrigins]);
+
554 }
+
555
+
556 var originalBuilder = corsBuilder;
+
557 corsBuilder = builder =>
+
558 {
+
559 builder
+
560 .AllowAnyHeader()
+
561 .AllowAnyMethod()
+
562 .AllowCredentials()
+
563 .SetPreflightMaxAge(TimeSpan.FromDays(1));
+
564 originalBuilder?.Invoke(builder);
+
565 };
+
566 applicationBuilder.UseCors(corsBuilder);
+
567
+
568 // validate the API version
+
569 applicationBuilder.UseApiCompatibility();
+
570
+
571 // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
+
572 applicationBuilder.UseAuthentication();
+
573
+
574 // enable authorization on endpoints
+
575 applicationBuilder.UseAuthorization();
+
576
+
577 // suppress and log database exceptions
+
578 applicationBuilder.UseDbConflictHandling();
+
579
+
580 // setup endpoints
+
581 applicationBuilder.UseEndpoints(endpoints =>
+
582 {
+
583 // access to the signalR jobs hub
+
584 endpoints.MapHub<JobsHub>(
+
585 Routes.JobsHub,
+
586 options =>
+
587 {
+
588 options.Transports = HttpTransportType.ServerSentEvents;
+
589 options.CloseOnAuthenticationExpiration = true;
+
590 })
+
591 .RequireAuthorization()
+
592 .RequireCors(corsBuilder);
+
593
+
594 // majority of handling is done in the controllers
+
595 endpoints.MapControllers();
+
596 });
+
597
+
598 // 404 anything that gets this far
+
599 // End of request pipeline setup
+
600 logger.LogTrace("Configuration version: {configVersion}", GeneralConfiguration.CurrentConfigVersion);
+
601 logger.LogTrace("DMAPI Interop version: {interopVersion}", DMApiConstants.InteropVersion);
+
602 if (controlPanelConfiguration.Enable)
+
603 logger.LogTrace("Webpanel version: {webCPVersion}", MasterVersionsAttribute.Instance.RawWebpanelVersion);
+
604
+
605 logger.LogDebug("Starting hosting on port {httpApiPort}...", serverPortProvider.HttpApiPort);
+
606 }
+
607
+
609 protected override void ConfigureHostedService(IServiceCollection services)
+
610 => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
+
611
+
616 void ConfigureAuthenticationPipeline(IServiceCollection services)
+
617 {
+
618 services.AddHttpContextAccessor();
+
619 services.AddScoped<IApiHeadersProvider, ApiHeadersProvider>();
+
620 services.AddScoped<AuthenticationContextFactory>();
+
621 services.AddScoped<IAuthenticationContextFactory>(provider => provider.GetRequiredService<AuthenticationContextFactory>());
+
622
+
623 // what if you
+
624 // wanted to just do this:
+
625 // return provider.GetRequiredService<AuthenticationContextFactory>().CurrentAuthenticationContext
+
626 // But M$ said
+
627 // https://stackoverflow.com/questions/56792917/scoped-services-in-asp-net-core-with-signalr-hubs
+
628 services.AddScoped(provider => (provider
+
629 .GetRequiredService<IHttpContextAccessor>()
+
630 .HttpContext ?? throw new InvalidOperationException($"Unable to resolve {nameof(IAuthenticationContext)} due to no HttpContext being available!"))
+
631 .RequestServices
+
632 .GetRequiredService<AuthenticationContextFactory>()
+
633 .CurrentAuthenticationContext);
+
634 services.AddScoped<IClaimsTransformation, AuthenticationContextClaimsTransformation>();
+
635
+
636 services
+
637 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+
638 .AddJwtBearer(jwtBearerOptions =>
+
639 {
+
640 // this line isn't actually run until the first request is made
+
641 // at that point tokenFactory will be populated
+
642 jwtBearerOptions.TokenValidationParameters = tokenFactory?.ValidationParameters ?? throw new InvalidOperationException("tokenFactory not initialized!");
+
643 jwtBearerOptions.MapInboundClaims = false;
+
644 jwtBearerOptions.Events = new JwtBearerEvents
+
645 {
+
646 OnMessageReceived = context =>
+
647 {
+
648 if (String.IsNullOrWhiteSpace(context.Token))
+
649 {
+
650 var accessToken = context.Request.Query["access_token"];
+
651 var path = context.HttpContext.Request.Path;
+
652
+
653 if (!String.IsNullOrWhiteSpace(accessToken) &&
+
654 path.StartsWithSegments(Routes.HubsRoot, StringComparison.OrdinalIgnoreCase))
+
655 {
+
656 context.Token = accessToken;
+
657 }
+
658 }
+
659
+
660 return Task.CompletedTask;
+
661 },
+
662 };
+
663 });
+
664 }
+
665 }
+
666}
@@ -707,7 +706,7 @@ $(function() {
Base implementation of IEngineInstaller for EngineType.Byond.
Implementation of IEngineInstaller that forwards calls to different IEngineInstaller based on their a...
-
Implementation of IEngineInstaller for EngineType.OpenDream.
+
Implementation of IEngineInstaller for EngineType.OpenDream.
IEngineInstaller for Posix systems.
IEngineInstaller for windows systems.
Implementation of OpenDreamInstaller for Windows systems.
@@ -744,9 +743,9 @@ $(function() {
static void AddWatchdog< TSystemWatchdogFactory >(IServiceCollection services, IPostSetupServices postSetupServices)
Adds the IWatchdogFactory implementation.
Definition: Application.cs:102
void ConfigureServices(IServiceCollection services, IAssemblyInformationProvider assemblyInformationProvider, IIOManager ioManager, IPostSetupServices postSetupServices)
Configure the Application's services .
Definition: Application.cs:131
static IServerFactory CreateDefaultServerFactory()
Create the default IServerFactory.
Definition: Application.cs:87
-
void ConfigureAuthenticationPipeline(IServiceCollection services)
Configure the services for the authentication pipeline.
Definition: Application.cs:617
+
void ConfigureAuthenticationPipeline(IServiceCollection services)
Configure the services for the authentication pipeline.
Definition: Application.cs:616
ITokenFactory? tokenFactory
The ITokenFactory for the Application.
Definition: Application.cs:81
-
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IServerPortProvider serverPortProvider, IAssemblyInformationProvider assemblyInformationProvider, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< Application > logger)
Configure the Application.
Definition: Application.cs:456
+
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IServerPortProvider serverPortProvider, IAssemblyInformationProvider assemblyInformationProvider, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< Application > logger)
Configure the Application.
Definition: Application.cs:455
Application(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
Initializes a new instance of the Application class.
Definition: Application.cs:116
readonly IWebHostEnvironment hostingEnvironment
The IWebHostEnvironment for the Application.
Definition: Application.cs:76
Reads from the command pipe opened by the host watchdog.
@@ -784,6 +783,7 @@ $(function() {
IConfiguration Configuration
The IConfiguration for the SetupApplication.
Helps keep servers connected to the same database in sync by coordinating updates.
Definition: SwarmService.cs:36
+
Handles POSIX signals.
@@ -853,7 +853,7 @@ $(function() {
Start and stop controllers for a swarm service.
Used for swarm operations. Functions may be no-op based on configuration.
For retrieving the Assembly's location.
-
string VersionPrefix
Prefix to VersionString.
+
Service for managing the dotnet-dump installation.
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
bool IsWindows
If the current platform is a Windows platform.
For launching IProcess'.
diff --git a/_basic_watchdog_8cs_source.html b/_basic_watchdog_8cs_source.html index 19842487a9..1617067294 100644 --- a/_basic_watchdog_8cs_source.html +++ b/_basic_watchdog_8cs_source.html @@ -357,8 +357,8 @@ $(function() {
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider. DmbAvailable is a precondition. A new IDmbProvider.
Definition: DmbFactory.cs:171
Parameters necessary for duplicating a ISessionController session.
-
async ValueTask< ISessionController > LaunchNew(IDmbProvider dmbProvider, IEngineExecutableLock? currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance. A ValueTask<TResult> resultin...
-
async ValueTask< ISessionController?> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance. A ValueTask<TResult> resulting in ...
+
async ValueTask< ISessionController > LaunchNew(IDmbProvider dmbProvider, IEngineExecutableLock? currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance. A ValueTask<TResult> resultin...
+
async ValueTask< ISessionController?> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance. A ValueTask<TResult> resulting in ...
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
ValueTask Save(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation . A ValueTask representing the running operation.
diff --git a/_byond_installation_8cs_source.html b/_byond_installation_8cs_source.html index 54c7039f01..4a5046bf89 100644 --- a/_byond_installation_8cs_source.html +++ b/_byond_installation_8cs_source.html @@ -103,95 +103,97 @@ $(function() {
32
34 public override bool PreferFileLogging => false;
35
-
37 public override Task InstallationTask { get; }
+
37 public override bool UseDotnetDump => false;
38
-
42 readonly bool supportsMapThreads;
-
43
-
49 static string SecurityWord(DreamDaemonSecurity securityLevel)
-
50 {
-
51 return securityLevel switch
-
52 {
-
53 DreamDaemonSecurity.Safe => "safe",
-
54 DreamDaemonSecurity.Trusted => "trusted",
-
55 DreamDaemonSecurity.Ultrasafe => "ultrasafe",
-
56 _ => throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel)),
-
57 };
-
58 }
-
59
-
65 static string VisibilityWord(DreamDaemonVisibility visibility)
-
66 {
-
67 return visibility switch
-
68 {
-
69 DreamDaemonVisibility.Public => "public",
-
70 DreamDaemonVisibility.Private => "private",
-
71 DreamDaemonVisibility.Invisible => "invisible",
-
72 _ => throw new ArgumentOutOfRangeException(nameof(visibility), visibility, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon visibility level: {0}", visibility)),
-
73 };
-
74 }
-
75
-
86 public ByondInstallation(
-
87 IIOManager installationIOManager,
-
88 Task installationTask,
-
89 EngineVersion version,
-
90 string dreamDaemonPath,
-
91 string dreamMakerPath,
-
92 bool supportsCli,
-
93 bool supportsMapThreads)
-
94 : base(installationIOManager)
-
95 {
-
96 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
-
97 ArgumentNullException.ThrowIfNull(version);
-
98
-
99 if (version.Engine != EngineType.Byond)
-
100 throw new ArgumentException($"Invalid EngineType: {version.Engine}", nameof(version));
+
40 public override Task InstallationTask { get; }
+
41
+
45 readonly bool supportsMapThreads;
+
46
+
52 static string SecurityWord(DreamDaemonSecurity securityLevel)
+
53 {
+
54 return securityLevel switch
+
55 {
+
56 DreamDaemonSecurity.Safe => "safe",
+
57 DreamDaemonSecurity.Trusted => "trusted",
+
58 DreamDaemonSecurity.Ultrasafe => "ultrasafe",
+
59 _ => throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel)),
+
60 };
+
61 }
+
62
+
68 static string VisibilityWord(DreamDaemonVisibility visibility)
+
69 {
+
70 return visibility switch
+
71 {
+
72 DreamDaemonVisibility.Public => "public",
+
73 DreamDaemonVisibility.Private => "private",
+
74 DreamDaemonVisibility.Invisible => "invisible",
+
75 _ => throw new ArgumentOutOfRangeException(nameof(visibility), visibility, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon visibility level: {0}", visibility)),
+
76 };
+
77 }
+
78
+
89 public ByondInstallation(
+
90 IIOManager installationIOManager,
+
91 Task installationTask,
+
92 EngineVersion version,
+
93 string dreamDaemonPath,
+
94 string dreamMakerPath,
+
95 bool supportsCli,
+
96 bool supportsMapThreads)
+
97 : base(installationIOManager)
+
98 {
+
99 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
+
100 ArgumentNullException.ThrowIfNull(version);
101
-
102 Version = version ?? throw new ArgumentNullException(nameof(version));
-
103 ServerExePath = dreamDaemonPath ?? throw new ArgumentNullException(nameof(dreamDaemonPath));
-
104 CompilerExePath = dreamMakerPath ?? throw new ArgumentNullException(nameof(dreamMakerPath));
-
105 HasStandardOutput = supportsCli;
-
106 PromptsForNetworkAccess = !supportsCli;
-
107 this.supportsMapThreads = supportsMapThreads;
-
108 }
-
109
-
111 public override string FormatServerArguments(
-
112 IDmbProvider dmbProvider,
-
113 IReadOnlyDictionary<string, string> parameters,
-
114 DreamDaemonLaunchParameters launchParameters,
-
115 string? logFilePath)
-
116 {
-
117 ArgumentNullException.ThrowIfNull(dmbProvider);
-
118 ArgumentNullException.ThrowIfNull(parameters);
-
119 ArgumentNullException.ThrowIfNull(launchParameters);
-
120
-
121 var parametersString = EncodeParameters(parameters, launchParameters);
-
122
-
123 var arguments = String.Format(
-
124 CultureInfo.InvariantCulture,
-
125 "\"{0}\" -port {1} -ports 1-65535 {2}-close -verbose -{3} -{4}{5}{6}{7} -params \"{8}\"",
-
126 dmbProvider.DmbName,
-
127 launchParameters.Port!.Value,
-
128 launchParameters.AllowWebClient!.Value
-
129 ? "-webclient "
-
130 : String.Empty,
-
131 SecurityWord(launchParameters.SecurityLevel!.Value),
-
132 VisibilityWord(launchParameters.Visibility!.Value),
-
133 logFilePath != null
-
134 ? $" -logself -log {logFilePath}"
-
135 : String.Empty, // DD doesn't output anything if -logself is set???
-
136 launchParameters.StartProfiler!.Value
-
137 ? " -profile"
-
138 : String.Empty,
-
139 supportsMapThreads && launchParameters.MapThreads!.Value != 0
-
140 ? $" -map-threads {launchParameters.MapThreads.Value}"
+
102 if (version.Engine != EngineType.Byond)
+
103 throw new ArgumentException($"Invalid EngineType: {version.Engine}", nameof(version));
+
104
+
105 Version = version ?? throw new ArgumentNullException(nameof(version));
+
106 ServerExePath = dreamDaemonPath ?? throw new ArgumentNullException(nameof(dreamDaemonPath));
+
107 CompilerExePath = dreamMakerPath ?? throw new ArgumentNullException(nameof(dreamMakerPath));
+
108 HasStandardOutput = supportsCli;
+
109 PromptsForNetworkAccess = !supportsCli;
+
110 this.supportsMapThreads = supportsMapThreads;
+
111 }
+
112
+
114 public override string FormatServerArguments(
+
115 IDmbProvider dmbProvider,
+
116 IReadOnlyDictionary<string, string> parameters,
+
117 DreamDaemonLaunchParameters launchParameters,
+
118 string? logFilePath)
+
119 {
+
120 ArgumentNullException.ThrowIfNull(dmbProvider);
+
121 ArgumentNullException.ThrowIfNull(parameters);
+
122 ArgumentNullException.ThrowIfNull(launchParameters);
+
123
+
124 var parametersString = EncodeParameters(parameters, launchParameters);
+
125
+
126 var arguments = String.Format(
+
127 CultureInfo.InvariantCulture,
+
128 "\"{0}\" -port {1} -ports 1-65535 {2}-close -verbose -{3} -{4}{5}{6}{7} -params \"{8}\"",
+
129 dmbProvider.DmbName,
+
130 launchParameters.Port!.Value,
+
131 launchParameters.AllowWebClient!.Value
+
132 ? "-webclient "
+
133 : String.Empty,
+
134 SecurityWord(launchParameters.SecurityLevel!.Value),
+
135 VisibilityWord(launchParameters.Visibility!.Value),
+
136 logFilePath != null
+
137 ? $" -logself -log {logFilePath}"
+
138 : String.Empty, // DD doesn't output anything if -logself is set???
+
139 launchParameters.StartProfiler!.Value
+
140 ? " -profile"
141 : String.Empty,
-
142 parametersString);
-
143 return arguments;
-
144 }
-
145
-
147 public override string FormatCompilerArguments(string dmePath)
-
148 => $"-clean \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
-
149 }
-
150}
+
142 supportsMapThreads && launchParameters.MapThreads!.Value != 0
+
143 ? $" -map-threads {launchParameters.MapThreads.Value}"
+
144 : String.Empty,
+
145 parametersString);
+
146 return arguments;
+
147 }
+
148
+
150 public override string FormatCompilerArguments(string dmePath)
+
151 => $"-clean \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
+
152 }
+
153}
Information about an engine installation.
EngineType? Engine
The EngineType.
Launch settings for DreamDaemon.
@@ -202,21 +204,22 @@ $(function() {
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon. No-op for EngineType.OpenDream.
uint? MapThreads
If DreamDaemon supports it, the value added as the -map-threads parameter. 0 uses the default BYOND v...
Implementation of IEngineInstallation for EngineType.Byond.
-
readonly bool supportsMapThreads
If map threads are supported by the Version.
+
readonly bool supportsMapThreads
If map threads are supported by the Version.
override bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
-
static string VisibilityWord(DreamDaemonVisibility visibility)
Change a given visibility into the appropriate DreamDaemon command line word.
-
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word.
+
static string VisibilityWord(DreamDaemonVisibility visibility)
Change a given visibility into the appropriate DreamDaemon command line word.
+
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word.
override string ServerExePath
The full path to the game server executable.
-
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
-
ByondInstallation(IIOManager installationIOManager, Task installationTask, EngineVersion version, string dreamDaemonPath, string dreamMakerPath, bool supportsCli, bool supportsMapThreads)
Initializes a new instance of the ByondInstallation class.
-
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
+
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
+
override bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
+
ByondInstallation(IIOManager installationIOManager, Task installationTask, EngineVersion version, string dreamDaemonPath, string dreamMakerPath, bool supportsCli, bool supportsMapThreads)
Initializes a new instance of the ByondInstallation class.
+
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
override bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
override EngineVersion Version
The EngineVersion of the IEngineInstallation.
override string FormatCompilerArguments(string dmePath)
Return the command line arguments for compiling a given dmePath if compilation is necessary....
override bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
override string CompilerExePath
The full path to the dm/DreamMaker executable.
-
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
+
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Provides absolute paths to the latest compiled .dmbs.
Definition: IDmbProvider.cs:11
string DmbName
The file name of the .dmb.
Definition: IDmbProvider.cs:15
Interface for using filesystems.
Definition: IIOManager.cs:13
diff --git a/_command_pipe_manager_8cs_source.html b/_command_pipe_manager_8cs_source.html index 04a9dde9e9..6a79172aea 100644 --- a/_command_pipe_manager_8cs_source.html +++ b/_command_pipe_manager_8cs_source.html @@ -218,7 +218,7 @@ $(function() {
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
ValueTask GracefulShutdown(bool detach)
Gracefully shutsdown the Host.
ValueTask Die(Exception? exception)
Kill the server with a fatal exception.
-
Definition: DotnetHelper.cs:9
+
Definition: DotnetHelper.cs:9
Definition: Application.cs:66
diff --git a/_delegating_engine_installer_8cs_source.html b/_delegating_engine_installer_8cs_source.html index 47b57e0d0e..9ab46f0d80 100644 --- a/_delegating_engine_installer_8cs_source.html +++ b/_delegating_engine_installer_8cs_source.html @@ -106,8 +106,8 @@ $(function() {
40 public ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
41 => DelegateCall(version, installer => installer.DownloadVersion(version, jobProgressReporter, cancellationToken));
42
-
44 public ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
-
45 => DelegateCall(version, installer => installer.Install(version, path, cancellationToken));
+
44 public ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
+
45 => DelegateCall(version, installer => installer.Install(version, path, deploymentPipelineProcesses, cancellationToken));
46
48 public ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
49 => DelegateCall(version, installer => installer.TrustDmbPath(version, fullDmbPath, cancellationToken));
@@ -129,7 +129,7 @@ $(function() {
DelegatingEngineInstaller(FrozenDictionary< EngineType, IEngineInstaller > delegatedInstallers)
Initializes a new instance of the DelegatingEngineInstaller class.
ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
TReturn DelegateCall< TReturn >(EngineVersion version, Func< IEngineInstaller, TReturn > call)
Delegate a given call to its appropriate IEngineInstaller.
-
ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
+
ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
readonly FrozenDictionary< EngineType, IEngineInstaller > delegatedInstallers
The FrozenDictionary<TKey, TValue> mapping EngineTypes to their appropriate IEngineInstaller.
diff --git a/_dotnet_dump_service_8cs.html b/_dotnet_dump_service_8cs.html new file mode 100644 index 0000000000..b87fce3cd3 --- /dev/null +++ b/_dotnet_dump_service_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/DotnetDumpService.cs File Reference + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
DotnetDumpService.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.System.DotnetDumpService
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.System
 
+
+ + + + diff --git a/_dotnet_dump_service_8cs_source.html b/_dotnet_dump_service_8cs_source.html new file mode 100644 index 0000000000..b18486dd65 --- /dev/null +++ b/_dotnet_dump_service_8cs_source.html @@ -0,0 +1,133 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/DotnetDumpService.cs Source File + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
DotnetDumpService.cs
+
+
+Go to the documentation of this file.
1using System;
+
2using System.Threading;
+
3using System.Threading.Tasks;
+
4
+
5using Microsoft.Diagnostics.NETCore.Client;
+
6using Microsoft.Extensions.Logging;
+
7
+ +
9{
+ +
12 {
+
16 readonly ILogger<DotnetDumpService> logger;
+
17
+ +
23 ILogger<DotnetDumpService> logger)
+
24 {
+
25 this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
+
26 }
+
27
+
29 public async ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken)
+
30 {
+
31 // need to use an extra timeout here because if the process is truly deadlocked. A cooperative dump will hang forever
+
32 using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
+
33
+
34 const int TimeoutMinutes = 5;
+
35 cts.CancelAfter(TimeSpan.FromMinutes(TimeoutMinutes));
+
36 cts.Token.Register(() =>
+
37 {
+
38 if (!cancellationToken.IsCancellationRequested)
+
39 logger.LogError("dotnet-dump timed out after {minutes} minutes!", TimeoutMinutes);
+
40 });
+
41
+
42 var pid = process.Id;
+
43 logger.LogDebug("dotnet-dump requested for PID {pid}...", pid);
+
44 var client = new DiagnosticsClient(pid);
+
45 await client.WriteDumpAsync(DumpType.Full, outputFile, false, cts.Token);
+
46 }
+
47 }
+
48}
+ +
DotnetDumpService(ILogger< DotnetDumpService > logger)
Initializes a new instance of the DotnetDumpService class.
+
readonly ILogger< DotnetDumpService > logger
The ILogger for the DotnetDumpService.
+
async ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken)
Attempt to dump a given process . A ValueTask representing the running operation.
+
Service for managing the dotnet-dump installation.
+
Abstraction over a global::System.Diagnostics.Process.
Definition: IProcess.cs:11
+ + +
+ + + + diff --git a/_engine_executable_lock_8cs_source.html b/_engine_executable_lock_8cs_source.html index 9684ebe26a..624c1cccbb 100644 --- a/_engine_executable_lock_8cs_source.html +++ b/_engine_executable_lock_8cs_source.html @@ -107,33 +107,35 @@ $(function() {
35
37 public Task InstallationTask => Instance.InstallationTask;
38
-
40 public void DoNotDeleteThisSession() => DangerousDropReference();
+
40 public bool UseDotnetDump => Instance.UseDotnetDump;
41
-
43 public string FormatServerArguments(
-
44 IDmbProvider dmbProvider,
-
45 IReadOnlyDictionary<string, string> parameters,
-
46 DreamDaemonLaunchParameters launchParameters,
-
47 string? logFilePath)
-
48 => Instance.FormatServerArguments(
-
49 dmbProvider,
-
50 parameters,
-
51 launchParameters,
-
52 logFilePath);
-
53
-
55 public string FormatCompilerArguments(string dmePath) => Instance.FormatCompilerArguments(dmePath);
+
43 public void DoNotDeleteThisSession() => DangerousDropReference();
+
44
+
46 public string FormatServerArguments(
+
47 IDmbProvider dmbProvider,
+
48 IReadOnlyDictionary<string, string> parameters,
+
49 DreamDaemonLaunchParameters launchParameters,
+
50 string? logFilePath)
+
51 => Instance.FormatServerArguments(
+
52 dmbProvider,
+
53 parameters,
+
54 launchParameters,
+
55 logFilePath);
56
-
58 public ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
-
59 => Instance.StopServerProcess(
-
60 logger,
-
61 process,
-
62 accessIdentifier,
-
63 port,
-
64 cancellationToken);
-
65
-
67 public ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
-
68 => Instance.LoadEnv(logger, forCompiler, cancellationToken);
-
69 }
-
70}
+
58 public string FormatCompilerArguments(string dmePath) => Instance.FormatCompilerArguments(dmePath);
+
59
+
61 public ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
+
62 => Instance.StopServerProcess(
+
63 logger,
+
64 process,
+
65 accessIdentifier,
+
66 port,
+
67 cancellationToken);
+
68
+
70 public ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
+
71 => Instance.LoadEnv(logger, forCompiler, cancellationToken);
+
72 }
+
73}
Information about an engine installation.
Launch settings for DreamDaemon.
@@ -149,6 +151,7 @@ $(function() {
Task InstallationTask
The Task that completes when the BYOND version finished installing.
ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process . A ValueTask representing the running operation.
EngineVersion Version
The EngineVersion of the IEngineInstallation.
+
bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
Definition: Instance.cs:29
Class used for counting references with ReferenceCountingContainer<TWrapped, TReference>.
void DangerousDropReference()
Prevents the aquired reference from being dropped when Dispose is called.
diff --git a/_engine_installation_base_8cs_source.html b/_engine_installation_base_8cs_source.html index 653d9a53d9..56ea4d90aa 100644 --- a/_engine_installation_base_8cs_source.html +++ b/_engine_installation_base_8cs_source.html @@ -111,95 +111,98 @@ $(function() {
38
40 public abstract bool PromptsForNetworkAccess { get; }
41
-
43 public abstract Task InstallationTask { get; }
+
43 public abstract bool UseDotnetDump { get; }
44
-
48 protected IIOManager InstallationIOManager { get; }
-
49
-
56 protected static string EncodeParameters(
-
57 IReadOnlyDictionary<string, string> parameters,
-
58 DreamDaemonLaunchParameters launchParameters)
-
59 {
-
60 var parametersString = String.Join('&', parameters.Select(kvp => $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.Value)}"));
-
61
-
62 if (!String.IsNullOrEmpty(launchParameters.AdditionalParameters))
-
63 parametersString = $"{parametersString}&{launchParameters.AdditionalParameters}";
+
46 public abstract Task InstallationTask { get; }
+
47
+
51 protected IIOManager InstallationIOManager { get; }
+
52
+
59 protected static string EncodeParameters(
+
60 IReadOnlyDictionary<string, string> parameters,
+
61 DreamDaemonLaunchParameters launchParameters)
+
62 {
+
63 var parametersString = String.Join('&', parameters.Select(kvp => $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.Value)}"));
64
-
65 return parametersString;
-
66 }
+
65 if (!String.IsNullOrEmpty(launchParameters.AdditionalParameters))
+
66 parametersString = $"{parametersString}&{launchParameters.AdditionalParameters}";
67
-
72 public EngineInstallationBase(IIOManager installationIOManager)
-
73 {
-
74 InstallationIOManager = installationIOManager ?? throw new ArgumentNullException(nameof(installationIOManager));
-
75 }
-
76
-
78 public abstract string FormatCompilerArguments(string dmePath);
+
68 return parametersString;
+
69 }
+
70
+
75 public EngineInstallationBase(IIOManager installationIOManager)
+
76 {
+
77 InstallationIOManager = installationIOManager ?? throw new ArgumentNullException(nameof(installationIOManager));
+
78 }
79
-
81 public abstract string FormatServerArguments(
-
82 IDmbProvider dmbProvider,
-
83 IReadOnlyDictionary<string, string> parameters,
-
84 DreamDaemonLaunchParameters launchParameters,
-
85 string? logFilePath);
-
86
-
88 public virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
-
89 {
-
90 ArgumentNullException.ThrowIfNull(logger);
-
91 cancellationToken.ThrowIfCancellationRequested();
-
92 logger.LogTrace("Terminating engine server process...");
-
93 process.Terminate();
-
94 await process.Lifetime;
-
95 }
-
96
-
98 public async ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
-
99 {
-
100 ArgumentNullException.ThrowIfNull(logger);
-
101
-
102 var envFile = forCompiler
-
103 ? "compiler.env"
-
104 : "server.env";
-
105
-
106 if (!await InstallationIOManager.FileExists(envFile, cancellationToken))
-
107 {
-
108 logger.LogTrace("No {envFile} present in engine installation {version}", envFile, Version);
-
109 return null;
-
110 }
-
111
-
112 logger.LogDebug("Loading {envFile} for engine installation {version}...", envFile, Version);
-
113
-
114 var fileBytes = await InstallationIOManager.ReadAllBytes(envFile, cancellationToken);
-
115 var fileContents = Encoding.UTF8.GetString(fileBytes);
-
116 var parser = new EnvParser();
-
117
-
118 try
-
119 {
-
120 var variables = parser.Parse(fileContents);
-
121
-
122 return variables.ToDictionary();
-
123 }
-
124 catch (Exception ex)
-
125 {
-
126 logger.LogWarning(ex, "Unable to parse {envFile}!", envFile);
-
127 return null;
-
128 }
-
129 }
-
130 }
-
131}
+
81 public abstract string FormatCompilerArguments(string dmePath);
+
82
+
84 public abstract string FormatServerArguments(
+
85 IDmbProvider dmbProvider,
+
86 IReadOnlyDictionary<string, string> parameters,
+
87 DreamDaemonLaunchParameters launchParameters,
+
88 string? logFilePath);
+
89
+
91 public virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
+
92 {
+
93 ArgumentNullException.ThrowIfNull(logger);
+
94 cancellationToken.ThrowIfCancellationRequested();
+
95 logger.LogTrace("Terminating engine server process...");
+
96 process.Terminate();
+
97 await process.Lifetime;
+
98 }
+
99
+
101 public async ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
+
102 {
+
103 ArgumentNullException.ThrowIfNull(logger);
+
104
+
105 var envFile = forCompiler
+
106 ? "compiler.env"
+
107 : "server.env";
+
108
+
109 if (!await InstallationIOManager.FileExists(envFile, cancellationToken))
+
110 {
+
111 logger.LogTrace("No {envFile} present in engine installation {version}", envFile, Version);
+
112 return null;
+
113 }
+
114
+
115 logger.LogDebug("Loading {envFile} for engine installation {version}...", envFile, Version);
+
116
+
117 var fileBytes = await InstallationIOManager.ReadAllBytes(envFile, cancellationToken);
+
118 var fileContents = Encoding.UTF8.GetString(fileBytes);
+
119 var parser = new EnvParser();
+
120
+
121 try
+
122 {
+
123 var variables = parser.Parse(fileContents);
+
124
+
125 return variables.ToDictionary();
+
126 }
+
127 catch (Exception ex)
+
128 {
+
129 logger.LogWarning(ex, "Unable to parse {envFile}!", envFile);
+
130 return null;
+
131 }
+
132 }
+
133 }
+
134}
Information about an engine installation.
Launch settings for DreamDaemon.
string? AdditionalParameters
Parameters string for DreamDaemon.
-
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
+
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
abstract string FormatCompilerArguments(string dmePath)
Return the command line arguments for compiling a given dmePath if compilation is necessary....
abstract string ServerExePath
The full path to the game server executable.
abstract EngineVersion Version
The EngineVersion of the IEngineInstallation.
abstract bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
abstract string CompilerExePath
The full path to the dm/DreamMaker executable.
-
EngineInstallationBase(IIOManager installationIOManager)
Initializes a new instance of the EngineInstallationBase class.
-
virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process . A ValueTask representing the running operation.
-
abstract Task InstallationTask
The Task that completes when the BYOND version finished installing.
-
async ValueTask< Dictionary< string, string >?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
Loads the environment settings for either the server or compiler. A ValueTask<TResult> resulting in t...
+
abstract bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
+
EngineInstallationBase(IIOManager installationIOManager)
Initializes a new instance of the EngineInstallationBase class.
+
virtual async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process . A ValueTask representing the running operation.
+
abstract Task InstallationTask
The Task that completes when the BYOND version finished installing.
+
async ValueTask< Dictionary< string, string >?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
Loads the environment settings for either the server or compiler. A ValueTask<TResult> resulting in t...
abstract bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
-
IIOManager InstallationIOManager
The IIOManager pointing to the installation directory.
+
IIOManager InstallationIOManager
The IIOManager pointing to the installation directory.
abstract bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
abstract string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
Provides absolute paths to the latest compiled .dmbs.
Definition: IDmbProvider.cs:11
diff --git a/_engine_installer_base_8cs_source.html b/_engine_installer_base_8cs_source.html index bac22f0940..4572d3a0b2 100644 --- a/_engine_installer_base_8cs_source.html +++ b/_engine_installer_base_8cs_source.html @@ -107,7 +107,7 @@ $(function() {
44
46 public abstract Task CleanCache(CancellationToken cancellationToken);
47
-
49 public abstract ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken);
+
49 public abstract ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken);
50
52 public abstract ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken);
53
@@ -129,11 +129,11 @@ $(function() {
abstract ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
abstract ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
abstract Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
-
abstract ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
void CheckVersionValidity(EngineVersion version)
Check that a given version is of type EngineType.Byond.
abstract IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
IIOManager IOManager
Gets the IIOManager for the EngineInstallerBase.
EngineInstallerBase(IIOManager ioManager, ILogger< EngineInstallerBase > logger)
Initializes a new instance of the EngineInstallerBase class.
+
abstract ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
ILogger< EngineInstallerBase > Logger
Gets the ILogger for the EngineInstallerBase.
abstract EngineType TargetEngineType
The EngineType the installer supports.
abstract ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
diff --git a/_engine_manager_8cs_source.html b/_engine_manager_8cs_source.html index e9d3616c33..ab60371bbe 100644 --- a/_engine_manager_8cs_source.html +++ b/_engine_manager_8cs_source.html @@ -460,154 +460,160 @@ $(function() {
438 installLock = installationContainer.AddReference();
439 }
440
-
441 try
-
442 {
-
443 if (installedOrInstalling)
-
444 {
-
445 if (progressReporter != null)
-
446 progressReporter.StageName = "Waiting for existing installation job...";
-
447
-
448 if (neededForLock && !installation.InstallationTask.IsCompleted)
-
449 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to wait for it to install.", version);
-
450
-
451 await installation.InstallationTask.WaitAsync(cancellationToken);
-
452 return installLock;
-
453 }
-
454
-
455 // okay up to us to install it then
-
456 try
-
457 {
-
458 if (customVersionStream != null)
-
459 logger.LogInformation("Installing custom engine version as {version}...", version);
-
460 else if (neededForLock)
-
461 {
-
462 if (version.CustomIteration.HasValue)
-
463 throw new JobException(ErrorCode.EngineNonExistentCustomVersion);
-
464
-
465 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to install it.", version);
-
466 }
-
467 else
-
468 logger.LogDebug("Requested engine version {version} not currently installed. Doing so now...", version);
-
469
-
470 if (progressReporter != null)
-
471 progressReporter.StageName = "Running event";
-
472
-
473 var versionString = version.ToString();
-
474 await eventConsumer.HandleEvent(EventType.EngineInstallStart, new List<string> { versionString }, false, cancellationToken);
-
475
-
476 await InstallVersionFiles(progressReporter, version, customVersionStream, cancellationToken);
-
477
-
478 ourTcs.SetResult();
-
479
-
480 await eventConsumer.HandleEvent(EventType.EngineInstallComplete, new List<string> { versionString }, false, cancellationToken);
-
481 }
-
482 catch (Exception ex)
-
483 {
-
484 if (ex is not OperationCanceledException)
-
485 await eventConsumer.HandleEvent(EventType.EngineInstallFail, new List<string> { ex.Message }, false, cancellationToken);
-
486
-
487 lock (installedVersions)
-
488 installedVersions.Remove(version);
-
489
-
490 ourTcs.SetException(ex);
-
491 throw;
-
492 }
-
493
-
494 return installLock;
-
495 }
-
496 catch
-
497 {
-
498 installLock.Dispose();
-
499 throw;
-
500 }
-
501 }
-
502
-
511 async ValueTask InstallVersionFiles(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, CancellationToken cancellationToken)
-
512 {
-
513 var installFullPath = ioManager.ResolvePath(version.ToString());
-
514 async ValueTask DirectoryCleanup()
-
515 {
-
516 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
-
517 await ioManager.CreateDirectory(installFullPath, cancellationToken);
-
518 }
-
519
-
520 var directoryCleanupTask = DirectoryCleanup();
-
521 try
+
441 var deploymentPipelineProcesses = !neededForLock;
+
442 try
+
443 {
+
444 if (installedOrInstalling)
+
445 {
+
446 if (progressReporter != null)
+
447 progressReporter.StageName = "Waiting for existing installation job...";
+
448
+
449 if (neededForLock && !installation.InstallationTask.IsCompleted)
+
450 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to wait for it to install.", version);
+
451
+
452 await installation.InstallationTask.WaitAsync(cancellationToken);
+
453 return installLock;
+
454 }
+
455
+
456 // okay up to us to install it then
+
457 try
+
458 {
+
459 if (customVersionStream != null)
+
460 logger.LogInformation("Installing custom engine version as {version}...", version);
+
461 else if (neededForLock)
+
462 {
+
463 if (version.CustomIteration.HasValue)
+
464 throw new JobException(ErrorCode.EngineNonExistentCustomVersion);
+
465
+
466 logger.LogWarning("The required engine version ({version}) is not readily available! We will have to install it.", version);
+
467 }
+
468 else
+
469 logger.LogDebug("Requested engine version {version} not currently installed. Doing so now...", version);
+
470
+
471 if (progressReporter != null)
+
472 progressReporter.StageName = "Running event";
+
473
+
474 var versionString = version.ToString();
+
475 await eventConsumer.HandleEvent(EventType.EngineInstallStart, new List<string> { versionString }, deploymentPipelineProcesses, cancellationToken);
+
476
+
477 await InstallVersionFiles(progressReporter, version, customVersionStream, deploymentPipelineProcesses, cancellationToken);
+
478
+
479 ourTcs.SetResult();
+
480
+
481 await eventConsumer.HandleEvent(EventType.EngineInstallComplete, new List<string> { versionString }, deploymentPipelineProcesses, cancellationToken);
+
482 }
+
483 catch (Exception ex)
+
484 {
+
485 if (ex is not OperationCanceledException)
+
486 await eventConsumer.HandleEvent(EventType.EngineInstallFail, new List<string> { ex.Message }, deploymentPipelineProcesses, cancellationToken);
+
487
+
488 lock (installedVersions)
+
489 installedVersions.Remove(version);
+
490
+
491 ourTcs.SetException(ex);
+
492 throw;
+
493 }
+
494
+
495 return installLock;
+
496 }
+
497 catch
+
498 {
+
499 installLock.Dispose();
+
500 throw;
+
501 }
+
502 }
+
503
+
513 async ValueTask InstallVersionFiles(
+
514 JobProgressReporter? progressReporter,
+
515 EngineVersion version,
+
516 Stream? customVersionStream,
+
517 bool deploymentPipelineProcesses,
+
518 CancellationToken cancellationToken)
+
519 {
+
520 var installFullPath = ioManager.ResolvePath(version.ToString());
+
521 async ValueTask DirectoryCleanup()
522 {
-
523 IEngineInstallationData engineInstallationData;
-
524 if (customVersionStream == null)
-
525 {
-
526 if (progressReporter != null)
-
527 progressReporter.StageName = "Downloading version";
-
528
-
529 engineInstallationData = await engineInstaller.DownloadVersion(version, progressReporter, cancellationToken);
-
530
-
531 progressReporter?.ReportProgress(null);
-
532 }
-
533 else
-
534#pragma warning disable CA2000 // Dispose objects before losing scope, false positive
-
535 engineInstallationData = new ZipStreamEngineInstallationData(
-
536 ioManager,
-
537 customVersionStream);
-
538#pragma warning restore CA2000 // Dispose objects before losing scope
-
539
-
540 await using (engineInstallationData)
-
541 {
-
542 if (progressReporter != null)
-
543 progressReporter.StageName = "Cleaning target directory";
-
544
-
545 await directoryCleanupTask;
+
523 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
+
524 await ioManager.CreateDirectory(installFullPath, cancellationToken);
+
525 }
+
526
+
527 var directoryCleanupTask = DirectoryCleanup();
+
528 try
+
529 {
+
530 IEngineInstallationData engineInstallationData;
+
531 if (customVersionStream == null)
+
532 {
+
533 if (progressReporter != null)
+
534 progressReporter.StageName = "Downloading version";
+
535
+
536 engineInstallationData = await engineInstaller.DownloadVersion(version, progressReporter, cancellationToken);
+
537
+
538 progressReporter?.ReportProgress(null);
+
539 }
+
540 else
+
541#pragma warning disable CA2000 // Dispose objects before losing scope, false positive
+
542 engineInstallationData = new ZipStreamEngineInstallationData(
+
543 ioManager,
+
544 customVersionStream);
+
545#pragma warning restore CA2000 // Dispose objects before losing scope
546
-
547 if (progressReporter != null)
-
548 progressReporter.StageName = "Extracting data";
-
549
-
550 logger.LogTrace("Extracting engine to {extractPath}...", installFullPath);
-
551 await engineInstallationData.ExtractToPath(installFullPath, cancellationToken);
-
552 }
+
547 await using (engineInstallationData)
+
548 {
+
549 if (progressReporter != null)
+
550 progressReporter.StageName = "Cleaning target directory";
+
551
+
552 await directoryCleanupTask;
553
-
554 if (progressReporter != null)
-
555 progressReporter.StageName = "Running installation actions";
+
554 if (progressReporter != null)
+
555 progressReporter.StageName = "Extracting data";
556
-
557 await engineInstaller.Install(version, installFullPath, cancellationToken);
-
558
-
559 if (progressReporter != null)
-
560 progressReporter.StageName = "Writing version file";
-
561
-
562 // make sure to do this last because this is what tells us we have a valid version in the future
-
563 await ioManager.WriteAllBytes(
-
564 ioManager.ConcatPath(installFullPath, VersionFileName),
-
565 Encoding.UTF8.GetBytes(version.ToString()),
-
566 cancellationToken);
-
567 }
-
568 catch (HttpRequestException ex)
-
569 {
-
570 // since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
-
571 throw new JobException(ErrorCode.EngineDownloadFail, ex);
-
572 }
-
573 catch (OperationCanceledException)
-
574 {
-
575 throw;
-
576 }
-
577 catch
-
578 {
-
579 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
-
580 throw;
-
581 }
-
582 }
-
583
-
591 ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock> AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
-
592 {
-
593 var installation = engineInstaller.CreateInstallation(version, installPath, installationTask);
-
594
-
595 var installationContainer = new ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock>(installation);
-
596
-
597 lock (installedVersions)
-
598 installedVersions.Add(version, installationContainer);
-
599
-
600 return installationContainer;
-
601 }
-
602 }
-
603}
+
557 logger.LogTrace("Extracting engine to {extractPath}...", installFullPath);
+
558 await engineInstallationData.ExtractToPath(installFullPath, cancellationToken);
+
559 }
+
560
+
561 if (progressReporter != null)
+
562 progressReporter.StageName = "Running installation actions";
+
563
+
564 await engineInstaller.Install(version, installFullPath, deploymentPipelineProcesses, cancellationToken);
+
565
+
566 if (progressReporter != null)
+
567 progressReporter.StageName = "Writing version file";
+
568
+
569 // make sure to do this last because this is what tells us we have a valid version in the future
+
570 await ioManager.WriteAllBytes(
+
571 ioManager.ConcatPath(installFullPath, VersionFileName),
+
572 Encoding.UTF8.GetBytes(version.ToString()),
+
573 cancellationToken);
+
574 }
+
575 catch (HttpRequestException ex)
+
576 {
+
577 // since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
+
578 throw new JobException(ErrorCode.EngineDownloadFail, ex);
+
579 }
+
580 catch (OperationCanceledException)
+
581 {
+
582 throw;
+
583 }
+
584 catch
+
585 {
+
586 await ioManager.DeleteDirectory(installFullPath, cancellationToken);
+
587 throw;
+
588 }
+
589 }
+
590
+
598 ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock> AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
+
599 {
+
600 var installation = engineInstaller.CreateInstallation(version, installPath, installationTask);
+
601
+
602 var installationContainer = new ReferenceCountingContainer<IEngineInstallation, EngineExecutableLock>(installation);
+
603
+
604 lock (installedVersions)
+
605 installedVersions.Add(version, installationContainer);
+
606
+
607 return installationContainer;
+
608 }
+
609 }
+
610}
Information about an engine installation.
@@ -620,6 +626,7 @@ $(function() {
static async ValueTask WhenAll(IEnumerable< ValueTask > tasks)
Fully await a given list of tasks .
+
async ValueTask InstallVersionFiles(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Installs the files for a given BYOND version .
static void CheckVersionParameter(EngineVersion version)
Validates a given version parameter.
readonly Dictionary< EngineVersion, ReferenceCountingContainer< IEngineInstallation, EngineExecutableLock > > installedVersions
Map of byond EngineVersions to Tasks that complete when they are installed.
Task StopAsync(CancellationToken cancellationToken)
@@ -638,9 +645,8 @@ $(function() {
readonly IIOManager ioManager
The IIOManager for the EngineManager.
readonly IEngineInstaller engineInstaller
The IEngineInstaller for the EngineManager.
readonly ILogger< EngineManager > logger
The ILogger for the EngineManager.
-
ReferenceCountingContainer< IEngineInstallation, EngineExecutableLock > AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
Create and add a new IEngineInstallation to installedVersions.
+
ReferenceCountingContainer< IEngineInstallation, EngineExecutableLock > AddInstallationContainer(EngineVersion version, string installPath, Task installationTask)
Create and add a new IEngineInstallation to installedVersions.
async ValueTask ChangeVersion(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, bool allowInstallation, CancellationToken cancellationToken)
Change the active EngineVersion. A ValueTask representing the running operation.
-
async ValueTask InstallVersionFiles(JobProgressReporter? progressReporter, EngineVersion version, Stream? customVersionStream, CancellationToken cancellationToken)
Installs the files for a given BYOND version .
void Dispose()
Implementation of IEngineInstallationData for a zip file in a Stream.
IIOManager that resolves paths to Environment.CurrentDirectory.
@@ -658,12 +664,12 @@ $(function() {
Wraps data containing an engine installation.
Task ExtractToPath(string path, CancellationToken cancellationToken)
Extracts the installation to a given path.
Represents a BYOND installation.
-
Task InstallationTask
The Task that completes when the BYOND version finished installing.
+
Task InstallationTask
The Task that completes when the BYOND version finished installing.
For downloading and installing game engines for a given system.
IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version .
ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS.
ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version .
-
ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
+
ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config.
For managing the engine installations.
Consumes EventTypes and takes the appropriate actions.
diff --git a/_host_exit_code_8cs_source.html b/_host_exit_code_8cs_source.html index 538a05fb55..c405c83ddb 100644 --- a/_host_exit_code_8cs_source.html +++ b/_host_exit_code_8cs_source.html @@ -88,7 +88,7 @@ $(function() {
21 Error,
22 }
23}
-
Definition: DotnetHelper.cs:9
+
Definition: DotnetHelper.cs:9
HostExitCode
Represents the exit code of the Host program.
Definition: HostExitCode.cs:7
diff --git a/_i_dotnet_dump_service_8cs.html b/_i_dotnet_dump_service_8cs.html new file mode 100644 index 0000000000..eb8c56a963 --- /dev/null +++ b/_i_dotnet_dump_service_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/IDotnetDumpService.cs File Reference + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
IDotnetDumpService.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.System.IDotnetDumpService
 Service for managing the dotnet-dump installation. More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.System
 
+
+ + + + diff --git a/_i_dotnet_dump_service_8cs_source.html b/_i_dotnet_dump_service_8cs_source.html new file mode 100644 index 0000000000..6706ab7181 --- /dev/null +++ b/_i_dotnet_dump_service_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/System/IDotnetDumpService.cs Source File + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
IDotnetDumpService.cs
+
+
+Go to the documentation of this file.
1using System.Threading;
+
2using System.Threading.Tasks;
+
3
+ +
5{
+
9 public interface IDotnetDumpService
+
10 {
+
18 ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken);
+
19 }
+
20}
+
Service for managing the dotnet-dump installation.
+
ValueTask Dump(IProcess process, string outputFile, CancellationToken cancellationToken)
Attempt to dump a given process .
+
Abstraction over a global::System.Diagnostics.Process.
Definition: IProcess.cs:11
+ +
+ + + + diff --git a/_i_engine_installation_8cs_source.html b/_i_engine_installation_8cs_source.html index 1f0d40708f..c049662d5e 100644 --- a/_i_engine_installation_8cs_source.html +++ b/_i_engine_installation_8cs_source.html @@ -104,21 +104,23 @@ $(function() {
43
47 bool PreferFileLogging { get; }
48
-
52 Task InstallationTask { get; }
+
52 bool UseDotnetDump { get; }
53
-
62 string FormatServerArguments(
-
63 IDmbProvider dmbProvider,
-
64 IReadOnlyDictionary<string, string> parameters,
-
65 DreamDaemonLaunchParameters launchParameters,
-
66 string? logFilePath);
-
67
-
73 string FormatCompilerArguments(string dmePath);
-
74
-
84 ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken);
-
85
-
93 ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken);
-
94 }
-
95}
+
57 Task InstallationTask { get; }
+
58
+
67 string FormatServerArguments(
+
68 IDmbProvider dmbProvider,
+
69 IReadOnlyDictionary<string, string> parameters,
+
70 DreamDaemonLaunchParameters launchParameters,
+
71 string? logFilePath);
+
72
+
78 string FormatCompilerArguments(string dmePath);
+
79
+
89 ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken);
+
90
+
98 ValueTask<Dictionary<string, string>?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken);
+
99 }
+
100}
Information about an engine installation.
Launch settings for DreamDaemon.
Provides absolute paths to the latest compiled .dmbs.
Definition: IDmbProvider.cs:11
@@ -126,11 +128,12 @@ $(function() {
string ServerExePath
The full path to the game server executable.
ValueTask< Dictionary< string, string >?> LoadEnv(ILogger logger, bool forCompiler, CancellationToken cancellationToken)
Loads the environment settings for either the server or compiler.
bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
-
Task InstallationTask
The Task that completes when the BYOND version finished installing.
+
Task InstallationTask
The Task that completes when the BYOND version finished installing.
bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters .
string FormatCompilerArguments(string dmePath)
Return the command line arguments for compiling a given dmePath if compilation is necessary.
EngineVersion Version
The EngineVersion of the IEngineInstallation.
+
bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
Kills a given engine server process .
string CompilerExePath
The full path to the dm/DreamMaker executable.
bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
diff --git a/_i_engine_installer_8cs_source.html b/_i_engine_installer_8cs_source.html index c9eb919245..b03647c345 100644 --- a/_i_engine_installer_8cs_source.html +++ b/_i_engine_installer_8cs_source.html @@ -91,15 +91,15 @@ $(function() {
22
30 ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken);
31
-
39 ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken);
-
40
-
48 ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken);
-
49
-
57 ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken);
-
58
-
64 Task CleanCache(CancellationToken cancellationToken);
-
65 }
-
66}
+
40 ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken);
+
41
+
49 ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken);
+
50
+
58 ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken);
+
59
+
65 Task CleanCache(CancellationToken cancellationToken);
+
66 }
+
67}
Information about an engine installation.
Progress reporter for a Job.
Represents a BYOND installation.
@@ -107,7 +107,7 @@ $(function() {
IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version .
ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS.
ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version .
-
ValueTask Install(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
+
ValueTask Install(EngineVersion version, string path, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working.
ValueTask TrustDmbPath(EngineVersion version, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config.
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system.
Definition: ChatChannel.cs:6
diff --git a/_i_o_manager_extensions_8cs.html b/_i_o_manager_extensions_8cs.html new file mode 100644 index 0000000000..a23f9928a9 --- /dev/null +++ b/_i_o_manager_extensions_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Extensions/IOManagerExtensions.cs File Reference + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
IOManagerExtensions.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Extensions.IOManagerExtensions
 Extension methods for IIOManager. More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Extensions
 
+
+ + + + diff --git a/_i_o_manager_extensions_8cs_source.html b/_i_o_manager_extensions_8cs_source.html new file mode 100644 index 0000000000..67dfbf485c --- /dev/null +++ b/_i_o_manager_extensions_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Extensions/IOManagerExtensions.cs Source File + + + + + + + + + +
+
+ + + + + + +
+
tgstation-server 6.1.5 +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
IOManagerExtensions.cs
+
+
+Go to the documentation of this file.
1using System;
+
2
+ + +
5
+ +
7{
+ +
12 {
+
19 public static string GetPathInLocalDirectory(this IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider)
+
20 {
+
21 ArgumentNullException.ThrowIfNull(ioManager);
+
22 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
+
23
+
24 return ioManager.ConcatPath(
+
25 Environment.GetFolderPath(
+
26 Environment.SpecialFolder.LocalApplicationData, // we use local application data here instead of comman application data because we store stuff here we don't want other users interfering with
+
27 Environment.SpecialFolderOption.DoNotVerify),
+
28 assemblyInformationProvider.VersionPrefix);
+
29 }
+
30 }
+
31}
+ +
static string GetPathInLocalDirectory(this IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider)
Gets the local application data folder used by TGS.
+
Interface for using filesystems.
Definition: IIOManager.cs:13
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path.
+ + + + + +
+ + + + diff --git a/_i_session_controller_8cs_source.html b/_i_session_controller_8cs_source.html index 086872907d..1572bd9d31 100644 --- a/_i_session_controller_8cs_source.html +++ b/_i_session_controller_8cs_source.html @@ -118,17 +118,19 @@ $(function() {
81
85 bool DMApiAvailable { get; }
86
-
91 ValueTask Release();
-
92
-
99 ValueTask<TopicResponse?> SendCommand(TopicParameters parameters, CancellationToken cancellationToken);
-
100
-
107 ValueTask<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken);
-
108
-
112 void ResetRebootState();
+
90 string DumpFileExtension { get; }
+
91
+
96 ValueTask Release();
+
97
+
104 ValueTask<TopicResponse?> SendCommand(TopicParameters parameters, CancellationToken cancellationToken);
+
105
+
112 ValueTask<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken);
113
-
119 IAsyncDisposable ReplaceDmbProvider(IDmbProvider newProvider);
-
120 }
-
121}
+
117 void ResetRebootState();
+
118
+
124 IAsyncDisposable ReplaceDmbProvider(IDmbProvider newProvider);
+
125 }
+
126}
Information about an engine installation.
Parameters for a topic request.
@@ -152,6 +154,7 @@ $(function() {
Task OnStartup
A Task that completes when the server calls /world/TgsNew().
ValueTask Release()
Releases the IProcess without terminating it. Also calls IDisposable.Dispose.
Version? DMApiVersion
The DMAPI Version.
+
string DumpFileExtension
The file extension to use for process dumps created from this session.
Represents process lifetime.
Definition: IProcessBase.cs:10
Definition: ChatChannel.cs:6
Definition: DmbFactory.cs:22
diff --git a/_installation_extensions_8cs_source.html b/_installation_extensions_8cs_source.html index 8a7a8d23a5..5f82701bad 100644 --- a/_installation_extensions_8cs_source.html +++ b/_installation_extensions_8cs_source.html @@ -202,7 +202,7 @@ $(function() {
static ActionResult ApplyProductionAppsettingsIfNonExistant(Session session)
Attempts to copy the initial config to the production config if necessary.
static ActionResult DetachStopTgsServiceIfRunning(Session session)
Attempts to detach stop the existing tgstation-server service if it exists.
const string CanonicalPackageName
Package name
-
Definition: DotnetHelper.cs:9
+
Definition: DotnetHelper.cs:9
diff --git a/_instance_factory_8cs_source.html b/_instance_factory_8cs_source.html index aae31dac22..af2051d111 100644 --- a/_instance_factory_8cs_source.html +++ b/_instance_factory_8cs_source.html @@ -150,232 +150,241 @@ $(function() {
132
136 readonly IAsyncDelayer asyncDelayer;
137
-
141 readonly GeneralConfiguration generalConfiguration;
+
141 readonly IDotnetDumpService dotnetDumpService;
142
-
146 readonly SessionConfiguration sessionConfiguration;
+
146 readonly GeneralConfiguration generalConfiguration;
147
-
153 static ResolvingIOManager CreateGameIOManager(IIOManager instanceIOManager) => new(instanceIOManager, "Game");
-
154
-
155#pragma warning disable CA1502 // TODO: Decomplexify
-
182 public InstanceFactory(
-
183 IIOManager ioManager,
-
184 IDatabaseContextFactory databaseContextFactory,
-
185 IAssemblyInformationProvider assemblyInformationProvider,
-
186 ILoggerFactory loggerFactory,
-
187 ITopicClientFactory topicClientFactory,
-
188 ICryptographySuite cryptographySuite,
-
189 ISynchronousIOManager synchronousIOManager,
-
190 IFilesystemLinkFactory linkFactory,
-
191 IEngineInstaller engineInstaller,
-
192 IChatManagerFactory chatFactory,
-
193 IProcessExecutor processExecutor,
-
194 IPostWriteHandler postWriteHandler,
-
195 IWatchdogFactory watchdogFactory,
-
196 IJobManager jobManager,
-
197 INetworkPromptReaper networkPromptReaper,
-
198 IPlatformIdentifier platformIdentifier,
-
199 IRepositoryManagerFactory repositoryManagerFactory,
-
200 IServerPortProvider serverPortProvider,
-
201 IFileTransferTicketProvider fileTransferService,
-
202 IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory,
-
203 IAsyncDelayer asyncDelayer,
-
204 IOptions<GeneralConfiguration> generalConfigurationOptions,
-
205 IOptions<SessionConfiguration> sessionConfigurationOptions)
-
206 {
-
207 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
-
208 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
-
209 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
-
210 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
-
211 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
-
212 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
-
213 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
-
214 this.linkFactory = linkFactory ?? throw new ArgumentNullException(nameof(linkFactory));
-
215 this.engineInstaller = engineInstaller ?? throw new ArgumentNullException(nameof(engineInstaller));
-
216 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
-
217 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
-
218 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
-
219 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
-
220 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
-
221 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
-
222 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
-
223 this.repositoryManagerFactory = repositoryManagerFactory ?? throw new ArgumentNullException(nameof(repositoryManagerFactory));
-
224 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
-
225 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
-
226 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
-
227 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
-
228 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
229 sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
-
230 }
-
231#pragma warning restore CA1502
-
232
-
234 public IIOManager CreateGameIOManager(Models.Instance metadata)
-
235 {
-
236 ArgumentNullException.ThrowIfNull(metadata);
-
237
-
238 var instanceIoManager = CreateInstanceIOManager(metadata);
-
239 return CreateGameIOManager(instanceIoManager);
-
240 }
-
241
-
243#pragma warning disable CA1506 // TODO: Decomplexify
-
244 public async ValueTask<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
-
245 {
-
246 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
-
247 ArgumentNullException.ThrowIfNull(metadata);
-
248
-
249 // Create the ioManager for the instance
-
250 var instanceIoManager = CreateInstanceIOManager(metadata);
-
251
-
252 // various other ioManagers
-
253 var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
-
254 var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
-
255 var gameIoManager = CreateGameIOManager(instanceIoManager);
-
256 var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
-
257 var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
-
258
-
259 var configuration = new StaticFiles.Configuration(
-
260 configurationIoManager,
-
261 synchronousIOManager,
-
262 linkFactory,
-
263 processExecutor,
-
264 postWriteHandler,
-
265 platformIdentifier,
-
266 fileTransferService,
-
267 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
-
268 generalConfiguration,
-
269 sessionConfiguration);
-
270 var eventConsumer = new EventConsumer(configuration);
-
271 var repoManager = repositoryManagerFactory.CreateRepositoryManager(repoIoManager, eventConsumer);
-
272 try
-
273 {
-
274 var engineManager = new EngineManager(byondIOManager, engineInstaller, eventConsumer, loggerFactory.CreateLogger<EngineManager>());
-
275
-
276 var dmbFactory = new DmbFactory(
-
277 databaseContextFactory,
-
278 gameIoManager,
-
279 remoteDeploymentManagerFactory,
-
280 eventConsumer,
-
281 loggerFactory.CreateLogger<DmbFactory>(),
-
282 metadata);
-
283 try
-
284 {
-
285 var commandFactory = new CommandFactory(assemblyInformationProvider, engineManager, repoManager, databaseContextFactory, dmbFactory, metadata);
-
286
-
287 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
-
288 try
-
289 {
-
290 var reattachInfoHandler = new SessionPersistor(
-
291 databaseContextFactory,
-
292 dmbFactory,
-
293 processExecutor,
-
294 loggerFactory.CreateLogger<SessionPersistor>(),
-
295 metadata);
-
296
-
297 var sessionControllerFactory = new SessionControllerFactory(
-
298 processExecutor,
-
299 engineManager,
-
300 topicClientFactory,
-
301 cryptographySuite,
-
302 assemblyInformationProvider,
-
303 gameIoManager,
-
304 diagnosticsIOManager,
-
305 chatManager,
-
306 networkPromptReaper,
-
307 platformIdentifier,
-
308 bridgeRegistrar,
-
309 serverPortProvider,
-
310 eventConsumer,
-
311 asyncDelayer,
-
312 loggerFactory,
-
313 loggerFactory.CreateLogger<SessionControllerFactory>(),
-
314 sessionConfiguration,
-
315 metadata);
-
316
-
317 var watchdog = watchdogFactory.CreateWatchdog(
-
318 chatManager,
-
319 dmbFactory,
-
320 reattachInfoHandler,
-
321 sessionControllerFactory,
-
322 gameIoManager,
-
323 diagnosticsIOManager,
-
324 configuration, // watchdog doesn't need itself as an event consumer
-
325 remoteDeploymentManagerFactory,
-
326 metadata,
-
327 metadata.DreamDaemonSettings!);
-
328 try
-
329 {
-
330 eventConsumer.SetWatchdog(watchdog);
-
331 commandFactory.SetWatchdog(watchdog);
-
332
-
333 Instance? instance = null;
-
334 var dreamMaker = new DreamMaker(
-
335 engineManager,
-
336 gameIoManager,
-
337 configuration,
-
338 sessionControllerFactory,
-
339 eventConsumer,
-
340 chatManager,
-
341 processExecutor,
-
342 dmbFactory,
-
343 repoManager,
-
344 remoteDeploymentManagerFactory,
-
345 asyncDelayer,
-
346 loggerFactory.CreateLogger<DreamMaker>(),
-
347 sessionConfiguration,
-
348 metadata);
-
349
-
350 instance = new Instance(
-
351 metadata,
-
352 repoManager,
-
353 engineManager,
-
354 dreamMaker,
-
355 watchdog,
-
356 chatManager,
-
357 configuration,
-
358 dmbFactory,
-
359 jobManager,
-
360 eventConsumer,
-
361 remoteDeploymentManagerFactory,
-
362 asyncDelayer,
-
363 loggerFactory.CreateLogger<Instance>());
-
364
-
365 return instance;
-
366 }
-
367 catch
-
368 {
-
369 await watchdog.DisposeAsync();
-
370 throw;
-
371 }
-
372 }
-
373 catch
-
374 {
-
375 await chatManager.DisposeAsync();
-
376 throw;
-
377 }
-
378 }
-
379 catch
-
380 {
-
381 dmbFactory.Dispose();
-
382 throw;
-
383 }
-
384 }
-
385 catch
-
386 {
-
387 repoManager.Dispose();
-
388 throw;
-
389 }
-
390 }
-
391#pragma warning restore CA1506
-
392
-
394 public Task StartAsync(CancellationToken cancellationToken)
-
395 => Task.WhenAll(
-
396 repositoryManagerFactory.StartAsync(cancellationToken),
-
397 engineInstaller.CleanCache(cancellationToken));
-
398
-
400 public Task StopAsync(CancellationToken cancellationToken) => repositoryManagerFactory.StopAsync(cancellationToken);
-
401
-
407 ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata) => new(ioManager, metadata.Path!);
-
408 }
-
409}
+
151 readonly SessionConfiguration sessionConfiguration;
+
152
+
158 static ResolvingIOManager CreateGameIOManager(IIOManager instanceIOManager) => new(instanceIOManager, "Game");
+
159
+
160#pragma warning disable CA1502 // TODO: Decomplexify
+
188 public InstanceFactory(
+
189 IIOManager ioManager,
+
190 IDatabaseContextFactory databaseContextFactory,
+
191 IAssemblyInformationProvider assemblyInformationProvider,
+
192 ILoggerFactory loggerFactory,
+
193 ITopicClientFactory topicClientFactory,
+
194 ICryptographySuite cryptographySuite,
+
195 ISynchronousIOManager synchronousIOManager,
+
196 IFilesystemLinkFactory linkFactory,
+
197 IEngineInstaller engineInstaller,
+
198 IChatManagerFactory chatFactory,
+
199 IProcessExecutor processExecutor,
+
200 IPostWriteHandler postWriteHandler,
+
201 IWatchdogFactory watchdogFactory,
+
202 IJobManager jobManager,
+
203 INetworkPromptReaper networkPromptReaper,
+
204 IPlatformIdentifier platformIdentifier,
+
205 IRepositoryManagerFactory repositoryManagerFactory,
+
206 IServerPortProvider serverPortProvider,
+
207 IFileTransferTicketProvider fileTransferService,
+
208 IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory,
+
209 IAsyncDelayer asyncDelayer,
+
210 IDotnetDumpService dotnetDumpService,
+
211 IOptions<GeneralConfiguration> generalConfigurationOptions,
+
212 IOptions<SessionConfiguration> sessionConfigurationOptions)
+
213 {
+
214 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
+
215 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
+
216 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
+
217 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
+
218 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
+
219 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
+
220 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
+
221 this.linkFactory = linkFactory ?? throw new ArgumentNullException(nameof(linkFactory));
+
222 this.engineInstaller = engineInstaller ?? throw new ArgumentNullException(nameof(engineInstaller));
+
223 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
+
224 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
+
225 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
+
226 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
+
227 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
+
228 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
+
229 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
+
230 this.repositoryManagerFactory = repositoryManagerFactory ?? throw new ArgumentNullException(nameof(repositoryManagerFactory));
+
231 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
+
232 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
+
233 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
+
234 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+
235 this.dotnetDumpService = dotnetDumpService ?? throw new ArgumentNullException(nameof(dotnetDumpService));
+
236 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
237 sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
+
238 }
+
239#pragma warning restore CA1502
+
240
+
242 public IIOManager CreateGameIOManager(Models.Instance metadata)
+
243 {
+
244 ArgumentNullException.ThrowIfNull(metadata);
+
245
+
246 var instanceIoManager = CreateInstanceIOManager(metadata);
+
247 return CreateGameIOManager(instanceIoManager);
+
248 }
+
249
+
251#pragma warning disable CA1506 // TODO: Decomplexify
+
252 public async ValueTask<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
+
253 {
+
254 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
+
255 ArgumentNullException.ThrowIfNull(metadata);
+
256
+
257 // Create the ioManager for the instance
+
258 var instanceIoManager = CreateInstanceIOManager(metadata);
+
259
+
260 // various other ioManagers
+
261 var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
+
262 var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
+
263 var gameIoManager = CreateGameIOManager(instanceIoManager);
+
264 var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
+
265 var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
+
266
+
267 var configuration = new StaticFiles.Configuration(
+
268 configurationIoManager,
+
269 synchronousIOManager,
+
270 linkFactory,
+
271 processExecutor,
+
272 postWriteHandler,
+
273 platformIdentifier,
+
274 fileTransferService,
+
275 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
+
276 generalConfiguration,
+
277 sessionConfiguration);
+
278 var eventConsumer = new EventConsumer(configuration);
+
279 var repoManager = repositoryManagerFactory.CreateRepositoryManager(repoIoManager, eventConsumer);
+
280 try
+
281 {
+
282 var engineManager = new EngineManager(
+
283 byondIOManager,
+
284 engineInstaller,
+
285 eventConsumer,
+
286 loggerFactory.CreateLogger<EngineManager>());
+
287
+
288 var dmbFactory = new DmbFactory(
+
289 databaseContextFactory,
+
290 gameIoManager,
+
291 remoteDeploymentManagerFactory,
+
292 eventConsumer,
+
293 loggerFactory.CreateLogger<DmbFactory>(),
+
294 metadata);
+
295 try
+
296 {
+
297 var commandFactory = new CommandFactory(assemblyInformationProvider, engineManager, repoManager, databaseContextFactory, dmbFactory, metadata);
+
298
+
299 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
+
300 try
+
301 {
+
302 var reattachInfoHandler = new SessionPersistor(
+
303 databaseContextFactory,
+
304 dmbFactory,
+
305 processExecutor,
+
306 loggerFactory.CreateLogger<SessionPersistor>(),
+
307 metadata);
+
308
+
309 var sessionControllerFactory = new SessionControllerFactory(
+
310 processExecutor,
+
311 engineManager,
+
312 topicClientFactory,
+
313 cryptographySuite,
+
314 assemblyInformationProvider,
+
315 gameIoManager,
+
316 diagnosticsIOManager,
+
317 chatManager,
+
318 networkPromptReaper,
+
319 platformIdentifier,
+
320 bridgeRegistrar,
+
321 serverPortProvider,
+
322 eventConsumer,
+
323 asyncDelayer,
+
324 dotnetDumpService,
+
325 loggerFactory,
+
326 loggerFactory.CreateLogger<SessionControllerFactory>(),
+
327 sessionConfiguration,
+
328 metadata);
+
329
+
330 var watchdog = watchdogFactory.CreateWatchdog(
+
331 chatManager,
+
332 dmbFactory,
+
333 reattachInfoHandler,
+
334 sessionControllerFactory,
+
335 gameIoManager,
+
336 diagnosticsIOManager,
+
337 configuration, // watchdog doesn't need itself as an event consumer
+
338 remoteDeploymentManagerFactory,
+
339 metadata,
+
340 metadata.DreamDaemonSettings!);
+
341 try
+
342 {
+
343 eventConsumer.SetWatchdog(watchdog);
+
344 commandFactory.SetWatchdog(watchdog);
+
345
+
346 Instance? instance = null;
+
347 var dreamMaker = new DreamMaker(
+
348 engineManager,
+
349 gameIoManager,
+
350 configuration,
+
351 sessionControllerFactory,
+
352 eventConsumer,
+
353 chatManager,
+
354 processExecutor,
+
355 dmbFactory,
+
356 repoManager,
+
357 remoteDeploymentManagerFactory,
+
358 asyncDelayer,
+
359 loggerFactory.CreateLogger<DreamMaker>(),
+
360 sessionConfiguration,
+
361 metadata);
+
362
+
363 instance = new Instance(
+
364 metadata,
+
365 repoManager,
+
366 engineManager,
+
367 dreamMaker,
+
368 watchdog,
+
369 chatManager,
+
370 configuration,
+
371 dmbFactory,
+
372 jobManager,
+
373 eventConsumer,
+
374 remoteDeploymentManagerFactory,
+
375 asyncDelayer,
+
376 loggerFactory.CreateLogger<Instance>());
+
377
+
378 return instance;
+
379 }
+
380 catch
+
381 {
+
382 await watchdog.DisposeAsync();
+
383 throw;
+
384 }
+
385 }
+
386 catch
+
387 {
+
388 await chatManager.DisposeAsync();
+
389 throw;
+
390 }
+
391 }
+
392 catch
+
393 {
+
394 dmbFactory.Dispose();
+
395 throw;
+
396 }
+
397 }
+
398 catch
+
399 {
+
400 repoManager.Dispose();
+
401 throw;
+
402 }
+
403 }
+
404#pragma warning restore CA1506
+
405
+
407 public Task StartAsync(CancellationToken cancellationToken)
+
408 => Task.WhenAll(
+
409 repositoryManagerFactory.StartAsync(cancellationToken),
+
410 engineInstaller.CleanCache(cancellationToken));
+
411
+
413 public Task StopAsync(CancellationToken cancellationToken) => repositoryManagerFactory.StopAsync(cancellationToken);
+
414
+
420 ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata) => new(ioManager, metadata.Path!);
+
421 }
+
422}
Standard IDmbFactory.
Definition: DmbFactory.cs:27
Definition: DreamMaker.cs:32
@@ -386,7 +395,7 @@ $(function() {
readonly ITopicClientFactory topicClientFactory
The ITopicClientFactory for the InstanceFactory.
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory.
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory.
-
readonly SessionConfiguration sessionConfiguration
The SessionConfiguration for the InstanceFactory.
+
readonly SessionConfiguration sessionConfiguration
The SessionConfiguration for the InstanceFactory.
readonly IEngineInstaller engineInstaller
The IEngineInstaller for the InstanceFactory.
readonly IIOManager ioManager
The IIOManager for the InstanceFactory.
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the InstanceFactory.
@@ -395,7 +404,7 @@ $(function() {
readonly IChatManagerFactory chatFactory
The IChatManagerFactory for the InstanceFactory.
readonly IRepositoryManagerFactory repositoryManagerFactory
The IRepositoryManagerFactory for the InstanceFactory.
readonly IServerPortProvider serverPortProvider
The IServerPortProvider for the InstanceFactory.
-
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the InstanceFactory.
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the InstanceFactory.
Task StartAsync(CancellationToken cancellationToken)
Task StopAsync(CancellationToken cancellationToken)
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory.
@@ -403,9 +412,10 @@ $(function() {
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceFactory.
ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata)
Create the IIOManager for a given set of instance metadata .
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory.
-
IIOManager CreateGameIOManager(Models.Instance metadata)
Create an IIOManager that resolves to the "Game" directory of the Models.Instance defined by metadata...
+
IIOManager CreateGameIOManager(Models.Instance metadata)
Create an IIOManager that resolves to the "Game" directory of the Models.Instance defined by metadata...
+
readonly IDotnetDumpService dotnetDumpService
The IDotnetDumpService for the InstanceFactory.
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory.
-
async ValueTask< IInstance > CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance. A ValueTask<TResult> resulting in a new IInstance.
+
async ValueTask< IInstance > CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance. A ValueTask<TResult> resulting in a new IInstance.
readonly IFileTransferTicketProvider fileTransferService
The IFileTransferTicketProvider for the InstanceFactory.
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory.
readonly IFilesystemLinkFactory linkFactory
The IFilesystemLinkFactory for the InstanceFactory.
@@ -439,6 +449,7 @@ $(function() {
Manages the runtime of Jobs.
Definition: IJobManager.cs:13
Contains various cryptographic functions.
For retrieving the Assembly's location.
+
Service for managing the dotnet-dump installation.
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
For identifying the current platform.
For launching IProcess'.
diff --git a/_open_dream_installation_8cs_source.html b/_open_dream_installation_8cs_source.html index 42c1854f84..8cbd7b41db 100644 --- a/_open_dream_installation_8cs_source.html +++ b/_open_dream_installation_8cs_source.html @@ -114,139 +114,142 @@ $(function() {
43
45 public override bool PreferFileLogging => true;
46
-
48 public override Task InstallationTask { get; }
+
48 public override bool UseDotnetDump => true;
49
-
53 readonly IAsyncDelayer asyncDelayer;
-
54
-
58 readonly IAbstractHttpClientFactory httpClientFactory;
-
59
-
70 public OpenDreamInstallation(
-
71 IIOManager installationIOManager,
-
72 IAsyncDelayer asyncDelayer,
-
73 IAbstractHttpClientFactory httpClientFactory,
-
74 string serverExePath,
-
75 string compilerExePath,
-
76 Task installationTask,
-
77 EngineVersion version)
-
78 : base(installationIOManager)
-
79 {
-
80 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
-
81 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
-
82 ServerExePath = serverExePath ?? throw new ArgumentNullException(nameof(serverExePath));
-
83 CompilerExePath = compilerExePath ?? throw new ArgumentNullException(nameof(compilerExePath));
-
84 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
-
85 Version = version ?? throw new ArgumentNullException(nameof(version));
-
86
-
87 if (version.Engine!.Value != EngineType.OpenDream)
-
88 throw new ArgumentException($"Invalid EngineType: {version.Engine.Value}", nameof(version));
-
89 }
-
90
-
92 public override string FormatServerArguments(
-
93 IDmbProvider dmbProvider,
-
94 IReadOnlyDictionary<string, string> parameters,
-
95 DreamDaemonLaunchParameters launchParameters,
-
96 string? logFilePath)
-
97 {
-
98 ArgumentNullException.ThrowIfNull(dmbProvider);
-
99 ArgumentNullException.ThrowIfNull(parameters);
-
100 ArgumentNullException.ThrowIfNull(launchParameters);
-
101
-
102 if (!parameters.TryGetValue(DMApiConstants.ParamAccessIdentifier, out var accessIdentifier))
-
103 throw new ArgumentException($"parameters must have \"{DMApiConstants.ParamAccessIdentifier}\" set!", nameof(parameters));
+
51 public override Task InstallationTask { get; }
+
52
+
56 readonly IAsyncDelayer asyncDelayer;
+
57
+
61 readonly IAbstractHttpClientFactory httpClientFactory;
+
62
+
73 public OpenDreamInstallation(
+
74 IIOManager installationIOManager,
+
75 IAsyncDelayer asyncDelayer,
+
76 IAbstractHttpClientFactory httpClientFactory,
+
77 string serverExePath,
+
78 string compilerExePath,
+
79 Task installationTask,
+
80 EngineVersion version)
+
81 : base(installationIOManager)
+
82 {
+
83 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+
84 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+
85 ServerExePath = serverExePath ?? throw new ArgumentNullException(nameof(serverExePath));
+
86 CompilerExePath = compilerExePath ?? throw new ArgumentNullException(nameof(compilerExePath));
+
87 InstallationTask = installationTask ?? throw new ArgumentNullException(nameof(installationTask));
+
88 Version = version ?? throw new ArgumentNullException(nameof(version));
+
89
+
90 if (version.Engine!.Value != EngineType.OpenDream)
+
91 throw new ArgumentException($"Invalid EngineType: {version.Engine.Value}", nameof(version));
+
92 }
+
93
+
95 public override string FormatServerArguments(
+
96 IDmbProvider dmbProvider,
+
97 IReadOnlyDictionary<string, string> parameters,
+
98 DreamDaemonLaunchParameters launchParameters,
+
99 string? logFilePath)
+
100 {
+
101 ArgumentNullException.ThrowIfNull(dmbProvider);
+
102 ArgumentNullException.ThrowIfNull(parameters);
+
103 ArgumentNullException.ThrowIfNull(launchParameters);
104
-
105 var parametersString = EncodeParameters(parameters, launchParameters);
-
106
-
107 var arguments = $"--cvar {(logFilePath != null ? $"log.path=\"{InstallationIOManager.GetDirectoryName(logFilePath)}\" --cvar log.format=\"{InstallationIOManager.GetFileName(logFilePath)}\"" : "log.enabled=false")} --cvar watchdog.token={accessIdentifier} --cvar log.runtimelog=false --cvar net.port={launchParameters.Port!.Value} --cvar opendream.topic_port=0 --cvar opendream.world_params=\"{parametersString}\" --cvar opendream.json_path=\"./{dmbProvider.DmbName}\"";
-
108 return arguments;
-
109 }
-
110
-
112 public override string FormatCompilerArguments(string dmePath)
-
113 => $"--suppress-unimplemented --notices-enabled \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
-
114
-
116 public override async ValueTask StopServerProcess(
-
117 ILogger logger,
-
118 IProcess process,
-
119 string accessIdentifier,
-
120 ushort port,
-
121 CancellationToken cancellationToken)
-
122 {
-
123 ArgumentNullException.ThrowIfNull(logger);
-
124
-
125 const int MaximumTerminationSeconds = 5;
-
126
-
127 logger.LogTrace("Attempting Robust.Server graceful exit (Timeout: {seconds}s)...", MaximumTerminationSeconds);
-
128 var timeout = asyncDelayer.Delay(TimeSpan.FromSeconds(MaximumTerminationSeconds), cancellationToken);
-
129 var lifetime = process.Lifetime;
-
130
-
131 var stopwatch = Stopwatch.StartNew();
-
132 try
-
133 {
-
134 using var httpClient = httpClientFactory.CreateClient();
-
135 using var request = new HttpRequestMessage();
-
136 request.Headers.Add("WatchdogToken", accessIdentifier);
-
137 request.RequestUri = new Uri($"http://localhost:{port}/shutdown");
-
138 request.Content = new StringContent(
-
139 "{\"Reason\":\"TGS session termination\"}",
-
140 Encoding.UTF8,
-
141 new MediaTypeHeaderValue(MediaTypeNames.Application.Json));
-
142 request.Method = HttpMethod.Post;
-
143
-
144 var responseTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
-
145 try
-
146 {
-
147 await Task.WhenAny(timeout, lifetime, responseTask);
-
148 if (responseTask.IsCompleted)
-
149 {
-
150 using var response = await responseTask;
-
151 if (response.IsSuccessStatusCode)
-
152 {
-
153 logger.LogDebug("Robust.Server responded to the shutdown command successfully ({requestMs}ms). Waiting for exit...", stopwatch.ElapsedMilliseconds);
-
154 await Task.WhenAny(timeout, lifetime);
-
155 }
-
156 }
-
157
-
158 if (!lifetime.IsCompleted)
-
159 logger.LogWarning("Robust.Server graceful exit timed out!");
-
160 }
-
161 catch (Exception ex) when (ex is not OperationCanceledException)
-
162 {
-
163 logger.LogDebug(ex, "Unable to send graceful exit request to Robust.Server watchdog API!");
-
164 }
-
165
-
166 if (lifetime.IsCompleted)
-
167 {
-
168 logger.LogTrace("Robust.Server exited without termination");
-
169 return;
-
170 }
-
171 }
-
172 finally
-
173 {
-
174 logger.LogTrace("Robust.Server graceful shutdown attempt took {totalMs}ms", stopwatch.ElapsedMilliseconds);
-
175 }
-
176
-
177 await base.StopServerProcess(logger, process, accessIdentifier, port, cancellationToken);
-
178 }
-
179 }
-
180}
+
105 if (!parameters.TryGetValue(DMApiConstants.ParamAccessIdentifier, out var accessIdentifier))
+
106 throw new ArgumentException($"parameters must have \"{DMApiConstants.ParamAccessIdentifier}\" set!", nameof(parameters));
+
107
+
108 var parametersString = EncodeParameters(parameters, launchParameters);
+
109
+
110 var arguments = $"--cvar {(logFilePath != null ? $"log.path=\"{InstallationIOManager.GetDirectoryName(logFilePath)}\" --cvar log.format=\"{InstallationIOManager.GetFileName(logFilePath)}\"" : "log.enabled=false")} --cvar watchdog.token={accessIdentifier} --cvar log.runtimelog=false --cvar net.port={launchParameters.Port!.Value} --cvar opendream.topic_port=0 --cvar opendream.world_params=\"{parametersString}\" --cvar opendream.json_path=\"./{dmbProvider.DmbName}\"";
+
111 return arguments;
+
112 }
+
113
+
115 public override string FormatCompilerArguments(string dmePath)
+
116 => $"--suppress-unimplemented --notices-enabled \"{dmePath ?? throw new ArgumentNullException(nameof(dmePath))}\"";
+
117
+
119 public override async ValueTask StopServerProcess(
+
120 ILogger logger,
+
121 IProcess process,
+
122 string accessIdentifier,
+
123 ushort port,
+
124 CancellationToken cancellationToken)
+
125 {
+
126 ArgumentNullException.ThrowIfNull(logger);
+
127
+
128 const int MaximumTerminationSeconds = 5;
+
129
+
130 logger.LogTrace("Attempting Robust.Server graceful exit (Timeout: {seconds}s)...", MaximumTerminationSeconds);
+
131 var timeout = asyncDelayer.Delay(TimeSpan.FromSeconds(MaximumTerminationSeconds), cancellationToken);
+
132 var lifetime = process.Lifetime;
+
133
+
134 var stopwatch = Stopwatch.StartNew();
+
135 try
+
136 {
+
137 using var httpClient = httpClientFactory.CreateClient();
+
138 using var request = new HttpRequestMessage();
+
139 request.Headers.Add("WatchdogToken", accessIdentifier);
+
140 request.RequestUri = new Uri($"http://localhost:{port}/shutdown");
+
141 request.Content = new StringContent(
+
142 "{\"Reason\":\"TGS session termination\"}",
+
143 Encoding.UTF8,
+
144 new MediaTypeHeaderValue(MediaTypeNames.Application.Json));
+
145 request.Method = HttpMethod.Post;
+
146
+
147 var responseTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
+
148 try
+
149 {
+
150 await Task.WhenAny(timeout, lifetime, responseTask);
+
151 if (responseTask.IsCompleted)
+
152 {
+
153 using var response = await responseTask;
+
154 if (response.IsSuccessStatusCode)
+
155 {
+
156 logger.LogDebug("Robust.Server responded to the shutdown command successfully ({requestMs}ms). Waiting for exit...", stopwatch.ElapsedMilliseconds);
+
157 await Task.WhenAny(timeout, lifetime);
+
158 }
+
159 }
+
160
+
161 if (!lifetime.IsCompleted)
+
162 logger.LogWarning("Robust.Server graceful exit timed out!");
+
163 }
+
164 catch (Exception ex) when (ex is not OperationCanceledException)
+
165 {
+
166 logger.LogDebug(ex, "Unable to send graceful exit request to Robust.Server watchdog API!");
+
167 }
+
168
+
169 if (lifetime.IsCompleted)
+
170 {
+
171 logger.LogTrace("Robust.Server exited without termination");
+
172 return;
+
173 }
+
174 }
+
175 finally
+
176 {
+
177 logger.LogTrace("Robust.Server graceful shutdown attempt took {totalMs}ms", stopwatch.ElapsedMilliseconds);
+
178 }
+
179
+
180 await base.StopServerProcess(logger, process, accessIdentifier, port, cancellationToken);
+
181 }
+
182 }
+
183}
Information about an engine installation.
EngineType? Engine
The EngineType.
Launch settings for DreamDaemon.
-
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
+
static string EncodeParameters(IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters)
Encode given parameters for passing as world.params on the command line.
Implementation of IEngineInstallation for EngineType.OpenDream.
override string CompilerExePath
The full path to the dm/DreamMaker executable.
-
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstallation.
-
OpenDreamInstallation(IIOManager installationIOManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, string serverExePath, string compilerExePath, Task installationTask, EngineVersion version)
Initializes a new instance of the OpenDreamInstallation class.
-
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstallation.
+
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstallation.
+
OpenDreamInstallation(IIOManager installationIOManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, string serverExePath, string compilerExePath, Task installationTask, EngineVersion version)
Initializes a new instance of the OpenDreamInstallation class.
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstallation.
override bool PromptsForNetworkAccess
If ServerExePath may create network prompts.
-
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
+
override string FormatServerArguments(IDmbProvider dmbProvider, IReadOnlyDictionary< string, string > parameters, DreamDaemonLaunchParameters launchParameters, string? logFilePath)
Return the command line arguments for launching with given launchParameters . The formatted arguments...
override bool HasStandardOutput
If ServerExePath supports being run as a command-line application and outputs log information to be c...
override EngineVersion Version
The EngineVersion of the IEngineInstallation.
override string ServerExePath
The full path to the game server executable.
override bool PreferFileLogging
If HasStandardOutput is set, this indicates that the engine server has good file logging that should ...
-
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
-
return arguments
+
override bool UseDotnetDump
If dotnet-dump should be used to create process dumps for this installation.
+
override Task InstallationTask
The Task that completes when the BYOND version finished installing.
+
return arguments
Constants used for communication with the DMAPI.
const string ParamAccessIdentifier
Identifies the DMApiParameters.AccessIdentifier for the session.
Creates IHttpClients.
@@ -262,7 +265,7 @@ $(function() {
Definition: DmbFactory.cs:22
override string FormatCompilerArguments(string dmePath)
-
override async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
+
override async ValueTask StopServerProcess(ILogger logger, IProcess process, string accessIdentifier, ushort port, CancellationToken cancellationToken)
diff --git a/_open_dream_installer_8cs_source.html b/_open_dream_installer_8cs_source.html index c588ad68b8..dbc640d369 100644 --- a/_open_dream_installer_8cs_source.html +++ b/_open_dream_installer_8cs_source.html @@ -88,310 +88,298 @@ $(function() {
9using Tgstation.Server.Api.Models;
10using Tgstation.Server.Common.Extensions;
11using Tgstation.Server.Common.Http;
-
12using Tgstation.Server.Host.Common;
-
13using Tgstation.Server.Host.Components.Repository;
-
14using Tgstation.Server.Host.Configuration;
-
15using Tgstation.Server.Host.IO;
-
16using Tgstation.Server.Host.Jobs;
-
17using Tgstation.Server.Host.System;
-
18using Tgstation.Server.Host.Utils;
-
19
-
20namespace Tgstation.Server.Host.Components.Engine
-
21{
-
25 class OpenDreamInstaller : EngineInstallerBase
-
26 {
-
30 const string BinDir = "bin";
-
31
-
35 const string ServerDir = "server";
-
36
-
40 const string InstallationCompilerDirectory = "compiler";
-
41
-
45 const string InstallationSourceSubDirectory = "TgsSourceSubdir";
-
46
-
48 protected override EngineType TargetEngineType => EngineType.OpenDream;
-
49
-
53 protected IProcessExecutor ProcessExecutor { get; }
-
54
-
58 protected GeneralConfiguration GeneralConfiguration { get; }
-
59
-
63 protected SessionConfiguration SessionConfiguration { get; }
-
64
-
68 readonly IPlatformIdentifier platformIdentifier;
-
69
-
73 readonly IRepositoryManager repositoryManager;
-
74
-
78 readonly IAsyncDelayer asyncDelayer;
-
79
-
83 readonly IAbstractHttpClientFactory httpClientFactory;
-
84
-
97 public OpenDreamInstaller(
-
98 IIOManager ioManager,
-
99 ILogger<OpenDreamInstaller> logger,
-
100 IPlatformIdentifier platformIdentifier,
-
101 IProcessExecutor processExecutor,
-
102 IRepositoryManager repositoryManager,
-
103 IAsyncDelayer asyncDelayer,
-
104 IAbstractHttpClientFactory httpClientFactory,
-
105 IOptions<GeneralConfiguration> generalConfigurationOptions,
-
106 IOptions<SessionConfiguration> sessionConfigurationOptions)
-
107 : base(ioManager, logger)
-
108 {
-
109 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
-
110 ProcessExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
-
111 this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
-
112 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
-
113 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
-
114 GeneralConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
115 SessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
-
116 }
-
117
-
119 public override Task CleanCache(CancellationToken cancellationToken) => Task.CompletedTask;
-
120
-
122 public override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
-
123 {
-
124 CheckVersionValidity(version);
-
125 GetExecutablePaths(path, out var serverExePath, out var compilerExePath);
-
126 return new OpenDreamInstallation(
-
127 new ResolvingIOManager(IOManager, path),
-
128 asyncDelayer,
-
129 httpClientFactory,
-
130 serverExePath,
-
131 compilerExePath,
-
132 installationTask,
-
133 version);
-
134 }
-
135
-
137 public override async ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
-
138 {
-
139 CheckVersionValidity(version);
-
140
-
141 // get a lock on a system wide OD repo
-
142 Logger.LogTrace("Cloning OD repo...");
-
143
-
144 var progressSection1 = jobProgressReporter?.CreateSection("Updating OpenDream git repository", 0.5f);
-
145
-
146 var repo = await repositoryManager.CloneRepository(
-
147 GeneralConfiguration.OpenDreamGitUrl,
+
12using Tgstation.Server.Host.Components.Repository;
+
13using Tgstation.Server.Host.Configuration;
+
14using Tgstation.Server.Host.IO;
+
15using Tgstation.Server.Host.Jobs;
+
16using Tgstation.Server.Host.System;
+
17using Tgstation.Server.Host.Utils;
+
18
+
19namespace Tgstation.Server.Host.Components.Engine
+
20{
+
24 class OpenDreamInstaller : EngineInstallerBase
+
25 {
+
29 const string BinDir = "bin";
+
30
+
34 const string ServerDir = "server";
+
35
+
39 const string InstallationCompilerDirectory = "compiler";
+
40
+
44 const string InstallationSourceSubDirectory = "TgsSourceSubdir";
+
45
+
47 protected override EngineType TargetEngineType => EngineType.OpenDream;
+
48
+
52 protected IProcessExecutor ProcessExecutor { get; }
+
53
+
57 protected GeneralConfiguration GeneralConfiguration { get; }
+
58
+
62 protected SessionConfiguration SessionConfiguration { get; }
+
63
+
67 readonly IPlatformIdentifier platformIdentifier;
+
68
+
72 readonly IRepositoryManager repositoryManager;
+
73
+
77 readonly IAsyncDelayer asyncDelayer;
+
78
+
82 readonly IAbstractHttpClientFactory httpClientFactory;
+
83
+
96 public OpenDreamInstaller(
+
97 IIOManager ioManager,
+
98 ILogger<OpenDreamInstaller> logger,
+
99 IPlatformIdentifier platformIdentifier,
+
100 IProcessExecutor processExecutor,
+
101 IRepositoryManager repositoryManager,
+
102 IAsyncDelayer asyncDelayer,
+
103 IAbstractHttpClientFactory httpClientFactory,
+
104 IOptions<GeneralConfiguration> generalConfigurationOptions,
+
105 IOptions<SessionConfiguration> sessionConfigurationOptions)
+
106 : base(ioManager, logger)
+
107 {
+
108 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
+
109 ProcessExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
+
110 this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
+
111 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
+
112 this.httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+
113 GeneralConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
114 SessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
+
115 }
+
116
+
118 public override Task CleanCache(CancellationToken cancellationToken) => Task.CompletedTask;
+
119
+
121 public override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
+
122 {
+
123 CheckVersionValidity(version);
+
124 GetExecutablePaths(path, out var serverExePath, out var compilerExePath);
+
125 return new OpenDreamInstallation(
+
126 new ResolvingIOManager(IOManager, path),
+
127 asyncDelayer,
+
128 httpClientFactory,
+
129 serverExePath,
+
130 compilerExePath,
+
131 installationTask,
+
132 version);
+
133 }
+
134
+
136 public override async ValueTask<IEngineInstallationData> DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
+
137 {
+
138 CheckVersionValidity(version);
+
139
+
140 // get a lock on a system wide OD repo
+
141 Logger.LogTrace("Cloning OD repo...");
+
142
+
143 var progressSection1 = jobProgressReporter?.CreateSection("Updating OpenDream git repository", 0.5f);
+
144
+
145 var repo = await repositoryManager.CloneRepository(
+
146 GeneralConfiguration.OpenDreamGitUrl,
+
147 null,
148 null,
149 null,
-
150 null,
-
151 progressSection1,
-
152 true,
-
153 cancellationToken);
-
154
-
155 try
-
156 {
-
157 if (repo == null)
-
158 {
-
159 Logger.LogTrace("OD repo seems to already exist, attempting load and fetch...");
-
160 repo = await repositoryManager.LoadRepository(cancellationToken);
-
161
-
162 await repo!.FetchOrigin(
-
163 progressSection1,
+
150 progressSection1,
+
151 true,
+
152 cancellationToken);
+
153
+
154 try
+
155 {
+
156 if (repo == null)
+
157 {
+
158 Logger.LogTrace("OD repo seems to already exist, attempting load and fetch...");
+
159 repo = await repositoryManager.LoadRepository(cancellationToken);
+
160
+
161 await repo!.FetchOrigin(
+
162 progressSection1,
+
163 null,
164 null,
-
165 null,
-
166 false,
-
167 cancellationToken);
-
168 }
-
169
-
170 var progressSection2 = jobProgressReporter?.CreateSection("Checking out OpenDream version", 0.5f);
-
171
-
172 var committish = version.SourceSHA
-
173 ?? $"{GeneralConfiguration.OpenDreamGitTagPrefix}{version.Version!.Semver()}";
-
174
-
175 await repo.CheckoutObject(
-
176 committish,
+
165 false,
+
166 cancellationToken);
+
167 }
+
168
+
169 var progressSection2 = jobProgressReporter?.CreateSection("Checking out OpenDream version", 0.5f);
+
170
+
171 var committish = version.SourceSHA
+
172 ?? $"{GeneralConfiguration.OpenDreamGitTagPrefix}{version.Version!.Semver()}";
+
173
+
174 await repo.CheckoutObject(
+
175 committish,
+
176 null,
177 null,
-
178 null,
-
179 true,
-
180 progressSection2,
-
181 cancellationToken);
-
182
-
183 if (!await repo.CommittishIsParent("tgs-min-compat", cancellationToken))
-
184 throw new JobException(ErrorCode.OpenDreamTooOld);
-
185
-
186 return new RepositoryEngineInstallationData(IOManager, repo, InstallationSourceSubDirectory);
-
187 }
-
188 catch
-
189 {
-
190 repo?.Dispose();
-
191 throw;
-
192 }
-
193 }
-
194
-
196 public override async ValueTask Install(EngineVersion version, string installPath, CancellationToken cancellationToken)
-
197 {
-
198 CheckVersionValidity(version);
-
199 ArgumentNullException.ThrowIfNull(installPath);
-
200 var sourcePath = IOManager.ConcatPath(installPath, InstallationSourceSubDirectory);
-
201
-
202 if (!await IOManager.DirectoryExists(sourcePath, cancellationToken))
-
203 {
-
204 // a zip install that didn't come from us?
-
205 // we want to use the bin dir, so put everything where we expect
-
206 Logger.LogDebug("Correcting extraction location...");
-
207 var dirsTask = IOManager.GetDirectories(installPath, cancellationToken);
-
208 var filesTask = IOManager.GetFiles(installPath, cancellationToken);
-
209 var dirCreateTask = IOManager.CreateDirectory(sourcePath, cancellationToken);
-
210
-
211 await Task.WhenAll(dirsTask, filesTask, dirCreateTask);
-
212
-
213 var dirsMoveTasks = dirsTask
-
214 .Result
-
215 .Select(
-
216 dirPath => IOManager.MoveDirectory(
-
217 dirPath,
-
218 IOManager.ConcatPath(
-
219 sourcePath,
-
220 IOManager.GetFileName(dirPath)),
-
221 cancellationToken));
-
222 var filesMoveTask = filesTask
-
223 .Result
-
224 .Select(
-
225 filePath => IOManager.MoveFile(
-
226 filePath,
-
227 IOManager.ConcatPath(
-
228 sourcePath,
-
229 IOManager.GetFileName(filePath)),
-
230 cancellationToken));
-
231
-
232 await Task.WhenAll(dirsMoveTasks.Concat(filesMoveTask));
-
233 }
-
234
-
235 var dotnetPaths = DotnetHelper.GetPotentialDotnetPaths(platformIdentifier.IsWindows)
-
236 .ToList();
-
237 var tasks = dotnetPaths
-
238 .Select(path => IOManager.FileExists(path, cancellationToken))
-
239 .ToList();
-
240
-
241 await Task.WhenAll(tasks);
-
242
-
243 var selectedPathIndex = tasks.FindIndex(pathValidTask => pathValidTask.Result);
-
244
-
245 if (selectedPathIndex == -1)
-
246 throw new JobException(ErrorCode.OpenDreamCantFindDotnet);
-
247
-
248 var dotnetPath = dotnetPaths[selectedPathIndex];
-
249
-
250 const string DeployDir = "tgs_deploy";
-
251 int? buildExitCode = null;
-
252 await HandleExtremelyLongPathOperation(
-
253 async shortenedPath =>
-
254 {
-
255 var shortenedDeployPath = IOManager.ConcatPath(shortenedPath, DeployDir);
-
256 await using var buildProcess = ProcessExecutor.LaunchProcess(
-
257 dotnetPath,
-
258 shortenedPath,
-
259 $"run -c Release --project OpenDreamPackageTool -- --tgs -o {shortenedDeployPath}",
-
260 null,
-
261 null,
-
262 !GeneralConfiguration.OpenDreamSuppressInstallOutput,
-
263 !GeneralConfiguration.OpenDreamSuppressInstallOutput);
-
264
-
265 if (SessionConfiguration.LowPriorityDeploymentProcesses)
-
266 buildProcess.AdjustPriority(false);
-
267
-
268 using (cancellationToken.Register(() => buildProcess.Terminate()))
-
269 buildExitCode = await buildProcess.Lifetime;
-
270
-
271 string? output;
-
272 if (!GeneralConfiguration.OpenDreamSuppressInstallOutput)
-
273 {
-
274 var buildOutputTask = buildProcess.GetCombinedOutput(cancellationToken);
-
275 if (!buildOutputTask.IsCompleted)
-
276 Logger.LogTrace("OD build complete, waiting for output...");
-
277 output = await buildOutputTask;
-
278 }
-
279 else
-
280 output = "<Build output suppressed by configuration due to not being immediately available>";
+
178 true,
+
179 progressSection2,
+
180 cancellationToken);
+
181
+
182 if (!await repo.CommittishIsParent("tgs-min-compat", cancellationToken))
+
183 throw new JobException(ErrorCode.OpenDreamTooOld);
+
184
+
185 return new RepositoryEngineInstallationData(IOManager, repo, InstallationSourceSubDirectory);
+
186 }
+
187 catch
+
188 {
+
189 repo?.Dispose();
+
190 throw;
+
191 }
+
192 }
+
193
+
195 public override async ValueTask Install(EngineVersion version, string installPath, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
+
196 {
+
197 CheckVersionValidity(version);
+
198 ArgumentNullException.ThrowIfNull(installPath);
+
199 var sourcePath = IOManager.ConcatPath(installPath, InstallationSourceSubDirectory);
+
200
+
201 if (!await IOManager.DirectoryExists(sourcePath, cancellationToken))
+
202 {
+
203 // a zip install that didn't come from us?
+
204 // we want to use the bin dir, so put everything where we expect
+
205 Logger.LogDebug("Correcting extraction location...");
+
206 var dirsTask = IOManager.GetDirectories(installPath, cancellationToken);
+
207 var filesTask = IOManager.GetFiles(installPath, cancellationToken);
+
208 var dirCreateTask = IOManager.CreateDirectory(sourcePath, cancellationToken);
+
209
+
210 await Task.WhenAll(dirsTask, filesTask, dirCreateTask);
+
211
+
212 var dirsMoveTasks = dirsTask
+
213 .Result
+
214 .Select(
+
215 dirPath => IOManager.MoveDirectory(
+
216 dirPath,
+
217 IOManager.ConcatPath(
+
218 sourcePath,
+
219 IOManager.GetFileName(dirPath)),
+
220 cancellationToken));
+
221 var filesMoveTask = filesTask
+
222 .Result
+
223 .Select(
+
224 filePath => IOManager.MoveFile(
+
225 filePath,
+
226 IOManager.ConcatPath(
+
227 sourcePath,
+
228 IOManager.GetFileName(filePath)),
+
229 cancellationToken));
+
230
+
231 await Task.WhenAll(dirsMoveTasks.Concat(filesMoveTask));
+
232 }
+
233
+
234 var dotnetPath = await DotnetHelper.GetDotnetPath(platformIdentifier, IOManager, cancellationToken);
+
235 if (dotnetPath == null)
+
236 throw new JobException(ErrorCode.OpenDreamCantFindDotnet);
+
237
+
238 const string DeployDir = "tgs_deploy";
+
239 int? buildExitCode = null;
+
240 await HandleExtremelyLongPathOperation(
+
241 async shortenedPath =>
+
242 {
+
243 var shortenedDeployPath = IOManager.ConcatPath(shortenedPath, DeployDir);
+
244 await using var buildProcess = ProcessExecutor.LaunchProcess(
+
245 dotnetPath,
+
246 shortenedPath,
+
247 $"run -c Release --project OpenDreamPackageTool -- --tgs -o {shortenedDeployPath}",
+
248 null,
+
249 null,
+
250 !GeneralConfiguration.OpenDreamSuppressInstallOutput,
+
251 !GeneralConfiguration.OpenDreamSuppressInstallOutput);
+
252
+
253 if (deploymentPipelineProcesses && SessionConfiguration.LowPriorityDeploymentProcesses)
+
254 buildProcess.AdjustPriority(false);
+
255
+
256 using (cancellationToken.Register(() => buildProcess.Terminate()))
+
257 buildExitCode = await buildProcess.Lifetime;
+
258
+
259 string? output;
+
260 if (!GeneralConfiguration.OpenDreamSuppressInstallOutput)
+
261 {
+
262 var buildOutputTask = buildProcess.GetCombinedOutput(cancellationToken);
+
263 if (!buildOutputTask.IsCompleted)
+
264 Logger.LogTrace("OD build complete, waiting for output...");
+
265 output = await buildOutputTask;
+
266 }
+
267 else
+
268 output = "<Build output suppressed by configuration due to not being immediately available>";
+
269
+
270 Logger.LogDebug(
+
271 "OpenDream build exited with code {exitCode}:{newLine}{output}",
+
272 buildExitCode,
+
273 Environment.NewLine,
+
274 output);
+
275 },
+
276 sourcePath,
+
277 cancellationToken);
+
278
+
279 if (buildExitCode != 0)
+
280 throw new JobException("OpenDream build failed!");
281
-
282 Logger.LogDebug(
-
283 "OpenDream build exited with code {exitCode}:{newLine}{output}",
-
284 buildExitCode,
-
285 Environment.NewLine,
-
286 output);
-
287 },
-
288 sourcePath,
-
289 cancellationToken);
-
290
-
291 if (buildExitCode != 0)
-
292 throw new JobException("OpenDream build failed!");
-
293
-
294 var deployPath = IOManager.ConcatPath(sourcePath, DeployDir);
-
295 async ValueTask MoveDirs()
-
296 {
-
297 var dirs = await IOManager.GetDirectories(deployPath, cancellationToken);
-
298 await Task.WhenAll(
-
299 dirs.Select(
-
300 dir => IOManager.MoveDirectory(
-
301 dir,
-
302 IOManager.ConcatPath(
-
303 installPath,
-
304 IOManager.GetFileName(dir)),
-
305 cancellationToken)));
-
306 }
-
307
-
308 async ValueTask MoveFiles()
-
309 {
-
310 var files = await IOManager.GetFiles(deployPath, cancellationToken);
-
311 await Task.WhenAll(
-
312 files.Select(
-
313 file => IOManager.MoveFile(
-
314 file,
-
315 IOManager.ConcatPath(
-
316 installPath,
-
317 IOManager.GetFileName(file)),
-
318 cancellationToken)));
-
319 }
-
320
-
321 var dirsMoveTask = MoveDirs();
-
322 var outputFilesMoveTask = MoveFiles();
-
323 await ValueTaskExtensions.WhenAll(dirsMoveTask, outputFilesMoveTask);
-
324 await IOManager.DeleteDirectory(sourcePath, cancellationToken);
-
325 }
-
326
-
328 public override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
-
329 {
-
330 CheckVersionValidity(version);
-
331 ArgumentNullException.ThrowIfNull(path);
-
332 return ValueTask.CompletedTask;
-
333 }
-
334
-
336 public override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
-
337 {
-
338 ArgumentNullException.ThrowIfNull(engineVersion);
-
339 ArgumentNullException.ThrowIfNull(fullDmbPath);
-
340
-
341 Logger.LogTrace("TrustDmbPath is a no-op: {path}", fullDmbPath);
-
342 return ValueTask.CompletedTask;
-
343 }
-
344
-
352 protected virtual ValueTask HandleExtremelyLongPathOperation(
-
353 Func<string, ValueTask> shortenedPathOperation,
-
354 string originalPath,
-
355 CancellationToken cancellationToken)
-
356 => shortenedPathOperation(originalPath); // based god linux has no such weakness
+
282 var deployPath = IOManager.ConcatPath(sourcePath, DeployDir);
+
283 async ValueTask MoveDirs()
+
284 {
+
285 var dirs = await IOManager.GetDirectories(deployPath, cancellationToken);
+
286 await Task.WhenAll(
+
287 dirs.Select(
+
288 dir => IOManager.MoveDirectory(
+
289 dir,
+
290 IOManager.ConcatPath(
+
291 installPath,
+
292 IOManager.GetFileName(dir)),
+
293 cancellationToken)));
+
294 }
+
295
+
296 async ValueTask MoveFiles()
+
297 {
+
298 var files = await IOManager.GetFiles(deployPath, cancellationToken);
+
299 await Task.WhenAll(
+
300 files.Select(
+
301 file => IOManager.MoveFile(
+
302 file,
+
303 IOManager.ConcatPath(
+
304 installPath,
+
305 IOManager.GetFileName(file)),
+
306 cancellationToken)));
+
307 }
+
308
+
309 var dirsMoveTask = MoveDirs();
+
310 var outputFilesMoveTask = MoveFiles();
+
311 await ValueTaskExtensions.WhenAll(dirsMoveTask, outputFilesMoveTask);
+
312 await IOManager.DeleteDirectory(sourcePath, cancellationToken);
+
313 }
+
314
+
316 public override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
+
317 {
+
318 CheckVersionValidity(version);
+
319 ArgumentNullException.ThrowIfNull(path);
+
320 return ValueTask.CompletedTask;
+
321 }
+
322
+
324 public override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
+
325 {
+
326 ArgumentNullException.ThrowIfNull(engineVersion);
+
327 ArgumentNullException.ThrowIfNull(fullDmbPath);
+
328
+
329 Logger.LogTrace("TrustDmbPath is a no-op: {path}", fullDmbPath);
+
330 return ValueTask.CompletedTask;
+
331 }
+
332
+
340 protected virtual ValueTask HandleExtremelyLongPathOperation(
+
341 Func<string, ValueTask> shortenedPathOperation,
+
342 string originalPath,
+
343 CancellationToken cancellationToken)
+
344 => shortenedPathOperation(originalPath); // based god linux has no such weakness
+
345
+
352 protected void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
+
353 {
+
354 var exeExtension = platformIdentifier.IsWindows
+
355 ? ".exe"
+
356 : String.Empty;
357
-
364 protected void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
-
365 {
-
366 var exeExtension = platformIdentifier.IsWindows
-
367 ? ".exe"
-
368 : String.Empty;
-
369
-
370 serverExePath = IOManager.ConcatPath(
-
371 installationPath,
-
372 BinDir,
-
373 ServerDir,
-
374 $"Robust.Server{exeExtension}");
-
375
-
376 compilerExePath = IOManager.ConcatPath(
-
377 installationPath,
-
378 BinDir,
-
379 InstallationCompilerDirectory,
-
380 $"DMCompiler{exeExtension}");
-
381 }
-
382 }
-
383}
+
358 serverExePath = IOManager.ConcatPath(
+
359 installationPath,
+
360 BinDir,
+
361 ServerDir,
+
362 $"Robust.Server{exeExtension}");
+
363
+
364 compilerExePath = IOManager.ConcatPath(
+
365 installationPath,
+
366 BinDir,
+
367 InstallationCompilerDirectory,
+
368 $"DMCompiler{exeExtension}");
+
369 }
+
370 }
+
371}
Information about an engine installation.
Extension methods for the ValueTask and ValueTask<TResult> classes.
static async ValueTask WhenAll(IEnumerable< ValueTask > tasks)
Fully await a given list of tasks .
@@ -400,25 +388,25 @@ $(function() {
IIOManager IOManager
Gets the IIOManager for the EngineInstallerBase.
ILogger< EngineInstallerBase > Logger
Gets the ILogger for the EngineInstallerBase.
Implementation of IEngineInstallation for EngineType.OpenDream.
-
Implementation of IEngineInstaller for EngineType.OpenDream.
-
void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
Gets the paths to the server and client executables.
-
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstaller.
-
override EngineType TargetEngineType
-
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the OpenDreamInstaller.
-
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the OpenDream repository.
-
override async ValueTask Install(EngineVersion version, string installPath, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
-
override async ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
-
override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
-
const string ServerDir
The OD server directory name.
-
override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
+
Implementation of IEngineInstaller for EngineType.OpenDream.
+
void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
Gets the paths to the server and client executables.
+
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstaller.
+
override EngineType TargetEngineType
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the OpenDreamInstaller.
+
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the OpenDream repository.
+
override async ValueTask Install(EngineVersion version, string installPath, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
+
override async ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
+
override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
+
const string ServerDir
The OD server directory name.
+
override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
override Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
-
OpenDreamInstaller(IIOManager ioManager, ILogger< OpenDreamInstaller > logger, IPlatformIdentifier platformIdentifier, IProcessExecutor processExecutor, IRepositoryManager repositoryManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SessionConfiguration > sessionConfigurationOptions)
Initializes a new instance of the OpenDreamInstaller class.
-
const string InstallationCompilerDirectory
The name of the subdirectory in an installation's BinDir used to store the compiler binaries.
-
const string InstallationSourceSubDirectory
The name of the subdirectory used for the RepositoryEngineInstallationData's copy.
-
override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
-
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstaller.
+
OpenDreamInstaller(IIOManager ioManager, ILogger< OpenDreamInstaller > logger, IPlatformIdentifier platformIdentifier, IProcessExecutor processExecutor, IRepositoryManager repositoryManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SessionConfiguration > sessionConfigurationOptions)
Initializes a new instance of the OpenDreamInstaller class.
+
const string InstallationCompilerDirectory
The name of the subdirectory in an installation's BinDir used to store the compiler binaries.
+
const string InstallationSourceSubDirectory
The name of the subdirectory used for the RepositoryEngineInstallationData's copy.
+
override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstaller.
virtual ValueTask HandleExtremelyLongPathOperation(Func< string, ValueTask > shortenedPathOperation, string originalPath, CancellationToken cancellationToken)
Perform an operation on a very long path.
-
const string BinDir
The bin directory name.
+
const string BinDir
The bin directory name.
Implementation of IEngineInstallationData using a IRepository.
General configuration options.
bool OpenDreamSuppressInstallOutput
If the dotnet output of creating an OpenDream installation should be suppressed. Known to cause issue...
@@ -429,6 +417,8 @@ $(function() {
Operation exceptions thrown from the context of a Models.Job.
Definition: JobException.cs:11
Progress reporter for a Job.
JobProgressReporter CreateSection(string? newStageName, double percentage)
Create a subsection of the JobProgressReporter with its optional own stage name.
+
Helper methods for working with the dotnet executable.
Definition: DotnetHelper.cs:14
+
static async ValueTask< string?> GetDotnetPath(IPlatformIdentifier platformIdentifier, IIOManager ioManager, CancellationToken cancellationToken)
Locate a dotnet executable to use.
Definition: DotnetHelper.cs:22
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments, IReadOnlyDictionary< string, string >? environment, string? fileRedirect, bool readStandardHandles, bool noShellExecute)
Launch a IProcess. The new IProcess.
Creates IHttpClients.
@@ -444,11 +434,9 @@ $(function() {
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns full directory names in a given path .
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path .
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory, removes and does not enter any symlinks encounterd.
-
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists.
Task MoveDirectory(string source, string destination, CancellationToken cancellationToken)
Moves a directory at source to destination .
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists.
For identifying the current platform.
-
bool IsWindows
If the current platform is a Windows platform.
void AdjustPriority(bool higher)
Set's the owned global::System.Diagnostics.Process.PriorityClass to a non-normal value.
For launching IProcess'.
For waiting asynchronously.
@@ -457,7 +445,6 @@ $(function() {
EngineType
The type of engine the codebase is using.
Definition: EngineType.cs:7
-
Definition: DotnetHelper.cs:9
diff --git a/_pipe_commands_8cs_source.html b/_pipe_commands_8cs_source.html index bc95f9fbb9..79d44615c5 100644 --- a/_pipe_commands_8cs_source.html +++ b/_pipe_commands_8cs_source.html @@ -115,7 +115,7 @@ $(function() {
const string CommandStop
Stops the server ASAP, shutting down any running instances.
Definition: PipeCommands.cs:11
const string CommandGracefulShutdown
Stops the server eventually, waiting for the games in any running instances to reboot.
Definition: PipeCommands.cs:16
const string CommandStartupComplete
Indicates that the host has finished initializing.
Definition: PipeCommands.cs:26
-
Definition: DotnetHelper.cs:9
+
Definition: DotnetHelper.cs:9