Index: third_party/mozinfo/mozinfo/mozinfo.py |
=================================================================== |
--- third_party/mozinfo/mozinfo/mozinfo.py (revision 0) |
+++ third_party/mozinfo/mozinfo/mozinfo.py (revision 0) |
@@ -0,0 +1,177 @@ |
+#!/usr/bin/env python |
+ |
+# This Source Code Form is subject to the terms of the Mozilla Public |
+# License, v. 2.0. If a copy of the MPL was not distributed with this file, |
+# You can obtain one at http://mozilla.org/MPL/2.0/. |
+ |
+""" |
+file for interface to transform introspected system information to a format |
+pallatable to Mozilla |
+ |
+Information: |
+- os : what operating system ['win', 'mac', 'linux', ...] |
+- bits : 32 or 64 |
+- processor : processor architecture ['x86', 'x86_64', 'ppc', ...] |
+- version : operating system version string |
+ |
+For windows, the service pack information is also included |
+""" |
+ |
+# TODO: it might be a good idea of adding a system name (e.g. 'Ubuntu' for |
+# linux) to the information; I certainly wouldn't want anyone parsing this |
+# information and having behaviour depend on it |
+ |
+import os |
+import platform |
+import re |
+import sys |
+ |
+# keep a copy of the os module since updating globals overrides this |
+_os = os |
+ |
+class unknown(object): |
+ """marker class for unknown information""" |
+ def __nonzero__(self): |
+ return False |
+ def __str__(self): |
+ return 'UNKNOWN' |
+unknown = unknown() # singleton |
+ |
+# get system information |
+info = {'os': unknown, |
+ 'processor': unknown, |
+ 'version': unknown, |
+ 'bits': unknown } |
+(system, node, release, version, machine, processor) = platform.uname() |
+(bits, linkage) = platform.architecture() |
+ |
+# get os information and related data |
+if system in ["Microsoft", "Windows"]: |
+ info['os'] = 'win' |
+ # There is a Python bug on Windows to determine platform values |
+ # http://bugs.python.org/issue7860 |
+ if "PROCESSOR_ARCHITEW6432" in os.environ: |
+ processor = os.environ.get("PROCESSOR_ARCHITEW6432", processor) |
+ else: |
+ processor = os.environ.get('PROCESSOR_ARCHITECTURE', processor) |
+ system = os.environ.get("OS", system).replace('_', ' ') |
+ service_pack = os.sys.getwindowsversion()[4] |
+ info['service_pack'] = service_pack |
+elif system == "Linux": |
+ (distro, version, codename) = platform.dist() |
+ version = "%s %s" % (distro, version) |
+ if not processor: |
+ processor = machine |
+ info['os'] = 'linux' |
+elif system in ['DragonFly', 'FreeBSD', 'NetBSD', 'OpenBSD']: |
+ info['os'] = 'bsd' |
+ version = sys.platform |
+elif system == "Darwin": |
+ (release, versioninfo, machine) = platform.mac_ver() |
+ version = "OS X %s" % release |
+ info['os'] = 'mac' |
+elif sys.platform in ('solaris', 'sunos5'): |
+ info['os'] = 'unix' |
+ version = sys.platform |
+info['version'] = version # os version |
+ |
+# processor type and bits |
+if processor in ["i386", "i686"]: |
+ if bits == "32bit": |
+ processor = "x86" |
+ elif bits == "64bit": |
+ processor = "x86_64" |
+elif processor.upper() == "AMD64": |
+ bits = "64bit" |
+ processor = "x86_64" |
+elif processor == "Power Macintosh": |
+ processor = "ppc" |
+bits = re.search('(\d+)bit', bits).group(1) |
+info.update({'processor': processor, |
+ 'bits': int(bits), |
+ }) |
+ |
+# standard value of choices, for easy inspection |
+choices = {'os': ['linux', 'bsd', 'win', 'mac', 'unix'], |
+ 'bits': [32, 64], |
+ 'processor': ['x86', 'x86_64', 'ppc']} |
+ |
+ |
+def sanitize(info): |
+ """Do some sanitization of input values, primarily |
+ to handle universal Mac builds.""" |
+ if "processor" in info and info["processor"] == "universal-x86-x86_64": |
+ # If we're running on OS X 10.6 or newer, assume 64-bit |
+ if release[:4] >= "10.6": # Note this is a string comparison |
+ info["processor"] = "x86_64" |
+ info["bits"] = 64 |
+ else: |
+ info["processor"] = "x86" |
+ info["bits"] = 32 |
+ |
+# method for updating information |
+def update(new_info): |
+ """update the info""" |
+ info.update(new_info) |
+ sanitize(info) |
+ globals().update(info) |
+ |
+ # convenience data for os access |
+ for os_name in choices['os']: |
+ globals()['is' + os_name.title()] = info['os'] == os_name |
+ # unix is special |
+ if isLinux or isBsd: |
+ globals()['isUnix'] = True |
+ |
+update({}) |
+ |
+# exports |
+__all__ = info.keys() |
+__all__ += ['is' + os_name.title() for os_name in choices['os']] |
+__all__ += ['info', 'unknown', 'main', 'choices', 'update'] |
+ |
+ |
+def main(args=None): |
+ |
+ # parse the command line |
+ from optparse import OptionParser |
+ parser = OptionParser(description=__doc__) |
+ for key in choices: |
+ parser.add_option('--%s' % key, dest=key, |
+ action='store_true', default=False, |
+ help="display choices for %s" % key) |
+ options, args = parser.parse_args() |
+ |
+ # args are JSON blobs to override info |
+ if args: |
+ try: |
+ from json import loads |
+ except ImportError: |
+ try: |
+ from simplejson import loads |
+ except ImportError: |
+ def loads(string): |
+ """*really* simple json; will not work with unicode""" |
+ return eval(string, {'true': True, 'false': False, 'null': None}) |
+ for arg in args: |
+ if _os.path.exists(arg): |
+ string = file(arg).read() |
+ else: |
+ string = arg |
+ update(loads(string)) |
+ |
+ # print out choices if requested |
+ flag = False |
+ for key, value in options.__dict__.items(): |
+ if value is True: |
+ print '%s choices: %s' % (key, ' '.join([str(choice) |
+ for choice in choices[key]])) |
+ flag = True |
+ if flag: return |
+ |
+ # otherwise, print out all info |
+ for key, value in info.items(): |
+ print '%s: %s' % (key, value) |
+ |
+if __name__ == '__main__': |
+ main() |
Property changes on: third_party/mozinfo/mozinfo/mozinfo.py |
___________________________________________________________________ |
Added: svn:executable |
+ * |
Added: svn:eol-style |
+ LF |