예제 #1
0
    def show_general_afni_info(self, header=1):
        print(UTIL.section_divider('AFNI and related program tests',
                                   hchar='-'))

        self.afni_dir = self.get_afni_dir()
        check_list = [
            'afni', 'afni label', 'AFNI_version.txt', 'python', 'R', 'tcsh'
        ]
        nfound = self.check_for_progs(check_list, show_missing=1)
        if nfound < len(check_list):
            self.comments.append('failure under initial ' \
                                 '"AFNI and related program tests"')

        # make generic but pretty
        print("instances of various programs found in PATH:")
        proglist = ['afni', 'R', 'python', 'python2', 'python3']
        ml = UTIL.max_len_in_list(proglist)
        for prog in proglist:
            rv, files = UTIL.search_path_dirs(prog, mtype=1)
            if not rv:
                if len(files) > 1: fstr = '\n      ' + '\n      '.join(files)
                elif len(files) > 0: fstr = '  (%s)' % files[0]
                else: fstr = ''
                print('    %-*s : %d %s' % (ml, prog, len(files), fstr))

                if prog == 'afni':
                    if len(files) > 1:
                        self.comments.append(
                            "have multiple versions of AFNI in PATH")
                    if len(files) > 0:
                        if os.stat(files[0]).st_uid == 0:
                            self.comments.append(
                                "'afni' executable is owned by root")
        print('')

        # explicit python2 vs python3 check    7 Dec 2016
        n2 = UTIL.num_found_in_path('python2', mtype=1)
        n3 = UTIL.num_found_in_path('python3', mtype=1)
        if n3 > 0 and n2 <= 0:
            print("** have python3 but not python2")
        print('')

        # try select AFNI programs
        print('testing ability to start various programs...')
        ind = '%8s' % ' '
        indn = '\n%8s' % ' '
        proglist = [
            'afni', 'suma', '3dSkullStrip', 'uber_subject.py', '3dAllineate',
            '3dRSFC', 'SurfMesh', '3dClustSim'
        ]
        fcount = 0
        for prog in proglist:
            st, so, se = BASE.shell_exec2('%s -help' % prog, capture=1)
            if st:
                print('    %-20s : FAILURE' % prog)
                print(ind + indn.join(se))
                fcount += 1
            else:
                print('    %-20s : success' % prog)

                # no OpenMP problem
                if prog == '3dAllineate': self.ok_openmp = 1
        print('')
        pfailure = fcount == len(proglist)
        if fcount > 0:
            self.afni_fails = fcount
            self.comments.append('AFNI programs show FAILURE')

        # if complete failure, retry from exec dir
        ascdir = UTIL.executable_dir()
        if pfailure and self.afni_dir != ascdir:
            fcount = 0
            print('none working, testing programs under implied %s...' %
                  ascdir)
            for prog in proglist:
                st, so, se = BASE.shell_exec2('%s/%s -help' % (ascdir, prog),
                                              capture=1)
                if st:
                    print('    %-20s : FAILURE' % prog)
                    print(ind + indn.join(se))
                    fcount += 1
                else:
                    print('    %-20s : success' % prog)
            print('')
            if fcount < len(proglist):
                self.comments.append('consider adding %s to your PATH' %
                                     ascdir)
        # if afni_dir is not set, use ascdir
        if self.afni_dir == '': self.afni_dir = ascdir

        print('checking for R packages...')
        cmd = 'rPkgsInstall -pkgs ALL -check'
        st, so, se = BASE.shell_exec2(cmd, capture=1)
        if st or len(se) < 2: okay = 0
        else:
            if se[1].startswith('++ Note:'): se = se[2:]
            okay = 1
            # require every subsequent string to say verified
            for estr in se:
                if estr != '' and estr.find('has been verified') < 0:
                    okay = 0  # any failure is terminal
                    break
        if okay:
            print('    %-20s : success' % cmd)
        else:
            print('    %-20s : FAILURE' % cmd)
            print(ind + indn.join(se))
            self.comments.append('missing R packages (see rPkgsInstall)')
        print('')

        print('checking for $HOME files...')
        flist = ['.afnirc', '.sumarc', '.afni/help/all_progs.COMP']
        for ff in flist:
            if os.path.isfile('%s/%s' % (self.home_dir, ff)): fstr = 'found'
            else: fstr = 'missing'
            print('    %-25s : %s' % (ff, fstr))

        # add to comments
        if self.afni_dir:
            ccc = 'running: cp %s/AFNI.afnirc ~/.afnirc' % self.afni_dir
        else:
            ccc = 'copying AFNI.afnirc to ~/.afnirc'
        self.add_file_comment(None, '.afnirc', 'consider %s' % ccc)

        self.add_file_comment(
            None, '.sumarc', 'consider running "suma -update_env" for .sumarc')
        self.add_file_comment(
            None, '.afni/help/all_progs.COMP',
            'consider running: apsearch -update_all_afni_help')

        print('')
