]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add <path> keys for all of the compile-time paths.
authorPeter Powell <petpow@saberuk.com>
Wed, 10 Jul 2013 17:11:48 +0000 (18:11 +0100)
committerPeter Powell <petpow@saberuk.com>
Mon, 12 Aug 2013 15:53:33 +0000 (16:53 +0100)
Also, make all paths in the config relative to their associated
directory. This reverts a change in 2.0 which turned out to be a
terrible idea, especially for system-wide installations.

13 files changed:
docs/conf/inspircd.conf.example
docs/conf/modules.conf.example
include/configreader.h
src/configparser.cpp
src/configreader.cpp
src/inspircd.cpp
src/logger.cpp
src/modmanager_dynamic.cpp
src/modules.cpp
src/modules/extra/m_ssl_gnutls.cpp
src/modules/extra/m_ssl_openssl.cpp
src/modules/m_nationalchars.cpp
src/modules/m_xline_db.cpp

index 0e5d40c0821ae2bf625015beaa2215e2d0f2f999..036a3ebfce4f05a765c465936c319e680894cea1 100644 (file)
 
 # This file has all the information about oper classes, types and o:lines.
 # You *MUST* edit it.
-<include file="conf/examples/opers.conf.example">
+<include file="examples/opers.conf.example">
 
 # This file has all the information about server links and ulined servers.
 # You *MUST* edit it if you intend to link servers.
-<include file="conf/examples/links.conf.example">
+<include file="examples/links.conf.example">
 
 #-#-#-#-#-#-#-#-#-#-  MISCELLANEOUS CONFIGURATION  -#-#-#-#-#-#-#-#-#-#
 #                                                                     #
 #   motd - displayed on connect and when a user executes /MOTD
 #   rules - displayed when the user executes /RULES
 # Modules can also define their own files
-<files motd="conf/examples/motd.txt.example" rules="conf/examples/rules.txt.example">
+<files motd="examples/motd.txt.example" rules="examples/rules.txt.example">
 
 # Example of an executable file include. Note this will be read on rehash,
 # not when the command is run.
         # maxaway: Maximum length of an away message.
         maxaway="200">
 
+#-#-#-#-#-#-#-#-#-#-#-#-# PATHS CONFIGURATION #-#-#-#-#-#-#-#-#-#-#-#-#
+#                                                                     #
+# This configuration tag defines the location that InspIRCd stores    #
+# various types of files such as configuration files, log files and   #
+# modules. You will probably not need to change these from the values #
+# set when InspIRCd was built unless you are using a binary package   #
+# where you do not have the ability to set build time configuration.  #
+#<path configdir="conf" datadir="data" logdir="logs" moduledir="modules">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Logging
 # provide almost all the features of InspIRCd. :)                     #
 #                                                                     #
 # The default does nothing -- we include it for simplicity for you.   #
-<include file="conf/examples/modules.conf.example">
+<include file="examples/modules.conf.example">
 
 # Here are some pre-built modules.conf files that closely match the
 # default configurations of some popular IRCd's. You still may want to
 # recommended that you make your own modules file based on modules.conf.example.
 
 # Settings similar to UnrealIRCd defaults.
-#<include file="conf/examples/modules/unrealircd.conf.example">
+#<include file="examples/modules/unrealircd.conf.example">
 
 # Settings similar to Charybdis IRCd defaults.
-#<include file="conf/examples/modules/charybdis.conf.example">
+#<include file="examples/modules/charybdis.conf.example">
 
 
 #########################################################################
index 7e1a9f5add99a83f689dc43cefa6988c03f317e0..228d96312936702e79b9527b5f8626ec85e233b2 100644 (file)
 # specify some censor tags. See also:                                 #
 # http://wiki.inspircd.org/Modules/censor                             #
 #
-#<include file="conf/examples/censor.conf.example">
+#<include file="examples/censor.conf.example">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # CGI:IRC module: Adds support for automatic host changing in CGI:IRC
 # specfiy below the path to the filter.conf file, or define some      #
 # <filter> tags.                                                      #
 #                                                                     #
-#<include file="conf/examples/filter.conf.example">
+#<include file="examples/filter.conf.example">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Gecosban: Implements extended ban r:, which stops anyone matching
 # specify below the path to the helpop.conf file, or if you like to   #
 # make a mess, define your helpop tags in this conf.                  #
 #                                                                     #
-#<include file="conf/examples/inspircd.helpop-full.example">
+#<include file="examples/inspircd.helpop-full.example">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # HIDECHANS module: Allows opers to hide their channels list from non-
 #                 Read the comment above <connect:allowmotdcolors> in #
 #                 inspircd.conf.example for details.                  #
 #                                                                     #
