diff options
author | dominique.leuenberger@gmail.com <dominique.leuenberger@gmail.com@c587cffe-e639-0410-9787-d7902ae8ed56> | 2011-06-03 14:26:17 +0000 |
---|---|---|
committer | dominique.leuenberger@gmail.com <dominique.leuenberger@gmail.com@c587cffe-e639-0410-9787-d7902ae8ed56> | 2011-06-03 14:26:17 +0000 |
commit | e153b88f182daa7dbd543d13dd5235cd48f32db2 (patch) | |
tree | c868ae7789962e6cbacee5e14ff36555f63025c7 /libproxy | |
parent | 5ca5494b829067dc49355e506dd16c06911ff1e8 (diff) | |
download | libproxy-e153b88f182daa7dbd543d13dd5235cd48f32db2.tar.gz |
Issue 150: Add sysconfig parser for distributions using /etc/sysconfig for their 'admin' suites (openSUSE/SLE/EduLife for example The module is enabled when libproxy is being built on a system that has /etc/sysconfig to be found
git-svn-id: http://libproxy.googlecode.com/svn/trunk@810 c587cffe-e639-0410-9787-d7902ae8ed56
Diffstat (limited to 'libproxy')
-rw-r--r-- | libproxy/cmake/modules.cmk | 2 | ||||
-rw-r--r-- | libproxy/cmake/modules/config_sysconfig.cmk | 5 | ||||
-rw-r--r-- | libproxy/modules/config_sysconfig.cpp | 165 |
3 files changed, 172 insertions, 0 deletions
diff --git a/libproxy/cmake/modules.cmk b/libproxy/cmake/modules.cmk index 1cc2d24..48346de 100644 --- a/libproxy/cmake/modules.cmk +++ b/libproxy/cmake/modules.cmk @@ -9,6 +9,7 @@ endif() include(cmake/pxmodule.cmk) include(cmake/pkgconfig.cmk) include(cmake/modules/config_envvar.cmk) +include(cmake/modules/config_sysconfig.cmk) include(cmake/modules/config_gnome.cmk) include(cmake/modules/config_kde4.cmk) include(cmake/modules/config_macosx.cmk) @@ -28,6 +29,7 @@ endif() # message("MODULES TO BUILD:") px_module(config_envvar "${ENVVAR_FOUND}" 1) +px_module(config_sysconfig "${SYSCONFIG_FOUND}" 1) px_module(config_gnome "${GNOME2_FOUND}" 0) px_module(config_gnome3 "${GNOME3_FOUND}" 0) px_module(config_kde4 "${KDE4_FOUND}" 0 ${KDE4_LIBRARIES}) diff --git a/libproxy/cmake/modules/config_sysconfig.cmk b/libproxy/cmake/modules/config_sysconfig.cmk new file mode 100644 index 0000000..4dba046 --- /dev/null +++ b/libproxy/cmake/modules/config_sysconfig.cmk @@ -0,0 +1,5 @@ +if (NOT WIN32 AND NOT APPLE) + if (EXISTS "/etc/sysconfig" AND IS_DIRECTORY "/etc/sysconfig") + set(SYSCONFIG_FOUND 1) + endif() +endif()
\ No newline at end of file diff --git a/libproxy/modules/config_sysconfig.cpp b/libproxy/modules/config_sysconfig.cpp new file mode 100644 index 0000000..616585a --- /dev/null +++ b/libproxy/modules/config_sysconfig.cpp @@ -0,0 +1,165 @@ +/******************************************************************************* + * libproxy sysconfig module + * Copyright (C) 2010 Novell Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + ******************************************************************************/ + +#include <sys/stat.h> +#include <cstdlib> +#include <map> +#include <fstream> + +#include "../extension_config.hpp" +using namespace libproxy; +using std::map; + +enum Trim { + NO_TRIM = 0x00, + L_TRIM = 0x01, + R_TRIM = 0x02, + TRIM = (L_TRIM|R_TRIM) +}; + +static std::string trim( const std::string & s, const Trim trim_r = TRIM ) { + + if (s.empty() || trim_r == NO_TRIM) + return s; + + std::string ret(s); + + if (trim_r & L_TRIM) { + std::string::size_type p = ret.find_first_not_of(" \t\n"); + if (p == std::string::npos) + return std::string(); + + ret = ret.substr(p); + } + + if (trim_r & R_TRIM) { + std::string::size_type p = ret.find_last_not_of(" \t\n"); + if (p == std::string::npos) + return std::string(); + + ret = ret.substr(0, p+1); + } + + return ret; +} + +static map<string,string> sysconfig_read(const string &_path) { + + map<string,string> ret; + string line; + + ifstream in(_path.c_str()); + if (in.fail()) { + return ret; + } + + while(getline( in, line)) { + + if (*line.begin() != '#') { + + string::size_type pos = line.find('=', 0); + + if (pos != string::npos) { + + string key = trim(line.substr(0, pos)); + string value = trim(line.substr(pos + 1, line.length() - pos - 1)); + + if (value.length() >= 2 + && *(value.begin()) == '"' + && *(value.rbegin()) == '"') { + value = value.substr( 1, value.length() - 2 ); + } + + if (value.length() >= 2 + && *(value.begin()) == '\'' + && *(value.rbegin()) == '\'' ) { + value = value.substr( 1, value.length() - 2 ); + } + ret[key] = value; + } // '=' found + + } // not comment + + } // while getline + return ret; +} + +static bool should_use_sysconfig() +{ + struct stat st; + if (stat("/etc/sysconfig", &st) == 0) + return (getuid() == 0); + return false; +} + +class sysconfig_config_extension : public config_extension { + + map<string,string> _data; + +public: + sysconfig_config_extension() + : _data(sysconfig_read("/etc/sysconfig/proxy")) { + + } + + ~sysconfig_config_extension() { + } + + url get_config(url url) throw (runtime_error) { + map<string,string>::const_iterator it = _data.find("PROXY_ENABLED"); + if (it != _data.end() && it->second == "no") + return libproxy::url("direct://"); + + string key; + string proxy; + + // If the URL is an ftp url, try to read the ftp proxy + if (url.get_scheme() == "ftp") + key = "FTP_PROXY"; + else if (url.get_scheme() == "http") + key = "HTTP_PROXY"; + else if (url.get_scheme() == "https") + key = "HTTPS_PROXY"; + + it = _data.find(key); + if (it != _data.end()) + proxy = it->second; + + if (proxy.empty()) + throw runtime_error("Unable to read configuration"); + + return libproxy::url(proxy); + } + + string get_ignore(url) { + map<string,string>::const_iterator it = _data.find("NO_PROXY"); + if (it != _data.end()) + return it->second; + return ""; + } + + // if we are running as root, and the module is used, then + // make sure this is the first method tried + virtual bool operator<(const base_extension&) const { + return true; + } +}; + +MM_MODULE_INIT_EZ(sysconfig_config_extension, should_use_sysconfig(), NULL, NULL); + |