mad-proffessor Δημοσ. 8 Φεβρουαρίου 2015 Share Δημοσ. 8 Φεβρουαρίου 2015 (επεξεργασμένο) Είναι μια απλή κλάσση σε 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 που θέλετε, το χρόνο κ.α Επεξ/σία 13 Φεβρουαρίου 2015 από mad-proffessor 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
pmav99 Δημοσ. 8 Φεβρουαρίου 2015 Share Δημοσ. 8 Φεβρουαρίου 2015 Nice. Αν θες μόνο φτιάξε λίγο το indentation και προσέθεσε στα imports το "Daemonize". edit Note: αν σε ενδιαφέρει να είναι πάντα up τα συγκεκριμένα services, ίσως να θες να δεις κάτι σαν το circus ή το supervisord Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 8 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 8 Φεβρουαρίου 2015 (επεξεργασμένο) <p>Πιο πολυ για δικη μου ενασχόληση με python,systemd,dbus και notifications το έκανα παρα για τη λειτουργικότητα. Όσο για τα imports είναι αχρείαστα, η main έμεινε απ έξω. Ήταν στα αρχικά "πλάνα" να είναι daemon process αλλά δε χρειάστηκε.</p> <p>Τελικά η python είναι κορυφή όχι άδικα έχει ένα καρο bindings στο λινουξ κ διδάσκεται κ χρησιμοποείται κατακόρον έξω.</p> <p>Με το identation τι έγινε δε σου παίζει; Copy paste το έκανα κατευθειαν όπως είναι κ λειτουργει σε μένα</p> Fixed Επεξ/σία 9 Φεβρουαρίου 2015 από mad-proffessor Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 12 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 12 Φεβρουαρίου 2015 Τι έγινε δε παίζει σε κανέναν ή είναι αχρείαστο; Κανεις να το έτρεξε σε kde; Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tritonas00 Δημοσ. 12 Φεβρουαρίου 2015 Share Δημοσ. 12 Φεβρουαρίου 2015 εχω εγκατεστημενα τα python2-notify, python-dbus και python2-dbus και μου λεει: File "./pynotify.py", line 29 getUnit=manager.GetUnitFileState(a); ^ IndentationError: unindent does not match any outer indentation level Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 12 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 12 Φεβρουαρίου 2015 Πρεπει να βάλεις όλες τις γραμμες απο το for loop λιγο πιο μέσα δες το αρχικο το ξαναδιορθωσα. Οταν υπάρχει loop for, while,if ή ορισμος μεθοδου στη python αντι για {} ο interpreter καταλαβαινει τα περιθωρια αμεσως μετα το χαρακτηριστικο σημείο στίξης : (ανω κ κατω τελεια). Αυτο είναι το indentation που λεει στα exceptions/errors Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tritonas00 Δημοσ. 12 Φεβρουαρίου 2015 Share Δημοσ. 12 Φεβρουαρίου 2015 ok, τωρα λεει: Traceback (most recent call last): File "./pynotify.py", line 3, in <module> import daemonize ImportError: No module named 'daemonize' Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 12 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 12 Φεβρουαρίου 2015 Βγάλε τα 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) Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tritonas00 Δημοσ. 12 Φεβρουαρίου 2015 Share Δημοσ. 12 Φεβρουαρίου 2015 ωραια εβαλα τα 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) Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 12 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 12 Φεβρουαρίου 2015 Κάνε 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 εκος των άλλων έχει συντακτικα λάθη μέσα. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tritonas00 Δημοσ. 12 Φεβρουαρίου 2015 Share Δημοσ. 12 Φεβρουαρίου 2015 οκ τα καταφερα, τρεχει τωρα thanks! θα γραψω σε λιγο τι θελει για arch -------------------------------------------------- Eπρεπε να αλλαξω το #!/usr/bin/pythonσε #!/usr/bin/python2 βαζω τα πακετα: python2-pip και python2-gobject και μετα: pip2.7 install daemonizeωραιο ειναι μπορει να το γραψω σε bash Εχω γραψει ενα παρομοιο που ελεγχει το journalctl και βγαζει notification καθε φορα που μπαινοβγαινει κανεις με ssh 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 12 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 12 Φεβρουαρίου 2015 Σορρυ εμένα ο python intepreter είναι linked με την έκδοση 2 πρέπει γράψω #!/usr/bin/python3 για να τρέξει τη 3. Good που τρέχει Εμενα μου τη δίνει λίγο το ιδιωμα και το συντακτικό της BASH προτιμάω python που ειδικα fedora χρησιμοποιείται παντού και έχει bindings για τα πάντα. Έχω κάνει κ άλλες κλάσσεις μια που ελέγχει ποιος κάνει login κ μια άλλη που κανει poll το journal αν κάποια υπηρεσία έχει γίνει fail. H τελευταία θέλει αρκετη δουλειά ακόμα. 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
tritonas00 Δημοσ. 12 Φεβρουαρίου 2015 Share Δημοσ. 12 Φεβρουαρίου 2015 Να σου πω, αντι για static δεν θα επρεπε να λεει active ή running ξερω γω? Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
mad-proffessor Δημοσ. 12 Φεβρουαρίου 2015 Μέλος Share Δημοσ. 12 Φεβρουαρίου 2015 (επεξεργασμένο) Είναι αυτό πού είπα κ παραπάνω δε βρήκα στο 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 αρχικό ποστ ενημερώθηκε με τις αλλαγές. Επεξ/σία 13 Φεβρουαρίου 2015 από mad-proffessor 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
pmav99 Δημοσ. 15 Φεβρουαρίου 2015 Share Δημοσ. 15 Φεβρουαρίου 2015 array(που στη python ονομάζεται list σε αντίθεση με πολλές άλλες γλώσσες) Για την ιστορία, η python έχει arrays και είναι διαφορετικό datatype από τη list https://docs.python.org/2/library/array.html Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα