Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/02/2014, à 20:14

Gaara

[script] Notification de mise à jour automatiques

Bonjour à tous,

J'ai créé un script en GTK-python (2.7) qui permet l'affichage d'une notification lors du téléchargement et de l'installation des mises à jour automatiques via le paquet unattended-upgrade.
Ce paquet est installé par défaut, mais n'est pas activé.

Compatibilités: Ubuntu Precise, Quantal, Raring, Saucy, Trusty et Debian Wheezy.
Dépendances : gksu, python-imaging, python-gtk2, python-pygame, zenity

Pour 12.04, 12.10, 13.04, 13.10, 14.04:

sudo apt-get install gksu python-imaging python-gtk2 python-pygame zenity

Testé sur Kubuntu Raring, Saucy et Trusty, fonctionnel.

Un petit aperçu de la première version:                                                     Aperçu de la version en cours (couleur et image paramétrable):

u50.gif      iSkjGn.gif

Aperçu du paramétrage:
mini_431498autoupgradenotify1.jpg

C'est un script complémentaire du script de metalux, qui permet de configurer les mises à jour automatiques (avec les PPA) : maj_auto.
Il prend les données générées par unattended et de cron.daily/apt, via deux logs (/run/unattended-upgrades.progress et ./auto_upgrade_notify/log/apt_terminal.log).


