source: client/engine/PostConfLib.py @ af9a1d9

ogClonningEnginetest-python-scriptsticket-585ticket-693ticket-700
Last change on this file since af9a1d9 was 7260bdc2, checked in by Antonio Emmanuel Guerrero Silva <aguerrero@…>, 9 months ago

refs #585 Libraries convert to Python3

  • Property mode set to 100644
File size: 16.1 KB
Line 
1import os
2import sys
3
4from engine.FileLib import *
5from engine.InventoryLib import *
6from engine.NetLib import *
7from engine.RegistryLib import *
8from engine.SystemLib import *
9
10def ogCleanOs():
11    # Si se solicita, mostrar ayuda.
12    if len(sys.argv) > 1 and sys.argv[1] == "help":
13        ogHelp("ogCleanOs", "ogCleanOs int_ndisk int_nfilesys", "ogCleanOs 1 1")
14        return
15
16    # Error si no se reciben 2 parámetros.
17    if len(sys.argv) != 3:
18        ogRaiseError(OG_ERR_FORMAT, "ogCleanOs int_ndisk int_nfilesys")
19        return
20
21    os_type = ogGetOsType(sys.argv[1], sys.argv[2])
22
23    if os_type == "Linux":
24        # Borramos los ficheros de dispositivos y los temporales.
25        ogCleanLinuxDevices(sys.argv[1], sys.argv[2])
26        os.system("rm -rf " + ogMount(sys.argv[1], sys.argv[2]) + "/tmp/*")
27    elif os_type == "Windows":
28        # Borrar ficheros de hibernación y paginación de Windows.
29        if ogGetPath(sys.argv[1], sys.argv[2], "pagefile.sys"):
30            ogDeleteFile(sys.argv[1], sys.argv[2], "pagefile.sys")
31        if ogGetPath(sys.argv[1], sys.argv[2], "hiberfil.sys"):
32            ogDeleteFile(sys.argv[1], sys.argv[2], "hiberfil.sys")
33        if ogGetPath(sys.argv[1], sys.argv[2], "swapfile.sys"):
34            ogDeleteFile(sys.argv[1], sys.argv[2], "swapfile.sys")
35
36def ogInstallMiniSetup():
37    # Si se solicita, mostrar ayuda.
38    if len(sys.argv) > 1 and sys.argv[1] == "help":
39        ogHelp("ogInstallMiniSetup", "ogInstallFirstBoot ogInstallRunonce")
40        return
41
42    if len(sys.argv) == 4:
43        # Ejecución en el primer arranque de la máquina.
44        ogInstallFirstBoot(sys.argv[1], sys.argv[2], sys.argv[3])
45    elif len(sys.argv) == 7 or len(sys.argv) == 9:
46        # Ejecución en el "runonce".
47        ogInstallRunonce(*sys.argv[1:])
48    else:
49        ogRaiseError(OG_ERR_FORMAT)
50
51def ogInstallFirstBoot():
52    # Si se solicita, mostrar ayuda.
53    if len(sys.argv) > 1 and sys.argv[1] == "help":
54        ogHelp("ogInstallFirstBoot", "ogInstallFirstBoot int_ndisk int_npartition str_filename", "ogInstallFirstBoot 1 1 filename.cmd")
55        return
56
57    # Error si no se reciben 3 parámetros.
58    if len(sys.argv) != 4:
59        ogRaiseError(OG_ERR_FORMAT)
60        return
61
62    MNTDIR = ogMount(sys.argv[1], sys.argv[2])
63    if not MNTDIR:
64        return
65
66    for i in ["winnt", "windows"]:
67        DIR = ogGetPath(os.path.join(MNTDIR, i, "system32"))
68        if DIR:
69            CMDDIR = DIR
70            break
71    else:
72        ogRaiseError(OG_ERR_NOTFOUND, os.path.join(MNTDIR, "windows", "system32"))
73        return
74
75    CMDFILE = os.path.join(CMDDIR, sys.argv[3])
76
77    # Creamos el archivo cmd y creamos un par de comandos para que una vez acabe la
78    # postconfiguracion resetee el mini setup, sino lo haria en cada arranque.
79    with open(CMDFILE, "w") as f:
80        f.write("""REG ADD HKLM\System\Setup /v SystemSetupInProgress /t REG_DWORD /d 0 /f
81REG ADD HKLM\System\Setup /v CmdLine /t REG_SZ /d "" /f""")
82
83    # Crear los valores de registro necesarios para que se haga la ejecución del .cmd al aranque.
84    ogSetRegistryValue(MNTDIR, "SYSTEM", "\\Setup\\SystemSetupInProgress", 1)
85    ogSetRegistryValue(MNTDIR, "SYSTEM", "\\Setup\\SetupType", 4)
86    #ogDeleteRegistryValue(MNTDIR, "SYSTEM", "\\Setup\\CmdLine")
87    ogAddRegistryValue(MNTDIR, "SYSTEM", "\\Setup\\CmdLine")
88    ogSetRegistryValue(MNTDIR, "SYSTEM", "\\Setup\\CmdLine", "cmd.exe /c " + os.path.basename(CMDFILE))
89
90def ogInstallRunonce():
91    # Si se solicita, mostrar ayuda.
92    if len(sys.argv) > 1 and sys.argv[1] == "help":
93        ogHelp("ogInstallRunonce", "ogInstallRunonce int_ndisk int_npartition str_filename str_adm_user str_adm_password bool_autologin [str_auto_user str_auto_password]", "ogInstallRunonce 1 1 filename.cmd administrator passadmin 1 userauto passuserauto", "ogInstallRunonce 1 1 filename.cmd administrator passadmin 0")
94        return
95
96    # Error si no se reciben 6 u 8 parámetros.
97    if len(sys.argv) != 6 and len(sys.argv) != 8:
98        ogRaiseError(OG_ERR_FORMAT)
99        return
100
101    MOUNTPOINT = ogGetPath(sys.argv[1], sys.argv[2], "/")
102    CMDDIR = None
103
104    # Comprobar que existe el directorio del fichero de comandos.
105    for i in ["winnt", "windows"]:
106        DIR = ogGetPath(os.path.join(MOUNTPOINT, i, "system32"))
107        if DIR:
108            CMDDIR = DIR
109            break
110
111    if not CMDDIR:
112        ogRaiseError(OG_ERR_NOTFOUND, os.path.join(MOUNTPOINT, "Windows", "System32"))
113        return
114
115    CMDFILE = os.path.join(CMDDIR, sys.argv[3])
116
117    if sys.argv[6] == "0":
118        # Si no queremos hacer autologin despues de la postconfiguracion lo indicamos en las claves de registro
119        with open(CMDFILE, "w") as f:
120            f.write("""DEL C:\ogboot.*
121REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f
122REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "" /f
123REG DELETE "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f""")
124    else:
125        # Si queremos hacer autologin despues de la postconfiguracion introducimos la informacion en las claves de registro
126        with open(CMDFILE, "w") as f:
127            f.write(f"""DEL C:\ogboot.*
128REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
129REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "{sys.argv[7]}" /f
130REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "{sys.argv[8]}" /f""")
131
132    # Creamos las claves de registro necesarias para que meter el cmd en el runonce del usuario y este haga autologin
133    ogAddRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\PostConfiguracion")
134    ogSetRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\PostConfiguracion", f"C:\\windows\\system32\\{sys.argv[3]}")
135    ogAddRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\AutoAdminLogon")
136    ogSetRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\AutoAdminLogon", "1")
137    ogAddRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\DefaultUserName")
138    ogSetRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\DefaultUserName", sys.argv[4])
139    ogAddRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\DefaultDomainName")
140    ogSetRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\DefaultDomainName", ".\\")
141    ogAddRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\DefaultPassword")
142    ogSetRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\DefaultPassword", sys.argv[5])
143    ogDeleteRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ForceAutoLockOnLogon")
144    ogDeleteRegistryValue(MOUNTPOINT, "software", "\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\AutoLogonCount")
145
146def ogAddCmd():
147    # Si se solicita, mostrar ayuda.
148    if len(sys.argv) > 1 and sys.argv[1] == "help":
149        ogHelp("ogAddCmd", "ogAddCmd int_ndisk int_npartition str_filename str_commands", "ogAddCmd 1 1 filename.cmd command")
150        return
151
152    # Error si no se reciben 4 parámetros.
153    if len(sys.argv) != 5:
154        ogRaiseError(OG_ERR_FORMAT)
155        return
156
157    MOUNTPOINT = ogMount(sys.argv[1], sys.argv[2])
158    if not MOUNTPOINT:
159        return
160
161    # Crear fichero de comandos, si no existe.
162    CMDFILE = ogGetPath(os.path.join(MOUNTPOINT, "windows", "system32"), sys.argv[3])
163    if not CMDFILE:
164        ogInstallMiniSetup(sys.argv[1], sys.argv[2], sys.argv[3])
165        CMDFILE = ogGetPath(os.path.join(MOUNTPOINT, "windows", "system32"), sys.argv[3])
166        if not CMDFILE:
167            ogRaiseError(OG_ERR_NOTFOUND, os.path.join(MOUNTPOINT, "windows", "system32", sys.argv[3]))
168            return
169
170    # Concatenamos el comando en el fichero de comandos
171    with open(CMDFILE, "a") as f:
172        f.write(sys.argv[4])
173
174def ogDomainScript():
175    # Si se solicita, mostrar ayuda.
176    if len(sys.argv) > 1 and sys.argv[1] == "help":
177        ogHelp("ogDomainScript", "ogDomainScript int_ndisk int_npartition str_filename str_domain str_user str_password", "ogDomainScript 1 1 filename.cmd domain user password_user")
178        return
179
180    # Error si no se reciben 6 parámetros.
181    if len(sys.argv) != 7:
182        ogRaiseError(OG_ERR_FORMAT)
183        return
184
185    MOUNTPOINT = ogMount(sys.argv[1], sys.argv[2])
186    if not MOUNTPOINT:
187        return
188
189    # Comprobar que existe el directorio de comandos.
190    CMDDIR = ogGetPath(os.path.join(MOUNTPOINT, "windows", "system32"))
191    if not CMDDIR:
192        ogRaiseError(OG_ERR_NOTFOUND, os.path.join(sys.argv[1], "windows", "system32"))
193        return
194
195    # Añadimos en el cmd que se ejecutara al arranque, el comando de ejecutar el script que añade al dominio.
196    ogAddCmd(sys.argv[1], sys.argv[2], sys.argv[3], "CSCRIPT joindomain.vbs")
197    # Eliminamos el script porque tiene el usuario de administrador de dominio en claro
198    ogAddCmd(sys.argv[1], sys.argv[2], sys.argv[3], "DEL /Q C:\\Windows\\System32\\joindomain.vbs")
199    # Metemos unas claves de registro para que el dominio salga seleccionado por defecto
200    ogAddCmd(sys.argv[1], sys.argv[2], sys.argv[3], f"REG ADD \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\" /v DefaultDomainName /t REG_SZ /d \"{sys.argv[4]}\" /f")
201
202    # Creamos el archivo joindomain.vbs que nos introduce la maquina en el dominio
203    with open(os.path.join(CMDDIR, "joindomain.vbs"), "w") as f:
204        f.write(f"""Const JOIN_DOMAIN = 1
205Const ACCT_CREATE = 2
206Const ACCT_DELETE = 4
207Const WIN9X_UPGRADE = 16
208Const DOMAIN_JOIN_IF_JOINED = 32
209Const JOIN_UNSECURE = 64
210Const MACHINE_PASSWORD_PASSED = 128
211Const DEFERRED_SPN_SET = 256
212Const INSTALL_INVOCATION = 262144
213
214strDomain = "{sys.argv[4]}"
215strUser = "{sys.argv[5]}"
216strPassword = "{sys.argv[6]}"
217
218Set objNetwork = CreateObject("WScript.Network")
219strComputer = objNetwork.ComputerName
220
221Set objComputer = GetObject("winmgmts:{{impersonationLevel=Impersonate}}!\\\\\" & _
222    strComputer & "\\root\\cimv2:Win32_ComputerSystem.Name='" & strComputer & "'")
223
224ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, strPassword, _
225    strDomain & "\\" & strUser, NULL, JOIN_DOMAIN + ACCT_CREATE)""")
226       
227def ogConfigureOgagent():
228    # Si se solicita, mostrar ayuda.
229    if len(sys.argv) > 1 and sys.argv[1] == "help":
230        ogHelp("ogConfigureOgagent", "ogConfigureOgagent int_ndisk int_nfilesys", "ogConfigureOgagent 1 1")
231        return
232
233    # Error si no se reciben 2 parámetros.
234    if len(sys.argv) != 3:
235        ogRaiseError(OG_ERR_FORMAT, "ogConfigureOgagent int_ndisk int_nfilesys")
236        return
237
238    MNTDIR = ogMount(sys.argv[1], sys.argv[2])
239    if not MNTDIR:
240        return
241
242    # Comprobar si existe el fichero de configuración de OGAgent.
243    for AGENTDIR in ["usr/share/OGAgent", "Program Files/OGAgent", "Program Files (x86)/OGAgent", "Applications/OGAgent.app"]:
244        CFGFILE = ogGetPath(os.path.join(MNTDIR, AGENTDIR, "cfg", "ogagent.cfg"))
245        if CFGFILE:
246            break
247    else:
248        ogRaiseError(OG_ERR_NOTFOUND, "ogagent.cfg")
249        return
250
251    # Parchear dirección del servidor OpenGnsys en el fichero de configuración de OGAgent.
252    with open(CFGFILE, "r") as f:
253        lines = f.readlines()
254    with open(CFGFILE, "w") as f:
255        for line in lines:
256            if line.startswith("remote="):
257                line = "remote=https://" + ogGetServerIp() + "/opengnsys/rest/\n"
258            f.write(line)
259
260def ogInstallLaunchDaemon():
261    # Si se solicita, mostrar ayuda.
262    if len(sys.argv) > 1 and sys.argv[1] == "help":
263        ogHelp("ogInstallLaunchDaemon", "ogInstallLaunchDaemon int_ndisk int_nfilesys str_scriptname", "ogInstallLaunchDaemon 1 2 postconf")
264        return
265
266    # Error si no se reciben 3 parámetros.
267    if len(sys.argv) != 4:
268        ogRaiseError(OG_ERR_FORMAT)
269        return
270
271    LAUNCHDIR = ogGetPath(sys.argv[1], sys.argv[2], "/Library/LaunchDaemons")
272    if not LAUNCHDIR:
273        ogRaiseError(OG_ERR_NOTFOUND, os.path.join(sys.argv[1], sys.argv[2], "/Library/LaunchDaemons"))
274        return
275
276    SCRIPTDIR = ogGetPath(sys.argv[1], sys.argv[2], "/usr/share")
277    if not SCRIPTDIR:
278        ogRaiseError(OG_ERR_NOTFOUND, os.path.join(sys.argv[1], sys.argv[2], "/usr/share"))
279        return
280
281    # Crear fichero de configuración del servicio de arranque.
282    with open(os.path.join(LAUNCHDIR, f"es.opengnsys.{sys.argv[3]}.plist"), "w") as f:
283        f.write("""<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
284<plist version="1.0">
285        <dict>
286                <key>Label</key>
287                <string>es.opengnsys.{}</string>
288                <key>ProgramArguments</key>
289                <array>
290                        <string>{}/{}.sh</string>
291                </array>
292                <key>RunAtLoad</key>
293                <true/>
294                <key>StandardOutPath</key>
295                <string>/var/log/{}.log</string>
296                <key>StandardErrorPath</key>
297                <string>/var/log/{}.err</string>
298                <true/>
299        </dict>
300</plist>""".format(sys.argv[3], SCRIPTDIR, sys.argv[3], sys.argv[3], sys.argv[3]))
301
302    # Crear un fichero de script vacío.
303    with open(os.path.join(SCRIPTDIR, f"{sys.argv[3]}.sh"), "w") as f:
304        f.write("")
305    os.chmod(os.path.join(SCRIPTDIR, f"{sys.argv[3]}.sh"), 0o755)
306
307def ogAddToLaunchDaemon():
308    # Si se solicita, mostrar ayuda.
309    if len(sys.argv) > 1 and sys.argv[1] == "help":
310        ogHelp("ogAddToLaunchDaemon", "ogAddToLaunchDaemon int_ndisk int_nfilesys str_scriptname str_command", "ogAddToLaunchDaemon 1 2 postconf \"diskutil enableJournal disk0s2\"")
311        return
312
313    # Error si no se reciben 4 parámetros.
314    if len(sys.argv) != 5:
315        ogRaiseError(OG_ERR_FORMAT)
316        return
317
318    SCRIPTDIR = ogGetPath(sys.argv[1], sys.argv[2], "/usr/share")
319    if not SCRIPTDIR:
320        ogRaiseError(OG_ERR_NOTFOUND, os.path.join(sys.argv[1], sys.argv[2], "/usr/share"))
321        return
322
323    # Comprobar que existe el fichero de comandos.
324    SCRIPTFILE = os.path.join(SCRIPTDIR, sys.argv[3] + ".sh")
325    if not os.path.exists(SCRIPTFILE):
326        ogRaiseError(OG_ERR_NOTFOUND, SCRIPTFILE)
327        return
328
329    # Concatenamos el comando en el fichero de comandos
330    with open(SCRIPTFILE, "a") as f:
331        f.write(sys.argv[4] + "\n")
332
333def ogUninstallLinuxClient():
334    # Si se solicita, mostrar ayuda.
335    if len(sys.argv) > 1 and sys.argv[1] == "help":
336        ogHelp("ogUninstallLinuxClient", "ogUninstallLinuxClient int_ndisk int_filesys", "ogUninstallLinuxClient 1 1")
337        return
338
339    # Error si no se reciben 2 parámetros.
340    if len(sys.argv) != 3:
341        ogRaiseError(OG_ERR_FORMAT)
342        return
343
344    MNTDIR = ogMount(sys.argv[1], sys.argv[2])
345    if not MNTDIR:
346        return
347
348    # Borrar ficheros y quitar llamada al cliente durante el proceso de inicio.
349    os.system(f"rm -f {MNTDIR}/{{usr/sbin,sbin,usr/local/sbin}}/ogAdmLnxClient")
350    os.system(f"rm -f {MNTDIR}/{{etc,usr/local/etc}}/ogAdmLnxClient.cfg")
351    os.system(f"sed -i -e '/ogAdmLnxClient/ d' {MNTDIR}/{{etc,usr/local/etc}}/{{rc.local,rc.d/rc.local}} 2>/dev/null")
352
353def ogUninstallWindowsClient():
354    # Si se solicita, mostrar ayuda.
355    if len(sys.argv) > 1 and sys.argv[1] == "help":
356        ogHelp("ogUninstallWindowsClient", "ogUninstallWindowsClient int_ndisk int_filesys str_filename", "ogUninstallWindowsClient 1 1 filename.cmd")
357        return
358
359    # Error si no se reciben 3 parámetros.
360    if len(sys.argv) != 4:
361        ogRaiseError(OG_ERR_FORMAT)
362        return
363
364    MNTDIR = ogMount(sys.argv[1], sys.argv[2])
365    if not MNTDIR:
366        return
367
368    # Crear órdenes para desinstalar servicio y borrar ejecutable del cliente.
369    if ogGetPath(MNTDIR, "windows", "ogAdmWinClient.exe") or ogGetPath(MNTDIR, "winnt", "ogAdmWinClient.exe"):
370        ogAddCmd(sys.argv[1], sys.argv[2], sys.argv[3], 'ogAdmWinClient -remove')
371        ogAddCmd(sys.argv[1], sys.argv[2], sys.argv[3], 'DEL C:\\Windows\\ogAdmWinClient.exe')
372        ogAddCmd(sys.argv[1], sys.argv[2], sys.argv[3], 'DEL C:\\Winnt\\ogAdmWinClient.exe')
Note: See TracBrowser for help on using the repository browser.