Sources-list Tool

closeDieser Beitrag wurde vor mehr als drei Monaten veröffentlicht. Bedenke bitte, dass die hier angebotene Information nicht mehr aktuell und gültig sein könnte. Informiere dich daher bitte auch an anderer Stelle über dieses Thema. Sollten sich neue Informationen ergeben haben, so kannst du mich auch gerne auf diese über einen Kommentar hinweisen. Vielen Dank!

Zum Üben habe ich mir vor ein paar Monaten ein kleines Shell-Skript gebaut,welches mit Arrays, Dialog Boxen und vielen mehr arbeitet, im Grunde kann das Skript nicht viel, aber vielleicht Hilft es da jemand als Beispiel weiter… :)

#!/bin/bash

#######################################################################
# Title      :    sources.list_tool
# Author     :    Voku (voku-online.de)
# Date       :    2009-05-25
# Requires   :    dialog
#######################################################################

VER='0.3'

_temp="/tmp/answer.$$"
sources="/etc/apt/sources.list"
sources_temp="/tmp/sources.list"
backup="/etc/apt/backup"
backup_old="/etc/apt/backup_old"
dialog 2>$_temp
du=`whoami`

if [ $du != "root" ]; then
        dialog --title " Du bist nicht root " --msgbox "nDu bist nicht root, du bist '$du'!nn(versuche es mal mit "sudo $0")" 8 44
        exit
fi