Le logiciel permet de choisir une image (ou icone) au format jpg ou png, de choisir la position de la notification sur l'écran, et la couleur. L'image (présente dans l'archive) peut être celle ci ou une autre, elle sera automatiquement mise à l'échelle de la fenêtre. (Vous pouvez donc choisir un fond d'écran, la notification aura toujours la même taille !)
Surtout, le logiciel permet de sauvegarder la configuration initiale, d'activer la notification, ou de restaurer le fichier initial.
J'ai choisi de rendre la sauvegarde obligatoire pour pouvoir activer la notification.
Un mode "aperçu" est disponible, pratique pour voir l'image ou la couleur à l'avance. Ayant deux écrans, il y a aussi une case "dual screen" pour la position de la notification. (Mon deuxième écran est à droite)
Un mode de notification audio est aussi disponible en fin de mise à jour, avec le choix du son dans votre audiothèque.

Ce dossier sera composé comme suit:
- Dossier bak: Les sauvegarde des fichiers initiaux
- Dossier config contenant la copie de l'image choisie, redimentionnée
- Dossier log, les logs sur lesquels le logiciel travaille. Dans la version finale, certains logs seront effacés à chaque mise à jour.
A la racine de ce dossier, les différents scripts.

Un fichier .cfg sera créé dans /etc, il y a dedans les données enregistrées par le script de config. (position, couleur, etc)

Voilà, c'est une version en constante évolution, il y a certainement quelques bugs...

Merci à metalux, qui m'a donné l'idée d'écrire ce script grâce au sien, à pingouinux et tiramiseb, qui m'ont bien aidé.
Bonnes mises à jours !

Installation via un ppa:

sudo apt-add-repository ppa:yoggic/maj-auto
sudo apt-get update
sudo apt-get install maj-auto-notify

Le ppa est dispo sur 12.04, 14.04 et 14.10.
-----------------------------------------------------------------------------------------------------------------  //  CHANGELOG  // -----------------------------------------------------------------------------------------------------------------------------

v 0.7.1 : Bug du % du .progress corrigé. S'il reste à 0% dans le .progress,  le % de la barre augmente de 25% à chaque changement du nom de paquet installé. 
v 0.7.2 : Ajout d'un timing quand le % du .progress reste à 0. Le % de la barre augmente de 5% à chaque changement de nom de paquet. Au bout de 60s, le % passe automatiquement à 100%.
v 0.7.3 : Bug du % bloqué entre 1 et 85%: si c'est le cas, le pourcentage est automatiquement augmenté à 100% au bout de 90s.
v 0.8.0 : Refonte complète du calcul du temps, et prise en compte des changements du log écrit par unattended. (progress ou progression)
v 0.8.2 : Prise en compte du script de notification, config_auto_upgrade_notify.py
config v 0.3.8.1 : Correction du bug de l'image, qui était sauvegardée à la sélection.
v 0.9 :    Ajout du pourcentage du téléchargement
              Ajout d'un bouton fermer sur la notification
config v 0.5 : Création d'un raccourci pour lancer la configuration dans Programmes/Configuration/auto_upgrade_notify
                      Ajout d'une option son à la fin de la notification
                     Correction de divers bugs de l'aperçu
v 0.9.1 : Ajout des noms des paquets téléchargés sur la barre
              Modification du fichier install.py
config v 0.5.1 : Modification et correction de l'appel de gksudo pour Trusty
                        Vérification de la modification de cron.daily/apt. Si le fichier est déjà modifié, la coche "modifier" est désactivée
v 0.9.2 : Changement de dépendances: python-pygame à la place de mplayer, qui posait des soucis
             Création d'un script d'uninstall
v 1.0.0: Création d'un "pré-notification" prévenant de la mise à jour imminente (avec le timing)
             Suppression des dépendances notify-osd et Cie, qui créaient trop de soucis en root
             Possibilité de supprimer les sauvegardes à partir de la config

Dernière modification par Gaara (Le 02/10/2014, à 09:25)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#2 Le 24/02/2014, à 09:41

tiramiseb

Re : [script] Notification de mise à jour automatiques

Salut,

Juste une petite réaction rapide :

p = subprocess.Popen(['python', '/home/user/majauto/auto_upgrade_notify.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

Pourquoi réinstancier un intepréteur Python par l'intermédiaire de "subprocess.Popen" plutôt que d'importer le module ?

Hors ligne

#3 Le 24/02/2014, à 09:49

Gaara

Re : [script] Notification de mise à jour automatiques

Bonjour,
Heu... Je ne sais pas si ça répond à ta question: en fait, il faut que les deux scripts tournent en parallèle. J'ai essayé plusieurs choses, et par exemple avec subprocess.call, ça lance le script auto_upgrade_notify.py mais unattended attend que mon script se termine pour continuer. Dans ce cas, ça ne marche pas, car mon script tourne en boucle. Il faut subprocess.Popen pour que le premier ne s'arrête pas, et qu'il donne les infos au second. (d'où le time.sleep(25) , le temps que mon script fasse les vérifications de maj dispo)

Edit: Ah oui j'ai compris, faire un
import notify_progressbar
Oui je veux bien essayer, mais ça a l'air compliqué, les imports sont dans le dossier /usr/lib/python2.7/dist-packages/ (entre autres) et je veux pas trop modifier le système... Enfin s'il existe un moyen d'importer un .py qui est dans le home, pourquoi pas.

Dernière modification par gaara92 (Le 24/02/2014, à 18:15)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#4 Le 26/02/2014, à 10:57

Gaara

Re : [script] Notification de mise à jour automatiques

Ce matin, lors d'une mise à jour de sécurité, la notification n'a pas bougé.
Ce bug vient du log /run/unattended-upgrades.progress, écrit par unattended, qui est resté à 0% ... la barre est donc restée à 0%, et la boucle ne s'est pas terminée.
J'essaie de voir si je peux remédier à cela.


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#5 Le 26/02/2014, à 21:02

tiramiseb

Re : [script] Notification de mise à jour automatiques

Mais pourquoi tu t'appuies sur ce matin unattended truc ? C'est vachement limité de faire ça...

Hors ligne

#6 Le 26/02/2014, à 21:17

Gaara

Re : [script] Notification de mise à jour automatiques

Salut, et merci pour ton avis,
C'est ce paquet qui fait les mises à jour automatiquement, et vu qu'il écrit un log, pourquoi ne pas s'en servir !
Mais j'y suis presque, vu que dans le log il y a le % et le nom du paquet qui s'installe. Donc si le % ne bouge pas, je compare les noms de paquet pour faire avancer la barre.
Pour tout te dire, c'est mon premier script, donc je ne maîtrise pas tout, loin de là. Mais je veux au maximum ne pas installer de nouveau paquet pour le faire tourner, et ne pas bidouiller dans le système, à part l'appel, indispensable si je veux que ma notification se lance au même moment.
Il doit y avoir d'autres moyens c'est certain, mais pas à ma connaissance roll


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#7 Le 26/02/2014, à 21:23

tiramiseb

Re : [script] Notification de mise à jour automatiques

C'est ce paquet qui fait les mises à jour automatiquement

Dans ce cas particulier, oui. Mais c'est dommage de devoir se limiter à ce cas particulier...

Par exemple, pourquoi pas surveiller le contenu de /var/lib/apt/lists avec inotify (paquet python-pyinotify) ? Comme, ça marcherait dans n'importe quelle situation...

Et puis ça permettrait de ne pas modifier un fichier qui fait partie du système (et qui sera écrasé à la prochaine mise à jour du paquet concerné)... donc ne pas du tout "bidouiller le système".

Dernière modification par tiramiseb (Le 26/02/2014, à 21:27)

Hors ligne

#8 Le 26/02/2014, à 21:40

Gaara

Re : [script] Notification de mise à jour automatiques

Oui, mais quand ce n'est pas automatique, que se soit en console (apt-get upgrade) ou via le gestionnaire de paquet, une barre de progression est déjà présente. Ca ne ferait pas double emploi?
C'est justement qu'en le faisant automatiquement, le seul truc "fourni" est une notification par mail, un peu austère à mon goût, et pas très fun.
Pour python-pyinotify, je vais regarder ça de plus près, je ne connaissais pas.


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#9 Le 26/02/2014, à 21:59

tiramiseb

Re : [script] Notification de mise à jour automatiques

Holala attends, j'avais pas tout suivi. Laisse tomber, j'étais parti sur l'idée d'une notification quand il y a des mises à jour de dispo...
Je ferais mieux d'aller me coucher...

Hors ligne

#10 Le 26/02/2014, à 22:08

Gaara

Re : [script] Notification de mise à jour automatiques

Non ça, j'ai déjà !
Il y a en effet dans le script cette vérification, pour ne pas que la boucle ne se lance s'il n'y a pas besoin. Mais mon script est prévu pour indiquer le progress de l'installation !
Edit: j'ai modifié mon premier post pour le préciser, au cas où !

Dernière modification par gaara92 (Le 26/02/2014, à 22:11)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#11 Le 27/02/2014, à 10:57

Gaara

Re : [script] Notification de mise à jour automatiques

Bug corrigé, la nouvelle version 0.7.1 est remplacée dans le post #1.
Si vous essayez, faites moi parvenir les bugs!

Dernière modification par gaara92 (Le 27/02/2014, à 11:25)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#12 Le 27/02/2014, à 13:52

metalux

Re : [script] Notification de mise à jour automatiques

Bonjour gaara92,
Je viens de tester et je n'ai pas réussi à le faire fonctionner. Je n'ai pas pris le temps de regarder d'où ça peut venir, aussi je te donne les erreurs rencontrées si tu as une idée:
La 1ère est un problème d'encodage, pourtant celui-ci est bien déclaré(pour info j'ai remplacé mon $USER par user pour poster, pas d'erreur de ce côté):

 File "/home/user/majauto/auto_upgrade_notify.py", line 26
SyntaxError: Non-ASCII character '\xc3' in file /home/user/majauto/auto_upgrade_notify.py on line 26, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Le second, il ne trouve pas le fichier log:

Traceback (most recent call last):
  File "/home/user/majauto/auto_upgrade_notify.py", line 46, in progress_timeout
    fichierlog = open("/home/user/majauto/log/log_barreV7/progress.log " + datejour , "w")
IOError: [Errno 2] Aucun fichier ou dossier de ce type: '/home/user/majauto/log/log_barreV7/progress.log 27 02 2014'

Unattended-upgrade se déroule jusqu'à la fin malgré cette erreur et la fenêtre de notification reste affichée à l'écran, obligé de quitter la session pour qu'elle n’apparaît plus. Pour info, il n'y avait aucune maj à faire après avoir vérifier le log d'unattended.

Suggestion de simplification:

Je stocke les fichiers de conf de maj_auto dans le dossier caché .savunattended de ton home. Autant utiliser ce même dossier pour ton script, ça sera d'autant plus facile de l'intégrer au mien ultérieurement.
Tu peux ajouter le code suivant pour ne pas à avoir à redéfinir les chemins avec user.

home = os.path.expanduser("~")

et redéfinir les chemins comme sur l'exemple suivant:
xauth_filename = home+"/.Xauthority" à la place de xauth_filename = '/home/guillaume/.Xauthority'

Pour la position de la fenêtre, n'y a-t-il pas moyen de définir un décalage par rapport à un coin de l'écran? Du coup ça permettrait de rendre le script compatible sans changement sur tous les écrans.

Hors ligne

#13 Le 27/02/2014, à 14:21

Gaara

Re : [script] Notification de mise à jour automatiques

Salut metalux,
J'ai corrigé le script, l'erreur était en fait dû au titre. J'ai aussi corrigé une autre erreur, vers la ligne 101. Remplace "t= fichier.read(5)" par "t= fichier.read(4)"
Maintenant je sais que je dois tester le code que je met en ligne roll
Pour tester, il faut éditer en root /run/unattended.progress , et modifier le % à la main. Tu peux aussi ajouter un nom de paquet entre (), à la fin de la ligne. (ne pas oublier d’enregistrer)
Exemple: Progression : 64.0 % (paquet)

Pour essayer je résume:
1) lancer en root le script:

sudo python auto_upgrade_notify.py

2) modifier le % manuellement comme décrit au dessus pour faire bouger la barre

sudo gedit /run/unattended.progress

3) Pour tuer la notification en cas de plantage, au lieu de fermer la session, tu ouvres un autre terminal, et tu tapes:

