web-dev-qa-db-fra.com

Comment puis-je recevoir une notification à l'aide de Notify-OSD lorsque le chargeur est inséré / retiré?

Comment puis-je obtenir une notification à l'écran à l'aide de notify-osd lorsque je branche/débranche le chargeur?

9
kernel_panic

enter image description hereenter image description here

dbus

Certaines personnes ont signalé que ma précédente solution udev avait envoyé la notification trop souvent lorsque le câble d’alimentation était branché. Je ne pouvais pas reproduire cette copie, mais j’écrivais ce script python pour utiliser dbus au lieu de udev. Enregistrez-le en tant que fichier .py quelque part sur votre disque dur. Marquez le fichier exécutable en lançant:

Sudo chmod +x yourFile.py  

et ajoutez-le à vos applications de démarrage comme décrit ici . Ce script nécessite que le package acpi soit installé.

#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
import subprocess


dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

onMessage="Power plugged in!"
offMessage="Power unplugged!"
onImage="/usr/share/icons/gnome/32x32/devices/ac-adapter.png"
offImage="/usr/share/icons/gnome/32x32/status/battery-full.png"

def callback():
    state = subprocess.check_output(["acpi", "-a"]).split(':')[1].strip()
    if state == "on-line":
        subprocess.call(["notify-send", "-i", onImage, onMessage])
    Elif state == "off-line":
        subprocess.call(["notify-send", "-i", offImage, offMessage])

bus.add_signal_receiver(callback, 'Changed', 'org.freedesktop.UPower.Device', 'org.freedesktop.UPower', '/org/freedesktop/UPower/devices/line_power_AC')

loop = gobject.MainLoop()
loop.run()

udev

Avec un peu d'expérimentation (et un peu d'aide), j'ai pu utiliser une règle dev pour accomplir cela. Certaines personnes ont signalé que la notification était parfois envoyée plusieurs fois, mais je n’ai eu aucun problème. YMMV.

Créez un script avec le contenu suivant:

#!/bin/bash

# Set this to your username
USER="some_user"

if [ "$POWER" == "on" ]
  then
  DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/devices/ac-adapter.png "Power cable plugged in."'
Elif [ "$POWER" == "off" ]
  then
  DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/status/battery-full.png "Power cable unplugged."'
fi

en remplaçant some_user par votre nom d'utilisateur. Marquez le fichier exécutable en lançant:

Sudo chmod +x /path/to/script.sh  

en remplaçant /path/to/script.sh par le chemin où vous avez enregistré le script.

Créez ensuite un fichier dans /etc/udev/rules.d nommé 10-power.rules avec le contenu:

SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="0", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="off"
SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="1", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="on"

en remplaçant à nouveau /path/to/script.sh par le chemin du script que vous avez créé précédemment.

Rechargez maintenant les règles udev en lançant:

Sudo udevadm control --reload-rules                              

Débranchez le câble d'alimentation. Vous devriez recevoir une notification.

6
Seth

La commutation entre l'alimentation secteur et la batterie doit générer un événement sur le bus système D-Bus . Exécutez _dbus-monitor --system_ et observez les événements générés sur votre système.

Si power est en cours d'exécution, vous recevez des notifications plus spécialisées de upower -m .

_#!/bin/sh
upower -m |
while read -r _time _2 _3 device; do
  [ "$device" = "/org/freedesktop/UPower/devices/line_power_AC" ] || continue
  notify-send "$(acpi -a)"
done
_

Vous pouvez également obtenir des événements de acpi_listen .

_#!/bin/sh
acpi_listen |
while read -r what junk; do
  [ "$what" = "ac_adapter" ] || continue
  notify-send "$(acpi -a)"
done
_

Exécutez ce script lorsque vous souhaitez commencer à voir les notifications ou ajoutez-le au démarrage de votre session.

6
Gilles

Source du script

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: March 11, 2016
# Purpose: Script to detect connection/disconnection
#          of the ac adapter
#          
# 
# Written for: http://askubuntu.com/q/542986/295286
# Tested on: Ubuntu 14.04 LTS
# Version: 0.2
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.
#set -x
ARGV0="$0"
ARGC=$#

test_presence()
{
  on_ac_power
  echo $?
}

notify_change()
{
   pgrep -f '/usr/bin/X' > /dev/null && GUI=true
   connected='AC adapter connected'
   disconnected='AC adapter disconnected'

   if [ $1 -eq 0 ]
   then
           wall <<< $connected        
           $GUI && DISPLAY=:0 notify-send 'AC adapter connected'

   else
           wall <<< $connected
           $GUI && DISPLAY=:0 notify-send 'AC adapter disconnected'
   fi
}

main()
{
  FLAG=$(test_presence)

  while true
  do
     STATUS=$(test_presence)

     if [ $STATUS -eq $FLAG   ]
     then
        continue
     else
        notify_change $STATUS
        FLAG=$STATUS
     fi

  sleep 3 #0.25
  done
}  

main 

Obtenir le script

Le script est également ajouté à mon github ; cette version sera mise à jour et développée un peu plus.

Vous pouvez l'obtenir en procédant comme suit:

  1. sugo apt-get install git
  2. cd /opt

  3. git clone https://github.com/SergKolo/sergrep.git

Le script sera dans le répertoire /opt/sergrep, nommé notify_ac_change.sh

Concept/Design

Les questions clés sont "Comment vérifier la présence de l'adaptateur secteur?" et "Comment détecter des modifications?"

Eh bien, ce problème a été résolu il y a longtemps par d'autres développeurs. Ubuntu est livré par défaut avec un script appelé on_ac_power , qui est stocké dans /usr/bin/on_ac_power. L’adaptateur secteur peut être mentionné sous différents sous-systèmes du noyau (ACPI ou APM), mais ce script simplifie notre travail. Les auteurs ont couvert de nombreuses variantes possibles. Il renvoie uniquement le statut de sortie, il est donc approprié de l'utiliser dans les instructions if.

Pourquoi on_ac_power est-il un bon choix? Parce qu'il repose sur la vérification de plusieurs sous-systèmes. Il fournit également une commande assez simple pour travailler - le résultat est vrai ou faux.

Nous avons donc un outil de détection de présence, mais qu'en est-il de la logique? Nous devons interroger la présence et détecter les changements dans l'état. Ce que nous pouvons faire est de stocker l’état de sortie de on_ac_power et de comparer en permanence l’état actuel à ce que nous avons enregistré, une fois que celui-ci a été modifié - envoyez une notification, enregistrez à nouveau l’état et continuez à comparer, en boucle. L'idée de base est l'utilisation de drapeaux.

En bref, nous initialisons un instantané de l'état, puis nous recherchons en permanence les modifications apportées à l'instantané. une fois que le changement a eu lieu - notifiez et réinitialisez l'instantané.

2