Files
luci/applications
Stan Grishin 0d3cab72c6 luci-app-adblock-fast: update to 1.2.2-r6
Update luci-app-adblock-fast from 1.2.1-r3 to 1.2.2-r6.
This rewrites the rpcd backend from a 519-line shell
script to a 452-line native ucode module, adds two new
RPC methods for cron management, reorganizes the web UI
with a dedicated scheduling tab and a collapsible service
details section, moves schedule persistence from UCI to
crontab, and adds the AGPL-3.0-or-later LICENSE file.

Signed-off-by: Stan Grishin <stangri@melmac.ca>

---

- **8 files changed**, +1,765 / -851 lines (net +914)
- **1 commit**: `a18c61a` —
  `luci-app-adblock-fast: update to 1.2.2-r6`

---

- `+rpcd-mod-ucode` — Native ucode rpcd module loader

- `+jsonfilter` — No longer needed; ucode handles
  JSON natively

- Version bumped from `1.2.1-r3` to `1.2.2-r6`
- URL updated from `github.com/stangri/...` to
  `github.com/mossdef-org/...`

---

The rpcd script moves from:
```
/usr/libexec/rpcd/luci.adblock-fast   (519 lines, shell)
```
to:
```
/usr/share/rpcd/ucode/luci.adblock-fast (452 lines, ucode)
```

| Aspect          | Old (Shell)             | New (ucode)        |
|-----------------|-------------------------|--------------------|
| Language        | POSIX `/bin/sh`         | ucode bytecode     |
| JSON handling   | `json_init/add/dump`    | Native objects     |
| UCI access      | `config_load/get` subpr | `cursor()` API     |
| ubus access     | `jsonfilter` pipelines  | `connect()` API    |
| Business logic  | Duplicated in script    | Imports shared lib |
| Method decl     | `case` switch block     | Declarative schema |
| Performance     | Fork/exec per operation | In-process calls   |

The new script imports the shared business logic module
directly:

```javascript
import adb from '/lib/adblock-fast/adblock-fast.uc';
```

Query methods (`getInitStatus`, `getPlatformSupport`,
`getFileUrlFilesizes`, etc.) now delegate to the shared
`adb` library rather than re-implementing the logic.

**Retained (7 methods, same interface):**

| Method                | Type   | Purpose            |
|-----------------------|--------|--------------------|
| `getFileUrlFilesizes` | Query  | URL sizes from cfg |
| `getInitList`         | Query  | Enabled/running    |
| `getInitStatus`       | Query  | Full service state |
| `getPlatformSupport`  | Query  | Resolver/tool info |
| `setInitAction`       | Action | Start/stop/enable  |
| `getCronStatus`       | Query  | Cron diagnostics   |
| `syncCron`            | Action | Update cron sched  |

**Added (2 new methods):**

| Method         | Type   | Purpose              |
|----------------|--------|----------------------|
| `getCronEntry` | Query  | Get raw cron line    |
| `setCronEntry` | Action | Set/replace cron line|

The cron subsystem now tracks three entry states:
- **`active`** — Enabled and scheduled
- **`suspended`** — Disabled but recoverable
- **`disabled`** — Fully off

`getCronStatus` returns new diagnostic fields:
- `cron_line_multi` — Multiple entries detected
- `cron_line_parse_ok` — Expression validity
- `cron_line_state` — One of: `active`,
  `suspended`, `disabled`, `multi`,
  `unsupported`, `missing`
- `entry` — Raw matched cron line

Bumped from **11** to **13**, reflecting the new
methods and enhanced `getCronStatus` response shape.

Two new methods added to the rpcd ACL file
(`luci-app-adblock-fast.json`):
- `getCronEntry` (read section)
- `setCronEntry` (write section)

---

**LuciCompat** bumped from `11` to `13`.

**Data fetching refactored:**
- Removed separate `getServiceInfo()` ubus call
- `initStatus` response now provides all data
  (package compat, errors, warnings) in one call
- `ubus` object built from `initData` properties
  instead of separate service instance query

**New "Service Details" section:**
- Blocking stats, DNS backend info, compressed
  cache status, force-DNS ports, and donation
  link moved from inline status text to a
  separate collapsible `detailsDiv`
- Main status area now shows only the essential
  state label and cache info when stopped

**Cron warning logic rewritten:**
- Warnings only displayed when service is both
  enabled and running
