Bonjour à tous.

Je débute dans l'écriture de shell script et j'aurais besoin de conseils.
J'ai écris un script fonctionnel mais vraiment pas optimisé !

En clair mon script fonctionne mais est vraiment lamentable

Nom du script: xen-install.sh

Compatible avec: Bash

Descriptif: permet de créer automatiquement un machine virtuel Windows sur Xen + Qemu

Pré-requis: avoir répertoire /xen/domU-Win32/ et /etc/xen/domU-Win32/

mon script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#! /bin/bash
nombredisk=0;
mem=0;
proc=0;
while [ $nombredisk -gt 2 ] || [ $nombredisk -lt 1 ] ; do
        clear
        echo "1 - CHOIX DU NOMBRE DE DISQUE (2 Maximum)";
        echo "";
        echo -n "Combien de disque souhaitez vous utiliser ? : ";
        read nombredisk
done
case $nombredisk in
        1)
        clear
        echo "1.1 - CHOIX DE LA TAILLE DU DISQUE (Go)";
        echo "";
        echo "Exemple pour 20Go : 20G";
        echo "";
        echo -n "Quelle taille voulez-vous pour le disque ? : ";
        read tailledisk1
        clear
        echo "2 - CHOIX DU NOM DU SERVEUR ";
        echo "";
        echo -n "Quelle nom voulez-vous attribuer à votre serveur ? : ";
        read nomsrv
        echo "Création de l'image en cours, veuillez patienter ....";
        echo "";
        mkdir /xen/domU-Win32/$nomsrv
        qemu-img create /xen/domU-Win32/$nomsrv/$nomsrv.img $tailledisk1
        while [ ! -f "/xen/ISO/$iso" ] ; do
                clear
                echo "3 - CHOIX DE L'IMAGE ISO";
                echo "";
                ls -l /xen/ISO
                echo "";
                echo -n "Quelle ISO voulez-vous utiliser ? : ";
                read iso
        done
        clear
        echo "4 - CHOIX MEMOIRE SERVEUR (Mo)";
        echo "";
        echo "Exemple pour 1Go : 1024";
        echo "";
        echo -n "Combien de mémoire voulez-vous attribuer à votre serveur ? : ";
        read mem
        while [ $proc -gt 4 ] || [ $proc -lt 1 ] ; do
                clear
                echo "5 - CHOIX PROCESSEUR SERVEUR (4 Maximum)";
                echo "";
                echo -n "Combien de processeurs voulez-vous attribuer à votre serveur ? : ";
                read proc
        done
        ;;
        2) clear
        echo "1.1 - CHOIX DE LA TAILLE DES DISQUES (Go)";
        echo "";
        echo "Exemple pour 20Go : 20G";
        echo "";
        echo -n "Quelle taille voulez-vous pour le 1er disque ? : ";
        read tailledisk1
        echo "";
        echo -n "Quelle taille voulez-vous pour le 2eme disque ? : ";
        read tailledisk2
        clear
        echo "2 - CHOIX DU NOM DU SERVEUR ";
        echo "";
        echo -n "Quelle nom voulez-vous attribuer à votre serveur ? : ";
        read nomsrv
        echo "Création des images en cours, veuillez patienter ....";
        echo "";
        mkdir /xen/domU-Win32/$nomsrv
        qemu-img create /xen/domU-Win32/$nomsrv/$nomsrv.img $tailledisk1
        qemu-img create /xen/domU-Win32/$nomsrv/"$nomsrv"-disk2.img $tailledisk2
        while [ ! -f "/xen/ISO/$iso" ] ; do
                clear
                echo "3 - CHOIX DE L'IMAGE ISO";
                echo "";
                ls -l /xen/ISO
                echo "";
                echo -n "Quelle ISO voulez-vous utiliser ? : ";
                read iso
        done
        clear
        echo "4 - CHOIX MEMOIRE SERVEUR (Mo)";
        echo "";
        echo "Exemple pour 1Go : 1024";
        echo "";
        echo -n "Combien de mémoire voulez-vous attribuer à votre serveur ? : ";
        read mem
        while [ $proc -gt 4 ] || [ $proc -lt 1 ] ; do
                clear
                echo "5 - CHOIX PROCESSEUR SERVEUR (4 Maximum)";
                echo "";
                echo -n "Combien de processeurs voulez-vous attribuer à votre serveur ? : ";
                read proc
        done
        ;;