예제 #2
0
class SysInfo:
    """system info class"""
    def __init__(self, data_root='', verb=1):

        self.system = platform.system()
        self.home_dir = os.environ['HOME']
        self.data_root = data_root
        self.verb = verb

        self.afni_ver = ''
        self.os_dist = ''
        self.comments = []  # comments to print at the end

    def get_afni_dir(self):
        s, so, se = BASE.simple_shell_exec('which afni', capture=1)
        if s: return ''
        return so.strip()

    def show_general_sys_info(self, header=1):
        if header: print UTIL.section_divider('general', hchar='-')

        def tostr(some_tuple):
            if type(some_tuple) == str: return some_tuple
            tlist = [t for t in list(some_tuple) if type(t) == str]
            return ' '.join(tlist)

        print 'architecture:         %s' % tostr(platform.architecture())
        print 'system:               %s' % platform.system()
        print 'release:              %s' % platform.release()
        print 'version:              %s' % platform.version()

        # check distributions by type
        checkdist = 0
        dstr = ''
        if self.system == 'Linux':
            try:
                dstr = tostr(platform.linux_distribution())
            except:
                checkdist = 1
        elif self.system == 'Darwin':
            try:
                dstr = tostr(platform.mac_ver())
            except:
                checkdist = 1
        else:
            checkdist = 1
        if checkdist: dstr = tostr(platform.dist())
        self.os_dist = dstr  # save result
        print 'distribution:         %s' % dstr

        print 'number of CPUs:       %s' % self.get_cpu_count()

        # note shell, and if we are not in login shell
        logshell = UTIL.get_login_shell()
        curshell = UTIL.get_current_shell()
        if logshell == curshell: note = ''
        else: note = '  (current shell is %s)' % curshell

        print 'apparent login shell: %s%s' % (logshell, note)
        print

    def show_top_line(self, fname, prefix=''):
        htxt = UTIL.read_top_lines(fname, nlines=1, strip=1, verb=0)
        if len(htxt) == 0: htxt = 'NONE FOUND'
        else: htxt = htxt[0]
        print '%s%s' % (prefix, htxt)

    def show_data_dir_info(self, ddir, histfile=''):
        """try to locate and display the given data directory
         if histfile, display the top line
      """

        status, droot = self.find_data_root(ddir, hvar=0)
        if status:
            print 'data dir : missing %s' % ddir
            return

        # have a directory, show it
        dhome = droot.replace(self.home_dir, '$HOME')
        print 'data dir : found %-12s under %s' % (ddir, dhome)

        # possibly show histfile
        if histfile == '': return

        prefix = '           top history: '
        hname = '%s/%s/%s' % (droot, ddir, histfile)
        self.show_top_line(hname, prefix=prefix)

    def show_data_info(self, header=1):
        """checks that are specific to data
            - class data existence and tree root
               - assume $HOME if not found
            - disk space under data root
               - maybe check for mounted file system
            - atlases (maybe just @Find TT_N27+tlrc?)
      """

        if header: print UTIL.section_divider('data checks', hchar='-')

        # locate various data trees, and possibly show recent history
        self.show_data_dir_info('AFNI_data6', 'history.txt')
        self.show_data_dir_info('suma_demo', 'README.archive_creation')

        evar = 'AFNI_ATLAS_DIR'
        tryenv = 0  # might suggest setting evar
        haveenv = os.environ.has_key(evar)
        if haveenv: edir = os.environ[evar]
        else: edir = ''

        # look for atlases in multiple directories
        atlas = 'TT_N27+tlrc'
        if os.path.isfile('%s/%s.HEAD' % (edir, atlas)): glist = [edir]
        else: glist = []

        cmd = '@FindAfniDsetPath %s' % atlas
        s, so, se = UTIL.limited_shell_exec(cmd, nlines=1)
        if s: tryenv = 1  # failed
        else: glist.append(so[0])

        for ddir in ['/usr/share/afni/atlases', '/usr/local/afni/atlases']:
            if os.path.isfile('%s/%s.HEAD' % (ddir, atlas)):
                glist.append(ddir)
                if tryenv:
                    self.comments.append('consider setting %s to %s' %
                                         (evar, ddir))

        # fix to work with found after the fact
        glist = UTIL.get_unique_sublist(glist)

        if len(glist) == 0:
            print 'atlas    : did not find %s' % atlas
        else:
            for ddir in glist:
                print 'atlas    : found %-12s under %s' % (atlas, ddir)

        if haveenv: print "\natlas var: %s = %s" % (evar, edir)

        print

    def find_data_root(self, ddir, hvar=1):
        """try to find ddir in common locations

         if hvar, use $HOME for home directory

         return status (0 = success) and path to (parent of) ddir
      """

        # if we do not have a data root, check in a few places
        if self.data_root != '':
            hdir = self.data_root
            plist = [self.data_root]
            root_str = hdir
        else:
            hdir = self.home_dir
            plist = [hdir, '%s/Desktop' % hdir, '%s/*data*' % hdir]
            root_str = '$HOME'

        dpath = self.find_data_dir(ddir=ddir, gdirs=plist)

        if dpath != None:
            if hvar: return 0, dpath.replace(self.home_dir, '$HOME')
            else: return 0, dpath

        # and check the current directory
        dpath = self.find_data_dir(ddir=ddir, gdirs=['.'])
        if dpath == None: return 1, ''
        else:
            dpath = os.path.realpath(dpath)
            if hvar: return 0, dpath.replace(self.home_dir, '$HOME')
            else: return 0, dpath

    def find_data_dir(self, ddir, gdirs=[], depth=2):
        """search under a list of glob directories for the given ddir"""
        if ddir == '' or len(gdirs) == 0: return None

        dlist = []
        for pdir in gdirs:
            droot = pdir
            for d in range(depth + 1):
                dlist.extend(glob.glob('%s/%s' % (droot, ddir)))
                droot += '/*'
        if self.verb > 3: print '-- found %s dirs %s' % (ddir, dlist)
        dlist = UTIL.get_unique_sublist(dlist)
        if self.verb > 2: print '-- found trimmed %s dirs %s' % (ddir, dlist)

        if len(dlist) == 0: return None
        dlen = len(ddir) + 1
        return dlist[0][0:-dlen]

    def show_os_specific(self, header=1):
        """checks that are specific to one OS or another"""

        if self.system not in ['Linux', 'Darwin']: return

        if header: print UTIL.section_divider('OS specific', hchar='-')

        if self.system == 'Linux': self.show_spec_linux()
        elif self.system == 'Darwin': self.show_spec_mac()

        print

    def show_spec_linux(self):
        """linux specific checks
            - is Ubuntu
               - has Ubuntu AFNI installed
               - atlas directory
      """

        if self.os_dist.find('buntu') < 0: return

        print 'have Ubuntu system: %s' % self.os_dist
        if self.afni_ver.find('buntu') >= 0:
            print 'have Ubuntu afni  : %s' % self.afni_ver

    def show_spec_mac(self):
        """look for fink, macports, homebrew"""
        # if no pyqt4, check for brew and fink packages
        if MT.test_import('PyQt4', verb=0):
            glist = glob.glob('/usr/local/lib/python2*/site-packages/PyQt4')
            if len(glist) == 0:
                glist = glob.glob(
                    '/sw/lib/qt4*/lib/python2*/site-packages/PyQt4')
            if len(glist) > 0:
                gdir = glist[-1]
                ghead = os.path.dirname(gdir)
                print '++ found PyQt4 under %s' % ghead
                print '   (consider adding %s to PYTHONPATH)' % ghead

    def show_python_lib_info(self, plibs, header=1, verb=2):
        if header: print UTIL.section_divider('python libs', hchar='-')
        for lib in plibs:
            MT.test_import(lib, verb=verb)
        print

        pdirs = glob.glob('/sw/bin/python*')
        if len(pdirs) > 0:
            pdirs = [dd for dd in pdirs if dd.find('config') < 0]
        if len(pdirs) > 0:
            print 'python binaries under /sw/bin:'
            for pdir in pdirs:
                if os.path.islink(pdir):
                    rstr = ' (sym link to %s)' % os.path.realpath(pdir)
                else:
                    rstr = ''
                print '    %-20s%s' % (pdir, rstr)
            print

    def show_path_vars(self, header=1):
        print UTIL.section_divider('path vars', hchar='-')
        for evar in [
                'PATH', 'PYTHONPATH', 'LD_LIBRARY_PATH', 'DYLD_LIBRARY_PATH',
                'DYLD_FALLBACK_LIBRARY_PATH'
        ]:
            if os.environ.has_key(evar):
                print "%s = %s\n" % (evar, os.environ[evar])
            else:
                print "%s = " % evar
        print

    def show_general_afni_info(self, header=1):
        print UTIL.section_divider('AFNI and related program tests', hchar='-')
        for prog in ['afni', 'python', 'R', 'tcsh']:
            cmd = 'which %s' % prog
            s, so, se = BASE.simple_shell_exec(cmd, capture=1)
            if s: print '%-20s : %s' % (cmd, se)
            else:
                print '%-20s : %s' % (cmd, so.strip())
                s, v = self.get_prog_version(prog)
                if s:
                    print '%-20s : %s' % ('%s version' % prog, v)
                    if prog == 'afni': self.afni_ver = v  # save result
        print

        # make generic but pretty
        print "instances of various programs found in PATH:"
        proglist = ['afni', 'R', 'python']
        ml = UTIL.max_len_in_list(proglist)
        for prog in proglist:
            rv, files = UTIL.search_path_dirs(prog, mtype=1)
            if not rv:
                if len(files) > 1: fstr = '\n      ' + '\n      '.join(files)
                elif len(files) > 0: fstr = '  (%s)' % files[0]
                else: fstr = ''
                print '    %-*s : %d %s' % (ml, prog, len(files), fstr)

                if prog == 'afni' and len(files) > 1:
                    self.comments.append(
                        "consider only 1 version of AFNI in PATH")
        print

        print 'testing ability to start various programs...'
        ind = '%8s' % ' '
        indn = '\n%8s' % ' '
        proglist = [
            'afni', 'suma', '3dSkullStrip', 'uber_subject.py', '3dAllineate',
            '3dRSFC', 'SurfMesh'
        ]
        fcount = 0
        for prog in proglist:
            st, so, se = BASE.shell_exec2('%s -help' % prog, capture=1)
            if st:
                print '    %-20s : FAILURE' % prog
                print ind + indn.join(se)
                fcount += 1
            else:
                print '    %-20s : success' % prog
        print

        ascdir = UTIL.executable_dir()
        if fcount == len(proglist) and self.get_afni_dir() != ascdir:
            fcount = 0
            print 'none working, testing programs under implied %s...' % ascdir
            for prog in proglist:
                st, so, se = BASE.shell_exec2('%s/%s -help' % (ascdir, prog),
                                              capture=1)
                if st:
                    print '    %-20s : FAILURE' % prog
                    print ind + indn.join(se)
                    fcount += 1
                else:
                    print '    %-20s : success' % prog
            print
            if fcount < len(proglist):
                self.comments.append('consider adding %s to your PATH' %
                                     ascdir)

        print 'checking for $HOME files...'
        flist = ['.afnirc', '.sumarc', '.afni/help/all_progs.COMP']
        for ff in flist:
            if os.path.isfile('%s/%s' % (self.home_dir, ff)): fstr = 'found'
            else: fstr = 'missing'
            print '    %-25s : %s' % (ff, fstr)

        # add to comments
        self.add_file_comment(None, '.afnirc',
                              'consider copying AFNI.afnirc to ~/.afnirc')
        self.add_file_comment(
            None, '.sumarc', 'consider running "suma -update_env" for .sumarc')
        self.add_file_comment(
            None, '.afni/help/all_progs.COMP',
            'consider running "apsearch -update_all_afni_help"')

        print
예제 #3
0
            elif len(files) > 0: fstr = '  (%s)' % files[0]
            else:                fstr = ''
            print '    %-*s : %d %s' % (ml, prog, len(files), fstr)

            if prog == 'afni' and len(files) > 1:
               self.comments.append("consider only 1 version of AFNI in PATH")
      print

      print 'testing ability to start various programs...'
      ind = '%8s' % ' '
      indn = '\n%8s' % ' '
      proglist = ['afni', 'suma', '3dSkullStrip', 'uber_subject.py',
                   '3dAllineate', '3dRSFC', 'SurfMesh']
      fcount = 0
      for prog in proglist:
         st, so, se = BASE.shell_exec2('%s -help'%prog, capture=1)
         if st:
            print '    %-20s : FAILURE' % prog
            print ind + indn.join(se)
            fcount += 1
         else: print '    %-20s : success' % prog
      print

      ascdir = UTIL.executable_dir()
      if fcount == len(proglist) and self.get_afni_dir() != ascdir:
         fcount = 0
         print 'none working, testing programs under implied %s...' % ascdir
         for prog in proglist:
            st, so, se = BASE.shell_exec2('%s/%s -help'%(ascdir,prog),capture=1)
            if st:
               print '    %-20s : FAILURE' % prog
예제 #4
0
   def show_general_afni_info(self, header=1):
      print UTIL.section_divider('AFNI and related program tests', hchar='-')

      self.afni_dir = self.get_afni_dir()
      check_list = ['afni', 'AFNI_version.txt', 'python', 'R', 'tcsh']
      nfound = self.check_for_progs(check_list, show_missing=1)
      if nfound < len(check_list):
         self.comments.append('failure under initial "AFNI and related program tests"')

      # make generic but pretty
      print "instances of various programs found in PATH:"
      proglist = ['afni', 'R', 'python']
      ml = UTIL.max_len_in_list(proglist)
      for prog in proglist:
         rv, files = UTIL.search_path_dirs(prog, mtype=1)
         if not rv:
            if len(files) > 1:   fstr = '\n      '+'\n      '.join(files)
            elif len(files) > 0: fstr = '  (%s)' % files[0]
            else:                fstr = ''
            print '    %-*s : %d %s' % (ml, prog, len(files), fstr)

            if prog == 'afni':
               if len(files) > 1:
                  self.comments.append("have multiple versions of AFNI in PATH")
               if len(files) > 0:
                  if os.stat(files[0]).st_uid == 0:
                     self.comments.append("'afni' executable is owned by root")
      print

      # try select AFNI programs
      print 'testing ability to start various programs...'
      ind = '%8s' % ' '
      indn = '\n%8s' % ' '
      proglist = ['afni', 'suma', '3dSkullStrip', 'uber_subject.py',
                   '3dAllineate', '3dRSFC', 'SurfMesh']
      fcount = 0
      for prog in proglist:
         st, so, se = BASE.shell_exec2('%s -help'%prog, capture=1)
         if st:
            print '    %-20s : FAILURE' % prog
            print ind + indn.join(se)
            fcount += 1
         else:
            print '    %-20s : success' % prog

            # no OpenMP problem
            if prog == '3dAllineate': self.ok_openmp = 1
      print
      pfailure = fcount == len(proglist)
      if fcount > 0:
         self.afni_fails = fcount
         self.comments.append('AFNI programs show FAILURE')

      # if complete failure, retry from exec dir
      ascdir = UTIL.executable_dir()
      if pfailure and self.afni_dir != ascdir:
         fcount = 0
         print 'none working, testing programs under implied %s...' % ascdir
         for prog in proglist:
            st, so, se = BASE.shell_exec2('%s/%s -help'%(ascdir,prog),capture=1)
            if st:
               print '    %-20s : FAILURE' % prog
               print ind + indn.join(se)
               fcount += 1
            else: print '    %-20s : success' % prog
         print
         if fcount < len(proglist):
            self.comments.append('consider adding %s to your PATH' % ascdir)
      # if afni_dir is not set, use ascdir
      if self.afni_dir == '': self.afni_dir = ascdir

      print 'checking for R packages...'
      cmd = 'rPkgsInstall -pkgs ALL -check'
      st, so, se = BASE.shell_exec2(cmd, capture=1)
      if st or len(se) < 2: okay = 0
      else:
         if se[1].startswith('++ Note:'): se = se[2:]
         okay = 1
         # require every subsequent string to say verified
         for estr in se:
            if estr != '' and estr.find('has been verified') < 0:
               okay = 0   # any failure is terminal
               break
      if okay:
         print '    %-20s : success' % cmd
      else:
         print '    %-20s : FAILURE' % cmd
         print ind + indn.join(se)
         self.comments.append('missing R packages (see rPkgsInstall)')
      print

      print 'checking for $HOME files...'
      flist = ['.afnirc', '.sumarc', '.afni/help/all_progs.COMP']
      for ff in flist:
         if os.path.isfile('%s/%s'%(self.home_dir, ff)): fstr = 'found'
         else:                                           fstr = 'missing'
         print '    %-25s : %s' % (ff, fstr)

      # add to comments
      if self.afni_dir:
         ccc = 'running: cp %s/AFNI.afnirc ~/.afnirc' % self.afni_dir
      else:
         ccc = 'copying AFNI.afnirc to ~/.afnirc'
      self.add_file_comment(None, '.afnirc', 'consider %s' % ccc)

      self.add_file_comment(None, '.sumarc',
                            'consider running "suma -update_env" for .sumarc')
      self.add_file_comment(None, '.afni/help/all_progs.COMP',
                            'consider running: apsearch -update_all_afni_help')

      print