-#<opermotd file="conf/examples/opermotd.txt.example" onoper="yes" processcolors="false">
+#<opermotd file="examples/opermotd.txt.example" onoper="yes" processcolors="false">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Override module: Adds support for oper override
index 0d514e41d3d12a37013bf8e5d07d5d41fd17f834..bf5acbbc8a5f0333b559ed504139899211f7ebe3 100644 (file)
@@ -184,6 +184,32 @@ class CoreExport ServerConfig
        void CrossCheckConnectBlocks(ServerConfig* current);
 
  public:
+       class ServerPaths
+       {
+        public:
+               /** Config path */
+               std::string Config;
+
+               /** Data path */
+               std::string Data;
+
+               /** Log path */
+               std::string Log;
+
+               /** Module path */
+               std::string Module;
+
+               ServerPaths()
+                       : Config(CONFIG_PATH)
+                       , Data(DATA_PATH)
+                       , Log(LOG_PATH)
+                       , Module(MOD_PATH) { }
+
+               std::string PrependConfig(const std::string& fn) const { return ServerConfig::ExpandPath(Config, fn); }
+               std::string PrependData(const std::string& fn) const { return ServerConfig::ExpandPath(Data, fn); }
+               std::string PrependLog(const std::string& fn) const { return ServerConfig::ExpandPath(Log, fn); }
+               std::string PrependModule(const std::string& fn) const { return ServerConfig::ExpandPath(Module, fn); }
+       };
 
        /** Get a configuration tag
         * @param tag The name of the tag to get
@@ -220,6 +246,9 @@ class CoreExport ServerConfig
         */
        ServerLimits Limits;
 
+       /** Locations of various types of file (config, module, etc). */
+       ServerPaths Paths;
+
        /** Configuration parsed from the command line.
         */
        CommandLineConf cmdline;
@@ -333,13 +362,6 @@ class CoreExport ServerConfig
         */
        char DisabledCModes[64];
 
-       /** The full path to the modules directory.
-        * This is either set at compile time, or
-        * overridden in the configuration file via
-        * the \<path> tag.
-        */
-       std::string ModPath;
-
        /** If set to true, then all opers on this server are
         * shown with a generic 'is an IRC operator' line rather
         * than the oper type. Oper types are still used internally.
@@ -508,7 +530,7 @@ class CoreExport ServerConfig
 
        /** Returns true if the given string starts with a windows drive letter
         */
-       bool StartsWithWindowsDriveLetter(const std::string &path);
+       static bool StartsWithWindowsDriveLetter(const std::string& path);
 
        bool ApplyDisabledCommands(const std::string& data);
 
@@ -523,7 +545,13 @@ class CoreExport ServerConfig
         * @return True if the file exists and is readable.
         */
        static bool FileExists(const char* file);
-       
+
+       /** Expands a path fragment to a full path.
+        * @param base The base path to expand from
+        * @param fragment The path fragment to expand on top of base.
+        */
+       static std::string ExpandPath(const std::string& base, const std::string& fragment);
+
        /** Escapes a value for storage in a configuration key.
         * @param str The string to escape.
         * @param xml Are we using the XML config format?
index f3e79e2fdcbc8bc0f374c6b00b1a90b02d54f53f..1783e901e8f8a23f725a537479fab617a36b2c8e 100644 (file)
@@ -323,9 +323,10 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int
        if (exec && (flags & FLAG_NO_EXEC))
                throw CoreException("Invalid <execfiles> tag in file included with noexec=\"yes\"");
 
-       FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(name.c_str(), "r"), exec);
+       std::string path = ServerInstance->Config->Paths.PrependConfig(name);
+       FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(path.c_str(), "r"), exec);
        if (!file)
-               throw CoreException("Could not read \"" + name + "\" for \"" + key + "\" file");
+               throw CoreException("Could not read \"" + path + "\" for \"" + key + "\" file");
 
        file_cache& cache = FilesOutput[key];
        cache.clear();
@@ -345,23 +346,24 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int
 
 bool ParseStack::ParseFile(const std::string& name, int flags, const std::string& mandatory_tag)
 {
-       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading file %s", name.c_str());
+       std::string path = ServerInstance->Config->Paths.PrependConfig(name);
+       ServerInstance->Logs->Log("CONFIG", LOG_DEBUG, "Reading file %s", path.c_str());
        for (unsigned int t = 0; t < reading.size(); t++)
        {
                if (std::string(name) == reading[t])
                {
-                       throw CoreException("File " + name + " is included recursively (looped inclusion)");
+                       throw CoreException("File " + path + " is included recursively (looped inclusion)");
                }
        }
 
        /* It's not already included, add it to the list of files we've loaded */
 
-       FileWrapper file(fopen(name.c_str(), "r"));
+       FileWrapper file(fopen(path.c_str(), "r"));
        if (!file)
