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

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

fixed llx_ltsconf

File size: 12.1 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
216                # Create clients file if not exists
217                if not os.path.exists(clients_file):
218                        open(clients_file,"w").close()
219
220
221                filenames = [default_file, clients_file]
222               
223                with open(conf_file, 'w') as outfile:
224                    for fname in filenames:
225                        with open(fname) as infile:
226                            for line in infile:
227                                outfile.write(line)             
228               
229                return {"status":"true", "msg":"all ok"}
230
231       
232        def setLtsClientsConf(self):
233                # Writes json config in $tftpboot/ltsp/i386/lts.conf
234                try:
235                        conf_file="/var/lib/tftpboot/ltsp/i386/lts.clients.conf"
236                        clientpath="/etc/ltsp/bootopts/clients/"
237                        cfgfile = open(conf_file,'w')
238                                               
239                        # Autologin by mac...
240                        try:
241                                for i in os.listdir(clientpath):
242                                        if '.json' in i:
243                                                json_data=open(os.path.join(clientpath,i))
244                                                data = json.load(json_data)
245                                                json_data.close()
246                                                cfgfile.write("\n["+data["mac"]+"]\n");
247                                                if ("autologin" in data) and ("user" in data) and ("pass" in data):
248                                                        if (data["autologin"].lower()=="true"):
249                                                                cfgfile.write("LDM_AUTOLOGIN = True\n");
250                                                                cfgfile.write("LDM_USERNAME = "+data["user"]+"\n");
251                                                                cfgfile.write("LDM_PASSWORD = "+data["pass"]+"\n");
252                                               
253                                                if ("forceThin" in data) and (data["forceThin"].lower()=="true"):
254                                                        cfgfile.write("LTSP_FATCLIENT = False\n");
255                                                       
256                                                if ("extraOptions" in data) and (data["extraOptions"]!=""):
257                                                        optList=data["extraOptions"].split("\n");
258                                                        for opt in optList:
259                                                                cfgfile.write(opt+"\n");
260                                                       
261                        except Exception as e:
262                                print "[LMDBootManager] Exception "+str(e)
263                       
264                        cfgfile.close()
265                       
266                        # Finally merge both conf files:
267                        return (self.mergeLtsConf());
268                except Exception as e:
269                        return "Exception: "+str(e)
270               
271               
272                pass
273
274
275        def setLtsConf(self, config):
276                # Writes json config in $tftpboot/ltsp/i386/lts.conf
277                try:
278                        conf_file="/var/lib/tftpboot/ltsp/i386/lts.default.conf"
279                        cfgfile = open(conf_file,'w')
280                       
281                        #cp = ConfigParser.ConfigParser()
282                        conf=json.loads(config)                                                 
283                       
284                        for (section) in conf:
285                                cfgfile.write("["+section+"]\n");
286                                for i in conf[section]:
287                                        if i.lower()=="__name__":
288                                                pass
289                                        else:
290                                                if (conf[section][i]).find(' ')!=-1: # ound spaces, adding "
291                                                        cfgfile.write("{0}=\"{1}\"\n".format(i, (conf[section][i])))
292                                                else:
293                                                        cfgfile.write("{0}={1}\n".format(i, (conf[section][i])))
294                        cfgfile.close()
295                       
296                        # Finally merge both conf files:
297                        return (self.mergeLtsConf());
298                       
299                except Exception as e:
300                        return {"status":"false", "msg":str(e)}
301
302       
303
304        def getBootOpts(self):
305                '''
306                Reads file /etc/ltsp/bootopts/netinstall and returns true or false
307                '''
308                # 1. /opt/ltsp/name-chroot
309                # 2. /opt/ltsp/images/name-chroot.img
310                # 3. /var/lib/tftpboot/ltsp/name-chroot
311                # if 1,2 and 3 exist -> show
312                # if 1 but not exist 2 or/and 3 -> show with error
313                #
314                json_data=open(self.imagepath+"netinstall.json")
315                data = json.load(json_data)
316                json_data.close()
317                if(data["netinstall_boot"].lower()=="true"):
318                        return True
319                else:
320                        return False
321                       
322                return json.dumps(imagelist)
323                       
324                       
325        # END def GetListImages(self)
326
327        def setBootOpts(self, status):
328                '''
329                sets option for netinstall int bootopt.json
330                '''
331                try:
332                        mirror_var="/var/lib/n4d/variables-dir/LLIUREXMIRROR"
333                        if os.path.isfile(mirror_var):
334                                if (status.lower()=="true" or status.lower()=="false"):
335                                        path_to_write = os.path.join(self.imagepath,"netinstall.json")
336                                        f = open(path_to_write,'w')
337                                        data='{"netinstall_boot":"'+str(status)+'"}'
338                                        f.writelines(data)
339                                        f.close()
340                                        return {"status":"true", "msg":"all ok"}
341       
342                                else:
343                                        return {"status":"false", "msg":"option not valid"}
344                        else:
345                                        return {"status":"false", "msg":"mirror is not available"}
346                               
347                        #return data;
348                except Exception as e:
349                        return str(e);
350
351        def ReadNBDSwapSize(self):
352                nbd_swap_file="/etc/ltsp/nbdswapd.conf"
353                f1 = open(nbd_swap_file,'r')
354                data=f1.readlines()
355                size=data[0][5:];
356                f1.close()
357                return size
358               
359
360        def SaveNBDSwapSize(self, swap_size):
361                '''
362                Saves properly options to set swap size
363                '''
364                try:
365                        # Saving nbdswapd.conf
366                        nbd_swap_file="/etc/ltsp/nbdswapd.conf"
367                        f1 = open(nbd_swap_file,'w')
368                        data='SIZE='+str(swap_size)+'\n';
369                        f1.writelines(data)
370                        f1.close()
371
372                        # Saving swap.conf
373                        swap_conf_file="/etc/nbd-server/conf.d/swap.conf"
374                        f2 = open(swap_conf_file,'w')
375                        f2.writelines("[swap]\n")
376                        f2.writelines("exportname = /tmp/nbd-swap/%s\n")
377                        f2.writelines("prerun = nbdswapd %s\n")
378                        f2.writelines("postrun = rm -f %s\n")
379                        f2.writelines("authfile = /etc/ltsp/nbd-server.allow\n")
380                        f2.close()
381
382                        # Checking /etc/hosts.allow
383                        needs_nbdswap_line=True
384                       
385                        if os.path.isfile("/etc/hosts.allow"):
386                                # if file exists, read it
387                                f3=open("/etc/hosts.allow", 'r')                               
388                                for line in f3.readlines():
389                                        print line
390                                        if (line=="nbdswapd: ALL: keepalive\n"):
391                                                needs_nbdswap_line=False
392                                f3.close();
393                       
394                        # If file does not exists or has no line for nbdwap, write it
395                        if (needs_nbdswap_line):
396                                f4=open("/etc/hosts.allow", 'a')
397                                f4.writelines("nbdswapd: ALL: keepalive\n")
398                                f4.close()
399                       
400                        return {"status":True, "msg":"finished"}
401               
402                except Exception as e:
403                        print "exc,"+str(e)
404                        return {"status":False, "msg":str(e)}
405               
406        def getDefaultBootImage(self):
407                try:
408                        if os.path.exists(self.imagepath+"defaultboot.json"):
409                                json_data=open(self.imagepath+"defaultboot.json")
410                                data = json.load(json_data)
411                                json_data.close()
412                                return data
413                        else:
414                                return {"default_boot":""}
415                except Exception as e:
416                        return {"default_boot":""}
417               
418        def setDefaultBootImage(self, image):
419                try:
420                        path_to_write = os.path.join(self.imagepath,"defaultboot.json")
421                        f = open(path_to_write,'w')
422                        data='{"default_boot":"'+str(image)+'"}'
423                        f.writelines(data)
424                        f.close()
425                        return {"status":"true", "msg":"all ok"}
426                except Exception as e:
427                        return {"status":False, "msg":str(e)}
428
429
430        def getMenuTimeout(self):
431                try:
432                        if os.path.exists(self.imagepath+"menutimeout.json"):
433                                json_data=open(self.imagepath+"menutimeout.json")
434                                data = json.load(json_data)
435                                json_data.close()
436                                return data
437                        else:
438                                return {"timeout":""}
439                except Exception as e:
440                        return {"timeout":""}
441               
442        def setMenuTimeout(self, time):
443                try:
444                        path_to_write = os.path.join(self.imagepath,"menutimeout.json")
445                        f = open(path_to_write,'w')
446                        data='{"timeout":"'+str(time)+'"}'
447                        f.writelines(data)
448                        f.close()
449                        return {"status":"true", "msg":"all ok"}
450                except Exception as e:
451                        return {"status":False, "msg":str(e)}
Note: See TracBrowser for help on using the repository browser.