summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordominique.leuenberger@gmail.com <dominique.leuenberger@gmail.com@c587cffe-e639-0410-9787-d7902ae8ed56>2011-06-03 14:26:17 +0000
committerdominique.leuenberger@gmail.com <dominique.leuenberger@gmail.com@c587cffe-e639-0410-9787-d7902ae8ed56>2011-06-03 14:26:17 +0000
commite153b88f182daa7dbd543d13dd5235cd48f32db2 (patch)
treec868ae7789962e6cbacee5e14ff36555f63025c7
parent5ca5494b829067dc49355e506dd16c06911ff1e8 (diff)
downloadlibproxy-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
-rw-r--r--libproxy/cmake/modules.cmk2
-rw-r--r--libproxy/cmake/modules/config_sysconfig.cmk5
-rw-r--r--libproxy/modules/config_sysconfig.cpp165
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);
+