Changeset 2743

Show
Ignore:
Timestamp:
01/31/18 02:14:24 (7 months ago)
Author:
jwoithe
Message:

[PATCH 07/13] Switch to recent python structures, attempting python2&3 compatibility.

From Nicolas Boulenguez.

* Use subprocess, context managers and file iterators when possible.

* Python can open files, rename files, glob directories, remove

directories, grep lines without subprocesses.

* sandbox-install:

  • os.path is used, not only os.
  • trick to handle renaming of raw_input by python3

* Some changes require indentation changes. They are in next commit.

* int ("1") is more readable, faster than eval ("1"). It also provides

more accurate error messages.

* documentation says that "a in b" should be preferred to "b.find (a) > -1".

* For functions checking that each name of a list is available,

we may conclude at first failure.

* check_1394oldstack_devnode_permissions assumed that open() returns 0 on

failure as in C, while it raises an exception.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/support/tools/ffado-diag.in

    r2742 r2743  
    105105 
    106106    print (" Prerequisites (static at compile-time)...") 
    107     f = open( "$PYTHONDIR/static_info.txt", "r" ) 
    108     for line in f: 
     107    with open( "$PYTHONDIR/static_info.txt", "r" ) as f: 
     108      for line in f: 
    109109        line = line[:-1] 
    110110        if line is not "\n" and line.startswith("  "): 
    111111            print (line) 
    112     f.close() 
    113112 
    114113    # libraw 
    115114 
    116115    print (" uname -a...") 
    117     print ("   " + run_command("uname -a")) 
     116    print ("   " + run_command (('uname', '-a'))) 
    118117 
    119118    print (" Hardware...") 
     
    122121    list_host_controllers() 
    123122    print ("   CPU info:") 
    124     if len(run_command("which lscpu")) > 0
    125         print (run_command("lscpu")) 
     123    if get_command_path('lscpu')
     124        print (run_command(('lscpu',))) 
    126125    else: 
    127         print (run_command("cat /proc/cpuinfo")) 
     126        with open ('/proc/cpuinfo') as f: 
     127            for l in f: 
     128                print (l.rstrip ()) 
    128129 
    129130    print (" Configuration...") 
  • trunk/libffado/support/tools/ffado-sandbox-install.py

    r2737 r2743  
    2323# 
    2424 
    25 import os 
     25import os.path 
     26import shutil 
     27import subprocess 
     28 
     29try: 
     30    raw_input                   # Error in python3. 
     31except: 
     32    raw_input = input 
    2633 
    2734FFADOSBI_VERSION = '0.1' 
     
    6572                        continue 
    6673                else: 
    67                     os.system('rm -Rf "%s"' % ret_dir) 
     74                    shutil.rmtree (ret_dir) 
    6875                    os.makedirs(ret_dir) 
    6976                    break 
     
    7178 
    7279def fetch_source(build_dir, source_descriptor, target): 
    73     logfile = "%s/%s.log" % (build_dir, target) 
    74     os.system('echo "" > %s' % logfile) 
     80  logfile = "%s/%s.log" % (build_dir, target) 
     81  with open (logfile, 'w') as log: 
    7582 
    7683    if source_descriptor[1] == 'svn': 
     
    7885        cwd = os.getcwd() 
    7986        os.chdir(build_dir) 
    80         retval = os.system('svn co "%s" "%s" >> %s' % (source_descriptor[2], target, logfile)) 
     87        retval = subprocess.call (('svn', 'co', source_descriptor[2], target), 
     88                                  stdout=log) 
    8189        os.chdir(cwd) 
    8290        if retval: 
     
    96104        os.chdir(build_dir) 
    97105        print( " extracting tarball..." ) 
    98         retval = os.system('tar -zxf "%s" > %s' % (tmp_file, logfile)
     106        retval = subprocess.call (('tar', '-zxf', tmp_file), stdout=log
    99107        if retval: 
    100108            print( "  Failed to extract the source tarball. Inspect %s for details." % logfile ) 
     
    102110            return False 
    103111        if source_descriptor[3]: 
    104             retval = os.system('mv "%s" "%s"' % (source_descriptor[3], target)) 
    105             if retval: 
     112            try: 
     113                os.rename (source_descriptor[3], target) 
     114            except: 
    106115                print( "  Failed to move the extracted tarball" ) 
    107116                os.chdir(cwd) 
     
    215224    ffado_version = raw_input("Please select a FFADO version: ") 
    216225    try: 
    217         ffado_version_int = eval(ffado_version) 
     226        ffado_version_int = int (ffado_version) 
    218227        if ffado_version_int not in [0, 1, 2]: 
    219228            raise 
     
    245254    jack_version = raw_input("Please select a jack version: ") 
    246255    try: 
    247         jack_version_int = eval(jack_version) 
     256        jack_version_int = int (jack_version) 
    248257        if jack_version_int not in [0, 1, 2]: 
    249258            raise 
     
    288297 
    289298ffado_log = "%s/ffadobuild.log" % build_dir 
    290 ffado_scons_options = "-j2" # TODO: interactive config of the build 
     299ffado_scons_options = ("-j2") # TODO: interactive config of the build 
    291300os.system('echo "" > %s' % ffado_log) 
    292301 
     
    365374sandbox_rc_file = "%s/ffado.rc" % sandbox_dir 
    366375try: 
    367     fid = open(sandbox_rc_file, "w") 
     376  with open (sandbox_rc_file, "w") as fid: 
    368377    fid.write(sandbox_bashrc) 
    369     fid.close() 
    370378except: 
    371379    print( "Could not write the sandbox rc file." ) 
  • trunk/libffado/support/tools/ffado_diag_helpers.py

    r2741 r2743  
    1919# 
    2020 
     21import glob 
    2122import sys 
    22  
    2323import os 
    24 import re 
    2524import logging 
    26  
    27 # Allow for the movement of getstatusoutput from the "commands" module (in 
    28 # python2) to the "subprocess" module in python3. 
    29 try: 
    30     from subprocess import getstatusoutput 
    31 except ImportError: 
    32     from commands import getstatusoutput 
     25import subprocess 
    3326 
    3427## logging setup 
     
    4033# kernel 
    4134def get_kernel_version(): 
    42     return run_command('uname -r'
     35    return run_command (('uname', '-r')).rstrip (
    4336 
    4437def get_kernel_rt_patched(): 
    45     l = run_command('uname -v') 
    46     if l.find("PREEMPT RT") > -1: 
    47         return True 
    48     return False 
     38    l = run_command (('uname', '-v')) 
     39    return "PREEMPT RT" in l 
    4940 
    5041def get_kernel_preempt(): 
    51     l = run_command('uname -v') 
    52     if l.find(" PREEMPT ") > -1 and l.find(" RT ") == -1: 
    53         return True 
    54     return False 
     42    l = run_command (('uname', '-v')) 
     43    return (" PREEMPT " in l) and (not " RT " in l) 
    5544 
    5645# modules 
    5746def check_for_module_loaded(modulename, procfile): 
    5847    log.info("Checking if module '%s' is present in %s... " % (modulename, procfile)) 
    59     f = open(procfile) 
    60     lines = f.readlines() 
    61     f.close() 
    62     for l in lines: 
    63         if l.find(modulename) > -1 or l.find(modulename.replace('-', '_')) > -1: 
     48    with open (procfile) as f: 
     49      for l in f: 
     50        if modulename in l or modulename.replace('-', '_') in l: 
    6451            log.info(" found") 
    6552            return True 
     
    7057    log.info("Checking if module '%s' is present... " % modulename) 
    7158    kver = get_kernel_version() 
    72     (exitstatus, outtext) = getstatusoutput("find \"/lib/modules/%s/\" -name '%s.ko' | grep '%s'" % \ 
    73                                             (kver, modulename, modulename) ) 
    74     log.debug("find outputs: %s" % outtext) 
    75     if outtext == "": 
     59    outtext = run_command (('find', '/lib/modules/' + kver, '-name', modulename + '.ko')) 
     60    if not modulename in outtext: 
    7661        log.info(" not found") 
    7762        return False 
     
    8873 
    8974def check_1394oldstack_loaded(): 
    90     retval = True 
    9175    for modulename in ('ieee1394', 'ohci1394', 'raw1394'): 
    9276        if not check_for_module_loaded(modulename, '/proc/modules'): 
    93             retval = False 
    94     return retval 
     77            return False 
     78    return True 
    9579 
    9680def check_1394oldstack_present(): 
    97     retval = True 
    9881    for modulename in ('ieee1394', 'ohci1394', 'raw1394'): 
    9982        if not check_for_module_present(modulename): 
    100             retval = False 
    101     return retval 
     83            return False 
     84    return True 
    10285 
    10386def check_1394newstack_active(): 
     
    10891 
    10992def check_1394newstack_loaded(): 
    110     retval = True 
    11193    for modulename in ('firewire_core', 'firewire_ohci'): 
    11294        if not check_for_module_loaded(modulename, '/proc/modules'): 
    113             retval = False 
    114     return retval 
     95            return False 
     96    return True 
    11597 
    11698def check_1394newstack_present(): 
    117     retval = True 
    11899    for modulename in ('firewire-core', 'firewire-ohci'): 
    119100        if not check_for_module_present(modulename): 
    120             retval = False 
    121     return retval 
     101            return False 
     102    return True 
    122103 
    123104def check_1394oldstack_devnode_present(): 
     
    125106 
    126107def check_1394oldstack_devnode_permissions(): 
    127     f = open('/dev/raw1394','w') 
    128     if f: 
    129         f.close() 
    130         return True 
    131     else: 
     108    try: 
     109        with open('/dev/raw1394', 'w'): 
     110            return True 
     111    except: 
    132112        return False 
    133113 
    134114def run_command(cmd): 
    135     (exitstatus, outtext) = getstatusoutput(cmd) 
    136     log.debug("%s outputs: %s" % (cmd, outtext)) 
     115    try: 
     116        outtext = subprocess.check_output (cmd).decode () 
     117    except: 
     118        return "" 
     119    log.debug("%s outputs: %s" % (str (cmd), outtext)) 
    137120    return outtext 
    138121 
    139122# package versions 
    140123def get_package_version(name): 
    141     cmd = "pkg-config --modversion %s" % name 
     124    cmd = ('pkg-config', '--modversion', name) 
    142125    return run_command(cmd) 
    143126 
    144127def get_package_flags(name): 
    145     cmd = "pkg-config --cflags --libs %s" % name 
     128    cmd = ('pkg-config', '--cflags', '--libs', name) 
    146129    return run_command(cmd) 
    147130 
    148131def get_command_path(name): 
    149     cmd = "which %s 2> /dev/null" % name 
     132    cmd = ('which', name) 
    150133    return run_command(cmd) 
    151134 
    152 def get_version_first_line(cmd, ver_arg): 
    153     ver = run_command(cmd + ' ' + ver_arg).split("\n") 
     135def get_version_first_line(cmd): 
     136    ver = run_command(cmd).split("\n") 
    154137    if len(ver) == 0: 
    155138        ver = ["None"] 
     
    162145    if lspci_cmd == "": 
    163146        lspci_cmd = "/sbin/lspci" 
    164     cmd = lspci_cmd + " | grep 1394" 
    165     controllers = run_command(cmd).split("\n") 
    166     log.debug(lspci_cmd + " | grep 1394: %s" % controllers) 
    167     for c in controllers: 
     147    outtext = run_command ((lspci_cmd,)) 
     148    for c in outtext.split("\n"): 
     149      if '1394' in c: 
    168150        tmp = c.split() 
    169151        if len(tmp) > 0: 
    170             tmp 
    171             cmd = lspci_cmd + " -vv -nn -s %s" % tmp[0] 
     152            cmd = (lspci_cmd, '-vv', '-nn', '-s', tmp[0]) 
    172153            print( run_command(cmd) ) 
    173154 
    174155def get_juju_permissions(): 
    175     return run_command('ls -lh /dev/fw*'
     156    return run_command(('ls', '-lh') + tuple(glob.glob ('/dev/fw*'))
    176157 
    177158def get_user_ids(): 
    178     return run_command('id'); 
     159    return run_command(('id',)); 
    179160 
    180161def usage (): 
     
    197178 
    198179def check_libraries (): 
    199     print("   gcc ............... %s" % get_version_first_line('gcc', '--version')) 
    200     print("   g++ ............... %s" % get_version_first_line('g++', '--version')) 
    201     print("   PyQt4 (by pyuic4) . %s" % get_version_first_line('pyuic4', '--version')) 
    202     print("   PyQt5 (by pyuic5) . %s" % get_version_first_line('pyuic5', '--version')) 
    203     print("   jackd ............. %s" % get_version_first_line('jackd', '--version')) 
     180    print("   gcc ............... %s" % get_version_first_line(('gcc', '--version'))) 
     181    print("   g++ ............... %s" % get_version_first_line(('g++', '--version'))) 
     182    print("   PyQt4 (by pyuic4) . %s" % get_version_first_line(('pyuic4', '--version'))) 
     183    print("   PyQt5 (by pyuic5) . %s" % get_version_first_line(('pyuic5', '--version'))) 
     184    print("   jackd ............. %s" % get_version_first_line(('jackd', '--version'))) 
    204185    print("     path ............ %s" % get_command_path('jackd')) 
    205186    print("     flags ........... %s" % get_package_flags("jack")) 
  • trunk/libffado/support/tools/listirqinfo.py

    r2740 r2743  
    5555    def load(self): 
    5656        # get PID info 
    57         outtext = subprocess.check_output (('ps', '-eLo', 'pid,cmd,class,rtprio')) 
     57        outtext = subprocess.check_output (('ps', '-eLo', 'pid,cmd,class,rtprio')).decode () 
    5858        rawstr = r"""([0-9]+) +\[IRQ-([0-9]+)\] +([A-Z]{2}) +([-0-9]+)""" 
    5959        compile_obj = re.compile(rawstr) 
     
    7272                IRQs[irq.number] = irq 
    7373 
    74         outtext = subprocess.check_output (('ps', '-eLo', 'pid,cmd,class,rtprio')) 
     74        outtext = subprocess.check_output (('ps', '-eLo', 'pid,cmd,class,rtprio')).decode () 
    7575        rawstr = r"""([0-9]+) +\[softirq-(.*)\] +([A-Z]+) +([-0-9]+)""" 
    7676        compile_obj = re.compile(rawstr)