
#!/bin/bash

# 1.1.2016 petteriIII.
# Tämä päivitys-skripti paivittää kovalevyltä sen kaikki Ubuntut (ja monet muutkin Linuxit). 105
# bootata voidaan mistä halutaan, eikä merkitse mitään jos jommassakummassa on EFI tai vaikka molemmissa.
# päivitys-skripti voi myös sijaita joko päivitettävässä tai päivittävässä. Päivitys-skripti kannattaa ajaa boottaus-välineen nautiluksella käyttäjätilassa.
# Jos salasanaa kysytään on se boottaus-välineen salasana; jos on bootattu live-versioon ei salasanaa kysytä ollenkaan.
# Btrfs-tiedostomuoto vaatii päivitys-skriptiin muutoksia.
# Kun on bootattu live-versiolta täytyy verkkoyhteys luoda ensin; live-versiossa verkkoyhteys luodaan samallatavoin kuin kovalevyllä olevassa.
# Kun on bootattu live-versiolta korjataan kovalevyn kaikkien liittämättömien osioiden levyvirheet ennen päivitystä.
# Ennen päivitystä yritetään poistaa kaikki päivityksen esteet ja turhista roskista pyritään eroon.
# Jos koneessa on lukemattomia turhia imageja saattaa kestää pitkäänkin poistaa ne, mutta muuten päivitys toimii lähes yhtä nopeasti kuin tavallinenkin päivitys.
function KirjoitaOhje { echo '- ennen päivittämistä kannaattaa sulkea muut ohjelmat.
- aluksi kysytään salasanaa ettei sitä kysyttäisi sitten toiminnan aikana keskenkaiken. Salasana on kovalevyllä toimittaessa oma
  salasanasi ja muistitikulla toimittaessa se on ubuntu jos sitä edes kysytään.
- toimiva internet-yhteys on välttämätön; live-versioiden verkkoyhteys asennetaan aivan samoin kuin normaalistikin - muistitikun asetukset säilyvät mutta cd:n ei.
- kovalevyosiot tarkistetaan ja yritetään korjata lukuunottamatta sitä osiota jolla on bootattu. Windows on kylläkin kantona kaskessa.
- roskikset tyhjennetään, vain viimeinen image jätetään ja päivityksen esteitä poistetaan.'; }
function tarkistaKovalevyjenKaikkiOsiot () {
read -t 5 -n 1 -p 'jos haluat tarkistaa kovalevyn perusteellisesti paina jotain kirjainta; silloin tarkistus kestää jonkinverran kauemmin mutta tarkistaa paremmin.' apu
echo
for osio in $(sudo blkid | grep -v swap | awk '{print $1}' | sed 's/\://g'); do
  [[ $(echo $osio | grep loop) ]] && continue
  sudo fsck -MVCaf $osio ||   sudo fsck -MVCac $osio
  echo ""
done
# live-tikku saattaa aiheuttaa virheviestin:There are differences between boot sector and its backup.
}
function unmountmnt { # if grep -qs '/mnt/foo' /proc/mounts; then
cd / # umount ei onnistu, jos joku umountattavan kansio on valittuna
sudo echo ""
for mountattu in $(sudo mount | grep /mnt | awk '{print $3}')
do
  if grep -qs $mountattu /proc/mounts; then sudo umount -l $mountattu; fi
done
echo '/mnt:n mountit on poistettu'
}
function Levy {  echo -n $(ls -l /dev/disk/by-id | grep -m 1 '/'${Chrootosio##*/} | awk '{print $9}' | sed "s/-part*//g") ;}
function paivitaKaikkiOsiot () { # itseensä chroottaus onnistuu ihan kivasti joten tällätavoin voi ihan hyvin päivittää itsensä
unmountmnt
for Chrootosio in $(sudo blkid | grep -v swap | grep -v vfat | awk '{print $1}' | sed 's/\://g'); do
  # [[ $( mount | grep $Chrootosio) ]] && echo && echo $Chrootosio'ohitettu' && echo && continue # hypätään seuraanaan loopissa
  osiontyyppi=$(sudo blkid -o value -s TYPE $Chrootosio)
  sudo mount -t $osiontyyppi $Chrootosio /mnt
  [[ -d /mnt/boot/grub ]] && [[ $(cat /mnt/boot/grub/grub.cfg | grep menuentry.*Ubuntu ) ]] &&  {
  sudo cp -L /etc/resolv.conf /mnt/etc/ ######################################### koe 21.10.16
  sudo mount -t sysfs none /mnt/sys &&  sudo mount -t proc proc /mnt/proc && sudo mount --bind /dev/ /mnt/dev &&  sudo mount --bind /dev/pts /mnt/dev/pts && sudo mount -o bind /etc/resolv.conf /mnt/etc/resolv.conf && sudo mount -o bind /dev/shm /mnt/dev/shm && sudo mount --bind /proc /mnt/proc
  echo; echo -n '********** päivitetään: '$Chrootosio '   levyllä: '; Levy; echo '     tiedostomuoto: '$osiontyyppi; echo		
  [[ -d /mnt/home/$(env | grep USER)/.local/share/Trash ]] && sudo rm -rf /mnt/home/$(env | grep USER)/.local/share/Trash # poistaa roskikset kaikilta osioilta joiden käyttäjä on sama kuin se jonka tililtä päivitä-skriptiä ajetaan eikä eriliskodin roskisia tyhjennetä koskaan
  # Kohdekoneen muistin vapauttaminen ei helpota tätä ohjelmaa. Kohdekoneen siistimisen syy onkin se, että kohdekone pärjäisi tulevaisuudessa itsekseen.
  sudo chroot /mnt tune2fs -m 1 $Chrootosio # rajoittaa pääkäyttäjälle varattua kovalevytilaa yhteen prosenttiin.
#  ei toimi live-Ubuntulla. Varmistetaan että käyttäjä kuuluu kaikkiin niihin ryhmiin joihin liitetään asennettaessa Ubuntu . Huomaa ettei tämä poista mitään. 
# for apu in adm cdrom sudo dip plugdev lpadmin sambashare $(echo ${0%} | tr "/" " " | awk '{print $(NF-2)}'); do
#    [[ ! $(groups | grep $apu) ]] && sudo addgroup $(echo ${0%} | tr "/" " " | awk '{print $(NF-2)}') $apu
#     [[ ! $(groups | grep $apu) ]] && sudo chroot /mnt addgroup $(echo ${0%} | tr "/" " " | awk '{print $(NF-2)}') $apu
# done
  # poistetaan kaikki muut imaget paitsi se jolla toimitaan. Siis mikäli on tullut uusi image niin jos se toimii niin seuraavassa päivityksessä se poistuu.
  for n in $(ls /mnt/boot | grep config | grep -v $(ls /mnt/boot | grep config | sort | tail -1) | sed 's/config-//g'); do
    sudo chroot /mnt apt-get --yes  purge 'linux-image-'$n
    sudo chroot /mnt apt-get --yes  purge 'linux-image-extra-'$n # turha lause, mutta muistutuksena siitä mitä tapahtuu.
    sudo chroot /mnt apt-get --yes  purge 'linux-headers-'$n
  done # Mikäli et halua poistaa imageja kommentoi nämä 5 riviä
  # seuraavia kommentointeja poistetaan kun haetaan vikaa jos päivitys-skripti toimisi joskus virheellisesti; ei toistaiseksi ole tarvittu
  #sudo fuser -cuk /var/lib/dpkg/lock; sudo rm -f /var/lib/dpkg/lock   
  #sudo fuser -cuk /var/cache/apt/archives/lock; sudo rm -f /var/cache/apt/archives/lock
  sudo chroot /mnt rm -f /var/cache/apt/archives/lock /var/lib/aptitude/lock /var/lib/dpkg/lock /var/lib/apt/lists/lock
  #sudo chroot /mnt rm /var/lib/apt/lists/*$; sudo rm /var/lib/dpkg/lock$; sudo rm /var/cache/apt/archives/lock # pitäiskö siirtää alkuun?
  sudo chroot /mnt apt-get check # korjaa pakettivaraston riippuvuudet
  sudo chroot /mnt dpkg --force-confnew --configure -a
  sudo chroot /mnt apt-get --yes  --fix-broken install
  sudo chroot /mnt apt-get --yes  autoclean
  #sudo chroot /mnt apt-get --yes  clean # poistaa myös osittaiset_ja_vahingoittuneet paketit ja tekee toiminnan varmemmaksi, mutta hidastaa ellei verkkoyhteys ole tosinopea.
  sudo chroot /mnt apt-get --yes  autoremove
  # jos jossain vaiheessa kun vahingoittueen paketin nimi selviää saa sen poistettua: sudo dpkg --remove -force --force-remove-reinstreq paketin_nimi
  sudo chroot /mnt rm -f /var/crash/* # poistaa tehdyt raportit etteivät ne jatkuvasti kiusaisi. Jos ne kiusaa sittenkin: sudo gedit /etc/default/apport ja kirjoitta 0
  sudo chroot /mnt apt-get update
  [[ $(env | grep USER.*=ubuntu) ]] && sudo chroot /mnt apt-get -y upgrade || sudo chroot /mnt apt-get -y dist-upgrade
   sudo chroot /mnt update-grub && echo -n 'grub.cfg sijoitettiin levylle: '; Levy
} # vastaava avaava sulkumerkki on rivillä 38
unmountmnt
done
}
# Pääohjelma
# echo ${0%} | tr "/" " " | awk '{print $(NF-2)}';read
#[[ $(lsb_release -i | grep Ubntu$ ) ]] && echo tämä on standardi Ubuntu joten jatketaan || echo tämä ei ole stardardi Ubuntu ja jatkaminen saattaa olla vaarallista. Vain vastaamalla: kyllä jatketaan. Haluatko välttämättä jatkaa? && read apu && [[ $apu != kyllä ]] && exit || echo jatketaan kun lupa saatiin
KirjoitaOhje
echo ''; sudo echo
hommaalkoi="$(date +%s)"
tarkistaKovalevyjenKaikkiOsiot # sitä osiota jolta on bootattu ei tarkisteta.

paivitaKaikkiOsiot
echo -e 'päivitetty: '$(date +"%d-%m-%y %k:%M")'\t ja päivittäminen kesti sekunneissa: '$(($(echo $(date +%s))-$hommaalkoi
#echo -e 'päivitetty: '$(date +"%d-%m-%y %k:%M")'\t ja päivittäminen kesti minuuteissa: '$(date -d@$(echo $(date +%s)-$hommaalkoi-7200 | bc) | awk '{print $3}')
:

 
