# Cours de système d'exploitation
## Examen de juin 2020
## Auteurs : Alloin Clément, Oger Florian, Vanhalle Thomas
### Question 1
#### Partie script
``` bash
# !/bin/bash
readonly PARAMS=("$@")
dryRun(){
for params in $PARAMS; do
if [[ $params = "-n" ]] ; then
return 0 #True
fi
done
return 1
}
width(){
if ! hash gm identify 2>/dev/null; then
w=$(gm identify -format %w $2)
gm convert -resize "$w"x"$1" $2 $3
if dryRun = 0 ;then
echo "commande utilisee : gm convert -resize"
fi
else
w=$(identify -ping '%w' $2)
convert $2 -resize "$w"x"$1" $3
if dryRun = 0;then
echo "convert $2 -resize"
fi
fi
}
--strip(){
if ! hash gm identify 2>/dev/null; then
shopt -s globstar
gm convert -strip $1 $2
if dryRun = 0;then
echo "commande utilisee : gm convert -strip"
fi
else
magick -strip $1 $2
if dryRun = 0;then
echo "commande utilisee : magick -strip"
fi
fi
}
quality(){
if ! hash gm identify 2>/dev/null; then
gm convert -quality $1 $2 $3
if dryRun = 0;then
echo "commande utilisee : gm convert -quality"
fi
else
convert $2 -quality "$1" $3
if dryRun = 0;then
echo "commande utilisee : convert -quality"
fi
fi
}
for var in "$@"
do #statements
case $1 in
-w)
if [[ $2 =~ '-' || $# = 1 ]];then
VALUE=1500
else
VALUE=$2
fi
shopt -s globstar
for i in **/*.jpg; do # Whitespace-safe and recursive
d="copy_"$i
width $VALUE $i $d
done
shift
;;
-q)
if [[ $2 =~ '-' || $# = 1 ]];then
VALUE=80
else
VALUE=$2
fi
shopt -s globstar
for i in **/*.jpg; do # Whitespace-safe and recursive
d="copy_"$i
quality $VALUE $i $d
done
shift
;;
-s)
for i in **/*.jpg; do # Whitespace-safe and recursive
d="copy_"$i
--strip $i $d
done
shift
;;
*)
shift
;;
esac
done
```
#### Partie rapport
Les tests :
Tester avec différents paramètres :
./optijpeg.sh -w -q -s
Dans un autre ordre :
./optijpeg.sh -q -s -w
Tester avec des chiffres pour les paramètres de -w et -q :
./optijpeg.sh -w 1200 -q 40 -s -n
Tester sans paramètre :
./optijpeg.sh
Tester avec un seul paramètre :
./optijpeg.sh -w
### Question 2
Tout d'abord, je m'occupe des informations trouvables dans le *superblock*, donc à partir de l'octet 1024.
- **Nombre d'inodes** : "s_inodes_count" offset 0, taille 4 donc 1024-1028 => 0x0500 => **1280**
- **Nombre d'inodes utilisés** : pour cela on va chercher le nombre d'inodes libres qu'on soustrait au totalinodes libres : "s_free_inodes_count" offset 16, taille 4 donc 1040-1044 => 0x04f2 => 1266
inodes utilisés : 1280 - 1266 = **14**
- **Taille inode** : "s_inode_size" offset 88, taille 2 donc 1112-1114 => 0x80 => **128 octets**
- **Taille d'un bloc** : "s_log_block_size" offset 24, taille 4 donc 1048-1052 => 0x0 => 0 => 1024+2^0 = **1024 octets**
Passons maintenant au contenu des inodes, pour cela il faut la table des inodes qui se trouve en regardant dans le *Block group descriptor* à l'octet 2048.
- "bg_inode_table" offset 8, taille 4 donc 2056-2060 => 0x18 => 24 , je multiplie par la taille d'un block -> 24 * 1024 = 24576 Premier inode réservé au système donc : 24576 + 128 = **24704**
Je me rend à l'octet **24704** et je l'analyse à l'aide de *Inode Table*
- "i_mode" => "41ed" => Il s'agit donc d'un répertoire, pour voir son contenu "i_block"
- "i_block" offset 40, taille 4 donc 24744-24748 => 0xb8 => 184 donc 184 * 1024 = **188416**
- Je vais donc à l'octet **188416**, pour l'analyser, j'utilise *Directory Structure*
1)
- Quel inode : "inode" offset 0,taille 4 => 0x2 = 2, il s'agit de la racine
- taille : "rec_len" offset 4, taille 2 => 0xc = 12 octet
- longeur nom : "name_len" offset 6, taille 1 => 0x1 = 1 caractère
- type : "file_type" offset 7, taille 1 => 0x2 = 2 , il s'agit d'un dossier
- nom : "name" offset 8 => **.**
2)
Même façon que le précédent
- inode : 2
- taille : 12 octets
- longueur nom : 2
- type : dossier
- nom : **.\.**
1. et 2. sont donc . et .\. c'est à dire les racines.
3)
- inode : 0xb = 11
- taille : 20 octets
- longeur nom : 0xa = 10
- type : dossier
- nom : conversion de hex vers Texte : **lost+found**
4)
- inode : 0xc = 12
- taille : 0x10 = 16 octets
- longueur nom : 8
- type : dossier
- nom : **dossier1**
5)
- inode : 0xd = 13
- taille : 0x3c4 = 964 octets
- longueur nom : 8
- type : dossier
- nom : **dossier2**
J'ai donc deux dossiers à analyser : **dossier1** et **dossier2**. Je commence par **dossier1**.
1)
- J'ai trouvé, plus haut, que le contenu de **dossier1** est à l'inode 12 donc 12 * 128 + 24576 = **26112**
- Je me rend à l'octet **26112** et l'analyse avec *inode table*
- "i_mode" : il s'agit d'un dossier. Les permissions sont : rwx------
- Son contenu : "i_block" octet 26152 => 0xc7 = 199 199 * 1024 = **203776**. Je m'y déplace.
- le répertoire courant "." et ".\."
2)
- contenu de **dossier2** à l'inode 13 donc 13 * 128 + 24576 = **26240**
- Je me rend à l'octet 26240 et l'analyse avec *inode table*
- "i_mode" : il s'agit d'un fichier régulier. Les permissions sont rw-------
- son contenu : "i_block" octet 26280 => 0x201 = 513 513 * 1024 = **525312**
- je me rend à l'octet 525312 , son **contenu** : **"Baby yoda" + retour à la ligne**
- Le fichier se nomme "the_mandalorian.txt"
### Question 3
La commande suivante remplace le contenu du fichier zombies.txt par test.
On utilise perl afin de remplacer ce qui est contenu après "s/" par ce qui est contenu avant "/g".
Après "s/", on retrouve deux commandes permettant d'obtenir le contenu du fichier zombies.txt, tail permet de lire le contenu de disquette2.img à partir du 525313 ème bit. A partir de ce bit, on retrouve le contenu du fichier zombies.txt.
``` bash
perl -pi -e "s/$(cat disquette2.img | tail -c +525313)/test/g" disquette2.img
```
Afin de vérifier que le contenu du fichier a bien été changé, on peut exécuter la commande suivante :
``` bash
cat disquette2.img | tail -c +525313
```
On voit donc bien que le fichier contient uniquement "test".
### Question 4
Je commence par vérifier si j'ai bien un paramètre qui est donné. Si j'en ai bien un, je l'unzip dans tempDir. Ensuite, je récupère tout ce qui est entre les balises \<coordinates>\</coordinates> et j'enlève les tabs de début de ligne avec sed. Enfin, avec awk, je mets dans le format voulu.
``` bash
#!/bin/bash
set -euo pipefail
readonly PARAMS="$@"
if (($# == 1)); then
unzip $1 -d tempDir
sed -n '/<coordinates>/,/<\/coordinates>/p' tempDir/doc.kml |
sed -e 's/^[ \t]*//' | awk -F, 'BEGIN {sub(/^[\t]+/,"") ; } {
if ($1 == "<coordinates>") print "[" ;
else if ($1 == "</coordinates>") print "]," ;
else print " {\"latitude\" :"$2 ",\"longitude\" :"$1"},"
}'
rm -r tempDir
elif (($# == 0)); then
echo "Pas de fichier "
else
echo "Trop de parametres"
fi
```