Add barnard-ui session logging and wormhole log sharing

This commit is contained in:
Brandon McGinty (deepseek)
2026-08-14 12:29:42 -04:00
committed by Brandon McGinty
parent c0ef036934
commit d2dff7f521
+165 -1
View File
@@ -38,6 +38,10 @@ configDir="$HOME/.config/barnard"
serverFile="$configDir/servers.conf"
certFile="$configDir/barnard.pem"
logFile="$cacheDir/${0##*/}.log"
logDir="$HOME/barnard-logs"
logPrefsFile="$configDir/logging.conf"
sessionLogFile=""
saveSessionLogs=0
if ! mkdir -p "$cacheDir" "$configDir"; then
printf 'Could not create Barnard configuration directories.\n' >&2
@@ -64,6 +68,9 @@ log() {
local line
while IFS= read -r line ; do
printf '%s\n' "$line" >> "$logFile"
if [[ -n "$sessionLogFile" ]]; then
printf '%s\n' "$line" >> "$sessionLogFile"
fi
done
}
@@ -141,6 +148,12 @@ trim() {
printf '%s' "$value"
}
sanitize_filename() {
local value="$1"
value="${value//[^[:alnum:]_.-]/_}"
printf '%s' "$value"
}
field_is_valid() {
local value="$1"
[[ "$value" != *$'\n'* && "$value" != *$'\r'* ]]
@@ -376,6 +389,139 @@ config_has_nonempty_value() {
return 1
}
load_logging_pref() {
local line
local key
local value
saveSessionLogs=0
[[ -r "$logPrefsFile" ]] || return 0
while IFS= read -r line || [[ -n "$line" ]]; do
line="$(trim "$line")"
[[ -z "$line" || "$line" == \#* || "$line" != *=* ]] && continue
key="${line%%=*}"
key="$(trim "$key")"
key="${key,,}"
value="${line#*=}"
value="$(trim "$value")"
case "$key" in
savesessionlogs)
if [[ "$value" == "1" || "$value" == "true" || "$value" == "yes" ]]; then
saveSessionLogs=1
fi
;;
esac
done < "$logPrefsFile"
}
save_logging_pref() {
local tmpFile="$logPrefsFile.tmp"
if ! printf 'saveSessionLogs=%s\n' "$saveSessionLogs" > "$tmpFile"; then
rm -f "$tmpFile"
msgbox "$(gettext "Could not save logging preference.")"
return 1
fi
chmod 600 "$tmpFile" 2> /dev/null || true
if ! mv "$tmpFile" "$logPrefsFile"; then
rm -f "$tmpFile"
msgbox "$(gettext "Could not save logging preference.")"
return 1
fi
}
toggle-session-logging() {
local question
if (( saveSessionLogs )); then
question="$(gettext "Session logging is currently enabled. Disable it?")"
else
question="$(gettext "Session logging is currently disabled. Enable saving logs to the logs directory?")"
fi
if [[ "$(yesno "$question")" == "Yes" ]]; then
if (( saveSessionLogs )); then
saveSessionLogs=0
else
saveSessionLogs=1
fi
save_logging_pref
fi
}
send-logs() {
local bundle
local outputFile
local code
local wormholePid
local status
local i
local detail
if ! command -v wormhole > /dev/null 2>&1; then
msgbox "$(gettext "Required command not found:") wormhole"
return
fi
if ! command -v tar > /dev/null 2>&1; then
msgbox "$(gettext "Required command not found:") tar"
return
fi
if [[ ! -d "$logDir" ]] || ! compgen -G "$logDir"/*.log > /dev/null 2>&1; then
msgbox "$(gettext "No logs to send. Logs are saved to:") $logDir"
return
fi
bundle="$cacheDir/barnard-logs-$(date +%Y%m%d-%H%M%S).tar.gz"
if ! tar -czf "$bundle" -C "$logDir" . 2> /dev/null; then
msgbox "$(gettext "Could not create log archive.")"
return
fi
outputFile="$cacheDir/wormhole-$$.txt"
wormhole send "$bundle" > "$outputFile" 2>&1 &
wormholePid=$!
code=""
for (( i = 0; i < 40; i++ )); do
sleep 0.25
code="$(grep -Eo '[0-9]+-[a-z]+-[a-z]+' "$outputFile" 2> /dev/null | head -n1)"
[[ -n "$code" ]] && break
kill -0 "$wormholePid" 2> /dev/null || break
done
if [[ -n "$code" ]]; then
msgbox "$(gettext "Wormhole code:") $code"
wait "$wormholePid"
status=$?
if (( status == 0 )); then
msgbox "$(gettext "Logs sent successfully.")"
else
msgbox "$(gettext "Log transfer did not complete successfully.")"
fi
else
kill "$wormholePid" 2> /dev/null || true
wait "$wormholePid" 2> /dev/null || true
detail="$(tail -n 3 "$outputFile" 2> /dev/null)"
if [[ -n "$detail" ]]; then
msgbox "$(gettext "Could not start wormhole transfer:") $detail"
else
msgbox "$(gettext "Could not start wormhole transfer.")"
fi
fi
rm -f "$outputFile" "$bundle"
}
manage-logs() {
local action
while : ; do
action="$(menulist "$(gettext "Toggle session logging")" "$(gettext "Send logs with wormhole")" "$(gettext "Go Back")")" || return
case "$action" in
"$(gettext "Toggle session logging")") toggle-session-logging ;;
"$(gettext "Send logs with wormhole")") send-logs ;;
"$(gettext "Go Back")"|"") return ;;
esac
done
}
add-server() {
local serverName
local serverAddress
@@ -424,6 +570,7 @@ add-server() {
connect() {
local serverName
local barnardStatus
local safeServerName
local -a names=()
local -a barnardArgs=()
@@ -440,6 +587,20 @@ connect() {
require_command barnard barnard
sessionLogFile=""
if (( saveSessionLogs )); then
safeServerName="$(sanitize_filename "$serverName")"
if ! mkdir -p "$logDir"; then
msgbox "$(gettext "Could not create logs directory:") $logDir"
else
sessionLogFile="$logDir/${safeServerName}-$(date +%F).log"
if ! : >> "$sessionLogFile"; then
msgbox "$(gettext "Could not write log file:") $sessionLogFile"
sessionLogFile=""
fi
fi
fi
barnardArgs=(-server "${serverAddresses[$serverName]}:${serverPorts[$serverName]}")
if [[ -n "${serverPasswords[$serverName]}" ]]; then
barnardArgs+=(-password "${serverPasswords[$serverName]}")
@@ -456,6 +617,7 @@ connect() {
command barnard "${barnardArgs[@]}" --fifo "$configDir/cmd" --buffers 16 |& log
barnardStatus=${PIPESTATUS[0]}
sessionLogFile=""
if (( barnardStatus != 0 )); then
msgbox "$(gettext "Barnard exited with status") $barnardStatus. $(gettext "See log:") $logFile"
fi
@@ -581,14 +743,16 @@ main() {
require_command dialog dialog
load_servers
load_logging_pref
while : ; do
action="$(menulist "$(gettext "Connect")" "$(gettext "Add server")" "$(gettext "Remove server")" "$(gettext "Manage Certificate")" "$(gettext "Exit")")" || exit 0
action="$(menulist "$(gettext "Connect")" "$(gettext "Add server")" "$(gettext "Remove server")" "$(gettext "Manage Certificate")" "$(gettext "Logs")" "$(gettext "Exit")")" || exit 0
case "$action" in
"$(gettext "Connect")") connect ;;
"$(gettext "Add server")") add-server ;;
"$(gettext "Remove server")") remove-server ;;
"$(gettext "Manage Certificate")") manage-certificate ;;
"$(gettext "Logs")") manage-logs ;;
"$(gettext "Exit")"|"") exit 0 ;;
esac
done