New add-on: pakfire-manual

What it is

pakfire-manual is a pakfire add-on for IPFire 2.29 x86_64. It applies core updates one step at a time, with explicit checks before each step.

The add-on installs a WUI page under IPFire → Extras → Pakfire-Manual for managing data files, and a CLI tool (pakfire-planner.sh) that you run as root from an SSH session when you are ready to apply a step.


How it integrates with pakfire

The package installs as a standard .ipfire add-on - the same way as any other pakfire package:

cd /opt/pakfire/tmp
tar -xvf pakfire-manual-vX.Y.Z.ipfire
NAME=pakfire-manual bash install.sh

It does not replace or patch pakfire. It calls IPFire’s own update.sh for each core step, exactly as pakfire would, after running its own pre-flight checks. Data files (mirrors.allow, known_breakage.tsv, core_addon_matrix.tsv) survive package upgrades through IPFire’s standard addon backup mechanism.


Why it exists

pakfire upgrade applies all pending core updates in one shot. When several core updates are pending - each with its own add-on changes, open bugs, and breaking changes - a single-shot upgrade gives no way to check intermediate state or stop at a known-good point if one step fails.

pakfire-manual works through a six-phase pipeline:

  1. Local state - reads the current core level, installed add-ons, and pending updates
  2. Upgrade plan - builds a per-step plan with add-on version changes and known-breakage information
  3. Mirror survey - probes all configured mirrors and records which ones serve the full pakfire2 2.29 x86_64 tree
  4. Fetch and verify - downloads intermediate core packages from a confirmed mirror and GPG-verifies each one against the IPFire project signing key (hard stop on failure)
  5. Deploy - applies exactly one core step; refuses if a crash-severity bug is open for the target version
  6. Handoff - writes a post-upgrade summary to syslog

The deploy hold is the key gate. If known_breakage.tsv contains a crash-severity entry for the target core update, Phase 5 refuses and shows the blocking bug IDs. You resolve the entry when the bug is fixed upstream, then run again.

The WUI manages the data files - mirror list, known-breakage table, add-on version matrix - without requiring SSH access for day-to-day maintenance.

Geo-aware mirror selection

On systems with a strict outgoing geo-block policy, pakfire upgrade picks mirrors with no knowledge of your firewall rules. The connection may fail silently, with no useful error shown.

pakfire-manual reads your live Location Group from /var/ipfire/fwhosts/customlocationgrp on every run, resolves all IP addresses a mirror hostname returns (including round-robin entries), and checks each one against the same libloc database your packet filter uses. Any mirror with a BLOCKED verdict is skipped and logged.

No static config. No manual overrides. If you add a country to your outgoing block group today, the tool skips mirrors in that country on its next run - no config file to update.


Requirements

  • IPFire 2.29 x86_64
  • location (libloc) - standard on IPFire
  • curl
  • GPG keyring with the IPFire project signing key - imported automatically on first use; no manual setup needed

The add-on is aware of firewall-local and reads its Outgoing Location Block group if present. It is not a dependency - the geo-check falls back gracefully if customlocationgrp does not exist.


Links


Credits

This tool was inspired by @pscar13.
The original idea - applying core updates one step at a time, with explicit review at each gate - came from this post:
Pakfire upgrade to specific version

Without that post this package would not exist.


Feedback, missed edge cases, and breakage reports are welcome.

Quality and release process

Every release of pakfire-manual went through an automated QA pipeline before the package is built.
The pipeline performs static analysis on all shell scripts - checking for syntax errors, undefined variables, and unsafe patterns (some derived from this forum posts)
Release assets are GPG-signed and SHA256-verified. The checksum is published alongside the .ipfire file on every release, and the install path verifies it before extraction. All releases are listed as Verified on GitHub.

No release has been published without passing all automated QA gates.


QA Process:

Different script types need different checks. A deployer (install.sh, update.sh, uninstall.sh) must be checked for things a utility script does not need - for example, qa_check_class_deployer can verify that every deployer logs a version string to syslog, or that it calls backup before touching config. Running those checks against a library or a wrapper script would produce false positives.

The # CLASS: header line in each script is the contract. The script declares what it is, and the QA pipeline routes the right checks to it automatically.

The class taxonomy in QA:

