Archives par étiquette : script

RouterOS : calculez le volume de données mensuel !

Vous utilisez RouterOS 7 ou ultérieur sur un appareil Mikrotik pour votre réseau ? Voici un script qui va pouvoir calculer le trafic mensuel passant sur le port WAN, ether1 en général. Vous aurez, au préalable, configuré l’envoi d’email dans votre RouterOS et remplacé les emails de destination (emailTo) et d’émission (emailFrom) par vos propres emails :

# --- Configuration ---
:local interfaceName "ether1"
:local emailTo "tonemail@gmail.com"
:local emailSubject "RAPPORT MENSUEL: Trafic ether1 (Go)"
:local emailFrom "noreply@tonemail.fr"

:put "--- SCRIPT DE TRAFIC (DÉMARRAGE) ---"

# --- 1. Vérification de l'interface ---
:local ifName [/interface get [find name=$interfaceName] name]
:if ($ifName = "") do={
    :put "ERREUR: Interface $interfaceName non trouvée"
    :error "Interface non trouvée"
}
:put "Interface trouvée: $ifName"

# --- 2. Lecture brute des compteurs (forcée en nombre) ---
:local rxBytes [:tonum [/interface get [find where name=$ifName] rx-byte]]
:local txBytes [:tonum [/interface get [find where name=$ifName] tx-byte]]
:local totalBytes ($rxBytes + $txBytes)

:put "Données lues - Total: $totalBytes octets"

# --- 3. Conversion en Go (base 10) ---
:local rxGB ($rxBytes / 1000000000)
:local txGB ($txBytes / 1000000000)
:local totalGB ($totalBytes / 1000000000)

# --- 4. Formatage à 2 décimales ---
:local rxGBstr [:pick [:tostr $rxGB] 0 ([:find [:tostr $rxGB] "."] + 3)]
:local txGBstr [:pick [:tostr $txGB] 0 ([:find [:tostr $txGB] "."] + 3)]
:local totalGBstr [:pick [:tostr $totalGB] 0 ([:find [:tostr $totalGB] "."] + 3)]

:put "Conversions effectuées: $totalGBstr Go"

# --- 5. Construction du mail ---
:local today [/system clock get date]

:local body "RAPPORT MENSUEL DE TRAFIC\n\n"
:set body ($body . "Interface: $ifName\n")
:set body ($body . "Période: 30 jours jusqu'au $today\n\n")
:set body ($body . "TRAFFIC CUMULÉ:\n")
:set body ($body . " $totalGBstr Go\n")

:set body ($body . "Compteurs réinitialisés pour le prochain cycle.")

:put "Corps email généré"

# --- 6. Réinitialisation éventuelle ---
/interface reset-counters $ifName
:put "Compteurs réinitialisés"

# --- 7. Envoi du mail ---
/tool e-mail send to=$emailTo from=$emailFrom subject=$emailSubject body=$body
:put "Email envoyé"

:put "--- SCRIPT TERMINÉ ---"

Ce script a été initialement généra par ChatGPT, modifié manuellement, corrigé, et vous enverra tous les 30 jours un email avec le volume total de trafic généré sur cette période.

RouterOS : gestion du ping et alerte

