aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/config/config.h
blob: 55aee07f93f7650675af28ebedf5a4b5fc99fff9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include <zencore/logbase.h>
#include <zencore/trace.h>
#include <zencore/zencore.h>
#include <zenhttp/httpserver.h>
#include <zenutil/config/loggingconfig.h>
#include <filesystem>
#include <string>
#include <vector>

namespace zen::LuaConfig {
struct Options;
}
namespace cxxopts {
class Options;
class ParseResult;
}  // namespace cxxopts
namespace zen {

// Common server configuration

struct ZenStatsConfig
{
	bool		Enabled	   = false;
	std::string StatsdHost = "localhost";
	int			StatsdPort = 8125;
};

struct ZenSentryConfig
{
	bool		Disable	 = false;
	bool		AllowPII = false;  // Allow personally identifiable information in sentry crash reports
	std::string Dsn;
	std::string Environment;
	bool		Debug = false;	// Enable debug mode for Sentry
};

struct ZenServerConfig
{
	HttpServerConfig	  HttpConfig;
	ZenSentryConfig		  SentryConfig;
	ZenStatsConfig		  StatsConfig;
	ZenLoggingConfig	  LoggingConfig;
	int					  BasePort	   = 8558;	// Service listen port (used for both UDP and TCP)
	int					  OwnerPid	   = 0;		// Parent process id (zero for standalone)
	bool				  IsDebug	   = false;
	bool				  IsCleanStart = false;	 // Indicates whether all state should be wiped on startup or not
	bool				  IsPowerCycle = false;	 // When true, the process shuts down immediately after initialization
	bool				  IsTest	   = false;
	bool				  Detach	   = true;	// Whether zenserver should detach from existing process group (Mac/Linux)
	int					  CoreLimit	   = 0;		// If set, hardware concurrency queries are capped at this number
	int					  LieCpu	   = 0;
	bool				  IsDedicated  = false;	 // Indicates a dedicated/shared instance, with larger resource requirements
	bool				  ShouldCrash  = false;	 // Option for testing crash handling
	bool				  IsFirstRun   = false;
	std::filesystem::path ConfigFile;		   // Path to Lua config file
	std::filesystem::path SystemRootDir;	   // System root directory (used for machine level config)
	std::filesystem::path ContentDir;		   // Root directory for serving frontend content (experimental)
	std::filesystem::path DataDir;			   // Root directory for state (used for testing)
	std::filesystem::path BaseSnapshotDir;	   // Path to server state snapshot (will be copied into data dir on start)
	std::string			  ChildId;			   // Id assigned by parent process (used for lifetime management)
	std::filesystem::path SecurityConfigPath;  // Path to a Json security configuration file

#if ZEN_WITH_TRACE
	bool		 HasTraceCommandlineOptions = false;
	TraceOptions TraceCmdLineOptions;
#endif
	std::string MemoryOptions;	// Memory allocation options
	std::string CommandLine;
	std::string EncryptionKey;	// 256 bit AES encryption key
	std::string EncryptionIV;	// 128 bit AES initialization vector

	bool InstallService	  = false;	// Flag used to initiate service install (temporary)
	bool UninstallService = false;	// Flag used to initiate service uninstall (temporary)
};

/** Configuration helper - pulls together command line, environment variables
	and config file parsing logic. Designed to allow a set of common configuration
	options to be shared among a set of applications which may or may not all be
	linked into a single executable.

	The virtual functions are used by derived classes to extend and customize the
	configuration process.
 */
struct ZenServerConfiguratorBase
{
	ZenServerConfiguratorBase(ZenServerConfig& BaseServerOptions);
	virtual ~ZenServerConfiguratorBase();

	void Configure(int argc, char* argv[]);

protected:
	virtual void AddCliOptions(cxxopts::Options& options)			= 0;
	virtual void ApplyOptions(cxxopts::Options& options)			= 0;
	virtual void ValidateOptions()									= 0;
	virtual void AddConfigOptions(LuaConfig::Options& Options)		= 0;
	virtual void OnConfigFileParsed(LuaConfig::Options& LuaOptions) = 0;

private:
	ZenServerConfig& m_ServerOptions;

	void ParseEnvVariables(const cxxopts::ParseResult& CmdLineResult);
	void ParseConfigFile(const std::filesystem::path& Path, const cxxopts::ParseResult& CmdLineResult, std::string_view OutputConfigFile);
	void AddCommonConfigOptions(LuaConfig::Options& LuaOptions);
};

void EmitCentralManifest(const std::filesystem::path& SystemRoot, Oid Identifier, CbObject Manifest, std::filesystem::path ManifestPath);
std::vector<CbObject> ReadAllCentralManifests(const std::filesystem::path& SystemRoot);

}  // namespace zen