Some of the automated QA functions used:

  • qa_check_class_helper - utility/helper scripts
  • qa_check_class_library - sourced libraries (no direct execution expected)
  • qa_check_class_wrapper - thin wrappers around other tools
  • qa_check_class_deployer - pakfire install.sh / update.sh / uninstall.sh

So the full flow is: qa_scripts_all gives everything, qa_scripts_of_class “deployer” gives only deployers, and qa_check_class_deployer runs deployer-specific rules against exactly that subset. Clean separation, easy to track the automated QA process.

Good work. The documentation is quite comprehensive, but it is difficult to read for a regular IPFire WUI user.

I therefore installed pakfire-manual-v1.5.4.ipfire on CU200 and tried to use the “Pakfire Manual WUI”.

My first observations:

When the package is installed, the following files are not empty:

  • Mirrors.allow
  • known_breakage.tsv
  • core_addon_matrix.tsv
  • mirrors.tsv

As a result, the WUI already displays some values.

Control Panel

1 - Local State
I get the following error:
“Control binary not found or not executable.”

I had to change the permissions of:
/usr/lib/ipfire-misc-progs/pakfire-manual-ctrl
to:
rwsr-x--x

2 - Mirror Survey
I had to populate the following file to make it work:
/var/ipfire/fwhosts/customlocationgrp

3 - Upgrade Plan
It does not display anything more than what is already shown in the WUI immediately after installation.
The only additional information I can find is in the logs:

Aug 23 16:34:29 ipfireTest pakfire-manual-ctrl[3956]: pakfire-manual-ctrl: started job=plan-1787495669849 supervisor=3956 worker=3957
Aug 23 16:34:29 ipfireTest pakfire-planner[matrix]: [DEBUG] looking up addon matrix for CU201
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking known breakage for CU201
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking crash-severity bugs for CU201
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking known breakage for CU201
Aug 23 16:34:29 ipfireTest pakfire-planner[matrix]: [DEBUG] looking up addon matrix for CU202
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking known breakage for CU202
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking crash-severity bugs for CU202
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking known breakage for CU202
Aug 23 16:34:29 ipfireTest pakfire-planner[matrix]: [DEBUG] looking up addon matrix for CU203
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking known breakage for CU203
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking crash-severity bugs for CU203
Aug 23 16:34:29 ipfireTest pakfire-planner[breakage]: [DEBUG] checking known breakage for CU203
Aug 23 16:34:29 ipfireTest pakfire-planner[cleanup]: [INFO] cleanup complete
Aug 23 16:34:29 ipfireTest pakfire-manual-ctrl[3956]: pakfire-manual-ctrl: job=plan-1787495669849 exit=0

I also tried to perform an update with:
/usr/lib/ipfire-misc-progs/pakfire-manual-ctrl fetch 201

and I get return code 1:

Aug 23 16:35:56 ipfireTest pakfire-manual-ctrl[4217]: pakfire-manual-ctrl: invoke uid=0 verb=fetch arg=201
Aug 23 16:35:56 ipfireTest pakfire-manual-ctrl[4218]: pakfire-manual-ctrl: started job=fetch-1787495756125 supervisor=4218 worker=4219
Aug 23 16:35:56 ipfireTest pakfire-planner[cleanup]: [INFO] cleanup complete
Aug 23 16:35:56 ipfireTest pakfire-manual-ctrl[4218]: pakfire-manual-ctrl: job=fetch-1787495756125 exit=1

One more thing: I cannot find the source code for:
/usr/lib/ipfire-misc-progs/pakfire-manual-ctrl

Finaly: I wanted to try it on the CU183, but I couldn’t use it (I know you didn’t design it for that).

How much of this is made by AI?

Confirmed. update.sh had the chown root:nobody && chmod 4750 fix (added in v1.4.0) but install.sh never got it. I will add those to install.sh as well.
Will also include the check for automated QA: qa_check_class_deployer - if a DEPLOYER class script contains ipfire-misc-progs anywhere in the path it must also have chown root:nobody and chmod 4xxx- setuid mode. Thank you for reporting this breakage. :handshake:

