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

Last change on this file since 2841 was 2841, checked in by joamuran, 3 years ago

new release

File size: 6.2 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                return {"netinstall":netinstall, "unattended":unattended}
113                       
114                       
115        # END def GetNetInstall
116
117        def setNetinstall(self, status, unattended):
118                '''
119                sets option for netinstall int bootopt.json (status and unattended install)
120                '''
121                try:
122                        mirror_var="/var/lib/n4d/variables-dir/LLIUREXMIRROR"
123                        if os.path.isfile(mirror_var):
124                                if (status.lower()=="true" or status.lower()=="false"):
125                                        path_to_write = os.path.join(self.imagepath,"netinstall.json")
126                                        f = open(path_to_write,'w')
127                                        data='{"netinstall_boot":"'+str(status)+'", "netinstall_unattended":"'+str(unattended)+'"}'
128                                        f.writelines(data)
129                                        f.close()
130                                       
131                                        # Enable or disable NETINSTALL on menu (the last option, but enabled)
132                                        if (status.lower()=="true"):
133                                                objects["LlxBootManager"].pushToBootList("netinstall")
134                                        else:
135                                                objects["LlxBootManager"].removeFromBootList("netinstall")
136
137                                        # Removing user and password from preseed
138                                        self.setNetinstallUnattended(status, "", "", "")
139                                       
140                                        return {"status":"true", "msg":"all ok"}
141       
142                                else:
143                                        return {"status":"false", "msg":"option not valid"}
144                        else:
145                                        return {"status":"false", "msg":"mirror is not available"}
146                               
147                        #return data;
148                except Exception as e:
149                        return {"status":"false", "msg":str(e)};
150
151                # END def getListTemplate(self, image)
152               
153        def setNetinstallUnattended(self, status, username, password, rootpassword):
154                '''
155                Writing in presseed username and password
156                '''                             
157                try:
158                        filedir="/var/www/preseed"
159                        filepath="/var/www/preseed/unattended.cfg"
160                        filepartman="/var/www/preseed/partman_sda.cfg"
161
162                        if not os.path.exists(filedir):
163                                os.makedirs(filedir)
164                       
165                        preseed=open(filepath,'w')
166                        preseed.write("# LMD Created user account\n")
167                        salt="sw9.tfRI"                 
168                        userpassencrypted=crypt.crypt(str(password),"$1$"+salt+"$")
169                        rootpassencrypted=crypt.crypt(str(rootpassword),"$1$"+salt+"$")
170                       
171                        if(status==True):
172                                # Saving file
173                               
174                                userfullline="d-i passwd/user-fullname string "+str(username)+"\n";
175                                userline="d-i passwd/username string "+str(username)+"\n";
176                                passline="d-i passwd/user-password-crypted password "+str(userpassencrypted)+"\n"
177                               
178                                if (len(rootpassword) > 0):
179                                        rootpassline = "d-i passwd/root-password-crypted password "+str(rootpassencrypted) + "\n"
180                                else:
181                                        rootpassline = "# d-i passwd/root-password-crypted password "+str(rootpassencrypted) + "\n"
182                                       
183                                # Partition preseed
184                                try:
185                                        partman = open(filepartman,'r')
186                                        preseed.writelines(partman.readlines())
187                                        preseed.write("\n")
188                                        partman.close()
189                                except Exception as e:
190                                        return str(e)
191                               
192                        else:
193                                userfullline="#d-i passwd/user-fullname string \n"
194                                userline="#d-i passwd/username string \n"
195                                passline="# d-i passwd/user-password-crypted password \n"
196                                rootpassline = "# d-i passwd/root-password-crypted password \n"
197
198                        preseed.write("# Normal user name\n")
199                        preseed.write(userfullline)
200                        preseed.write(userline)
201                        preseed.write("# Normal user's password, either in clear text\n")
202                        preseed.write("#d-i passwd/user-password password insecure\n")
203                        preseed.write("# Normal user's password encrypted using an MD5 hash.\n")
204                        preseed.write(passline)
205                        preseed.write(rootpassline)
206                       
207                        # Allow weak passwords
208                        preseed.write("d-i user-setup/allow-password-weak boolean true\n")
209                       
210                        preseed.close()
211                       
212                        return {"status":"true", "msg":"all ok"}
213                       
214                except Exception as e:
215                        return {"status":"false", "msg":str(e)}
216
217                # END def getListTemplate(self, image)
218               
219               
220       
221#class N4dProxy
Note: See TracBrowser for help on using the repository browser.