#! /usr/bin/python
import glib
import re
import subprocess
import requests
import bs4
import datetime
import sys
import os
import time
from selenium import webdriver
from pyudev import Context, Monitor
from selenium.common.exceptions import NoSuchElementException
def demote():
def result():
os.setgid(100)
os.setuid(1000)
return result
def inotify(title, message):
subprocess.call('notify-send', '{}
'.format(title), '{0}
'.format(message)], preexec_fn=demote())
#os.system('notify-send ' + title + ' ' + message)
def get_network_data(tout):
"""Scrapes balance data from ISP website."""
if tout is not None:
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get('http://mydata.myisp.co.ke')
try:
acc = driver.find_element_by_id('account')
tbody = acc.find_element_by_tag_name('tbody')
match_obj = re.findall(r'(\w\s]+)\:\s(\d\s\.\-]+\w]{0,3})\s
](\w\s]+)\:\s(\d\s\.\-]+\w]{0,3})\s
]', tbody.text)
if match_obj is not None:
data = {}
for item in match_obj:
data.update(dict(zip(*[iter(item)]*2)))
expiry_date = datetime.datetime.strptime(data'Expire Date'], '%Y-%m-%d')
remaining = expiry_date - datetime.datetime.now()
bundle_balance = 'Bundle balance: {0} - {1} day(s) remaining'.format(data'Bundle Balance'], remaining.days)
airtime_balance = 'Airtime balance: %s' % data'Current Airtime Balance']
time_now = datetime.datetime.now().strftime('%H:%-M %Y/%m/%d')
print('Sending nofitication...')
imon = open('/home/Giantas/bin/monitori.txt', 'a+')
imon.write(time_now + '
' + bundle_balance + '
' + airtime_balance + '
')
imon.close()
full_msg = '{0}
{1}'.format(bundle_balance.capitalize(), airtime_balance.capitalize())
inotify('Orange Balance', full_msg)
#subprocess.call('notify-send', 'Orange Balance', '
{0}
{1}'.format(bundle_balance.capitalize(), airtime_balance.capitalize())], preexec_fn=demote())
else:
print('Could not retrieve data from page...')
full_msg = '{0}'.format('Error: Could not retrieve data from page.')
inotify('Orange Balance', full_msg)
#subprocess.call('notify-send', 'Orange Balance', '
{0}'.format('Error: Could not retrieve data from page.')], preexec_fn=demote())
except NoSuchElementException:
print('Could not locate element...')
full_msg = '{0}'.format('Error: Could not locate element - acc.')
inotify('Orange Balance', full_msg)
#subprocess.call('notify-send', 'iMonitor:get_network_data', '
{0}'.format('Error: Could not locate element - acc.')], preexec_fn=demote())
else:
print('Could not find USB device...')
full_msg = '
{0}'.format('Error: Could not find USB device.')
inotify('Orange Balance', full_msg)
#subprocess.call('notify-send', 'iMonitor', '
{0}'.format('Error: Could not find USB device.')], preexec_fn=demote())
def identify_phone(observer, device):
"""Identifies if specific USB device (phone) is connected (tethered)."""
global last_updated, initial_search, msg_count
current_time = datetime.datetime.now()
time_diff = current_time - last_updated
if (time_diff.seconds > 300) or initial_search:
try:
time.sleep(0.25)
tout = subprocess.check_output("lsusb | grep 1234:5678", shell=True)
except subprocess.CalledProcessError:
tout = None
last_updated = datetime.datetime.now()
initial_search = False
get_network_data(tout)
if time_diff.seconds > 10:
msg_count = 1
if not initial_search and msg_count == 1:
wait_time = datetime.datetime.fromtimestamp(600 - time_diff.seconds)
message = wait_time.strftime('You may have to wait %-M minute(s), %-S second(s) before another check is done.')
print('Could not retrieve data from page...')
full_msg = '
{0}'.format(message)
inotify('Orange Balance', full_msg)
#subprocess.call('notify-send', 'iMonitor:Identify Phone', '
{0}'.format(message)], preexec_fn=demote())
msg_count += 1
try:
initial_search = True
last_updated = datetime.datetime.now()
msg_count = 1
try:
from pyudev.glib import MonitorObserver
except ImportError:
from pyudev.glib import GUDevMonitorObserver as MonitorObserver
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
observer = MonitorObserver(monitor)
observer.connect('device-added', identify_phone)
monitor.start()
glib.MainLoop().run()
except KeyboardInterrupt:
print('
Shutdown requested.
Exiting gracefully...')
sys.exit(0)
I have the above script. I would like it to run on boot such that when I tether my phone to my PC I get a desktop notification. I have created a service in /*etc/systemd/system/ named *imon.service with the following configuration
[Unit]
Description=ImonService
[Service]
ExecStart=/path/to/imonitor.py
[Install]
WantedBy=multi-user.target
**
**
However, since the script runs as root, I am having a hard time getting it to display a desktop notification to a user logged in via GUI.
Any help would be appreciated.
Other relevant data:
KDE Plasma Version: 5.5.5
OpenSUSE Leap 42.1**