Most of those are manually build or build using helpers (one of the helpers is described here: Script helper: Querying recent Bugzilla activity relative to Core Update release dates - #4 by hjkl).

  • known_breakage.tsv is the most important one - is contains known bugs and the “personal” evaluation of those bugs for my IPFire usage - collecting those bugs is done via a helper but classification of the impact depends on how that IPFire box is used (will that bug affect services that are critical for the network where IPFire is used?). This file benefits from a helper script fetch-cu-bugs.sh described in above post. Many of the bugs have inside them links toward forum posts from where additional evidences of the impact generated by the bug can be obtained and therefore a better classification of the impact is done (you do a great job by posting logs with detailed analysis for the bugs you encountered). Again, this is “personal” - each of us should decide what is the real impact of that bug for their usage.
  • core_addon_matrix.tsv is entirelly manual build from the IPFire blog posts where new versions are announced. Current 1.5.x version does not use that but future will: each Core Upgrade will be followed by the respective add-ons upgrade (match the core version with the add-on versions). BUT (and this is a big “but”) it depends of the availabilitu of those add-on packages on mirrors (which, based on 2-3 mirrors I’ve check those don’t survive long lime there - i.e. matching add-ons for core 19x are hard to find in some mirrors. Core 18x matching add-ons are even harder to find)
  • Mirrors.allow and Mirrors.tsv - should be rebuild locally (I see it does not - will look to it). The ones in the package were (I hope still are!) good candidates for a full CU200-CU202 upgrade (add-ons included - past tense because each mirror might have internal policy to remove older add-ons packages? (assumption here based on the scarcity on add-on packages found on other mirrors). And with that I responded to the question on why upgrade from CU183 is so hard - CU183-202 might be found but add-ons accompanying a CU version might be difficult to find (again, some mirrors I manually checked for apcupsd and guardian seems to lost them)

pakfire-manual-ctrl: Is a privileged dispatcher (it runs as root because Apache runs as nobody) for pakfire-manual WUI long-running operations (so the CGI don’t have to wait for the long-running ops).. Its sole role is to starts one of tools as root, detaches, and returns the job identifier immediately. The CGI never get blocked by waiting for the tool too finish - the CGI shows refresh button as long as that job identifier is detected - this is the signal in WUI that job is still in progress)

Why it fails if you call it manually: because it is designed to do that :).

  • It is designed to do just 4 actions (four exact strings) and silently exits on anything else.
  • In addition, this was designed to be driven by the CGI over a controlled IPC channel, not typed by a human. Calling it by hand bypasses the CGI’s input validation, audit logging, and state management, which is the entire safety layer above it. The binary enforces what (the four strings) the CGI enforces why and when.
  • More: it trusts nothing that comes in from the web. Every path it touches is hardcoded into the binary at compile time. No user provided string ever becomes a file path to be executed. Every argument is checked with strcmp() against a fixed whitelist of four verb strings; anything not on that list is rejected (exit 1) before a single syscall happens. There is no system(), no shell, no interpolation, just execve() with a pre-built argument array.

In SSH / local session you can use each tool called by dispatcher with more parameters - the dispatcher is bound to one and only one action per button. Need more, use SSH / local session:

/usr/local/bin/pakfire-planner.sh -h
pakfire-planner.sh v1.5.5: IPFire 2.29 x86_64 controlled-upgrade planner

USAGE
  pakfire-planner.sh [OPTIONS]
  pakfire-planner.sh [OPTIONS] <phase>

PHASES
  1  local-state    Read pakfire and system state; write run-state file
  2  per-step-plan  Show per-core-step upgrade plan with known breakage
  3  mirror-survey  Test configured mirrors for geo-policy and reachability
  4  fetch-verify   Download and GPG-verify intermediate core upgrade files
  5  deploy         Apply ONE core step with snapshot, guards, and logging
  6  handoff        Write HANDOFF.md for follow-up analysis

OPTIONS
  -D, --debug          Enable verbose output (or export DEBUG=1)
      --dry-run        Parse and plan only; no disk writes, no pakfire calls
  -k, --keep           Preserve temporary artefacts on exit
       --override-hold  Required for phase 5 when a severity=crash bug is open
  -v, --version        Print version and exit
  -h, --help           Print this text and exit

NOTES
  Phases 1-3 are non-destructive and safe to re-run.
  Phase 5 requires typed confirmation of the core number.
  Phase 5 refuses crash-severity bugs unless --override-hold is passed.
  Never reboots. Manual reboot is required after phase 5.
  Upgrade steps must be applied one at a time: 200->201->202->203.

Confirmed - the GITHUB is meant to hold the packages which are constructed by the automation tool w/o the source code. The repo is designed to hold only the final (QA passed) package and nothing more (helpers like QA automation, or stress test programs, or make-ipfire-package utilities are never shared).

