From 70998ed98bd921ba6a708cf2256fefea87559e0d Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Wed, 1 Jun 2016 08:25:13 +0200 Subject: [PATCH] firmware: add locking layer --- Makefile | 1 + src/opnsense/scripts/firmware/hotfix.sh | 12 ++--- src/opnsense/scripts/firmware/install.sh | 5 -- src/opnsense/scripts/firmware/launcher.sh | 53 +++++++++++++++++++ src/opnsense/scripts/firmware/lock.sh | 5 -- src/opnsense/scripts/firmware/reinstall.sh | 5 -- src/opnsense/scripts/firmware/remove.sh | 5 -- src/opnsense/scripts/firmware/unlock.sh | 5 -- src/opnsense/scripts/firmware/upgrade.sh | 5 -- .../conf/actions.d/actions_firmware.conf | 24 ++++----- 10 files changed, 69 insertions(+), 51 deletions(-) create mode 100755 src/opnsense/scripts/firmware/launcher.sh diff --git a/Makefile b/Makefile index 4801b4037..3fef7b018 100644 --- a/Makefile +++ b/Makefile @@ -78,6 +78,7 @@ CORE_DEPENDS?= apinger \ filterdns \ filterlog \ ifinfo \ + flock \ flowd \ igmpproxy \ isc-dhcp43-client \ diff --git a/src/opnsense/scripts/firmware/hotfix.sh b/src/opnsense/scripts/firmware/hotfix.sh index b7521ef14..a5892091c 100755 --- a/src/opnsense/scripts/firmware/hotfix.sh +++ b/src/opnsense/scripts/firmware/hotfix.sh @@ -25,17 +25,11 @@ # POSSIBILITY OF SUCH DAMAGE. PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress -PATCHES=${1} - -# Check if another pkg process is already running -# (not strictly necessary, but we're modifying pkg files) -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi +PATCH=${1} # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} -echo "***GOT REQUEST TO HOTFIX: ${PATCHES}***" >> ${PKG_PROGRESS_FILE} -/usr/local/sbin/opnsense-patch ${PATCHES} >> ${PKG_PROGRESS_FILE} 2>&1 +echo "***GOT REQUEST TO HOTFIX: ${PATCH}***" >> ${PKG_PROGRESS_FILE} +/usr/local/sbin/opnsense-patch ${PATCH} >> ${PKG_PROGRESS_FILE} 2>&1 echo '***DONE***' >> ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/scripts/firmware/install.sh b/src/opnsense/scripts/firmware/install.sh index 7a499d268..1f3e0c992 100755 --- a/src/opnsense/scripts/firmware/install.sh +++ b/src/opnsense/scripts/firmware/install.sh @@ -28,11 +28,6 @@ PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress PACKAGE=$1 -# Check if another pkg process is already running -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi - # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/scripts/firmware/launcher.sh b/src/opnsense/scripts/firmware/launcher.sh new file mode 100755 index 000000000..2995ac9bb --- /dev/null +++ b/src/opnsense/scripts/firmware/launcher.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +# Copyright (C) 2016 Franco Fichtner +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +BASEDIR="/usr/local/opnsense/scripts/firmware" +LOCKFILE="/tmp/pkg_upgrade.progress" +FLOCK="/usr/local/bin/flock -n -o" +COMMANDS=" +hotfix +install +lock +reinstall +remove +unlock +upgrade +" + +SELECTED=${1} +ARGUMENT=${2} + +for COMMAND in ${COMMANDS}; do + if [ "${SELECTED}" != ${COMMAND} ]; then + continue + fi + + if [ -n "$(pgrep pkg)" ]; then + break + fi + + ${FLOCK} ${LOCKFILE} ${BASEDIR}/${COMMAND}.sh ${ARGUMENT} +done diff --git a/src/opnsense/scripts/firmware/lock.sh b/src/opnsense/scripts/firmware/lock.sh index 43f211ca6..8c20703a0 100755 --- a/src/opnsense/scripts/firmware/lock.sh +++ b/src/opnsense/scripts/firmware/lock.sh @@ -28,11 +28,6 @@ PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress PACKAGE=$1 -# Check if another pkg process is already running -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi - # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/scripts/firmware/reinstall.sh b/src/opnsense/scripts/firmware/reinstall.sh index 8008f537e..3c90d97ca 100755 --- a/src/opnsense/scripts/firmware/reinstall.sh +++ b/src/opnsense/scripts/firmware/reinstall.sh @@ -28,11 +28,6 @@ PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress PACKAGE=$1 -# Check if another pkg process is already running -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi - # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/scripts/firmware/remove.sh b/src/opnsense/scripts/firmware/remove.sh index c4cb1d7de..5aeace6aa 100755 --- a/src/opnsense/scripts/firmware/remove.sh +++ b/src/opnsense/scripts/firmware/remove.sh @@ -28,11 +28,6 @@ PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress PACKAGE=$1 -# Check if another pkg process is already running -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi - # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/scripts/firmware/unlock.sh b/src/opnsense/scripts/firmware/unlock.sh index 7d9af6ddc..ff2bcbf27 100755 --- a/src/opnsense/scripts/firmware/unlock.sh +++ b/src/opnsense/scripts/firmware/unlock.sh @@ -28,11 +28,6 @@ PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress PACKAGE=$1 -# Check if another pkg process is already running -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi - # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/scripts/firmware/upgrade.sh b/src/opnsense/scripts/firmware/upgrade.sh index 1ed9645fb..5ceaaed25 100755 --- a/src/opnsense/scripts/firmware/upgrade.sh +++ b/src/opnsense/scripts/firmware/upgrade.sh @@ -29,11 +29,6 @@ PKG_PROGRESS_FILE=/tmp/pkg_upgrade.progress PACKAGE=$1 REBOOT= -# Check if another pkg process is already running -if [ -n "$(pgrep pkg)" ]; then - exit 0 -fi - # Truncate upgrade progress file : > ${PKG_PROGRESS_FILE} diff --git a/src/opnsense/service/conf/actions.d/actions_firmware.conf b/src/opnsense/service/conf/actions.d/actions_firmware.conf index 634501ae5..0002e7b1f 100644 --- a/src/opnsense/service/conf/actions.d/actions_firmware.conf +++ b/src/opnsense/service/conf/actions.d/actions_firmware.conf @@ -5,41 +5,47 @@ type:script_output message:retrieve package status [upgrade] -command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/upgrade.sh +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh upgrade parameters:%s type:script message:upgrading %s [reinstall] -command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/reinstall.sh +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh reinstall parameters:%s type:script message: reinstalling firmware package %s [lock] -command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/lock.sh +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh lock parameters:%s type:script message: locking firmware package %s [unlock] -command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/unlock.sh +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh unlock parameters:%s type:script message: unlocking firmware package %s [install] -command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/install.sh +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh install parameters:%s type:script message: installing firmware package %s [remove] -command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/remove.sh +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh remove parameters:%s type:script message: remove firmware package %s +[hotfix] +command: /usr/sbin/daemon -f /usr/local/opnsense/scripts/firmware/launcher.sh hotfix +parameters:%s +type:script +message:issued firmware hotfix for %s + [status] command: /usr/bin/touch /tmp/pkg_upgrade.progress 2>&1; /bin/cat /tmp/pkg_upgrade.progress 2>&1 parameters: @@ -82,12 +88,6 @@ parameters: type:script message:issued firmware power off -[hotfix] -command:/usr/local/opnsense/scripts/firmware/hotfix.sh -parameters:%s -type:script -message:issued firmware hotfix for %s - [auto-update] command:/usr/local/etc/rc.firmware description:Automatic firmware update