#!/usr/bin/env python
# -*- coding: utf-8 -*-
### *|--------------------------------|* ###
### *| NO-IP Account-Renew Script 1.0 |* ###
### *| (c) by DarkStarXxX @ DEB |* ###
### *|--------------------------------|* ###
# Modifiziert von MegaV0lt @ DEB
# Modifiziert von SLASH @ DEB
# Modifiziert von bl0w @DEB
VERSION=201208
# Wichtiger Hinweis: Externe Konfiguration
# Die Login-Daten für No-IP und eMail können aus einer externen Datei, welche in
# der Variable "CONFIG_FILE" definiert werden muss gelesen werden.
# Besonderheit: Die Datei im Dateisystem muss die Endung ".py" haben.
# Bitte dort die Daten eintragen (Im gleichen Verzeichnis wie das Skript!)
CONFIG_FILE = "" # Ohne .py (Im gleichen Verzeichnis wie das Skript!)
# Kann abgeschaltet werden, in dem man CONFIG_FILE = "" setzt. In dem Fall die
# Variablen hier ausfüllen!
USERNAME = "" # No-IP Benutzername
PASSWORD = "" # No-IP Passwort
FROMADRESS = "" # eMail-Sender
TOADRESS = "" # eMail-Empfänger
SMTPSERVER = "" # SMTP-Serveradresse ("" zum deaktivieren)
SMTPPORT = "" # SMTP-Port (Z. B. 25)
SMTPPASS = "" # Server verlangt Autentification ("" zum deaktivieren)
# Vorgaben
LOG_FILE = "" # Kein Log, wenn nächste Zeile auskommentiert ist
#LOG_FILE = "/var/log/NOIP_renew.log" # Dateiname wird auch für die eMail verwendet
MAIL_SUBJECT = "NO-IP Account Updater" # Betreff der Status eMail
MAIL_BODY = "NO-IP Account Updater Service updated your NO-IP Account for another 30 days.\nPlease check the attached Logfile\n\n" # Text in der eMail
HOST_URL = "https://www.noip.com/members/dns/"
RESULT_STR = []
import importlib
import mechanicalsoup
import time
import ssl
import re
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
# Funktion: update_host - Für jeden Host "Modify" klicken
def update_host(str_host, br):
global RESULT_STR
br.select_form(nr=00)
br.submit_selected()
# Check if OK
if LOG_FILE:
ts = time.strftime("%d.%m.%Y %H:%M:%S") # Zeitstempel für das Log (19.10.2016 12:51:30)
f1 = open(LOG_FILE, 'a+')
host_id = after(str_host, "?") # Alle Zeichen nach dem ?
if br.response().read().find("Update will be applied") >= 0:
if LOG_FILE: print >> f1,ts,host_id + " [OK]" # Ausgabe in das Log
print(host_id + " [OK]") # Ausgabe auf der Konsole (und cron)
RESULT_STR.append(host_id + " [OK]") # Für die eMail
else:
if LOG_FILE: print >> f1,ts,host_id + " [FAILED]"
print(host_id + " [FAILED]")
RESULT_STR.append(host_id + " [FAILED]")
return
#Funktion: after - Liefert Zeichenkette nach Zeichen a
def after(value, a):
# Find and validate first part
pos_a = value.rfind(a)
if pos_a == -1: return value # Nicht gefunden: Ganzer Wert zurück!
# Returns chars after the found string.
adjusted_pos_a = pos_a + len(a)
if adjusted_pos_a >= len(value): return ""
return value[adjusted_pos_a:]
# Browser options
br = mechanicalsoup.StatefulBrowser(
soup_config={'features': 'lxml'}, # Use the lxml HTML parser
raise_on_404=True,
user_agent='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.2228.0 Safari/537.36',
)
### Start
print("NO-IP Account-Renew Script #%s" % VERSION)
if CONFIG_FILE:
print('Lade Konfiguration aus ' + CONFIG_FILE + '.py')
myconf = importlib.import_module(CONFIG_FILE, package=None)
USERNAME = myconf.USERNAME ; PASSWORD = myconf.PASSWORD
FROMADRESS = myconf.FROMADRESS ; TOADRESS = myconf.TOADRESS
SMTPSERVER = myconf.SMTPSERVER ; SMTPPORT = myconf.SMTPPORT
SMTPPASS = myconf.SMTPPASS
# Prüfen, ob USERNAME und PASSWORT konfiguriert sind
if not USERNAME:
print('FEHLER: USERNAME ist nicht konfiguriert!') ; quit()
if not PASSWORD:
print('FEHLER: PASSWORD ist nicht konfiguriert!') ; quit()
# Seite öffnen
br.open(HOST_URL)
# Login
br.select_form()
br["username"] = USERNAME
br["password"] = PASSWORD
br.submit_selected()
# Links in Array speichern
mylink = [] # Leeres Array
for link in br.links():
if link.text == 'Modify': mylink += [link]
# Links klicken und Updaten
for link in mylink:
target = link.attrs['href']
br.open_relative(target)
update_host(link.url, br)
####### SMTP Section ############
if not SMTPSERVER: quit() # Nur wenn SMTPSERVER gesetzt ist
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders
msg = MIMEMultipart()
msg['From'] = FROMADRESS ; msg['To'] = TOADRESS
msg['Subject'] = MAIL_SUBJECT
body = MAIL_BODY
for var in RESULT_STR:
body = str(body) + str(var) + "\n"
msg.attach(MIMEText(body, 'plain'))
if LOG_FILE:
filename = after(LOG_FILE, "/") # Dateiname ohne Pfad
attachment = open(LOG_FILE, "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
# Example: Server Address and TCP Port - Exmaple: '192.168.1.1' , 25
server = smtplib.SMTP(SMTPSERVER, SMTPPORT)
server.starttls()
# Server verlangt Autentification (Nur wenn SMTPPASS gesetzt ist)
if SMTPPASS: server.login(FROMADRESS, SMTPPASS)
text = msg.as_string()
server.sendmail(FROMADRESS, TOADRESS, text)
server.quit()