Δημοσιεύτηκε: 25 Οκτ 2015, 12:30
από fkol k4
Αν και όχι συχνά, μερικές φορές συμβαίνει κάτι να πάει στραβά σε μια αναβάθμιση ή ενημέρωση και κάτι «σπάει» στο λειτουργικό

Με αφορμή το πρόσφατο σπάσιμο στη δική μου αναβάθμιση λοιπόν, είπα να αυτοματοποιήσω λιγάκι τη διαδικασία με ένα απλό σκριπτάκι ώστε να μη χρειάζεται να ψάχνω τι έσπασε, τουλάχιστον όσον αφορά το βασικό προεγκαταστημένο σύστημα.
Και μιας που το έφτιαξα, το ποστάρω εδώ μήπως θελήσει να το χρησιμοποιήσει και κάποιος άλλος που θα βρεθεί σε παρόμοια θέση.
Το σκριπτάκι αυτό κάνει για όλα τα επίσημα flavours του Ubuntu (Ubuntu, Kubuntu, Xubuntu, Lubuntu, Ubuntu GNOME, Ubuntu MATE, UbuntuKylin, UbuntuStudio, Mythbuntu, Edubuntu).
Οι ενέργειες που κάνει είναι οι παρακάτω:

  • Βρίσκει την έκδοση του λειτουργικού (πχ 14.04) και την αρχιτεκτονική του (64 ή 32 bit).
  • Τρέχει κάποιες εντολές apt-get για την ενημέρωση και τον καθαρισμό του συστήματος.
  • Κατεβάζει το αρχείο manifest της έκδοσης. Αυτό είναι ένα αρχείο που περιγράφει όλα τα προεγκαταστημένα πακέτα που θα έπρεπε να έχει το λειτουργικό.
  • Επανεγκαθιστά όλα τα παραπάνω πακέτα.

Αυτό σημαίνει πως αν έχει σπάσει κάποιο κομμάτι από το βασικό σύστημα, αυτό θα επανεγκατασταθεί (ίσως να χρειαστεί να τρέξει το σκριπτ δύο φορές).
Παρακάτω το σκριπτ:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#! /bin/bash

# Type: Bash script

# Tries to repair basic Ubuntu (and official flavours) installation
# by reinstalling default packages.

# Copyright (C) 2015 fkol-k4 ( https://github.com/fkol-k4 )

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation version 2.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.


## Script functions
function txt_formatting() {
# text formatting options
bold='\e[1m'
underline='\e[4m'
reset='\e[0m'
}

function usage_msg() {
# script usage message
clear
txt_formatting
echo -e "$bold
No or invalid parameter!
$reset
Please try again running the script with a proper parameter...
$bold
Usage:$reset $scriptname <flavour>
$bold
Available flavours:$reset ubuntu
kubuntu
xubuntu
lubuntu
ubuntu-gnome
ubuntu-mate
ubuntukylin
ubuntustudio
edubuntu
mythbuntu
$underline$bold
Example:$reset $scriptname ubuntu-mate
"
exit 1
}