if [ -d $backup ] ; then
        if [ -f $backup/*.bz2 ]; then
                bzip2 -z -f -q $(find $backup -mtime +1)
        fi
else
        mkdir $backup
fi

if [ -d $backup_old ]; then
        find $backup -iregex '.*.(bz2)' -mtime +7 -exec mv {} $backup_old ;
        find $backup_old -iregex '.*.(bz2)' -mtime +30 -exec rm {} ;
else
        mkdir $backup_old
fi

cp -p $sources $backup/sources.old.$(date "+%y%m%d-%H%M")
cp -p $sources $sources_temp

SUBJECT="[`hostname`] Update Hinweis"
MESSAGE="SYSTEMMELDUNG:nAuf `hostname` sind neue Updates vorhanden"
COUNT=`apt-get -s upgrade | grep -c "Inst"`
if [ $COUNT -gt 0 ]; then
        dialog --title " $SUBJECT " --msgbox "n`echo -e "$MESSAGE"`" 10 50
fi

checklist() {

launchpad ()
{
grep -iv $1 $sources > $sources_temp
cp -p $sources_temp $sources
a="## $2 ($1)"
b="deb http://ppa.launchpad.net/$1/ubuntu jaunty main"
c="deb-src http://ppa.launchpad.net/$1/ubuntu jaunty main"
echo -e "$a" "n$b" "n$c" >> $sources
}

    dialog --backtitle "Extra-Repositories"
           --checklist "Extra-Repositories: fuer Ubuntu 9.04" 40 50 15
           01 "Medibuntu" off
           02 "Ubuntu Netbook Remix" off
           03 "Avant Window Navigator" off
           04 "Vuze (Azureus)" off
           05 "Firefox 3, Thunderbird 3" off
           06 "Terminator" off
           07 "GIMP" off
           08 "Compiz" off
           09 "OpenOffice 3" off
           10 "Gnome DO" off
           11 "Ubuntu Tweak" off
           12 "Rhythmbox" off
           13 "FreeNX" off
           14 "Adobe Flash" off
           15 "Extra Ubuntu Themes" off
           16 "Wine" off
           17 "VirtualBox" off
           18 "Swiftfox" off
           19 "VLC Media Player" off
           20 "Pidgin" off
           21 "Rhythmbox" off
           22 "Claws Mail" off
           23 "Google-Gadgets" off 2>$_temp
    if [ ${?} -ne 0 ]; then return; fi
    result=`cat $_temp`
    array=($result)

    dialog --title " Extra-Repositories " --yesno "Moechtest du die Extra-Repositories wirklich eintragen?" 6 44
    result1=$?
    if [ $result1 = "1" ]; then return; fi

for i in ${array[@]}; do

        case $i in
        "01")
                grep -iv medibuntu $sources > $sources_temp
                cp -p $sources_temp $sources
                wget http://packages.medibuntu.org/medibuntu-key.gpg && sudo apt-key add medibuntu-key.gpg && rm medibuntu-key.gpg
                a="## Medibuntu"
                b="# Please report any bug on https://bugs.launchpad.net/medibuntu/"
                c="# wget http://packages.medibuntu.org/medibuntu-key.gpg && sudo apt-key add medibuntu-key.gpg && rm medibuntu-key.gpg"
                d="deb http://packages.medibuntu.org/ jaunty free non-free"
                e="deb-src http://packages.medibuntu.org/ jaunty free non-free"
                echo -e "$a" "n$b" "n$c" "n$d" "n$e" >> $sources
        ;;
        "02")
                launchpad "netbook-remix-team" "Ubuntu Netbook Remix"
        ;;
        "03")
                launchpad "awn-testing" "AWN"
        ;;
        "04")
                launchpad "smaioli" "Vuze"
        ;;
        "05")
                launchpad "steveydoteu" "Firefox 3.1 und Thunderbird 3.0"
                lanuchpad "mozillateam" "Mozilla Team"
                lanuchpad "fta" "Mozilla Development Stuff"
        ;;
        "06")
                launchpad "gnome-terminator" "Terminator"
        ;;
        "07")
                launchpad "c-korn" "GIMP 2.6"
        ;;
        "08")
                launchpad "compiz" "Compiz"
                launchpad "tormodvolden" "nice xserver"
        ;;
        "09")
                launchpad "openoffice-pkgs" "OpenOffice 3"
        ;;
        "10")
                launchpad "do-core" "Gnome DO"
        ;;
        "11")
                launchpad "tualatrix" "Ubuntu Tweak"
        ;;
        "12")
                launchpad "jmillikin" "Rhythmbox"
        ;;
        "13")
                launchpad "freenx-team" "freenx, nxagent"
        ;;
        "14")
                launchpad "psyke83" "PulseAudio Fixes & Adobe Flash"
                launchpad "themuso" "PulseAudio - Preview Packages"
                launchpad "ubuntu-ko" "unzip, sbackup, flashplugin-nonfree"
        ;;
        "15")
                launchpad "murrine-themes" "Murrine Themes"
                launchpad "kwwii" "Intrepid theme"
        ;;
        "16")
                grep -iv wine.budgetdedicated $sources > $sources_temp
                cp -p $sources_temp $sources
                wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -
                a="## Wine (wine.budgetdedicated)"
                b="# wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -"
                c="deb http://wine.budgetdedicated.com/apt jaunty main"
                d="deb-src http://wine.budgetdedicated.com/apt jaunty main"
                echo -e "$a" "n$b" "n$c" "n$d" >> $sources
        ;;
        "17")
                grep -iv download.virtualbox $sources > $sources_temp
                cp -p $sources_temp $sources
                a="## VirtualBox (download.virtualbox)"
                b="deb http://download.virtualbox.org/virtualbox/debian jaunty non-free"
                echo -e "$a" "n$b" >> $sources
        ;;
        "18")
                grep -iv getswiftfox $sources > $sources_temp
                cp -p $sources_temp $sources
                a="## Swiftfox (getswiftfox)"
                b="deb http://getswiftfox.com/builds/debian unstable non-free"
                echo -e "$a" "n$b" >> $sources
        ;;
        "19")
                launchpad "motumedia" "VLC"
        ;;
        "20")
                launchpad "nicolai-spohrer" "Pidgin"
                launchpad "hyperair" "Pidgin, Gaim"
                launchpad "pidgin-developers" "Pidgin"
        ;;
        "21")
                launchpad "bigon" "empathy, rhythmbox"
                launchpad "jmillikin" "rhythmbox-svn"
        ;;
        "22")
                launchpad "claws-mail" "Claws Mail"
        ;;
        "23")
                launchpad "googlegadgets" "Google-Gadgets"
        ;;
        *)
                echo "Fehler?!?!"
        ;;
        esac

done
}

radiolist() {
    dialog --backtitle "Sources.list - Ubuntu Version"
           --radiolist "Ubuntu Version waehlen" 15 50 8
           01 "gutsy" off
           02 "hardy" off
           03 "intrepid" off
           04 "jaunty" on 2>$_temp
    if [ ${?} -ne 0 ]; then return; fi
    result=`cat $_temp`

    case $result in
    01)
        ubuntu_version="gutsy"
    ;;
    02)
        ubuntu_version="hardy"
    ;;
    03)
        ubuntu_version="intrepid"
    ;;
    04)
        ubuntu_version="jaunty"
    ;;
    *)
        ubuntu_version="FEHLER"
    ;;
    esac

    if [ $ubuntu_version = "FEHLER" ]; then
            continue
    else

          dialog --title " Ubuntu Version waehlen " --yesno "Moechtest du wirklich alle sources.list Eintraege auf '$ubuntu_version' aendern?" 6 44
          result1=$?

          if [ $result1 = "1" ]; then return; fi

          case $result in
          01)
                    sed -i -n -e "s/jaunty/gutsy/g" $sources
                    sed -i -n -e "s/hardy/gutsy/g" $sources
                    sed -i -n -e "s/intrepid/gutsy/g" $sources
          ;;
          02)
                    sed -i -n -e "s/jaunty/hardy/g" $sources
                    sed -i -n -e "s/gutsy/hardy/g" $sources
                    sed -i -n -e "s/intrepid/hardy/g" $sources
          ;;
          03)
                    sed -i -n -e "s/jaunty/intrepid/g" $sources
                    sed -i -n -e "s/gutsy/intrepid/g" $sources
                    sed -i -n -e "s/hardy/intrepid/g" $sources
          ;;
          04)
                    sed -i -n -e "s/jaunty/jaunty/g" $sources
                    sed -i -n -e "s/gutsy/jaunty/g" $sources
                    sed -i -n -e "s/hardy/jaunty/g" $sources
          ;;

          *)
                    continue
          ;;
          esac
    fi
} 

formbox () {
    dialog --backtitle "Repositories eintragen"
            --form " Repositories eintragen - use [up] [down] to select input field " 21 70 18
            "URL" 2 4 "http://de.archive.ubuntu.com/ubuntu/" 2 15 50 0
            "Ubuntu" 4 4 "jaunty" 4 15 20 0
            "was?" 6 4 "main" 6 15 50 0
            2>$_temp

    if [ ${?} -ne 0 ]; then return; fi
    result=`cat $_temp`
    dialog --title " Repositories eintragen " --yesno "Moechtest du wirklich folgendes wirklich eintragen n deb $result" 10 75
    result1=$?
    if [ $result1 = "1" ]; then return; fi
    echo "deb "$result >> $sources
    dialog --title "neuer Eintag in der sources.list"
           --msgbox "n deb $result" 10 75
}

textbox() {
wget -q http://www.voku-online.de/sources_new.txt -O $sources_temp &

wget_pid=$!
while [ 1 ]; do
        { for I in $(seq 1 100) ; do
        echo $I
        sleep 0.01
        done
        echo 100; } | dialog --backtitle "Dialog - Progress sample"
                             --gauge "Progress" 6 60 0

    if [ `ps | grep -c $wget_pid` -eq 0 ]; then
        break
    fi
done

    if [ -e $sources_temp ]; then
        dialog --backtitle "voku-online.de - Sources.list fuer Ubuntu 9.04 - use [up] [down] to scroll"
               --begin 3 5 --title " File: $sources_temp "
               --textbox $sources_temp 50 140
    else
        dialog --msgbox "*** ERROR ***n$sources_temp ist nicht vorhanden" 6 42
    fi
}

main_menu() {
    dialog --backtitle "voku-online.de" --title " Sources.list Tools - V. $VER "
        --cancel-label "Quit"
        --menu "Move using [UP] [DOWN], [Enter] to select" 15 80 10
        Deine_Sources.list "Deine source.list (less [q - zum beenden])"
        Repositories "Repositories eintragen"
        Extra-Repositories "Extra-Repositories: fuer Ubuntu 8.10"
        Ubuntu_Version "Waehle eine Ubuntu-Version"
        Aktuelle_Sources.list "Aktuelle source.list von voku-online.de anzeigen"
        Update "Paketdefinitionen aktualisieren"
        Quit "Exit" 2>$_temp

    opt=${?}
    if [ $opt != 0 ]; then rm $_temp; exit; fi
    menuitem=`cat $_temp`
    echo "menu=$menuitem"
    case $menuitem in
        Deine_Sources.list) less /etc/apt/sources.list;;
        Repositories) formbox;;
        Extra-Repositories) checklist;;
        Ubuntu_Version) radiolist;;
        Aktuelle_Sources.list) textbox;;
        Update) apt-get update;;
        Quit) rm $_temp; rm $sources_temp; rm $apt_get_dist_upgrade_temp; exit;;
    esac
}

while true; do
  main_menu
done

Veröffentlicht von

voku

Lars Moelleken | Ich bin root, ich darf das!

  • Hier auch noch mal ein paar Tipps.

    – Hardcoding ist nicht sonderlich gern gesehen:
    Die aktuelle Version könntest du ohne Probleme aus der Datei /etc/issue auslesen.
    – Mehrere Zeilen in eine Datei schreiben geht auch einfacher:
    (
    echo „foo“
    echo „bar“
    ) > /tmp/foobar
    – Ordentliche Exit-Codes verwenden (was es für dritte einfacher macht, zu überprüfen,
    ob es Fehler bei deinem Script gab oder nicht.
    – Variablen unbedingt escapen – ist in der Bash noch deutlich wichtiger als in PHP z. B.

    wget -q http://www.voku-online.de/sources_new.txt -O $sources_temp &

    Sowas kann sehr schnell schief gehen, wenn z. B. in der URL ein &-Zeichen drin ist. ;)

    – Uuund natürlich Fehler abfangen. Was wäre nun, wenn dein Script die gesuchte URL
    nicht runterladen kann? Das würde zu seltsamen, unerwarteten Ergebnissen kommen.
    Immerhin prüfst du ja auch nicht, ob wget einen gültigen Exit-Code zurückgegeben hat.

    Ach, und dein Blog macht übrigens einige Zeichen (Größer als, Kleiner als usw.) kaputt. Weshalb man das Script so eh nicht ausführen könnte.

  • Erst-einmal vielen Dank für die Tipps, werde diese bei meinen nächsten Skript beachten. „aber vielleicht Hilft es da jemand als Beispiel weiter…“ wie bereits erwähnt wurde das Skript ehr aus Langeweile anstelle von produtiven Einsatz geschrieben.

    Da ich mir in dieser Woche erst WordPress installiert habe, habe ich damit noch ein, zwei Schwierigkeiten… der Code müsste jedoch schon mal schöner angezeigt werden, thx für die Aufmerksamkeit, Daumen hoch. :)