CRITICAL FIX: Kiosk offline + PTT not muting issues

This fixes two critical bugs that prevented the kiosk client from
working properly.

ISSUE 1: Kiosk User Offline/Can't Connect
==========================================
Problem: Client installed but showed offline, couldn't register
with Asterisk server. Services weren't starting properly for
headless/non-logged-in users.

Root Causes:
- Missing DBUS_SESSION_BUS_ADDRESS environment variable
- Insufficient wait time for PipeWire and network
- No logging to diagnose startup issues
- Service dependencies not strong enough

Fixes:
✓ Added DBUS_SESSION_BUS_ADDRESS to all user services
✓ Increased startup delays (5s for baresip, 8s for PTT)
✓ Changed Wants to Requires for pipewire-pulse (hard dependency)
✓ Added StandardOutput/StandardError=journal for logging
✓ Increased RestartSec from 5s to 10s for more stable restarts

ISSUE 2: PTT Not Muting Microphone
===================================
Problem: PTT configured but microphone NOT muted on startup,
pressing PTT button did nothing, had to manually mute.

Root Causes:
- kiosk-ptt script missing XDG_RUNTIME_DIR environment
- pactl commands failing silently without proper context
- No wait for PipeWire to be ready before muting
- No logging to see what was happening

Fixes:
✓ Added XDG_RUNTIME_DIR detection/setup in PTT script
✓ Added 10-second wait loop for PipeWire to become ready
✓ Added error handling with logger for failed pactl commands
✓ Added logging for all PTT press/release events
✓ Export KIOSK_UID env var in PTT service

Enhanced Logging & Diagnostics
===============================
All services now log to systemd journal with tags:

- baresip-launcher: Network detection, config verification, startup
- kiosk-ptt: Startup, mic mute status, PTT press/release events
- baresip.service: Service output (via StandardOutput=journal)

View logs:
  journalctl -t baresip-launcher -f
  journalctl -t kiosk-ptt -f
  sudo -u kiosk journalctl --user -u baresip -f

New Features
============
1. Enhanced Diagnostics (Client Management > Run Diagnostics):
   - Shows launcher logs (last 10 lines)
   - Shows PTT logs (last 5 lines)
   - Shows Baresip service logs (last 10 lines)
   - Displays commands to view live logs

2. Manual Audio Fix Tool (Tools > Fix Audio):
   - Restarts PipeWire services
   - Unmutes microphone and speaker
   - Sets volume to 75%
   - Restarts Baresip
   - Shows current status

Improved Baresip Launcher
==========================
- Logs all startup steps
- Verifies config and accounts files exist
- Better network wait logic with logging
- Clear error messages if files missing
- Network detection logs which interface found

Testing After Update
====================
1. For existing installs - restart services:
   sudo -u kiosk systemctl --user daemon-reload
   sudo -u kiosk systemctl --user restart pipewire pipewire-pulse baresip

2. Check status:
   sudo -u kiosk systemctl --user status baresip

3. View logs:
   journalctl -t baresip-launcher -n 50
   journalctl -t kiosk-ptt -n 20

4. If still offline:
   Main Menu > Tools > Fix Audio (Unmute & Restart)

