diff --git a/initrd_hooks/lipnsa.hook.sh b/initrd_hooks/lipnsa.hook.sh index b5714d768974fcf880d7c3851009f3e38dad8141..b857d1664804feafb2264e72ef16b410e1003259 100644 --- a/initrd_hooks/lipnsa.hook.sh +++ b/initrd_hooks/lipnsa.hook.sh @@ -24,13 +24,14 @@ LIPSTATS="${LIPSTICK}/lipstats" if [ $# -gt 0 ]; then echo "collects system information, i.e. hardware and what the kernel thinks about it" echo "called as liphook before leaving initramfs" - echo "usage: lipnsa.sh" + echo "usage: lipnsa.sh [lipstick directory]" echo "" echo "requires proc and sysfs to be mounted" echo "append 'fnord' to your kernel cmdline to disable this tool" - echo "data is saved to ${LIPSTATS}/dmi-product-uuid/kernel-boot-id/" + echo "data is saved to ${LIPSTATS}/product-uuid/kernel-boot-id/" echo "${LIPSTICK} is remounted rw in the process, remounted ro at the end" - echo "if there is no dmi-product-uuid available a kernel-random-uuid will be used" + echo "considering the product-uuid we generally trust what dmidecode says" + echo "if it's unavailable we may use a fallback instead (sysfs, random by kernel)" echo "some commands are processed outside the initramfs, in a chroot using the prepared system" echo "" echo "currently lipnsa.sh collects the following:" @@ -68,11 +69,50 @@ fi log_success_msg "This is lipnsa.sh -- collecting your data for a better world" -UUID=`cat /sys/class/dmi/id/product_uuid` +# mounts for chrooted commands +# actually lsblk, lscpu and dmidecode work without chroot +# but i think it is more sane to not depend on that +TARGETMOUNTS=1 +mount -t proc proc ${TARGET}/proc if [ $? != 0 ]; then - log_warning_msg "> dmi system-uuid is unavailable, using random uuid" - UUID=`cat /proc/sys/kernel/random/uuid` + log_warning_msg "> could not mount proc on the target, this might produce wrong results" + TARGETMOUNTS=0 fi +mount -t sysfs sysfs ${TARGET}/sys +if [ $? != 0 ]; then + log_warning_msg "> could not mount sysfs on the target, this might produce wrong results" + TARGETMOUNTS=0 +fi + +UUID="unavailable" +UUID_SOURCE="dmidecode" +if [ $TARGETMOUNTS -gt 0 ]; then + UUID=`chroot ${TARGET} dmidecode --string system-uuid` + if [ $? != 0 ]; then + log_warning_msg "> dmidecode was unable to retrieve the system-uuid from chroot, trying without chroot" + else + UUID_SOURCE="dmidecode-chroot" + fi +fi + +if [ $UUID_SOURCE == "dmidecode" ]; then + UUID=`dmidecode --string system-uuid` + if [ $? != 0 ]; then + log_warning_msg "> dmidecode was unable to retrieve the system-uuid, trying sysfs dmi product_uuid" + UUID_SOURCE="sysfs" + UUID=`cat /sys/class/dmi/id/product_uuid` + if [ $? != 0 ]; then + log_warning_msg "> sysfs dmi product_uuid is unavailable, using random uuid" + UUID=`cat /proc/sys/kernel/random/uuid` + if [ $? != 0 ]; then + UUID_SOURCE="unavailable" + else + UUID_SOURCE="random" + fi + fi + fi +fi + BOOTID=`cat /proc/sys/kernel/random/boot_id` log_success_msg "> using ${UUID}/${BOOTID}" @@ -85,6 +125,20 @@ if [ $? != 0 ]; then fi log_success_msg "> remounted lipstick rw, created directory" +echo ${UUID_SOURCE} > "${DIR}/uuid_source" 2>&1 +if [ $? != 0 ]; then + log_failure_msg "> could not save uuid source" +else + log_success_msg "> saved uuid source" +fi + +echo ${TARGETMOUNTS} > "${DIR}/targetmounts" 2>&1 +if [ $? != 0 ]; then + log_failure_msg "> could not save usage of target mounts" +else + log_success_msg "> saved usage of target mounts" +fi + date +%s > "${DIR}/timestamp" 2>&1 if [ $? != 0 ]; then log_failure_msg "> could not save timestamp" @@ -168,68 +222,107 @@ else log_success_msg "> saved the partition list" fi -# chrooted commands -# actually lsblk, lscpu and dmidecode work without chroot -# but i think it is more sane to not depend on that -mount -t proc proc ${TARGET}/proc -if [ $? != 0 ]; then - log_warning_msg "> could not mount proc on the target, this might produce false results" -fi -mount -t sysfs sysfs ${TARGET}/sys -if [ $? != 0 ]; then - log_warning_msg "> could not mount sysfs on the target, this might produce false results" -fi - -chroot ${TARGET} lspci -mm > "${DIR}/lspci" 2>&1 -if [ $? != 0 ]; then - log_failure_msg "> could not save listing of pci devices" +if [ $TARGETMOUNTS -gt 0 ]; then + chroot ${TARGET} lspci -mm > "${DIR}/lspci" 2>&1 + if [ $? != 0 ]; then + log_failure_msg "> could not save listing of pci devices" + else + log_success_msg "> saved listing of pci devices" + fi else - log_success_msg "> saved listing of pci devices" + log_warning_msg "> not trying to gather pci devices due to unavailable mounts" fi -chroot ${TARGET} lsblk > "${DIR}/lsblk" 2>&1 -if [ $? != 0 ]; then - log_failure_msg "> could not save listing of block devices" +TRY_UNCHROOTED=0 +if [ $TARGETMOUNTS -gt 0 ]; then + chroot ${TARGET} lsblk > "${DIR}/lsblk" 2>&1 + if [ $? != 0 ]; then + log_warning_msg "> listing of block devices unsuccessful, trying without chroot" + TRY_UNCHROOTED=1 + else + log_success_msg "> saved listing of block devices" + fi else - log_success_msg "> saved listing of block devices" + TRY_UNCHROOTED=1 +fi +if [ $TRY_UNCHROOTED -gt 0 ]; then + lsblk >> "${DIR}/lsblk" 2>&1 + if [ $? != 0 ]; then + log_failure_msg "> could not save listing of block devices" + else + log_success_msg "> saved listing of block devices" + fi fi -chroot ${TARGET} lscpu > "${DIR}/lscpu" 2>&1 -if [ $? != 0 ]; then - log_failure_msg "> could not save listing of cpus" +TRY_UNCHROOTED=0 +if [ $TARGETMOUNTS -gt 0 ]; then + chroot ${TARGET} lscpu > "${DIR}/lscpu" 2>&1 + if [ $? != 0 ]; then + log_warning_msg "> listing of cpus unsuccessful, trying without chroot" + TRY_UNCHROOTED=1 + else + log_success_msg "> saved listing of cpus" + fi else - log_success_msg "> saved listing of cpus" + TRY_UNCHROOTED=1 +fi +if [ $TRY_UNCHROOTED -gt 0 ]; then + lscpu >> "${DIR}/lscpu" 2>&1 + if [ $? != 0 ]; then + log_failure_msg "> could not save listing of cpus" + else + log_success_msg "> saved listing of cpus" + fi fi -chroot ${TARGET} dmidecode > "${DIR}/dmidecode" 2>&1 -if [ $? != 0 ]; then - log_failure_msg "> could not save decoded dmi table" +TRY_UNCHROOTED=0 +if [ $TARGETMOUNTS -gt 0 ]; then + chroot ${TARGET} dmidecode > "${DIR}/dmidecode" 2>&1 + if [ $? != 0 ]; then + log_warning_msg "> unable to retrieve decoded dmi table, trying without chroot" + TRY_UNCHROOTED=1 + else + log_success_msg "> saved decoded dmi table" + fi else - log_success_msg "> saved decoded dmi table" + TRY_UNCHROOTED=1 +fi +if [ $TRY_UNCHROOTED -gt 0 ]; then + dmidecode >> "${DIR}/dmidecode" 2>&1 + if [ $? != 0 ]; then + log_failure_msg "> could not save decoded dmi table" + else + log_success_msg "> saved decoded dmi table" + fi fi -chroot ${TARGET} lsusb > "${DIR}/lsusb" 2>&1 -if [ $? != 0 ]; then - grep "unable to initialize libusb: -99" "${DIR}/lsusb" +if [ $TARGETMOUNTS -gt 0 ]; then + chroot ${TARGET} lsusb > "${DIR}/lsusb" 2>&1 if [ $? != 0 ]; then - log_failure_msg "> could not save listing of usb devices" + grep "unable to initialize libusb: -99" "${DIR}/lsusb" + if [ $? != 0 ]; then + log_failure_msg "> could not save listing of usb devices" + else + echo "no usb controller found" > "${DIR}/lsusb" 2>&1 + log_success_msg "> saved listing of usb devices" + fi else - echo "no usb controller found" > "${DIR}/lsusb" 2>&1 log_success_msg "> saved listing of usb devices" fi else - log_success_msg "> saved listing of usb devices" + log_warning_msg "> not trying to gather usb devices due to unavailable mounts" fi -umount ${TARGET}/sys -if [ $? != 0 ]; then - log_warning_msg "> could not unmount sysfs on the target, this might cause some trouble" -fi -umount ${TARGET}/proc -if [ $? != 0 ]; then - log_warning_msg "> could not unmount proc on the target, this might cause some trouble" +if [ $TARGETMOUNTS -gt 0 ]; then + umount ${TARGET}/sys + if [ $? != 0 ] && [ $TARGETMOUNTS -gt 0 ]; then + log_warning_msg "> could not unmount sysfs on the target, this might cause some trouble" + fi + umount ${TARGET}/proc + if [ $? != 0 ] && [ $TARGETMOUNTS -gt 0 ]; then + log_warning_msg "> could not unmount proc on the target, this might cause some trouble" + fi fi -# chrooted commands sync if [ $? != 0 ]; then