Skip to content

Instantly share code, notes, and snippets.

@alfredkrohmer
Created February 11, 2017 13:39
Show Gist options
  • Save alfredkrohmer/8d4c2a5ab62e690772f3d9de5ad2d978 to your computer and use it in GitHub Desktop.
Save alfredkrohmer/8d4c2a5ab62e690772f3d9de5ad2d978 to your computer and use it in GitHub Desktop.
List all user-installed packages on OpenWrt / LEDE
#!/bin/sh
FLASH_TIME=$(opkg info busybox | grep '^Installed-Time: ')
for i in $(opkg list-installed | cut -d' ' -f1)
do
if [ "$(opkg info $i | grep '^Installed-Time: ')" != "$FLASH_TIME" ]
then
echo $i
fi
done
@don-coleman
Copy link

And yet another variant. This one produces a more accurate/minimal list, as it also skips all dependents of other packages. It's based on bash, as it uses associative arrays.

https://gist.github.com/don-coleman/2218210aec58986acc80467f9a15d42b

@ZWx4
Copy link

ZWx4 commented Apr 20, 2021

Thanks @guymarc! Your script is the only one that worked for me. The other scripts here just list every single package installed. Maybe it is that way because I also used the Image Builder.

@rafalfitt
Copy link

as someone suggested on https://www.sindastra.de/p/1213/list-user-installed-packages-in-openwrt

You can update busybox via opkg update, so it’s install time can be wrong as reference.
As a result you will have wrong list.
Only one thing you cannot install via opkg is kernel – because you update it over flashing new firmware.
So the kernel’s install time should be used as flash time.
FLASH_TIME=$(opkg info kernel | grep ‘^Installed-Time: ‘)

@5p0ng3b0b
Copy link

Here's my take on the subject using only busybox commands in an ash shell. Combine all of the above with some code golf magic.

#!/bin/sh
P=/usr/lib/opkg/status
T=$(awk -v RS= '/^P.{0,8}ker/' $P|grep '^I'|cut -d' ' -f2)
awk -v RS= -v t="$T" '$0 !~t' $P|grep '^Pa'|cut -d' ' -f2|sort

But wait, can't more can be done? You are looking to list packages required for imagebuilder, and you only need the packages that automatically install all the other packages as dependencies. Fret not, there's a script for that too.

#!/bin/sh
P=/usr/lib/opkg/status
T=$(awk -v RS= '/^P.{0,8}ker/' $P|grep '^I'|cut -d' ' -f2)
I=$(awk -v RS= -v t="$T" '$0 !~t' $P|grep '^Pa'|cut -d' ' -f2|sort)
D=$(awk -v RS= -v t="$T" '$0 !~t' $P|grep '^D'|cut -d' ' -f2-|sed 's#, #\n#g'|sort|uniq)
p=;for i in $I;do if [ $(echo $D|grep -c $i) = 0 ];then p="$p $i";fi;done;echo $p

*drops mic*

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment