Προς το περιεχόμενο

systemd-notify


mad-proffessor

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Είναι μια απλή κλάσση σε python που έκανα για να με ενημερωνει για το state κάποιων critical services στο desktop.
Χρειάζεται τις βιβλιοθήκες python(3)-dbus,python-notify, pygobject2(Σε fedora 21). Αν δεν υπάρχουν στο package manager της διανομής εγκαθίστανται είτε μέσω του Pypi είτε απο τα sites.
 

#!/usr/bin/python
import dbus
from dbus import SystemBus,Interface
from gi.repository import Notify, GObject
from time import sleep
import threading;



class DbusNotify():
 def __init__(self):
  pass
 def doRun(self):
  threading.Timer(1200, self.doRun).start ();
  bus = SystemBus()
  systemd = bus.get_object('org.freedesktop.systemd1','/org/freedesktop/systemd1')
  manager = Interface(systemd, dbus_interface='org.freedesktop.systemd1.Manager')

  array=["iptables.service","rc-local.service","polkit.service","systemd-logind.service","systemd-udevd.service","rpcgssd.service"]
  try:
     for a in array:
        getUnit = manager.LoadUnit(a)
        proxy = bus.get_object('org.freedesktop.systemd1', getUnit)
        service_properties = Interface(proxy,dbus_interface='org.freedesktop.DBus.Properties')
        state=service_properties.Get('org.freedesktop.systemd1.Unit', 'ActiveState')    
        status= a + " status: %s" % state
        Notify.init("myapp_name")
        n = Notify.Notification.new("systemd", status)
        n.show()
  except Exception as  e:
        print(e)

notif=DbusNotify()
notif.doRun()

το ονομάζετε pynotify.py και το τοποθετούμε στο /usr/local/bin/ με δικαιώματα 755.

Κατόπιν βάζουμε στο /etc/xdg/autostart/ ένα αρχείο pynotify.desktop (με δικαιώματα 644) με το εξής περιεχόμενο:

[Desktop Entry]
Version=1.0
Name=Pynotify System
Exec=/usr/local/bin/pynotify.py
Type=Application
#Terminal=true
Categories=
GenericName=

φυσικά υπάρχει δυνατότητα για βελτίωση ή/και να κάνετε αλλαγές στα services που θέλετε, το χρόνο κ.α

Επεξ/σία από mad-proffessor
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 122
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Nice. Αν θες μόνο φτιάξε λίγο το indentation και προσέθεσε στα imports το "Daemonize".

 

edit

Note: αν σε ενδιαφέρει να είναι πάντα up τα συγκεκριμένα services, ίσως να θες να δεις κάτι σαν το circus ή το supervisord

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

<p>Πιο πολυ για δικη μου ενασχόληση με python,systemd,dbus και notifications το έκανα παρα για τη λειτουργικότητα. Όσο για τα imports είναι αχρείαστα, η main έμεινε απ έξω. Ήταν στα αρχικά "πλάνα" να είναι daemon process αλλά δε χρειάστηκε.</p>

<p>Τελικά η python είναι κορυφή όχι άδικα έχει ένα καρο bindings στο λινουξ κ διδάσκεται κ χρησιμοποείται κατακόρον έξω.</p>

<p>Με το identation τι έγινε δε σου παίζει; Copy paste το έκανα κατευθειαν όπως είναι κ λειτουργει σε μένα</p>

Fixed

Επεξ/σία από mad-proffessor
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

εχω εγκατεστημενα τα python2-notify, python-dbus και python2-dbus και μου λεει:
 

File "./pynotify.py", line 29
getUnit=manager.GetUnitFileState(a);
^
IndentationError: unindent does not match any outer indentation level
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πρεπει να βάλεις όλες τις γραμμες απο το for loop λιγο πιο μέσα δες το αρχικο το ξαναδιορθωσα. Οταν υπάρχει loop for, while,if  ή ορισμος μεθοδου στη python αντι για {} ο interpreter καταλαβαινει τα περιθωρια αμεσως μετα το χαρακτηριστικο σημείο στίξης :  (ανω κ κατω τελεια). Αυτο είναι το indentation που λεει στα exceptions/errors

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βγάλε τα

import daemonize
from daemonize import Daemonize

και όλη τη main

