source: lmd/trunk/fuentes/lmd-server.install/usr/share/n4d/python-plugins/LmdImageManager.py @ 4357

Last change on this file since 4357 was 4357, checked in by mabarracus, 2 years ago

Fix subprocess call

File size: 9.7 KB
Line 
1import json
2import os
3import subprocess
4
5
6class LmdImageManager:
7       
8               
9        def __init__(self):
10                self.imagepath="/etc/ltsp/images/"
11                self.tftppath="/var/lib/tftpboot/ltsp"
12               
13                pass
14        #def __init__
15       
16        def getImageList(self):
17                '''
18                Reads the file list of templates from /etc/ltsp/images
19                Returna a JSON List.
20                '''
21                # 1. /opt/ltsp/name-chroot
22                # 2. /opt/ltsp/images/name-chroot.img
23                # 3. /var/lib/tftpboot/ltsp/name-chroot
24                # if 1,2 and 3 exist -> show
25                # if 1 but not exist 2 or/and 3 -> show with error
26                #
27
28                imagelist=[]
29               
30                for i in os.listdir(self.imagepath):
31                        if i.endswith('.json'): 
32                                imagelist.append(str(i))
33                               
34                return json.dumps(imagelist)
35                       
36                       
37        # END def GetListImages(self)
38
39        def getImage(self, image):
40                '''
41                Returns the metadata from certain image
42               
43                // WIP HERE
44               
45                -> mirar si accepta be el tercer parametre o cal fer el kwargs...
46                agafa aquest taskid i comprova amb getTask si existeix i el seu estat
47                i l'afig amb data["taskstatus"]=ret(....)
48               
49                Aixi al renderImage de l'ImageManager ja podem tindre disponible l'estat sense haver
50                d'estar consultant-ho des de la gui
51                '''
52               
53                try:
54                        json_data=open(self.imagepath+image)
55                        data = json.load(json_data)
56                        json_data.close()
57                       
58                        if "taskid" in data:
59                                taskid=data["taskid"];
60                        else:
61                                taskid="0";
62                       
63                        # Searching task id for this image
64                        status="DONE";
65                        ret=objects['TaskMan'].getTaskStatus(taskid);
66                       
67                        if ret["status"]==True:
68                                status=ret["taskStatus"]
69                        # if ret[status] is false the task has been done time ago
70                        data["task_status"]=status;
71                       
72                        return json.dumps(data)
73                        #return data;
74                except Exception as e:
75                        print "[LmdImageManager]: getImage Exception "+str(e)
76                        return str(e);
77
78                # END def getListTemplate(self, image)
79               
80               
81        def setImage(self, image, data):
82                '''
83                Saves metadata from *data to image
84                data is unicoded string
85                image is name
86                '''
87                               
88                path_to_write = os.path.join(self.imagepath,image + ".json")
89                f = open(path_to_write,'w')
90                f.writelines(data)
91                f.close()
92
93                try:
94                        '''
95                        Writing lts.conf for image
96                        '''
97                       
98                        '''ldm_session default
99                        ltsp_fatclient undefined
100                        fat_ram_threshold default
101                        lmd_extra_params'''
102
103                        # Checking if we need to write file
104                       
105                        jsondata=json.loads(data)
106                       
107                        if ((jsondata['ldm_session']!="default") or (jsondata['ltsp_fatclient']!="undefined") or (jsondata['fat_ram_threshold']!="default") or (jsondata['lmd_extra_params']!="") or (jsondata['ldm_language']!="default")):
108                                tftpfilename=os.path.join(self.tftppath,image + "/lts.conf")
109                               
110                                f=open(tftpfilename,'w')
111                                f.write("[Default]\n")
112                                if (jsondata['ldm_session']!="default"):
113                                        f.write("LDM_SESSION="+jsondata['ldm_session']+"\n")
114                                if (jsondata['ldm_language']!="default"):
115                                        f.write("LDM_LANGUAGE="+jsondata['ldm_language']+"\n")
116                                if (jsondata['ltsp_fatclient']!="undefined"):
117                                        f.write("LTSP_FATCLIENT="+jsondata['ltsp_fatclient']+"\n")
118                                if (jsondata['fat_ram_threshold']!="default"):
119                                        f.write("FAT_RAM_THRESHOLD="+jsondata['fat_ram_threshold']+"\n")
120                                       
121                                if (jsondata['use_local_apps']!="false"):
122                                        f.write("LOCAL_APPS_EXTRAMOUNTS=/home\n")
123                                        f.write("LOCAL_APPS=true\n")
124                                        f.write("LOCAL_APPS_MENU=true\n")
125                                        f.write("LOCAL_APPS_MENU_ITEMS="+jsondata['local_apps_text']+"\n")
126
127                                if (jsondata['lmd_extra_params']!=""):
128                                        extra_params=jsondata['lmd_extra_params'].split("<br/>")
129                                        for param in extra_params:
130                                                # Checking syntax and writing
131                                                if("=" not in param): continue
132                                                else:
133                                                        f.write(param+"\n")
134                                f.close()
135                        else:                           
136                                # We need to check if there was an old config...
137                                tftpfilename=os.path.join(self.tftppath,image + "/lts.conf")                           
138                                try:
139                                        os.remove(tftpfilename)
140                                except:
141                                        pass
142                               
143                        return {"status":True, "msg":"Config Done"}
144               
145                except Exception as e:
146                        return {"status":False, "msg":str(e)}
147                       
148                       
149                '''if(data.)
150                path_to_write = os.path.join(self.imagepath,image + ".json")
151                f = open(path_to_write,'w')
152                f.writelines(data)
153                f.close()'''
154
155
156                '''
157                datafile="";
158                for i in data:
159                        print i
160                        print "*****"
161                        datafile=datafile+i+" ";
162                               
163                jsondata=json.loads(datafile)
164                print type(data)
165                print "****************"
166                print type(datafile)
167               
168                fd=open(self.imagepath+image, 'w')
169                fd.write('{"id":"'+jsondata['id']+'",\n')
170                fd.write('"name":"'+jsondata['name']+'",\n')
171                fd.write('"template":"'+jsondata['template']+'",\n')
172                fd.write('"desc":"'+(jsondata['desc']).encode('utf8')+'",\n')
173                fd.write('"img":"'+jsondata['img']+'"}\n')
174                fd.close()
175                '''
176        # def setImage(self, image, data)
177       
178       
179        def setStatusImage(self, img_id, status):
180               
181                json_data=open(self.imagepath+img_id+".json")
182                data = json.load(json_data)
183                json_data.close()
184               
185                # Set status
186                data["status"]=status
187               
188                self.setImage(img_id, json.dumps(data));
189               
190       
191        def setNewTaskIdForImage(self, img_id, newid):
192               
193                json_data=open(self.imagepath+img_id+".json")
194                data = json.load(json_data)
195                json_data.close()
196               
197                # Set status
198                data["taskid"]=newid
199               
200                self.setImage(img_id, json.dumps(data));
201               
202               
203       
204        def deleteImage(self, img_id):
205                '''
206                N4d Method to delete an image identified by img_id
207                '''
208                import shutil;
209               
210                try:
211                        chroot="/opt/ltsp/"+str(img_id)
212                        image="/opt/ltsp/images/"+str(img_id)+".img"
213                        json_file="/etc/ltsp/images/"+str(img_id)+".json"
214                        tftpboot="/var/lib/tftpboot/ltsp/"+str(img_id)
215                        nbd="/etc/nbd-server/conf.d/ltsp_"+str(img_id)+".conf"
216                       
217                        # Umount anything mounted under image
218                        test_chroot=self.umount_chroot(chroot);
219                        if test_chroot['status']==False:
220                                return test_chroot;
221                       
222                        # Remove chroot
223                        if (os.path.isdir(chroot)):
224                                shutil.rmtree(chroot);
225                       
226                        # Removing .img
227                        if (os.path.isfile(image)):
228                                os.remove(image);
229                       
230                        # Remove nbd
231                        if (os.path.isfile(nbd)):
232                                os.remove(nbd);
233                       
234                        # Remove /var/lib/tftpboot/...
235                        if (os.path.isdir(tftpboot)):
236                                shutil.rmtree(tftpboot);
237                       
238                        # Remove .json file
239                        if (os.path.isfile(json_file)):
240                                os.remove(json_file);
241                       
242                        return {"status":True, "msg":"Image Removed"}
243                except Exception as e:
244                        return {"status":False, "msg":str(e)}
245               
246               
247        #def setImage(self, image, data):
248       
249        def umount_chroot(self,chroot_dir):
250                '''
251                Umount system directories with -lazy,
252                '''
253                ret=""
254                try:
255                        # Test if exists chroot
256                        if not os.path.isdir(chroot_dir):
257                                print "NO DIR CHROOT: "+chroot_dir
258                                return {'status': True, 'msg':'[LmdImageManager] Directory not exists'}
259                        else:
260                               
261                                # umount /net/mirror/llx1406
262                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/net/mirror | wc -l"], shell=True))!='0\n':
263                                        ret=subprocess.check_output(["sudo", "umount","-l",chroot_dir+"/net/mirror/llx1406"])
264                               
265                                # umount /proc
266                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/proc | wc -l"], shell=True))!='0\n':
267                                        ret=subprocess.check_output(["sudo", "umount","-l",chroot_dir+"/proc"])
268                               
269                                # umount /sys
270                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/sys | wc -l"], shell=True))!='0\n':
271                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/sys"])
272                               
273                                # umount /dev/pts
274                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/dev/pts | wc -l"], shell=True))!='0\n':
275                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/dev/pts"])
276                               
277                                # Mount /dev
278                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/dev | wc -l"], shell=True))!='0\n':
279                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/dev"])
280       
281                                # Umount /etc
282                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/etc/hosts | wc -l"], shell=True))!='0\n':
283                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/etc/hosts"])
284                               
285                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/etc/ld.so.conf.d | wc -l"], shell=True))!='0\n':
286                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/etc/ld.so.conf.d"])
287                                       
288                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/etc/nsswitch.conf | wc -l"], shell=True))!='0\n':
289                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/etc/nsswitch.conf"])
290                               
291                               
292                                return {'status': True, 'msg':'[LmdImageManager] All is umounted'}
293                except Exception as e:
294                        return {'status': False, 'msg':'[LmdImageManager] '+str(e)}
295        #def umount_chroot(self,chroot_dir)
296       
297        def check_image_editing(self):
298                try:
299                        if os.path.isfile("/tmp/.lmd-editing-chroot"):
300                                return {'status':True, 'response':True}
301                        else:
302                                return {'status':True, 'response': False}
303                except Exception as e:
304                        return {'status': False, 'msg': str(e)}
305       
306        def clean_image_editing(self):
307                try:
308                        if os.path.isfile("/tmp/.lmd-editing-chroot"):
309                                os.remove("/tmp/.lmd-editing-chroot");
310                       
311                        return {'status': True}
312               
313                except Exception as e:
314                        return {'status': False, 'msg': str(e)}
315        # New method to check without vars, this method allow mount the mirror by nfs without use lliurex-mirror
316        #   check method relies into lliurex-version call, checking structure of files and dirs into /net/mirror/llx16
317        #   architectures always be all or nothing due to assumption that lliurex-mirror mirror both architectures always.
318        def check_mirror(self):
319                try:
320                    subprocess.check_call(["lliurex-version","-x","mirror"], shell=False)
321                   
322                    #status will be mirrorReady, msg.llx16.ARCHITECTURES(list) will always be [i386,amd64]
323                   
324                    return {'status': True,'msg': {'llx16': {'ARCHITECTURES':['i386','amd64']}}}
325                except Exception as e:
326                    return {'status': False,'msg': str(e)}
327       
328        # OLD METHOD TO CHECK WITH VARS (Disabled)
329        def check_mirror_with_vars(self):
330                try:
331                        response=objects['MirrorManager'].get_all_configs();
332                       
333                        lliurex_mirror=objects["VariablesManager"].get_variable("LLIUREXMIRROR");
334                       
335                       
336                       
337                        if (lliurex_mirror["llx16"]["status_mirror"]!="Ok"):
338                                response["status"]=False;
339                               
340                        return response;
341                       
342                except Exception as e:
343                        return {'status': False, 'msg': str(e)}
344                                                       
345                                                       
Note: See TracBrowser for help on using the repository browser.