From e6eb5c60f64da787944fe504cd2bfbbcd9424076 Mon Sep 17 00:00:00 2001 From: Jos Schellevis Date: Fri, 19 Dec 2014 13:59:01 +0000 Subject: [PATCH] Even more updates on upgrade checking.. now with configurable timeout --- src/opnsense/scripts/pkg_updatecheck.sh | 193 ++++++---- src/opnsense/scripts/pkg_updates.sh | 102 ----- .../widgets/system_information.widget.php | 2 +- .../system_information.widget.php.backup | 361 ------------------ 4 files changed, 117 insertions(+), 541 deletions(-) delete mode 100755 src/opnsense/scripts/pkg_updates.sh delete mode 100644 src/www/widgets/widgets/system_information.widget.php.backup diff --git a/src/opnsense/scripts/pkg_updatecheck.sh b/src/opnsense/scripts/pkg_updatecheck.sh index 8fd2c479e..768d0edec 100755 --- a/src/opnsense/scripts/pkg_updatecheck.sh +++ b/src/opnsense/scripts/pkg_updatecheck.sh @@ -33,7 +33,7 @@ # repository: error|ok # last_ckeck: # updates: <#num_of_updates> -# core_version: current| +# core_version: unknown| # download_size: none| # extra_space_required: none| # new_packages: array with { name: , version: } @@ -55,6 +55,8 @@ required_space="none" download_size="none" itemcount=0 linecount=0 +timer=0 +timeout=30 # Wait for a maximum number of seconds to determine connection issues # File location variables package_json_output="/tmp/pkg_status.json" @@ -62,101 +64,138 @@ tmp_pkg_output_file="/tmp/packages.output" tmp_pkg_update_file="/tmp/pkg_updates.output" # Check if pkg is already runnig -pkg_running=`ps | grep "pkg " | grep -v "grep"` +pkg_running=`ps -x | grep "pkg " | grep -v "grep"` if [ "$pkg_running" == "" ]; then # start pkg update - pkg update -f > $tmp_pkg_update_file 2>&1 & - pid=$! - # wait for defined number of seconds for connection - sleep 8 - # check if pkg is done, if not we have a connection issue - pkg_running=`ps | grep $pid | grep -v "grep"` - if [ "$pkg_running" == "" ]; then + pkg update -f > $tmp_pkg_update_file & + pkg_running="started" # Set running state to arbitrary value + timer=$timeout # Reset our timer + + # Timeout loop for pkg update -f + while [ "$pkg_running" != "" ] && [ $timer -ne 0 ]; + do + sleep 1 # wait for 1 second + pkg_running=`ps -x | grep "pkg " | grep -v "grep"` + timer=`echo $timer - 1 | bc` + done + + ## check if timeout is not reached + if [ $timer -gt 0 ] ; then # Connection is ok connection="ok" - repo_ok=`cat $tmp_pkg_update_file | grep 'Unable to update repository'` - if [ "$repo_ok" == "" ]; then - # Repository can be used for updates - repository="ok" - # Now check if there are upgrades - pkg upgrade -n > $tmp_pkg_output_file - updates=`cat $tmp_pkg_output_file | grep 'The following' | awk -F '[ ]' '{print $3}'` - if [ "$updates" == "" ]; then - # There are no updates - updates="0" - else - core_version=`cat $tmp_pkg_output_file | grep 'opnsense:' | awk -F '[ ]' '{print $4}'` # Not really needed but usefull for fast version check - required_space=`cat $tmp_pkg_output_file | grep 'The process will require' | awk -F '[ ]' '{print $5$6}'` - if [ "$required_space" == "" ]; then - required_space="none" - fi - download_size=`cat $tmp_pkg_output_file | grep 'to be downloaded' | awk -F '[ ]' '{print $1$2}'` - if [ "$download_size" == "" ]; then - download_size="none" - fi - # First check if there are new packages that need to be installed - for i in $(cat $tmp_pkg_output_file); do - if [ "$itemcount" -gt "$linecount" ]; then - if [ `echo $linecount + 2 | bc` -eq "$itemcount" ]; then - if [ "`echo $i | grep ':'`" == "" ]; then - itemcount=0 # This is not a valid item so reset item count - else - #echo "name:$i" - if [ "$packages_new" == "" ]; then - packages_new=$packages_new"{\"name\":\"$i\"," # If it is the first item then we do not want a seperator - else - packages_new=$packages_new", {\"name\":\"$i\"," - fi - fi - fi - if [ `echo $linecount + 1 | bc` -eq "$itemcount" ]; then - packages_new=$packages_new"\"version\":\"$i\"}" - itemcount=`echo $itemcount + 2 | bc` # Get ready for next item - fi - fi - linecount=`echo $linecount + 1 | bc` - if [ "$i" == "INSTALLED:" ]; then - itemcount=`echo $linecount + 2 | bc` - fi - done + # Now check if there are upgrades + pkg upgrade -n > $tmp_pkg_output_file & + # Reset timer before getting upgrade info + timer=$timeout # Reset our timer + pkg_running="started" # Set running state to arbitrary value - # Now check if there are upgrades to install - for i in $(cat $tmp_pkg_output_file); do - if [ "$itemcount" -gt "$linecount" ]; then - if [ `echo $linecount + 4 | bc` -eq "$itemcount" ]; then - if [ "`echo $i | grep ':'`" == "" ]; then - itemcount=0 # This is not a valid item so reset item count - else - if [ "$packages_upgraded" == "" ]; then - packages_upgraded=$packages_upgraded"{\"name\":\"$i\"," # If it is the first item then we do not want a seperator + # Timeout loop for pkg upgrade -n + while [ "$pkg_running" != "" ] && [ $timer -ne 0 ]; + do + sleep 1 # wait for 1 second + #pkg_running=`ps | grep 'pkg update -f' | grep -v 'grep' | tail -n 1 | awk -F '[ ]' '{print $1}'` + pkg_running=`ps -x | grep "pkg " | grep -v "grep"` + timer=`echo $timer - 1 | bc` + done + + ## check if timeout is not reached + if [ $timer -gt 0 ] ; then + # Check for additional repository errors + repo_ok=`cat $tmp_pkg_output_file | grep 'Unable to update repository'` + if [ "$repo_ok" == "" ]; then + # Repository can be used for updates + repository="ok" + updates=`cat $tmp_pkg_output_file | grep 'The following' | awk -F '[ ]' '{print $3}'` + if [ "$updates" == "" ]; then + # There are no updates + updates="0" + else + core_version=`pkg info opnsense | grep 'Version' | awk -F '[:]' '{print $2}'` # Changed to reflect current installed core version + required_space=`cat $tmp_pkg_output_file | grep 'The process will require' | awk -F '[ ]' '{print $5$6}'` + if [ "$required_space" == "" ]; then + required_space="none" + fi + download_size=`cat $tmp_pkg_output_file | grep 'to be downloaded' | awk -F '[ ]' '{print $1$2}'` + if [ "$download_size" == "" ]; then + download_size="none" + fi + # First check if there are new packages that need to be installed + for i in $(cat $tmp_pkg_output_file); do + if [ "$itemcount" -gt "$linecount" ]; then + if [ `echo $linecount + 2 | bc` -eq "$itemcount" ]; then + if [ "`echo $i | grep ':'`" == "" ]; then + itemcount=0 # This is not a valid item so reset item count else - packages_upgraded=$packages_upgraded", {\"name\":\"$i\"," + #echo "name:$i" + if [ "$packages_new" == "" ]; then + packages_new=$packages_new"{\"name\":\"$i\"," # If it is the first item then we do not want a seperator + else + packages_new=$packages_new", {\"name\":\"$i\"," + fi fi fi + if [ `echo $linecount + 1 | bc` -eq "$itemcount" ]; then + packages_new=$packages_new"\"version\":\"$i\"}" + itemcount=`echo $itemcount + 2 | bc` # Get ready for next item + fi fi - if [ `echo $linecount + 3 | bc` -eq "$itemcount" ]; then - packages_upgraded=$packages_upgraded"\"current_version\":\"$i\"," + linecount=`echo $linecount + 1 | bc` + if [ "$i" == "INSTALLED:" ]; then + itemcount=`echo $linecount + 2 | bc` fi - if [ `echo $linecount + 1 | bc` -eq "$itemcount" ]; then - packages_upgraded=$packages_upgraded"\"new_version\":\"$i\"}" - itemcount=`echo $itemcount + 4 | bc` # Get ready for next item + done + + # Now check if there are upgrades to install + for i in $(cat $tmp_pkg_output_file); do + if [ "$itemcount" -gt "$linecount" ]; then + if [ `echo $linecount + 4 | bc` -eq "$itemcount" ]; then + if [ "`echo $i | grep ':'`" == "" ]; then + itemcount=0 # This is not a valid item so reset item count + else + if [ "$packages_upgraded" == "" ]; then + packages_upgraded=$packages_upgraded"{\"name\":\"$i\"," # If it is the first item then we do not want a seperator + else + packages_upgraded=$packages_upgraded", {\"name\":\"$i\"," + fi + fi + fi + if [ `echo $linecount + 3 | bc` -eq "$itemcount" ]; then + packages_upgraded=$packages_upgraded"\"current_version\":\"$i\"," + fi + if [ `echo $linecount + 1 | bc` -eq "$itemcount" ]; then + packages_upgraded=$packages_upgraded"\"new_version\":\"$i\"}" + itemcount=`echo $itemcount + 4 | bc` # Get ready for next item + fi fi + linecount=`echo $linecount + 1 | bc` + if [ "$i" == "UPGRADED:" ]; then + itemcount=`echo $linecount + 4 | bc` + fi + done + if [ "$core_version" == "" ]; then + core_version="unknown" fi - linecount=`echo $linecount + 1 | bc` - if [ "$i" == "UPGRADED:" ]; then - itemcount=`echo $linecount + 4 | bc` - fi - done - if [ "$core_version" == "" ]; then - core_version="current" fi fi + else + # We have an connection issue and could not reach the pkg repository in timely fashion + # Kill all running pkg instances + pkg_running=`ps -x | grep "pkg " | grep -v "grep"` + if [ "$pkg_running" != "" ]; then + killall pkg + fi fi else # We have an connection issue and could not reach the pkg repository in timely fashion - killall pkg + # Kill all running pkg instances + pkg_running=`ps -x | grep "pkg " | grep -v "grep"` + if [ "$pkg_running" != "" ]; then + killall pkg + fi fi + # Get date/timestamp last_check=`date` + # Write our json structure to disk echo "{\"connection\":\"$connection\",\"repository\":\"$repository\",\"last_check\":\"$last_check\",\"updates\":\"$updates\",\"core_version\":\"$core_version\",\"download_size\":\"$download_size\",\"extra_space_required\":\"$required_space\",\"new_packages\":[$packages_new],\"upgrade_packages\":[$packages_upgraded]}" > $package_json_output else # pkg is already running, quitting diff --git a/src/opnsense/scripts/pkg_updates.sh b/src/opnsense/scripts/pkg_updates.sh deleted file mode 100755 index b580dc532..000000000 --- a/src/opnsense/scripts/pkg_updates.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2014 Deciso B.V. -# 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. - - -# USAGE: -# Add this file to a CRON job to check for pakcage updates regularly -# -# It generates different files to reflect repository/packages state -# /tmp/pkg_updates.output -> Output of pkg update -# /tmp/pkg_connection_issue -> Empty file to signal a connection issue -# /tmp/pkg_repository.error -> Empty file to signal a repository error -# /tmp/pkg_upgrades.output -> Output of pkg upgrade -n -# /tmp/pkg_updates.available -> File with content the number of upgrades or new installs -# /tmp/pkg_core_update.available -> File with content the new OPNsense version number -# /tmp/pkg_last.check -> Write date of last check to file - - -pkg_running="" -# Check if pkg is already runnig -pkg_running=`ps | grep "pkg " | grep -v "grep"` -if [ "$pkg_running" == "" ]; then - # start pkg update - pkg update -f > /tmp/pkg_updates.output 2>&1 & - pid=$! - # wait for defined number of seconds for connection - sleep 8 - # write date time stamp to disk - echo `date` > /tmp/pkg_last.check - # check if pkg is done, if not we have a connection issue - pkg_running=`ps | grep $pid | grep -v "grep"` - if [ "$pkg_running" == "" ]; then - # Connection is ok - # Lets cleanup old connection errors - if [ -f /tmp/pkg_connection_issue ]; then - rm /tmp/pkg_connection_issue - fi - repo_ok=`cat /tmp/pkg_updates.output | grep 'Unable to update repository'` - if [ "$repo_ok" == "" ]; then - # Repository can be used for updates - # Check if earlier attemps left repository error file - if [ -f /tmp/pkg_repository.error ]; then - # Remove previous error file - rm /tmp/pkg_repository.error - fi - # Now check if there are upgrades - pkg upgrade -n > /tmp/pkg_upgrades.output - updates=`cat /tmp/pkg_upgrades.output | grep 'The following' | awk -F '[ ]' '{print $3}'` - if [ "$updates" == "" ]; then - # There are no updates - # Lets remove any leftover update files - if [ -f /tmp/pkg_updates.available ]; then - rm /tmp/pkg_updates.available - fi - else - echo $updates > /tmp/pkg_updates.available - opnsense_core_update=`cat /tmp/pkg_upgrades.output | grep 'opnsense:' | awk -F '[ ]' '{print $4}'` - if [ "$opnsense_core_update" == "" ]; then - # There is no update - # Lets cleanup leftovers - if [ -f /tmp/pkg_core_update.available] ]; then - rm /tmp/pkg_core_update.available - fi - else - echo $opnse_core_update > /tmp/pkg_core_update.available - fi - fi - else - # There is an issue with the repository - # lets let other process know - touch /tmp/pkg_repository.error - fi - else - # We have an connection issue and can reach the pkg repository in timely fashion - touch /tmp/pkg_connection_issue - killall pkg - fi -else - # pkg is already running, quitting -fi diff --git a/src/www/widgets/widgets/system_information.widget.php b/src/www/widgets/widgets/system_information.widget.php index 15285217b..b17c9a7e0 100644 --- a/src/www/widgets/widgets/system_information.widget.php +++ b/src/www/widgets/widgets/system_information.widget.php @@ -55,7 +55,7 @@ if($_REQUEST['getupdatestatus']) { $pkg_status = json_decode($json,true); if ($pkg_status["updates"]=="0") { - echo "Last check at (".$pkg_status["last_check"]."), you where up to date"; + echo "Last check at (".$pkg_status["last_check"]."), you were up to date"; } else { echo "A total of ".$pkg_status["updates"]." update(s) are available."; } diff --git a/src/www/widgets/widgets/system_information.widget.php.backup b/src/www/widgets/widgets/system_information.widget.php.backup deleted file mode 100644 index cdcb6bdf9..000000000 --- a/src/www/widgets/widgets/system_information.widget.php.backup +++ /dev/null @@ -1,361 +0,0 @@ -, Manuel Kasper - and Jonathan Watt . - 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. -*/ - -require_once("functions.inc"); -require_once("guiconfig.inc"); -require_once('notices.inc'); -include_once("includes/functions.inc.php"); -require_once("script/load_phalcon.php"); - -/* Check for updates on /tmp/pkg_* files, generated by */ -$file_connection="/tmp/pkg_connection_issue"; -$file_repository="/tmp/pkg_repository.error"; -$file_updates="/tmp/pkg_updates.available"; -$file_newcore_version="/tmp/pkg_core_update.available"; -$file_last_check="/tmp/pkg_last.check"; -$update_text="(update in 10 seconds)"; - - -if($_POST['action'] == 'call_this') { - /* Setup Shell variables */ - $shell_output = array(); - $shell = new Core\Shell(); - // execute shell command and collect (only valid) info into named array - if ($shell->exec("/usr/local/opnsense/scripts/pkg_updates.sh&",false,false,$shell_output) == 0 ) - { - // Aplication done - } -} - - -if($_REQUEST['getupdatestatus']) { - if (file_exists($file_connection)) { - /* There is an connection issue, repository can not be reached */ - $update_text="
Connection error
Click to retry now"; - } elseif (file_exists($file_repository)) { - /* The repository is not corect */ - $update_text="
Repository error
Click to retry now"; - } elseif (file_exists($file_updates)) { - /* There are updates available */ - $updates=file_get_contents($file_updates); - $update_text="
There are ".$updates." update(s) available
Click to update "; - } elseif (file_exists($file_last_check)) { - $last_check=file_get_contents($file_last_check); - $update_text="
No updates found (checked once a day)
last time on: ".$last_check."
Click to check now" ; - } else { - $update_text="
Daily cron has not yet run
Click here to try now"; - } - echo $update_text; - exit; -} - -$curcfg = $config['system']['firmware']; - -$filesystems = get_mounted_filesystems(); - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - () - -
-
- -
- Updates - -
- -
- - -
- / - -

Next Boot:
- / - -
- -
- 1): ?> -
- CPUs:
- -
-
-
- "; - } - ?> -
- -
-
- -
-
- - () -
- -
- - -
-
- -
-
- () -
- - -
-
- -
-
- -
-
-
- -
-
- -
-
- (Updating in 10 seconds) -
- -
-
- -
-
- of MB -
- -
-
- -
-
- of MB -
- - -
-
- -
-
- - : of -
- -
-