Actualizaciones de seguridad de Ubuntu Server en el correo

written by uve 20 August 2011

Acabo de terminar un script realizado en Python que comprueba actualizaciones de seguridad para Ubuntu Server y en caso de que tener instalado algún paquete, se enviará un mail a la dirección de correo indicada. Este script está pensado principalmente para administradores de sistemas, que como yo, no están dedicados a esta tarea y no disponen de mucho tiempo.

El equipo de Ubuntu utiliza un RSS para publicar las actualizaciones de seguridad, http://www.ubuntu.com/usn/rss.xml. Así que el script se conecta, parsea las entradas del RSS, selecciona los paquetes que son específicos para la versión de Ubuntu instalada, se comprueba si el paquete está instalado y se envía un mail con el listado de paquetes.

import feedparser
import lsb_release
import smtplib
import subprocess
from BeautifulSoup import BeautifulSoup

MAIL_SERVER = 'mail.example.com
MAIL_FROM = 'user@example.com'
MAIL_USER = 'user@example.com'
MAIL_PASSWORD = 'mypassword'
MAIL_TO = 'admin@example.com'
MAIL_MSG = '''\
From: %s
Subject: [Security updates]

%s
'''

distinfo = lsb_release.get_distro_information()
RELEASE = distinfo.get('RELEASE', 'n/a')

d = feedparser.parse('http://www.ubuntu.com/usn/rss.xml')
updates = ''
# TODO: La ultima fecha conocida
for entry in d['entries']:
    soup = BeautifulSoup(entry['summary'])
    dl = soup.find('dl')
    dt_list = soup.findAll('dt')
    for dt in dt_list:
        if dt.text.find(RELEASE) >= 0:
            dd = dt.findNextSibling('dd')
            package_name = dd.findNext('a').text
            try:
                output = subprocess.check_output(["dpkg", "-l", package_name])
                output = output.split('\n')
                status = output[-2]
                if status.startswith('ii'):
                    updates = updates + package_name + '\n'
            except subprocess.CalledProcessError:
                pass

if updates:
    srv = smtplib.SMTP(MAIL_SERVER)
    srv.ehlo()
    # If we can encrypt this session, do it
    if srv.has_extn('STARTTLS'):
        srv.starttls()
        srv.ehlo() # re-identify ourselves over TLS connection

    srv.login(MAIL_USER, MAIL_PASSWORD)
    msg = MAIL_MSG % (MAIL_FROM, updates)
    srv.sendmail(MAIL_FROM, MAIL_TO, msg)
    srv.quit()

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.