Сравнение постов

Различия между постами #125072 (31.07.2019 16:49) и #138987 (25.07.2020 15:40).
1
#!/sbin/openrc-run
1
 
2
# Copyright 1999-2017 Gentoo Foundation
3
# Distributed under the terms of the GNU General Public License v2
4
5
extra_started_commands="attach resume suspend"
6
7
depend() {
8
	# we can use dns and net, but we can also in most cases live without them
9
	use dns net ntp-client ntpd
10
}
11
12
create_work_directory() {
13
	local sslcrt="/etc/ssl/certs/ca-certificates.crt"
14
15
	if [ ! -d "${RUNTIMEDIR}" ]; then
16
		einfo "Directory ${RUNTIMEDIR} does not exist, creating now."
17
		if ! mkdir -p "${RUNTIMEDIR}"; then
18
			eerror "Directory ${RUNTIMEDIR} could not be created!"
19
			return 1
20
		fi
21
22
		# ensure proper ownership
23
		if ! chown "${USER}:${GROUP}" "${RUNTIMEDIR}"; then
24
			eerror "Changing ownership of '${RUNTIMEDIR}' to '${USER}:${GROUP}' failed!"
25
			return 1
26
		fi
27
	fi
28
29
	if [ ! -e "${RUNTIMEDIR}"/ca-bundle.crt ]; then
30
		if [ ! -f "${sslcrt}" ]; then
31
			eerror "'${sslcrt}' does not exist!"
32
			return 1
33
		fi
34
35
		if ! ln -s "${sslcrt}" "${RUNTIMEDIR}"/ca-bundle.crt; then
36
			eerror "Symlinking '${sslcrt}' failed!"
37
			return 1
38
		fi
39
	fi
40
41
	return 0
42
}
43
44
fix_lib_symlinks() {
45
	local src="$1"
46
	local tgt="$2"
47
48
	# If the source does not exist, we can not do anything
49
	if [ ! -f "${src}" ] ; then
50
		return 1
51
	fi
52
53
	# Check whether the symlink is already there and in order
54
	if [ -L "${tgt}" ] ; then
55
		if [ -f "${tgt}" ] ; then
56
			return 0
57
		fi
58
59
		# Remove broken symlink
60
		if ! rm -f "${tgt}"; then
61
			eerror "Removing '${tgt}' failed!"
62
			return 1
63
		fi
64
	fi
65
66
	# symlink the correct path
67
	if ! ln -snf "${src}" "${tgt}"; then
68
		eerror "Symlinking '${src}' to '${tgt}' failed!"
69
		return 1
70
	fi
71
72
	return 0
73
}
74
75
cuda_check() {
76
	local libsource="/opt/cuda/lib/libcudart.so"
77
	local libtarget="${RUNTIMEDIR}/libcudart.so"
78
79
	fix_lib_symlinks "${libsource}" "${libtarget}" || return 1
80
	return 0
81
}
82
83
opencl_check() {
84
	local libsource="/usr/lib/libOpenCL.so"
85
	local libtarget="${RUNTIMEDIR}/libOpenCL.so"
86
87
	fix_lib_symlinks "${libsource}" "${libtarget}" || return 1
88
	return 0
89
}
90
91
env_check() {
92
	# Make sure the configuration is sane
93
	: ${USER:="boinc"}
94
	: ${GROUP:="boinc"}
95
	: ${RUNTIMEDIR:="/var/lib/boinc"}
96
	: ${BOINCBIN:="$(which boinc_client)"}
97
	: ${BOINC_PIDFILE:="/var/run/boinc_client.pid"}
98
	: ${BOINCCMD:="$(which /usr/bin/boinccmd)"}
99
	: ${ALLOW_REMOTE_RPC:="yes"}
100
	: ${NICELEVEL:="19"}
101
	# ARGS is not checked, it could have been explicitly set
102
	# to be empty by the user.
103
104
	# If the client was not found (how?) something is seriously wrong
105
	if [ ! -x "${BOINCBIN}" ]; then
106
		eerror "No boinc_client found!"
107
		return 1
108
	fi
109
110
	# The boinccmd is crucial, or we can not attach, suspend or resume
111
	# the boinc client
112
	if [ ! -x "${BOINCCMD}" ]; then
113
		eerror "No boinccmd program found!"
114
		return 1
115
	fi
116
117
	return 0
118
}
119
120
need_passwd_arg() {
121
	local vers=$(${BOINCBIN} --version | tr -d .)
122
	[ -z "${vers}" ] && vers="00"
123
	[ $(expr substr "${vers}" 1 2) -lt 74 ] && return 0
124
125
	# From version 7.4 on, the default is to read
126
	# gui_rpc_auth.cfg for the password.
127
128
	return 1
129
}
130
131
start_pre() {
132
	env_check || return 1
133
	create_work_directory || return 1
134
	cuda_check || einfo "CUDA not supported"
135
	opencl_check || einfo "OpenCL not supported"
136
137
	if [ ! -f "${RUNTIMEDIR}/lockfile" ]; then
138
		einfo "File \"${RUNTIMEDIR}/lockfile\" does not exist, assuming first run."
139
		einfo "You need to setup an account on the BOINC project homepage beforehand!"
140
		einfo "Go to http://boinc.berkeley.edu/ and locate your project."
141
		einfo "Then either run ${RC_SERVICE} attach or connect with a gui client"
142
		einfo "and attach to a project with that."
143
		einfo ""
144
		ewarn "Note that for attaching to some project you need your network up and running."
145
		ewarn "network is needed only for jobs fetching afterwards"
146
	fi
147
148
	return 0
149
}
150
151
start() {
152
	if [ "${ALLOW_REMOTE_RPC}" = "yes" ]; then
153
		ARGS="${ARGS} --allow_remote_gui_rpc"
154
	fi
155
156
	ARGS="${ARGS} --dir "${RUNTIMEDIR}" --redirectio"
157
158
	ebegin "Starting ${RC_SVCNAME}"
159
	start-stop-daemon --start --nicelevel ${NICELEVEL} \
160
		--user "${USER}:${GROUP}" --quiet --make-pidfile \
161
		--pidfile "${BOINC_PIDFILE}" --background \
162
		--exec "${BOINCBIN}" -- ${ARGS}
163
	eend $?
164
}
165
166
attach() {
167
	local password=""
168
	local url=""
169
	local key=""
170
171
	env_check || return 1
172
173
	einfo "If you can't find your account key just try to obtain it by using:"
174
	einfo "    boinccmd --passwd PASSWORD_FROM_GUI_RPC_AUTH --lookup_account URL EMAIL PASSWORD"
175
176
	printf "    Enter the Project URL: "
177
	read url
178
	printf "    Enter your Account Key: "
179
	read key
180
181
	if ! service_started; then
182
		"${RC_SERVICE}" start
183
	fi
184
185
	if need_passwd_arg; then
186
		password="--passwd \"$(cat "${RUNTIMEDIR}/gui_rpc_auth.cfg")\""
187
	fi
188
189
	ebegin "${RC_SVCNAME}: Attaching to project"
190
	start-stop-daemon --user "${USER}:${GROUP}" --quiet \
191
		--chdir "${RUNTIMEDIR}" --exec "${BOINCCMD}" \
192
		-- ${password} --project_attach ${url} ${key}
193
	eend $?
194
195
	sleep 10
196
	tail "${RUNTIMEDIR}/stdoutdae.txt"
197
}
198
199
stop() {
200
	local password=""
201
	local stop_timeout="SIGTERM/60/SIGTERM/30/SIGKILL/30"
202
203
	env_check || return 1
204
205
	if need_passwd_arg; then
206
		password="--passwd \"$(cat "${RUNTIMEDIR}/gui_rpc_auth.cfg")\""
207
	fi
208
209
	ebegin "Stopping ${RC_SVCNAME}"
210
	start-stop-daemon --stop --quiet --progress \
211
		--retry ${stop_timeout} \
212
		--pidfile "${BOINC_PIDFILE}"
213
	eend $?
214
}
215
216
resume() {
217
	env_check || return 1
218
219
	local password=""
220
221
	if need_passwd_arg; then
222
		password="--passwd \"$(cat "${RUNTIMEDIR}/gui_rpc_auth.cfg")\""
223
	fi
224
225
	for url in $(cd "${RUNTIMEDIR}" ; \
226
		  "${BOINCCMD}" ${password} --get_project_status | \
227
		  sed -n 's/\s*master URL: //p'); do
228
		ebegin "Resuming ${url}"
229
		start-stop-daemon --user "${USER}:${GROUP}" --quiet \
230
			--chdir "${RUNTIMEDIR}" --exec "${BOINCCMD}" \
231
			-- ${password} --project ${url} resume
232
		eend $?
233
	done
234
}
235
236
suspend() {
237
	env_check || return 1
238
239
	local password=""
240
241
	if need_passwd_arg; then
242
		password="--passwd \"$(cat "${RUNTIMEDIR}/gui_rpc_auth.cfg")\""
243
	fi
244
245
	for url in $(cd "${RUNTIMEDIR}" ; \
246
		  "${BOINCCMD}" ${password} --get_project_status | \
247
		  sed -n 's/\s*master URL: //p'); do
248
		ebegin "Suspending ${url}"
249
		start-stop-daemon --user "${USER}:${GROUP}" --quiet \
250
			--chdir "${RUNTIMEDIR}" --exec "${BOINCCMD}" \
251
			-- ${password} --project ${url} suspend
252
		eend $?
253
	done