Last active
October 31, 2025 12:03
-
-
Save jusa/91a86d589b0c2c58e95c9d63247686e8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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