Cache the watchdog payload, and stop reading trailing comments as conf values
The tab collected over SSH on every 30s poll — 8.3s a load with HOST2 down. vv_parse_conf_scalar() captured to end of line, so a commented toggle parsed as "true # HOST2 back online": every threshold read right because (int) stops at the first non-digit, and 38 booleans read wrong. The Fallback tab has been showing failover disabled while it was on.
This commit is contained in:
@@ -648,9 +648,25 @@ function vv_format_uptime(int $seconds): string {
|
||||
// Parse a scalar value from raw conf text. Matches KEY="value" or KEY=value.
|
||||
// Identical logic was previously duplicated as vv_arr_scalar / vv_wd_scalar /
|
||||
// vv_fb_scalar / vv_media_conf_scalar — all reduce to this one regex.
|
||||
//
|
||||
// Trailing comments are stripped, which the single-regex version did not do. It captured to the
|
||||
// end of the line, so `FALLBACK_ENABLED=true # HOST2 back online` parsed as the whole string
|
||||
// `true # HOST2 back online`. Numeric readings survived that — (int) and (float) stop at the
|
||||
// first non-digit — which is why it went unnoticed: every threshold was right and every boolean
|
||||
// was wrong. `=== 'true'` was false for any commented var, and worse, `!== 'false'` was TRUE for
|
||||
// one, so a commented-out-to-off switch read as on. Roughly half of master.conf's toggles carry
|
||||
// an inline comment.
|
||||
//
|
||||
// The quoted forms are extracted before that, because inside quotes a # is data, not a comment —
|
||||
// a password or a colour would otherwise be truncated at the first hash. Unquoted, the comment
|
||||
// must be introduced by whitespace, matching bash: FOO=#fff and FOO=bar#baz both assign literally,
|
||||
// since # only opens a comment at the start of a word.
|
||||
function vv_parse_conf_scalar(string $raw, string $key): string {
|
||||
return preg_match('/^\s*' . preg_quote($key, '/') . '\s*=\s*"?([^"\n]*)"?/m', $raw, $m)
|
||||
? trim($m[1]) : '';
|
||||
if (!preg_match('/^\s*' . preg_quote($key, '/') . '\s*=\s*(.*)$/m', $raw, $m)) return '';
|
||||
$v = ltrim($m[1]);
|
||||
if (preg_match('/^"([^"\n]*)"/', $v, $q)) return $q[1];
|
||||
if (preg_match("/^'([^'\n]*)'/", $v, $q)) return $q[1];
|
||||
return trim(preg_replace('/\s+#.*$/', '', $v));
|
||||
}
|
||||
|
||||
// Parse a key=value state file (e.g. fallback_state.db, partnership_state.db).
|
||||
|
||||
Reference in New Issue
Block a user