Comment surveiller une IP sur votre routeur RouterOS 7.xx ? Un simple script, ping, se chargera de vous prévenir par email (à condition d’avoir configuré votre envoi d’email dans /tools/e-mail, cf plus bas dans ce billet.

Voici déjà le script qui va tester 3 fois l’adresse 192.168.1.21, et en cas de non-réponse envoyer un email aux deux destinataires, recipient et recipient1 mentionnés dans le script :

    :local targetIP "192.168.1.21";
    :local recipient "monemail@chezmoi.fr ";
    :local recipient1 "secondemail@chezlui.fr";
    :local subjectFail ("ALERTE PING HS ");
    :local bodyFail ("Email automatisé pour vous indiquer que le module ne répond plus. \r\nMerci de bien vouloir vérifier le branchement ethernet et l'alimentation. \r\nVous pouvez le  débrancher, et le rebrancher. \r\nSi l'alerte persiste, merci de contacter votre prestataire.\r\n\r\n
*** Ceci est un message automatisé, ne pas répondre ****");
    :local logMessage ("Test ping vers " . $targetIP);
    :local success 0
    :for i from=1 to=3 do={
        :if ([/ping $targetIP count=1] = 1) do={
            :set success ($success + 1)
        }
    }
    :if ($success = 0) do={
        /tool e-mail send to=$recipient subject=$subjectFail body=$bodyFail
        /tool e-mail send to=$recipient1 subject=$subjectFail body=$bodyFail
    }

Pour ce qui est de la configuration de l’email dans /tools/e-mail :

        server: mail.monserveur.fr        
          port: 465                    
           tls: yes                    
           vrf: main                   
          from: noreply@chezmoi.fr     
          user: alerte@monserveur.fr
      password: LePenEstNulle;;    

Ici, nous avons créé un email alerte@monserveur.fr pour pouvoir expédier. L’envoi se fait sur mail.monserveur.fr mais cela changera selon votre configuration : smtp, imap, etc. tout est possible, pensez à modifier les paramètres.

Vous n’avez désormais plus qu’à exécuter le script ping toutes les 12 heures par exemple :

/system scheduler add name=ping-schedule \
    interval=12h \
    on-event=ping \
    start-time=startup

Et voilà, en cas de coupure vous recevrez une alerte email sur les 2 emails pré-configurés.
Pratique non ?

Domoticz : script Python pour envois MQTT simples

On le lit ici et là, Domoticz utilise une façon bien à lui pour publier du MQTT, avec ce Json qui n’est pas forcément toujours très utile ni très pratique. Personnellement, il est même plutôt hermétique j’avoue

Voici donc la raison d’exister de ce petit script Python, mqttpub.py, destiné à être appelé depuis un interrupteur Domoticz par exemple.

Le script pour commencer :



#
#
# Récuperation du topic et du message à envoyer en MQTT :
# python mqttpub.py domoticz/in 1234 par ex
#
sujet = sys.argv[1]
msg = sys.argv[2]
#
# Informations de connexion à votre broker MQTT : 
# adresse IP, login, mot de passe
broker = "192.168.1.200"
login = "login_a_moi"
pwd = "mon_password"
#
# on se connecte au broker et on publie le message sur le topic
#
client = mqtt.Client()
client.username_pw_set(username=login,password=pwd)
client.connect(broker, 1883, 60)
client.publish(sujet, msg, qos=0, retain=False)

Sauvegardez ce script dans /home/pi/domoticz/scripts/python et rendez le exécutable avec un chmod +x mqttpub.py

Sur un switch de Domoticz, vous allez alors ajouter dans On Action et Off Action la ligne :



script://python/mqttpub.py home/sonoff/commands/MQTTtoSRFB 4195665

Ceci est un exemple qui diffuse la trame radio 4195655 sur un Sonoff Bridge flashé avec OpenMQTTGateway : à vous de l’adapter à vos trames MQTT. 

RouterOS : déconnexion forcée des utilisateurs Hotspot

Si vous utilisez RouterOS de Mikrotik, il peut parfois être utile de supprimer manu-militari tous les utilisateurs d’un hotspot WiFi.

Voici un script qui le permet :

:foreach i in=[/ip hotspot active find] do={
/ip hotspot active remove $i;
}
/ip hotspot cookie remove [find where user!=1]
/ip hotspot set profile=hsprof2 0;
}

De plus, ce script efface tous les cookies éventuellement présents et bascule le hotspot sur un profile alternatif, ici appelé hsprof2, permettant de modifier la page d’accueil du hotspot par exemple.

 

Wifipak Mini + imprimante : développements en labo

De nouveaux développements sont en cours pour le hotspot Wifipak Mini livré avec imprimante de codes.

Désormais, il vous est possible de générer des codes sur mesure avec ou sans impression :

Dans ce cas, retenez le code, il ne sera pas imprimé, pas affiché, juste transmis à votre gestionnaire Wifipak Mini et c’est tout : pratique pour économiser du papier ! De même, les codes générés manuellement peuvent fonctionner sur une durée d’une année : là encore, c’est très pratique si vous avez des utilisateurs sur une longue durée, un camping par exemple, ou des résidences hôtelières.

En développement, nous avons un système permettant de générer des coupons sous forme de planche à imprimer sur une imprimante ordinaire :

Pour le moment nous n’avons pas modifié les quantités de 1, 5 et 10 coupons, le temps de valider le processus en labo. Une fois le choix effectué, par exemple 10 codes d’une journée, vous obtenez l’affichage d’une planche sous forme d’image :

Cette planche peut être imprimée sur votre laser ou jet d’encre du bureau, vous pouvez également faire un clic droit pour la sauvegarder sous forme d’image et l’imprimer ultérieurement.La fonctionnalité sera sans doute disponible sous forme de 10, 20 ou 30 codes. Il nous faut maintenant améliorer le temps de traitement, une génération de 30 codes prenant actuellement environ 30 secondes.

Un script interne a également été remis à jour, script qui se charge de gérer les utilisateurs expirés et qui pouvait poser quelques soucis à certains moments.

Toutes ces fonctionnalités seront gratuitement disponibles, le moment venu, aux utilisateurs actuels de Wifipak Mini + imprimante qui en feront la demande : nous vous demanderons certains accès à distance sur votre matériel, le temps de venir injecter les nouveaux fichiers (ssh, ftp, http essentiellement).

Pour finir, le développement d’un module tactile est toujours en cours : appuyez sur un petit écran de 7″ pour générer des codes d’une heure, un jour, une semaine, ou un mois, avec des quantités de 1, 5, ou 10 pièces.

Sur ce projet novateur, nous avons besoin de vérifier la bonne tenue en charge du petit Raspberry Pi 3 utilisé, tenue en charge de son alimentation également, et tester la résistance de l’ensemble sur une longue durée. Rien n’est encore fait, mais le prototype utilisé en labo est opérationnel, très simple et souple d’emploi : posez le sur un comptoir, et imprimez sans avoir à utiliser votre ordinateur ! Difficile de faire plus simple !

 

Mikrotik, hotspot, et imprimante

Longtemps assez dégoûté du peu d’ergonomie de RouterOS, le firmware des matériels Mikrotik, j’ai été contraint de passer énormément de temps pour chercher à mieux le comprendre. Désormais, maitrisant le système, il est facile de venir développer des solutions originales, comme la gamme Wifipak Mini par exemple, et ce n’est pas terminé.

Wifipak Mini + 4 bornes PoE

C’est souvent en expérimentant qu’arrivent souvent les idées intéressantes. Tenez, là il est question d’aller générer des utilisateurs à la volée dans le User Manager de Mikrotik, depuis un script Python sur un Raspberry Pi, et pourquoi pas le Raspberry Pi utilisé comme enregistreur de connexions tiens !

Prenons donc notre Mikrotik préconfiguré en hotspot, muni de son User Manager, sans mot de passe, avec l’IP 192.168.1.123. Depuis notre Raspberry Pi, nous allons créer le script Python mikro.py après avoir installé au préalable Paramiko (je vous laisse chercher un peu sur Google, c’est assez simple) :

from random import choice
from string import digits
from string import ascii_lowercase
import paramiko
import time
target = '192.168.1.123'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(target, username='admin', password='', look_for_keys=False)
for x in range(0,10):
  login=''.join(choice(ascii_lowercase) for i in range(4))
  mdp=''.join(choice(ascii_lowercase) for i in range(4))
  msg = "/tool user-manager user add customer=admin username=us" + login + " password=" + mdp
  msg2 = "/tool user-manager user create-and-activate-profile us" + login + " customer=admin profile=wifipakmini"
  stdin,stdout,stderr = ssh.exec_command(msg)
  stdin,stdout,stderr = ssh.exec_command(msg2)
  time.sleep(0.8)
  stdin,stdout,stderr = ssh.exec_command(msg2)

A chaque exécution du script, nous allons générer deux variables, login et mdp contenant respectivement le login et le mot de passe d’un utilisateur. Cet utilisateur va être créé dans le gestionnaire Mikrotik et sera affecté au profile wifipakmini qui indique le temps disponible en ligne, 1 minute pour les essais.

Sur notre Mikrotik de test, peu puissant, une pause est nécessaire, ainsi qu’une répétition des commandes, sans cela certains utilisateurs ne sont pas affectés au profil wifipakmini et ne fonctionnent donc pas.

Ce script tourne 10 fois et va au final générer 10 utilisateurs d’un coup avec des logins qui débutent par « us ». Quel intérêt puisque le gestionnaire intégré permet de le faire ? Réfléchissez un peu, imaginez les possibilités et vous trouverez des applications potentiellement intéressantes.. En effet, si toi, ami Geek, tu es capable d’aller gérer en direct depuis le gestionnaire, quid de Mme Michu, paumée au fin fond de la Creuse, sans connaissances poussées en hotspot ? Ne va-t-elle pas préférer générer ses utilisateurs automatiquement et dans un langage clair, via une p’tite page html sur le Raspberry Pi par exemple ?

Allez, poussons un peu plus notre script, avec cette fois un nouveau, efface.py, qui sera lancé deux fois par jour par un simple Crontab sur le Raspberry Pi :

import paramiko
target = '192.168.1.123'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(target, username='admin', password='', look_for_keys=False)
msg = "/tool user-manager user remove [find uptime-used=1m]"
stdin,stdout,stderr = ssh.exec_command(msg)
print stdout.read()

Ici, nous allons chercher tous les utilisateurs ayant utilisé leur temps de connexion, 1m (= 1 minute) pour nos essais, mais ce peut-être 1d (= 1 jour) si vous modifiez le profil wifipakmini du gestionnaire Mikrotik. Tous les utilisateurs ayant la mention 1m dans uptime-used (= temps de connexion utilisé) seront ainsi effacés, évitant de saturer le hotspot avec des codes dévalidés.

Et après ?

Eh oui, tout ceci est bien mimi, c’est choupinou de générer des scripts, des utilisateurs, le principe fonctionne, mais après, que faire ? Imaginons par exemple que nous allons générer des planches avec tous les codes regroupés sur une seule et même feuille : le script se lance, une planche s’affiche en pdf ou en png, vous l’imprimez, tout ceci de façon simple, via un bout de script Php sur le Raspberry Pi, chargé de lancer toutes les actions.

Imaginons également que l’on vienne brancher une imprimante à tickets sur le Raspberry Pi : vous allez ainsi pouvoir générer un ticket à volonté, pourquoi pas en n’appuyant que sur un simple bouton installé sur la p’tite framboise. Et hop, un hotspot avec imprimante à ticket, pour un coût réduit, largement inférieur aux solutions commerciales habituelles, tel ce pack Zyxel vendu près de 1900 € avec enregistreur, WiFi local et imprimante :

Avec un calcul rapide et pas du tout optimisé, une solution équivalente pourrait sortir à bien moins cher, plus de deux fois moins cher en tout cas.

Vous le voyez, se creuser la tête avec des produits issus du monde libre permet de pas mal s’amuser. Le Raspberry Pi est un allié précieux pour développer, sa petite taille et sa modularité en font un outil indispensable pour développer de nouveaux projets.

 

 

Python 3 : jour ou nuit ?

Pour vos projets domotique, il peut être sympa de venir détecter les changements entre jour et nuit, par exemple pour pouvoir allumer automatiquement les lampes intérieures, activer la lumière extérieure lorsque vous le demandez, etc.

Voici donc un petit script en Python 3, sun.py, qui vous indiquera s’il fait jour, ou s’il fait nuit :

#!/usr/bin/python3
import ephem
import datetime
import time
somewhere = ephem.Observer()
somewhere.lat = '47.411252'
somewhere.lon = '-2.169095'
somewhere.elevation = 112
#
# Heure actuelle convertie en chiffres
#
heurenow = int(time.strftime('%H%M'))
#
# r1 = heure lever soleil
# s1 = heure coucher soleil
#
sun = ephem.Sun()
r1 = somewhere.next_rising(sun)
s1 = somewhere.next_setting(sun)
#
# coucher = heure du coucher du soleil, en chiffres
# on commence par convertir l'heure de coucher en chiffres
# après avoir extrait les informations inutiles (date, etc.)
#
heurec = str(s1)
long = len(heurec)
fin = long - 8
heurec = heurec[fin:long-3]
coucher = int(heurec[0:2] + heurec[3:5])
#
# lever = heure du lever du soleil, en chiffres
# on commence par convertir l'heure de lever en chiffres
# après avoir extrait les informations inutiles (date, etc.)
#
heurel = str(r1)
long = len(heurel)
fin = long - 8
heurel = heurel[fin:long-3]
lever = int(heurel[0:2] + heurel[3:5])
print ("Heure UTC coucher du soleil : ", coucher)
print ("Heure UTC lever du soleil : ", lever)
print("Heure UTC actuelle : ", heurenow)
print("")
if heurenow < coucher:
  print("il fait jour")
else:
  print("il fait nuit")

heurenow, coucher, et lever sont des variables numériques, faciles à comparer : si heure actuelle < heure du coucher du soleil, alors il faut jour. A l’inverse, il fera nuit, simple non ? Oui, bien entendu, un programmeur averti pourra sans doute faire bien plus complet et complexe, je n’en doute pas une seule seconde 🙂

Modifiez votre latitude et longitude en fonction du lieu d’utilisation bien entendu, en vous aidant par exemple de ce site très pratique.

A vous maintenant de l’adapter à vos besoins.

coucher soleil

 

Raspberry Pi : réception télécom. 433 MHz avec RFSniffer + script Python

Avec notre RFSniffer modifié, nous savons désormais comment recevoir un code dans un fichier stocké dans /home/pi/recu.txt, un processus mis en tâche de fond.

Voyons maintenant comment, au moyen d’un simple script rx2.py, placé dans /home/pi, nous allons pouvoir lancer des actions en fonction du code reçu (pensez à recréer les identations nécessaires à Python, WordPress a la faculté de tout bousiller lors d’un copier/coller, désolé…).

Nous allons commencer par copier recu.txt dans un fichier temporaire, temp.txt. Ouvrons alors ce fichier, lisons son code et lançons alors les actions appropriées :

  • allumage du salon (un script .sh tout simple exécuté en arrière plan)
  • extinction du salon
  • activation du relai 0 du PiFace, sous forme de pression : j’appuie, je relâche, comme s’il s’agissait d’une pression sur une télécommande
  • activation du relai 1 du PiFace

Pensez à créer un fichier /home/pi/zero.txt contenant juste le chiffre 0 (zero) sans rien d’autre.

Lancez le script simplement :

python3 rx2.py

Si vous voulez le faire tourner en tache de fond, ajoutez simplement un # devant les lignes contenant print, de façon à ce qu’aucun affichage ne vienne vous déranger, puis lancez le :

python3 rx2.py &

 

Je suis conscient qu’il doit être possible de faire un script beaucoup plus « pro » : je ne suis pas programmeur, je l’assume pleinement, mais le script fonctionne, n’est-ce pas l’essentiel ?

Et puis Blogwifi reste ouvert pour la publication de vos améliorations, c’est le principe d’un travail sans licence commerciale, non ? 😉

A vos scripts, prêts, partez !!

raspidomo1

#!/usr/bin/python3
#
# Lecture du code de télécommande reçu par RFSniffer (version modifiée, en tâche de fond)
# le code reçu se trouve dans /home/pi/recu.txt
#
import os
#
# Boucle de detection sans fin
#
# var = 1
while True :
#
# on copie recu.txt dans temp.txt pour éviter de le lire alors que le processus RFSniffer l'utilise (plantage assuré)
#
os.system('sudo cp /home/pi/recu.txt /home/pi/temp.txt')
#
# Ouverture et lecture de temp.txt
#
f = open('/home/pi/temp.txt', encoding='utf-8')
g = int(f.read())
#
# détection du code
# puis remise à zero de recu.txt en copiant zero.txt à sa place
# (zero.txt contient un simple 0)
#

#
# activation relai 0 du PiFace : ON puis OFF
#
if g == 4195665:
print ("Relai 0")
os.system('sudo python /home/pi/output.py 0')
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')

#
# activation relai 1 du PiFace : ON puis OFF
#
if g == 4195668:
print ("Relai 1")
os.system('sudo python /home/pi/output.py 1')
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')

#
# télécommande du salon, lancement des scripts salon_on ou salon_off (envoi de trappes SNMP à un contrôleur 10 relais)
# à modifier selon les besoins, le code est indiqué dans g == xxxxxxxx: xxxxxxx = code de télécommande
#
elif g == 4198737:
print ("salon on")
os.system('sudo sh /home/pi/salon_on.sh &')
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')

elif g == 4198740:
print ("salon off")
os.system('sudo sh /home/pi/salon_off.sh &')
os.system('sudo cp /home/pi/zero.txt /home/pi/recu.txt')