# -*- coding: utf-8 -*-
from Plugins.Plugin import PluginDescriptor
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.Button import Button
from Components.ActionMap import ActionMap
from Components.ConfigList import ConfigListScreen
from Components.config import config, ConfigSubsection, ConfigDateTime, ConfigClock, ConfigText, getConfigListEntry, ConfigInteger, ConfigSequence
import enigma
from enigma import eTimer, iServiceInformation
from datetime import datetime, time as dt_time
from os import system
import gettext
import time, httplib
from Screens.Console import Console
import os
from os import popen
config.plugins.SetClock = ConfigSubsection()
config.plugins.SetClock.HostName = ConfigText(default='vniiftri.ru', fixed_size=False)
#config.plugins.SetClock.NTPName01 = ConfigText(default='vniiftri2.khv.ru', fixed_size=False)
#config.plugins.SetClock.NTPName02 = ConfigText(default='vniiftri.khv.ru', fixed_size=False)
#config.plugins.SetClock.NTPName03 = ConfigText(default='ntp2.niiftri.irkutsk.ru', fixed_size=False)
#config.plugins.SetClock.NTPName04 = ConfigText(default='ntp1.niiftri.irkutsk.ru', fixed_size=False)
#config.plugins.SetClock.NTPName05 = ConfigText(default='ntp21.vniiftri.ru', fixed_size=False)
#config.plugins.SetClock.NTPName06 = ConfigText(default='ntp4.vniiftri.ru', fixed_size=False)
#config.plugins.SetClock.NTPName07 = ConfigText(default='ntp3.vniiftri.ru', fixed_size=False)
#config.plugins.SetClock.NTPName08 = ConfigText(default='ntp1.vniiftri.ru', fixed_size=False)
#config.plugins.SetClock.NTPName09 = ConfigText(default='ntp2.vniiftri.ru', fixed_size=False)
config.plugins.SetClock.NTPName01 = ConfigText(default='ntp2.vniiftri.ru', fixed_size=False)
config.plugins.SetClock.timeout = ConfigInteger(default = 20, limits = (0,120))
ver = '1.1'
def _(txt):
t = gettext.gettext(txt)
return t
#def Plugins(**kwargs):
def Plugins(path, **kwargs):
global plugin_path
plugin_path = path
return [PluginDescriptor(name='SetClock', description='SetClock plug-in v.' + ver + ' (c)2011 by SatCat', where=PluginDescriptor.WHERE_PLUGINMENU, icon='plugin.png', fnc=main), PluginDescriptor(name='SetClock', description='SetClock plug-in v.' + ver + '(c)2011 by SatCat', where=[PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc=autostart)]
def main(session, servicereference = None, **kwargs):
try:
session.open(SetClockMain)
except:
print '[SetClock] Pluginexecution failed'
def autostart(reason, **kwargs):
global session
if reason == 0 and kwargs.has_key('session'):
session = kwargs['session']
session.open(AutoCorrTime)
def get_time_str(res_time):
replace_months = {
'Jan': '1',
'Feb': '2',
'Mar': '3',
'Apr': '4',
'May': '5',
'June': '6',
'Jun': '6',
'July': '7',
'Jul': '7',
'Aug': '8',
'Sept': '9',
'Sep': '9',
'Oct': '10',
'Nov': '11',
'Dec': '12'
}
gmts = [
'UTC',
'GMT'
]
_res_time = res_time
try:
time_tuple = time.strptime(res_time, '%a, %d %b %Y %H:%M:%S %Z')
except ValueError:
for m1, m2 in replace_months.items():
res_time = res_time.replace(m1, m2)
for gmt in gmts:
res_time = res_time.replace(gmt, '')
res_time = res_time.split(', ')[1].strip()
try:
time_tuple = time.strptime(res_time, '%d %m %Y %H:%M:%S')
#open('/usr/lib/enigma2/python/Plugins/Extensions/SetClock/log.txt', 'a').write(_res_time)
except ValueError:
open('/usr/lib/enigma2/python/Plugins/Extensions/SetClock/log.txt', 'a').write(_res_time)
raise
t = time.localtime(time.mktime(time_tuple) - time.timezone)
return time.strftime('%Y%m%d%H%M.%S', t)
class AutoCorrTime(Screen):
skin = '''
<screen position="100,100" size="280,300" title="SetClock" >
</screen>'''
def __init__(self, session):
Screen.__init__(self, session)
self.session = session
if time.localtime().tm_year == 2000:
self.limit = 0
self.cursorTimer = eTimer()
self.cursorTimer.callback.append(self.timer)
self.cursorTimer.start(75, False)
def timer(self):
if time.localtime().tm_year > 2000:
refstr = dtt = 'n/a'
try:
service = self.session.nav.getCurrentService()
if service:
info = service.info()
if info:
refstr = info.getInfoString(iServiceInformation.sServiceref)
except:
refstr = 'ref error'
if refstr == '1:0:1:1:65:64:3840000:0:0:0:':
tc = time.time() - 189391980
dtt = datetime.fromtimestamp(tc).strftime('%Y%m%d%H%M')
enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(False)
try:
system('/bin/date -s %s' % dtt)
print '[SetClock] Set clock!'
except:
pass
self.cursorTimer.stop()
print '[SetClock] Stop timer.'
self.limit = self.limit + 1
if self.limit > 1200:
self.cursorTimer.stop()
print '[SetClock] Stop timer (limit).'
class SetClockMain(ConfigListScreen, Screen):
skin = '''
<screen position="center,200" size="560,365" title="SetClock" >
<widget name="config" position="0,0" size="560,365" scrollbarMode="showOnDemand" />
<widget name="key_red" position="0,325" size="140,40" valign="center" halign="center" zPosition="4" foregroundColor="white" font="Regular;20" transparent="1"/>
<ePixmap name="red" position="0,325" size="140,40" zPosition="2" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
<widget name="key_green" position="140,325" size="140,40" valign="center" halign="center" zPosition="4" foregroundColor="white" font="Regular;20" transparent="1"/>
<ePixmap name="green" position="140,325" size="140,40" zPosition="2" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
<widget name="key_yellow" position="280,325" size="140,40" valign="center" halign="center" zPosition="4" backgroundColor="#a08500" font="Regular;20" transparent="1"/>
<ePixmap name="yellow" position="280,325" size="140,40" zPosition="2" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
<widget name="key_blue" position="420,325" size="140,40" valign="center" halign="center" zPosition="4" backgroundColor="#a08500" font="Regular;20" transparent="1"/>
<ePixmap name="blue" position="420,325" size="140,40" zPosition="2" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
</screen>'''
def __init__(self, session, args = 0):
self.skin = SetClockMain.skin
self.session = session
Screen.__init__(self, session)
self.list = []
#self.date_en = ConfigDateTime(default=time.time(), formatstring='%d.%m.%Y')
self.date_en = ConfigDate(default=time.time())
self.entryDate = getConfigListEntry(_('Date'), self.date_en)
self.time_en = ConfigClock(default=time.time())
self.entryTime = getConfigListEntry(_('Time'), self.time_en)
self.list.append(self.entryDate)
self.list.append(self.entryTime)
#self.list.append(getConfigListEntry('HTTP host:', config.plugins.SetClock.HostName))
#self.list.append(getConfigListEntry('NTP Server № 01:', config.plugins.SetClock.NTPName01))
#self.list.append(getConfigListEntry('NTP Server № 02:', config.plugins.SetClock.NTPName02))
#self.list.append(getConfigListEntry('NTP Server № 03:', config.plugins.SetClock.NTPName03))
#self.list.append(getConfigListEntry('NTP Server № 04:', config.plugins.SetClock.NTPName04))
#self.list.append(getConfigListEntry('NTP Server № 05:', config.plugins.SetClock.NTPName05))
#self.list.append(getConfigListEntry('NTP Server № 06:', config.plugins.SetClock.NTPName06))
#self.list.append(getConfigListEntry('NTP Server № 07:', config.plugins.SetClock.NTPName07))
#self.list.append(getConfigListEntry('NTP Server № 08:', config.plugins.SetClock.NTPName08))
#self.list.append(getConfigListEntry('NTP Server № 09:', config.plugins.SetClock.NTPName09))
self.list.append(getConfigListEntry('NTP Server № 01:', config.plugins.SetClock.NTPName01))
self.list.append(getConfigListEntry('NTP Server Timeout [s]:', config.plugins.SetClock.timeout))
self['key_red'] = Button(_('Установить!'))
self['key_green'] = Button(_('HTTP SET'))
self['key_yellow'] = Button(_('NTP SET'))
self['key_blue'] = Button(_('Cancel'))
ConfigListScreen.__init__(self, self.list, session=session)
self['setupActions'] = ActionMap(['OkCancelActions', 'ColorActions'], {'red': self.set,
'green': self.inet_set,
'yellow': self.NTP_set,
'blue': self.cancel,
'save': self.set,
'cancel': self.cancel,
'ok': self.pressed_ok}, -2)
self['config'].list = self.list
self['config'].l.setList(self.list)
def pressed_ok(self):
config.plugins.SetClock.HostName.save()
config.plugins.SetClock.NTPName.save()
self.set()
def set(self, dtt = 0):
dtt = '%d%02d%02d%02d%02d' % (self.date_en.value[2],
self.date_en.value[1],
self.date_en.value[0],
self.time_en.value[0],
self.time_en.value[1])
enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(False)
try:
system('/bin/date -s %s' % dtt)
except:
pass
self.close()
print '[SetClock] SET! ** %s' % time.strftime('%X %x (%Y) %Z')
def inet_set(self):
config.plugins.SetClock.HostName.save()
conn = httplib.HTTPConnection(config.plugins.SetClock.HostName.value)
try:
conn.request('HEAD', '/favicon.ico')
t_rtt = time.clock()
res_time = conn.getresponse().getheader('date')
except:
self.session.open(MessageBox, 'Error: No server responce: ' + config.plugins.SetClock.HostName.value, MessageBox.TYPE_ERROR, timeout=3)
return
enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(False)
try:
system('/bin/date -s %s' % get_time_str(res_time))
except:
pass
self.close()
print '[SetClock] inet SET! ** %s' % time.strftime('%X %x (%Y) %Z')
def cancel(self):
self.close()
def NTP_set(self):
#if (config.plugins.SetClock.NTPName01.value == "" and config.plugins.SetClock.NTPName02.value == "" and config.plugins.SetClock.NTPName03.value == "" and config.plugins.SetClock.NTPName04.value == "" and config.plugins.SetClock.NTPName05.value == "" and config.plugins.SetClock.NTPName06.value == "" and config.plugins.SetClock.NTPName07.value == "" and config.plugins.SetClock.NTPName08.value == "" and config.plugins.SetClock.NTPName09.value == ""):
#self.session.open(MessageBox, _("no timeserver configured!"), MessageBox.TYPE_INFO)
#else:
if os.path.exists(os.path.join(plugin_path, "ntpdate")):
#Lite_OutPut_In_Console_1_stroke
#cmd = '/usr/bin/ntpdate -b -t %s %s && echo "\n"' % (config.plugins.SetClock.timeout.value, config.plugins.SetClock.NTPName.value)
#cmd = '%s%s %s %s && echo "\n"' % (plugin_path, "/ntpdate -b -t ", config.plugins.SetClock.timeout.value, config.plugins.SetClock.NTPName01.value)
#cmd = '%s%s %s %s %s %s %s %s %s %s %s %s && echo "\n"' % (plugin_path, "/ntpdate -b -t ", config.plugins.SetClock.timeout.value, config.plugins.SetClock.NTPName01.value, config.plugins.SetClock.NTPName02.value, config.plugins.SetClock.NTPName03.value, config.plugins.SetClock.NTPName04.value, config.plugins.SetClock.NTPName05.value, config.plugins.SetClock.NTPName06.value, config.plugins.SetClock.NTPName07.value, config.plugins.SetClock.NTPName08.value, config.plugins.SetClock.NTPName09.value)
#Extended_OutPut_In_Console_2_stroke
#cmd = '/usr/bin/ntpdate -v -u %s %s && echo "\n"' % (config.plugins.SetClock.timeout.value, config.plugins.SetClock.NTPName.value)
cmd = '%s%s %s %s && echo "\n"' % (plugin_path, "/ntpdate -v -u ", config.plugins.SetClock.timeout.value, config.plugins.SetClock.NTPName01.value)
#cmd = '%s%s %s %s %s %s %s %s %s %s %s %s && echo "\n"' % (plugin_path, "/ntpdate -v -u ", config.plugins.SetClock.timeout.value, config.plugins.SetClock.NTPName01.value, config.plugins.SetClock.NTPName02.value, config.plugins.SetClock.NTPName03.value, config.plugins.SetClock.NTPName04.value, config.plugins.SetClock.NTPName05.value, config.plugins.SetClock.NTPName06.value, config.plugins.SetClock.NTPName07.value, config.plugins.SetClock.NTPName08.value, config.plugins.SetClock.NTPName09.value)
res = popen(cmd).read()
if res == "":
cmd = "ls -l %s%s" % (plugin_path, "/ntpdate")
res = popen(cmd).read()
if res[3]!="x":
cmd = "chmod 755 %s%s" % (plugin_path, "/ntpdate")
res = popen(cmd).read()
self.session.open(MessageBox, _("ntpdate problem: attributes for 'ntpdate' have not been correct! Fixed now! Try again!\n%s" % res), MessageBox.TYPE_INFO)
else:
self.session.open(MessageBox, _("ntpdate problem: Internet connection ok? Time server ok?"), MessageBox.TYPE_INFO)
else:
self.session.open(MyConsole, _("Системное время с NTP ..."), [cmd])
else:
self.session.open(MessageBox, _("'ntpdate' не установлен !"), MessageBox.TYPE_ERROR)
self.close()
print '[SetClock] NTP SET! ** %s' % time.strftime('%X %x (%Y) %Z')
self.close()
print '[SetClock] NTP SET! ** %s' % time.strftime('%X %x (%Y) %Z')
class MyConsole(Console):
skin = '''
<screen position="center,245" size="485,260" title="Command execution..." >
<widget name="text" position="0,0" size="485,260" font="Regular;20" />
</screen>'''
def __init__(self, session, title = "My Console...", cmdlist = None):
Console.__init__(self, session, title, cmdlist)
date_limits = [(1, 31), (1, 12), (1970, 2050)]
class ConfigDate(ConfigSequence):
def __init__(self, default):
d = time.localtime(default)
ConfigSequence.__init__(self, seperator=".", limits=date_limits, default=[d.tm_mday, d.tm_mon, d.tm_year])
Comments