[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Fora de tópico] Executando um aplicativo de acordo com o estado de uma variavél do sistema!



Em 17-01-2011 14:10, Fagner Patricio escreveu:
Olá pessoal!!
Vejam se vocês podem me ajudar, eu fiz um script em Python para verificar o estado da variável "/proc/acpi/ac_adapter/AC/state" ela indica quando o cabo de energia de um notebook está ligado ou com energia, seus valores possíveis são "on-line" quando está plugado ou com energia e "off-line" quando não está plugado ou sem energia, o script terá que executar algumas ações apenas quando valor dessa varível mudar de um estado para outro, alguém sabe se o Linux tem algum sistema próprio para ficar fazendo essa checagem e assim chamar meu script?

Olá!

        Em sistema modernos de Linux, usa-se o DBus. Para usá-lo com Python leia a documentação em [1] e sobre energia leia em [2].

[1] http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html
[2] http://upower.freedesktop.org/docs/ref-dbus.html

        Veja um programa em Python (trocar "...." por "    ") bem simples para capturar todos os eventos do sistema via DBus, imprimir na tela e sair se for pressionado o botão de "power":

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

def sinal_recebido(*args):
....print args
....# Se precissionar o botão de power sai do loop
....if args == (dbus.String(u'ButtonPressed'), dbus.String(u'power')):
........loop.quit()

DBusGMainLoop(set_as_default=True)
system_bus = dbus.SystemBus()
system_bus.add_signal_receiver(sinal_recebido)

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


        Este outro aqui lista os dispositivos de energia e detecta a alteração no dispositivo de linha de energia:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

def detalhes_energia():
....power_interface = ('org.freedesktop.UPower', '/org/freedesktop/UPower')
....power_object = system_bus.get_object(*power_interface)
....power_devices = power_object.EnumerateDevices(dbus_interface = power_interface[0])
....print "Interfaces de energia:"
....for power_device in power_devices:
........print "|-->", power_device
........obj = system_bus.get_object(power_interface[0], power_device)
........props = obj.GetAll(power_interface[0] + '.Device', dbus_interface = 'org.freedesktop.DBus.Properties')
........for prop in props:
............if prop == "Type":
................print "|     |-->", prop, ":", props[prop], ('Unknown', 'Line Power', 'Battery', 'Ups', 'Monitor', 'Mouse', 'Keyboard', 'Pda', 'Phone')[props[prop]]
............elif prop == "State":
................print "|     |-->", prop, ":", props[prop], ('Unknown', 'Charging', 'Discharging', 'Empty', 'Fully charged', 'Pending charge', 'Pending discharge')[props[prop]]
............else:
................print "|     |-->", prop, ":", props[prop]

def sinal_recebido(*args):
....obj = system_bus.get_object('org.freedesktop.UPower', '/org/freedesktop/UPower/devices/line_power_ACAD')
...._on_line_ = obj.Get('org.freedesktop.UPower.Device', 'Online', dbus_interface = 'org.freedesktop.DBus.Properties')
....print datetime.datetime.now(), ('Desenergizado!', 'Energizado!')[on_line]

DBusGMainLoop(set_as_default=True)
system_bus = dbus.SystemBus()

detalhes_energia()

# Filtro somente para chamar a função quando houver alteração nesse dispositivo
system_bus.add_signal_receiver(sinal_recebido,                   # função a ser chamada quando o sinal for emitido
..............................."Changed",                        # sinal emitido
...............................'org.freedesktop.UPower.Device',  # interface final
...............................'org.freedesktop.UPower',         # interface primária
...............................'/org/freedesktop/UPower/devices/line_power_ACAD') # caminho do dispositivo no dbus

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



[]'s
           Junior Polegato


Reply to: