0

I have the following script:

#! /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', '{}\n'.format(title), '{0}\n'.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:
        try:
        # Do some scraping
            if data_found:
                full_msg = '{0}\n{1}'.format(my_balance.capitalize(), airtime_balance.capitalize())
                inotify('My Balance', full_msg)
                #subprocess.call(['notify-send', 'My Balance', '\n{0}\n{1}'.format(my_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('My Balance', full_msg)
                #subprocess.call(['notify-send', 'My Balance', '\n{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('My Balance', full_msg)
            #subprocess.call(['notify-send', 'iMonitor:get_network_data', '\n{0}'.format('Error: Could not locate element - acc.')], preexec_fn=demote())

    else:
        print('Could not find USB device...')
        full_msg = '\n{0}'.format('Error: Could not find USB device.')
        inotify('My Balance', full_msg)
        #subprocess.call(['notify-send', 'iMonitor', '\n{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 = '\n{0}'.format(message)
        inotify('My Balance', full_msg)
        #subprocess.call(['notify-send', 'iMonitor:Identify Phone', '\n{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('\nShutdown requested.\nExiting gracefully...')
    sys.exit(0)

I would like it to run overy boot, thus, I have created a service at /etc/systemd/system which does the calling of the script. However, as the script is meant to display a desktop notification, I haven't managed to make this work since it runs as root; that is despite the fact that I have changed the guid and uid. Any help would be appreciated.

KDE Plasma Version 5.5.5

1
  • every boot or every login? if you need to run every login, You can use put your script into ~/.bashrc and for each boot, you can use rc.local Commented Mar 19, 2017 at 19:10

1 Answer 1

0

Create .xinitrc file under our home directory (if it doesn't exist). Then add this:

bash <absolute/path/to/your/script.py> &

This would make your script start when your X server starts (when your desktop environment starts).

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .