81 lines
2.2 KiB
Python
81 lines
2.2 KiB
Python
# -*- coding: utf-8 -*-
|
||
from comar.service import *
|
||
|
||
import re
|
||
|
||
serviceType = "local"
|
||
serviceDesc = _({"en": "Set the date & time via NTP",
|
||
"tr": "Tarih & zamanı NTP ile ayarlayın"})
|
||
serviceConf = "ntpdate"
|
||
serviceDefault = "conditional"
|
||
|
||
# ntpdate will run if it finds a ticker in any of the configuration files
|
||
|
||
NTPCONF = "/etc/ntp.conf"
|
||
NTPSTEP = "/etc/ntp/step-tickers"
|
||
PIDFILE = "/run/ntpdate.pid"
|
||
|
||
MSG_NOSERVER = _({"en" : "NTP server not specified in %s or %s." % (NTPSTEP, NTPCONF),
|
||
"tr" : "%s veya %s dosyasında hiç NTP sunucu belirtilmemiş." % (NTPSTEP, NTPCONF)})
|
||
|
||
def parse_tickers():
|
||
tickers = []
|
||
if os.path.exists(NTPSTEP):
|
||
for line in open(NTPSTEP, "r").read().strip().split("\n"):
|
||
if line and not line.startswith("#"):
|
||
tickers.append(line)
|
||
|
||
if tickers:
|
||
return tickers
|
||
|
||
if os.path.exists(NTPCONF):
|
||
for line in open(NTPCONF, "r").read().strip().split("\n"):
|
||
if line.startswith(("server", "peer")):
|
||
try:
|
||
peer = line.split()[1]
|
||
if not re.match("127\.127\.[0-9]+\.[0-9]+", peer):
|
||
tickers.append(peer)
|
||
except IndexError:
|
||
pass
|
||
|
||
return tickers
|
||
|
||
@synchronized
|
||
def start():
|
||
tickers = parse_tickers()
|
||
|
||
if len(tickers) == 0:
|
||
fail(MSG_NOSERVER)
|
||
|
||
tickers = " ".join(tickers)
|
||
|
||
# Eventhough the ntpdate is a oneshot process, the pidfile hack is used to
|
||
# work around COMAR's silly status() check in startService()
|
||
startService(command="/usr/sbin/ntpdate",
|
||
args="%s %s" % (config.get("OPTIONS", "-u ntp -s -b"), tickers),
|
||
makepid=True,
|
||
pidfile=PIDFILE,
|
||
donotify=True)
|
||
|
||
if os.path.exists(PIDFILE):
|
||
os.unlink(PIDFILE)
|
||
|
||
if config.get("SYNC_HWCLOCK", "no") == "yes":
|
||
run("/sbin/hwclock --systohc")
|
||
|
||
def ready():
|
||
status = is_on()
|
||
tickers = parse_tickers()
|
||
if status == "on" or (status == "conditional" and tickers):
|
||
start()
|
||
|
||
|
||
@synchronized
|
||
def stop():
|
||
# There's nothing to do
|
||
pass
|
||
|
||
def status():
|
||
# No need to supply a status as the service is oneshot
|
||
return
|