presenting the Rawhide Downgrade to past date script

The this script gets the latest updates via dnf log files and reversed the system back to a given date in time, that is still in the logfile.

Presenting the Rawhide Downgrade to past date script

It’s far from perfect, but tries it’s best.  You need to install koji package first:  „dnf install koji

Most likely outcome: some packages will be missing, because koji can’t find them and some will be double present, with different versions and you end up in a collision. Remove the higher version files manually and do „dnf downgrade ./*rpm

Usage: scriptname {timestamp}

#!/bin/bash

grep "Upgraded:" /var/log/dnf.rpm.log | sort -r > /tmp/liste

mkdir rpmdownload
cd rpmdownload

if [ "" == "$1" ]; then

	echo "Keine Zeit angegeben.. benutze 4.2.2021"
	since=$(date --date="2021-02-04T00:00:00+0100" "+%s")

else 
	since=$(date --date="$1" "+%s")

fi

packs=""

declare -A old = ()

IFS=$'\n'
for line in $(cat /tmp/liste)
do 

	date=$(echo $line|sed -e "s/ .*//g")
	pkg=$(echo $line|sed -e "s/^.*: //g")
	
	time=$(date --date="$date" "+%s")

	if [ $time -gt $since ]; then 
	
		echo "$date => OK => $pkg"
		
		koji download-build --rpm $pkg
		basename=$(rpm -q --queryformat="%{Name}" ./$pgk)

		if [ "${old[$basename]}" != "" ]; then
			echo "found old entry ${old[$basename]}";
			rm -f ${old[$basename]}
		fi 

		$old[$basename]="$pkg"
		packs="$packs $pkg"
		
	else 
	
		echo "$date => IGNORE => $pkg"
	fi
	
done

