Initial commit
This commit is contained in:
commit
28c0a0d2d6
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
*~
|
||||||
|
*kdev4
|
||||||
|
__pycache__
|
11
LICENSE
Normal file
11
LICENSE
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Copyright (c) 2016 Juraj Oravec
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||||||
|
|
||||||
|
Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||||||
|
|
||||||
|
This notice may not be removed or altered from any source distribution.
|
51
StatusUi.py
Normal file
51
StatusUi.py
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
import rtc
|
||||||
|
|
||||||
|
class StatusDevice():
|
||||||
|
device = ""
|
||||||
|
|
||||||
|
def __init__(self, page, device):
|
||||||
|
self.device = device
|
||||||
|
|
||||||
|
self.vBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
|
||||||
|
self.vBox.set_border_width(10)
|
||||||
|
|
||||||
|
self.line1 = line("Device:", self.device.name)
|
||||||
|
self.line2 = line("Status:", "Off")
|
||||||
|
self.line3 = line("Wake up time:", "Now")
|
||||||
|
|
||||||
|
page.pack_start(self.line1.box, True, True, 0)
|
||||||
|
page.pack_start(self.line2.box, True, True, 0)
|
||||||
|
page.pack_start(self.line3.box, True, True, 0)
|
||||||
|
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
page.pack_start(self.vBox, True, True, 0)
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
self.line1.value.set_text(self.device.name)
|
||||||
|
|
||||||
|
active = "Off"
|
||||||
|
if self.device.devStatus["active"]:
|
||||||
|
active = "On"
|
||||||
|
self.line2.value.set_text(active)
|
||||||
|
|
||||||
|
if self.device.devStatus["active"]:
|
||||||
|
if not self.line3.box.get_visible():
|
||||||
|
self.line3.box.show()
|
||||||
|
|
||||||
|
self.line3.value.set_text(str(self.device.devStatus["date"]))
|
||||||
|
elif self.line3.box.get_visible():
|
||||||
|
self.line3.box.hide()
|
||||||
|
|
||||||
|
class line():
|
||||||
|
def __init__(self, name, value):
|
||||||
|
self.box = Gtk.Box(spacing=10)
|
||||||
|
self.label = Gtk.Label(name, halign=Gtk.Align.START)
|
||||||
|
self.value = Gtk.Label(value, halign=Gtk.Align.END)
|
||||||
|
|
||||||
|
self.box.pack_start(self.label, True, True, 0)
|
||||||
|
self.box.pack_start(self.value, True, True, 0)
|
98
rtc.py
Normal file
98
rtc.py
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
from contextlib import contextmanager
|
||||||
|
from datetime import datetime
|
||||||
|
import locale
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shlex
|
||||||
|
import threading
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
|
||||||
|
LOCALE_LOCK = threading.Lock()
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def setlocale(name):
|
||||||
|
with LOCALE_LOCK:
|
||||||
|
saved = locale.setlocale(locale.LC_ALL)
|
||||||
|
try:
|
||||||
|
yield locale.setlocale(locale.LC_ALL, name)
|
||||||
|
finally:
|
||||||
|
locale.setlocale(locale.LC_ALL, saved)
|
||||||
|
|
||||||
|
|
||||||
|
class RtcDevice():
|
||||||
|
name = ""
|
||||||
|
devStatus = {
|
||||||
|
"active": False,
|
||||||
|
"date": 0
|
||||||
|
}
|
||||||
|
modes = []
|
||||||
|
utc = False
|
||||||
|
|
||||||
|
def __init__(self, name = ""):
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
self.modes()
|
||||||
|
self.status()
|
||||||
|
|
||||||
|
def modes(self):
|
||||||
|
cmd = "rtcwake --list-modes -d " + self.name
|
||||||
|
process = Popen(shlex.split(cmd), stdout=PIPE)
|
||||||
|
(output, err) = process.communicate()
|
||||||
|
exit_code = process.wait()
|
||||||
|
|
||||||
|
self.modes = shlex.split(str(output))
|
||||||
|
|
||||||
|
def status(self):
|
||||||
|
cmd = "rtcwake -m show -d " + self.name
|
||||||
|
process = Popen(shlex.split(cmd), stdout=PIPE)
|
||||||
|
(output, err) = process.communicate()
|
||||||
|
exit_code = process.wait()
|
||||||
|
|
||||||
|
self.formatStatus(str(output))
|
||||||
|
|
||||||
|
def formatStatus(self, message):
|
||||||
|
re1='.*?' # Non-greedy match on filler
|
||||||
|
re2='(?:[a-z][a-z]+)' # Uninteresting: word
|
||||||
|
re3='.*?' # Non-greedy match on filler
|
||||||
|
re4='((?:[a-z][a-z]+))' # Word 1
|
||||||
|
re5='.*?' # Non-greedy match on filler
|
||||||
|
re6='((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Sept|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))' # Month 1
|
||||||
|
re7='.*?' # Non-greedy match on filler
|
||||||
|
re8='((?:(?:[0-2]?\\d{1})|(?:[3][01]{1})))(?![\\d])' # Day 1
|
||||||
|
re9='.*?' # Non-greedy match on filler
|
||||||
|
re10='((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\\s?(?:am|AM|pm|PM))?)' # HourMinuteSec 1
|
||||||
|
re11='.*?' # Non-greedy match on filler
|
||||||
|
re12='((?:(?:[1]{1}\\d{1}\\d{1}\\d{1})|(?:[2]{1}\\d{3})))(?![\\d])' # Year 1
|
||||||
|
|
||||||
|
rg = re.compile(re1+re2+re3+re4,re.IGNORECASE|re.DOTALL)
|
||||||
|
m = rg.search(message)
|
||||||
|
if m:
|
||||||
|
active = m.group(1)
|
||||||
|
if active == "on":
|
||||||
|
self.devStatus["active"] = True
|
||||||
|
else:
|
||||||
|
self.devStatus["active"] = False
|
||||||
|
|
||||||
|
if self.devStatus["active"]:
|
||||||
|
rgx = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10+re11+re12,re.IGNORECASE|re.DOTALL)
|
||||||
|
mx = rgx.search(message)
|
||||||
|
if mx:
|
||||||
|
month = mx.group(2)
|
||||||
|
day = mx.group(3)
|
||||||
|
if len(day) == 1:
|
||||||
|
day = "0" + day
|
||||||
|
time = mx.group(4)
|
||||||
|
year = mx.group(5)
|
||||||
|
with setlocale('C'):
|
||||||
|
self.devStatus["date"] = datetime.strptime(year + " " + month + " " + day + " " + time, "%Y %b %d %H:%M:%S")
|
||||||
|
|
||||||
|
def getDevices():
|
||||||
|
mainDir = "/sys/class/rtc"
|
||||||
|
if os.path.isdir(mainDir):
|
||||||
|
devices = [ name for name in os.listdir(mainDir) if os.path.isdir(os.path.join(mainDir, name)) ]
|
||||||
|
|
||||||
|
if len(devices) > 0:
|
||||||
|
return devices
|
||||||
|
|
||||||
|
return False
|
71
rtcwake_gui.py
Normal file
71
rtcwake_gui.py
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#!/usr/bit/python
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
import rtc
|
||||||
|
import StatusUi
|
||||||
|
|
||||||
|
def readFile(path):
|
||||||
|
file = open(path)
|
||||||
|
value = file.read()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
return value.rstrip()
|
||||||
|
|
||||||
|
class MyWindow(Gtk.Window):
|
||||||
|
devices = {}
|
||||||
|
statusBoxes = {}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.initRTC()
|
||||||
|
self.initUI()
|
||||||
|
|
||||||
|
def initRTC(self):
|
||||||
|
for device in rtc.getDevices():
|
||||||
|
self.devices[device] = rtc.RtcDevice(name=device)
|
||||||
|
|
||||||
|
def initUI(self):
|
||||||
|
Gtk.Window.__init__(self, title="RTCwake GUI")
|
||||||
|
self.set_border_width(3)
|
||||||
|
|
||||||
|
self.notebook = Gtk.Notebook()
|
||||||
|
self.add(self.notebook)
|
||||||
|
|
||||||
|
self.pageStatus = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
|
||||||
|
self.pageStatus.set_border_width(10)
|
||||||
|
|
||||||
|
for name, device in self.devices.items():
|
||||||
|
self.statusBoxes[name] = StatusUi.StatusDevice(self.pageStatus, device)
|
||||||
|
|
||||||
|
buttonRefresh = Gtk.Button.new_with_label("Refresh")
|
||||||
|
buttonRefresh.connect("clicked", self.buttonRefresh_on_click)
|
||||||
|
|
||||||
|
self.pageStatus.pack_start(buttonRefresh, False, True, 0)
|
||||||
|
|
||||||
|
self.notebook.append_page(self.pageStatus, Gtk.Label('Status'))
|
||||||
|
|
||||||
|
|
||||||
|
self.pageAbout = Gtk.Box()
|
||||||
|
self.pageAbout.set_border_width(10)
|
||||||
|
self.pageAbout.pack_start(Gtk.Label('Simple GUI for rtcwake.'), True, True, 0)
|
||||||
|
|
||||||
|
self.notebook.append_page(self.pageAbout, Gtk.Label('About'))
|
||||||
|
|
||||||
|
def initShow(self):
|
||||||
|
self.show_all()
|
||||||
|
|
||||||
|
for name, device in self.devices.items():
|
||||||
|
if not self.devices[name].devStatus["active"]:
|
||||||
|
self.statusBoxes[name].line3.box.hide()
|
||||||
|
|
||||||
|
def buttonRefresh_on_click(self, button):
|
||||||
|
for name, device in self.devices.items():
|
||||||
|
device.status()
|
||||||
|
self.statusBoxes[name].update()
|
||||||
|
|
||||||
|
win = MyWindow()
|
||||||
|
win.connect("delete-event", Gtk.main_quit)
|
||||||
|
win.initShow()
|
||||||
|
Gtk.main()
|
Loading…
Reference in New Issue
Block a user