Script helper: Querying recent Bugzilla activity relative to Core Update release dates

Hi everyone,

I wanted to share a small workflow tool I built for my own upgrade planning and get your thoughts on whether this could be useful for others in the community.

Background & Challenge

When preparing to upgrade an IPFire instance between Core Updates (e.g., sequentially planning from Core 200 through 203), I found myself trying to get a clear picture of issues reported or updated after a specific Core Update was released.

Looking at Bugzilla:

  • The Version field in Bugzilla is structured as major releases (e.g., 2), while specific Core Updates (like Core Update 203) are tracked dynamically within bug summaries, comments, or git commits rather than as discrete search dropdown metadata.
  • When evaluating an upgrade, knowing which bugs were created or changed since a specific release blog post date helps gauge potential regression risks or known workarounds before deploying.

What the Script Does

I wrote a lightweight Bash script (fetch-cu-bugs.sh) to automate this correlation locally on a workstation:

  1. Date Resolution: It fetches the official IPFire blog RSS feed (/blog/feed.xml) and extracts the exact publication date for "Core Update N released".
  2. Bugzilla Query: Using the Bugzilla CSV API, it queries:
  • Bugs created (chfield=[Bug creation]) since that release date.
  • Bugs modified/changed (chfieldfrom=...) since that release date.
  1. Structured Output: It exports a clean TSV file containing the bug ID, product, component, status, summary, and last changed date.

Optional workflow: I feed this structured output into a local tool or LLM to quickly parse summaries and highlight whether an open bug applies to a component I currently use (e.g., Knot Resolver, WIO, Samba).

Example Output (Core Update 203)

Running ./fetch-cu-bugs.sh -c 203 generates a report like this:

# Core Update    : 203
# Release date   : 2026-07-20
# Query timestamp: 2026-08-08 12:00:00 UTC

TYPE      BUG_ID  PRODUCT  COMPONENT      STATUS  SUMMARY
CREATED   14035   IPFire   wio            NEW     General::ipcidr2msk removed...
CREATED   14034   IPFire   knot-resolver  NEW     NXDOMAIN queried 3-4x...
CHANGED   13979   IPFire   knot-resolver  CLOSED  Rethink Safe Search

Question for the Community

  • Is this correlation (linking blog release timestamps directly to subsequent Bugzilla activity) something others in the community find helpful when planning maintenance windows?
  • If there is interest, I would be happy to publish the script repository for anyone who wants to use or refine it.

Feedback and thoughts are welcome!

Is this all AI-made?

I’m not entirely sure what your script is intended to achieve.

An advanced search in Bugzilla will give you the same results:

Here the request

Script does exactly that by using as input date the date of each Core Update versions extracted from blog posts. Script then uses bugzilla official API schema (posted here Bugzilla Schema for Versions 5.0 to 5.2) to make a snapshot of the bugs opened after a certain core version was launcged - the csv is then fed to an AI agent that checks each bug against current ipfire usage and determine the risk/impact of executing the upgrade.

The result of AI analysis against the CSV produced by the script + knowledge information of each ipfire machine (how I use it - what services are there and how critical are those services for me) looks like this:

data/known_breakage.tsv

Source: Bugzilla entries confirmed via the IPFire community forum and direct Bugzilla reads.

Last refreshed: 2026-08-08 using utilities/fetch-cu-bugs.sh -c 203.

Bug ID Severity Status Component Summary
14024 crash NEW knot-resolver assertion crash when >=16 host definitions share one IP; no workaround; fix requires LMDB upstream
14037 crash NEW knot-resolver kresd fails to start when DNS upstream set to TLS but no TLS hostnames configured; workaround: revert to UDP in WUI
14030 major ASSI knot-resolver DNS resolution fails for OpenVPN and WireGuard road-warrior clients; kresd wildcard bind (0.0.0.0) causes wrong source IP on UDP replies; workaround: add specific listen IP to /etc/knot-resolver/config.yaml; PoC patch submitted upstream
14034 major NEW knot-resolver NXDOMAIN queried 3-4 times triggers infinite randomised-case NS query flood; drives CPU to 100%; upstream hub blocks ALL traffic until kresd is restarted; workaround: watchdog script monitoring DNS packet rate
13973 major dhcpd.conf DHCP lease hook argument format mismatch after Unbound → Knot migration; workaround: WUI DHCP page untick and re-tick affected interfaces
14035 major ASSI wio General::ipcidr2msk and GetDyndnsRedIP removed/relocated in CU203 Perl functions; WIO 1.3.2-19 breaks on start; patch under review by Adolf Belka (attachment 1744)

Which result gives your human ( real ) intelligence investigating the AI generated report?

That CU203 will never be deployed on any of my machines - wait for future versions and hope (prey) that problems will be solved w/o new ones arise and produce severe impact on services delivered by each IPFire machine

And here is the AI agent monitoring the forum (and saw my reply!) has to add:

The Human layer is where the risk becomes **personal**.

The AI sees the bug list and the machine profile — installed addons, services, how critical each one is (as per Human inputs). It produces an impact table. Human's job is to read that table and answer one question: "can I accept this failure mode on this box"?

For CU203 on Human machines the answer was immediate:

Both boxes run OpenVPN road-warrior and WireGuard for an undisclosed number of Road Warriors clients. Bug #14030 means DNS breaks for every VPN client the moment kresd starts misrouting UDP replies. That is not a degraded service — it is a dead service. No workaround.
Bug #14034 means one NXDOMAIN storm drives the upstream hub to block all traffic. 
Bug #14024 has no workaround at all and needs an LMDB upstream fix. Timeline: unknown.
Three bugs, all knot-resolver, all with no confirmed fix date. The decision should writes itself.

