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

Last change on this file since 2844 was 2844, checked in by joamuran, 4 years ago

New release, view changelog

File size: 11.9 KB
Line 
1import json
2import os
3import crypt
4
5class LmdBootManager:
6       
7               
8        def __init__(self):
9                self.imagepath="/etc/ltsp/bootopts/"
10
11               
12                pass
13        #def __init__
14       
15        def getNetinstall(self):
16                '''
17                DEPRECATED
18                Reads file /etc/ltsp/bootopts/netinstall and returns true or false
19                '''
20                # 1. /opt/ltsp/name-chroot
21                # 2. /opt/ltsp/images/name-chroot.img
22                # 3. /var/lib/tftpboot/ltsp/name-chroot
23                # if 1,2 and 3 exist -> show
24                # if 1 but not exist 2 or/and 3 -> show with error
25                #
26               
27                json_data=open(self.imagepath+"netinstall.json")
28                data = json.load(json_data)
29                json_data.close()
30                if(data["netinstall_boot"].lower()=="true"):
31                        netinstall=True;
32                else:
33                        netinstall=False;
34               
35                if(data["netinstall_unattended"].lower()=="true"):
36                        unattended=True;
37                else:
38                        unattended=False;
39                       
40                return {"netinstall":netinstall, "unattended":unattended}
41               
42                return json.dumps(imagelist)
43                       
44                       
45        # END def GetListImages(self)
46
47        def setNetinstall(self, status, unattended):
48                '''
49                DEPRECATED
50                sets option for netinstall int bootopt.json (status and unattended install)
51                '''
52                try:
53                        mirror_var="/var/lib/n4d/variables-dir/LLIUREXMIRROR"
54                        if os.path.isfile(mirror_var):
55                                if (status.lower()=="true" or status.lower()=="false"):
56                                        path_to_write = os.path.join(self.imagepath,"netinstall.json")
57                                        f = open(path_to_write,'w')
58                                        data='{"netinstall_boot":"'+str(status)+'", "netinstall_unattended":"'+str(unattended)+'"}'
59                                        f.writelines(data)
60                                        f.close()
61                                       
62                                        # Enable NETINSTALL on menu (the last option, but enabled)
63                                        objects["LlxBootManager"].pushToBootList("netinstall")
64
65                                        # Removing user and password from preseed
66                                        self.setNetinstallUnattended(status, "", "", "")
67                                       
68                                        return {"status":"true", "msg":"all ok"}
69       
70                                else:
71                                        return {"status":"false", "msg":"option not valid"}
72                        else:
73                                        return {"status":"false", "msg":"mirror is not available"}
74                               
75                        #return data;
76                except Exception as e:
77                        return str(e);
78
79                # END def getListTemplate(self, image)
80               
81        def setNetinstallUnattended(self, status, username, password, rootpassword):
82                '''
83                DEPRECATED
84                Writing in presseed username and password
85                '''                             
86                try:
87                        filedir="/var/www/preseed"
88                        filepath="/var/www/preseed/unattended.cfg"
89                        filepartman="/var/www/preseed/partman_sda.cfg"
90
91                        if not os.path.exists(filedir):
92                                os.makedirs(filedir)
93                       
94                        preseed=open(filepath,'w')
95                        preseed.write("# LMD Created user account\n")
96                        salt="sw9.tfRI"                 
97                        userpassencrypted=crypt.crypt(str(password),"$1$"+salt+"$")
98                        rootpassencrypted=crypt.crypt(str(rootpassword),"$1$"+salt+"$")
99                       
100                        if(status==True):
101                                # Saving file
102                               
103                                userfullline="d-i passwd/user-fullname string "+str(username)+"\n";
104                                userline="d-i passwd/username string "+str(username)+"\n";
105                                passline="d-i passwd/user-password-crypted password "+str(userpassencrypted)+"\n"
106                               
107                                if (len(rootpassword) > 0):
108                                        rootpassline = "d-i passwd/root-password-crypted password "+str(rootpassencrypted) + "\n"
109                                else:
110                                        rootpassline = "# d-i passwd/root-password-crypted password "+str(rootpassencrypted) + "\n"
111                                       
112                                # Partition preseed
113                                try:
114                                        partman = open(filepartman,'r')
115                                        preseed.writelines(partman.readlines())
116                                        preseed.write("\n")
117                                        partman.close()
118                                except Exception as e:
119                                        return str(e)
120                               
121                        else:
122                                userfullline="#d-i passwd/user-fullname string \n"
123                                userline="#d-i passwd/username string \n"
124                                passline="# d-i passwd/user-password-crypted password \n"
125                                rootpassline = "# d-i passwd/root-password-crypted password \n"
126
127                        preseed.write("# Normal user name\n")
128                        preseed.write(userfullline)
129                        preseed.write(userline)
130                        preseed.write("# Normal user's password, either in clear text\n")
131                        preseed.write("#d-i passwd/user-password password insecure\n")
132                        preseed.write("# Normal user's password encrypted using an MD5 hash.\n")
133                        preseed.write(passline)
134                        preseed.write(rootpassline)
135                       
136                        # Allow weak passwords
137                        preseed.write("d-i user-setup/allow-password-weak boolean true\n")
138                       
139                        preseed.close()
140                       
141                except Exception as e:
142                        return str(e)
143
144                # END def getListTemplate(self, image)
145               
146               
147               
148        '''
149        Methods to work with lts.conf file
150        '''
151       
152        ''' def getTemplate(self, template):
153                '' '
154                Reads the file template from /etc/ltsp/templates
155                Returna a JSON string with the config options
156                '' '
157                try:
158                        config = StringIO.StringIO()
159                        config.write('[meta_inf]\n')
160                        config.write('name="'+template+'"\n')
161                       
162                       
163                        config.write('[default]\n')
164                        config.write(open(str(self.templatepath)+"/"+str(template)).read())
165                        config.seek(0, os.SEEK_SET)
166                        cp = ConfigParser.ConfigParser()
167                        cp.readfp(config)
168                        aux = cp._sections
169                        for x in aux.keys():
170                                for y in aux[x]:
171                                        if aux[x][y][0] == '"' and aux[x][y][-1] == '"':
172                                                aux[x][y] = aux[x][y][1:-1]
173
174                        return json.dumps(aux)
175                        #return json.dumps(cp.items('default'));
176                       
177                       
178                except Exception as e:
179                        return "Exception: "+str(e)
180                # END def getListTemplate(self, template)
181        '''             
182               
183        def getLtsConf(self):
184                # Reads $tftpboot/ltsp/i386/lts.conf and returns it in json format
185               
186                try:
187                        conf_file="/var/lib/tftpboot/ltsp/i386/lts.conf"
188                        cp = ConfigParser.ConfigParser()
189                        cp.optionxform=str
190                        cp.read(conf_file)
191                        aux = cp._sections
192                        print "**",aux,"$$$"
193                        for x in aux.keys():
194                                for y in aux[x]:
195                                        if aux[x][y][0] == '"' and aux[x][y][-1] == '"':
196                                                aux[x][y] = aux[x][y][1:-1]
197
198                        print "@@",aux,"##"
199                        return json.dumps(aux)
200                        pass
201                        #return json.dumps(cp.items('default'));
202                       
203                except Exception as e:
204                        return "Exception: "+str(e)
205                # END def getListTemplate(self, template)
206                               
207                pass
208       
209        def mergeLtsConf(self):
210               
211                # Creates lts.conf file merging lts.default.conf and lts.clients.conf
212                conf_file="/var/lib/tftpboot/ltsp/i386/lts.conf"
213                default_file="/var/lib/tftpboot/ltsp/i386/lts.default.conf"
214                clients_file="/var/lib/tftpboot/ltsp/i386/lts.clients.conf"
215                filenames = [default_file, clients_file]
216               
217                with open(conf_file, 'w') as outfile:
218                    for fname in filenames:
219                        with open(fname) as infile:
220                            for line in infile:
221                                outfile.write(line)             
222                return True;
223       
224        def setLtsClientsConf(self):
225                # Writes json config in $tftpboot/ltsp/i386/lts.conf
226                try:
227                        conf_file="/var/lib/tftpboot/ltsp/i386/lts.clients.conf"
228                        clientpath="/etc/ltsp/bootopts/clients/"
229                        cfgfile = open(conf_file,'w')
230                                               
231                        # Autologin by mac...
232                        try:
233                                for i in os.listdir(clientpath):
234                                        if '.json' in i:
235                                                json_data=open(os.path.join(clientpath,i))
236                                                data = json.load(json_data)
237                                                json_data.close()
238                                                cfgfile.write("\n["+data["mac"]+"]\n");
239                                                if ("autologin" in data) and ("user" in data) and ("pass" in data):
240                                                        if (data["autologin"].lower()=="true"):
241                                                                cfgfile.write("LDM_AUTOLOGIN = True\n");
242                                                                cfgfile.write("LDM_USERNAME = "+data["user"]+"\n");
243                                                                cfgfile.write("LDM_PASSWORD = "+data["pass"]+"\n");
244                                               
245                                                if ("forceThin" in data) and (data["forceThin"].lower()=="true"):
246                                                        cfgfile.write("LTSP_FATCLIENT = False\n");
247                                                       
248                                                if ("extraOptions" in data) and (data["extraOptions"]!=""):
249                                                        optList=data["extraOptions"].split("\n");
250                                                        for opt in optList:
251                                                                cfgfile.write(opt+"\n");
252                                                       
253                        except Exception as e:
254                                print "[LMDBootManager] Exception "+str(e)
255                       
256                        cfgfile.close()
257                       
258                        # Finally merge both conf files:
259                        self.mergeLtsConf();
260                except Exception as e:
261                        return "Exception: "+str(e)
262               
263               
264                pass
265
266
267        def setLtsConf(self, config):
268                # Writes json config in $tftpboot/ltsp/i386/lts.conf
269                try:
270                        conf_file="/var/lib/tftpboot/ltsp/i386/lts.default.conf"
271                        cfgfile = open(conf_file,'w')
272                       
273                        #cp = ConfigParser.ConfigParser()
274                        conf=json.loads(config)                                                 
275                       
276                        for (section) in conf:
277                                cfgfile.write("["+section+"]\n");
278                                for i in conf[section]:
279                                        if i.lower()=="__name__":
280                                                pass
281                                        else:
282                                                if (conf[section][i]).find(' ')!=-1: # ound spaces, adding "
283                                                        cfgfile.write("{0}=\"{1}\"\n".format(i, (conf[section][i])))
284                                                else:
285                                                        cfgfile.write("{0}={1}\n".format(i, (conf[section][i])))
286                        cfgfile.close()
287                       
288                        # Finally merge both conf files:
289                        self.mergeLtsConf();
290                       
291                except Exception as e:
292                        return "Exception: "+str(e)
293       
294
295        def getBootOpts(self):
296                '''
297                Reads file /etc/ltsp/bootopts/netinstall and returns true or false
298                '''
299                # 1. /opt/ltsp/name-chroot
300                # 2. /opt/ltsp/images/name-chroot.img
301                # 3. /var/lib/tftpboot/ltsp/name-chroot
302                # if 1,2 and 3 exist -> show
303                # if 1 but not exist 2 or/and 3 -> show with error
304                #
305                json_data=open(self.imagepath+"netinstall.json")
306                data = json.load(json_data)
307                json_data.close()
308                if(data["netinstall_boot"].lower()=="true"):
309                        return True
310                else:
311                        return False
312                       
313                return json.dumps(imagelist)
314                       
315                       
316        # END def GetListImages(self)
317
318        def setBootOpts(self, status):
319                '''
320                sets option for netinstall int bootopt.json
321                '''
322                try:
323                        mirror_var="/var/lib/n4d/variables-dir/LLIUREXMIRROR"
324                        if os.path.isfile(mirror_var):
325                                if (status.lower()=="true" or status.lower()=="false"):
326                                        path_to_write = os.path.join(self.imagepath,"netinstall.json")
327                                        f = open(path_to_write,'w')
328                                        data='{"netinstall_boot":"'+str(status)+'"}'
329                                        f.writelines(data)
330                                        f.close()
331                                        return {"status":"true", "msg":"all ok"}
332       
333                                else:
334                                        return {"status":"false", "msg":"option not valid"}
335                        else:
336                                        return {"status":"false", "msg":"mirror is not available"}
337                               
338                        #return data;
339                except Exception as e:
340                        return str(e);
341
342        def ReadNBDSwapSize(self):
343                nbd_swap_file="/etc/ltsp/nbdswapd.conf"
344                f1 = open(nbd_swap_file,'r')
345                data=f1.readlines()
346                size=data[0][5:];
347                f1.close()
348                return size
349               
350
351        def SaveNBDSwapSize(self, swap_size):
352                '''
353                Saves properly options to set swap size
354                '''
355                try:
356                        # Saving nbdswapd.conf
357                        nbd_swap_file="/etc/ltsp/nbdswapd.conf"
358                        f1 = open(nbd_swap_file,'w')
359                        data='SIZE='+str(swap_size)+'\n';
360                        f1.writelines(data)
361                        f1.close()
362
363                        # Saving swap.conf
364                        swap_conf_file="/etc/nbd-server/conf.d/swap.conf"
365                        f2 = open(swap_conf_file,'w')
366                        f2.writelines("[swap]\n")
367                        f2.writelines("exportname = /tmp/nbd-swap/%s\n")
368                        f2.writelines("prerun = nbdswapd %s\n")
369                        f2.writelines("postrun = rm -f %s\n")
370                        f2.writelines("authfile = /etc/ltsp/nbd-server.allow\n")
371                        f2.close()
372
373                        # Checking /etc/hosts.allow
374                        needs_nbdswap_line=True
375                       
376                        if os.path.isfile("/etc/hosts.allow"):
377                                # if file exists, read it
378                                f3=open("/etc/hosts.allow", 'r')                               
379                                for line in f3.readlines():
380                                        print line
381                                        if (line=="nbdswapd: ALL: keepalive\n"):
382                                                needs_nbdswap_line=False
383                                f3.close();
384                       
385                        # If file does not exists or has no line for nbdwap, write it
386                        if (needs_nbdswap_line):
387                                f4=open("/etc/hosts.allow", 'a')
388                                f4.writelines("nbdswapd: ALL: keepalive\n")
389                                f4.close()
390                       
391                        return {"status":True, "msg":"finished"}
392               
393                except Exception as e:
394                        print "exc,"+str(e)
395                        return {"status":False, "msg":str(e)}
396               
397        def getDefaultBootImage(self):
398                try:
399                        if os.path.exists(self.imagepath+"defaultboot.json"):
400                                json_data=open(self.imagepath+"defaultboot.json")
401                                data = json.load(json_data)
402                                json_data.close()
403                                return data
404                        else:
405                                return {"default_boot":""}
406                except Exception as e:
407                        return {"default_boot":""}
408               
409        def setDefaultBootImage(self, image):
410                try:
411                        path_to_write = os.path.join(self.imagepath,"defaultboot.json")
412                        f = open(path_to_write,'w')
413                        data='{"default_boot":"'+str(image)+'"}'
414                        f.writelines(data)
415                        f.close()
416                        return {"status":"true", "msg":"all ok"}
417                except Exception as e:
418                        return {"status":False, "msg":str(e)}
419
420
421        def getMenuTimeout(self):
422                try:
423                        if os.path.exists(self.imagepath+"menutimeout.json"):
424                                json_data=open(self.imagepath+"menutimeout.json")
425                                data = json.load(json_data)
426                                json_data.close()
427                                return data
428                        else:
429                                return {"timeout":""}
430                except Exception as e:
431                        return {"timeout":""}
432               
433        def setMenuTimeout(self, time):
434                try:
435                        path_to_write = os.path.join(self.imagepath,"menutimeout.json")
436                        f = open(path_to_write,'w')
437                        data='{"timeout":"'+str(time)+'"}'
438                        f.writelines(data)
439                        f.close()
440                        return {"status":"true", "msg":"all ok"}
441                except Exception as e:
442                        return {"status":False, "msg":str(e)}
Note: See TracBrowser for help on using the repository browser.