summaryrefslogtreecommitdiff
path: root/src/etc
diff options
context:
space:
mode:
authorzsdc <taras@vyos.io>2021-04-20 16:22:16 +0300
committerzsdc <taras@vyos.io>2021-04-20 16:22:16 +0300
commit01158a8eaa574c48c726c20693479e4aa6e18ee6 (patch)
treecb2d519ccdd0ea8ec3459c315ded59ff8912a6b4 /src/etc
parente2f17d332436e434ac72187557b0534c4f39c6f6 (diff)
downloadvyos-1x-01158a8eaa574c48c726c20693479e4aa6e18ee6.tar.gz
vyos-1x-01158a8eaa574c48c726c20693479e4aa6e18ee6.zip
dhclient: T3471: Fixed process search for IPv4
Some software starts dhclient without IP protocol flag (`-4`, `-6`), this commit adds the ability to find such processes as well as with a protocol flag. Additionally, to handle rare situations when PID file may not exists (most likely, when multiple dhclient processes started with the same PID file path), added last-resort action to kill such dhclients.
Diffstat (limited to 'src/etc')
-rw-r--r--src/etc/dhcp/dhclient-enter-hooks.d/02-vyos-stopdhclient23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/etc/dhcp/dhclient-enter-hooks.d/02-vyos-stopdhclient b/src/etc/dhcp/dhclient-enter-hooks.d/02-vyos-stopdhclient
index 939055a63..f737148dc 100644
--- a/src/etc/dhcp/dhclient-enter-hooks.d/02-vyos-stopdhclient
+++ b/src/etc/dhcp/dhclient-enter-hooks.d/02-vyos-stopdhclient
@@ -2,26 +2,35 @@
if [ -z ${CONTROLLED_STOP} ] ; then
# stop dhclient for this interface, if it is not current one
# get PID for current dhclient
- current_dhclient=`ps --no-headers --format ppid --pid $$ | awk '{ print $1 }'`
+ current_dhclient=`ps --no-headers --format ppid --pid $$ | awk '{ print \$1 }'`
# get PID for master process (current can be a fork)
- master_dhclient=`ps --no-headers --format ppid --pid $current_dhclient | awk '{ print $1 }'`
+ master_dhclient=`ps --no-headers --format ppid --pid $current_dhclient | awk '{ print \$1 }'`
# get IP version for current dhclient
- ipversion_arg=`ps --no-headers --format args --pid $current_dhclient | awk '{ print $2 }'`
+ ipversion_arg=`ps --no-headers --format args --pid $current_dhclient | awk 'match(\$0, /\s-(4|6)\s/, IPV) { printf("%s", IPV[1]) }'`
# get list of all dhclient running for current interface
- dhclients_pids=(`pgrep -f "dhclient $ipversion_arg.* $interface(\s|$)"`)
+ if [[ $ipversion_arg == "6" ]]; then
+ dhclients_pids=(`pgrep -f "dhclient.*\s-6\s.*\s$interface(\s|$)"`)
+ else
+ dhclients_pids=(`ps --no-headers --format pid,args -C dhclient | awk "{ if(match(\\$0, /\s${interface}(\s|$)/) && !match(\\$0, /\s-6\s/)) printf(\"%s\n\", \\$1) }"`)
+ fi
logmsg info "Current dhclient PID: $current_dhclient, Parent PID: $master_dhclient, IP version: $ipversion_arg, All dhclients for interface $interface: ${dhclients_pids[@]}"
# stop all dhclients for current interface, except current one
for dhclient in ${dhclients_pids[@]}; do
if ([ $dhclient -ne $current_dhclient ] && [ $dhclient -ne $master_dhclient ]); then
- logmsg info "Stopping dhclient with PID: ${dhclient}"
# get path to PID-file of dhclient process
- local dhclient_pidfile=`ps --no-headers --format args --pid $dhclient | awk 'match($0, ".*-pf (/.*pid) .*", PF) { print PF[1] }'`
+ local dhclient_pidfile=`ps --no-headers --format args --pid $dhclient | awk 'match(\$0, ".*-pf (/.*pid) .*", PF) { print PF[1] }'`
# stop dhclient with native command - this will run dhclient-script with correct reason unlike simple kill
- dhclient -e CONTROLLED_STOP=yes -x -pf $dhclient_pidfile
+ logmsg info "Stopping dhclient with PID: ${dhclient}, PID file: $dhclient_pidfile"
+ if [[ -e $dhclient_pidfile ]]; then
+ dhclient -e CONTROLLED_STOP=yes -x -pf $dhclient_pidfile
+ else
+ logmsg error "PID file $dhclient_pidfile does not exists, killing dhclient with SIGTERM signal"
+ kill -s 15 ${dhclient}
+ fi
fi
done
fi