This should resolve both the offline connection issue and the
PTT mic muting problem. All operations now have proper logging
for easier troubleshooting.
This commit is contained in:
Claude
2025-12-03 19:01:08 +00:00
parent 7921c959ff
commit a4b29082e7
+122 -9
View File
@@ -1037,16 +1037,43 @@ PTT_CONFIG="/etc/easy-asterisk/ptt-device"
# Exit if no PTT device configured - leave audio unmuted for normal kiosk operation
[[ -z "$PTT_DEVICE" ]] && exit 0
# Ensure we have the user's runtime directory
if [[ -z "$XDG_RUNTIME_DIR" ]]; then
# If running as systemd service, this should already be set
# But if not, try to detect it
if [[ -n "$KIOSK_UID" ]]; then
export XDG_RUNTIME_DIR="/run/user/${KIOSK_UID}"
else
# Fall back to current user
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
fi
fi
# Wait for PipeWire/PulseAudio to be ready
for i in {1..10}; do
if pactl info >/dev/null 2>&1; then
break
fi
sleep 1
done
# PTT mode: Mute audio source on start, unmute only when button pressed
pactl set-source-mute @DEFAULT_SOURCE@ 1
pactl set-source-mute @DEFAULT_SOURCE@ 1 2>/dev/null || {
logger -t kiosk-ptt "ERROR: Failed to mute audio source"
exit 1
}
logger -t kiosk-ptt "PTT handler started, microphone muted, listening on $PTT_DEVICE"
# Unmute on press, mute on release
evtest --grab "$PTT_DEVICE" 2>/dev/null | while read -r line; do
if [[ "$line" =~ "value 1" ]]; then
pactl set-source-mute @DEFAULT_SOURCE@ 0
pactl set-source-mute @DEFAULT_SOURCE@ 0 2>/dev/null
logger -t kiosk-ptt "PTT pressed - mic unmuted"
fi
if [[ "$line" =~ "value 0" ]]; then
pactl set-source-mute @DEFAULT_SOURCE@ 1
pactl set-source-mute @DEFAULT_SOURCE@ 1 2>/dev/null
logger -t kiosk-ptt "PTT released - mic muted"
fi
done
PTTSCRIPT
@@ -1447,8 +1474,20 @@ run_client_diagnostics() {
fi
fi
echo "---------------------------------------------------"
echo "Last 15 lines of log:"
sudo -u "$t_user" journalctl --user -u baresip -n 15 --no-pager 2>/dev/null || echo " No logs"
echo "System Logs (launcher):"
journalctl -t baresip-launcher -n 10 --no-pager 2>/dev/null | tail -10 || echo " No launcher logs"
echo ""
echo "System Logs (PTT):"
journalctl -t kiosk-ptt -n 5 --no-pager 2>/dev/null | tail -5 || echo " No PTT logs"
echo ""
echo "Baresip Service Log:"
sudo -u "$t_user" journalctl --user -u baresip -n 10 --no-pager 2>/dev/null || echo " No logs"
echo "---------------------------------------------------"
echo ""
echo "To see live logs, run:"
echo " journalctl -t baresip-launcher -f # Launcher logs"
echo " journalctl -t kiosk-ptt -f # PTT logs"
echo " sudo -u $t_user journalctl --user -u baresip -f # Baresip logs"
echo "---------------------------------------------------"
}
@@ -1889,25 +1928,49 @@ create_baresip_launcher() {
cat > /usr/local/bin/easy-asterisk-launcher << LAUNCHER
#!/bin/bash
CONFIG_FILE="/home/${launcher_user}/.baresip/config"
ACCOUNTS_FILE="/home/${launcher_user}/.baresip/accounts"
TARGETS=("8.8.8.8" "1.1.1.1" "9.9.9.9")
FOUND_IFACE=""
logger -t baresip-launcher "Starting Baresip launcher for user ${launcher_user}"
# Wait for network
for i in {1..6}; do
for target in "\${TARGETS[@]}"; do
IFACE=\$(ip route get "\$target" 2>/dev/null | awk '{for(i=1;i<=NF;i++) if(\$i=="dev") print \$(i+1)}' | head -1)
if [[ -n "\$IFACE" ]]; then
FOUND_IFACE="\$IFACE"
logger -t baresip-launcher "Network found on interface: \$IFACE"
break 2
fi
done
logger -t baresip-launcher "Waiting for network... (attempt \$i/6)"
sleep 5
done
if [[ -z "\$FOUND_IFACE" ]]; then
logger -t baresip-launcher "ERROR: No network interface found after 30 seconds"
fi
# Update network interface in config
if [[ -f "\$CONFIG_FILE" && -n "\$FOUND_IFACE" ]]; then
sed -i '/^#*net_interface/d' "\$CONFIG_FILE"
echo "net_interface \${FOUND_IFACE}" >> "\$CONFIG_FILE"
logger -t baresip-launcher "Updated config with interface: \$FOUND_IFACE"
fi
# Verify config files exist
if [[ ! -f "\$CONFIG_FILE" ]]; then
logger -t baresip-launcher "ERROR: Config file not found: \$CONFIG_FILE"
exit 1
fi
if [[ ! -f "\$ACCOUNTS_FILE" ]]; then
logger -t baresip-launcher "ERROR: Accounts file not found: \$ACCOUNTS_FILE"
exit 1
fi
logger -t baresip-launcher "Starting Baresip client..."
exec /usr/bin/baresip -f "/home/${launcher_user}/.baresip"
LAUNCHER
chmod +x /usr/local/bin/easy-asterisk-launcher
@@ -1928,13 +1991,18 @@ enable_client_services() {
Description=Baresip SIP Client
After=pipewire.service pipewire-pulse.service network-online.target
Wants=network-online.target pipewire.service pipewire-pulse.service
Requires=pipewire-pulse.service
[Service]
Type=simple
ExecStartPre=/bin/sleep 5
ExecStart=/usr/local/bin/easy-asterisk-launcher
Restart=always
RestartSec=5
RestartSec=10
Environment=XDG_RUNTIME_DIR=/run/user/${KIOSK_UID}
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${KIOSK_UID}/bus
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
@@ -1944,16 +2012,21 @@ EOF
cat > "${systemd_dir}/kiosk-ptt.service" << EOF
[Unit]
Description=PTT Button Handler
After=pipewire.service
After=pipewire.service pipewire-pulse.service baresip.service
Requires=pipewire-pulse.service
ConditionPathExists=/etc/easy-asterisk/ptt-device
[Service]
Type=simple
ExecStartPre=/bin/sleep 3
ExecStartPre=/bin/sleep 8
ExecStart=/usr/local/bin/kiosk-ptt
Restart=always
RestartSec=5
RestartSec=10
Environment=XDG_RUNTIME_DIR=/run/user/${KIOSK_UID}
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${KIOSK_UID}/bus
Environment=KIOSK_UID=${KIOSK_UID}
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
@@ -2512,16 +2585,56 @@ submenu_client() {
[[ "$choice" != "0" ]] && submenu_client
}
fix_audio_manually() {
print_header "Manual Audio Fix"
load_config
local t_user="${KIOSK_USER:-$SUDO_USER}"
t_user="${t_user:-$USER}"
local t_uid=$(id -u "$t_user" 2>/dev/null)
local user_dbus="XDG_RUNTIME_DIR=/run/user/$t_uid"
echo "Fixing audio for user: $t_user"
echo ""
# Restart PipeWire services
echo "Restarting PipeWire services..."
sudo -u "$t_user" $user_dbus systemctl --user restart pipewire pipewire-pulse 2>/dev/null || true
sleep 2
# Unmute audio
echo "Unmuting audio sources and sinks..."
sudo -u "$t_user" $user_dbus pactl set-source-mute @DEFAULT_SOURCE@ 0 2>/dev/null && echo " ✓ Microphone unmuted" || echo " ✗ Failed to unmute microphone"
sudo -u "$t_user" $user_dbus pactl set-sink-mute @DEFAULT_SINK@ 0 2>/dev/null && echo " ✓ Speaker unmuted" || echo " ✗ Failed to unmute speaker"
# Set volume
echo "Setting volume levels to 75%..."
sudo -u "$t_user" $user_dbus pactl set-source-volume @DEFAULT_SOURCE@ 75% 2>/dev/null && echo " ✓ Microphone volume set" || echo " ✗ Failed to set microphone volume"
sudo -u "$t_user" $user_dbus pactl set-sink-volume @DEFAULT_SINK@ 75% 2>/dev/null && echo " ✓ Speaker volume set" || echo " ✗ Failed to set speaker volume"
echo ""
echo "Current audio status:"
local src_mute=$(sudo -u "$t_user" $user_dbus pactl get-source-mute @DEFAULT_SOURCE@ 2>/dev/null | awk '{print $2}')
local sink_mute=$(sudo -u "$t_user" $user_dbus pactl get-sink-mute @DEFAULT_SINK@ 2>/dev/null | awk '{print $2}')
echo " Microphone: ${src_mute:-unknown}"
echo " Speaker: ${sink_mute:-unknown}"
echo ""
echo "Restarting Baresip..."
sudo -u "$t_user" $user_dbus systemctl --user restart baresip 2>/dev/null && echo " ✓ Baresip restarted" || echo " ✗ Failed to restart Baresip"
}
submenu_tools() {
clear
print_header "Tools"
echo " 1) Audio Test"
echo " 2) Verify Audio/Codec Setup"
echo " 3) Fix Audio (Unmute & Restart)"
echo " 0) Back"
read -p " Select: " choice
case $choice in
1) run_audio_test ;;
2) verify_audio_setup ;;
3) fix_audio_manually ;;
0) return ;;
esac
[[ "$choice" != "0" ]] && read -p "Press Enter..."