Skip to content

Instantly share code, notes, and snippets.

@jusa
Last active October 31, 2025 12:03
Show Gist options
  • Save jusa/91a86d589b0c2c58e95c9d63247686e8 to your computer and use it in GitHub Desktop.
Save jusa/91a86d589b0c2c58e95c9d63247686e8 to your computer and use it in GitHub Desktop.
#!/bin/sh
VERSION=6
GATHER_LOGS_BASE_DIR="/home/_gather_logs_tmp_$VERSION"
GATHER_LOGS_DIR="$GATHER_LOGS_BASE_DIR/sailfish_logs"
USE_USER=root
USE_GROUP=root
if [ $(id -u) != 0 ]; then
echo "This script needs to be run as root."
exec devel-su -c /bin/sh "$0" --user $(id -un) $(id -gn)
fi
if [ "$1" = "--user" ]; then
USE_USER="$2"
USE_GROUP="$3"
fi
log_debug() {
if [ -n "$DEBUG" ]; then
echo "$@"
fi
}
FIRST_NAME=1
log_name() {
if [ $FIRST_NAME -eq 1 ]; then
printf "$@..."
FIRST_NAME=0
else
printf "\b\b\b, $@..."
fi
}
copy_to_backup() {
FILENAME="$1"
if [ -f "$FILENAME" ]; then
mkdir -p "$GATHER_LOGS_DIR/backup"
cp "$FILENAME" "$GATHER_LOGS_DIR/backup"
fi
}
copy_from_backup() {
ORIG_FILE="$1"
FILENAME="$(basename $ORIG_FILE)"
if [ -f "$GATHER_LOGS_DIR/backup/$FILENAME" ]; then
log_debug "Restore $ORIG_FILE"
cp "$GATHER_LOGS_DIR/backup/$FILENAME" "$ORIG_FILE"
fi
}
echo "$(basename $0) version $VERSION"
log_journal() {
CONF_FILE="/etc/systemd/journald.conf"
log_name "journald"
if [ "$1" = "1" ]; then
# Disable rate limiter in journal
copy_to_backup $CONF_FILE
sed -i 's/.*Storage=.*/Storage=persistent/' $CONF_FILE
sed -i 's/.*SystemMaxUse=.*/SystemMaxUse=50M/' $CONF_FILE
sed -i 's/.*RateLimitBurst.*/RateLimitBurst=0/' $CONF_FILE
sed -i 's/.*RateLimitInterval=.*/RateLimitInterval=0/g' $CONF_FILE
sed -i 's/^RuntimeMaxUse/#RuntimeMaxUse/g' $CONF_FILE
else
journalctl --output=json > "$GATHER_LOGS_DIR/journal.json"
cp -a /var/log/journal $GATHER_LOGS_DIR/journal.bin
copy_from_backup $CONF_FILE
fi
}
log_logcat() {
log_name "logcat"
/system/bin/logcat -d -f "$GATHER_LOGS_DIR/logcat"
}
log_pulseaudio() {
CONF_FILE="/etc/sysconfig/pulseaudio"
log_name "pulseaudio"
if [ "$1" = "1" ]; then
# Enable verbose logging for PulseAudio
copy_to_backup $CONF_FILE
sed -i -e 's/\(CONFIG=".*\)"/\1 -vvvvv"/' $CONF_FILE
else
copy_from_backup $CONF_FILE
fi
}
log_ohmd() {
CONF_FILE="/etc/sysconfig/ohmd.debug"
log_name "ohmd"
if [ "$1" = "1" ]; then
# Enable verbose logging for OHM
copy_to_backup $CONF_FILE
echo "DEBUG_FLAGS='--verbose=all --trace=\"* format [%C:%L] ; * enabled;* target stdout;*.*=all\"'" > $CONF_FILE
else
rm -f $CONF_FILE
copy_from_backup $CONF_FILE
fi
}
log_bluez() {
CONF_FILE="/etc/tracing/bluez/bluez.tracing"
log_name "bluez"
if [ "$1" = "1" ]; then
# Enable verbose logging for BlueZ
copy_to_backup $CONF_FILE
mkdir -p /etc/tracing/bluez
echo -e "TRACING=-d\nMGMT_DEBUG=1" > $CONF_FILE
else
rm -f $CONF_FILE
copy_from_backup $CONF_FILE
fi
}
log_ofono() {
CONF_FILE="/var/lib/environment/ofono/gather_logs.conf"
log_name "ofono"
if [ "$1" = "1" ]; then
# Enable verbose logging for oFono
copy_to_backup $CONF_FILE
mkdir -p /var/lib/environment/ofono
echo "OFONO_DEBUG=-d" > $CONF_FILE
else
rm -f $CONF_FILE
copy_from_backup $CONF_FILE
fi
}
log_appsupport() {
CONF_FILE="/etc/appsupport.conf.d/99-xgather-logs.conf"
if [ ! -d "/opt/appsupport" ]; then
return
fi
log_name "appsupport"
if [ "$1" = "1" ]; then
# Enable AppSupport verbose logging
copy_to_backup $CONF_FILE
mkdir -p $GATHER_LOGS_DIR/appsupport-persistent-logcat
mkdir -p /etc/appsupport.conf.d
cat >$CONF_FILE <<EOF
[Config]
CrashLoggerLogLevel=verbose
LogcatLogEnabled=true
LogcatLogPath=$GATHER_LOGS_DIR/appsupport-persistent-logcat
[Features]
CrashLoggerEnabled=true
[Logging]
appsupport.*=Debug
[Audio]
Verbose=true
EOF
else
rm -f $CONF_FILE
copy_from_backup $CONF_FILE
ACTIVE_INSTANCE="$(appsupport-service active)"
if [ -n "$ACTIVE_INSTANCE" ] && appsupport-service -q is-active $ACTIVE_INSTANCE >/dev/null; then
/usr/sbin/appsupport-attach /bin/logcat -d '*:V' > $GATHER_LOGS_DIR/appsupport-logcat.log
/usr/sbin/appsupport-attach /bin/dumpsys 2> $GATHER_LOGS_DIR/appsupport-dumpsys-err.log 1> $GATHER_LOGS_DIR/appsupport-dumpsys.log
# This will just sync the log files to disk
appsupport-config --active --logcat 1> /dev/null 2>/dev/null
fi
if [ -d /tmp/appsupport/crashlogs ]; then
cp -a /tmp/appsupport/crashlogs $GATHER_LOGS_DIR/appsupport-crashlogs
fi
fi
}
log_installed_packages() {
log_name "installed packages"
rpm -qa > "$GATHER_LOGS_DIR/installed-packages"
}
log_system() {
mkdir -p "$GATHER_LOGS_DIR/etc"
for FILENAME in /etc/hw-release /etc/sailfish-release /etc/group; do
if [ -f "$FILENAME" ]; then
log_name "$FILENAME"
cp $FILENAME "$GATHER_LOGS_DIR/etc"
fi
done
log_name "/etc/passwd (contains only user names, no passwords)"
cp /etc/passwd $GATHER_LOGS_DIR/etc
log_name "ssu"
ssu lr 1> "$GATHER_LOGS_DIR/ssu-lr" 2> "$GATHER_LOGS_DIR/ssu-lr.err"
df 1> $GATHER_LOGS_DIR/df 2> $GATHER_LOGS_DIR/df.err
log_name "mounts"
mount 1> "$GATHER_LOGS_DIR/mount" 2> "$GATHER_LOGS_DIR/mount.err"
log_name "running processes"
ps > "$GATHER_LOGS_DIR/ps"
log_name "device nodes"
ls -l -R /dev > "$GATHER_LOGS_DIR/ls-dev"
log_name "list of files in etc (no contents)"
ls -l -R /etc > "$GATHER_LOGS_DIR/ls-etc"
log_name "system services"
systemctl > $GATHER_LOGS_DIR/systemctl
log_name "user services"
systemctl-user > $GATHER_LOGS_DIR/systemctl-user
}
log_verify() {
log_name "verify system"
rpm -V -a 1> $GATHER_LOGS_DIR/rpm-verify 2> $GATHER_LOGS_DIR/rpm-verify-err
}
LOG_PACKAGE="sailfish_logs_$(date +%Y.%m.%d-%H.%M.%S).tar.gz"
log_package() {
log_name "making a tarball"
tar czf "$LOG_PACKAGE" -C "$GATHER_LOGS_BASE_DIR" sailfish_logs
chown $USE_USER:$USE_GROUP "$LOG_PACKAGE"
}
if [ ! -d "$GATHER_LOGS_DIR" ]; then
mkdir -p $GATHER_LOGS_DIR
echo -n "Preparing for logging... "
log_journal 1
log_pulseaudio 1
log_ohmd 1
log_bluez 1
log_ofono 1
log_appsupport 1
sync
echo ""
echo ""
echo "System prepared for logging."
echo ""
echo "Please restart your device, run it until the issue is reproduced, then run this script again."
echo ""
else
echo -n "Gathering logs... "
echo "$VERSION" > "$GATHER_LOGS_DIR/gather_logs_version"
# Gather logs and restore original state
log_system
log_logcat
log_installed_packages
log_journal 0
log_pulseaudio 0
log_ohmd 0
log_bluez 0
log_ofono 0
log_appsupport 0
log_verify
log_package
rm -r -f "$GATHER_LOGS_BASE_DIR"
echo ""
echo ""
echo "Logs gathered."
echo ""
echo "Please submit $LOG_PACKAGE for investigation, thank you!"
echo ""
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment