* Detect and repair RRDfile Data Source count mismatches via RRDtune
Report when a Graph requires more or fewer Data Sources than its RRDfile
contains, generate the rrdtool tune DS:/DEL: command to correct it, and run
it when the RRDfile is writable. Applies to data_debug (rrdtool_cacti_compare)
and the RRDchecker batch process (do_rrdcheck). The decision logic lives in
pure helpers (rrdtool_cacti_compare_ds, rrdcheck_ds_findings) with unit tests.
Resolves#8366
* rrdcheck: only probe local writability for local storage
Under the storage proxy the RRDfile is remote, so is_resource_writable()
checks the wrong filesystem. Skip the local probe when using the proxy and
let it enforce remote permissions and report failures via its response.
* rrdcheck: validate tune args, enforce RRA containment, fix failure detection
Validate every tune specification against RRDtool's documented DS grammar
(ds-name 1-19 [a-zA-Z0-9_], known DST, integer heartbeat, numeric-or-U min/max)
and escape it before use. For local storage require the RRDfile to resolve
inside the RRA directory via data_source_path_within_rra(). Detect failures
from the real return value (false/null/empty or missing OK) instead of casting
to string, so a failed tune is no longer logged as success.
* rrd: normalize a 0/0 data source range to 0:U when building a tune add spec
rrdtool_function_info_from_ds() passes min/max through unchanged, so a source
stored as 0/0 produced DS:name:type:hb:0:0 which RRDtool rejects. Mirror RRD
creation and emit 0:U so the repair paths can restore those sources.