sudo killall python

4) Pour le log, je pense que c'est un problème de droits: si le script n'est pas lancé en root, il ne peut pas créer le log.

Dernière modification par gaara92 (Le 27/02/2014, à 14:40)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#14 Le 27/02/2014, à 14:38

metalux

Re : [script] Notification de mise à jour automatiques

gaara92 a écrit :

Pour tester, il faut éditer en root /run/unattended.progress , et modifier le % à la main. Tu peux aussi ajouter un nom de paquet entre (), à la fin de la ligne. (ne pas oublier d’enregistrer)

Euh...je n'ai pas de fichier /run/unattended.progress, ai-je loupé quelque chose? hmm

Hors ligne

#15 Le 27/02/2014, à 14:44

Gaara

Re : [script] Notification de mise à jour automatiques

J'ai édité mon message précédent.
Le script auto_upgrade_notify crée le fichier /run/unattended.progress s'il n'est pas créé par unattended. Au reboot de la machine, il sera effacé.


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#16 Le 27/02/2014, à 16:17

Gaara

Re : [script] Notification de mise à jour automatiques

Voilà, j'ai modifié le script pour le Home, le user sera mis automatiquement, merci à toi.
J'ai aussi modifié le chemin, vers ~/.savunattended.
Pour la position de la fenêtre, les options par défaut ne sont pas terrible. On peut mettre centré, en haut à gauche, ou à la position de la souris. (voir ici). Pour la position en haut à gauche, remplacer self.window.move(1561,32) par self.window.set_position(gtk.WIN_POS_NONE)
Quand j'aurais le temps et le courage, je me mettrais à écrire un fichier de configuration. (J'ai commencé mais c'est presque plus difficile que la notif elle-même ! )