- New `warningCronEntryMismatch` warning for
  suspended or unparseable cron entries
- Suggests "Resync Cron" action when
  `cronSyncNeeded` is detected
- Pre-existing checks for missing/disabled cron
  daemon preserved but now gated behind
  `showCronWarnings` flag

**Cron sync flow rewritten:**
1. Fetches current entry via `getCronEntry()`
2. Strips comment markers and suspended/disabled
   tags from the entry
3. Writes cleaned entry via `setCronEntry()`
4. Reloads page only on success

**New exports:** `getCronEntry`, `setCronEntry`

**New helper: `parseCronEntry(cronEntry)`**
- Parses raw cron line into form field values
- Detects schedule mode from cron pattern:
  - `every_n_hours` — `*/N * * * *`
  - `every_n_days` — `M H */N * *`
  - `monthly` — `M H D * *`
  - `weekly` — `M H * * D`
  - `daily` — `M H * * *` (default)
- Returns config object with: `auto_update_enabled`,
  `auto_update_mode`, `auto_update_hour`,
  `auto_update_minute`, `auto_update_weekday`,
  `auto_update_monthday`, `auto_update_every_ndays`,
  `auto_update_every_nhours`
- Falls back to defaults for unparseable entries

**New helper: `generateCronEntry(config)`**
- Inverse of `parseCronEntry`
- Converts form config object back to cron syntax
- Returns empty string when auto-update disabled
- Output format:
  `M H DOM * DOW /etc/init.d/adblock-fast dl`
  `# adblock-fast-auto`

**Data loading consolidated:**
- Removed separate `getFileUrlFilesizes()` and
  `getPlatformSupport()` calls
- Now fetches `getInitStatus()` + `getCronStatus()`
- Sizes and platform data extracted from the
  unified `initStatus` response

**New "List Updates Schedule" tab:**
- All scheduling options moved from `tab_advanced`
  to dedicated `tab_schedule`
- Options: `auto_update_enabled`,
  `auto_update_mode`, `auto_update_every_ndays`,
  `auto_update_every_nhours`, `auto_update_weekday`,
  `auto_update_monthday`, `auto_update_hour`,
  `auto_update_minute`
- Each option's `cfgvalue()` overridden to read
  from parsed cron config instead of UCI
- `config_update_enabled` remains on `tab_advanced`

**Schedule persistence moved to crontab:**
- Old: scheduling fields saved to UCI config, then
  `syncCron` called after `uci-applied` event to
  generate cron entry from config
- New: `handleSave()` collects form values, calls
  `generateCronEntry()`, writes directly via
  `setCronEntry()`, then removes scheduling fields
  from UCI before saving remaining config
- Result: schedule lives in crontab, survives
  config resets

**`handleSaveApply` simplified:**
- Old: chained `handleSave` → listener for
  `uci-applied` → `syncCron` → page reload
- New: `handleSave()` → `ui.changes.apply()`
- Cron already updated during save, no separate
  sync step needed

**Instance handling fix:**
- `dnsmasq_instance` and `smartdns_instance` write
  overrides now wrap values in arrays
- Ensures instances stored as UCI lists, not
  scalar strings

---

**2 new strings added:**
- `"List Updates Schedule"` — New tab header
- `"Service Details"` — New status section header

**0 strings removed, 0 strings reworded.**

All other changes are source line number updates
from the JavaScript refactoring. Existing
translations remain valid; translators only need
to handle the 2 new entries.

---

Adds the full AGPL-3.0-or-later license text
(661 lines), matching the `PKG_LICENSE` field
already declared in the Makefile.

---

- `rpcdCompat` bumped from `11` to `13`
- `LuciCompat` bumped from `11` to `13`
- Requires `rpcd-mod-ucode` (replaces `jsonfilter`)
- Requires companion `adblock-fast` package >=1.2.2
  (for the shared `/lib/adblock-fast/adblock-fast.uc`
  library imported by the rpcd ucode module)
- All existing RPC methods preserved; 2 new ones
  added
- All existing UI functionality preserved;
  scheduling options reorganized into dedicated tab

Signed-off-by: Stan Grishin <stangri@melmac.ca>
2026-02-26 17:00:29 -08:00
..
2026-02-24 03:52:31 +01:00
2026-02-24 03:52:36 +01:00