-               throw CoreException("Could not read \"" + name + "\" for include");
+               throw CoreException("Could not read \"" + path + "\" for include");
 
-       reading.push_back(name);
-       Parser p(*this, flags, file, name, mandatory_tag);
+       reading.push_back(path);
+       Parser p(*this, flags, file, path, mandatory_tag);
        bool ok = p.outer_parse();
        reading.pop_back();
        return ok;
index 27b9e5c77b5e1e3dcedec3e6ffbba9260a6ffc04..af7a8ca59889f5fdad9ddbfba4acc39ebf12cbe7 100644 (file)
@@ -383,7 +383,6 @@ void ServerConfig::Fill()
        AdminName = ConfValue("admin")->getString("name", "");
        AdminEmail = ConfValue("admin")->getString("email", "null@example.com");
        AdminNick = ConfValue("admin")->getString("nick", "admin");
-       ModPath = ConfValue("path")->getString("moduledir", MOD_PATH);
        NetBufferSize = ConfValue("performance")->getInt("netbuffersize", 10240, 1024, 65534);
        dns_timeout = ConfValue("dns")->getInt("timeout", 5);
        DisabledCommands = ConfValue("disabled")->getString("commands", "");
@@ -417,6 +416,10 @@ void ServerConfig::Fill()
        Limits.MaxGecos = ConfValue("limits")->getInt("maxgecos", 128);
        Limits.MaxAway = ConfValue("limits")->getInt("maxaway", 200);
        Limits.MaxLine = ConfValue("limits")->getInt("maxline", 512);
+       Paths.Config = ConfValue("path")->getString("configdir", CONFIG_PATH);
+       Paths.Data = ConfValue("path")->getString("datadir", DATA_PATH);
+       Paths.Log = ConfValue("path")->getString("logdir", LOG_PATH);
+       Paths.Module = ConfValue("path")->getString("moduledir", MOD_PATH);
        InvBypassModes = options->getBool("invitebypassmodes", true);
        NoSnoticeStack = options->getBool("nosnoticestack", false);
 
@@ -791,6 +794,15 @@ std::string ServerConfig::Escape(const std::string& str, bool xml)
        return escaped;
 }
 
