Ya existe un paquete en la tienda Wapt, pero lo modifiqué para que la actualización sea completamente automática gracias a la función de auditoría (eliminando así la necesidad de la función update_package). El objetivo es implementar la actualización lo más rápido posible y sin intervención humana.
El código probablemente esté desordenado; esta es la primera vez que manipulo fechas y horas
Prerrequisitos:
Cada agente WAPT buscará el binario mpam-fe.exe en su repositorio WAPT para evitar saturar el enlace de Internet.
En el servidor WAPT, deberá agregar, por ejemplo, la siguiente línea a crontab:
Un breve resumen de lo que hace la auditoría de paquetes:00 20 * * * wget --user-agent="Mozilla" -O /var/www/waptwua/mpam-fe.exe 'https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64'
Se verifica comparando la fecha del binario disponible en el repositorio y el binario almacenado en caché en c:\windows\temp\mpam-fe.xe para ver si hay una nueva versión del binario disponible.
Si el binario aún no existe en "c:\windows\temp\mpam-fe.exe", falsifica la fecha para forzar la descarga.
Si la fecha es diferente, descarga el nuevo binario y luego verifica la firma del binario (debe ser de 'Microsoft Corporation').
Luego instala el nuevo binario.
Ahora solo queda configurar la frecuencia de la auditoría
configuración.py:
Código: Seleccionar todo
# -*- coding: utf-8 -*-
from setuphelpers import *
import requests
import os
from datetime import datetime, timedelta
import time
import waptlicences
r"""
Usable WAPT package functions: install(), uninstall(), session_setup(), audit(), update_package()
"""
# Declaring global variables - Warnings: 1) WAPT context is only available in package functions; 2) Global variables are not persistent between calls
def install():
pass
def audit():
# Declaring local variables
osversion = get_os_version()
repo_url = [r for r in WAPT.repositories if r.name == 'wapt'][0].repo_url
repo_headers = WAPT.waptserver.head('waptwua/mpam-fe.exe')
repo_last_modified = repo_headers.get('last-modified')
repo_last_modified_pattern = "%a, %d %b %Y %H:%M:%S %Z"
repo_last_modified_date = datetime.strptime(repo_last_modified, repo_last_modified_pattern)
repo_last_modified_date_loc = repo_last_modified_date + timedelta(hours=1)
if isfile(r'c:\windows\temp\mpam-fe.exe') :
file_modTimesinceEpoc = os.path.getmtime(r'c:\windows\temp\mpam-fe.exe')
else :
# fake modification time if no bin
file_modTimesinceEpoc = int(float('1002387810.4883926'))
file_modificationTime_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(file_modTimesinceEpoc))
file_modificationTime_date = datetime.strptime(file_modificationTime_str, '%Y-%m-%d %H:%M:%S')
# Downloading new bin
if repo_last_modified_date_loc != file_modificationTime_date :
with WAPT.waptserver.get_requests_session() as session:
wget("%swua/mpam-fe.exe" % repo_url, r'c:\windows\temp\mpam-fe.exe', requests_session=session)
# Check signature bin
expected_issuer = 'Microsoft Corporation'
sign_name = waptlicences.check_msi_signature(r'c:\windows\temp\mpam-fe.exe')[0]
if sign_name != expected_issuer:
error('Bad issuer %s != %s ' % (sign_name,expected_issuer))
# Installing bin
versionfile = get_file_properties(r'c:\windows\temp\mpam-fe.exe')['ProductVersion']
if get_windows_defender_version() < versionfile:
run(r'c:\windows\temp\mpam-fe.exe /s')
if get_windows_defender_version() < versionfile:
error('AntivirusSignatureVersion not in %s' % versionfile)
print(r'OK: Definition Version is %s' % versionfile)
return "OK"
def get_windows_defender_version():
for i in get_antivirus_info():
if not i["name"] == "Windows Defender":
continue
return Version(i['AntivirusSignatureVersion'])
return Version('0')