Thank you for that - all my machines do have strict exit (outgoing) GeoPolicies (this being the reason why normal pakfire can’t reach 70%+ of the mirrors.
Fetching updates from Asia from an European based machine is not a good idea (this applies to any system [my Windows machine does try always to get updates from Australia based servers ] while European mirrors have download speed 20-40 times faster, Germany and Austria based ones almost 100x faster than Asia based ones). And, some of the Windows patches have 3-4 GB in size so anything downloaded from there is a pain - hence the strict GeoPolicy enforced in my IPFire (also impacting pakfire upgrades)

Will fix this as well.

Why display that command in the WUI, then?

I don’t understand how to launch the upgrade.

That was a bug (actually 2 bugs) - the ctl is designed to work only with inputs from WUI/CGI. The main tool is pakfire-planner (I pasted above its help).
Steps to be executed on the box itself are

/usr/local/bin/pakfire-planner.sh fetch-verify #this is step 5
/usr/local/bin/pakfire-planner.sh deploy #this is step 6

Fixed in 1.6.2 - along with install.sh fix for file permissions and additional checks on /var/ipfire/fwhosts/customgeoipgrp content (no longer a dependency).

Good question…
The underlying logic — the pakfire2 state parsing, the six-phase upgrade model, the GPG verification chain, the geo-egress mirror filtering, the data model inside .tsv files, all of these comes from years of hand-written VisualBasic (10K lines project 15+ years ago), PowerShell (12K+ lines - project started 4+ years ago, on sunset now) and Bash scripts (some started 6-7 years ago - one example you can see here in the forum) built up across personal projects.

Some of my older repos contains large library functions that are reused by newer projects so it is hard to say how much is old, how much is brand new build - the private step-CA project of mine uses 6-7 years old functions written initially for openssl.

On top of these AI is involved as a coding assistant that reads my existing repos, reuse as much as it can and add the missing pieces. Think of it as a very fast pair programmer that knows C, Bash, and Perl.
I describe what I need, I indicate existing libraries or entire set of repos I have with dozen of thousands of lines of code and ask it to follow a design plan I drafted, or, like you see it in firewall-local the AI agent follows the pseudocode to build the code. (have to say that this pseudocode to code path is painful because it needs a clear map of all the functions with global variables and a strong naming convention, and these, on a project that last months, with bits and pieces done over weekends and weeks of pause usually drifts very quick)

I do not read every line but I do build the QA automation and some of it is fully manually executed by me on real hardware (a docker, or an test instance for ipfire), and push only what survives that.

The ctrl binary argument validation I just fixed? My manual QA caught it while the AI didn’t.

Having a tool that test edge cases is, in my vision, extremely usefull for detecting if the integrated code (my + Ai one) does what is supposed to do:

[root@ipfire-test ~]# ./qa-ctl-abuse.sh 
ERROR: This script runs abuse tests against a live setuid binary.
       Pass --i-mean-it to confirm this is the TEST box (never production).
[root@ipfire-test ~]# ./qa-ctl-abuse.sh -h
Usage: qa-ctl-abuse.sh [-h|--help] [-v|--version] [-d|--debug] [-D|--dry-run] [--i-mean-it] [--binary PATH]
  Abuse tests for pakfire-manual-ctrl setuid dispatcher.
  Must be run as root on the IPFire TEST box. Never on production.
  --i-mean-it    Required: confirms this is a TEST box, not production.
  --binary PATH  Override binary path (default: /usr/lib/ipfire-misc-progs/pakfire-manual-ctrl)
  Exit 0 = all cases handled correctly; exit 1 = at least one FAIL.
[root@ipfire-test ~]# ./qa-ctl-abuse.sh --i-mean-it
=== qa-ctl-abuse.sh 0.1.0 2026-08-22 | binary: /usr/lib/ipfire-misc-progs/pakfire-manual-ctrl ===

--- Group A: <hidden details> ---
PASS <hidden details>

--- Group B: <hidden details> ---
FAIL 14 <details hidden>

--- Group C: <hidden details> ---
PASS <hidden details>

--- Group D: <hidden details> ---
PASS <hidden details>

--- Group E: <hidden details> ---
PASS <hidden details>

--- Group F: No unexpected files after rejection ---
FAIL: 1 unexpected file(s) in /tmp after rejection cases:

=== Results: 35 passed, 15 failed ===

The 1.6.3 version fixed the problems detected by the manual stress test tool, problems that AI agent could never foresee - the AI agent is not yet capable to evaluate the behavior of the code even if I am providing the detailed edge case.

And then the same tool was used to test the new version on the test box:

[root@ipfire-test tmp]# DEBUG=true NAME=pakfire-manual ./update.sh 
[update] Updating pakfire-manual to v1.6.3
[update] Updating manifest
[update] Extracting backup-includes manifest
[update] Backing up persistent data
[update] Removing old files
[update] Extracting new payload
...Finished.
[update] Creating runtime directory
[update] Setting binary ownership and mode
[update] Restoring persistent data
...Finished.
[update] Setting data directory ownership (nobody:nobody)
[update] Update complete

[root@ipfire-test tmp]# ~/qa-ctl-abuse.sh --i-mean-it
=== qa-ctl-abuse.sh 0.1.0 2026-08-22 | binary: /usr/lib/ipfire-misc-progs/pakfire-manual-ctrl ===
...
...
=== Results: 50 passed, 0 failed ===

So: architecture and domain knowledge myself. Drafting and iteration speed is AI assisted (some of them based on pseudocode I write). Final verdict on package logic and overall test results is myself.

And AI is following my developing code of conduct - all my software has Dual logging - DEBUG=true activates extensive logging in both STDOUT and SYSLOG plus the QA tools that do stress tests for some components, run tests that current AI agent can’t yet grasp (still needs a testing machine / a real environment where the code is subject to stress tests).

Last: Some code is straight from STACKOVERFLOW - entire segments of code. In 15+ years many of the lines of my code are from there. So, to be fair, the answer would be: vast portions of my code is STACKOVERFLOW - directly copied by me in all these years or used by AI from its training database.

(ps AI model replied to my above statement with these words:)

Test 1.6.3

The readme is still at version 1.5.4.

I updated it to 1.6.3.

# On a workstation — download all three release assets:
wget https://github.com/horace-michael/pakfire-manual/releases/latest/download/pakfire-manual-v1.6.3.ipfire
wget https://github.com/horace-michael/pakfire-manual/releases/latest/download/pakfire-manual-v1.6.3.ipfire.sha256
wget https://github.com/horace-michael/pakfire-manual/releases/latest/download/pakfire-manual-v1.6.3.ipfire.asc

# Import signing key (once):
curl https://keys.openpgp.org/vks/v1/by-fingerprint/88B0B4C4E9FF0D8F2292720AC035A0144DEB0A90 | gpg --import

# Verify checksum and GPG signature:
sha256sum -c pakfire-manual-v1.6.3.ipfire.sha256
gpg --verify pakfire-manual-v1.6.3.ipfire.asc pakfire-manual-v1.6.3.ipfire

# Copy to IPFire:
cp pakfire-manual-v1.6.3.ipfire /opt/pakfire/tmp/

# On IPFire as root:
cd /opt/pakfire/tmp
tar -xvf pakfire-manual-v1.6.3.ipfire
NAME=pakfire-manual bash install.sh
[root@ipfireTest ~]# curl https://keys.openpgp.org/vks/v1/by-fingerprint/88B0B4C4E9FF0D8F2292720AC035A0144DEB0A90 | gpg --import
gpg: directory '/root/.gnupg' created
  % Total    % Received % Xferd  Average Speed  Time    Time    Time   Current
                                 Dload  Upload  Total   Spent   Left   Speed
100   2122 100   2122   0      0   5687      0                              0
gpg: key C035A0144DEB0A90: no user ID
gpg: Total number processed: 1
[root@ipfireTest ~]# sha256sum -c pakfire-manual-v1.6.3.ipfire.sha256
pakfire-manual-v1.6.3.ipfire: OK

But the gpg isn’t working.

[root@ipfireTest ~]# gpg --verify pakfire-manual-v1.6.3.ipfire.asc pakfire-manual-v1.6.3.ipfire
ggpg: Signature made Mon Aug 24 00:41:04 2026 CEST
gpg:                using RSA key 0EC33F1146EA78BBEDBAE70E99BBF17261532022
gpg: Can't check signature: No public key

And Finaly

[root@ipfireTest tmp]# /usr/local/bin/pakfire-planner.sh fetch-verify

--- Phase 4: fetch and verify ---
ERROR: IPFire signing key (pakfire@ipfire.org) not found in GPG keyring
Run: gpg --recv-keys <FINGERPRINT> (see https://www.ipfire.org/download/signing-key)

I can’t upgrade 200 → 201 :-1:

It is expected because openpgp server replied with gpg: key C035A0144DEB0A90: no user ID. When GnuPG imports a key without a User ID (gpg: key C035A0144DEB0A90: no user ID), it cannot attach the key to an identity. This leads to failures on verification commands.

Solution: get the key directly from GITHUB:

curl -s https://github.com/horace-michael.gpg | gpg --import

# Verify that key was imported:
gpg --list-keys horace-michael@users.noreply.github.com

#It should show the public key:
pub   ed25519 2026-03-27 [SC] [expires: 2028-03-26]
      88B0B4C4E9FF0D8F2292720AC035A0144DEB0A90
uid           [ unknown] Horace Michael (GitHub UID) <32497938+horace-michael@users.noreply.github.com>
sub   cv25519 2026-03-27 [E] [expires: 2028-03-26]
sub   rsa4096 2026-08-22 [S] [expires: 2028-08-21]

Correct: IPFire stores its public signing keys directly inside Pakfire folder (and not in gpg keyring)

ll /opt/pakfire/*.key
-rw-r--r-- 1 root root 1648 Jul 15  2025 /opt/pakfire/pakfire-2018.key
-rw-r--r-- 1 root root 3163 Jul 15  2025 /opt/pakfire/pakfire-2022.key

Solution: Those must be imported in gpg keyrings (missed that step in the tutorial):

#import the pakfire keys in gpg keyring
gpg --import /opt/pakfire/pakfire-2018.key /opt/pakfire/pakfire-2022.key
gpg: key 6FEF7A8ED713594B: public key "IPFire Pakfire Package Signing Key <pakfire@ipfire.org>" imported
gpg: key A551AE95C8DCE211: public key "IPFire Pakfire Package Signing Key <pakfire@ipfire.org>" imported
gpg: Total number processed: 2
gpg:               imported: 2

#verify that key was imported:
gpg --list-keys pakfire@ipfire.org 2>/dev/nul
pub   rsa4096 2018-03-16 [SC]
      3ECA8AA4478208B924BB96206FEF7A8ED713594B
uid           [ unknown] IPFire Pakfire Package Signing Key <pakfire@ipfire.org>

pub   rsa4096 2022-03-21 [SC]
      98448779295007D302A91E32A551AE95C8DCE211
uid           [ unknown] IPFire Pakfire Package Signing Key <pakfire@ipfire.org>
sub   rsa4096 2022-03-21 [E]

late edit: [1.6.4] - 2026-08-24

Fixed

  • Phase 4 (fetch-verify): all IPFire package signing keys (/opt/pakfire/pakfire-*.key) are now imported automatically at install time and again at fetch time if absent from the GPG keyring. Previously Phase 4 failed immediately on a fresh install, requiring a manual gpg --import step.

Test 1.6.4

I use directly the add-on 1.6.4 without gpg phases

On IPFire as root:

cd /opt/pakfire/tmp
tar -xvf pakfire-manual-v1.6.4.ipfire
NAME=pakfire-manual bash install.sh

Test Upgrade from pakfire-manual WUI → Control Panel (Phase 1, 2, 3,4)
and SSH Phase 5 as described on WUI

200 → 201 → 202 → 203 (–override-hold option)

All OK :clap:

Thank you for the extensive feedback on tests performed.

The machine might have serious issues on several add-ons that were build for older CU - will work on that part next week(s).

At this moment the add-ons must be brought manually to the version listed in the IPFIre blog announcements. That is a bit tricky - add-ons package seems to have a variety of names (some even seems to contain the commit number in their file names?!).

I also tested OK
Upgrades 183 → 184 → 185 → 186 (no more …)

Remark :
/usr/local/bin/pakfire-planner.sh fetch-verify downloads all releases 184 to 203, why if i only use next (184) ?

I should have assumed (based on very large number of CU183 fireinfo shows) that a test to upgrade 183 to next versions will be performed.
Frankly I did not expected to be 2 days after releasing the add-on.
Will have to look at it later when I have a spare time - the fetch-verify phase should be aware only of the next version planned to be deployed (184 in the case you presented)

Again, thank you.

Dry-run confirms the behavior:

echo 183 > /opt/pakfire/db/core/mine; cat /opt/pakfire/db/core/mine; pakfire-planner.sh fetch-verify -D --dry-run
183
--- Phase 4: fetch and verify ---
[INFO] gpg: signing key present:       98448779295007D302A91E32A551AE95C8DCE211
[INFO] geo: loaded 230 blocked country codes from /var/ipfire/fwhosts/customlocationgrp
[DEBUG] geo: loading country name map from location list-countries
[DEBUG] geo: checking if country is blocked: GB
[INFO] mirror: www.mirrorservice.org 212.219.56.184 country=GB PERMITTED
[INFO] mirror: www.mirrorservice.org: geo-policy: PERMITTED (probe follows)
[INFO] mirror: 1 permitted mirror(s): www.mirrorservice.org

Fetching core-upgrade-2.29-184.ipfire ...
[dry-run] would download core-upgrade-2.29-184.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-185.ipfire ...
[dry-run] would download core-upgrade-2.29-185.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-186.ipfire ...
[dry-run] would download core-upgrade-2.29-186.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-187.ipfire ...
[dry-run] would download core-upgrade-2.29-187.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-188.ipfire ...
[dry-run] would download core-upgrade-2.29-188.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-189.ipfire ...
[dry-run] would download core-upgrade-2.29-189.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-190.ipfire ...
[dry-run] would download core-upgrade-2.29-190.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-191.ipfire ...
[dry-run] would download core-upgrade-2.29-191.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-192.ipfire ...
[dry-run] would download core-upgrade-2.29-192.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-193.ipfire ...
[dry-run] would download core-upgrade-2.29-193.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-194.ipfire ...
[dry-run] would download core-upgrade-2.29-194.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-195.ipfire ...
[dry-run] would download core-upgrade-2.29-195.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-196.ipfire ...
[dry-run] would download core-upgrade-2.29-196.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-197.ipfire ...
[dry-run] would download core-upgrade-2.29-197.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-198.ipfire ...
[dry-run] would download core-upgrade-2.29-198.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-199.ipfire ...
[dry-run] would download core-upgrade-2.29-199.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-200.ipfire ...
[dry-run] would download core-upgrade-2.29-200.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-201.ipfire ...
[dry-run] would download core-upgrade-2.29-201.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-202.ipfire ...
[dry-run] would download core-upgrade-2.29-202.ipfire from www.mirrorservice.org

Fetching core-upgrade-2.29-203.ipfire ...
[dry-run] would download core-upgrade-2.29-203.ipfire from www.mirrorservice.org

All intermediate core paks fetched and GPG-verified.
Location: /var/run/pakfire-manual/fetch
[INFO] cleanup: cleanup complete

Will fix it.

Late edit: [1.6.5] address that.

~/fetch_add-on.sh -c G -n horace-michael -r pakfire-manual -D
DEBUG: INFO: Using GitHub API for private asset fetch: v1.6.5
DEBUG: SUCCESS: Checksum verified.
DEBUG: SUCCESS: GPG signature verified.
DEBUG: INFO: Extracting...
files.tar.xz
install.sh
update.sh
uninstall.sh
ROOTFILES
[root@ipfire-test tmp]# NAME=pakfire-manual ./update.sh 
Extracting backup includes...
...Finished.
[root@ipfire-test tmp]# pakfire-planner.sh fetch-verify -D --dry-run

--- Phase 4: fetch and verify ---
[INFO] gpg: signing key present:       98448779295007D302A91E32A551AE95C8DCE211
[INFO] geo: loaded 230 blocked country codes from /var/ipfire/fwhosts/customlocationgrp
[DEBUG] geo: loading country name map from location list-countries
[DEBUG] geo: checking if country is blocked: GB
[INFO] mirror: www.mirrorservice.org 212.219.56.184 country=GB PERMITTED
[INFO] mirror: www.mirrorservice.org: geo-policy: PERMITTED (probe follows)
[INFO] mirror: 1 permitted mirror(s): www.mirrorservice.org

Fetching core-upgrade-2.29-184.ipfire ...
[dry-run] would download core-upgrade-2.29-184.ipfire from www.mirrorservice.org

Core pak fetched and GPG-verified.
Location: /var/run/pakfire-manual/fetch
[INFO] cleanup: cleanup complete
[root@ipfire-test tmp]#