----- Forwarded message from Andrew Gavrilin <andrew.gavri...@rosalab.ru> -----
Date: Thu, 6 Oct 2011 17:28:36 +0400 (MSD) From: Andrew Gavrilin <andrew.gavri...@rosalab.ru> To: j...@kitenet.net, jo...@debian.org Subject: os-prober: bsd detection and new linux detection X-Mailer: Zimbra 6.0.10_GA_2692 (ZimbraWebClient - FF3.0 (Linux)/6.0.10_GA_2692) Hello. Hello. I work at ROSA Lab. It's a partner of Mandriva. We will use os-prober for our installer. These are my improvements. ----- End forwarded message ----- -- see shy jo
#!/bin/sh # Sub-tests that require a mounted partition. set -e partition="$1" . /usr/share/os-prober/common.sh types="$(fs_type "$partition")" || types=NOT-DETECTED if [ "$types" = NOT-DETECTED ]; then debug "$1 type not recognised; skipping" exit 0 elif [ "$types" = swap ]; then debug "$1 is a swap partition; skipping" exit 0 elif [ "$types" = crypto_LUKS ]; then debug "$1 is a LUKS partition; skipping" exit 0 elif [ "$types" = ntfs ]; then if type ntfs-3g >/dev/null 2>&1; then types='ntfs-3g ntfs' fi elif [ -z "$types" ]; then if type cryptsetup >/dev/null 2>&1 && \ cryptsetup luksDump "$partition" >/dev/null 2>&1; then debug "$1 is a LUKS partition; skipping" exit 0 fi for type in $(grep -v nodev /proc/filesystems); do # hfsplus filesystems are mountable as hfs. Try hfs last so # that we can tell the difference. if [ "$type" = hfs ]; then delaytypes="${delaytypes:+$delaytypes }$type" elif [ "$type" = fuseblk ]; then if type ntfs-3g >/dev/null 2>&1; then types="${types:+$types }ntfs-3g" fi else types="${types:+$types }$type" fi done fi tmpmnt=/var/lib/os-prober/mount if [ ! -d "$tmpmnt" ]; then mkdir "$tmpmnt" fi mounted= if which grub-mount >/dev/null 2>&1 && \ grub-mount "$partition" "$tmpmnt" 2>/dev/null; then debug "mounted using GRUB" mounted=1 type=fuseblk else ro_partition "$partition" for type in $types $delaytypes; do if [ "$type" = ufs ]; then for ufstype in ufs2 44bsd; do if mount -o ro,ufstype=$ufstype -t "$type" "$partition" "$tmpmnt" 2>/dev/null; then mounted=1 break fi done else if mount -o ro -t "$type" "$partition" "$tmpmnt" 2>/dev/null; then mounted=1 fi fi if [ "$mounted" ]; then debug "mounted as $type filesystem" break fi done fi if [ "$mounted" ]; then for test in /usr/lib/os-probes/mounted/*; do debug "running subtest $test" if [ -f "$test" ] && [ -x "$test" ]; then if "$test" "$partition" "$tmpmnt" "$type"; then debug "os found by subtest $test" if ! umount "$tmpmnt"; then warn "failed to umount $tmpmnt" fi rmdir "$tmpmnt" || true exit 0 fi fi done if ! umount "$tmpmnt"; then warn "failed to umount $tmpmnt" fi fi rmdir "$tmpmnt" || true # No tests found anything. exit 1
#!/bin/sh # Test for *BSD distributions. set -e . /usr/share/os-prober/common.sh partition="$1" dir="$2" type="$3" if [ "$type" = ufs ]; then disk=$(echo $partition | gawk '{ match($0, /([[:alpha:][:punct:]]+)[[:digit:]]+/, disk); print disk[1] }') if [ ! -z "$disk" ]; then tpartition=$(echo $partition | sed 's|\/|\\/|g') system=$(fdisk -l $disk | awk '/'$tpartition'[[:blank:]]+\*[[:blank:]]+.+[[:blank:]]+.+BSD/ {print $7}') if [ ! -z "$system" ]; then title= if [ -f $dir/etc/motd ]; then case $system in FreeBSD | NetBSD | OpenBSD) title=$(cat $dir/etc/motd | gawk '{ match($0, /('$system')[[:blank:]]+([[:graph:]]+)[[:blank:]]+(\([[:print:]]+\))/, title); print title[1], title[2], title[3]; exit 0}') ;; esac fi if [ -z "$title" ]; then title="$system" fi label="$(count_next_label "$system")" echo "$partition:$title:$label:chain" exit 0 else exit 1 fi else exit 1 fi else exit 1 fi
#!/bin/sh # Test for linux distributions. set -e . /usr/share/os-prober/common.sh partition="$1" dir="$2" type="$3" # This test is inaccurate, but given separate / and /boot partitions and the # fact that only some architectures have ld-linux.so, I can't see anything # better. Make sure this test has a high number so that more accurate tests # can come first. # TODO: look for ld-linux.so on arches that have it # hierarchy # based or forked # chakra-release # arch # arch-release # kanotix_version # debian # kdemar-release # debian, knoppix # knoppix_version # debian # debian_version # blackPanther-release # mandriva # pclinuxos-release # mandrake, mandriva # mandriva-release # mandrake, mandrakelinux, redhat # mandrakelinux-release # mandrake-release # altlinux-release # redhat # yellowdog-release # centos, fedora # centos-release # redhat, fedora # asplinux-release # fedora # engarde-release # fedora # e-smith-release # fedora # magic-release # fedora # trustix-release # fedora # fedora-release # redhat # startcom-release # redhat # redhat-release # meego-release # moblin # moblin-release # slax-version # slackware # zenwalk-version # slackware # slackware-version # sles-release # suse # SuSE-release # independent # ark-release # caos-release # frugalware-release # gentoo-release # lfs-release # pardus-release # pld-release # turbolinux-release # vine-release # whitebox-release # reserved # system-release based_or_forked1='SuSE-release sles-release slackware-version zenwalk-version slax-version moblin-release meego-release' based_or_forked2='redhat-release startcom-release fedora-release trustix-release magic-release e-smith-release engarde-release asplinux-release centos-release yellowdog-release altlinux-release' based_or_forked3='mandrake-release mandrakelinux-release mandriva-release pclinuxos-release blackPanther-release' based_or_forked4='debian_version knoppix_version kdemar-release kanotix_version arch-release chakra-release' independant='whitebox-release vine-release turbolinux-release pld-release pardus-release lfs-release gentoo-release frugalware-release caos-release ark-release' reserved='system-release' known_distro="$reserved $independant $based_or_forked1 $based_or_forked2 $based_or_forked3 $based_or_forked4" find_distro_info() { found_distro= pattern='_version -version -release' for pat in $pattern; do for distro in $( ls -tr $dir/etc/*$pat 2>/dev/null ); do if [ -L $distro ]; then continue fi distro=$(basename $distro) if [ "$distro" = 'lsb-release' ]; then continue fi found_distro="$found_distro$distro " done done } prepare_label() { label=$(echo $1 | gawk '{ match($0, /(.+)(_version|-version|-release)/, dist); print dist[1] }') } prepare_title() { title="$(head -1 $dir/etc/$1)" title=$(echo $title | gawk '{ match($0, /^[[:space:]]*(.*)[[:space:]]*$/, title); print title[1] }') if [ ! -z $(echo $title | awk '/^([[:graph:]]+)$/ { print $0 }') ] || [ -z "$title" ]; then tlabel=$(echo $label | gawk '{ match($0, /(.)(.*)/, title); print toupper(title[1]) tolower(title[2]) }') if [ ! -z "$title" ]; then title=" ($title)" fi title="${tlabel} GNU/Linux$title" fi } prepare_distro_info() { if [ ! -z "$found_distro" ]; then mdistro= for kdistro in $known_distro; do for fdistro in $found_distro; do if [ "$kdistro" = "$fdistro" ]; then mdistro=$kdistro found_distro=$(echo $found_distro | sed "s|$fdistro||") break fi done if [ -z "$found_distro" ]; then break fi done if [ -z "$found_distro" ]; then distro=$mdistro else distro=$(echo $found_distro | awk '{ print $NF }') fi rdistro=$distro if [ "$distro" = "debian_version" ] && [ -f '/etc/dpkg/origins/ubuntu' ]; then distro='ubuntu_version' fi prepare_label $distro prepare_title $rdistro $label else label='Linux' title='unknown Linux distribution' fi } if ls $dir/lib*/ld*.so* >/dev/null 2>/dev/null; then find_distro_info prepare_distro_info label="$(count_next_label "$label")" echo "$partition:$title:$label:linux" exit 0 else exit 1 fi
diff --git a/os-probes/common/50mounted-tests b/os-probes/common/50mounted-tests index 7865b51..e61cb13 100755 --- a/os-probes/common/50mounted-tests +++ b/os-probes/common/50mounted-tests @@ -54,9 +54,21 @@ if which grub-mount >/dev/null 2>&1 && \ else ro_partition "$partition" for type in $types $delaytypes; do - if mount -o ro -t "$type" "$partition" "$tmpmnt" 2>/dev/null; then + if [ "$type" = ufs ]; then + for ufstype in ufs2 44bsd; do + if mount -o ro,ufstype=$ufstype -t "$type" "$partition" "$tmpmnt" 2>/dev/null; then + mounted=1 + break + fi + done + else + if mount -o ro -t "$type" "$partition" "$tmpmnt" 2>/dev/null; then + mounted=1 + fi + fi + + if [ "$mounted" ]; then debug "mounted as $type filesystem" - mounted=1 break fi done diff --git a/os-probes/mounted/common/90bsd-distro b/os-probes/mounted/common/90bsd-distro new file mode 100755 index 0000000..b190aab --- /dev/null +++ b/os-probes/mounted/common/90bsd-distro @@ -0,0 +1,45 @@ +#!/bin/sh +# Test for *BSD distributions. +set -e + +. /usr/share/os-prober/common.sh + +partition="$1" +dir="$2" +type="$3" + +if [ "$type" = ufs ]; then + disk=$(echo $partition | gawk '{ match($0, /([[:alpha:][:punct:]]+)[[:digit:]]+/, disk); print disk[1] }') + + if [ ! -z "$disk" ]; then + tpartition=$(echo $partition | sed 's|\/|\\/|g') + + system=$(fdisk -l $disk | awk '/'$tpartition'[[:blank:]]+\*[[:blank:]]+.+[[:blank:]]+.+BSD/ {print $7}') + + if [ ! -z "$system" ]; then + title= + + if [ -f $dir/etc/motd ]; then + case $system in + FreeBSD | NetBSD | OpenBSD) title=$(cat $dir/etc/motd | gawk '{ match($0, /('$system')[[:blank:]]+([[:graph:]]+)[[:blank:]]+(\([[:print:]]+\))/, title); print title[1], title[2], title[3]; exit 0}') + ;; + esac + fi + + if [ -z "$title" ]; then + title="$system" + fi + + label="$(count_next_label "$system")" + echo "$partition:$title:$label:chain" + + exit 0 + else + exit 1 + fi + else + exit 1 + fi +else + exit 1 +fi diff --git a/os-probes/mounted/common/90linux-distro b/os-probes/mounted/common/90linux-distro index f237a38..147c6a1 100755 --- a/os-probes/mounted/common/90linux-distro +++ b/os-probes/mounted/common/90linux-distro @@ -13,122 +13,166 @@ type="$3" # better. Make sure this test has a high number so that more accurate tests # can come first. # TODO: look for ld-linux.so on arches that have it -if ls "$dir"/lib*/ld*.so* >/dev/null 2>/dev/null; then - if [ -e "$dir/etc/debian_version" ]; then - short="Debian" - long="$(printf "Debian GNU/Linux (%s)\n" "$(cat "$dir/etc/debian_version")")" - # RPM derived distributions may also have a redhat-release or - # mandrake-release, so check their files first. - elif [ -e "$dir/etc/altlinux-release" ]; then - short="ALTLinux" - long="$(cat "$dir/etc/altlinux-release")" - elif [ -e "$dir/etc/magic-release" ]; then - short="Magic" - long="$(cat "$dir/etc/magic-release")" - elif [ -e "$dir/etc/blackPanther-release" ]; then - short="blackPanther" - long="$(cat "$dir/etc/blackPanther-release")" - elif [ -e "$dir/etc/ark-release" ]; then - short="Ark" - long="$(cat "$dir/etc/ark-release")" - elif [ -e "$dir/etc/arch-release" ]; then - short="Arch" - long="$(cat "$dir/etc/arch-release")" - elif [ -e "$dir/etc/asplinux-release" ]; then - short="ASPLinux" - long="$(cat "$dir/etc/asplinux-release")" - elif [ -e "$dir/etc/lvr-release" ]; then - short="LvR" - long="$(cat "$dir/etc/lvr-release")" - elif [ -e "$dir/etc/caos-release" ]; then - short="cAos" - long="$(cat "$dir/etc/caos-release")" - elif [ -e "$dir/etc/aurox-release" ]; then - short="Aurox" - long="$(cat "$dir/etc/aurox-release")" - elif [ -e "$dir/etc/engarde-release" ]; then - short="EnGarde" - long="$(cat "$dir/etc/engarde-release")" - elif [ -e "$dir/etc/vine-release" ]; then - short="Vine" - long="$(cat "$dir/etc/vine-release")" - elif [ -e "$dir/etc/whitebox-release" ]; then - short="WhiteBox" - long="$(cat "$dir/etc/whitebox-release")" - elif [ -e "$dir/etc/pld-release" ]; then - short="PLD" - long="$(cat "$dir/etc/pld-release")" - elif [ -e "$dir/etc/startcom-release" ]; then - short="StartCom" - long="$(cat "$dir/etc/startcom-release")" - elif [ -e "$dir/etc/trustix-release" ]; then - short="Trustix" - long="$(cat "$dir/etc/trustix-release")" - elif [ -e "$dir/etc/openna-release" ]; then - short="OpenNA" - long="$(cat "$dir/etc/openna-release")" - elif [ -e "$dir/etc/conectiva-release" ]; then - short="Conectiva" - long="$(cat "$dir/etc/conectiva-release")" - elif [ -e "$dir/etc/mandrake-release" ]; then - short="Mandrake" - long="$(cat "$dir/etc/mandrake-release")" - elif [ -e "$dir/etc/fedora-release" ]; then - short="Fedora" - long="$(cat "$dir/etc/fedora-release")" - elif [ -e "$dir/etc/redhat-release" ]; then - short="RedHat" - long="$(cat "$dir/etc/redhat-release")" - elif [ -e "$dir/etc/SuSE-release" ]; then - short="SuSE" - long="$(head -n 1 "$dir/etc/SuSE-release")" - elif [ -e "$dir/etc/gentoo-release" ]; then - short="Gentoo" - long="$(cat "$dir/etc/gentoo-release")" - elif [ -e "$dir/etc/cobalt-release" ]; then - short="Cobalt" - long="$(cat "$dir/etc/cobalt-release")" - elif [ -e "$dir/etc/yellowdog-release" ]; then - short="YellowDog" - long="$(cat "$dir/etc/yellowdog-release")" - elif [ -e "$dir/etc/turbolinux-release" ]; then - short="Turbolinux" - long="$(cat "$dir/etc/turbolinux-release")" - elif [ -e "$dir/etc/pardus-release" ]; then - short="Pardus" - long="$(cat "$dir/etc/pardus-release")" - elif [ -e "$dir/etc/kanotix-version" ]; then - short="Kanotix" - long="$(cat "$dir/etc/kanotix-version")" - elif [ -e "$dir/etc/slackware-version" ]; then - short="Slackware" - long="$(printf "Slackware Linux (%s)\n" "$(cat "$dir/etc/slackware-version")")" - elif [ -e "$dir/sbin/pkgtool" ]; then - short="Slackware" - long="Slackware Linux" - elif grep -qs OpenLinux "$dir/etc/issue"; then - short="Caldera" - long="Caldera OpenLinux" - elif [ -e "$dir/etc/frugalware-release" ]; then - short="Frugalware Linux" - long="$(cat "$dir/etc/frugalware-release")" - elif [ -e "$dir/etc/kdemar-release" ]; then - short="K-DEMar" - long="$(printf "K-DEMar GNU/Linux (%s)\n" "$(cat "$dir/etc/kdemar-release")")" - elif [ -e "$dir/etc/lfs-release" ]; then - short="LFS" - long="$(printf "Linux From Scratch (%s)\n" "$(cat "$dir/etc/lfs-release")")" - elif [ -e "$dir/etc/meego-release" ]; then - short="MeeGo" - long="$(head -1 "$dir/etc/meego-release")" - else - short="Linux" - long="unknown Linux distribution" - fi - - label="$(count_next_label "$short")" - result "$partition:$long:$label:linux" - exit 0 + +# hierarchy + +# based or forked + +# chakra-release # arch +# arch-release + +# kanotix_version # debian +# kdemar-release # debian, knoppix +# knoppix_version # debian +# debian_version + +# blackPanther-release # mandriva +# pclinuxos-release # mandrake, mandriva +# mandriva-release # mandrake, mandrakelinux, redhat +# mandrakelinux-release +# mandrake-release + +# altlinux-release # redhat +# yellowdog-release # centos, fedora +# centos-release # redhat, fedora +# asplinux-release # fedora +# engarde-release # fedora +# e-smith-release # fedora +# magic-release # fedora +# trustix-release # fedora +# fedora-release # redhat +# startcom-release # redhat +# redhat-release + +# meego-release # moblin +# moblin-release + +# slax-version # slackware +# zenwalk-version # slackware +# slackware-version + +# sles-release # suse +# SuSE-release + +# independent + +# ark-release +# caos-release +# frugalware-release +# gentoo-release +# lfs-release +# pardus-release +# pld-release +# turbolinux-release +# vine-release +# whitebox-release + +# reserved +# system-release + +based_or_forked1='SuSE-release sles-release slackware-version zenwalk-version slax-version moblin-release meego-release' +based_or_forked2='redhat-release startcom-release fedora-release trustix-release magic-release e-smith-release engarde-release asplinux-release centos-release yellowdog-release altlinux-release' +based_or_forked3='mandrake-release mandrakelinux-release mandriva-release pclinuxos-release blackPanther-release' +based_or_forked4='debian_version knoppix_version kdemar-release kanotix_version arch-release chakra-release' + +independant='whitebox-release vine-release turbolinux-release pld-release pardus-release lfs-release gentoo-release frugalware-release caos-release ark-release' + +reserved='system-release' + +known_distro="$reserved $independant $based_or_forked1 $based_or_forked2 $based_or_forked3 $based_or_forked4" + +find_distro_info() { + found_distro= + + pattern='_version -version -release' + + for pat in $pattern; do + + for distro in $( ls -tr $dir/etc/*$pat 2>/dev/null ); do + if [ -L $distro ]; then + continue + fi + + distro=$(basename $distro) + + if [ "$distro" = 'lsb-release' ]; then + continue + fi + + found_distro="$found_distro$distro " + done + + done +} + +prepare_label() { + label=$(echo $1 | gawk '{ match($0, /(.+)(_version|-version|-release)/, dist); print dist[1] }') +} + +prepare_title() { + title="$(head -1 $dir/etc/$1)" + + title=$(echo $title | gawk '{ match($0, /^[[:space:]]*(.*)[[:space:]]*$/, title); print title[1] }') + + if [ ! -z $(echo $title | awk '/^([[:graph:]]+)$/ { print $0 }') ] || [ -z "$title" ]; then + tlabel=$(echo $label | gawk '{ match($0, /(.)(.*)/, title); print toupper(title[1]) tolower(title[2]) }') + + if [ ! -z "$title" ]; then + title=" ($title)" + fi + + title="${tlabel} GNU/Linux$title" + fi +} + +prepare_distro_info() { + if [ ! -z "$found_distro" ]; then + mdistro= + + for kdistro in $known_distro; do + for fdistro in $found_distro; do + if [ "$kdistro" = "$fdistro" ]; then + mdistro=$kdistro + found_distro=$(echo $found_distro | sed "s|$fdistro||") + break + fi + done + + if [ -z "$found_distro" ]; then + break + fi + done + + if [ -z "$found_distro" ]; then + distro=$mdistro + else + distro=$(echo $found_distro | awk '{ print $NF }') + fi + + rdistro=$distro + + if [ "$distro" = "debian_version" ] && + [ -f '/etc/dpkg/origins/ubuntu' ]; then + distro='ubuntu_version' + fi + + prepare_label $distro + prepare_title $rdistro $label + else + label='Linux' + title='unknown Linux distribution' + fi +} + +if ls $dir/lib*/ld*.so* >/dev/null 2>/dev/null; then + find_distro_info + + prepare_distro_info + + label="$(count_next_label "$label")" + echo "$partition:$title:$label:linux" + + exit 0 else - exit 1 + exit 1 fi
signature.asc
Description: Digital signature