# #
###############################################################################
-import pydbus
+import ast
import functools
+import logging
import os
+import pydbus
import socket
from . import base
+# Get logger
+log = logging.getLogger(__name__)
+
class SystemBackend(base.BaseBackend):
# Populate some attributes from uname()
kernel_name, __nodename, kernel_release, kernel_version, machine = os.uname()
def arch(self):
return self.systemd.Architecture
+ @functools.cached_property
+ def os(self):
+ return OperatingSystem(self.backend)
+
@property
def virtualization(self):
"""
@hostname.setter
def hostname(self, hostname):
print("SETTING HOSTNAME TO %s" % hostname)
+
+
+class OperatingSystem(base.BaseBackend):
+ """
+ This class provides various information about the operating system this
+ program is running on.
+
+ Currently it reads all its information from /etc/os-release.
+ """
+
+ KNOWN_FIELDS = (
+ "BUG_REPORT_URL",
+ "BUILD_ID",
+ "CPE_NAME",
+ "DEFAULT_HOSTNAME",
+ "DOCUMENTATION_URL",
+ "HOME_URL",
+ "ID",
+ "IMAGE_ID",
+ "IMAGE_VERSION",
+ "LOGO",
+ "NAME",
+ "PRETTY_NAME",
+ "PRIVACY_POLICY_URL",
+ "SUPPORT_URL",
+ "VARIANT",
+ "VARIANT_ID",
+ "VERSION",
+ "VERSION_CODENAME",
+ "VERSION_ID",
+ )
+
+ def initialize(self):
+ # Parse everything on load
+ self._read_os_release()
+
+ def _read_os_release(self):
+ """
+ Reads /etc/os-release and adds all known values as attributes to this class.
+ """
+ data = {}
+
+ # Read /etc/os-release into a dictionary
+ with open("/etc/os-release") as f:
+ for line in f:
+ key, delim, value = line.partition("=")
+
+ # Strip the value if it is quoted
+ if value.startswith("\""):
+ value = ast.literal_eval(value)
+
+ # Store in data
+ data[key] = value
+
+ # Assign all values as attributes (or set to None)
+ for key in self.KNOWN_FIELDS:
+ value = data.get(key, None)
+
+ setattr(self, key, value)
+
+ def __str__(self):
+ return self.PRETTY_NAME
_ = self.locale.translate
tables = {
+ _("Operating System") : {
+ _("Release") : self.backend.system.os,
+ _("Variant") : self.backend.system.os.VARIANT,
+ _("Build ID") : self.backend.system.os.BUILD_ID,
+ },
+
_("Software Versions") : {
PACKAGE_NAME : PACKAGE_VERSION,
_("Kernel") : " ".join((