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

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

Add examples

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