esac
clear
echo "6 - CHOIX DU MOT DE PASSE VNC";
echo "";
echo "Pour vous connecter à votre domU en VNC,";
echo "Connectez votre client VNC sur l'adresse : 94.23.11.20:<port>";
echo "Les numéros de port VNC sont incrémentés avec les domU.";
echo "Donc pour le premier domU, le numéro de port est le 0, pour le second domU, le 1 ect...";
echo "Pour voir la liste des domU, utilisez la commande xm list.";
echo "";
echo -n "Quel mot de passe souhaitez vous pour le server VNC de votre domU ? : ";
read vncmdp
clear
echo "7 - RECAPITULATIF DU FICHIER XEN $nomsrv";
echo "";
echo " Nombre de disque :       $nombredisk";
echo " Taille des disques :     $tailledisk1 $tailledisk2";
echo " Nom du serveur : $nomsrv";
echo " Image ISO utilisée :     $iso";
echo " Memoire serveur :        $mem";
echo " Processeur serveur :     $proc";
echo " Mot de passe VNC :       $vncmdp";
echo "";
echo "import os, re" >> /etc/xen/domU-Win32/$nomsrv
echo "arch = os.uname()[4]" >> /etc/xen/domU-Win32/$nomsrv
echo "arch_libdir = 'lib'" >> /etc/xen/domU-Win32/$nomsrv
echo "kernel = \"/usr/lib/xen/boot/hvmloader\"" >> /etc/xen/domU-Win32/$nomsrv
echo "builder='hvm'" >> /etc/xen/domU-Win32/$nomsrv
echo "memory = $mem" >> /etc/xen/domU-Win32/$nomsrv
echo "name = \"$nomsrv\"">> /etc/xen/domU-Win32/$nomsrv
echo "vcpus=$proc" >> /etc/xen/domU-Win32/$nomsrv
echo "cpus = \"0-3\"" >> /etc/xen/domU-Win32/$nomsrv
echo "vif = [ 'type=ioemu, bridge=xenbr0' ]" >> /etc/xen/domU-Win32/$nomsrv
if [ $nombredisk -eq 1 ] ; then
        echo "disk = [ 'file:/xen/domU-Win32/$nomsrv/$nomsrv.img,hda,w', 'file:/xen/ISO/$iso,hdc:cdrom,r' ]" >> /etc/xen/domU-Win32/$nomsrv
elif [ $nombredisk -eq 2 ] ; then
        echo "disk = [ 'file:/xen/domU-Win32/$nomsrv/$nomsrv.img,hda,w', 'file:/xen/domU-Win32/$nomsrv/"$nomsrv"-disk2.img,hdb,w', 'file:/xen/ISO/$iso,hdc:cdrom,r' ]" >> /etc/xen/domU-Win32/$nomsrv
fi
echo "device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'" >> /etc/xen/domU-Win32/$nomsrv
echo "boot=\"dc\"" >> /etc/xen/domU-Win32/$nomsrv
echo "vnc=1" >> /etc/xen/domU-Win32/$nomsrv
echo "vncconsole=1" >> /etc/xen/domU-Win32/$nomsrv
echo "vncunused=1" >> /etc/xen/domU-Win32/$nomsrv
echo "vncpasswd='$vncmdp'" >> /etc/xen/domU-Win32/$nomsrv
echo "nographic=0" >> /etc/xen/domU-Win32/$nomsrv
echo "stdvga=1" >> /etc/xen/domU-Win32/$nomsrv
echo "serial='pty'" >> /etc/xen/domU-Win32/$nomsrv
echo "usb=1" >> /etc/xen/domU-Win32/$nomsrv
echo "usbdevice='mouse'" >> /etc/xen/domU-Win32/$nomsrv
echo "keymap='fr'" >> /etc/xen/domU-Win32/$nomsrv
echo "guest_os_type='windows'" >> /etc/xen/domU-Win32/$nomsrv
echo "Fichier $nomsrv créé et configuré avec succès";
echo "";
echo -n "Souhaitez-vous démarrer votre serveur virtuel ? (O/N):  ";
read demarrage
if [ "$demarrage" = "O" ] || [ "$demarrage" = "o" ]; then
        xm create /etc/xen/domU-Win32/$nomsrv
else
        echo "";
        echo "Configuration terminée";
        echo "Pour lancer votre domU, utilisez la commande : xm create /etc/xen/domU-Win32/$nomsrv";
        echo "";
fi
J'aimerais améliorer mes cases, mes boucles et mes contrôles d'erreur et surtout l'écriture du fichier de conf du domU. Comme je ne sais pas traiter les fichiers avec une commande genre sed ou ed, j'ai carrément récupéré les variables de la configuration et j'écris complètement le fichier avec des echo ; ce qui est stupide à mon avis puisque j'imagine qu'il y a une possibilité de trouver une variable précise dans un fichier et de lui donner la valeur récupérée par le script via la commande "read".

Pour les contrôles d'erreur, je parle des valeurs entrées par l'utilisateur mais aussi des vérifications, comme par exemple l'existence des répertoire de destination ect.

Si vous pouviez me donner des pistes pour améliorer tout ça, ça serait cool.

Merci pour votre aide

A+