Dernière modification par gaara92 (Le 27/02/2014, à 16:23)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#17 Le 01/03/2014, à 10:47

Gaara

Re : [script] Notification de mise à jour automatiques

metalux a écrit :

Tu peux ajouter le code suivant pour ne pas à avoir à redéfinir les chemins avec user.

home = os.path.expanduser("~")

J'ai remplacé la ligne par

user = os.getenv("SUDO_USER")
str(user)
home = ("/home/" + user)

Car sinon le home obtenu était /root/

Dernière modification par gaara92 (Le 02/03/2014, à 10:21)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#18 Le 02/03/2014, à 12:57

metalux

Re : [script] Notification de mise à jour automatiques

Tu peux reposter le code, il y a des erreurs d'indentation en copier/coller.
Il faudrait également adapter la ligne suivante si je ne dis pas de bêtises, et ça c'est pas sûr cool:

os.environ.setdefault('XAUTHORITY', '/home/<user>/.Xauthority')

par

os.environ.setdefault('XAUTHORITY', home + '/.Xauthority')

Hors ligne

#19 Le 02/03/2014, à 17:48

Didier-T

Re : [script] Notification de mise à jour automatiques

Bonjour gaara92,
pour ce qui est de placer la fenêtre en haut à droite, il n'y a malheureusement pas de fonction prédéfinie.
Mais il y a moyen de connaitre la taille de l'écran et donc de déterminer le positionnement de sa fenêtre, a condition de connaitre sa taille (celle de la fenêtre wink ).

