summaryrefslogtreecommitdiff
path: root/chronyd.init
blob: 0385b24dc2d6a035d5a8c5d906ddbc761d946be5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/bin/sh
#
# chronyd	chronyd short service description
#
# chkconfig:   2345 58 74
# description: Client/server for the Network Time Protocol, \
#              this program keeps your computer's clock accurate.
#

# Source function library
. /etc/rc.d/init.d/functions

# Get network config
. /etc/sysconfig/network

# default user if not overriden by config
NTPD_USER="ntp"

# Get service config - may override defaults
[ -f /etc/sysconfig/chronyd ] && . /etc/sysconfig/chronyd

# Check that networking is up.
if is_yes "${NETWORKING}"; then
	if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status ]; then
		msg_network_down "Chronyd NTPD"
		exit 1
	fi
else
	exit 0
fi

config=/etc/ntp/chrony.conf
keyfile=/etc/ntp/keys
chronyc=/usr/bin/chronyc

get_key() {
    awk '/^[ \t]*'$1'[ \t]*/ { print $2; exit }' < $keyfile
}

get_commandkeyid() {
    awk '/^[ \t]*commandkey[ \t]*/ { keyid=$2 } END { print keyid }' < $config
}

chrony_command() {
    commandkeyid=$(get_commandkeyid)
    [ -z "$commandkeyid" ] && return 1
    commandkey=$(get_key $commandkeyid)
    [ -z "$commandkey" ] && return 2

    ! (
        $chronyc <<EOF &
password $commandkey
$1
EOF
        chronycpid=$!

        # chronyc will hang if the daemon doesn't respond, kill it after 3 s
		#'
        (sleep 3; kill $chronycpid) < /dev/null > /dev/null 2>&1 &
        killerpid=$!

        wait $chronycpid >/dev/null 2>&1
        kill $killerpid >/dev/null 2>&1 || echo "chronyd not responding"
    ) | grep -v '200 OK'
}

generate_commandkey() {
    commandkeyid=$(get_commandkeyid)
    [ -z "$commandkeyid" ] && return 1
    commandkey=$(get_key $commandkeyid)
    [ -z "$commandkey" ] || return 0

	show "Generating Chrony command key"; busy
    commandkey=$(tr -c -d '[\041-\176]' < /dev/urandom | head -c 8)
    [ -n "$commandkey" ] && echo "$commandkeyid $commandkey" >> $keyfile && ok || fail
}

start() {
	# Check if the service is already running?
	if [ -f /var/lock/subsys/chronyd ]; then
		msg_already_running "Chronyd NTPD"
		return
	fi

    generate_commandkey

	msg_starting "Chronyd NTPD"
	daemon /usr/sbin/chronyd -u $NTPD_USER $OPTIONS
	RETVAL=$?
	[ $RETVAL -eq 0 ] && touch /var/lock/subsys/chronyd
}

stop() {
	if [ ! -f /var/lock/subsys/chronyd ]; then
		msg_not_running "Chronyd NTPD"
		return
	fi

	# Stop daemons.
	msg_stopping "Chronyd NTPD"
	killproc chronyd
	rm -f /var/lock/subsys/chronyd
}

condrestart() {
	if [ ! -f /var/lock/subsys/chronyd ]; then
		msg_not_running "Chronyd NTPD"
		RETVAL=$1
		return
	fi

	stop
	start
}

RETVAL=0
# See how we were called.
case "$1" in
  start)
  	start
	;;
  stop)
  	stop
	;;
  restart)
	stop
	start
	;;
  try-restart)
	condrestart 0
	;;
  force-reload)
	condrestart 7
	;;
  cyclelogs|flush-logs)
   	status chronyd >/dev/null 2>&1 || exit 7
	chrony_command cyclelogs
	;;
  online|offline)
   	status chronyd >/dev/null 2>&1 || exit 7
	chrony_command $1
	;;
  command)
   	status chronyd >/dev/null 2>&1 || exit 7
	chrony_command "$2"
	;;
  status)
	status chronyd
	RETVAL=$?
	if [ $RETVAL = 0 ]; then
		chrony_command sources
	fi
	;;
  *)
	msg_usage "$0 {start|stop|restart|try-restart|force-reload|online|offline|cyclelogs|command|status}"
	exit 3
esac

exit $RETVAL