function get_manifest() {
# build info for necessary manifest file & url
name="$(lsb_release -sc)"
version="$(lsb_release -sr)"
if [[ $(arch) == x86_64 ]]; then
sys_arch="amd64"
else
sys_arch="i386"
fi
# build manifest file url
if [[ $1 == "ubuntu" ]]; then
manifest_url="http://releases.ubuntu.com/$name/$flavour-$version-desktop-$sys_arch.manifest"
elif [[ $1 =~ ^("kubuntu"|"xubuntu"|"lubuntu"|"ubuntu-gnome"|"ubuntu-mate"|"ubuntukylin"|"ubuntustudio")$ ]]; then
manifest_url="http://cdimage.ubuntu.com/$flavour/releases/$name/release/$flavour-$version-desktop-$sys_arch.manifest"
elif [[ $1 == "mythbuntu" ]] || [[ $1 == "edubuntu" ]]; then
manifest_url="http://cdimage.ubuntu.com/$flavour/releases/$name/release/$flavour-$version-dvd-$sys_arch.manifest"
else
usage_msg
fi
# make workfolder
mkdir -p /tmp/repair
cd /tmp/repair/
rm -rf ./*.manifest
# download manifest file
wget "$manifest_url"
cd "$HOME"
}

function apt_repair() {
sudo apt-get update
sudo apt-get --yes --force-yes dist-upgrade
sudo apt-get --yes clean
sudo apt-get --yes autoclean
sudo apt-get --yes --purge autoremove
sudo apt-get --yes --force-yes --fix-missing install
sudo apt-get --yes --force-yes --fix-broken install
sudo dpkg --configure -a
}

function install_basics() {
# define basic packages list
manifest_file=$(ls /tmp/repair/ | grep manifest)
package_list=($(cat "/tmp/repair/$manifest_file" | awk '$0 {print $1}'))
# install basic packages
for package in ${package_list[@]}; do
sudo apt-get --yes --force-yes --no-install-recommends --reinstall install "$package"
done
}


## Main script
# global variables
export scriptname=$0
export flavour=$1

if [ $# -lt 1 ]; then
# run on no parameter
usage_msg
fi
get_manifest $flavour
apt_repair
install_basics

Για να το χρησιμοποιήσετε:
  • Αντιγράφετε σε έναν κειμενογράφο τον κώδικα.
  • Το σώζετε με ένα όνομα της επιλογής σας.
  • Το μετατρέπετε σε εκτελέσιμο αρχείο.
  • Μεταφέρεστε στον φάκελο που το αποθηκεύσατε.
  • Τρέχετε το σκριπτάκι βάζοντας ως παράμετρο το flavour του λειτουργικού σας.
    Για παράδειγμα, αν έχετε αποθηκεύσει το σκριπτάκι ως repair και έχετε εγκαταστημένο το Ubuntu GNOME. τότε δίνετε από το τερματικό την εντολή
    Κώδικας: Επιλογή όλων
    ./repair ubuntu-gnome
    ** Αν τρέξετε το σκριπτάκι χωρίς παράμετρο (πχ σκέτο ./repair), θα σας βγάλει ένα μήνυμα με το ποιες είναι οι διαθέσιμες παράμετροι.


Για όποιον βαριέται να αντιγράφει, μπορεί να κατεβάσει το σκριπτάκι από το αποθετήριο στο Github όπου βρίσκεται στον προσωπικό του φάκελο και να το χρησιμοποιεί από εκεί με την παρακάτω εντολή:
Κώδικας: Επιλογή όλων
wget -O repair https://raw.githubusercontent.com/fkol-k4/generic_files/master/systemfiles-ubuntu/usr/local/bin/custom/custom_repair-basics; chmod +x repair


Για όποιον επιπλέον βαριέται να μεταφέρεται στον φάκελο με το script και θέλει να το εκτελεί από οπουδήποτε, με την παρακάτω το script θα κατέβει στο /usr/local/bin/ το οποίο βρίσκεται στο $PATH του λειτουργικού, οπότε πλέον καλείται από οπουδήποτε και χωρίς το πρόθεμα ./, δηλ. απλά με repair ubuntu-gnome:
Κώδικας: Επιλογή όλων
sudo su -c 'mkdir -p /usr/local/bin; wget -O /usr/local/bin/repair https://raw.githubusercontent.com/fkol-k4/generic_files/master/systemfiles-ubuntu/usr/local/bin/custom/custom_repair-basics; chmod +x /usr/local/bin/repair'


Σημειώσεις:
  • Το script δεν διορθώνει τα πάντα φυσικά, αλλά τα προεγκαταστημένα πακέτα καλύπτουν πολλές βασικές λειτουργίες οπότε μπορεί να χρησιμοποιηθεί για πολλές περιπτώσεις
  • Μπορείτε να τρέξετε το σκριπτάκι στην εγκατάστασή σας ακόμα και αν δεν έχετε κανένα πρόβλημα. Δεν κάνει ζημιά στην εγκατάσταση, κατεβάζει όμως πολλά πακέτα και τα επανεγκαθιστά ένα-ένα οπότε είναι και αρκετά χρονοβόρο αλλά και ιντερνετοβόρο (sic), οπότε ίσως να θέλετε να το αποφύγετε
  • Δώστε σαν παράμετρο το σωστό flavour. Αν πχ έχετε εγκαταστημένο Xubuntu, δώστε 'xubuntu' για παράμετρο. Αν δώσετε άλλο (πχ kubuntu), δεν θα διαγράψει μεν αυτό που ήδη έχετε, θα εγκαταστήσει όμως ολόκληρο το άλλο flavour. Εκτός αν θέλετε και τα δύο, οπότε τότε είναι εντάξει.
  • Δυστυχώς μιας και για τις άλλες Ubuntu - based διανομές (πχ Linux Mint, elementaryOS κτλ) δεν βρήκα δημοσιευμένα αρχεία manifest, το script δεν γίνεται να λειτουργήσει γι αυτές. Επίσης δεν γίνεται να λειτουργήσει σε εγκαταστάσεις τις οποίες κάποιος έχει χτίσει κομμάτι-κομμάτι (τουλάχιστον όχι χωρίς κάποιες μετατροπές), αν και χρήστες με τέτοιες εγκαταστάσεις το χρειάζονται λιγότερο.
  • Patches - bug reports are welcome!!!
  • Το δημοσιεύω στα Γενικά μιας και δεν ξέρω που ακριβώς πρέπει να πάει (οδηγός δεν είναι και έργο λογισμικού δεν το λες κιόλας...). Αν βρείτε καλύτερη θέση, ξέρετε... ;)