def main(self):
  pid = "/tmp/proxy.pid"
  while True:
   sleep(100)
   daemon = Daemonize(app="proxy", pid=pid, action=self.main)
   daemon.start()

ή αν θες να ασχοληθεις εγκατεστησε το module daemonize μέσω pypi.

Κάθε 20 λεπτα θα τρέχει ένα thread με το κωδικα της doRun και θα σε ενημερώνει για το state των services μεσα στο array(που στη python ονομάζεται list σε αντίθεση με πολλές άλλες γλώσσες). Μπορεις να αλλάξεις το όνομα των υπηρεσιων που θέλεις αλλα και το χρόνο που θα τρέχει το thread(by default ανα 20 λεπτα). Δυστυχως στο dbus api δεν υπήρχε μέθοδος για να βλέπoυμε το status (αν είναι active ή failed)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ωραια εβαλα τα modules daemonize και gi που μου ζηταγε και τωρα λεει:

Traceback (most recent call last):
File "./pynotify.py", line 5, in <module>
from gi.repository import Notify, GObject
File "/usr/lib/python3.4/site-packages/gi/__init__.py", line 39
print url
^
SyntaxError: Missing parentheses in call to 'print'

(μη βαρας, noob here)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κάνε export την PYTHONPATH αλα bash PATH με τα paths απο python2.6 python2.7

βρες τα με find / -type d -name python2.* -print

 

Σε εμένα είναι στο /usr/lib/python2.6/site-packages:/usr/lib64/python2.6/site-packages:/usr/lib/python2.7/site-packages

Μάλλον έβαλες πακετα απο python3* ενω δουλευουμε με python2*

To πακέτο είναι το pygobject2 σε fedora απο package manager(ξέχασα να το γράψω στο αρχικό σορρυ) ψάξε στον pacman python-gobject(s),pygobject κτλ και κάνε uninstall αυτο που έβαλες απο pypi εκος των άλλων έχει συντακτικα λάθη μέσα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

οκ τα καταφερα, τρεχει τωρα thanks!

 

θα γραψω σε λιγο τι θελει για arch

 

--------------------------------------------------

 

Eπρεπε να αλλαξω το

#!/usr/bin/python
σε

#!/usr/bin/python2
βαζω τα πακετα: python2-pip και python2-gobject και μετα:

pip2.7 install daemonize
ωραιο ειναι μπορει να το γραψω σε bash :P

 

Εχω γραψει ενα παρομοιο που ελεγχει το journalctl και βγαζει notification καθε φορα που μπαινοβγαινει κανεις με ssh

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σορρυ εμένα ο python intepreter είναι linked με την έκδοση 2 πρέπει γράψω #!/usr/bin/python3 για να τρέξει τη 3.

Good που τρέχει


Εμενα μου τη δίνει λίγο το ιδιωμα και το συντακτικό της BASH προτιμάω python που ειδικα fedora χρησιμοποιείται παντού και έχει bindings για τα πάντα. Έχω κάνει κ άλλες κλάσσεις μια που ελέγχει ποιος κάνει login κ μια άλλη που  κανει poll το journal αν κάποια υπηρεσία έχει γίνει fail. H τελευταία θέλει αρκετη δουλειά ακόμα.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Είναι αυτό πού είπα κ παραπάνω δε βρήκα στο documentation του systemd-dbus method πού να ελέγχει το status.θα ψάξω στο source code αλλιώς αν δε βρω ίσως γίνεται μέσω dbus properties αλλά αυτό προϋποθέτει αλλαγή στο security policy του dbus για να σε αφήσει που αν κανεις κάτι τέτοιο ανοίγεις κενό ασφαλείας στο pc.

###############

Update:Έγινε μεσω dbus properties κ δε χρειάζεται κάποια αλλαγή στο security policy. Τωρα πλέον ενημερωνόμαστε για το state (active/inactive) μιας υπηρεσίας ή πιο οικεία

το αποτελεσμα της εντολής systemctl status -l blahblah.service

###############

To αρχικό ποστ ενημερώθηκε με τις αλλαγές.

Επεξ/σία από mad-proffessor
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

array(που στη python ονομάζεται list σε αντίθεση με πολλές άλλες γλώσσες)

Για την ιστορία, η python έχει arrays και είναι διαφορετικό datatype από τη list

https://docs.python.org/2/library/array.html

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...