Changeset 3517 for lliurex-detect


Ignore:
Timestamp:
Feb 2, 2017, 5:19:12 PM (3 years ago)
Author:
mabarracus
Message:

Improved lliurex-detect with compatibility with lliurex-version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lliurex-detect/trunk/fuentes/lliurex-detect.install/usr/bin/lliurex-detect

    r3121 r3517  
    1 #!/usr/bin/env python
     1#!/usr/bin/python3
     2
     3#
     4# TODO: Detect live systems
     5#
     6#
     7
    28import sys
    39import os
     10import pwd,grp
     11import argparse
     12import glob
    413from subprocess import check_output
     14
    515ltsConfFile="/etc/lts.conf"
    6 result=[]
    716
    8 def show_help():
    9         print ("Usage: lliurex-detect [-t] [-f]\n\t -t show type\n\t -f show flavour\n")
    10         exit(1)
    11 #def show_help
     17def detect_live():
     18    if (os.isdir('/rofs') and os.isdir('/cow')):
     19        try:
     20            check_output(['grep','loop','/proc/mounts'])
     21            return None
     22        except:
     23            raise Exception('Not live')
     24    raise Exception('Not live')
     25#def detect_live():
    1226
    1327def detect_flavour():
    14         try:
    15                 flavour=check_output(["lliurex-version","-v"]).split(",")[-1]
    16         except Exception as e:
    17                 print ("Can't check flavour: lliurex-version not installed")
    18                 exit(1)
    19         return flavour.strip()
     28        file_name= [ filename for filename in glob.iglob('/usr/share/lliurex-cdd/**/cddflavour') ]
     29        try:
     30            with open(file_name[0],'r') as fileccd:
     31                cdd= [ line.strip() for line in fileccd ]
     32                cdd.sort()
     33                return cdd
     34        except Exception as e:
     35            raise Exception('Error getting cddflavour: '+str(e))
    2036#def detect_flavour
    2137
     38def detect_num_cdd():
     39    try:
     40        num_cdd=check_output(['dpkg-query','--showformat=\'${Version}\'','--show','lliurex-version-timestamp']).decode('utf-8')
     41        return num_cdd.strip('\'')
     42    except Exception as e:
     43        raise Exception('Error '+e)
     44#def detect_num_cdd():
     45
     46def get_history_version():
     47    try:
     48        with open('/etc/lliurex-cdd-version','r') as etc_cdd_file:
     49            return etc_cdd_file.read()
     50    except Exception as e:
     51        raise Exception('Error: '+e)
     52#def get_history_version()
     53
    2254def detect_type():
    23         display=os.environ.get('DISPLAY')
    24         #On thin clients display is ip+display so it's at least 7 chars
    25         if len(display)>= 7:
    26                 client_type='thin'
    27         else:
    28                 if os.path.exists(ltsConfFile):
    29                 #Attempt to open lts.conf as is more reliable than check environment
    30                         try:
    31                                 for line in open (ltsConfFile):
    32                                         if line=="LTSP_FATCLIENT":
    33                                                 if "true" in line:
    34                                                         client_type="semi"
    35                                                 else:
    36                                                         if "true" in line:
    37                                                                 client_type="thin"
    38                                                         else:
    39                                                                 client_type="unknown"
    40                                                 break
    41                                 ltsConfFile.close()
    42                         except:
    43                                 fatclient=os.environ.get('LTSP_FATCLIENT')
    44                                 if fatclient=='true':
    45                                         client_type="semi"
    46                                 else:
    47                                         if fatclient=='false':
    48                                                 client_type="thin"
    49                                         else:
    50                                                 client_type="unknown"
    51                 else:
    52                         client_type='fat'
    53         return client_type.rstrip()
     55#
     56#   Possible output values: thin,semi,fat,unknown
     57#
     58#
     59    display=os.environ.get('DISPLAY')
     60    #On thin clients display is ip+display so it's at least 7 chars
     61    if len(display)>= 7:
     62        client_type='thin'
     63    else:
     64        if os.path.exists(ltsConfFile):
     65        #Attempt to open lts.conf as is more reliable than check environment
     66            try:
     67                for line in open (ltsConfFile):
     68                    if line=="LTSP_FATCLIENT":
     69                        if "true" in line:
     70                            client_type="semi"
     71                        else:
     72                            if "true" in line:
     73                                client_type="thin"
     74                            else:
     75                                client_type="unknown"
     76                        break
     77                ltsConfFile.close()
     78            except:
     79                fatclient=os.environ.get('LTSP_FATCLIENT')
     80                if fatclient=='true':
     81                    client_type="semi"
     82                else:
     83                    if fatclient=='false':
     84                        client_type="thin"
     85                    else:
     86                        client_type="unknown" 
     87        else:
     88            client_type='fat'
     89    return client_type.rstrip()
    5490#def detect_type
    5591
    56 def process_parms():
    57         for parm in sys.argv:
    58                 error=1
    59                 if (parm=="-t"):
    60                         result.append(detect_type())
    61                         error=0
    62                 if (parm=="-f"):
    63                         result.append(detect_flavour())
    64                         error=0
    65         if (error==1):
    66                 show_help()
    67         return result
    68 #def process_parms
     92def detect_user(user=''):
     93    if user == '' or user == None:
     94        user_id=os.getuid()
     95        user_name=pwd.getpwuid(user_id)[0]
     96    else:
     97        try:
     98            user_uid=pwd.getpwnam(user)[3]
     99        except:
     100            raise Exception('user not found!')
     101        user_name=user
     102    #user_info [0]=>username [1]=>pwd [2]=>uid [3]=>gid [4]=>gecos [5]=>homedir [6]=>shell
     103    #grp_info [0]=>name [1]=>pwd [2]=>gid [3]=>member
     104    grupos = [ group[0] for group in grp.getgrall() if user_name in group[3] ]
     105    with open('/etc/passwd','r') as filepwd:
     106        localusers=[ line.split(':')[0] for line in filepwd.readlines() ]
    69107
    70 if (len(sys.argv) > 1):
    71         process_parms()
    72 else:
    73         result.append(detect_type())
    74         result.append(detect_flavour())
     108    ret=user_name
     109    if 'admins' in grupos :
     110        ret='*'+str(user_name)
     111    if user_name in localusers:
     112        ret += '(local)'
     113    else:
     114        ret += '(ldap)'
     115    return ret
     116#def detect_user():
    75117
     118parser = argparse.ArgumentParser(description='Get information about running environment')
     119parser.add_argument('-a','--all',metavar='',action='store_const',help='Get all information',const=True)
     120parser.add_argument('-s','--session',metavar='',action='store_const',help='Get current session type',const=True)
     121parser.add_argument('-f','--flavour',metavar='',action='store_const',help='Get the flavour of current system',const=True)
     122parser.add_argument('-u','--usertype',metavar='username',nargs='?',const='',help='Get the usertype from current user or from passed username')
     123parser.add_argument('-lt','--ltsp',metavar='',action='store_const',help='Get if it\'s running on ltsp system',const=True)
     124parser.add_argument('-lv','--live',metavar='',action='store_const',help='Get if it\'s running on live system',const=True)
     125# lliurex-version options
     126parser.add_argument('-n','--number',metavar='',action='store_const',const=True,help='Get the cdd number version')
     127parser.add_argument('-v','--version',metavar='',action='store_const',const=True,help='Get the cdd version')
     128parser.add_argument('-t','--test',metavar='cdd_name',help='Test if the cdd is installed')
     129parser.add_argument('--history',metavar='',action='store_const',const=True,help='Get the installed meta\'s history')
     130args=parser.parse_args()
    76131
    77 print (','.join(result))
     132args_all=args.all
     133#Commented due to compatibility with lliurex-version without parameters
     134#args_all=True
     135#if args.all != True:
     136#    for arg in vars(args):
     137#        if getattr(args,arg) != None:
     138#            args_all=False
     139#            break
     140arg_none_for_lliurex_version=True
     141if args.all != True:
     142    for arg in vars(args):
     143        if getattr(args,arg) != None:
     144            arg_none_for_lliurex_version=False
     145            break
     146
     147result=[]
     148try:
     149    if args_all or args.session != None:
     150        result.append(detect_type())
     151    if args_all or args.flavour != None:
     152        result.append(detect_flavour()[-1])
     153    if args_all or args.usertype != None:
     154        result.append(detect_user(args.usertype))
     155    if args.ltsp != None:
     156        if 'fat' == detect_type():
     157            exit(0)
     158        else:
     159            exit(1)
     160        result.append()
     161    if args.live != None:
     162        try:
     163            detect_live()
     164            print('yes')
     165            exit(0)
     166        except:
     167            print('no')
     168            exit(1)
     169#lliurex version options
     170    if args_all or args.number != None:
     171        print(detect_num_cdd())
     172    if args_all or args.version != None:
     173        print(', '.join(detect_flavour()))
     174    if arg_none_for_lliurex_version:
     175        ret=detect_flavour()
     176        ret.append(detect_num_cdd())
     177        print(', '.join(ret))
     178    if args.test != None:
     179        try:
     180            detect_flavour()
     181            exit(0)
     182        except:
     183            exit(1)
     184    if args_all or args.history != None:
     185        print(get_history_version().rstrip())
     186#end lliurex-version options
     187
     188    if len(result) > 0:
     189        print (','.join(result))
     190
     191except Exception as e:
     192    print('Error '+e)
     193    exit(1)
    78194
    79195exit (0)
Note: See TracChangeset for help on using the changeset viewer.