firmware: assorted changes for #4500

o Do not load the text changelog for the GUI as it is unused
o Rename product_name to product_id for consistency
o Always hint at product_target so correct changelog is displayed
o Rename type to target for consistency
o Add distinguishable labels to changelog view actions
o Return JSON when argument is given for easier debug
This commit is contained in:
Franco Fichtner 2021-02-14 13:47:24 +01:00
parent a4f48f7a91
commit 88aa77ecda
4 changed files with 42 additions and 46 deletions

View File

@ -88,14 +88,14 @@ class FirmwareController extends ApiControllerBase
public function statusAction()
{
$backend = new Backend();
$type = null;
$target = null;
$response = json_decode(trim($backend->configdRun('firmware product')), true);
if ($response != null && $response['product_check'] != null) {
$response = $response['product_check'];
if (!empty($response['check_package']) && $response['product_name'] != $response['check_package']) {
$type = $response['check_package'];
if ($response['product_id'] != $response['product_target']) {
$target = $response['product_target'];
}
$packages_size = !empty($response['download_size']) ? $response['download_size'] : 0;
@ -224,14 +224,14 @@ class FirmwareController extends ApiControllerBase
} elseif (array_key_exists('repository', $response) && $response['repository'] == 'unsigned') {
$response['status_msg'] = gettext('The repository has no fingerprint.');
$response['status'] = 'error';
} elseif (array_key_exists('repository', $response) && $response['repository'] == 'incomplete' && !empty($type)) {
$response['status_msg'] = sprintf(gettext('The package "%s" is not available on this repository.'), $type);
} elseif (array_key_exists('repository', $response) && $response['repository'] == 'incomplete' && !empty($target)) {
$response['status_msg'] = sprintf(gettext('The package "%s" is not available on this repository.'), $target);
$response['status'] = 'error';
} elseif (array_key_exists('repository', $response) && $response['repository'] != 'ok') {
$response['status_msg'] = gettext('Could not find the repository on the selected mirror.');
$response['status'] = 'error';
} elseif (array_key_exists('updates', $response) && $response['updates'] != 0) {
if (!empty($type)) {
if (!empty($target)) {
$response['status_msg'] = gettext('The release type requires an update.');
$response['status_upgrade_action'] = 'rel';
$response['status'] = 'ok';
@ -302,11 +302,7 @@ class FirmwareController extends ApiControllerBase
if ($version == 'update') {
$backend->configdRun('firmware changelog fetch');
} else {
$text = trim($backend->configdRun(sprintf('firmware changelog text %s', $version)));
$html = trim($backend->configdRun(sprintf('firmware changelog html %s', $version)));
if (!empty($text)) {
$response['text'] = $text;
}
if (!empty($html)) {
$response['html'] = $html;
}
@ -746,12 +742,12 @@ class FirmwareController extends ApiControllerBase
$response = array();
$version = explode(' ', trim(shell_exec('opnsense-version -nv')));
foreach (array('product_name' => 0, 'product_version' => 1) as $result => $index) {
foreach (array('product_id' => 0, 'product_version' => 1) as $result => $index) {
$response[$result] = !empty($version[$index]) ? $version[$index] : 'unknown';
}
/* allows us to select UI features based on product state */
$devel = explode('-', $response['product_name']);
$devel = explode('-', $response['product_id']);
$devel = count($devel) == 2 ? $devel[1] == 'devel' : false;
/* need both remote and local, create array earlier */

View File

@ -88,7 +88,7 @@
'<td>'+row['repository']+'</td><td>'+row['old']+'</td><td>' +
row['new']+'</td><td>'+row['reason'] + '</td></tr>');
if (row['name'] == data['product_name'] && row['new'] != 'N/A') {
if (row['name'] == data['product_target'] && row['new'] != 'N/A') {
$.upgrade_show_log = row['new'].replace(/[_-].*/, '');
}
});

View File

@ -38,6 +38,7 @@
# upgrade_packages: array with { name: <package_name>, current_version: <current_version>, new_version: <new_version> }
JSONFILE="/tmp/pkg_upgrade.json"
JSONRETURN=${1}
LOCKFILE="/tmp/pkg_upgrade.progress"
OUTFILE="/tmp/pkg_update.out"
TEE="/usr/bin/tee -a"
@ -60,29 +61,22 @@ repository="error"
updates=""
upgrade_needs_reboot="0"
product_name=$(opnsense-version -n)
product_version=$(opnsense-version -v)
os_version=$(uname -sr)
last_check=$(date)
SUFFIX="-$(pluginctl -g system.firmware.type)"
if [ "${SUFFIX}" = "-" ]; then
SUFFIX=
product_suffix="-$(pluginctl -g system.firmware.type)"
if [ "${product_suffix}" = "-" ]; then
product_suffix=
fi
PACKAGE=opnsense${SUFFIX}
last_check=$(date)
os_version=$(uname -sr)
product_id=$(opnsense-version -n)
product_target=opnsense${product_suffix}
product_version=$(opnsense-version -v)
echo "***GOT REQUEST TO CHECK FOR UPDATES***" >> ${LOCKFILE}
echo -n "Fetching changelog information, please wait... " >> ${LOCKFILE}
if /usr/local/opnsense/scripts/firmware/changelog.sh fetch >> ${LOCKFILE} 2>&1; then
echo "done" >> ${LOCKFILE}
fi
if [ "${product_name}" = "${PACKAGE}" ]; then
echo "A release type change is not required." >> ${LOCKFILE}
PACKAGE=
else
echo "Targeting new release type: ${PACKAGE}" >> ${LOCKFILE}
echo "done" >> ${LOCKFILE}
fi
: > ${OUTFILE}
@ -121,26 +115,28 @@ fi
# reach the pkg repository in timely fashion
# Kill all running pkg instances
connection="timeout"
else
else
# connection is still ok
connection="ok"
: > ${OUTFILE}
# now check what happens when we would go ahead
if [ -n "${PACKAGE}" ]; then
if [ "${product_id}" != "${product_target}" ]; then
echo "Targeting new release type: ${product_target}" | ${TEE} ${LOCKFILE}
# fetch before install lets us know more,
# although not as fast as it should be...
(pkg fetch -Uy "${PACKAGE}" 2>&1) | ${TEE} ${LOCKFILE}
(pkg install -Un "${PACKAGE}" 2>&1) | ${TEE} ${LOCKFILE} ${OUTFILE}
(pkg fetch -Uy "${product_target}" 2>&1) | ${TEE} ${LOCKFILE}
(pkg install -Un "${product_target}" 2>&1) | ${TEE} ${LOCKFILE} ${OUTFILE}
else
echo "A release type change is not required." | ${TEE} ${LOCKFILE}
(pkg upgrade -Un 2>&1) | ${TEE} ${LOCKFILE} ${OUTFILE}
fi
# Check for additional repository errors
if grep -q 'Unable to update repository' ${OUTFILE}; then
repository="error" # already set but reset here for clarity
elif grep -q "No packages available to install matching..${PACKAGE}" ${OUTFILE}; then
elif grep -q "No packages available to install matching..${product_target}" ${OUTFILE}; then
repository="incomplete"
else
# Repository can be used for updates
@ -163,10 +159,10 @@ fi
MODE=
while read LINE; do
REPO=$(echo "${LINE}" | grep -o '\[.*\]' | tr -d '[]')
if [ -z "${REPO}" ]; then
REPO=${UPSTREAM}
fi
REPO=$(echo "${LINE}" | grep -o '\[.*\]' | tr -d '[]')
if [ -z "${REPO}" ]; then
REPO=${UPSTREAM}
fi
for i in $(echo "${LINE}" | tr '[' '(' | cut -d '(' -f1); do
case ${MODE} in
DOWNGRADED:)
@ -286,11 +282,11 @@ fi
;;
esac
done
done < ${OUTFILE}
done < ${OUTFILE}
fi
# the main update from package will provide this during upgrade
if [ -n "${PACKAGE}" ]; then
if [ "${product_id}" != "${product_target}" ]; then # XXX unhide later
base_to_reboot=
elif [ -z "$base_to_reboot" ]; then
if opnsense-update -cbf; then
@ -316,7 +312,7 @@ fi
fi
# the main update from package will provide this during upgrade
if [ -n "${PACKAGE}" ]; then
if [ "${product_id}" != "${product_target}" ]; then # XXX unhide later
kernel_to_reboot=
elif [ -z "$kernel_to_reboot" ]; then
if opnsense-update -cfk; then
@ -350,14 +346,14 @@ fi
# write our json structure
cat > ${JSONFILE} << EOF
{
"check_package":"${PACKAGE}",
"connection":"$connection",
"downgrade_packages":[$packages_downgraded],
"download_size":"$download_size",
"last_check":"$last_check",
"new_packages":[$packages_new],
"os_version":"$os_version",
"product_name":"$product_name",
"product_target":"$product_target",
"product_id":"$product_id",
"product_version":"$product_version",
"reinstall_packages":[$packages_reinstall],
"remove_packages":[$packages_removed],
@ -370,4 +366,8 @@ cat > ${JSONFILE} << EOF
}
EOF
if [ -n "${JSONRETURN}" ]; then
cat ${JSONFILE}
fi
echo '***DONE***' >> ${LOCKFILE}

View File

@ -28,13 +28,13 @@ message:Retrieving changelog index
command: /usr/local/opnsense/scripts/firmware/changelog.sh html
parameters:%s
type:script_output
message:Viewing changelog for version %s
message:Viewing HTML changelog for version %s
[changelog.text]
command: /usr/local/opnsense/scripts/firmware/changelog.sh text
parameters:%s
type:script_output
message:Viewing changelog for version %s
message:Viewing text changelog for version %s
[license]
command:/usr/local/opnsense/scripts/firmware/license.sh