if [ "$packs" != "" ]; then

	dnf -y downgrade ./*rpm
	
fi 

When is it usefull?

If something, you don’t know of, broke the system by Updates and you need to undo tons of downgrades. Happend to pinephones on the 8th of February 2021.

Fedora: Pinephone kann nicht mehr telefonieren

Liebe Linuxphone-Fans,

seit rund einer Woche funktionierte das Telefonieren auf dem Pinephone, weil endlich alles mit Pipewire verdrahtet wurde. Ein Update später schweigt das Mikro.

Fedora: Pinephone kann nicht mehr telefonieren

Wer jetzt erst das Fedorainstallationsimage vom 31.1.  installiert, darf auf keinen Fall ein Update einspielen. Das ist heute schon die zweite Updatewarnung, aber die hier hat es in sich, denn wir haben keinen Schimmer wieso das nicht mehr geht. Ein Workaround ist daher erst einmal nicht in Sicht.

Dieser Beitrag hier, wurde nur möglich, weil ich genau das Problem mit dem Mikro untersucht habe:

Fedora: Phosh crasht wegen glib2 Patch

Problem ist, daß das voll gepatchte Pinephone zwar technisch telefonieren kann, aber kein Ton vom Angerufenen ankommt, weil das Mikro den Ton nicht mehr aufnimmt. Dies ist aber erst am 8.2. per Update zerschossen worden. Leider waren das hundert Updates, das zu tracken ist schwierig. Weil die Frage schon kam, nein, die Hardwareschalter hat keiner angefasst.

Randnotiz: Torbuntu wäre gestern Abend fast vom Stuhl gekippt, als ich ihm das geschrieben habe 🙂 Tor ist einer der sehr aktiven Entwickler und baut u.a. den Kernel fürs Pinephone.

Golem ist im Test vom Libre M5 letzte Woche der gleiche Bug untergekommen. Vermutlich weil es nicht an den von Puri.sm entwickelten Komponenten lag, sondern am pipewire/alsa/pulse Subsystem. Lassen wir uns überraschen.

Update vom 11.2.2021

Wer schon in die Falle getreten ist, der wird das hier jetzt sehr zu schätzen wissen:

./intelligrade.sh 2021-02-08T00:00:00+0100

und nach einer Weile lädt Koji alle nötigen Pakete nach, und ein paar Doublettenentfernungen später, kann man das System mit 269 Updateschritten auf den Stand vom 8.2. zurücksetzen. Dann einfach rebooten und Mikro geht wieder!

Mehr dazu hier:

presenting the Rawhide Downgrade to past date script

Fedora: Phosh crasht wegen glib2 Patch

Liebe Linuxphone-Fans,

Ihr dürft mal wieder das Pinephone nicht Updaten, sonst knallts 🙁

Fedora: Phosh crasht wegen glib2 Patch

Dieser Stacktrace vom System zeigt exemplarisch das Problem:

Feb 10 21:31:02 fedorapine systemd-coredump[3835]: [🡕] Process 3144 (phosh) of user 1000 dumped core.
                                                   
                                                   Stack trace of thread 3144:
                                                   #0  0x0000007fa728b908 g_type_check_instance (libgobject-2.0.so.0 + 0x39908)
                                                   #1  0x0000007fa728026c g_signal_handlers_disconnect_matched (libgobject-2.0.so.0 + 0x2e26c)
                                                   #2  0x0000005587058218 mixer_control_output_update_cb (phosh + 0x58218)
                                                   #3  0x0000007fa7265948 g_closure_invoke (libgobject-2.0.so.0 + 0x13948)
                                                   #4  0x0000007fa729399c signal_emit_unlocked_R.isra.0 (libgobject-2.0.so.0 + 0x4199c)
                                                   #5  0x0000007fa7285e30 g_signal_emit_valist (libgobject-2.0.so.0 + 0x33e30)
                                                   #6  0x0000007fa72860e0 g_signal_emit (libgobject-2.0.so.0 + 0x340e0)
                                                   #7  0x0000005587084290 _pa_context_get_server_info_cb (phosh + 0x84290)
                                                   #8  0x0000007fa703fe58 context_get_server_info_callback (libpulse.so.0 + 0x12e58)
                                                   #9  0x0000007fa5a91bd0 run_action (libpulsecommon-14.2.so + 0x42bd0)
                                                   #10 0x0000007fa5a92564 pa_pdispatch_run (libpulsecommon-14.2.so + 0x43564)
                                                   #11 0x0000007fa7040170 pstream_packet_callback (libpulse.so.0 + 0x13170)
                                                   #12 0x0000007fa5a971e4 do_read (libpulsecommon-14.2.so + 0x481e4)
                                                   #13 0x0000007fa5a98b78 do_pstream_read_write (libpulsecommon-14.2.so + 0x49b78)
                                                   #14 0x0000007fa700e618 dispatch_func (libpulse-mainloop-glib.so.0 + 0x2618)
                                                   #15 0x0000007fa7157430 g_main_context_dispatch (libglib-2.0.so.0 + 0x57430)
                                                   #16 0x0000007fa71ae570 g_main_context_iterate.constprop.0 (libglib-2.0.so.0 + 0xae570)
                                                   #17 0x0000007fa7156af0 g_main_loop_run (libglib-2.0.so.0 + 0x56af0)
                                                   #18 0x0000007fa7a2b604 gtk_main (libgtk-3.so.0 + 0x26d604)
                                                   #19 0x000000558701f7c4 main (phosh + 0x1f7c4)
                                                   #20 0x0000007fa6981a9c __libc_start_main (libc.so.6 + 0x24a9c)
                                                   #21 0x000000558701fa78 _start (phosh + 0x1fa78)
                                                   
                                                   Stack trace of thread 3145:
                                                   #0  0x0000007fa6a2dfb0 __poll (libc.so.6 + 0xd0fb0)
                                                   #1  0x0000007fa71ae50c g_main_context_iterate.constprop.0 (libglib-2.0.so.0 + 0xae50c)
                                                   #2  0x0000007fa71548ec g_main_context_iteration (libglib-2.0.so.0 + 0x548ec)
                                                   #3  0x0000007fa7154954 glib_worker_main (libglib-2.0.so.0 + 0x54954)
                                                   #4  0x0000007fa7187a78 g_thread_proxy (libglib-2.0.so.0 + 0x87a78)
                                                   #5  0x0000007fa68defd8 start_thread (libpthread.so.0 + 0x7fd8)
                                                   #6  0x0000007fa6a3835c thread_start (libc.so.6 + 0xdb35c)
                                                   
                                                   Stack trace of thread 3147:
                                                   #0  0x0000007fa6a2dfb0 __poll (libc.so.6 + 0xd0fb0)
                                                   #1  0x0000007fa71ae50c g_main_context_iterate.constprop.0 (libglib-2.0.so.0 + 0xae50c)
                                                   #2  0x0000007fa7156af0 g_main_loop_run (libglib-2.0.so.0 + 0x56af0)
                                                   #3  0x0000007fa73eb7b8 gdbus_shared_thread_func.lto_priv.0 (libgio-2.0.so.0 + 0x1277b8)
                                                   #4  0x0000007fa7187a78 g_thread_proxy (libglib-2.0.so.0 + 0x87a78)
                                                   #5  0x0000007fa68defd8 start_thread (libpthread.so.0 + 0x7fd8)
                                                   #6  0x0000007fa6a3835c thread_start (libc.so.6 + 0xdb35c)
                                                   
                                                   Stack trace of thread 3148:
                                                   #0  0x0000007fa6a2dfb0 __poll (libc.so.6 + 0xd0fb0)
                                                   #1  0x0000007fa71ae50c g_main_context_iterate.constprop.0 (libglib-2.0.so.0 + 0xae50c)
                                                   #2  0x0000007fa71548ec g_main_context_iteration (libglib-2.0.so.0 + 0x548ec)
                                                   #3  0x0000007fa40fdd4c dconf_gdbus_worker_thread (libdconfsettings.so + 0x5d4c)
                                                   #4  0x0000007fa7187a78 g_thread_proxy (libglib-2.0.so.0 + 0x87a78)
                                                   #5  0x0000007fa68defd8 start_thread (libpthread.so.0 + 0x7fd8)
                                                   #6  0x0000007fa6a3835c thread_start (libc.so.6 + 0xdb35c)

Phosh semmelt hier brutal weg, wenn man an den Audioeinstellungen rumspielt. Verursacht wird dies mutmaßlich durch einen Patch der Glib2:

* Tue Feb 09 2021 Benjamin Berg <bberg@redhat.com> – 2.67.3-2
  – Add patches to move applications into systemd scopes

Ich sage mutmaßlich, weil ein Downgrade des Glib2 Paketes auf 2.67.1-4 das Problem sofort behebt. Es kann aber natürlich auch sein, daß einfach alle anderen Anwendungen und Libs noch nichts von dem Patch gehört haben und noch Code verwenden, der dann nicht mehr geht.

Das blöde an der Situation ist, daß sich die Pulseaudio-Einstellungen beim Einstecken von Kopfhörern und Telefonieren ändern, weswegen Phosh während eines Anrufs crasht und das Gespräch weiterläuft. Kein Desktop bedeutet aber auch, keine Kontrolle mehr über den Anruf.

Wäre ich zynisch drauf, würde ich eine CVE beantragen, weil man durch Anrufen einen DOS auslösen kann 🙂

Workaround:

Für normale Endanwender:

dnf downgrade https://kojipkgs.fedoraproject.org//packages/glib2/2.67.1/4.fc34/aarch64/glib2-2.67.1-4.fc34.aarch64.rpm

Für normale Entwickler, die auch das Devel Paket installiert haben, weil sie Software auf dem System kompilieren:

dnf downgrade https://kojipkgs.fedoraproject.org//packages/glib2/2.67.1/4.fc34/aarch64/glib2-2.67.1-4.fc34.aarch64.rpm https://kojipkgs.fedoraproject.org//packages/glib2/2.67.1/4.fc34/aarch64/glib2-devel-2.67.1-4.fc34.aarch64.rpm

Danach „systemctl restart phosh“ durchführen und Ihr seid wieder crashsicher.

Update:

Der Bug wird untersucht. Jede Menge Debugging und 1.2GB Debugpakete später, steht nur eins fest: Der Bug ist mehr als bescheiden zu debuggen!

Fedora: Pinephone Taschenlampenapp

Liebe Linuxphone-Fans,

eine Taschenlampen App darf auf einem Smartphone mit Scheinwerfer-LED nicht fehlen.

Fedora: Pinephone Taschenlampenapp

Bauen wir und doch kurz eine selbst 🙂

Schritt 1:  Das Script

In das File /usr/local/sbin/flashlight schreiben wir:

#!/bin/bash

STATE=$(cat /sys/class/leds/white\:flash/brightness)

if [ „$STATE“ == „0“ ]; then

echo 1 > /sys/class/leds/white\:flash/brightness

else

echo 0 > /sys/class/leds/white\:flash/brightness

fi

Dann „chmod 755 /usr/local/sbin/flashlight“ ausführen.

Schritt 2 : sudoers anpassen

Wir schreiben nach /etc/sudoers.d/flashlight.conf :

pine ALL = (root) NOPASSWD: /usr/local/sbin/flashlight

und in /etc/sudoers fügen wir am Ende an:

@include /etc/sudoers.d/flashlight.conf

Damit braucht der User „pine“ kein Passwort mehr eingeben um das Flashlight Script als Root auszuführen. Das ist leider nötig, da der Kernel nur ROOT Zugriff auf die LEDs erlaubt. Vermutlich ist das der Grund, wieso es in der Fotoapp Megapixels kein Blitzlichticon gibt.

Schritt 3: Das Desktopfile

Wir schreiben nach /usr/share/applications/flashlight.desktop  :

[Desktop Entry]
Name=Flashlight
Exec=/usr/bin/sudo /usr/local/sbin/flashlight
Type=Application
StartupNotify=true
Icon=/usr/share/icons/breeze/actions/32/flashlight-on.svg
Name[de_DE]=Taschenlampe

Speichern das ab und bekommen auf der Oberfläche das Appicon „Taschenlampe“ zu sehen. Das passiert aber nur, wenn es die Icondatei „/usr/share/icons/breeze/actions/32/flashlight-on.svg“ gibt. Notfalls mit DNF „breeze-icon-theme“ nachinstallieren. Ist der einzige, der eine Taschenlampe hat und das Icon sieht nicht so gut aus.

Natürlich könnt Ihr auch eine eigene Bilddatei mit einer vernünftigen Taschenlampendarstellung benutzen, nur der Pfad muß stimmen 😉