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

Last change on this file since 6841 was 6841, checked in by kbut, 19 months ago

Check if folder to delete is mounted

File size: 10.1 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                        xpraConnections=objects["RemoteWebGui"].getXpraConnections(image.replace(".json", ""));
73                        data["xpraConnections"]=xpraConnections;
74                       
75                       
76                        return json.dumps(data)
77                        #return data;
78                except Exception as e:
79                        print "[LmdImageManager]: getImage Exception "+str(e)
80                        return str(e);
81
82                # END def getListTemplate(self, image)
83               
84               
85        def setImage(self, image, data):
86                '''
87                Saves metadata from *data to image
88                data is unicoded string
89                image is name
90                '''
91                               
92                path_to_write = os.path.join(self.imagepath,image + ".json")
93                f = open(path_to_write,'w')
94                f.writelines(data)
95                f.close()
96
97                try:
98                        '''
99                        Writing lts.conf for image
100                        '''
101                       
102                        '''ldm_session default
103                        ltsp_fatclient undefined
104                        fat_ram_threshold default
105                        lmd_extra_params'''
106
107                        # Checking if we need to write file
108                       
109                        jsondata=json.loads(data)
110                       
111                        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")):
112                                tftpfilename=os.path.join(self.tftppath,image + "/lts.conf")
113                               
114                                f=open(tftpfilename,'w')
115                                f.write("[Default]\n")
116                                if (jsondata['ldm_session']!="default"):
117                                        f.write("LDM_SESSION="+jsondata['ldm_session']+"\n")
118                                if (jsondata['ldm_language']!="default"):
119                                        f.write("LDM_LANGUAGE="+jsondata['ldm_language']+"\n")
120                                if (jsondata['ltsp_fatclient']!="undefined"):
121                                        f.write("LTSP_FATCLIENT="+jsondata['ltsp_fatclient']+"\n")
122                                if (jsondata['fat_ram_threshold']!="default"):
123                                        f.write("FAT_RAM_THRESHOLD="+jsondata['fat_ram_threshold']+"\n")
124                                       
125                                if (jsondata['use_local_apps']!="false"):
126                                        f.write("LOCAL_APPS_EXTRAMOUNTS=/home\n")
127                                        f.write("LOCAL_APPS=true\n")
128                                        f.write("LOCAL_APPS_MENU=true\n")
129                                        f.write("LOCAL_APPS_MENU_ITEMS="+jsondata['local_apps_text']+"\n")
130
131                                if (jsondata['lmd_extra_params']!=""):
132                                        extra_params=jsondata['lmd_extra_params'].split("<br/>")
133                                        for param in extra_params:
134                                                # Checking syntax and writing
135                                                if("=" not in param): continue
136                                                else:
137                                                        f.write(param+"\n")
138                                f.close()
139                        else:                           
140                                # We need to check if there was an old config...
141                                tftpfilename=os.path.join(self.tftppath,image + "/lts.conf")                           
142                                try:
143                                        os.remove(tftpfilename)
144                                except:
145                                        pass
146                               
147                        return {"status":True, "msg":"Config Done"}
148               
149                except Exception as e:
150                        return {"status":False, "msg":str(e)}
151                       
152                       
153                '''if(data.)
154                path_to_write = os.path.join(self.imagepath,image + ".json")
155                f = open(path_to_write,'w')
156                f.writelines(data)
157                f.close()'''
158
159
160                '''
161                datafile="";
162                for i in data:
163                        print i
164                        print "*****"
165                        datafile=datafile+i+" ";
166                               
167                jsondata=json.loads(datafile)
168                print type(data)
169                print "****************"
170                print type(datafile)
171               
172                fd=open(self.imagepath+image, 'w')
173                fd.write('{"id":"'+jsondata['id']+'",\n')
174                fd.write('"name":"'+jsondata['name']+'",\n')
175                fd.write('"template":"'+jsondata['template']+'",\n')
176                fd.write('"desc":"'+(jsondata['desc']).encode('utf8')+'",\n')
177                fd.write('"img":"'+jsondata['img']+'"}\n')
178                fd.close()
179                '''
180        # def setImage(self, image, data)
181       
182       
183        def setStatusImage(self, img_id, status):
184               
185                json_data=open(self.imagepath+img_id+".json")
186                data = json.load(json_data)
187                json_data.close()
188               
189                # Set status
190                data["status"]=status
191               
192                self.setImage(img_id, json.dumps(data));
193               
194       
195        def setNewTaskIdForImage(self, img_id, newid):
196               
197                json_data=open(self.imagepath+img_id+".json")
198                data = json.load(json_data)
199                json_data.close()
200               
201                # Set status
202                data["taskid"]=newid
203               
204                self.setImage(img_id, json.dumps(data));
205               
206               
207       
208        def deleteImage(self, img_id):
209                '''
210                N4d Method to delete an image identified by img_id
211                '''
212                import shutil;
213               
214                try:
215                        chroot="/opt/ltsp/"+str(img_id)
216                        image="/opt/ltsp/images/"+str(img_id)+".img"
217                        json_file="/etc/ltsp/images/"+str(img_id)+".json"
218                        tftpboot="/var/lib/tftpboot/ltsp/"+str(img_id)
219                        nbd="/etc/nbd-server/conf.d/ltsp_"+str(img_id)+".conf"
220                       
221                        # Umount anything mounted under image
222                        test_chroot=self.umount_chroot(chroot);
223                        if test_chroot['status']==False:
224                                return test_chroot;
225                       
226                        # Remove chroot
227                        if (os.path.isdir(chroot)):
228                                shutil.rmtree(chroot);
229                       
230                        # Removing .img
231                        if (os.path.isfile(image)):
232                                os.remove(image);
233                       
234                        # Remove nbd
235                        if (os.path.isfile(nbd)):
236                                os.remove(nbd);
237                       
238                        # Remove /var/lib/tftpboot/...
239                        if (os.path.isdir(tftpboot)):
240                                shutil.rmtree(tftpboot);
241                       
242                        # Remove .json file
243                        if (os.path.isfile(json_file)):
244                                os.remove(json_file);
245                       
246                        return {"status":True, "msg":"Image Removed"}
247                except Exception as e:
248                        return {"status":False, "msg":str(e)}
249               
250               
251        #def setImage(self, image, data):
252       
253        def umount_chroot(self,chroot_dir):
254                '''
255                Umount system directories with -lazy,
256                '''
257                ret=""
258                try:
259                        # Test if exists chroot
260                        if not os.path.isdir(chroot_dir):
261                                print "NO DIR CHROOT: "+chroot_dir
262                                return {'status': True, 'msg':'[LmdImageManager] Directory not exists'}
263                        else:
264                               
265                                # umount /net/mirror/llx1406
266                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/net/mirror | wc -l"], shell=True))!='0\n':
267                                        ret=subprocess.check_output(["sudo", "umount","-l",chroot_dir+"/net/mirror/llx1406"])
268                               
269                                # umount /proc
270                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/proc | wc -l"], shell=True))!='0\n':
271                                        ret=subprocess.check_output(["sudo", "umount","-l",chroot_dir+"/proc"])
272                               
273                                # umount /sys
274                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/sys | wc -l"], shell=True))!='0\n':
275                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/sys"])
276                               
277                                # umount /dev/pts
278                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/dev/pts | wc -l"], shell=True))!='0\n':
279                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/dev/pts"])
280                               
281                                # Mount /dev
282                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/dev | wc -l"], shell=True))!='0\n':
283                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/dev"])
284       
285                                # Umount /etc
286                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/etc/hosts | wc -l"], shell=True))!='0\n':
287                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/etc/hosts"])
288                               
289                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/etc/ld.so.conf.d | wc -l"], shell=True))!='0\n':
290                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/etc/ld.so.conf.d"])
291                                       
292                                if (subprocess.check_output(["mount | grep "+chroot_dir+"/etc/nsswitch.conf | wc -l"], shell=True))!='0\n':
293                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir+"/etc/nsswitch.conf"])
294                               
295                                if (subprocess.check_output(["mount | grep ' "+chroot_dir+" ' | wc -l"], shell=True))!='0\n':
296                                        ret=subprocess.check_output(["sudo","umount","-l",chroot_dir])
297                               
298                                return {'status': True, 'msg':'[LmdImageManager] All is umounted'}
299                except Exception as e:
300                        return {'status': False, 'msg':'[LmdImageManager] '+str(e)}
301        #def umount_chroot(self,chroot_dir)
302       
303        def check_image_editing(self):
304                try:
305                        if os.path.isfile("/tmp/.lmd-editing-chroot"):
306                                return {'status':True, 'response':True}
307                        else:
308                                return {'status':True, 'response': False}
309                except Exception as e:
310                        return {'status': False, 'msg': str(e)}
311       
312        def clean_image_editing(self):
313                try:
314                        if os.path.isfile("/tmp/.lmd-editing-chroot"):
315                                os.remove("/tmp/.lmd-editing-chroot");
316                       
317                        return {'status': True}
318               
319                except Exception as e:
320                        return {'status': False, 'msg': str(e)}
321        # New method to check without vars, this method allow mount the mirror by nfs without use lliurex-mirror
322        #   check method relies into lliurex-version call, checking structure of files and dirs into /net/mirror/llx16
323        #   architectures always be all or nothing due to assumption that lliurex-mirror mirror both architectures always.
324        def check_mirror(self):
325                try:
326                    r=subprocess.check_call(["lliurex-version","-x","mirror"])
327                   
328                    #status will be mirrorReady, msg.llx16.ARCHITECTURES(list) will always be [i386,amd64]
329                   
330                    return {'status': True,'msg': {'llx16': {'ARCHITECTURES':['i386','amd64']}}}
331                except Exception as e:
332                    return {'status': False,'msg': {'llx16':{'ARCHITECTURES':['None']},'msg':str(e)}}
333       
334        # OLD METHOD TO CHECK WITH VARS (Disabled)
335        def check_mirror_with_vars(self):
336                try:
337                        response=objects['MirrorManager'].get_all_configs();
338                       
339                        lliurex_mirror=objects["VariablesManager"].get_variable("LLIUREXMIRROR");
340                       
341                       
342                       
343                        if (lliurex_mirror["llx16"]["status_mirror"]!="Ok"):
344                                response["status"]=False;
345                               
346                        return response;
347                       
348                except Exception as e:
349                        return {'status': False, 'msg': str(e)}
350                                                       
351                                                       
Note: See TracBrowser for help on using the repository browser.