voici comment récupérer les informations, j'ai choisi de ne pas les passer à self, mais tu peux faire différemment.

    def __init__(self):
        # Création fenetre principale
        self.window = gtk.Window(gtk.WINDOW_POPUP)
        # Récupération des informations de surface d'affichage
        screen = self.window.get_screen()
        largeur = int(screen.get_width())
        hauteur = int(screen.get_height())
.
.
.

P.S. : si je peux me permettre une petite remarque, tu devrais diviser progress_timeout en petites fonctions (ça en faciliterait la maintenance et la lecture)

Hors ligne

#20 Le 02/03/2014, à 21:09

Gaara

Re : [script] Notification de mise à jour automatiques

@metalux: Je viens de modifier les codes, ça a l'air de marcher chez moi. A voir demain si les lignes que j'ai ajouté pour le /home sont correctes... Mais ne t'inquiète pas, toute idée d'amélioration est bienvenue. A moi de m'adapter !

@ Didier-T: Merci pour ces infos, je me demandais comment remédier à ça, mais je n'avais pas encore approfondi la question. Je pense que ça me servira pour coder le script de configuration, qui en est actuellement qu'à la construction graphique.
Et tu as raison, je vais essayer de diviser les différentes parties, mais je ne maîtrise pas encore l'appel des variables entre les différents def


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#21 Le 02/03/2014, à 21:22

Didier-T

Re : [script] Notification de mise à jour automatiques

re gaara92,
le plus simple est de définir une "class", puis de passer les variables par le "self" entre les différents "def".
Mais il n'y a à mon avis pas de solution universelle, donc a toi de voir ce qui te convient le mieux, le principal étant que tu t'y retrouve wink

Hors ligne

#22 Le 02/03/2014, à 21:33

Gaara

Re : [script] Notification de mise à jour automatiques

Bon, ben je vois ce qui me reste à faire !!  lol
Et entre les class, ça se passe comment ?


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#23 Le 02/03/2014, à 21:37

metalux

Re : [script] Notification de mise à jour automatiques

J'ai toujours le souci du fichier progress.log. Soit j'ai rien compris ce qui n'est pas impossible, soit il y a une erreur. Voici le retour de sudo unattended-upgrade

Traceback (most recent call last):
  File "/home/user/.savunattended/auto_upgrade_notify.py", line 52, in progress_timeout
    fichierlog = open(home + "/.savunattended/log/progress.log " + datejour , "w")
IOError: [Errno 2] Aucun fichier ou dossier de ce type: '/home/user/.savunattended/log/progress.log 02 03 2014'

Dans /usr/bin/unattended-upgrade il manquait import time chez moi.
Edit: Bon ça progresse, ligne 45 corrigée:

os.mkdir(home + '/.savunattended/log/')

Maintenant ça bloque à la ligne 74

 File "/home/user/.savunattended/auto_upgrade_notify.py", line 74, in progress_timeout
    if not 'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade']):
  File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['apt-get', '-s', 'dist-upgrade']' returned non-zero exit status 100

Edit2:corrigé ligne 74

if not 'Inst' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade']):

Il y avait un espace après Inst.
Maintenant, la fenêtre s'affiche bien et se ferme mais le texte Pas de mise à jour disponible, arrêt ne s'affiche pas.

Dernière modification par metalux (Le 02/03/2014, à 21:51)

Hors ligne

#24 Le 02/03/2014, à 21:50

Gaara

Re : [script] Notification de mise à jour automatiques

Ah oui désolé, j'ai ajouté les imports avec les autres, et je ne réfléchis pas quand je copie/colle.
Ajoute, si ce n'est déjà fait:

import time
import subprocess

Pour ta ligne d'erreur, normalement cette ligne créé le fichier log ("w" est la commande pour écrire). Mais là je vois qu'il veut le créer dans /home/user/, ça devrait être dans /home/TON_USER/.
Mais attend, j'ai vu une autre erreur. Les lignes qui précèdent doivent créer le dossier, mais j'ai oublié de modifier ces lignes...
Ca marche avec moi car le dossier est déjà créé...
Je remodifie les codes


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#25 Le 02/03/2014, à 21:53

metalux

Re : [script] Notification de mise à jour automatiques

J'ai édité mon message précédent

Hors ligne