source: lliurex-detect/trunk/fuentes/lliurex-detect.install/usr/bin/lliurex-detect @ 3529

Last change on this file since 3529 was 3529, checked in by mabarracus, 4 years ago

Full compatibility with lliurex15

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