Vous avez reçu un message "Your GitLab account has been locked ..." ? Pas d'inquiétude : lisez cet article https://docs.gricad-pages.univ-grenoble-alpes.fr/help/unlock/

test_restore_from_metadata.sh 4.38 KB
Newer Older
Jonathan Schaeffer's avatar
Jonathan Schaeffer committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Ce script doit tester les archives stockées sur le serveur iRODS du CCIN2P3
# Prérequis :
# 1. Accès au serveur irods
# 2. Accès à l'archive SUMMER (TODO: automontage bynet ?)
# 3. exécutable msi disponible

# Déroulement du test
# - soit on donne une clé en paramètre du script (Ex. FR_FILF_2015)
# - soit une clé est générée aléatoirement à partir des métadonnées publiées par le webservice station
# - on teste si on a de la donnée locale pour cette clé
#   si on n'en a pas, ça veut dire que l'archive a été détruite ou déplacée ... bref, aucun moyen de faire les tests suivants, on sort
# - on demande à irods des infos sur la donnée correspondant à la clé (ils -L)
#   s'il n'y en a pas, c'est que les dumps n'ont pas été réalisés => ERROR
# - on récupère le dump distant et on en extrait un fichier au hasard
# - on compare les hash MD5 du fichier extrait et de la version actuelle
# - on compare les hash MD5 de la sortie des commandes msi sur les 2 fichiers.
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
workdir=/scratch/resif_datadump/test_restore
archivedir=/osug-dc/resif/validated_seismic_data

if [[ $# -eq 0 ]]; then
	# Pas de clé en paramètre, récupère un channel au hasard dans les métadonnées
	line=$(wget -q -O - "http://ws.resif.fr/fdsnws/station/1/query?level=channel&format=text" | shuf -n 1)
	echo $line
	[[ $line =~ ^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|([1-2][0-9][0-9][0-9]).*\|([1-2][0-9][0-9][0-9]).*$ ]]
	net=${BASH_REMATCH[1]}
	sta=${BASH_REMATCH[2]}
	start=${BASH_REMATCH[16]}
	end=${BASH_REMATCH[17]}
	echo "$start $end"
	if [[ $start -eq $end ]]; then 
		year=$start
	else
Jonathan Schaeffer's avatar
Jonathan Schaeffer committed
33
34
35
36
37
	    	if [[ "$end" = "2500" ]]; then
			# Les canaux permanents finissenten 2500, on ramène à l'année de 6 mois plus tôt (le dernier dump)
			end=$(date +%Y -d '6 months ago')
		fi
		year=$(( ( RANDOM % (( $end - $start )) ) + $start ))
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
	fi
	key="${year}_${net}_${sta}"
else
	key=$1
fi 
# On teste pour vérifier que cette donnée existe (c'est pas forcé)
dir_to_test=$(echo $key | tr '_' '/')
stat $archivedir/$dir_to_test
if [[ $? -ne 0 ]]; then
	printf "\033[1;33mWARNING\033[0m no data for this channel on archive\n"
	exit 0
fi
workdir=$workdir/$key
mkdir -p $workdir
cd $workdir

echo === Trying to retrieve $key ===
ils -L $key/latest.tar
if [[ $? -ne 0 ]]; then
	printf "\033[0;31mError\033[0m Remote file not found.\n"
	exit 1
else
	printf "\033[0;32mOK\033[0m\n"
fi

echo === Retrieving $key ===
iget $key/latest.tar
if [[ $? -ne 0 ]]; then
	printf "\033[0;31mError\033[0m iget command failed\n"
	exit 1
else
	printf "\033[0;32mOK\033[0m\n"
fi

echo === Listing archive content ===
tar tvf latest.tar

echo === Extracting one random file ===
target_line=$(tar tvf latest.tar | grep -e '[0-9]$' | shuf -n 1)
target_file=$(echo "$target_line"| awk '{print $NF}') 
echo $target_file
tar -xf latest.tar $target_file
target_file_date=$(date +%s -d $(stat $target_file --print %z | awk '{print $1}'))
fname=$(echo $target_file | awk -F'/' '{print $NF}')
echo $fname
regex="([A-Z0-9]+)\.([A-Z]+)\.[0-9]*\.([A-Z0-9]{3}\.D)\.([12][0-9]{3})\.[0-3][0-9]{2}"
archive_file=""
if [[ $fname =~ $regex ]]; then
	archive_file="$archivedir/${BASH_REMATCH[4]}/${BASH_REMATCH[1]}/${BASH_REMATCH[2]}/${BASH_REMATCH[3]}/$fname";
        if [[ ! -r $archive_file ]]; then
	       	printf "\033[1;33mWARNING\033[0m $archive_file not preset\n"
		exit 1
	fi
fi
echo $archive_file
archive_file_date=$(date +%s -d $(stat $archive_file --print %z | awk '{print $1}'))

if [ $archive_file_date -gt $target_file_date ]; then
	echo "File in archive is newer than remote file. Skipping md5 test"
else
	echo === Checking md5 ===
	dumped_md5=$(md5sum $target_file | awk '{print $1}')
	data_md5=$(md5sum $archive_file | awk '{print $1}')
	echo $dumped_md5 $target_file
	echo $data_md5 $archive_file
	if [[ $dumped_md5 == $data_md5 ]]; then
		printf "\033[0;32mOK\033[0m $target_file md5 sum is correct\n"
	else
		printf "\033[0;31mError\033[0m Files $target_file and $archive_file mismatch\n"
		exit 1
	fi
fi  

echo === Compare msi traces ===
dumped_msi=$(msi $target_file)
data_msi=$(msi $archive_file)

echo "Traces of remote file $target_file"
echo "$dumped_msi"
echo "Traces of local file $archive_file"
echo "$data_msi"

if [[ $(md5sum <<< $dumped_msi | awk '{print $1}') == $(md5sum <<< $data_msi | awk '{print $1}') ]]; then
	printf "\033[0;32mOK\033[0m Traces match\n"
else
	printf "\033[1;33mWARNING\033[0m Traces mismatch\n"
fi