+std::string ServerConfig::ExpandPath(const std::string& base, const std::string& fragment)
+{
+       // The fragment is an absolute path, don't modify it.
+       if (fragment[0] == '/' || ServerConfig::StartsWithWindowsDriveLetter(fragment))
+               return fragment;
+
+       return base + '/' + fragment;
+}
+
 const char* ServerConfig::CleanFilename(const char* name)
 {
        const char* p = name + strlen(name);
index 59c65b931d34d6617b66e997695eef139c9def08..f2095c4a2d17bdd9b5bb1d091a0b4676ebf2670d 100644 (file)
@@ -207,7 +207,7 @@ void InspIRCd::WritePID(const std::string &filename)
 #ifndef _WIN32
        std::string fname(filename);
        if (fname.empty())
-               fname = DATA_PATH "/inspircd.pid";
+               fname = ServerInstance->Config->Paths.PrependData("inspircd.pid");
        std::ofstream outfile(fname.c_str());
        if (outfile.is_open())
        {
index 47c726c51b648ec35ed177f2d27654235fb04675..61ac517c70342938cceab95175a1bf89378b1305 100644 (file)
@@ -112,7 +112,7 @@ void LogManager::OpenFileLogs()
                        loglevel = LOG_NONE;
                }
                FileWriter* fw;
-               std::string target = tag->getString("target");
+               std::string target = ServerInstance->Config->Paths.PrependLog(tag->getString("target"));
                std::map<std::string, FileWriter*>::iterator fwi = logmap.find(target);
                if (fwi == logmap.end())
                {
index 92a7e0a32580cfb01b3d798abcf93f4d1aa1cd60..750a1c448002c8cc17b416cdf7618b8e8160ab22 100644 (file)
@@ -37,7 +37,7 @@ bool ModuleManager::Load(const std::string& filename, bool defer)
        if (filename.find('/') != std::string::npos)
                return false;
 
-       const std::string moduleFile = ServerInstance->Config->ModPath + "/" + filename;
+       const std::string moduleFile = ServerInstance->Config->Paths.PrependModule(filename);
 
        if (!ServerConfig::FileExists(moduleFile.c_str()))
        {
@@ -190,7 +190,7 @@ void ModuleManager::LoadAll()
        std::cout << std::endl << "Loading core commands";
        fflush(stdout);
 
-       DIR* library = opendir(ServerInstance->Config->ModPath.c_str());
+       DIR* library = opendir(ServerInstance->Config->Paths.Module.c_str());
        if (library)
        {
                dirent* entry = NULL;
index 5fc8ffc471bddb6ea0ad99b7573b07d6cbd4f08f..47c99408838ee58136c549f164f6283ee856a8d6 100644 (file)
@@ -577,7 +577,8 @@ FileReader::FileReader(const std::string& filename)
 void FileReader::Load(const std::string& filename)
 {
        // If the file is stored in the file cache then we used that version instead.
-       ConfigFileCache::iterator it = ServerInstance->Config->Files.find(filename);
+       std::string realName = ServerInstance->Config->Paths.PrependConfig(filename);
+       ConfigFileCache::iterator it = ServerInstance->Config->Files.find(realName);
        if (it != ServerInstance->Config->Files.end())
        {
                this->lines = it->second;
@@ -586,7 +587,7 @@ void FileReader::Load(const std::string& filename)
        {
                lines.clear();
 
-               std::ifstream stream(filename.c_str());
+               std::ifstream stream(realName.c_str());
                if (!stream.is_open())
                        throw CoreException(filename + " does not exist or is not readable!");
 
index a3502a57b2211005454c5d36ff18e3764bfe76c2..28755f05e42d2483cc7dcb7996b61d14f01d8f8a 100644 (file)
@@ -684,10 +684,10 @@ class ModuleSSLGnuTLS : public Module
 
                ConfigTag* Conf = ServerInstance->Config->ConfValue("gnutls");
 
-               cafile = Conf->getString("cafile", CONFIG_PATH "/ca.pem");
-               crlfile = Conf->getString("crlfile", CONFIG_PATH "/crl.pem");
-               certfile = Conf->getString("certfile", CONFIG_PATH "/cert.pem");
-               keyfile = Conf->getString("keyfile", CONFIG_PATH "/key.pem");
+               cafile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("cafile", "ca.pem"));
+               crlfile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("crlfile", "crl.pem"));
+               certfile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("certfile", "cert.pem"));
+               keyfile = ServerInstance->Config->Paths.PrependConfig(Conf->getString("keyfile", "key.pem"));
                int dh_bits = Conf->getInt("dhbits");
                std::string hashname = Conf->getString("hash", "md5");
 
index 29f574fd0b0dcf6d11116c94c229c7007784dba8..c94527ab07e2f63c00422404b9f6ee19dd462e4b 100644 (file)
@@ -558,10 +558,10 @@ class ModuleSSLOpenSSL : public Module
 
                ConfigTag* conf = ServerInstance->Config->ConfValue("openssl");
 
-               cafile   = conf->getString("cafile", CONFIG_PATH "/ca.pem");
-               certfile = conf->getString("certfile", CONFIG_PATH "/cert.pem");
-               keyfile  = conf->getString("keyfile", CONFIG_PATH "/key.pem");
-               dhfile   = conf->getString("dhfile", CONFIG_PATH "/dhparams.pem");
+               cafile   = ServerInstance->Config->Paths.PrependConfig(conf->getString("cafile", "ca.pem"));
+               certfile = ServerInstance->Config->Paths.PrependConfig(conf->getString("certfile", "cert.pem"));
+               keyfile  = ServerInstance->Config->Paths.PrependConfig(conf->getString("keyfile", "key.pem"));
+               dhfile   = ServerInstance->Config->Paths.PrependConfig(conf->getString("dhfile", "dhparams.pem"));
                std::string hash = conf->getString("hash", "md5");
 
                iohook.digest = EVP_get_digestbyname(hash.c_str());
index 10347ac67534a83d58b0c5c28b270d28da2857c3..99e525398ba00075e0fd15a37bc23619c9b9f99f 100644 (file)
@@ -298,7 +298,7 @@ class ModuleNationalChars : public Module
        /*so Bynets Unreal distribution stuff*/
        void loadtables(std::string filename, unsigned char ** tables, unsigned char cnt, char faillimit)
        {
-               std::ifstream ifs(filename.c_str());
+               std::ifstream ifs(ServerInstance->Config->Paths.PrependConfig(filename).c_str());
                if (ifs.fail())
                {
                        ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "loadtables() called for missing file: %s", filename.c_str());
index df6f4c10c5e54e704362692dab16114546f7aba1..63eb6d3ee7bb36c2e050d17b198eace1d38ef288 100644 (file)
@@ -36,7 +36,7 @@ class ModuleXLineDB : public Module
                 *              ...and so is discarding all current in-memory XLines for the ones in the database.
                 */
                ConfigTag* Conf = ServerInstance->Config->ConfValue("xlinedb");
-               xlinedbpath = Conf->getString("filename", DATA_PATH "/xline.db");
+               xlinedbpath = ServerInstance->Config->Paths.PrependData(Conf->getString("filename", "xline.db"));
 
                // Read xlines before attaching to events
                ReadDatabase();