source: llx-netinstall/trunk/fuentes/install.llx-netinstall/usr/share/n4d/python-plugins/NetinstallManager.py @ 2943

Last change on this file since 2943 was 2943, checked in by mabarracus, 3 years ago
  • Clean templates
  • Add stats to netinstall
File size: 8.7 KB
Line 
1# npackage example  https://svn.lliurex.net/pandora/n4d-ldap/trunk
2# jinja2 http://jinja.pocoo.org/docs/templates
3
4from jinja2 import Environment
5from jinja2.loaders import FileSystemLoader
6from jinja2 import Template
7import tempfile
8import shutil
9import os
10import subprocess
11class NetinstallManager:
12
13        def __init__(self):
14                #Load template file
15                self.tpl_env = Environment(loader=FileSystemLoader('/usr/share/n4d/templates/netinstall'))
16                self.imagepath="/etc/ltsp/bootopts/"
17                pass
18        #def init
19       
20        def startup(self,options):
21                # executed when launching n4d
22                pass
23               
24        #def startup
25
26        def apt(self):
27                # executed after apt operations
28                pass
29               
30        #def apt
31       
32        # service test and backup functions #
33       
34        def test(self):
35
36                pass
37               
38        #def test
39       
40        def backup(self):
41
42                pass
43               
44        #def test
45       
46        def restore(self):
47
48                pass
49               
50        #def test
51               
52        def load_exports(self):
53                #Get template
54                template_cname = self.tpl_env.get_template("cname")
55                list_variables = {}
56               
57                ###########################
58                #Getting VARS
59                ###########################
60
61                #Obtains INTERNAL_DOMAIN
62                list_variables['INTERNAL_DOMAIN'] = objects['VariablesManager'].get_variable('INTERNAL_DOMAIN')
63                #If INTERNAL_DOMAIN is not defined returns an error
64                if  list_variables['INTERNAL_DOMAIN'] == None:
65                        return {'status':False,'msg':'Variable INTERNAL_DOMAIN not defined'}
66                       
67                #Obtains HOSTNAME
68                list_variables['HOSTNAME'] = objects['VariablesManager'].get_variable('HOSTNAME')
69                #If variable SRV_IP is not defined returns an error
70                if  list_variables['HOSTNAME'] == None:
71                        return {'status':False,'msg':'Variable HOSTNAME not defined'}
72                       
73                #Encode vars to UTF-8
74                string_template = template_cname.render(list_variables).encode('UTF-8')
75                #Open template file
76                fd, tmpfilepath = tempfile.mkstemp()
77                new_export_file = open(tmpfilepath,'w')
78                new_export_file.write(string_template)
79                new_export_file.close()
80                os.close(fd)
81                #Write template values
82                n4d_mv(tmpfilepath,'/var/lib/dnsmasq/config/cname-preseed',True,'root','root','0644',True )
83                subprocess.Popen(['/etc/init.d/dnsmasq','restart'],stdout=subprocess.PIPE).communicate()
84                return {'status':True,'msg':'Exports written'}
85        #def load_exports
86        # ######################### #
87       
88        def getNetinstall(self):
89                '''
90                Reads file /etc/ltsp/bootopts/netinstall and returns true or false
91                '''
92                # 1. /opt/ltsp/name-chroot
93                # 2. /opt/ltsp/images/name-chroot.img
94                # 3. /var/lib/tftpboot/ltsp/name-chroot
95                # if 1,2 and 3 exist -> show
96                # if 1 but not exist 2 or/and 3 -> show with error
97                #
98               
99                json_data=open(self.imagepath+"netinstall.json")
100                data = json.load(json_data)
101                json_data.close()
102                if(data["netinstall_boot"].lower()=="true"):
103                        netinstall=True;
104                else:
105                        netinstall=False;
106               
107                if(data["netinstall_unattended"].lower()=="true"):
108                        unattended=True;
109                else:
110                        unattended=False;
111               
112                if(data["netinstall_stats"].lower()!="false"):
113                        do_stats=True;
114                else:
115                        do_stats=False;
116               
117                var_status=self.get_force_classroom_stats()
118                json_status=data["netinstall_force_class"].lower()
119               
120                ret=True
121                if (var_status == '1'):
122                    if json_status == 'false':
123                        ret=self.setNetinstall(data["netinstall_boot"].lower(),data["netinstall_unattended"].lower(),data["netinstall_stats"].lower(),var_status)
124                    force_class=True;
125                   
126                if (var_status == '0'):
127                    if json_status == 'true':
128                        ret=self.setNetinstall(data["netinstall_boot"].lower(),data["netinstall_unattended"].lower(),data["netinstall_stats"].lower(),var_status)
129                    force_class=False
130                   
131                if ret['status'].lower() == 'true':
132                    return {"netinstall":netinstall, "unattended":unattended, "stats": do_stats, "force_class":force_class}
133                else:
134                    raise Exception('Error setting json file')
135                       
136                       
137        # END def GetNetInstall
138
139        def setNetinstall(self, status, unattended,stats,force_class):
140                '''
141                sets option for netinstall int bootopt.json (status and unattended install)
142                '''
143                try:
144                        mirror_var="/var/lib/n4d/variables-dir/LLIUREXMIRROR"
145                        if os.path.isfile(mirror_var):
146                                if (status.lower()=="true" or status.lower()=="false"):
147                                        path_to_write = os.path.join(self.imagepath,"netinstall.json")
148                                        f = open(path_to_write,'w')
149                                        if force_class == '1':
150                                            bool_force = 'true'
151                                        else:
152                                            bool_force = 'false'
153                                        data='{"netinstall_boot":"'+str(status)+'", "netinstall_unattended":"'+str(unattended)+'", "netinstall_stats":"'+str(stats)+'", "netinstall_force_class":"'+str(bool_force)+'"}'
154                                        f.writelines(data)
155                                        f.close()
156                                       
157                                        # Enable or disable NETINSTALL on menu (the last option, but enabled)
158                                        if (status.lower()=="true"):
159                                                objects["LlxBootManager"].pushToBootList("netinstall")
160                                        else:
161                                                objects["LlxBootManager"].removeFromBootList("netinstall")
162
163                                        # Removing user and password from preseed
164                                        self.setNetinstallUnattended(status, "", "", "")
165                                       
166                                        # Set force_classroom stats
167                                        self.set_force_classroom_stats(bool_force)
168                                       
169                                        return {"status":"true", "msg":"all ok"}
170       
171                                else:
172                                        return {"status":"false", "msg":"option not valid"}
173                        else:
174                                        return {"status":"false", "msg":"mirror is not available"}
175                               
176                        #return data;
177                except Exception as e:
178                        return {"status":"false", "msg":str(e)};
179
180                # END def getListTemplate(self, image)
181       
182        def set_force_classroom_stats(self,stats):
183                var_name='STATS_ENABLED'
184                manager = objects['VariablesManager']
185                stats_value = manager.get_variable(var_name)
186               
187                if  stats_value == None:
188                    # Register new variable
189                    ret,msg=manager.add_variable(var_name,'0','','Stats enabled','lliurex-statistics')
190                    if ret==True:
191                        ret,msg=manager.init_variable(var_name,'0');
192                        if ret!=True:
193                            raise Exception('Error initalizing variable')
194                    else:
195                        raise Exception('Error adding variable')
196                if stats.lower() == 'true' or stats == '1':
197                    # Enable
198                    ret,msg=manager.set_variable(var_name,'1')
199                else:
200                    # Disable
201                    ret,msg=manager.set_variable(var_name,'0')
202                if ret != True:
203                    raise Exception('Error setting variable')
204                else:
205                    return True
206        #END def set_force_classroom_stats(self,status)
207       
208        def get_force_classroom_stats(self):
209                var_name='STATS_ENABLED'
210                manager = objects['VariablesManager']
211                stats_value = manager.get_variable(var_name)
212               
213                if  stats_value == None:
214                    # Register new variable
215                    ret,msg=manager.add_variable(var_name,'0','','Stats enabled','lliurex-statistics')
216                    if ret==True:
217                        ret,msg=manager.init_variable(var_name,'0');
218                        if ret!=True:
219                            raise Exception('Error initalizing variable')
220                    else:
221                        raise Exception('Error adding variable')
222                else:
223                    return stats_value
224
225       
226        #END def get_force_classroom_stats(self):
227       
228        def setNetinstallUnattended(self, status, username, password, rootpassword):
229                '''
230                Writing in presseed username and password
231                '''                             
232                try:
233                        filedir="/var/www/preseed"
234                        filepath="/var/www/preseed/unattended.cfg"
235                        filepartman="/var/www/preseed/partman_sda.cfg"
236
237                        if not os.path.exists(filedir):
238                                os.makedirs(filedir)
239                       
240                        preseed=open(filepath,'w')
241                        preseed.write("# LMD Created user account\n")
242                        salt="sw9.tfRI"                 
243                        userpassencrypted=crypt.crypt(str(password),"$1$"+salt+"$")
244                        rootpassencrypted=crypt.crypt(str(rootpassword),"$1$"+salt+"$")
245                       
246                        if(status==True):
247                                # Saving file
248                               
249                                userfullline="d-i passwd/user-fullname string "+str(username)+"\n";
250                                userline="d-i passwd/username string "+str(username)+"\n";
251                                passline="d-i passwd/user-password-crypted password "+str(userpassencrypted)+"\n"
252                               
253                                if (len(rootpassword) > 0):
254                                        rootpassline = "d-i passwd/root-password-crypted password "+str(rootpassencrypted) + "\n"
255                                else:
256                                        rootpassline = "# d-i passwd/root-password-crypted password "+str(rootpassencrypted) + "\n"
257                                       
258                                # Partition preseed
259                                try:
260                                        partman = open(filepartman,'r')
261                                        preseed.writelines(partman.readlines())
262                                        preseed.write("\n")
263                                        partman.close()
264                                except Exception as e:
265                                        return str(e)
266                               
267                        else:
268                                userfullline="#d-i passwd/user-fullname string \n"
269                                userline="#d-i passwd/username string \n"
270                                passline="# d-i passwd/user-password-crypted password \n"
271                                rootpassline = "# d-i passwd/root-password-crypted password \n"
272
273                        preseed.write("# Normal user name\n")
274                        preseed.write(userfullline)
275                        preseed.write(userline)
276                        preseed.write("# Normal user's password, either in clear text\n")
277                        preseed.write("#d-i passwd/user-password password insecure\n")
278                        preseed.write("# Normal user's password encrypted using an MD5 hash.\n")
279                        preseed.write(passline)
280                        preseed.write(rootpassline)
281                       
282                        # Allow weak passwords
283                        preseed.write("d-i user-setup/allow-password-weak boolean true\n")
284                       
285                        preseed.close()
286                       
287                        return {"status":"true", "msg":"all ok"}
288                       
289                except Exception as e:
290                        return {"status":"false", "msg":str(e)}
291
292                # END def getListTemplate(self, image)
293               
294               
295       
296#class N4dProxy
Note: See TracBrowser for help on using the repository browser.