What the AI cannot do is assign tolerance to an outage window or weigh the value of a specific service to the people depending on it. It flags severity and workarounds — Human decide whether the workaround is acceptable given who is on the other side of the connection.

The tool (`fetch-cu-bugs`) is used at every new Core Update cycle and results fed to AI to evaluate the remaining unresolved bugs and their impact to imfrastructure. 

If CU204 ships with those bugs closed, the report generated by AI changes and Human makes the the decision. Until then both AI & Human recommendation is **hold** - this is stored in a custom pakfire-manual utility that is used by both Human and AI agent to execute upgrades only if the risk assessment indicate acceptable losses in existing services.

And here is how AI is using the tool to assess each IPFire instance I have: all below are from the test machine

/usr/local/bin/pakfire-planner.sh 1 2>&1
--- Phase 1: local state ---
Installed core: 202

State written to /var/run/pakfire-manual/state.tsv
Available core: 203
Upgrade steps required: 203 

Pending add-on changes:
  guardian             27 -> 28
  htop                 23 -> 25
  iperf3               8 -> 9

/usr/local/bin/pakfire-planner.sh 1 2>&1
--- Phase 2: per-step upgrade plan ---

=== Core Update 203 ===

ADD-ONS (source: blog matrix):
  dnsdist              2.0.6           [BLOG]
  ntfs-3g              2026.2.25       [BLOG]
  postfix              3.11.3          [BLOG]
  rsync                3.4.3           [BLOG]
  samba                4.24.2          [BLOG]
  spice                0.16.0          [BLOG]
  spice-protocol       0.14.5          [BLOG]
  tmux                 3.6b            [BLOG]
  tshark               4.6.6           [BLOG]
  strongswan           6.0.7           [BLOG]  # CVE-2026-47895; core security component not an add-on; included for completeness
  intel-microcode      20260512        [BLOG]  # INTEL-SA-01420; core component included for completeness

KNOWN BREAKAGE (source: Bugzilla):
  [crash] Bug #14024  knot-resolver NEW     assertion crash when >=16 host definitions share one IP; threshold confirmed at 16; no workaround; fix requires LMDB upstream
  [crash] Bug #14037  knot-resolver NEW     kresd fails to start when DNS upstream protocol set to TLS but no TLS hostnames configured; Lua stack traceback on tls_client init; workaround: switch DNS protocol back to UDP in WUI
  [major] Bug #14030  knot-resolver ASSI    DNS resolution fails for OpenVPN and WireGuard road-warrior clients; kresd wildcard bind (0.0.0.0) causes wrong source IP on UDP replies; clients reject responses; workaround: add specific listen IP to /etc/knot-resolver/config.yaml; PoC patch submitted to upstream Knot project
  [major] Bug #14034  knot-resolver NEW     infinite randomised-case NS query flood on NXDOMAIN queried 3-4 times; saturates upstream resolver; upstream hub blocks ALL traffic until kresd is restarted; workaround: watchdog script that monitors DNS packet rate and restarts kresd; no upstream fix yet
  [major] Bug #14031  knot-resolver ASSI    WUI lease table and /var/lib/knot-resolver/leases.db show different entries; kresd writes leases independently from WUI; workaround: none; assigned to Michael Tremer
  [major] Bug #13973  dhcpd.conf -       lease hook not migrated; update.sh replaces unbound-dhcp-leases-client with dhcp-lease but does not rewrite argument format; NAME= expected; HOSTNAME= required; workaround: WUI DHCP page untick and re-tick interfaces
  [major] Bug #14035  wio        ASSI    General::ipcidr2msk and GetDyndnsRedIP removed or relocated in CU203 Perl functions; WIO 1.3.2-19 breaks on start; patch by reporter (attachment 1744) under review by Adolf Belka; no fixed release yet

  *** DEPLOY HOLD: severity=crash bug open for core 203 ***
  Phase 5 will refuse this step unless --override-hold is passed.

Full capacity of the of the tool:

/usr/local/bin/pakfire-planner.sh -h
pakfire-planner.sh v1.1.0: 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.

WUI is work in progress: in the control panel all data accumulated by several helpers are presented - what mirror contains the necessary files as per run-file plan, and if those are accessible (strict exit control - several geoIP bloks + large number of ASNs/CIDR blocked via Release firewall-local v1.8.0-ui · horace-michael/firewall-local · GitHub add-on)
To be added the run-plan and remaining list of problems if upgrade is carried on against recommended “hold”.

Agree. Helper scripts only collect bugzilla data at a certain point in time and store them on local files (I believedata is at least 1 day old?! Or maybe 1,5 days old…)

Once the WUI will be complete the planner will call each helper script (to update each bug status - goal is to see them all CLOSED)

But, because a bug will eventually get closed in future versions, the planner script will have a memory file where cu203 can never be last version (i.e. put in production) and will continue to indicate the “hold” output as long as CU203 will be last version available on upstream IPFire servers.

So the pakfire-planner will look for CU204 and (!) that known CU203 bugs listed in its history file are declared CLOSED.

Then and only then the “hold” status might change, unless the AI agent does not inject new bugs in the planner list for CU204 (or CU203 - the helper scripts are run by AI agent only when I request it to do it and then AI agent execute search on forum to incorporate forum feedback along with bugzilla entries inside known_breakage.tsv consumed by pakfire-planner.

As I said: still work in progress - the architecture is there, some helpers are there, WUI is definitelly not ready and SoP is not ever written: how I should use the tool as risk evaluator for any future version to be deployed.

In an Open Source project it is usage, to publish the source.