aboutsummaryrefslogtreecommitdiff
path: root/aptdaemon/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'aptdaemon/utils.py')
-rw-r--r--aptdaemon/utils.py131
1 files changed, 131 insertions, 0 deletions
diff --git a/aptdaemon/utils.py b/aptdaemon/utils.py
new file mode 100644
index 0000000..d7da9ce
--- /dev/null
+++ b/aptdaemon/utils.py
@@ -0,0 +1,131 @@
+"""Module with little helper functions and classes:
+
+deprecated - decorator to emit a warning if a depreacted function is used
+"""
+# Copyright (C) 2008-2009 Sebastian Heinlein <sevel@glatzor.de>
+#
+# Licensed under the GNU General Public License Version 2
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+__author__ = "Sebastian Heinlein <devel@glatzor.de>"
+
+__all__ = ("deprecated", "IsoCodes")
+
+import os
+import sys
+import contextlib
+import gettext
+import functools
+import warnings
+from xml.etree import ElementTree
+
+if sys.version >= '3':
+ _gettext_method = "gettext"
+else:
+ _gettext_method = "ugettext"
+
+
+def deprecated(func):
+ """This is a decorator which can be used to mark functions
+ as deprecated. It will result in a warning being emitted
+ when the function is used.
+
+ Taken from http://wiki.python.org/moin/PythonDecoratorLibrary
+ #GeneratingDeprecationWarnings
+ """
+ @functools.wraps(func)
+ def new_func(*args, **kwargs):
+ warnings.warn_explicit(
+ "Call to deprecated function %(funcname)s." % {
+ 'funcname': func.__name__,
+ },
+ category=DeprecationWarning,
+ filename=func.__code__.co_filename,
+ lineno=func.__code__.co_firstlineno + 1
+ )
+ return func(*args, **kwargs)
+ return new_func
+
+
+@contextlib.contextmanager
+def set_euid_egid(uid, gid):
+ # no need to drop privs
+ if os.getuid() != 0 and os.getgid() != 0:
+ yield
+ return
+ # temporary drop privs
+ os.setegid(gid)
+ old_groups = os.getgroups()
+ os.setgroups([gid])
+ os.seteuid(uid)
+ try:
+ yield
+ finally:
+ os.seteuid(os.getuid())
+ os.setegid(os.getgid())
+ os.setgroups(old_groups)
+
+
+class IsoCodes(object):
+
+ """Provides access to the iso-codes language, script and country
+ database.
+ """
+
+ def __init__(self, norm, tag, fallback_tag=None):
+ filename = "/usr/share/xml/iso-codes/%s.xml" % norm
+ et = ElementTree.ElementTree(file=filename)
+ self._dict = {}
+ self.norm = norm
+ for element in list(et.iter()):
+ iso_code = element.get(tag)
+ if not iso_code and fallback_tag:
+ iso_code = element.get(fallback_tag)
+ if iso_code:
+ self._dict[iso_code] = element.get("name")
+
+ def get_localised_name(self, value, locale):
+ try:
+ name = self._dict[value]
+ except KeyError:
+ return None
+ trans = gettext.translation(domain=self.norm, fallback=True,
+ languages=[locale])
+ return getattr(trans, _gettext_method)(name)
+
+ def get_name(self, value):
+ try:
+ return self._dict[value]
+ except KeyError:
+ return None
+
+
+def split_package_id(package):
+ """Return the name, the version number and the release of the
+ specified package."""
+ if "=" in package:
+ name, version = package.split("=", 1)
+ release = None
+ elif "/" in package:
+ name, release = package.split("/", 1)
+ version = None
+ else:
+ name = package
+ version = release = None
+ return name, version, release
+
+
+# vim:ts=4:sw=4:et