MegaV0lt
Spezialist
Hab jetzt das Skript umgestellt, damit es den ConfigParser verwendet.
Die Konfiguration is nun wie in dem Beispiel:
Außerdem kann man dem Skript nun eine Konfiguraionsdate übergeben. Beispiel:
NOIP-Account-Renew Myini.ini
Im Skript eingetragene Daten werden in dem Fall überschieben
Das Skript: 16.05.2021 - Login bei noip wurde geändert und das Skript funktioniert so nicht mehr! Alternative siehe Signatur
Im Skript gibt man nun die Konfig normal mit Dateiendung (*.ini) an.
Die Konfiguration is nun wie in dem Beispiel:
Code:
# Konfiguration für NOIP-Account-Renew
#
# Kommentare nur am Zeilenanfang!
# Werte ohne Anführungszeichen!
# No-IP-Daten
[NOIP]
USERNAME = Benutzername
PASSWORD = PA55W0RT
# eMail-Daten
[MAIL]
FROMADRESS =
TOADRESS =
SMTPSERVER =
SMTPPORT =
SMTPPASS =
Außerdem kann man dem Skript nun eine Konfiguraionsdate übergeben. Beispiel:
NOIP-Account-Renew Myini.ini
Im Skript eingetragene Daten werden in dem Fall überschieben
Das Skript: 16.05.2021 - Login bei noip wurde geändert und das Skript funktioniert so nicht mehr! Alternative siehe Signatur
Python:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
### *|--------------------------------|* ###
### *| NO-IP Account-Renew Script 1.0 |* ###
### *| (c) by DarkStarXxX @ DEB |* ###
### *|--------------------------------|* ###
# Modifiziert von MegaV0lt @ DEB
# - Benötigt Python 3
# - Umstellung auf 'mechanicalsoup.StatefulBrowser()'
# - Prüfung, ob Konfig-Datei existiert
# - Umstellung auf *.ini konfiguration
# - Konfiguration (*.ini) kann als Parameter übergeben werden
# Modifiziert von SLASH @ DEB
# - Skript nutzt nun python3 direkt (#!/usr/bin/env python3)
# - Update für eMail-imports
# Modifiziert von bl0w @DEB
VERSION=210304 # JJMMDD
# 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.
# Bitte dort die Daten eintragen
CONFIG_FILE = 'NOIP_Account_Renew.ini' # Im gleichen Verzeichnis wie das Skript!
#CONFIG_FILE = '' # Kann abgeschaltet werden, in dem man CONFIG_FILE = '' setzt.
# Die Konfiguration kann dem Skript als Parameter übergeben werden:
# NOIP-Account-Renew MyIni.ini
# 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 platform
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, browser):
global RESULT_STR
host_id = after(str_host, '=') # Alle Zeichen nach dem ?
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+')
browser.select_form(nr=00) ; browser.submit_selected()
response = browser.get_current_page()
if response.find('Update will be applied') == 'None' : # Prüfen, ob es geklappt hat
if LOG_FILE: print(f'{ts}: Update für Host-ID: {host_id} [FEHLER]', file=f1)
print(f'Update für Host-ID: {host_id} [FEHLER]')
RESULT_STR.append(host_id + ' [FEHLER]')
else:
if LOG_FILE: print(f'{ts}: Update für Host-ID: {host_id} [OK]', file=f1) # Ausgabe in das Log
print(f'Update für Host-ID: {host_id} [OK]') # Ausgabe auf der Konsole (und cron)
RESULT_STR.append(host_id + ' [OK]') # Für die eMail
return
# Funktion: after() - Liefert Zeichenkette nach Zeichen a
def after(value, a):
pos_a = value.rfind(a) # Position des gesuchten Zeichens
if pos_a == -1: return value # Nicht gefunden: Ganzer Wert zurück!
adjusted_pos_a = pos_a + len(a) # Alles nach dem gefundenen Zeichen
if adjusted_pos_a >= len(value): return ''
return value[adjusted_pos_a:]
# Browser Optionen
browser = 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(f'NO-IP Account-Renew Script #{VERSION} (Python: {platform.python_version()})')
# Wenn eine *.ini als Parameter übergeben wurde, diese verwenden
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('filename', nargs='?', action='store')
args = parser.parse_args()
if args.filename is not None: CONFIG_FILE = args.filename
if CONFIG_FILE:
from pathlib import Path
my_conf = Path(CONFIG_FILE)
if my_conf.is_file(): # Datei vorhanden?
print('Lade Konfiguration aus:', my_conf)
import configparser
config = configparser.ConfigParser()
config.read(my_conf) # *.ini
USERNAME = config['NOIP']['USERNAME'] ; PASSWORD = config['NOIP']['PASSWORD']
FROMADRESS = config['MAIL']['FROMADRESS'] ; TOADRESS = config['MAIL']['TOADRESS']
SMTPSERVER = config['MAIL']['SMTPSERVER'] ; SMTPPORT = config['MAIL']['SMTPPORT']
SMTPPASS = config['MAIL']['SMTPPASS']
else: print(f'FEHLER: Konfiguration {my_conf} nicht gefunden!') ; quit()
# 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
print('Log-In… ', end='')
browser.open(HOST_URL)
# Login
browser.select_form()
browser['username'] = USERNAME
browser['password'] = PASSWORD
browser.submit_selected()
# Login OK?
response = browser.get_current_page()
if response.find('Dashboard') == 'None': print('FEHLER!') ; quit()
else: print('OK!')
# Links in Array speichern
mylink = [] # Leeres Array
for link in browser.links():
if link.text == 'Modify': mylink += [link]
# Anzeigen wie viele Links gefunden wurden
number_of_hosts = len(mylink)
print(f'Gefundene Hosts: {number_of_hosts}. Starte Update…')
# Links klicken und Updaten
for link in mylink:
target = link.attrs['href']
browser.open_relative(target) # Zur Seeite gehen
update_host(target, browser) # Host updaten
####### SMTP Section ############
if not SMTPSERVER: quit() # Nur wenn SMTPSERVER gesetzt ist
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base 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()
Im Skript gibt man nun die Konfig normal mit Dateiendung (*.ini) an.
Code:
[/usr/local/sbin] # python ./NOIP-Account-Renew
NO-IP Account-Renew Script #210302 (Python: 3.7.3)
Lade Konfiguration aus: NOIP_Account_Renew.ini
Log-In… OK!
Gefundene Hosts: 3. Starte Update…
host_id=***90 [OK]
host_id=***97 [OK]
host_id=***07 [OK]
Zuletzt bearbeitet: