File: pkgos-gen-systemd-unit

package info (click to toggle)
openstack-pkg-tools 139
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 940 kB
  • sloc: sh: 4,216; makefile: 31
file content (136 lines) | stat: -rwxr-xr-x 3,286 bytes parent folder | download
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
#!/bin/sh

if [ $# -ne 1 ] ; then
    echo "Usage: $0 <init_template>"
    exit 1
fi

INIT_TEMPLATE=${1}
SERVICE_FILE=`echo ${INIT_TEMPLATE} | sed 's/.init.in/.service/'`

# Get the variables defined in the init template
. ${INIT_TEMPLATE}

if [ -z "${NAME}" ] ; then
    echo "Variable NAME is not set!"
    exit 1
fi
if [ -z "${PROJECT_NAME}" ] ; then
    echo "Variable PROJECT_NAME is not set!"
    exit 1
fi
if [ -z "${DESC}" ] ; then
    echo "Variable DESC is not set!"
    exit 1
fi

if [ -z "${SCRIPTNAME}" ] ; then
	SCRIPTNAME=/etc/init.d/${NAME}
fi
if [ -z "${SYSTEM_USER}" ] ; then
	SYSTEM_USER=${PROJECT_NAME}
fi
if [ -z "${SYSTEM_GROUP}" ] ; then
	SYSTEM_GROUP=${PROJECT_NAME}
fi
if [ -z "${SYSTEMD_TYPE}" ] ; then
	SYSTEMD_TYPE=simple
fi

# Find out what should go in After=
SHOULD_START=$(cat ${INIT_TEMPLATE} | grep "# Should-Start:" | sed 's/# Should-Start://')
X_START_BEFORE=$(cat ${INIT_TEMPLATE} | grep "# X-Start-Before:" | sed 's/# X-Start-Before://')
REQUIRED_START=$(cat ${INIT_TEMPLATE} | grep "# Required-Start:" | sed 's/# Required-Start://')

if [ -n "${SHOULD_START}" ] || [ -n "${REQUIRED_START}" ] ; then
	AFTER="After="
	WANTS="Wants="
fi

if [ -n "${SHOULD_START}" ] ; then
	for i in ${SHOULD_START} ; do
		AFTER="${AFTER}${i}.service "
		WANTS="${WANTS}${i}.service "
	done
fi

for i in $(cat ${INIT_TEMPLATE} | grep "# Required-Start:" | sed 's/# Required-Start://' ) ; do
	# Translate Required-Start: that has a $ ...
	if [ $( echo $i | head -c 1) = '$' ] ; then
		if [ "${i}" = '$network' ] ; then
			AFTER="${AFTER}network-online.target "
			WANTS="${WANTS}network-online.target "
		fi
		if [ "${i}" = '$local_fs' ]; then
			AFTER="${AFTER}local-fs.target "
		fi
		if [ "${i}" = '$remote_fs' ]; then
			AFTER="${AFTER}remote-fs.target "
		fi
	# Write down all of the others
	else
		AFTER="${AFTER}${i}.service "
		WANTS="${WANTS}${i}.service "
	fi
done
if [ "${WANTS}" = "Wants=" ]; then
	WANTS=""
fi

if [ -n "${X_START_BEFORE}" ] ; then
	BEFORE="Before="
	for i in ${X_START_BEFORE} ; do
		BEFORE="${BEFORE}${i}.service "
	done
fi

if [ "${SYSTEMD_TYPE}" = "oneshot" ] ; then
	SYSTEMD_RESTART="Restart=no"
else
	SYSTEMD_RESTART="Restart=on-failure"
fi

if [ -n "${SYSTEMD_DOC}" ] ; then
	SYSTEMD_DOC="Documentation=$SYSTEMD_DOC"
else
	SYSTEMD_DOC="Documentation=man:${NAME}(1)"
fi

if [ -n "${SYSTEMD_NOTIFY_ACCESS}" ] ; then
	SYSTEMD_NOTIFY_ACCESS="NotifyAccess=${SYSTEMD_NOTIFY_ACCESS}"
fi

echo "[Unit]
Description=${DESC}
$AFTER
$WANTS
$BEFORE
$SYSTEMD_DOC
$CUSTOM_SYSTEMD_UNIT

[Service]
User=${SYSTEM_USER}
Group=${SYSTEM_GROUP}
Type=${SYSTEMD_TYPE}
WorkingDirectory=~
RuntimeDirectory=${PROJECT_NAME} lock/${PROJECT_NAME}
CacheDirectory=${PROJECT_NAME}
ExecStart=${SCRIPTNAME} systemd-start
$SYSTEMD_RESTART
LimitNOFILE=65535
TimeoutStopSec=15
${SYSTEMD_NOTIFY_ACCESS}
${CUSTOM_SYSTEMD_SERVICE_DIRECTIVES}

[Install]
WantedBy=multi-user.target
" >${SERVICE_FILE}.tmp

if [ -n "${SYSTEMD_ALIAS}" ] ; then
	echo "Alias=${SYSTEMD_ALIAS}" >>${SERVICE_FILE}.tmp
fi

# 1. Make several blank lines between blocks to single line
# 2. Remove last empty line
awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' ${SERVICE_FILE}.tmp | awk 'NR > 1{print t} {t = $0}END{if (NF) print }' > ${SERVICE_FILE}
rm -f ${SERVICE_FILE}.tmp