Changeset 3541


Ignore:
Timestamp:
Feb 6, 2017, 5:58:39 PM (2 years ago)
Author:
mabarracus
Message:

Replaced lliurex-version with lliurex-detect 1.0

Location:
lliurex-base-files/trunk/fuentes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lliurex-base-files/trunk/fuentes/debian/changelog

    r3019 r3541  
     1lliurex-base-files (16.06.8) xenial; urgency=medium
     2
     3  * Replaced lliurex-version with lliurex-detect 1.0
     4
     5 -- M.Angel Juan <m.angel.juan@gmail.com>  Mon, 06 Feb 2017 17:56:40 +0100
     6
    17lliurex-base-files (16.06.7) xenial; urgency=medium
    28
  • lliurex-base-files/trunk/fuentes/install/usr/bin/lliurex-version

    r893 r3541  
    1 #!/bin/sh
    2 # =================================================== #
    3 # lliurex-cdd-version                                 #
    4 #                                                     #
    5 # Escrito por Luis García <garcia_luigis@gva.es>      #
    6 # para LliureX. Abril 2006                            #
    7 #                                                     #
    8 #    Devuelve la version de LliureX instalada         #
    9 # =================================================== #
    10 #
    11 
    12 set -e
    13 
    14 # variables
    15 CDD_PATH="/usr/share/lliurex-cdd"
    16 CDD_FLAVOUR="None"
    17 CDD_NUMVERSION="0"
    18 RAW_CDD_VERSION=""
    19 
    20 #funciones
    21 usage(){
    22    echo "Usage: $0 {-n|-v|-a|-h}" >&2
    23    echo "       $0 -t CDD_NAME" >&2
    24    echo "       $0 --history" >&2
    25 }
    26 
    27 get_cdd_version(){
    28    if [ -d ${CDD_PATH} ] ; then
    29       RAW_CDD_VERSION="$(find "${CDD_PATH}" -name "cddflavour" -exec cat {} \; |sort -u)"
    30       if [ "$RAW_CDD_VERSION" ] ; then
    31          CDD_FLAVOUR="$(echo "${RAW_CDD_VERSION}" |tr "\n" "," |sed -e "s%[[:blank:]]*$%%;s%,$%%;s%,%, %g")"
    32       fi
    33    fi
    34    CDD_NUMVERSION=$(dpkg-query --showformat='${Version}' --show lliurex-version-timestamp 2>/dev/null || echo 0)
    35    return 0
    36 }
    37 
    38 say_cdd_version(){
    39    get_cdd_version
    40    case "$1" in
    41       n)
    42          echo "${CDD_NUMVERSION}"
    43          ;;
    44       v)
    45          echo "${CDD_FLAVOUR}"
    46          ;;
    47       a)
    48          echo "${CDD_FLAVOUR}, ${CDD_NUMVERSION}"
    49          ;;
    50    esac
    51    return 0
    52 }
    53 
    54 test_cdd_version(){
    55    get_cdd_version
    56    if [ "$RAW_CDD_VERSION" ] ; then
    57       if echo "$RAW_CDD_VERSION" |grep -q "^${1}$" ; then
    58          return 0
    59       fi
    60    fi
    61    return 1
    62 }
    63 
    64 get_history_version(){
    65         if [ -e /etc/lliurex-cdd-version ]; then
    66                 cat /etc/lliurex-cdd-version
    67         else
    68                 echo ""
    69         fi
    70 }
    71 
    72 case "$1" in
    73    "-h"|"--help")
    74       usage
    75       ;;
    76    "-n"|"--number")
    77       say_cdd_version n
    78       ;;
    79    "-v"|"--version")
    80       say_cdd_version v
    81       ;;
    82    "-t"|"--test")
    83       [ "$2" ] || exit 1
    84       test_cdd_version "$2" || exit 1
    85       ;;
    86    "--history")
    87                 get_history_version
    88           ;;
    89    *)
    90       say_cdd_version a
    91       ;;
    92 esac
    93 
    94 exit 0
     1#!/usr/bin/python3
     2
     3#
     4# Examples:
     5# Export all variables into environment:>  eval export $(lliurex-detect -e -a)
     6# Test one condition:> lliurex-detect -x thin && echo si || echo no
     7# Test one condition:> if lliurex-detect -x ltsp; then echo si; else echo no; fi
     8# Get flavour:> FLA=$(lliurex-detect -f)
     9#
     10import sys
     11import os
     12import pwd,grp
     13import argparse
     14import re
     15# import glob  # Commented: python 3.5 is not available on lliurex 15
     16import fnmatch # allows search recursively without glob
     17
     18from subprocess import check_output
     19
     20ltsConfFile="/etc/lts.conf"
     21
     22def detect_live():
     23    test1=False
     24    test2=False
     25    test3=False
     26
     27    if os.path.isdir('/rofs'):
     28        r1=re.compile('^tmpfs\s/cow\stmpfs')
     29        r2=re.compile('^/cow\s/\soverlayfs')
     30        r3=re.compile('^/dev/loop0\s/rofs\ssquashfs')
     31        with open('/proc/mounts') as mounts_file:
     32            for line in mounts_file.readlines():
     33                if r1.match(line):
     34                    test1=True
     35                if r2.match(line):
     36                    test2=True
     37                if r3.match(line):
     38                    test3=True
     39    if test1 and test2 and test3:
     40        pass
     41    else:
     42        raise Exception('Not live')
     43
     44#def detect_live():
     45
     46def detect_flavour():
     47# Use with python > 3.5 with glob new features
     48#        cdd_content=[]
     49#        file_name= [ filename for filename in glob.iglob('/usr/share/lliurex-cdd/**/cddflavour', recursive=True) ]
     50#        if len(file_name) > 0:
     51#           for cddfile in file_name:
     52#               try:
     53#                    with open(cddfile,'r') as fileccd:
     54#                       cdd= [ line.strip() for line in fileccd ]
     55#                       cdd_content.extend(cdd)
     56#               except Exception as e:
     57#                   raise Exception('cddflavour error '+str(e))
     58#        else:
     59#            file_name= [ filename for filename in glob.iglob('/usr/share/lliurex-cdd/**/cddversion', recursive=True) ]
     60#            if len(file_name) > 0:
     61#                for cddfile in file_name:
     62#                    try:
     63#                       with open(cddfile,'r') as fileccd:
     64#                          cdd= [ line.strip() for line in fileccd ]
     65#                          cdd_content.extend(cdd)
     66#                    except Exception as e:
     67#                        raise Exception('cddversion file error '+str(e))
     68#            else:
     69#               raise Exception('cddflavour or cddversion file not found! ')
     70#       cdd_content=list(set(cdd_content))
     71#       cdd_content.sort()
     72#       return cdd_content
     73
     74# Code for python < 3.5 without glob
     75        file_name=[]
     76        cdd_content=[]
     77        for root,dirnames,filenames in os.walk('/usr/share/lliurex-cdd'):
     78            for filename in fnmatch.filter(filenames,'cddflavour'):
     79                file_name.append(os.path.join(root,filename))
     80        if len(file_name) > 0:
     81            for cddfile in file_name:
     82                try:
     83                    with open(cddfile,'r') as fileccd:
     84                        cdd= [ line.strip() for line in fileccd ]
     85                        cdd_content.extend(cdd)
     86                except Exception as e:
     87                    raise Exception('cddflavour file error '+str(e))
     88        else:
     89            for root,dirnames,filenames in os.walk('/usr/share/lliurex-cdd'):
     90                for filename in fnmatch.filter(filenames,'cddversion'):
     91                    file_name.append(os.path.join(root,filename))
     92            if len(file_name) > 0:
     93                for cddfile in file_name:
     94                    try:
     95                        with open(cddfile,'r') as fileccd:
     96                            cdd= [ line.strip() for line in fileccd ]
     97                            cdd_content.extend(cdd)
     98                    except Exception as e:
     99                        raise Exception('cddversion file error '+str(e))
     100            else:
     101                raise Exception('cddflavour or cddversion file not found! ')
     102        cdd_content=list(set(cdd_content))
     103        cdd_content.sort()
     104        return cdd_content
     105#def detect_flavour
     106
     107def detect_num_cdd():
     108    try:
     109        with open(os.devnull, 'w') as devnull:
     110            num_cdd=check_output(['dpkg-query','--showformat=\'${Version}\'','--show','lliurex-version-timestamp'],stderr=devnull).decode('utf-8')
     111        return num_cdd.strip('\'')
     112    except Exception as e1:
     113        try:
     114            with open('/usr/share/lliurex-cdd/version','r') as cdd_num_file:
     115                return cdd_num_file.readline().strip()
     116        except Exception as e2:
     117            raise Exception('Error1: '+e1+' and Error2: '+e2)
     118#def detect_num_cdd():
     119
     120def get_history_version():
     121    try:
     122        with open('/etc/lliurex-cdd-version','r') as etc_cdd_file:
     123            return etc_cdd_file.read()
     124    except Exception as e:
     125        raise Exception('Error: '+e)
     126#def get_history_version()
     127
     128def detect_type():
     129#
     130#   Possible output values: live,thin,semi,fat,unknown
     131#
     132#
     133
     134    display=os.environ.get('DISPLAY')
     135    #On thin clients display is ip+display so it's at least 7 chars
     136    if len(display)>= 7:
     137        client_type='thin'
     138    else:
     139        if os.path.exists(ltsConfFile):
     140        #Attempt to open lts.conf as is more reliable than check environment
     141            try:
     142                 re_true=re.compile('LTSP_FATCLIENT(\s)*=(\s)*true',re.IGNORECASE)
     143                 re_false=re.compile('LTSP_FATCLIENT(\s)*=(\s)*false',re.IGNORECASE)
     144                 with open(ltsConfFile) as ltsfile:
     145                      for line in ltsfile.readlines():
     146                             if re_true.match(line):
     147                                 client_type='semi'
     148                                 break
     149                             elif re_false.match(line):
     150                                 client_type='thin'
     151                                 break
     152                             else:
     153                                 client_type='unknown'
     154            except Exception as e:
     155                fatclient=os.environ.get('LTSP_FATCLIENT')
     156                if fatclient=='true':
     157                    client_type="semi"
     158                else:
     159                    if fatclient=='false':
     160                        client_type="thin"
     161                    else:
     162                        client_type="unknown" 
     163        else:
     164            client_type='fat'
     165    try:
     166        detect_live()
     167        client_type=client_type+',live'
     168    except:
     169        pass
     170
     171    return client_type.rstrip()
     172#def detect_type
     173
     174def detect_user(user=''):
     175    if user == '' or user == None:
     176        user_id=os.getuid()
     177        user_name=pwd.getpwuid(user_id)[0]
     178    else:
     179        try:
     180            user_uid=pwd.getpwnam(user)[3]
     181        except:
     182            raise Exception('user not found!')
     183        user_name=user
     184    #user_info [0]=>username [1]=>pwd [2]=>uid [3]=>gid [4]=>gecos [5]=>homedir [6]=>shell
     185    #grp_info [0]=>name [1]=>pwd [2]=>gid [3]=>member
     186    grupos = [ group[0] for group in grp.getgrall() if user_name in group[3] ]
     187    with open('/etc/passwd','r') as filepwd:
     188        localusers=[ line.split(':')[0] for line in filepwd.readlines() ]
     189
     190    ret=user_name
     191    if 'admins' in grupos :
     192        ret='*'+str(user_name)
     193    if user_name in localusers:
     194        ret += '(local)'
     195    else:
     196        ret += '(ldap)'
     197    return ret
     198#def detect_user():
     199
     200def store_result(results='',namevar='',action='store'):
     201    global eval_mode
     202    global result
     203    global exit_return_code_mode
     204
     205    if action == 'init':
     206        if eval_mode:
     207            result={}
     208            return 0
     209        else:
     210            result=[]
     211            return 0
     212    elif action == 'store':
     213        if results=='':
     214            raise Exception('Missing param results to store')
     215        if eval_mode and namevar=='':
     216            raise Exception('Eval mode need namevar param')
     217
     218        if eval_mode:
     219            if namevar=='USERTYPE':
     220                res=results
     221                if res[0] == '*':
     222                    result['PROMOTED_USER']='yes'
     223                    res=results[1:]
     224                else:
     225                    result['PROMOTED_USER']='no'
     226                result['USERNAME']=res.split('(')[0]
     227                result['LOGIN_TYPE']=res.split('(')[1].split(')')[0]
     228            elif namevar=='SESSION_TYPE':
     229                res=results.split(',')
     230                result['LIVE']='no'
     231                result['LTSP']='no'
     232                result['THIN']='no'
     233                result['SEMI']='no'
     234                result['FAT']='no'
     235
     236                if len(res) > 1:
     237                    result['LIVE']='yes'
     238                if res[0] != 'fat':
     239                    result['LTSP']='yes'
     240
     241                result[res[0].upper()]='yes'
     242            elif namevar=='FLAVOUR':
     243                res=results[-1]
     244                result['SERVER']='no'
     245                result['DESKTOP']='no'
     246                result['CLIENT']='no'
     247                result['INFANTIL']='no'
     248                result['MUSIC']='no'
     249                result['PIME']='no'
     250
     251                #lliurex 15 specific options & catch all
     252                if res.upper() == 'NETWORK-CLIENT-PROMO':
     253                    result['CLIENT']='yes'
     254                elif res.upper() == 'LLIUREX':
     255                    if 'INFANTIL' in [ x.upper() for x in results ]:
     256                        result['INFANTIL']='yes'
     257                    else:
     258                        result['DESKTOP']='yes'
     259                else:
     260                    result[res.upper()]='yes'
     261            else:
     262                result[namevar]=results
     263               
     264        else:
     265            if type(list()) == type(results):
     266                result.extend(results)
     267            elif type(str()) == type(results):
     268                result.append(results)
     269            else:
     270                raise Exception('Unknown result type to store')
     271    elif action == 'print':
     272        if exit_return_code_mode != False:
     273            if result[exit_return_code_mode.upper()]=='yes':
     274                sys.exit(0)
     275            else:
     276                sys.exit(1)
     277        if len(result) > 0:
     278            if eval_mode:
     279                for k,v in result.items():
     280                    print(k+'='+v)
     281            else:
     282                print (','.join(result))
     283    else:
     284        raise Exception('Unknow action')
     285
     286
     287#def store_result():
     288
     289
     290#
     291# MAIN PROGRAM
     292#
     293
     294parser = argparse.ArgumentParser(description='Get information about running environment')
     295parser.add_argument('-a','--all',metavar='',action='store_const',help='Get all information',const=True)
     296parser.add_argument('-e','--eval',metavar='',action='store_const',help='Show all information to evaluate in bash variables',const=True)
     297parser.add_argument('-s','--session',metavar='',action='store_const',help='Get current session type',const=True)
     298parser.add_argument('-f','--flavour',metavar='',action='store_const',help='Get the flavour of current system',const=True)
     299parser.add_argument('-u','--usertype',metavar='username',nargs='?',const='',help='Get the usertype from current user or from passed username')
     300code_types=['live','ltsp','fat','semi','thin','desktop','server','client','infantil','pime','music']
     301parser.add_argument('-x','--with-return-code',metavar='[live|ltsp|fat|semi|thin|desktop|server|client|infantil|pime|music]',nargs=1,choices=code_types,help='Execute mode testing value passed')
     302# lliurex-version options
     303parser.add_argument('-n','--number',metavar='',action='store_const',const=True,help='Get the cdd number version')
     304parser.add_argument('-v','--version',metavar='',action='store_const',const=True,help='Get the cdd version')
     305parser.add_argument('-t','--test',metavar='cdd_name',help='Test if the cdd is installed')
     306parser.add_argument('--history',metavar='',action='store_const',const=True,help='Get the installed meta\'s history')
     307args=parser.parse_args()
     308
     309#print(args)
     310
     311args_all=args.all
     312#Commented due to compatibility with lliurex-version without parameters
     313#args_all=True
     314#if args.all != True:
     315#    for arg in vars(args):
     316#        if getattr(args,arg) != None:
     317#            args_all=False
     318#            break
     319arg_none_for_lliurex_version=True
     320if args.all != True:
     321    for arg in vars(args):
     322        if getattr(args,arg) != None:
     323            arg_none_for_lliurex_version=False
     324            break
     325else:
     326    arg_none_for_lliurex_version=False
     327
     328eval_mode=args.eval
     329
     330exit_return_code_mode=False
     331if args.with_return_code != None:
     332    eval_mode=True
     333    args_all=True
     334    exit_return_code_mode=args.with_return_code[0]
     335   
     336
     337store_result(action='init')
     338
     339try:
     340    if args_all or args.session != None:
     341        store_result(detect_type(),'SESSION_TYPE')
     342    if args_all or args.flavour != None:
     343        store_result(detect_flavour(),'FLAVOUR')
     344    if args_all or args.usertype != None:
     345        store_result(detect_user(args.usertype),'USERTYPE')
     346
     347#lliurex version options
     348    if args.number != None:
     349        print(detect_num_cdd())
     350    if args.version != None:
     351        print(', '.join(detect_flavour()))
     352    if arg_none_for_lliurex_version:
     353        ret=detect_flavour()
     354        ret.append(detect_num_cdd())
     355        print(', '.join(ret))
     356    if args.test != None:
     357        try:
     358            ret=detect_flavour()
     359        except:
     360            sys.exit(1)
     361        if args.test in ret:
     362            sys.exit(0)
     363        else:
     364            sys.exit(1)
     365    if args.history != None:
     366        print(get_history_version().rstrip())
     367#end lliurex-version options
     368    store_result(action='print')
     369except Exception as e:
     370    print('Error '+str(e))
     371    sys.exit(1)
     372
     373sys.exit(0)
Note: See TracChangeset for help on using the changeset viewer.