Repository URL to install this package:
# coders by Vlamo 2012
# mod.zombi
# LN - add getPathInfo
from Components.Converter.Converter import Converter
from Components.config import config
from Components.Element import cached
from Components.Converter.Poll import Poll
from os import popen, statvfs, path
SIZE_UNITS = ["B", "KB", "MB", "GB", "TB", "PB", "EB"]
class ExtDiskSpaceInfo(Poll, Converter):
LOADAVG = 0
MEMINFO = 1
MEMFREE = 2
USBINFO = 3
HDDINFO = 4
FLASHINFO = 5
SDCARDINFO = 6
DATAINFO = 7
MOVIEDIR = 8
CPUTEMP = 9
BAINFO = 10
def __init__(self, type): # @ReservedAssignment
Converter.__init__(self, type)
Poll.__init__(self)
type = type.split(',') # @ReservedAssignment
self.shortFormat = "Short" in type
self.fullFormat = "Full" in type
if "LoadAvg" in type:
self.type = self.LOADAVG
elif "CpuTemp" in type:
self.type = self.CPUTEMP
elif "MemInfo" in type:
self.type = self.MEMINFO
elif "MemFree" in type:
self.type = self.MEMFREE
elif "UsbInfo" in type:
self.type = self.USBINFO
elif "HddInfo" in type:
self.type = self.HDDINFO
elif "SdcardInfo" in type:
self.type = self.SDCARDINFO
elif "DataInfo" in type:
self.type = self.DATAINFO
elif "BAInfo" in type:
self.type = self.BAINFO
elif "MovieDir" in type:
self.type = self.MOVIEDIR
else:
self.type = self.FLASHINFO
if self.type in (self.FLASHINFO, self.DATAINFO, self.SDCARDINFO, self.HDDINFO, self.USBINFO, self.BAINFO):
self.poll_interval = 5000
else:
self.poll_interval = 1000
self.poll_enabled = True
def doSuspend(self, suspended):
if suspended:
self.poll_enabled = False
else:
self.downstream_elements.changed((self.CHANGED_POLL,))
self.poll_enabled = True
@cached
def getText(self):
text = "N/A"
if self.type == self.LOADAVG:
text = self.getLoadAvg()
elif self.type == self.CPUTEMP:
text = self.getCpuTemp()
else:
entry = {
self.MEMINFO: ("Mem","Ram"),
self.MEMFREE: ("Mem","Ram"),
self.USBINFO: ("/media/usb", "USB"),
self.HDDINFO: ("/media/hdd", "HDD"),
self.FLASHINFO: ("/", "Flash"),
self.DATAINFO: ("/data", "Data"),
self.SDCARDINFO: ("/media/sdcard", "SDCARD"),
self.BAINFO: ("/media/ba", "BA (Multiboot) "),
self.MOVIEDIR: (config.movielist.last_videodir.value, ""),
}[self.type]
if self.type in (self.USBINFO, self.HDDINFO, self.FLASHINFO, self.DATAINFO, self.SDCARDINFO, self.BAINFO):
list = self.getDiskInfo(entry[0]) # @ReservedAssignment
elif self.type == self.MOVIEDIR:
list = self.getPathInfo() # @ReservedAssignment
else:
list = self.getMemInfo(entry[0]) # @ReservedAssignment
if list[0] == 0:
if config.osd.language.value == "de_DE":
text = "%s nicht gemountet" % (entry[1])
else:
text = "%s not Available" % (entry[1])
elif self.shortFormat:
if config.osd.language.value == "de_DE":
text = "%sGesamt: %s Belegt: %s%%" % (entry[1], self.getSizeStr(list[0]), list[3])
else:
text = "%sTotal: %s Used: %s%%" % (entry[1], self.getSizeStr(list[0]), list[3])
elif self.fullFormat:
if config.osd.language.value == "de_DE":
text = "%sGesamt: %s Frei: %s Belegt: %s (%s%%)" % (entry[1], self.getSizeStr(list[0]), self.getSizeStr(list[2]), self.getSizeStr(list[1]), list[3])
else:
text = "%sTotal: %s Free: %s Available: %s (%s%%)" % (entry[1], self.getSizeStr(list[0]), self.getSizeStr(list[2]), self.getSizeStr(list[1]), list[3])
else:
if config.osd.language.value == "de_DE":
text = "%sGesamt: %s Belegt: %s Frei: %s" % (entry[1], self.getSizeStr(list[0]), self.getSizeStr(list[1]), self.getSizeStr(list[2]))
else:
text = "%sTotal: %s Used: %s Available: %s" % (entry[1], self.getSizeStr(list[0]), self.getSizeStr(list[1]), self.getSizeStr(list[2]))
return text
@cached
def getValue(self):
result = 0
if self.type in (self.MEMINFO,self.MEMFREE):
entry = {self.MEMINFO: "Mem", self.MEMFREE: "Mem"}[self.type]
result = self.getMemInfo(entry)[3]
elif self.type in (self.USBINFO, self.HDDINFO, self.FLASHINFO, self.DATAINFO, self.SDCARDINFO, self.BAINFO):
path = {self.USBINFO: "/media/usb", self.HDDINFO: "/media/hdd", self.FLASHINFO: "/", self.DATAINFO: "/data", self.SDCARDINFO: "/media/sdcard", self.BAINFO: "/media/ba"}[self.type]
result = self.getDiskInfo(path)[3]
elif self.type == self.MOVIEDIR:
result = self.getPathInfo()[3]
return result
text = property(getText)
value = property(getValue)
range = 100
def getLoadAvg(self):
textvalue = "No info"
info = "0"
try:
out_line = popen("cat /proc/loadavg").readline()
info = "load average: " + out_line[:15] + ' (1,5,15min)'
textvalue = info
except:
pass
return textvalue
def getCpuTemp(self):
textvalue = "No info"
info = "0"
try:
out_line = popen("cat /sys/class/thermal/thermal_zone0/temp").readline()
info = "CPU-Temp: " + out_line[:2] + ' \xc2\xb0C'
textvalue = info
except:
pass
return textvalue
def getMemInfo(self, value):
result = [0, 0, 0, 0] # (size, used, avail, use%)
try:
check = 0
fd = open("/proc/meminfo")
for line in fd:
if value + "Total" in line:
check += 1
result[0] = int(line.split()[1]) * 1024 # size
elif value + "Free" in line:
check += 1
result[2] = int(line.split()[1]) * 1024 # avail
if check > 1:
if result[0] > 0:
result[1] = result[0] - result[2] # used
result[3] = result[1] * 100 / result[0] # use%
break
fd.close()
except:
pass
return result
def getDiskInfo(self, path):
def isMountPoint():
try:
fd = open('/proc/mounts', 'r')
for line in fd:
l = line.split()
if len(l) > 1 and l[1] == path:
return True
fd.close()
except:
return None
return False
result = [0, 0, 0, 0] # (size, used, avail, use%)
if isMountPoint():
try:
st = statvfs(path)
except:
st = None
if not st is None and not 0 in (st.f_bsize, st.f_blocks):
result[0] = st.f_bsize * st.f_blocks # size
result[2] = st.f_bsize * st.f_bavail # avail
result[1] = result[0] - result[2] # used
result[3] = result[1] * 100 / result[0] # use%
return result
def getPathInfo(self):
result = [0, 0, 0, 0] # (size, used, avail, use%)
try:
if path.exists(config.movielist.last_videodir.value):
stat = statvfs(config.movielist.last_videodir.value)
result[0] = stat.f_bsize * stat.f_blocks # size
result[2] = (stat.f_bavail if stat.f_bavail != 0 else stat.f_bfree) * stat.f_bsize # available
result[1] = stat.f_bsize * (stat.f_blocks - stat.f_bfree) # used
result[3] = result[1] * 100 / result[0] # used%
return result
except:
return result
def getSizeStr(self, value, u=0):
fractal = 0
if value >= 1024:
fmt = "%(size)u.%(frac)d %(unit)s"
while (value >= 1024) and (u < len(SIZE_UNITS)):
(value, mod) = divmod(value, 1024)
fractal = mod * 10 / 1024
u += 1
else:
fmt = "%(size)u %(unit)s"
return fmt % {"size": value, "frac": fractal, "unit": SIZE_UNITS[u]}