6
6
7
7
set -u
8
8
9
- ERROR_TAR_FAILED=5
10
- ERROR_PROCFS_SAVE_FAILED=6
11
- ERROR_INVALID_ARGUMENT=10
9
+ EXT_SUCCESS=0
10
+ EXT_GENERAL=1
11
+ EXT_LOCKFAIL=2
12
+ EXT_RECVSIG=3
13
+ EXT_RETRY=4
14
+ EXT_TAR_FAILED=5
15
+ EXT_PROCFS_SAVE_FAILED=6
16
+ EXT_INVALID_ARGUMENT=10
12
17
13
18
TAR=tar
14
19
MKDIR=mkdir
@@ -39,21 +44,38 @@ USER=${USER:-root}
39
44
TIMEOUT_MIN=" 5"
40
45
SKIP_BCMCMD=0
41
46
SAVE_STDERR=true
42
- RETURN_CODE=0
47
+ RETURN_CODE=$EXT_SUCCESS
43
48
DEBUG_DUMP=false
44
49
50
+ # lock dirs/files
51
+ LOCKDIR=" /tmp/techsupport-lock"
52
+ PIDFILE=" ${LOCKDIR} /PID"
53
+
54
+ # Remove lock directory and exit, let user decide if they want to retry
55
+ rm_lock_and_exit ()
56
+ {
57
+ $RM $V -rf ${LOCKDIR}
58
+ exit $EXT_RETRY
59
+ }
60
+
61
+ handle_exit ()
62
+ {
63
+ ECODE=$?
64
+ echo " Removing lock. Exit: $ECODE " >&2
65
+ $RM $V -rf ${LOCKDIR}
66
+ }
67
+
45
68
handle_signal ()
46
69
{
47
70
echo " Generate Dump received interrupt" >&2
48
71
$RM $V -rf $TARDIR
49
- exit 1
72
+ exit $EXT_RECVSIG
50
73
}
51
- trap ' handle_signal' SIGINT
52
74
53
75
handle_error () {
54
76
if [ " $1 " != " 0" ]; then
55
77
echo " ERR: RC:-$1 observed on line $2 " >&2
56
- RETURN_CODE=1
78
+ RETURN_CODE=$EXT_GENERAL
57
79
fi
58
80
}
59
81
@@ -103,7 +125,7 @@ save_bcmcmd() {
103
125
filepath=" ${filepath} .gz"
104
126
fi
105
127
($TAR $V -rhf $TARFILE -C $DUMPDIR " $tarpath " \
106
- || abort " ${ERROR_TAR_FAILED } " " tar append operation failed. Aborting to prevent data loss." ) \
128
+ || abort " ${EXT_TAR_FAILED } " " tar append operation failed. Aborting to prevent data loss." ) \
107
129
&& $RM $V -rf " $filepath "
108
130
end_t=$( date +%s%3N)
109
131
echo " [ save_bcmcmd:$cmd ] : $(( $end_t - $start_t )) msec" >> $TECHSUPPORT_TIME_INFO
@@ -213,7 +235,7 @@ save_cmd() {
213
235
fi
214
236
215
237
($TAR $V -rhf $TARFILE -C $DUMPDIR " $tarpath " \
216
- || abort " ${ERROR_TAR_FAILED } " " tar append operation failed. Aborting to prevent data loss." ) \
238
+ || abort " ${EXT_TAR_FAILED } " " tar append operation failed. Aborting to prevent data loss." ) \
217
239
&& $RM $V -rf " $filepath "
218
240
end_t=$( date +%s%3N)
219
241
echo " [ save_cmd:$cmd ] : $(( $end_t - $start_t )) msec" >> $TECHSUPPORT_TIME_INFO
@@ -766,7 +788,7 @@ save_file() {
766
788
767
789
if $do_tar_append ; then
768
790
($TAR $V -rhf $TARFILE -C $DUMPDIR " $tar_path " \
769
- || abort " ${ERROR_PROCFS_SAVE_FAILED } " " tar append operation failed. Aborting to prevent data loss." ) \
791
+ || abort " ${EXT_PROCFS_SAVE_FAILED } " " tar append operation failed. Aborting to prevent data loss." ) \
770
792
&& $RM $V -f " $gz_path "
771
793
fi
772
794
end_t=$( date +%s%3N)
@@ -975,7 +997,7 @@ save_log_files() {
975
997
976
998
# Append the log folder to the main tarball
977
999
($TAR $V -rhf $TARFILE -C $DUMPDIR ${BASE} /log \
978
- || abort " ${ERROR_TAR_FAILED } " " tar append operation failed. Aborting for safety" ) \
1000
+ || abort " ${EXT_TAR_FAILED } " " tar append operation failed. Aborting for safety" ) \
979
1001
&& $RM $V -rf $TARDIR /log
980
1002
end_t=$( date +%s%3N)
981
1003
echo " [ TAR /var/log Files ] : $(( $end_t - $start_t )) msec" >> $TECHSUPPORT_TIME_INFO
@@ -1004,7 +1026,7 @@ save_warmboot_files() {
1004
1026
1005
1027
($TAR $V --warning=no-file-removed -rhf $TARFILE -C $DUMPDIR --mode=+rw \
1006
1028
$BASE /warmboot \
1007
- || abort " ${ERROR_TAR_FAILED } " " Tar append operation failed. Aborting for safety." ) \
1029
+ || abort " ${EXT_TAR_FAILED } " " Tar append operation failed. Aborting for safety." ) \
1008
1030
&& $RM $V -rf $TARDIR
1009
1031
fi
1010
1032
end_t=$( date +%s%3N)
@@ -1144,11 +1166,6 @@ main() {
1144
1166
trap ' handle_error $? $LINENO' ERR
1145
1167
local start_t=0
1146
1168
local end_t=0
1147
- if [ ` whoami` != root ] && ! $NOOP ;
1148
- then
1149
- echo " $0 : must be run as root (or in sudo)" >&2
1150
- exit 10
1151
- fi
1152
1169
NUM_ASICS=$( get_asic_count)
1153
1170
${CMD_PREFIX} renice +5 -p $$ >> /dev/null
1154
1171
${CMD_PREFIX} ionice -c 2 -n 5 -p $$ >> /dev/null
@@ -1174,7 +1191,7 @@ main() {
1174
1191
/proc/softirqs /proc/stat /proc/swaps /proc/sysvipc /proc/timer_list \
1175
1192
/proc/uptime /proc/version /proc/vmallocinfo /proc/vmstat \
1176
1193
/proc/zoneinfo \
1177
- || abort " ${ERROR_PROCFS_SAVE_FAILED } " " Proc saving operation failed. Aborting for safety."
1194
+ || abort " ${EXT_PROCFS_SAVE_FAILED } " " Proc saving operation failed. Aborting for safety."
1178
1195
end_t=$( date +%s%3N)
1179
1196
echo " [ Capture Proc State ] : $(( $end_t - $start_t )) msec" >> $TECHSUPPORT_TIME_INFO
1180
1197
@@ -1307,7 +1324,7 @@ main() {
1307
1324
--exclude=" */etc/ssl/certs/*" \
1308
1325
--exclude=" */etc/ssl/private/*" \
1309
1326
$BASE /etc \
1310
- || abort " ${ERROR_TAR_FAILED } " " Tar append operation failed. Aborting for safety." ) \
1327
+ || abort " ${EXT_TAR_FAILED } " " Tar append operation failed. Aborting for safety." ) \
1311
1328
&& $RM $V -rf $TARDIR
1312
1329
end_t=$( date +%s%3N)
1313
1330
echo " [ TAR /etc Files ] : $(( $end_t - $start_t )) msec" >> $TECHSUPPORT_TIME_INFO
@@ -1473,7 +1490,7 @@ while getopts ":xnvhzas:t:r:d" opt; do
1473
1490
;;
1474
1491
h)
1475
1492
usage
1476
- exit 0
1493
+ exit $EXT_SUCCESS
1477
1494
;;
1478
1495
v)
1479
1496
# echo commands about to be run to stderr
@@ -1501,7 +1518,7 @@ while getopts ":xnvhzas:t:r:d" opt; do
1501
1518
s)
1502
1519
SINCE_DATE=" ${OPTARG} "
1503
1520
# validate date expression
1504
- date --date=" ${SINCE_DATE} " & > /dev/null || abort " ${ERROR_INVALID_ARGUMENT } " " Invalid date expression passed: '${SINCE_DATE} '"
1521
+ date --date=" ${SINCE_DATE} " & > /dev/null || abort " ${EXT_INVALID_ARGUMENT } " " Invalid date expression passed: '${SINCE_DATE} '"
1505
1522
;;
1506
1523
t)
1507
1524
TIMEOUT_MIN=" ${OPTARG} "
@@ -1514,9 +1531,47 @@ while getopts ":xnvhzas:t:r:d" opt; do
1514
1531
;;
1515
1532
/? )
1516
1533
echo " Invalid option: -$OPTARG " >&2
1517
- exit 1
1534
+ exit $EXT_GENERAL
1518
1535
;;
1519
1536
esac
1520
1537
done
1521
1538
1522
- main
1539
+ # Check permissions before proceeding further
1540
+ if [ ` whoami` != root ] && ! $NOOP ;
1541
+ then
1542
+ echo " $0 : must be run as root (or in sudo)" >&2
1543
+ exit $EXT_INVALID_ARGUMENT
1544
+ fi
1545
+
1546
+ # #
1547
+ # # Attempt Locking
1548
+ # #
1549
+
1550
+ if mkdir " ${LOCKDIR} " & > /dev/null; then
1551
+ trap ' handle_exit' EXIT
1552
+ echo " $$ " > " ${PIDFILE} "
1553
+ # This handler will exit the script upon receiving these interrupts
1554
+ # Trap configured on EXIT will be triggered by the exit from handle_signal function
1555
+ trap ' handle_signal' SIGINT SIGHUP SIGQUIT SIGTERM
1556
+ echo " Lock succesfully accquired and installed signal handlers"
1557
+ # Proceed with the actual code
1558
+ main
1559
+ else
1560
+ # lock failed, check if the other PID is alive
1561
+ PID_PROG=" $( cat " ${PIDFILE} " ) "
1562
+
1563
+ if [ $? != 0 ]; then
1564
+ # Another instance is probably about to remove the lock or PIDfile doesn't exist
1565
+ rm_lock_and_exit
1566
+ fi
1567
+
1568
+ if ! kill -0 $PID_PROG & > /dev/null; then
1569
+ # Lock is stale
1570
+ echo " Removing stale lock of nonexistant PID ${PID_PROG} "
1571
+ rm_lock_and_exit
1572
+ else
1573
+ # Lock is valid and the other instance is active. Exit Now
1574
+ echo " Accquiring lock failed, PID ${PID_PROG} is active" >&2
1575
+ exit $EXT_LOCKFAIL
1576
+ fi
1577
+ fi
0 commit comments