def __init__(self, rawdata): import StringIO stream = StringIO.StringIO(rawdata) ini = IniFile(filename=None, commentPrefix=';', keyValueSeperator='=', qt=True) ini.open(stream) self.product_name = ini.get(None, 'productName') self.product_code_name = ini.get(None, 'productCodename') self.product_version = ini.get(None, 'productVersion') self.product_target_version = ini.get(None, 'productTargetVersion') self.product_build_type = ini.get(None, 'productBuildType') self.product_build_postfix = ini.get(None, 'productBuildPostfix') self.root_revision = ini.get(None, 'sourceRootRevision') self.buildtools_revision = ini.get(None, 'sourceBuildtoolsRevision') self.external_revision = ini.get(None, 'sourceExternalRevision') self.third_party_revision = ini.get(None, 'source3rdPartyRevision') self.terra3d_revision = ini.get(None, 'sourceTerra3DRevision') self.manual_revision = ini.get(None, 'sourceManualRevision') self.jenkins_job_name = ini.get(None, 'jenkinsJobName') self.jenkins_build_number = ini.getAsInteger(None, 'jenkinsJobBuildNumber') self.jenkins_build_id = ini.get(None, 'jenkinsJobBuildId') self.jenkins_build_tag = ini.get(None, 'jenkinsJobBuildTag') self.jenkins_build_url = ini.get(None, 'jenkinsJobBuildUrl') self.jenkins_git_revision = ini.get(None, 'jenkinsJobBuildGitRevision') self.jenkins_git_branch = ini.get(None, 'jenkinsJobBuildGitBranch') self.jenkins_master = ini.get(None, 'jenkinsMaster') self.jenkins_nodename = ini.get(None, 'jenkinsNodename') self.threadname_tlsslot = ini.getAsInteger(None, 'threadNameTLSSlot')
class SystemInfoReport(object): _plain_arrays = ['OpenGLExtensions/Extension'] _tuples = { 'System/Path' : ['Dir', 'Ok'], 'Process/Module': ['Path', 'BaseAddress', 'Size', 'EntryPoint', 'FileVersion', 'ProductVersion', 'Timestamp', 'TimestampUtc'], 'Windows/hotfix': ['id'], 'Network/Interface': ['index', 'name', 'description', 'hwaddr', 'loopback', 'up', 'running', 'wireless', 'pointtopoint', 'multicast', 'broadcast', 'addr'], 'terra3d-dirs': _Terra3DDirectories, 'CPU': _SystemInfoCPU, 'locale': _SystemInfoLocale, 'Network': _SystemInfoNetwork, } _dicts = ['Environment'] class SystemInfoReportException(Exception): def __init__(self, report, message): super(SystemInfoReport.SystemInfoReportException, self).__init__(message) self._message = message self.report = report def __str__(self): return '%s(%s): %s' % (type(self).__name__, self.report._filename, self._message) class SystemInfoReportIOError(SystemInfoReportException): def __init__(self, report, message): super(SystemInfoReport.SystemInfoReportIOError, self).__init__(report, message) class SystemInfoReportParserError(SystemInfoReportException): def __init__(self, report, message): super(SystemInfoReport.SystemInfoReportParserError, self).__init__(report, message) def __init__(self, filename=None, xmlreport=None): self._filename = None self._xmlreport = None self._ini = None self.platform_type = None self.is_64_bit = True if filename is not None: self.open(filename=filename) elif xmlreport is not None: self.open(xmlreport=xmlreport) def clear(self): self._filename = None self._ini = None def _get_as_plain_array(self, section, key, default_value): ret = [] got_value = False num = 0 while 1: value = self._ini.get(section, key + '%i' % num, None) if value is None: break got_value = True ret.append(value) num = num + 1 if got_value: return ret else: return default_value def _get_tuples(self, section, key_path, names, default_value=None): if isinstance(names, type): ini_section = self._ini.section(section) if ini_section is not None: ret = names(self, ini_section, key_path, default_value) else: ret = default_value else: size = self._ini.getAsInteger(section, key_path + '\\size', None) if size is None: return default_value else: ret = [] for i in range(1, size): elem = {} for n in names: elem[n] = self._ini.get(section, key_path + '\\%i\\%s' % (i, n), None) ret.append(elem) return ret def _get_dicts(self, section, key_path, names, default_value=None): ret = default_value if not key_path: ini_section = self._ini.section(section) if ini_section: ret = ini_section.get_all_as_dict() return ret def get(self, key, default_value=None): if self._ini is None: return default_value if '/' in key: section, key_path = key.split('/', 1) key_path = key_path.replace('/', '\\') else: section = key key_path = None if key in SystemInfoReport._plain_arrays: return self._get_as_plain_array(section, key_path, default_value) elif key in SystemInfoReport._tuples: return self._get_tuples(section, key_path, SystemInfoReport._tuples[key], default_value) elif key in SystemInfoReport._dicts: return self._get_dicts(section, key_path, default_value) elif isinstance(default_value, list): return self._ini.getAsArray(section, key_path, default_value) else: return self._ini.get(section, key_path, default_value) def __getitem__(self, name): return self.get(name) def _post_open(self): if self.platform_type is None: pass @property def is_platform_windows(self): return self.platform_type == 'Win32' or self.platform_type == 'Windows NT' def open(self, filename=None, xmlreport=None, minidump=None): if filename: try: self._ini = IniFile(filename, commentPrefix=';', keyValueSeperator='=', qt=True) self._filename = filename except IOError as e: raise SystemInfoReport.SystemInfoReportIOError(self, str(e)) elif xmlreport is not None: self._xmlreport = xmlreport if xmlreport.fast_protect_system_info is None: raise SystemInfoReport.SystemInfoReportIOError(self, 'No system info include in XMLReport %s' % (xmlreport.filename)) if sys.version_info[0] > 2: from io import StringIO stream = StringIO(xmlreport.fast_protect_system_info.rawdata.raw.decode('utf8')) else: from StringIO import StringIO stream = StringIO(xmlreport.fast_protect_system_info.rawdata.raw) self._ini = IniFile(filename=None, commentPrefix=';', keyValueSeperator='=', qt=True) self._ini.open(stream) self.platform_type = xmlreport.platform_type self.is_64_bit = xmlreport.is_64_bit #print('platform=%s' % (self.platform_type)) elif minidump: raise SystemInfoReport.SystemInfoReportIOError(self, 'Not yet implemented') self._post_open() def save(self, filename): self._ini.save(filename)