#!/bin/bash 
function osiojollaollaan { apuu=$(df / | awk '{print $1}'); osiojollaollaan=${apuu##*/dev/}; } # boottausosion looginen nimi tyypiltään sdx

function levyjollaollaan { Osiojollaollaan; levyjollaollaan=$(ls -l /dev/disk/by-id | grep -m 1 '/'$osiojollaollaan | awk '{print $9}' | sed "s/-part*//g");}

function tunnetutosiot { tunnetutosiot=$(blkid | awk '{print $1}' | tr -d : | sed 's,/dev/,,g');}
# function tunnetutosiot { tunnetutosiot=$(lsblk | grep sd.[0-9][' '0-9] | awk  '{print $1}'  | tr -dc [:print:]'\n'); }

function tunnetutlevyt { tunnetutlevyt=$(ls -l /dev/disk/by-id | grep -v [0-9]$ | awk '{print $9}' | grep -E '(ata-|usb-)');}

function maaritakoti { apu=$(sudo df /home | awk '{print $1}'); kotiosio=${apu##*/dev/}; echo 'kotiosio:'=$kotiosio; sleep 1; }

function maaritaosiot { muutosiot=$(sudo blkid | grep -v swap | sed 's/\/dev\///g' | awk '{print $1}' | tr -d [\n:] ); }

function uusiosiotaulu () { sudo dd if=/dev/zero of=/dev/sda bs=512 count=1 } # siis tyhjentää koko levyn

function boottilevynnimi { Osiojollaollaan; apu=$(ls -l /dev/disk/by-id | grep '/'$osiojollaollaan | awk '{print $9}'); boottilevynnimi=${apu%%-part*};}

function labeliavastaavalaite () { label=$1; cat /etc/mtab | grep /$label | awk '{print $1}' | sed 's/\/dev\///g' ;

function kirjoitalabel { sudo e2label /dev/$1$2 } # kutsuesimerkki: kirjoitalabel sdc 1

function idProduct_idVendor () { echo $(journalctl | grep usb.*New.*idVendor= | tail -1 | grep -Po '(?<=idVendor=)[0-9A-Za-z]*')':'$(journalctl | grep usb.*New.*idVendor= | tail -1 | grep -Po '(?<=idProduct=)[0-9A-Za-z]*') ; } # viimeksi lisätyn laitteen idProduct:idVendor

function laitettavastaavalabel () { laite=$1; apu=$(cat /etc/mtab | grep /dev/$laite | awk '{print $2}'); echo ${apu##*/} ;}

function kirjoitalabel () { sudo e2label /dev/$1$2 $3 ;} # kutsuesimerkki: kirjoitalabel sdc 1 labelin_teksti

function osiotauluntyyppi () { [[ $(sudo parted -l | grep -m 1 "Partition Table" | awk '{print $3}') = msdos ]] && echo 'osiotaulun tyyppi:mbr' || echo 'osiotauluntyyppi:gpt' ;}

function tiedostotyyppi () { echo 'osiontyyppi= '$(sudo blkid -o value -s TYPE /dev/$1) ;}                # kutsu: tiedostotyyppi sda5 (ext4, btrfs ...)
# tai: function tiedostotyyppi () { udevadm info -n /dev/$1 -q property | grep -Po '(?<=ID_FS_TYPE=).* }' # kutsu: tiedosto tyyppi sda5  # huom! ei tarvitse sudo:a luotettavaan toimintaan

function vertaatiedostoja () { cmp -s $1 $2 > /dev/null; [[ $? -eq 0 ]] && echo tiedostot samanlaisia || echo tiedostot erilaisia;} #kutsu:vertaatiedostoja apu apu2

function osionUUID () { echo 'osionUUID= '$(sudo blkid -o value -s UUID /dev/$1) ;}                       # kutsu: osionUUID sda5

function UEFItesti () { [[ -d /sys/firmware/efi ]] && echo 'kone on bootattu UEFI-muodossa' || echo 'konetta ei ole bootattu UEFI-muodossa'; } # kutsu: UEFItesti

function kansionkoko () { echo $(du -B1 $1 | awk 'END{print $1}')*1000/1024 | bc ;};                      # kutsu: kansionkoko kansio_polkuineen. Polku saa johtaa liitetylle asemalle.

function sektorikoko () { cat /sys/block/$1/queue/physical_block_size ;};                                 # kutsu: sektorikoko sda 

function kovalevystä_käytössä () { df -k --output=pcent /dev/$1 | tail -1;}                               # kutsu: kovalevystä_käytössä sda2

function Osioselvitys () { lsblk -o +label,fstype,uuid; }

function Osioselvitys_ () {
declare -A osion_levy osion_label osion_UUID osion_tiedostojarjestelma
Osiojollaollaan; echo $osiojollaollaan; read
[[ $(cat /dev/$osiojollaollaan 2>&1 | grep -o 'Lupa evätty') ]] && echo 'Laiteluettelo ei ole täydellinen; käy päätteessä käskemässä: sudo blkid' # koe
Tunnetutosiot
for n in $tunnetutosiot; do osion_levy[$n]=$(ls -l /dev/disk/by-id | grep -m 1 $n | awk '{print $9}' | sed "s/-part[0-9]//g") ; done 
for n in $tunnetutosiot; do osion_label[$n]=$(sudo blkid -o value -s LABEL /dev/$n); done 
for n in $tunnetutosiot; do osion_UUID[$n]=$(sudo blkid -o value -s UUID /dev/$n); done
for n in $tunnetutosiot; do osion_tiedostojarjestelma[$n]=$(sudo blkid -o value -s TYPE /dev/$n); done
apu=1
(for n in $tunnetutosiot; do [[ $apu ]] && echo 'osio/koko liitos_standardi--osio_on_levyllä UUID tiedostojarjestelma label'; echo $n/$(lsblk | grep $n | awk '{print $4}')' '${osion_levy[$n]}' '${osion_UUID[$n]}' '${osion_tiedostojarjestelma[$n]}' '${osion_label[$n]}; apu=''; done) | column -t
}

function tarkistaKovalevyjenKaikkiOsiot () { 
# joskus super-block on vialla ja käsky ei onnistu. silloin kannattaa kokeilla:fsck -b 8193 <laite>  tai:fsck -b 32768 <laite>   .numerot löytää käskyllä: 
# apu=("$(sudo mke2fs -n /dev/sda1 | grep -A 2 Superblock | tr -d [[[:alpha:]]:,])"); echo $apu
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
}

function Kovalevyntyyppi () { [[ -f /sys/block/$1/queue/rotational ]] && ( [[ $(cat /sys/block/$1/queue/rotational) -eq 0 ]] && echo 'levy:'$1' on puolijohdetyyppinen' || echo 'levy:'$1' on mekaaninen' ) || echo echo 'levyä:'$1' ei ole';} # kutsuesimerkki: Kovalevyntyyppi sda

function Levyliitäntä () { [[ $(ls -lF /dev/disk/by-id/usb-* | grep $1$) ]] && echo levy on usb-liitäntäinen; } # kutsuesimerkki: Levyliitäntä sdb

function USBlaji () { read -p "Laita joku muistitikku johonkin USB-porttiin, ota muistitikut pois muista USB-porteista ja paina enter"
#sudo echo -n 'tämä portin tyyppi on: '; sudo lsusb -v | grep -A 5 $(dmesg | grep Manufacturer: | tail -1 | awk '{print $6}') | grep bcdUSB | awk '{print $2}'
sudo echo -n 'muistitikun portti on tyyppiä: '; sudo lsusb -v | grep -A 5 $(dmesg | grep Manufacturer: | awk 'END{print $6}') | grep bcdUSB | awk '{print $2}'; }

function tyhjätvaraukset () { lsof +L1 | awk '{ sum+=$7 ; lkm+=1} END { print "tyhjien varauksien lkm:"lkm" ja niiden kovalevyltä varaama tila sanoja(?):"sum }';} # kutsu:tyhjätvaraukset
tai:lsof -nP 2> /dev/null | awk '/deleted/ { sum+=$8 ; lkm+=1} END { print "tyhjien varauksien lkm:"lkm" ja niiden kovalevyltä varaama tila sanoja(?):"sum }' 

function TeeListaOsioistaJaValitseNiistaYksi {
osioidenluku=0
for osio in $(sudo fdisk -l | grep /dev/ | grep Linux | grep -v swap | grep -v sivutus | awk '{print $1}')
do
  Osionkuvaus=${osio:5:5}' =' 
  sudo mount -t $(sudo blkid -o value -s TYPE $osio) $osio /mnt 
  if [ -d /mnt/boot/grub ]; then 
    test  -d "/mnt/lib64" && Osionkuvaus=$Osionkuvaus' 64bit ' || Osionkuvaus=$Osionkuvaus' 32bit '
    apu=$(cat /mnt/etc/lsb-release | grep DISTRIB_CODENAME)
    Osionkuvaus=$Osionkuvaus${apu:17}' '
    # Osionkuvaus=$Osionkuvaus'   '$(df -T | grep -m 1 ${osio:5:4} | awk '{print $2}') # tiedostojärjestelmän tyyppi ext, FAT, ntfs ...
    test  -f "/mnt/boot/grub/grub.cfg" && Osionkuvaus=$Osionkuvaus' '$(sudo cat /mnt/boot/grub/grub.cfg | grep -m 1 menuentry | awk '{print $2}')  
    test  -f "/mnt/boot/grub/menu.lst" && Osionkuvaus=$Osionkuvaus' '$(sudo cat /mnt/boot/grub/menu.lst | grep -v "# title" | grep -m 1 title) 
    Valittavat[osioidenluku]=$Osionkuvaus
    (( osioidenluku++ ))
  fi
Valittavat[osioidenluku]='kertomus siitä mihin tällä ohjelmalla pyritään ja kuinka tämä toimii'
  sudo umount /mnt
done
valintateksti='Nyt olet osiolla:'$osiojollaollaan'. Osiolla ei voi suorittaa kaikkia korjauksia '
test  -d "/lib64" && valintateksti=$valintateksti'32 bittiselle. Valitse osio:' || valintateksti=$valintateksti'64 bittiselle. Valitse osio:'
test ! $osioidenluku && echo 'levyllä ei ole Linuxia, lopetan.' && sleep 5 && exit 0  
ValitseValittavistaYksi "$valintateksti"  
chrootosio=${Valittavat[$ValitunNumero-1]:0:5} # oli: $ValitunNumero
test "$ValitunTeksti" = 'kertomus siitä mihin tällä ohjelmalla pyritään ja kuinka tämä toimii' && KirjoitaOhje
} 

function tyhjennäroskikset {
echo 'Tyhjennän roskiksia. Vapautettu tila on käytettävissä tämä ohjelman kannalta vasta kun tämä ohjelma lopetetaan. Jos haluat nähdä paljonko tilaa vapautui niin tyhjennettyäsi roskikset lopeta tämä ohjelma ja aloita heti uudestaan.'
if [ ! -d "/mnt/apu1" ]; then sudo mkdir /mnt/apu1; fi 
sudo mount /dev/$chrootosio /mnt/apu1
kotiosio=$(sudo cat /mnt/apu1/etc/fstab | grep /home | grep -v UUID | awk {'print $5'}) 
sudo umount /mnt/apu1
if [ $kotiosio ]; then
  sudo mount $kotiosio /mnt/apu1
  test -d /mnt/apu1/*/.local/share/Trash && echo 'käyttäjien roskikset tyhjennetään erilliskodista osiolta:'$kotiosio && sudo rm -rf /mnt/apu1/*/.local/share/Trash || echo 'käyttäjillä ei ole roskiksia erillikodissa.'
  sudo umount /mnt/apu1 
fi
sudo mount /dev/$chrootosio /mnt/apu1
test -d /mnt/apu1/home/*/.local/share/Trash && echo 'käyttäjien roskikset tyhjennetään osiolta:'$chrootosio && sudo rm -rf /mnt/apu1/home/*/.local/share/Trash || echo 'käyttäjillä ei ole normaaleja roskiksia.'
test -d /mnt/apu1/root/.local/share/Trash && echo 'pääkäyttäjän roskis tyhjennetään osiolta:'$chrootosio && sudo rm -rf /mnt/apu1/root/.local/share/Trash || echo 'pääkäyttäjällä ei ole roskista.'
sudo umount /mnt/apu1
valittu=''
} 

function unmountmnt {
cd / # umount ei onnistu, jos umountattavaan on cd
sudo echo ""
for mountattu in $(sudo mount | grep /mnt | awk '{print $3}') 
do
  test -e $mountattu && sudo umount -l $mountattu
done  
echo '/mnt:n mountit on poistettu'
}
 
function MounttaaChroottaaJaSuoritaValittuToimi { # MounttaaJaSuoritaValittuToimi -> Chroottaa jos tarvitsee
if [ ! -d "/mnt/apu" ]; then sudo mkdir /mnt/apu; fi  
sudo chown $(whoami) /mnt/apu
sudo mount /dev/$chrootosio /mnt/apu 
sudo mount -t sysfs none /mnt/apu/sysTeeListaLevyista
sudo mount -t proc none /mnt/apu/proc
sudo mount --bind /dev/ /mnt/apu/dev
sudo mount --bind /dev/pts /mnt/apu/dev/pts
sudo mount -o bind /etc/resolv.conf /mnt/apu/etc/resolv.conf
test ! -f /sbin/initctl && dpkg-divert --local --rename --add /sbin/initctl # https://wiki.ubuntu.com/MaverickMeerkat/ReleaseNotes .
test ! -h /sbin/initctl && ln -s /bin/true /sbin/initctl
test "$ValitunArvo" = "tyhjennäroskikset" && tyhjennäroskikset && ValitunArvo=''
test "$ValitunArvo" = "TarkasteleMitäPakettejaOletAsentanutJaMilloin" && TarkasteleMitäPakettejaOletAsentanutJaMilloin && ValitunArvo=''
test "$ValitunArvo" = "palautuspiste" && ~/omatskriptit/palautuspiste && ValitunArvo='' # pitäisköhän väsätä funktio ?
test "$ValitunArvo" = "PoistaTurhatImagetJaHeaderit" && PoistaTurhatImagetJaHeaderit && ValitunArvo=''
test "$ValitunTeksti" = 'Päivitä tämä chrootattu osio' && Päivitä
test "$ValitunArvo" = "mc"  && test ! -f /mnt/apu/usr/bin/mc && clear && echo 'Koneessa ei ole mc:tä, asenna mc ensin' && sleep 3 && ValitunArvo=''
test "$ValitunArvo" && echo 'Nyt chrootataan. ValitunArvo: '$ValitunArvo && sudo chroot /mnt/apu $ValitunArvo 
test `echo $?` -gt 0 && echo "joko virhe tai huomautus" 
unmountmnt
sudo rmdir /mnt/apu
}

function Päivitä {
sudo chroot /mnt/apu apt-get update 
sudo chroot /mnt/apu apt-get upgrade 
test $0 && echo 'ei mitään päivitettävää' && sleep 2
ValitunArvo=''
}

function TarkasteleMitäPakettejaOletAsentanutJaMilloin {
test ! -d "/mnt/apu" && sudo mkdir /mnt/apu 
test ! mount | grep /dev/$chrootosio | grep /mnt/apu && mount /dev/$chrootosio /mnt/apu
echo "osion:"$chrootosio' on liitetty kansioon /mnt/apu'
test -d /mnt/apu/tmp/downgraderepo && sudo rm -R /mnt/apu/tmp/downgraderepo/* || sudo mkdir /mnt/apu/tmp/downgraderepo
sudo chown $(whoami):$(whoami) /mnt/apu/tmp/downgraderepo
array=($(ls /mnt/apu/var/cache/apt/archives)) 
for (( apu1=0; apu1<=${#array[*]}; apu1++ ))
do
  paketinnimi=$(echo "${array[$apu1]}")  
  paketinpvm=$(ls -ol /mnt/apu/var/cache/apt/archives | grep "${array[$apu1]}" | awk {'print $5'}) 
   paketinpvm=${paketinpvm:0:10} # paikkaa awk:ia 
  echo '  päivä:'$paketinpvm'     Lisätään paketti:'$paketinnimi
  test $paketinnimi && test ! -d /mnt/apu/tmp/downgraderepo/$paketinpvm && mkdir /mnt/apu/tmp/downgraderepo/$paketinpvm
  test $paketinpvm && test $paketinnimi && echo $paketinnimi >> /mnt/apu/tmp/downgraderepo/$paketinpvm/$paketinnimi 
done
Valittavat=($(ls /mnt/apu/tmp/downgraderepo))
ValittavanArvo=($(ls /mnt/apu/tmp/downgraderepo))
ValitseValittavistaYksi 'minkä päivän paketteja haluat tarkistella'
paivanPaketit=($(ls /mnt/apu/tmp/downgraderepo/$ValitunArvo))
for (( apu1=0; apu1<=${#paivanPaketit[*]}; apu1++ ))
do 
  paivitettavapaketti="${paivanPaketit[$apu1]}"
  alleviivaus=$(expr index "$paivitettavapaketti" _); alleviivaus=$(($alleviivaus-1)); reinstalloitava=${paivitettavapaketti:0:$alleviivaus}
  Valittavat=( 'ei tehdää mitään' 'poistetaan' 'päivitetään' )
  ValittavanArvo=( 'ei tehdää mitään' 'poistetaan' 'päivitetään' )
  ValitseValittavistaYksi "mitä tehdään paketille: "$reinstalloitava
  test "$ValitunArvo" = "ei tehdä mitään" TeeListaLevyista&& echo -e '\nei tehdä mitään'
  test "$ValitunArvo" = "päivitetään" && echo -e '\npäivitän paketin: '$reinstalloitava && sudo apt-get --reinstall install $reinstalloitava
  test "$ValitunArvo" = "poistetaan" && echo -e '\npoistan paketin: '$reinstalloitava && sudo apt-get remove $reinstalloitava
done 
read -p 'Paketit on käsitelty. Jatkaakseesi paina enter' apu 
# TarkasteleMitäPakettejaOletAsentanutJaMilloin
}  
 
function TeeValittaviinListaLevyista () {
for n in {a..z}
do
  apu=$(sudo fdisk -l | grep /dev/sd$n\:); [[ ! $apu ]] && break
  Valittavat=("${Valittavat[@]}" "$apu") 
done 
}

# petteriIII 20.9.2014 # blkid:n eteen täytyy laittaa sudo jotta olisi varmaa että levylista on nykyisestä tilanteesta.

echo -e "funktiot paikasta:$kanta/OMATSKRIPTIT/FUNKTIOKIRJASTO/Kovalevy_funktiot  liitetään koodiin"



 
  
 
