forked from ZoneMinder/zoneminder
-
Notifications
You must be signed in to change notification settings - Fork 5
/
zmlinkcontent.sh.in
executable file
·413 lines (374 loc) · 10.3 KB
/
zmlinkcontent.sh.in
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
#!/bin/bash
# This tool is used to verify folders critical to ZoneMinder exist and have the right permissions.
# It will also create symlinks when necessary. It can use an existing content folder or create a new one.
# Set the content dir default to be the one supplied to cmake
ZM_PATH_CONTENT="@ZM_CONTENTDIR@"
# Set the zoneminder log dir default to be the one supplied to cmake
ZM_LOGDIR="@ZM_LOGDIR@"
# Set the zoneminder temp dir default to be the one supplied to cmake
ZM_TMPDIR="@ZM_TMPDIR@"
echo "*** This bash script creates the nessecary symlinks for the zoneminder content"
echo "*** It can use an existing content folder or create a new one"
echo "*** For usage: use -h"
echo "*** The default content directory is: $ZM_PATH_CONTENT"
echo "*** The default log directory is: $ZM_LOGDIR"
echo "*** The default temp directory is: $ZM_TMPDIR"
echo ""
usage()
{
cat <<EOF
Usage: $0 [-q] [-o] [-z zm.conf] [-w WEB DIRECTORY] [-l LOG DIRECTORY] [-t TMP DIRECTORY] [CONTENT DIRECTORY]
OPTIONS:
-h Show this message and quit
-z ZoneMinder configuration file
-w Override the web directory from zm.conf
-q Quick mode. Do not change ownership recursively.
-l Override the zm log folder location
-t Override the zm temp folder location
-o Enable old legacy symlinks inside ZoneMinder's webroot folder
If the -w option is not used to specify the path to the web directory,
the script will use the path from zoneminder's configuration file.
If the -z option is used, the argument will be used instead of zm.conf
Otherwise, it will attempt to read zm.conf from the local directory.
If that fails, it will try from /etc/zm.conf
Newer versions of ZoneMinder no longer require symlinks to the events and
images folders inside the zm webroot. Indeed this is a security risk, and
$0 will no longer create these unless the -o option is specified.
EOF
}
while getopts "hz:w:q:l:t:o" OPTION
do
case $OPTION in
h)
usage
exit 50
;;
z)
ZM_CONFIG=$OPTARG
;;
w)
ZM_PATH_WEB_FORCE=$OPTARG
;;
q)
QUICK=1
;;
l)
ZM_LOGDIR_FORCE=$OPTARG
;;
t)
ZM_TMPDIR_FORCE=$OPTARG
;;
o)
LEGACY=1
;;
esac
done
shift $(( OPTIND - 1 ))
# Lets check that we are root
if [ "$(id -u)" != "0" ]; then
echo "Error: This script needs to run as root."
exit 1
fi
# Check if zm.conf was supplied as an argument and that it exists
if [[ -n "$ZM_CONFIG" && ! -f "$ZM_CONFIG" ]]; then
echo "The zoneminder configuration file $ZM_CONFIG does not exist!"
exit 40
fi
# Load zm.conf
for zmconf in "$ZM_CONFIG" ./zm.conf /etc/zm.conf /etc/zoneminder/zm.conf; do
if [[ -f "$zmconf" ]]; then
echo "Using $zmconf"
source "$zmconf"
# remove filename from path
zmconf2="${zmconf%/*}"
# source conf.d
for i in $(find "${zmconf2}/conf.d" -name \*.conf |sort); do . "$i"; done;
break
fi
done
if [[ -z "$zmconf2" ]]; then
echo -e "Failed locating zoneminder configuration file (zm.conf)\nUse the -z option to specify the full path to the zoneminder configuration file"
exit 45
fi
# Override the web directory path from zm.conf
if [ -n "$ZM_PATH_WEB_FORCE" ]; then
ZM_PATH_WEB="$(readlink -f $ZM_PATH_WEB_FORCE)"
fi
# Override the log directory path
if [ -n "$ZM_LOGDIR_FORCE" ]; then
ZM_LOGDIR="$(readlink -f $ZM_LOGDIR_FORCE)"
fi
# Override the tmp directory path
if [ -n "$ZM_TMPDIR_FORCE" ]; then
ZM_TMPDIR="$(readlink -f $ZM_TMPDIR_FORCE)"
fi
# Override the default content path
if [[ -n "$@" ]]; then
ZM_PATH_CONTENT="$(readlink -f $@)"
fi
# Print some information
echo "Web folder : $ZM_PATH_WEB"
echo "Content folder : $ZM_PATH_CONTENT"
echo "Log folder : $ZM_LOGDIR"
echo "Temp folder : $ZM_TMPDIR"
echo ""
# Verify the web folder is a real directory
echo -n "Verifying the web folder is a directory... "
if [ -d "$ZM_PATH_WEB" ]; then
echo "OK"
else
echo "Failed"
exit 2
fi
# Check if the content folder exists, and if not, create it
echo -n "Checking if the content folder exists... "
if [ -d "$ZM_PATH_CONTENT" ]; then
echo "Yes"
else
echo "No"
echo -n "Creating the content folder... "
mkdir "$ZM_PATH_CONTENT"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 3
fi
fi
# Check if the log folder exists, and if not, create the entire folder including its parents
echo -n "Checking if the log folder exists... "
if [ -d "$ZM_LOGDIR" ]; then
echo "Yes"
else
echo "No"
echo -n "Creating the log folder... "
mkdir -p "$ZM_LOGDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 4
fi
fi
# Check if the temp folder exists, and if not, create the entire folder including its parents
echo -n "Checking if the temp folder exists... "
if [ -d "$ZM_TMPDIR" ]; then
echo "Yes"
else
echo "No"
echo -n "Creating the temp folder... "
mkdir -p "$ZM_TMPDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 5
fi
fi
# Check if the content/images folder exists, and if not, create it
echo -n "Checking if the images folder exists inside the content folder... "
if [ -d "$ZM_PATH_CONTENT/images" ]; then
echo "Yes"
else
echo "No"
echo -n "Creating the images folder inside the content folder... "
mkdir "$ZM_PATH_CONTENT/images"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 6
fi
fi
# Check if the content/events folder exists, and if not, create it
echo -n "Checking if the events folder exists inside the content folder... "
if [ -d "$ZM_PATH_CONTENT/events" ]; then
echo "Yes"
else
echo "No"
echo -n "Creating the events folder inside the content folder... "
mkdir "$ZM_PATH_CONTENT/events"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 7
fi
fi
if [ -d "$ZM_PATH_WEB/images" ]; then
if [ -L "$ZM_PATH_WEB/images" ]; then
echo -n "Unlinking current symlink for the images folder... "
unlink "$ZM_PATH_WEB/images"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 35
fi
else
echo "Existing $ZM_PATH_WEB/images is not a symlink. Aborting to prevent data loss"
exit 10
fi
fi
if [ -d "$ZM_PATH_WEB/events" ]; then
if [ -L "$ZM_PATH_WEB/events" ]; then
echo -n "Unlinking current symlink for the events folder... "
unlink "$ZM_PATH_WEB/events"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 36
fi
else
echo "Existing $ZM_PATH_WEB/events is not a symlink. Aborting to prevent data loss"
exit 11
fi
fi
if [ -n "$LEGACY" ]; then
# Create the symlink for the images folder
echo -n "Creating the symlink for the images folder... "
ln -s -f "$ZM_PATH_CONTENT/images" "$ZM_PATH_WEB/images"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 15
fi
# Create the symlink for the events folder
echo -n "Creating the symlink for the events folder... "
ln -s -f "$ZM_PATH_CONTENT/events" "$ZM_PATH_WEB/events"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 16
fi
fi
# change ownership for the images folder. do it recursively unless -q is used
if [ -n "$QUICK" ]; then
echo -n "Changing ownership of the images folder to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_PATH_CONTENT/images"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 20
fi
else
echo -n "Changing ownership of the images folder recursively to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown -R ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_PATH_CONTENT/images"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 21
fi
fi
# change ownership for the events folder. do it recursively unless -q is used
if [ -n "$QUICK" ]; then
echo -n "Changing ownership of the events folder to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_PATH_CONTENT/events"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 23
fi
else
echo -n "Changing ownership of the events folder recursively to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown -R ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_PATH_CONTENT/events"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 24
fi
fi
# change ownership for the log folder. do it recursively unless -q is used
if [ -n "$QUICK" ]; then
echo -n "Changing ownership of the log folder to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_LOGDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 25
fi
else
echo -n "Changing ownership of the log folder recursively to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown -R ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_LOGDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 26
fi
fi
# change ownership for the temp folder. do it recursively unless -q is used
if [ -n "$QUICK" ]; then
echo -n "Changing ownership of the temp folder to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_TMPDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 27
fi
else
echo -n "Changing ownership of the temp folder recursively to ${ZM_WEB_USER} ${ZM_WEB_GROUP}... "
chown -R ${ZM_WEB_USER}:${ZM_WEB_GROUP} "$ZM_TMPDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 28
fi
fi
# Change directory permissions for the images folder
echo -n "Changing permissions of the images folder to 775... "
chmod 775 "$ZM_PATH_CONTENT/images"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 30
fi
# Change directory permissions for the events folder
echo -n "Changing permissions of the events folder to 775... "
chmod 775 "$ZM_PATH_CONTENT/events"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 31
fi
# Change directory permissions for the log folder
echo -n "Changing permissions of the log folder to 775... "
chmod 775 "$ZM_LOGDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 32
fi
# Change directory permissions for the temp folder
echo -n "Changing permissions of the temp folder to 775... "
chmod 775 "$ZM_TMPDIR"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 33
fi
# Link the CakePHP tmp folder to the zoneminder temp folder
echo -n "Linking CakePHP tmp folder to ${ZM_TMPDIR}... "
ln -sfT "$ZM_TMPDIR" "$ZM_PATH_WEB/api/app/tmp"
if [ "$?" = "0" ]; then
echo "OK"
else
echo "Failed"
exit 40
fi
echo ""
echo "All done"