From 4e7683aee22323f656d3fe586eb9547dc0a3c936 Mon Sep 17 00:00:00 2001 From: Yacine31 Date: Wed, 19 Nov 2025 15:55:11 +0100 Subject: [PATCH] =?UTF-8?q?mise=20=C3=A0=20jour=20v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Grosse mise à jour : - style moderne des tableaux et code - code structuré et factorisé - sql et sh affinés --- .env.local | 2 +- .gitignore | 7 +- README.md | 68 +++++--- asm/01_asm.sql | 6 +- asm/02_asm_alertlog_errors.sql | 2 +- asm/sql_header.txt | 1 - cmd/10_disk.pws | 11 -- html/00_html_header.html | 15 +- rapport_bdd.cmd | 32 ---- rapport_bdd.sh | 225 +++++++++++++++++++------- rapport_bdd_csv.sh | 59 ------- sh/09_os_info.sh | 150 ++++++++--------- sh/09_os_info.sh_modified | 73 --------- sh/10_oracle_installation.sh | 59 ++++--- sh/20_dbvisit_infos.sh | 37 +++-- sh/30_crs.sh | 23 ++- sh/local/check_expdp_log.sh | 56 ++++--- sh/utils.sh | 44 +++++ sql/01_system_info.sql | 2 +- sql/11_get_db_size.sql | 2 +- sql/12a_instance_status.sql | 2 +- sql/12c_db_version.sql | 2 +- sql/13_database_parameters.sql | 2 +- sql/14_nls_database_parameters.sql | 3 +- sql/15_check_supplemntal_logging.sql | 2 +- sql/16_dba_registry.sql | 2 +- sql/17_resource_limits.sql | 2 +- sql/18_memory_configuration.sql | 2 +- sql/19a_memory_resize_operations.sql | 2 +- sql/19b_memory_target_advice.sql | 2 +- sql/20a_tbs_details.sql | 2 +- sql/20b_datafile.sql.old | 49 ------ sql/20c_datafile.sql | 2 +- sql/20d_tempfile.sql | 2 +- sql/20e_undo.sql | 2 +- sql/21c_block_corruption.sql | 2 +- sql/22a_online_log.sql | 2 +- sql/22b_online_log.sql | 2 +- sql/23a_archive_log_per_day.sql | 2 +- sql/23b_archive_log_per_day.sql | 2 +- sql/24a_fra_usage.sql | 2 +- sql/24b_fra_usage.sql | 2 +- sql/25_last_alertlog_errors.sql | 2 +- sql/26_rman_configuration.sql | 2 +- sql/27_last_rman_backup.sql | 2 +- sql/28_sysaux_occupants.sql | 2 +- sql/30a_users.sql | 2 +- sql/30b_users.sql | 2 +- sql/30c_schema_size.sql | 2 +- sql/31a_who_is_connected.sql | 2 +- sql/31b_who_is_connected.sql | 2 +- sql/31c_who_is_connected.sql | 2 +- sql/32_invalid_objects.sql | 2 +- sql/33_get_users_objects.sql | 2 +- sql/34_disable_auto_tasks.sql | 2 +- sql/35a_get_cursor_usage.sql | 2 +- sql/35b_cursors_count.sql | 2 +- sql/36_check_failed_cheduler_jobs.sql | 2 +- sql/37_table_statistics_summary.sql | 2 +- sql/38_dictionary_stats.sql | 2 +- sql/39_feature_usage_statistics.sql | 2 +- sql/40_dba_jobs.sql | 14 +- sql/41_sql_stat.sql | 23 +++ sql/cdb/01_show_pdbs.sql | 2 +- summary.sh | 119 +++++++------- summary/01_sql_header.txt | 1 - 66 files changed, 586 insertions(+), 577 deletions(-) delete mode 100644 asm/sql_header.txt delete mode 100644 cmd/10_disk.pws delete mode 100644 rapport_bdd.cmd delete mode 100644 rapport_bdd_csv.sh delete mode 100644 sh/09_os_info.sh_modified create mode 100644 sh/utils.sh delete mode 100644 sql/20b_datafile.sql.old create mode 100644 sql/41_sql_stat.sql delete mode 100644 summary/01_sql_header.txt diff --git a/.env.local b/.env.local index 561a0e3..f3c413c 100644 --- a/.env.local +++ b/.env.local @@ -1 +1 @@ -export EXPDP_DIR="/u04/expdp" \ No newline at end of file +export EXPDP_DIR="/u04/expdp" diff --git a/.gitignore b/.gitignore index 62da81e..fad6481 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ # fichier avec les variables d'environnement -.env \ No newline at end of file +.env +AGENTS.md +chat_gemin_db_report.md +DOCUMENTATION.md +GEMINI.md +LEGENDE_COMMANDES.md \ No newline at end of file diff --git a/README.md b/README.md index e384c80..85a7266 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,62 @@ -Ensemble de scripts qui génèrent des rapports html avec quelques infos du serveur, les bases de données en cours d'exécution, les fichiers, les logs et les sauvegardes +# DB Report + +Génère des rapports HTML détaillés sur la configuration d'un serveur et de ses bases de données Oracle. + +## Fonctionnalités + +- Génération d'un rapport de configuration pour le serveur hôte. +- Collecte automatique des bases de données Oracle en cours d'exécution. +- Génération d'un rapport HTML structuré et détaillé pour chaque base de données. +- Support pour les instances ASM et les PDBs (Pluggable Databases). +- Scripts modulaires pour une personnalisation facile. + +## Prérequis + +- Système Linux/Unix avec Bash. +- Oracle Database installé et configuré (avec `sqlplus` et `oraenv`). +- Permissions pour exécuter des requêtes SQL en tant que `sysdba`. + +## Installation -## Sous Linux ```bash git clone https://github.com/Yacine31/db_report cd db_report -# Copier le fichier .env.local dans .env -cp .env.lcal .env -# Executer le script +# Copier le fichier d'exemple de configuration (optionnel) +cp .env.local .env +# Éditer .env si nécessaire (e.g., pour personnaliser OUTPUT_DIR) +``` + +## Utilisation + +```bash +# Exécuter le script principal bash rapport_bdd.sh ``` -Le résultat est dans le sous répertoire ``` output/YYYYMMDD ``` +## Sortie +Le script génère deux types de rapports dans le répertoire `output/YYYYMMDD/`: +1. **Rapport Serveur** : Un rapport unique contenant les informations de configuration du système d'exploitation. + - Nom du fichier : `Rapport_{hostname}_{timestamp}.html` -## Sous Windows -Télécharger le zip ici : [https://github.com/Yacine31/db_report/archive/refs/heads/main.zip](https://github.com/Yacine31/db_report/archive/refs/heads/main.zip) +2. **Rapports Base de Données** : Un rapport détaillé pour chaque instance de base de données Oracle détectée. + - Nom du fichier : `Rapport_{hostname}_{SID}_{timestamp}.html` -- Décompresser dans c:\db_report -- Exécuter le script rapport_bdd.cmd +Un script de synthèse (`summary.sh`) est également exécuté pour agréger certaines données des différentes bases. + +## Structure du projet + +- `rapport_bdd.sh` : Script principal qui orchestre la génération du rapport serveur et des rapports de base de données. +- `sh/` : Scripts Bash pour la collecte des informations système (utilisés pour le rapport serveur). +- `sql/` : Requêtes SQL pour les données de base de données. +- `html/` : Templates HTML pour l'en-tête et le pied de page des rapports. +- `asm/` : Scripts SQL spécifiques aux instances ASM. +- `summary/` : Scripts SQL utilisés par le script de synthèse. +- `summary.sh` : Script d'agrégation des rapports. + +## Personnalisation + +- Modifiez `.env` pour changer le répertoire de sortie. +- Ajoutez des scripts dans `sh/` ou `sql/` pour étendre les rapports. -Ou avec GIT : -Installer git [https://git-scm.com/download/win](https://git-scm.com/download/win) -```cmd -cd /d c:\ -git clone https://github.com/Yacine31/db_report -cd db_report -rapport_bdd.cmd -``` diff --git a/asm/01_asm.sql b/asm/01_asm.sql index a02544d..dcfc67e 100644 --- a/asm/01_asm.sql +++ b/asm/01_asm.sql @@ -1,6 +1,6 @@ PRO

Configuratiom ASM

-SELECT +SELECT /* db-html-report */ DG.NAME, DG.STATE, DG.TYPE, @@ -13,7 +13,7 @@ FROM V$ASM_DISKGROUP DG; -- Viewing disks in disk groups with V$ASM_DISK -SELECT +SELECT /* db-html-report */ DG.NAME "Disk Grp Name", A.NAME "Name", A.FAILGROUP, @@ -37,7 +37,7 @@ ORDER BY A.NAME; -- Viewing disk group clients with V$ASM_CLIENT -SELECT +SELECT /* db-html-report */ DG.NAME AS DISKGROUP, C.INSTANCE_NAME AS INSTANCE, DB_NAME AS DBNAME, diff --git a/asm/02_asm_alertlog_errors.sql b/asm/02_asm_alertlog_errors.sql index 8ffb5cf..0ce69c7 100644 --- a/asm/02_asm_alertlog_errors.sql +++ b/asm/02_asm_alertlog_errors.sql @@ -1,6 +1,6 @@ prompt

Les dernières erreurs ASM (Les 30 derniers jours et les 50 dernières lignes)

-SELECT +SELECT /* db-html-report */ TO_CHAR(ORIGINATING_TIMESTAMP, 'DD-MM-YYYY HH-MM-SS') "Date", MESSAGE_TEXT "Message" FROM diff --git a/asm/sql_header.txt b/asm/sql_header.txt deleted file mode 100644 index ddae063..0000000 --- a/asm/sql_header.txt +++ /dev/null @@ -1 +0,0 @@ -SET PAGES 999 FEEDBACK OFF MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP OFF diff --git a/cmd/10_disk.pws b/cmd/10_disk.pws deleted file mode 100644 index b3caa3f..0000000 --- a/cmd/10_disk.pws +++ /dev/null @@ -1,11 +0,0 @@ -# Info systeme -Get-WmiObject Win32_ComputerSystem | Select-Object Manufacturer, Model, TotalPhysicalMemory - -# Lister les espaces disques -Get-Volume | Format-Table -AutoSize - -# lister les bases en cours d'exécution -net start | find /i "OracleService" - -# lister les listener en cours d'exécution -net start | find /i "TNSListener" \ No newline at end of file diff --git a/html/00_html_header.html b/html/00_html_header.html index 5397ddb..0601db6 100644 --- a/html/00_html_header.html +++ b/html/00_html_header.html @@ -10,12 +10,12 @@ \ No newline at end of file diff --git a/rapport_bdd.cmd b/rapport_bdd.cmd deleted file mode 100644 index 1750f3e..0000000 --- a/rapport_bdd.cmd +++ /dev/null @@ -1,32 +0,0 @@ -@echo off - -setlocal enabledelayedexpansion - -for /f "tokens=*" %%r in ('net start ^| find /i "OracleService"') do ( - set "ORACLE_SID=%%r" - set "ORACLE_SID=!ORACLE_SID:~13!" - set HTML_FILE=Rapport_%COMPUTERNAME%_!ORACLE_SID!_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.html - set TMP_SQLFILE="tmp_sqlfile.sql" - set DATE_JOUR=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2% - - type sql\00_html_header.html > !HTML_FILE! - echo ^Rapport de base de donnees^ >> !HTML_FILE! - echo ^Date : !DATE_JOUR!^ >> !HTML_FILE! - echo ^Hostname : %COMPUTERNAME%^ >> !HTML_FILE! - echo ^Base de donnees : !ORACLE_SID!^ >> !HTML_FILE! - echo ^ >> !HTML_FILE! - - echo ^Configuration de la base de donnees !ORACLE_SID! ^ >> !HTML_FILE! - for %%f in (sql\*.sql) do ( - echo SET PAGES 999 FEEDBACK OFF MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP OFF > !TMP_SQLFILE! - echo WHENEVER SQLERROR CONTINUE >> !TMP_SQLFILE! - type %%f >> !TMP_SQLFILE! - echo. >> !TMP_SQLFILE! - echo EXIT >> !TMP_SQLFILE! - echo Execution du script %%f - call sqlplus -S / as sysdba @!TMP_SQLFILE! >> !HTML_FILE! - ) - - type sql\99_html_footer.html >> !HTML_FILE! - echo Rapport de la base !ORACLE_SID! dans le fichier html : !HTML_FILE! -) \ No newline at end of file diff --git a/rapport_bdd.sh b/rapport_bdd.sh index 7b29f1d..e75f6d9 100644 --- a/rapport_bdd.sh +++ b/rapport_bdd.sh @@ -1,67 +1,180 @@ #!/bin/bash +# Script de génération de rapports HTML pour les bases de données Oracle. +# Collecte des informations système, ASM, PDBs et configurations via scripts Bash/SQL. + +# Stoppe le script en cas d'erreur (erreurs, variables non définies, pipes échoués) +set -euo pipefail + +source sh/utils.sh + +# --- Configuration initiale --- +# Définit les variables globales et charge la configuration utilisateur. +# Définit la langue pour les commandes (évite les problèmes de locale) export LANG=en_US -DATETIME=`date +%Y%m%d%H%M` -HNAME=$(hostname) -OUTPUT_DIR=output/$(date +%Y%m%d) -mkdir -p ${OUTPUT_DIR} +# Génère un timestamp pour nommer les fichiers +timestamp="$(date +%Y%m%d%H%M)" +# Récupère le nom d'hôte du serveur +hostname="$(hostname)" -for r in $(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3) -do - export ORAENV_ASK=NO - export ORACLE_SID=$r - export HTML_FILE=${OUTPUT_DIR}/Rapport_${HNAME}_${ORACLE_SID}_${DATETIME}.html - . oraenv -s > /dev/null +# Charge la configuration depuis .env si le fichier existe +if [ -f .env ]; then + # shellcheck source=.env + source .env +fi - cat html/00_html_header.html >> ${HTML_FILE} - DATE_JOUR=$(date +"%d/%m/%Y %Hh%M") - echo "

Rapport de base de données ${ORACLE_SID} sur le serveur $HNAME

-

Date : ${DATE_JOUR}

-

Hostname : $HNAME

-

Base de données : ${ORACLE_SID}

" >> ${HTML_FILE} - echo "

" >> ${HTML_FILE} - - # execution des scripts shell - echo "

Configuration système

" >> ${HTML_FILE} - for f in sh/*.sh - do - echo "[INFO] Serveur $HNAME - Exécution du script : $f" - bash $f >> ${HTML_FILE} - done +# Définit le répertoire de sortie (peut être surchargé par la variable OUTPUT_DIR dans .env) +output_dir_base="${OUTPUT_DIR:-"output"}" +output_dir="${output_dir_base}/$(date +%Y%m%d)" - echo "

" >> ${HTML_FILE} +# --- Définitions des fonctions --- +# Contient les fonctions utilitaires pour logging et exécution de scripts. - # Si ASM, on exécute les scripts ASM - if [ $(ps -ef | grep pmon | grep ASM | wc -l) -gt 0 ]; then - echo "

Configuration de l'instance ASM

" >> ${HTML_FILE} - for f in asm/*.sql - do - echo "[INFO] Base ${ORACLE_SID} - Exécution du script : $f" - cat asm/sql_header.txt $f | sqlplus -s / as sysdba >> ${HTML_FILE} - done - fi +# Fonction: execute_scripts +# Description: Exécute une série de scripts (Bash ou SQL) et ajoute leur sortie au rapport HTML. +# Vérifie d'abord si des scripts correspondent au pattern. +# Paramètres: +# $1 (section_title) - Titre de la section dans le rapport HTML. +# $2 (script_pattern) - Chemin vers les scripts (e.g., "sh/*.sh"). +# $3 (script_type) - Type de script : "sh" pour Bash, "sql" pour SQL. +# $4 (sql_header_file) - Fichier d'en-tête SQL (optionnel, utilisé seulement pour "sql"). +# Exemple : execute_scripts "Configuration système" "sh/*.sh" "sh" +execute_scripts() { + local section_title="$1" + local script_pattern="$2" + local script_type="$3" + local sql_header_file="${4:-}" - # vérifier si la base est une CDB - if [ "$(/bin/sh sql/cdb/is_CDB.sh | tail -1)" == "YES" ]; then - # Executer les scripts sql pour les PDB - for f in sql/cdb/*.sql; do - # Exécuter les scripts SQL pour les PDB - echo "[INFO] Base ${ORACLE_SID} - Exécution du script : $f" - cat sql/sql_header.txt $f | sqlplus -s / as sysdba >> ${HTML_FILE} - done - fi + # Vérifie s'il y a des fichiers correspondants au pattern pour éviter les erreurs + # Utilise ls au lieu de find pour compatibilité, avec shellcheck désactivé pour SC2012 + # shellcheck disable=SC2012 + # if [ -z "$(ls -1 "${script_pattern}" 2>/dev/null)" ]; then + # log_info "Aucun script trouvé pour le pattern '${script_pattern}', section ignorée." + # return + # fi - # execution des scripts sql - echo "

Configuration de la base de données ${ORACLE_SID}

" >> ${HTML_FILE} - for f in sql/*.sql - do - echo "[INFO] Base ${ORACLE_SID} - Exécution du script : $f" - cat sql/sql_header.txt $f | sqlplus -s / as sysdba >> ${HTML_FILE} - done + echo "

"${section_title}"

" >> "${html_report_file}" + # Boucle sur chaque script correspondant au pattern + for script_file in ${script_pattern}; do + log_info "Exécution du script : ${script_file}" + case "${script_type}" in + sh) + # Exécute le script Bash et ajoute sa sortie au rapport + bash "${script_file}" >> "${html_report_file}" + ;; + sql) + # Concatène l'en-tête SQL avec le script et l'exécute via sqlplus + cat "${sql_header_file}" "${script_file}" | sqlplus -s / as sysdba >> "${html_report_file}" + ;; + esac + done + echo "

" >> "${html_report_file}" + echo "

Retour en haut de page

" >> "${html_report_file}" +} # execute_scripts - cat html/99_html_footer.html >> ${HTML_FILE} - echo Rapport dans le fichier html : ${HTML_FILE} -done +# --- Script principal --- +# Orchestre la génération des rapports pour chaque base de données détectée. -# execution des scripts de synthèse : -bash summary.sh \ No newline at end of file +# Crée le répertoire de sortie si nécessaire +mkdir -p "${output_dir}" + +#--------------- LES SERVEURS +log_info "Début de la génération des rapports pour le serveur : "${hostname}"" + +# Définit le nom du fichier HTML du rapport +html_report_file="${output_dir}/Rapport_"${hostname}"_"${timestamp}".html" + +# Copie l'en-tête HTML et ajoute l'ancre pour le lien "retour en haut" +cat html/00_html_header.html > "${html_report_file}" +echo '
' >> "${html_report_file}" + +# Génère la date formatée pour l'affichage dans le rapport +current_date="$(date +"%d/%m/%Y %Hh%M")" +{ + echo "

Rapport de configuration du serveur "${hostname}"

" + echo "

Date : "${current_date}"

" + echo "

Hostname : "${hostname}"

" + echo "

" + } >> "${html_report_file}" + +# Exécute les scripts de collecte d'informations via la fonction execute_scripts +execute_scripts "Configuration système" "sh/*.sh" "sh" + +# Ajoute le pied de page HTML au rapport +cat html/99_html_footer.html >> "${html_report_file}" +log_info "Rapport généré : "${html_report_file}"" +#--------------- + +#--------------- LES BASES +# Détecte les bases de données Oracle en cours d'exécution +# Exclut les instances ASM et APX pour se concentrer sur les bases utilisateur +database_sids="$(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3 || true)" + +if [ -z "${database_sids}" ]; then + echo "[WARN] Aucune base de données Oracle détectée. Fin du script." + exit 0 +fi + + +log_info "Début de la génération des rapports pour les bases : "${database_sids}"" + +for database_sid in ${database_sids}; do + # Désactive les prompts d'oraenv et définit la base courante + export ORAENV_ASK=NO + export ORACLE_SID="${database_sid}" + + log_info "Traitement de la base de données : "${ORACLE_SID}"" + # Configure l'environnement Oracle pour la base actuelle + # shellcheck source=/dev/null + . oraenv -s > /dev/null + + # Définit le nom du fichier HTML du rapport + html_report_file="${output_dir}/Rapport_"${hostname}"_"${ORACLE_SID}"_"${timestamp}".html" + + # --- Génération du rapport HTML pour cette base --- + # Initialise le fichier HTML avec l'en-tête et les infos générales. + + # Copie l'en-tête HTML et ajoute l'ancre pour le lien "retour en haut" + cat html/00_html_header.html > "${html_report_file}" + echo '
' >> "${html_report_file}" + + # Génère la date formatée pour l'affichage dans le rapport + current_date="$(date +"%d/%m/%Y %Hh%M")" + { + echo "

Rapport de base de données "${ORACLE_SID}" sur le serveur "${hostname}"

" + echo "

Date : "${current_date}"

" + echo "

Hostname : "${hostname}"

" + echo "

Base de données : "${ORACLE_SID}"

" + echo "

" + } >> "${html_report_file}" + + # # Exécute les scripts de collecte d'informations via la fonction execute_scripts + # execute_scripts "Configuration système" "sh/*.sh" "sh" + + # Si une instance ASM est détectée, exécute les scripts ASM + if [ "$(ps -ef | grep pmon | grep ASM | wc -l)" -gt 0 ]; then + execute_scripts "Configuration de l'instance ASM" "asm/*.sql" "sql" "sql/sql_header.txt" + fi + + # Si la base est un CDB (Container Database), exécute les scripts pour les PDBs + if [ "$(/bin/sh sql/cdb/is_CDB.sh | tail -1)" = "YES" ]; then + execute_scripts "Informations sur les PDBs" "sql/cdb/*.sql" "sql" "sql/sql_header.txt" + fi + + execute_scripts "Configuration de la base de données "${ORACLE_SID}"" "sql/*.sql" "sql" "sql/sql_header.txt" + + # Ajoute le pied de page HTML au rapport + cat html/99_html_footer.html >> "${html_report_file}" + + log_info "Rapport généré : "${html_report_file}"" + done +#--------------- + +# Une fois tous les rapports générés, exécute le script de synthèse pour agréger les données +log_info "Exécution du script de synthèse." +export OUTPUT_DIR="${output_dir}" +export DATETIME="${timestamp}" +export HNAME="${hostname}" +bash summary.sh + +log_info "Fin du script." \ No newline at end of file diff --git a/rapport_bdd_csv.sh b/rapport_bdd_csv.sh deleted file mode 100644 index cae521f..0000000 --- a/rapport_bdd_csv.sh +++ /dev/null @@ -1,59 +0,0 @@ -DATETIME=$(date +%Y%m%d_%H%M) -HNAME=$(hostname) -DATE_REP=$(date +%Y_%m_%d) - -ID_CLIENT=$1 - -if [ "x${ID_CLIENT}" == "x" ] -then - echo "$0 ID_CLIENT" - exit 1 -fi - -for r in $(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3) -do - export ORAENV_ASK=NO - export ORACLE_SID=$r - - # OUTPUT_DIR=output/${HNAME}/${ORACLE_SID}/${DATE_REP} - OUTPUT_DIR=${ID_CLIENT}/${HNAME}/${ORACLE_SID}/${DATE_REP} - mkdir -p ${OUTPUT_DIR} - - # export CSV_FILE=${OUTPUT_DIR}/Rapport_${HNAME}_${ORACLE_SID}_${DATETIME}.csv - . oraenv -s > /dev/null - - DATE_JOUR=$(date +"%d/%m/%Y %Hh%M") - - # execution des scripts shell - for f in sh/*.sh - do - CSV_FILE=${OUTPUT_DIR}/$(basename $f | sed 's/.sh$/.csv/g') - /bin/sh $f > ${CSV_FILE} - done - - # Si ASM, on exécute les scripts ASM - if [ $(ps -ef | grep pmon | grep ASM | wc -l) -gt 0 ]; then - for f in asm/*.sql - do - CSV_FILE=${OUTPUT_DIR}/$(basename $f | sed 's/.sql$/.csv/g') - sed '1 s/^/SET PAGES 999 FEEDBACK OFF MARKUP CSV ON SPOOL ON PREFORMAT OFF ENTMAP OFF\n/' $f | grep -v "^prompt" | sqlplus -s / as sysdba > ${CSV_FILE} - done - fi - - # execution des scripts sql - echo "

Configuration de la base de données ${ORACLE_SID}

" >> ${CSV_FILE} - for f in sql/*.sql - do - CSV_FILE=${OUTPUT_DIR}/$(basename $f | sed 's/.sql$/.csv/g') - sed '1 s/^/SET PAGES 999 FEEDBACK OFF MARKUP CSV ON SPOOL ON PREFORMAT OFF ENTMAP OFF\n/' $f | grep -v "^prompt" | sqlplus -s / as sysdba > ${CSV_FILE} - done - - # suppression du zip s'il existe déjà - rm -f ${ID_CLIENT}_${HNAME}_${ORACLE_SID}_${DATE_REP}.zip 2>/dev/null - # compression pour récupérer la totalité en zip - zip -r ${ID_CLIENT}_${HNAME}_${ORACLE_SID}_${DATE_REP}.zip ${OUTPUT_DIR} 1>/dev/null - - echo Les fichiers CSV sont dans le répertoire : ${OUTPUT_DIR} - echo Pour récupérer les fichiers dans un seul zip : ${ID_CLIENT}_${HNAME}_${ORACLE_SID}_${DATE_REP}.zip -done - diff --git a/sh/09_os_info.sh b/sh/09_os_info.sh index 3576152..9774550 100644 --- a/sh/09_os_info.sh +++ b/sh/09_os_info.sh @@ -1,122 +1,100 @@ -# faire des commandes pour AIX et pour Linux +#!/bin/bash + +# Importe les fonctions utilitaires +source "$(dirname "$0")/utils.sh" + +# --- Script principal --- + os_type=$(uname -s) -echo "

Bases de données en cours d'exécution :

" -echo "
"
-ps -ef | grep pmon | grep -v grep 
-echo "
" +print_h2 "Bases de données en cours d'exécution" +run_and_print "ps -ef | grep pmon | grep -v grep" -echo "

Listeners en cours d'exécution :

" -echo "
"
-ps -ef | grep tnslsnr | grep -v grep 
-echo "
" +print_h2 "Listeners en cours d'exécution" +run_and_print "ps -ef | grep tnslsnr | grep -v grep" -echo "

Statut du listener :

" -# ps -ef | grep tnslsnr | egrep -i "LISTENER_${ORACLE_SID}" | grep -v grep | while read l -ps -ef | grep tnslsnr | egrep -i " LISTENER |${ORACLE_SID}" | grep -v grep | while read l -do - # Récupérer le chemin ORACLE_HOME à partir de la sortie de ps -ef - # ---- La commande grep -o ne fonctionne pas sur AIX, on la remplace par perl -lne - # binary_path=$(echo $l | grep -o '/[^ ]*' | sed 's#/bin/tnslsnr##') - binary_path=$(echo $l | perl -lne 'print $1 if /(\S*tnslsnr\S*)/' | sed 's#/bin/tnslsnr##') - # Extraire le nom du listener - # listener_name=$(echo $l | grep -o 'tnslsnr [^ ]*' | sed 's/tnslsnr //') - listener_name=$(echo $l | perl -lne 'print $1 if /\btnslsnr\s+(\S+)/' | sed 's/tnslsnr //') - # Construire la commande lsnrctl status - lsnrctl_command="$binary_path/bin/lsnrctl status $listener_name" - # exécuter la commande - echo "
"
-	echo $lsnrctl_command
-	echo export TNS_ADMIN=$binary_path/network/admin
-	export TNS_ADMIN=$binary_path/network/admin
-	eval "$lsnrctl_command"
-	echo "

" +print_h2 "Statut du listener : ${listener_name}" +# Boucle pour le statut du listener, car elle est plus complexe +ps -ef | grep tnslsnr | egrep -i " LISTENER |${ORACLE_SID}" | grep -v grep | while read -r l; do + binary_path=$(echo "$l" | perl -lne 'print $1 if /(\S*tnslsnr\S*)/' | sed 's#/bin/tnslsnr##') + listener_name=$(echo "$l" | perl -lne 'print $1 if /\btnslsnr\s+(\S+)/' | sed 's/tnslsnr //') + + if [ -n "$binary_path" ] && [ -n "$listener_name" ]; then + export TNS_ADMIN="$binary_path/network/admin" + lsnrctl_command="$binary_path/bin/lsnrctl status $listener_name" + # echo "Listener: ${listener_name}" + run_and_print "$lsnrctl_command" + fi done -echo "

Uptime :

" -echo "
"
-uptime
-echo "
" +print_h2 "Uptime" +run_and_print "uptime" case "$os_type" in AIX) - echo "

Espace disque (lsfs) :

" - echo "
"
-        lsfs
-		echo "
" + print_h2 "Espace disque (lsfs)" + run_and_print "lsfs" ;; Linux) - echo "

Contenu du fichier /etc/fstab :

" - echo "
"
-		cat /etc/fstab | egrep -v '^#|^$'
-		echo "
" + print_h2 "Contenu du fichier /etc/fstab" + run_and_print "cat /etc/fstab | egrep -v '^#|^$'" ;; esac -echo "

Contenu du contab du compte oracle :

" -echo "
"
-crontab -l
-echo "
" +print_h2 "Contenu du contab du compte oracle" +run_and_print "crontab -l" -echo "

Limites de l'utilisateur "oracle" (ulimit -a) :

" -echo "
"
-ulimit -a | sort
-echo "
" +print_h2 "Limites de l'utilisateur (ulimit -a)" +run_and_print "ulimit -a | sort" -# espace disque en fonction de l'OS case "$os_type" in AIX) - echo "

Espace disque (df -g) :

" - echo "
"
-        df -g
-		echo "
" + print_h2 "Espace disque (df -g)" + run_and_print "df -g" ;; Linux) - echo "

Espace disque (df -h) :

" - echo "
"
-        df -h
-		echo "
" + print_h2 "Espace disque (df -h)" + run_and_print "df -h" ;; esac - case "$os_type" in Linux) - echo "

Liste des disques disponibles (lsblk) :

" - echo "
"
-		lsblk
-		echo "
" + print_h2 "Liste des disques disponibles (lsblk)" + run_and_print "lsblk" - echo "

Taille mémoire en Mo (free -m) :

" - echo "
"
-		free -m
-		echo "
" + print_h2 "Taille mémoire en Mo (free -m)" + run_and_print "free -m" - echo "

Caractéristiques CPU (lscpu) :

" - echo "
"
-		lscpu
-		echo "
" + print_h2 "Caractéristiques CPU (lscpu)" + run_and_print "lscpu" - echo "

Les 50 dernières erreur dans /var/log/messages :

" - if sudo -l &> /dev/null ; then - # L'utilisateur a les droits sudo. on continue - echo "
"
-			sudo cat /var/log/messages | egrep -i 'error|failed' | tail -50 
-			echo "
" - else - echo "
"
-		    echo "L'utilisateur n'a les droits pour lire les fichiers log."
-			echo "
" - fi + print_h2 "Statistiques VM (vmstat 2 20)" + run_and_print "vmstat 2 20" + + print_h2 "Top 10 processus par utilisation CPU (ps --width 150)" + run_and_print "ps -eo pid,user,%cpu,%mem,vsz,rss,tty,stat,start,time,command --sort=-%cpu --width 1000 | head -n 17 | cut -c 1-180" + + print_h2 "Derniers messages du noyau (dmesg -T | tail -n 30)" + if sudo -ln &> /dev/null; then + run_and_print "sudo dmesg -T | tail -n 30" + else + echo "
L'utilisateur n'a pas les droits sudo pour exécuter dmesg.
" + fi + + print_h2 "Les 30 dernières erreurs dans /var/log/messages" + if sudo -ln &> /dev/null; then + run_and_print "sudo cat /var/log/messages | egrep -i 'error|failed' | tail -30" + else + echo "
L'utilisateur n'a pas les droits sudo pour lire les fichiers log.
" + fi ;; esac case "$os_type" in AIX) - echo "

Configuration système (prtconf) :

" - echo "
"
-        prtconf
-		echo "
" + print_h2 "Configuration système (prtconf)" + run_and_print "prtconf" ;; esac diff --git a/sh/09_os_info.sh_modified b/sh/09_os_info.sh_modified deleted file mode 100644 index 31df1ce..0000000 --- a/sh/09_os_info.sh_modified +++ /dev/null @@ -1,73 +0,0 @@ -# faire des commandes pour AIX et pour Linux -os_type=$(uname -s) - -# Function to execute command and format output -execute_command() { - command="$1" - output="$(eval "$command" 2>&1)" # Capture both stdout and stderr using eval - # Print the command and its output in the specified format - echo "--- Commande ---" - echo "$command" - echo "--- Résultat ---" - echo "$output" - echo "--- Fin Bloc ---" -} - -execute_command "ps -ef | grep pmon | grep -v grep" -execute_command "ps -ef | grep tnslsnr | grep -v grep" - -# Listener status -ps -ef | grep tnslsnr | egrep -i " LISTENER |${ORACLE_SID}" | grep -v grep | while read l -do - binary_path=$(echo $l | perl -lne 'print $1 if /(\S*tnslsnr\S*)/' | sed 's#/bin/tnslsnr##') - listener_name=$(echo $l | perl -lne 'print $1 if /\btnslsnr\s+(\S+)/' | sed 's/tnslsnr //') - lsnrctl_command="$binary_path/bin/lsnrctl status $listener_name" - export TNS_ADMIN=$binary_path/network/admin - execute_command "$lsnrctl_command" -done - -execute_command "uptime" - -case "$os_type" in - AIX) - execute_command "lsfs" - ;; - Linux) - execute_command "cat /etc/fstab | egrep -v '^#|^$'" - ;; -esac - -execute_command "crontab -l" -execute_command "ulimit -a | sort" - -case "$os_type" in - AIX) - execute_command "df -g" - ;; - Linux) - execute_command "df -h" - ;; -esac - -case "$os_type" in - Linux) - execute_command "lsblk" - execute_command "free -m" - execute_command "lscpu" - if sudo -l &> /dev/null ; then - execute_command "sudo cat /var/log/messages | egrep -i 'error|failed' | tail -50" - else - echo "--- Commande ---" - echo "sudo cat /var/log/messages | egrep -i 'error|failed' | tail -50" - echo "--- Résultat ---" - echo "L'utilisateur n'a les droits pour lire les fichiers log." - echo "--- Fin Bloc ---" - fi - ;; -esac - -case "$os_type" in - AIX) - execute_command "prtconf" - ;; -esac diff --git a/sh/10_oracle_installation.sh b/sh/10_oracle_installation.sh index d80514a..a42a027 100644 --- a/sh/10_oracle_installation.sh +++ b/sh/10_oracle_installation.sh @@ -1,25 +1,40 @@ -# /etc/oratab -echo "

Contenu du fichier /etc/oratab :

" -echo "
"
-cat /etc/oratab | egrep -v "^$|^#"
-echo "
" +#!/bin/bash -# inventory.xml -echo "

Contenu du fichier Inventory.xml :

" -echo "
"
-ORA_INVENTORY=$(cat /etc/oraInst.loc | grep inventory_loc | cut -d= -f2)
-cat $ORA_INVENTORY/ContentsXML/inventory.xml | grep ""
+# Importe les fonctions utilitaires
+source "$(dirname "$0")/utils.sh"
 
-# opatch 
-echo "

Niveau de patch des ORACLE_HOME (opatch lspatches) :

" -cat /etc/oratab | egrep -v "^$|^#" | cut -d: -f2 | sort -u | while read oh -do - echo "
"
-	echo "ORACLE_HOME="$oh
-	echo ""
-	export ORACLE_HOME=$oh
-	$oh/OPatch/opatch lspatches
-	echo "

" -done +# --- Script principal --- + +print_h2 "Contenu du fichier /etc/oratab" +run_and_print "cat /etc/oratab | egrep -v '^$|^#'" + +print_h2 "Contenu du fichier Inventory.xml" +# On s'assure que le fichier oraInst.loc existe et est lisible +if [ -r /etc/oraInst.loc ]; then + ORA_INVENTORY=$(grep inventory_loc /etc/oraInst.loc | cut -d= -f2) + if [ -n "${ORA_INVENTORY}" ] && [ -r "${ORA_INVENTORY}/ContentsXML/inventory.xml" ]; then + run_and_print "grep 'Impossible de lire le fichier inventory.xml ou chemin non trouvé.
" + fi +else + echo "
Fichier /etc/oraInst.loc non trouvé.
" +fi + +print_h2 "Niveau de patch des ORACLE_HOME (opatch lspatches)" +if [ -r "${ORA_INVENTORY}/ContentsXML/inventory.xml" ]; then + # Utilise un `while read` pour plus de robustesse que `cat ... | while` + while read -r line; do + # Ignore les lignes vides ou commentées + [[ "$line" =~ ^# ]] || [ -z "$line" ] && continue + + oh=$(echo "$line" | cut -d: -f2 | sort -u) + if [ -d "$oh" ]; then + export ORACLE_HOME=$oh + run_and_print "\"$oh/OPatch/opatch\" lspatches" + fi + done < <(grep -oP 'LOC="\K[^"]+' ${ORA_INVENTORY}/ContentsXML/inventory.xml) +else + echo "
Fichier ${ORA_INVENTORY}/ContentsXML/inventory.xml non trouvé.
" +fi diff --git a/sh/20_dbvisit_infos.sh b/sh/20_dbvisit_infos.sh index 84159cc..71fcffa 100644 --- a/sh/20_dbvisit_infos.sh +++ b/sh/20_dbvisit_infos.sh @@ -1,18 +1,22 @@ +#!/bin/bash + +# Importe les fonctions utilitaires +source "$(dirname "$0")/utils.sh" + +# --- Script principal --- + # script à exécuter si seulement dbvctl existe et une instance avec le nom de service dbv existe aussi -count=$(ps -ef | grep dbvctl | grep -v grep | grep ${ORACLE_SID} | wc -l) +count=$(ps -ef | grep dbvctl | grep -v grep | grep "${ORACLE_SID}" | wc -l) -if [ $count -gt 0 ]; then +if [ "$count" -gt 0 ]; then echo "

Configuration DBVisit

" - # les process dbvisit en cours - echo "

Process DBVisit en cours d'exécution

" - echo "
"
-	ps -ef | grep dbvctl | grep -v grep 
-	echo "
" + print_h2 "Process DBVisit en cours d'exécution" + run_and_print "ps -ef | grep dbvctl | grep -v grep" # on récupère le chemin de l'executable dbvctl - export DBV_HOME=$(dirname $(ps -ef | grep dbvctl | grep -v grep | awk '{print $8}' | sort -u)) + export DBV_HOME=$(dirname "$(ps -ef | grep dbvctl | grep -v grep | awk '{print $8}' | sort -u)") # si les exacutables sont lancé avec ./dbvctl, le résultat retourné est . # dans ce cas on remplace par la valeur par défaut : /usr/dbvisit/standby if [ "$DBV_HOME" = "." ]; then @@ -20,18 +24,13 @@ if [ $count -gt 0 ]; then export DBV_HOME="/usr/dbvisit/standby" fi - # statut de la base de données - echo "

Statut de la base : ${ORACLE_SID} sur le serveur $(hostname)

" - echo "
"
-	${DBV_HOME}/dbvctl -d ${ORACLE_SID} -o status
-	echo "
" + print_h2 "Statut de la base : ${ORACLE_SID} sur le serveur $(hostname)" + run_and_print "${DBV_HOME}/dbvctl -d ${ORACLE_SID} -o status" # on récupère le statut de la base pour exécuter la commande sur la base primaire - db_prim=$(${DBV_HOME}/dbvctl -d ${ORACLE_SID} -o status | grep -i "read write" | wc -l) - if [ ${db_prim} -gt 0 ]; then - echo "

Rapport de GAP DBVisit pour la base ${ORACLE_SID}

" - echo "
"
-		${DBV_HOME}/dbvctl -d ${ORACLE_SID} -i
-		echo "
" + db_prim=$("${DBV_HOME}/dbvctl" -d "${ORACLE_SID}" -o status | grep -i "read write" | wc -l) + if [ "${db_prim}" -gt 0 ]; then + print_h2 "Rapport de GAP DBVisit pour la base ${ORACLE_SID}" + run_and_print "${DBV_HOME}/dbvctl -d ${ORACLE_SID} -i" fi fi \ No newline at end of file diff --git a/sh/30_crs.sh b/sh/30_crs.sh index b664651..597da94 100644 --- a/sh/30_crs.sh +++ b/sh/30_crs.sh @@ -1,16 +1,22 @@ +#!/bin/bash + +# Importe les fonctions utilitaires +source "$(dirname "$0")/utils.sh" + +# --- Script principal --- + # script à exécuter si couche grid/crs count=$(ps -ef | grep ohasd | grep -v grep | wc -l) -if [ $count -gt 0 ]; then +if [ "$count" -gt 0 ]; then - echo "

Services CRS

" - # les process dbvisit en cours + print_h2 "Services CRS" # BIN_DIR=$(dirname $(ps -ef | grep ohasd.bin | grep -v grep | egrep -o '/.*ohasd\.bin')) # la commande egrep -o ne fonctionne pas sous AIX # on utilise donc la commande suivante avec awk - BIN_DIR=$(dirname $(ps -ef | grep ohasd.bin | grep -v grep | awk '{ match($0, /\/.*ohasd\.bin/); print substr($0, RSTART, RLENGTH) }')) + BIN_DIR=$(dirname "$(ps -ef | grep ohasd.bin | grep -v grep | awk '{ match($0, /\/.*ohasd\.bin/); print substr($0, RSTART, RLENGTH) }')") # explication de la commande awk : # - match($0, /\/.*ohasd\.bin/): Cette partie de la commande awk recherche la première occurrence # de la séquence "/.*ohasd.bin" dans la ligne. @@ -18,7 +24,10 @@ if [ $count -gt 0 ]; then # la position RSTART (où la correspondance commence) jusqu'à la longueur RLENGTH de la correspondance. # - Le résultat sera la portion de la chaîne entre le premier / et le mot "ohasd.bin". # - la commande dirname retourne le répertoire qui sera utilisé dans BIN_DIR - echo "
"
-	${BIN_DIR}/crsctl status res -t
-	echo "
" + + if [ -n "$BIN_DIR" ] && [ -x "$BIN_DIR/crsctl" ]; then + run_and_print "${BIN_DIR}/crsctl status res -t" + else + echo "
Impossible de trouver le répertoire d'installation CRS ou crsctl n'est pas exécutable.
" + fi fi \ No newline at end of file diff --git a/sh/local/check_expdp_log.sh b/sh/local/check_expdp_log.sh index ff255b2..76e18d6 100644 --- a/sh/local/check_expdp_log.sh +++ b/sh/local/check_expdp_log.sh @@ -1,35 +1,47 @@ #!/bin/bash # script pour vérifier les logs des fichiers datapump et voir si des erreurs sont présentes +# Importe les fonctions utilitaires +source "$(dirname "$0")/../utils.sh" + +# --- Script principal --- + # EXPDP_DIR="/u04/backup" : la variable d'environnement est chargée depuis le fichier .env CURRENT_DATE=$(date +%Y_%m) # date au format 2025_04 -echo "

Vérification des logs des exports Datapump

" +print_h2 "Vérification des logs des exports Datapump" # vérifier si une erreur ORA- est pésente dans les fichiers logs echo "

Vérification de la présence d'erreurs dans les logs :

" -RESULT=$(find "${EXPDP_DIR}" -iname "export_*.log" -exec grep -H "ORA-" "{}" \;) -if [ -z "$RESULT" ]; then - echo "
Aucune erreur ORA- détectée dans les fichiers logs du mois ${CURRENT_DATE}.
" + +if [ -z "${EXPDP_DIR}" ]; then + echo "
La variable EXPDP_DIR n'est pas définie. Impossible de vérifier les logs Datapump.
" +elif [ ! -d "${EXPDP_DIR}" ]; then + echo "
Le répertoire EXPDP_DIR ('${EXPDP_DIR}') n'existe pas ou n'est pas accessible.
" else - echo "
$RESULT
" -fi + RESULT=$(find "${EXPDP_DIR}" -iname "export_*.log" -exec grep -H "ORA-" "{}" \;) + if [ -z "$RESULT" ]; then + echo "
Aucune erreur ORA- détectée dans les fichiers logs du mois ${CURRENT_DATE}.
" + else + echo "
$RESULT
" + fi -# afficher les dernières lignes des fichiers log pour voir les les exports se sont bien déroulés -echo "

Affichage des 10 premières et 10 dernières lignes des fichiers logs :

" -# préparation de la commande find : définition de la fonction d'affichage plus lisible -show_log_excerpt() { - local file="$1" - echo "
--- ${file} --- " # affiche le nom du fichier en gras - echo "
"
-  head -10 "$file"                      # affiche les 10 première lignes dans le bloc PRE
-  echo "
" 
-  tail -10 "$file"                      # affiche les 10 dernières lignes dans le bloc PRE
-  echo "
" -} -# export pour rendre la fonction accessible à bash -c -export -f show_log_excerpt + # afficher les dernières lignes des fichiers log pour voir les les exports se sont bien déroulés + echo "

Affichage des 10 premières et 10 dernières lignes des fichiers logs :

" + # préparation de la commande find : définition de la fonction d'affichage plus lisible + show_log_excerpt() { + local file="$1" + echo "
--- ${file} --- " # affiche le nom du fichier en gras + echo "
"
+      head -10 "$file"                      # affiche les 10 première lignes dans le bloc PRE
+      echo "
" 
+      tail -10 "$file"                      # affiche les 10 dernières lignes dans le bloc PRE
+      echo "
" + } + # export pour rendre la fonction accessible à bash -c + export -f show_log_excerpt -# find appelle la fonction en lui passant $0 comme paramètre -find "${EXPDP_DIR}" -iname "export_*.log" -exec bash -c 'show_log_excerpt "$0"' {} \; \ No newline at end of file + # find appelle la fonction en lui passant $0 comme paramètre + find "${EXPDP_DIR}" -iname "export_*.log" -exec bash -c 'show_log_excerpt "$0"' {} \; +fi \ No newline at end of file diff --git a/sh/utils.sh b/sh/utils.sh new file mode 100644 index 0000000..f13fb24 --- /dev/null +++ b/sh/utils.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Fichier de fonctions utilitaires pour les scripts de rapport + +# Fonction: log_info +# Description: Affiche un message d'information dans les logs avec un timestamp. +# Paramètres: +# $1 - Le message à afficher. +log_info() { + echo "[INFO] $(date +'%Y-%m-%d %H:%M:%S') - ${1}" +} + +# Affiche un titre H2 +print_h2() { + echo "

$1

" +} + +# Exécute une commande et affiche sa sortie dans une balise
+# Si la commande échoue, elle affiche un message d'erreur mis en évidence.
+run_and_print() {
+  local cmd="$1"
+  local cmd_html
+
+  # Échapper les caractères HTML pour un affichage sûr
+  cmd_html=$(echo "${cmd}" | sed 's/&/\&/g; s//\>/g')
+
+  echo "
"
+  # Affiche la commande échappée en rouge et gras
+  echo "${cmd_html}"
+
+  # Ajoute une ligne vide pour la séparation
+  echo ""
+
+  # Exécute la commande originale, redirige stderr vers stdout pour tout capturer
+  if output=$(eval "${cmd}" 2>&1); then
+    echo "$output"
+  else
+    echo "
" + echo "ERREUR: La commande a échoué avec le message suivant :" + echo "$output" + echo "
" + fi + echo "
" +} diff --git a/sql/01_system_info.sql b/sql/01_system_info.sql index 29537bd..8fa808c 100644 --- a/sql/01_system_info.sql +++ b/sql/01_system_info.sql @@ -1,6 +1,6 @@ prompt

System Information

WITH /* 1a.1 */ - rac AS (SELECT /*+ MATERIALIZE NO_MERGE */ COUNT(*) instances, CASE COUNT(*) WHEN 1 THEN 'Single-instance' ELSE COUNT(*)||'-node RAC cluster' END db_type FROM gv$instance), + rac AS (select /* db-html-report */ /*+ MATERIALIZE NO_MERGE */ COUNT(*) instances, CASE COUNT(*) WHEN 1 THEN 'Single-instance' ELSE COUNT(*)||'-node RAC cluster' END db_type FROM gv$instance), hrac AS (SELECT /*+ MATERIALIZE NO_MERGE */ CASE 1 WHEN 1 THEN ' (historically Single-instance in AWR)' ELSE ' (historicly 1-node RAC cluster in AWR)' END db_type FROM rac WHERE TO_CHAR(RAC.instances)<>1), mem AS (SELECT /*+ MATERIALIZE NO_MERGE */ SUM(value) target FROM gv$system_parameter2 WHERE name = 'memory_target'), diff --git a/sql/11_get_db_size.sql b/sql/11_get_db_size.sql index c6514cd..9782369 100644 --- a/sql/11_get_db_size.sql +++ b/sql/11_get_db_size.sql @@ -2,7 +2,7 @@ prompt

Taille de la base de données :

WITH sizes AS ( -SELECT /*+ MATERIALIZE NO_MERGE */ /* 1f.60 */ +select /* db-html-report */ /*+ MATERIALIZE NO_MERGE */ /* 1f.60 */ 'Data' file_type, SUM(bytes) bytes FROM v$datafile diff --git a/sql/12a_instance_status.sql b/sql/12a_instance_status.sql index 91f8217..7510909 100644 --- a/sql/12a_instance_status.sql +++ b/sql/12a_instance_status.sql @@ -1,7 +1,7 @@ prompt

Database/Instance Status

alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS'; -SELECT 'DATABASE_NAME' AS property, name AS value FROM gv$database +select /* db-html-report */ 'DATABASE_NAME' AS property, name AS value FROM gv$database UNION ALL SELECT 'DATABASE_ROLE' AS property, DATABASE_ROLE AS value FROM gv$database UNION ALL diff --git a/sql/12c_db_version.sql b/sql/12c_db_version.sql index 0d0a706..dce6ef6 100644 --- a/sql/12c_db_version.sql +++ b/sql/12c_db_version.sql @@ -1,6 +1,6 @@ prompt

Database/Version

-SELECT +select /* db-html-report */ * FROM V$VERSION; \ No newline at end of file diff --git a/sql/13_database_parameters.sql b/sql/13_database_parameters.sql index 3414966..972e575 100644 --- a/sql/13_database_parameters.sql +++ b/sql/13_database_parameters.sql @@ -1,6 +1,6 @@ prompt

Paramèters de la base de données :

-SELECT +select /* db-html-report */ NAME, DISPLAY_VALUE, DESCRIPTION, diff --git a/sql/14_nls_database_parameters.sql b/sql/14_nls_database_parameters.sql index fb7b405..1481548 100644 --- a/sql/14_nls_database_parameters.sql +++ b/sql/14_nls_database_parameters.sql @@ -1,4 +1,3 @@ prompt

Paramètres NLS au niveau de la base de données :

--- SELECT * FROM NLS_DATABASE_PARAMETERS ORDER BY PARAMETER; -select * from gv$nls_parameters order by PARAMETER ; \ No newline at end of file +select /* db-html-report */ * from gv$nls_parameters order by PARAMETER ; \ No newline at end of file diff --git a/sql/15_check_supplemntal_logging.sql b/sql/15_check_supplemntal_logging.sql index 19283ba..de61e58 100644 --- a/sql/15_check_supplemntal_logging.sql +++ b/sql/15_check_supplemntal_logging.sql @@ -1,6 +1,6 @@ prompt

Database supplemental logging :

-select 'force_logging' as property, force_logging as value from v$database +select /* db-html-report */ 'force_logging' as property, force_logging as value from v$database union all select 'supplemental_log_data_min' as property, supplemental_log_data_min as value from v$database union all diff --git a/sql/16_dba_registry.sql b/sql/16_dba_registry.sql index d5b862e..ed72cef 100644 --- a/sql/16_dba_registry.sql +++ b/sql/16_dba_registry.sql @@ -1,6 +1,6 @@ prompt

Fonctionnalités installées dans la base de données (DBA_REGISTRY) :

-SELECT +select /* db-html-report */ * FROM DBA_REGISTRY diff --git a/sql/17_resource_limits.sql b/sql/17_resource_limits.sql index 584e15a..2e6d4da 100644 --- a/sql/17_resource_limits.sql +++ b/sql/17_resource_limits.sql @@ -1,6 +1,6 @@ prompt

Resource Limit (GV$RESOURCE_LIMIT)

-SELECT +select /* db-html-report */ * FROM GV$RESOURCE_LIMIT diff --git a/sql/18_memory_configuration.sql b/sql/18_memory_configuration.sql index 9344ae8..0ce2948 100644 --- a/sql/18_memory_configuration.sql +++ b/sql/18_memory_configuration.sql @@ -1,7 +1,7 @@ prompt

Memory Information

WITH system_parameter AS ( -SELECT inst_id, +select /* db-html-report */ inst_id, name, value FROM gv$system_parameter2 diff --git a/sql/19a_memory_resize_operations.sql b/sql/19a_memory_resize_operations.sql index de50be0..4c0c411 100644 --- a/sql/19a_memory_resize_operations.sql +++ b/sql/19a_memory_resize_operations.sql @@ -2,7 +2,7 @@ prompt

Les 50 dernières opérations de Resize de la mémoire :

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'; -SELECT +select /* db-html-report */ * FROM GV$MEMORY_RESIZE_OPS diff --git a/sql/19b_memory_target_advice.sql b/sql/19b_memory_target_advice.sql index ab43c41..6d0390e 100644 --- a/sql/19b_memory_target_advice.sql +++ b/sql/19b_memory_target_advice.sql @@ -1,6 +1,6 @@ prompt

SGA Target Advice

-SELECT +select /* db-html-report */ * FROM GV$SGA_TARGET_ADVICE; diff --git a/sql/20a_tbs_details.sql b/sql/20a_tbs_details.sql index 93ae3d4..1a1753d 100644 --- a/sql/20a_tbs_details.sql +++ b/sql/20a_tbs_details.sql @@ -12,7 +12,7 @@ COL free FORMAT 99999999.00 HEAD "Free MB" COL max FORMAT 99999999.00 HEAD "MaxSize MB" COL Pct_Used FORMAT 999.00 HEAD "% Used" -select +select /* db-html-report */ a.tablespace_name, t.bigfile, a.bytes_alloc/1024/1024 alloc, diff --git a/sql/20b_datafile.sql.old b/sql/20b_datafile.sql.old deleted file mode 100644 index d39a66b..0000000 --- a/sql/20b_datafile.sql.old +++ /dev/null @@ -1,49 +0,0 @@ -prompt

Détail des datafiles :

- - -COL file_id HEAD "File ID" -COL file_name HEAD "Datafile" -COL tablespace_name FORMAT A20 HEAD "Tablespace" - -COL file_size_mb FORMAT 999999999.00 HEAD "File Size MB" -COL space_used_mb FORMAT 999999999.00 HEAD "Space Used MB" -COL space_free_mb FORMAT 999999999.00 HEAD "Space Free MB" -COL maxsize_mb FORMAT 999999999.00 HEAD "Max Size MB" -COL percent_used FORMAT 999.00 HEAD "% Used" - -COL autoextensible FORMAT A15 HEAD "Auto Extensible" -COL status head "Status" -COL online_status format a15 head "Online Status" - -select - d.file_id, - d.file_name, - d.tablespace_name, - a.bytes_alloc/1024/1024 file_size_mb, - (a.bytes_alloc - nvl(b.bytes_free, 0))/1024/1024 space_used_mb, - nvl(b.bytes_free, 0)/1024/1024 space_free_mb, - a.maxbytes/1024/1024 maxsize_mb, - round((a.bytes_alloc - nvl(b.bytes_free, 0)) / a.maxbytes * 100,2) percent_used, - d.autoextensible, - d.status, - d.online_status -from - ( - select - f.file_id, - sum(f.bytes) bytes_alloc, - sum(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes - from dba_data_files f group by file_id - ) a, - ( - select - f.file_id, - sum(f.bytes) bytes_free - from dba_free_space f group by file_id - ) b, - dba_data_files d -where - a.file_id = b.file_id (+) and d.file_id=a.file_id -order by - d.file_name -; diff --git a/sql/20c_datafile.sql b/sql/20c_datafile.sql index 48d9c7b..00099e1 100644 --- a/sql/20c_datafile.sql +++ b/sql/20c_datafile.sql @@ -20,7 +20,7 @@ WITH -- Sous-requête pour les fichiers de données dans une CDB cdb_files AS ( -- cdb_files.sql - SELECT + select /* db-html-report */ p.con_id AS pdb_id, p.pdb_name AS pdb_name, d.file_id, diff --git a/sql/20d_tempfile.sql b/sql/20d_tempfile.sql index 13e7b43..88e8e59 100644 --- a/sql/20d_tempfile.sql +++ b/sql/20d_tempfile.sql @@ -20,7 +20,7 @@ WITH -- Sous-requête pour les fichiers de données dans une CDB cdb_files AS ( -- cdb_files.sql - SELECT + select /* db-html-report */ p.con_id AS pdb_id, p.pdb_name AS pdb_name, d.file_id, diff --git a/sql/20e_undo.sql b/sql/20e_undo.sql index a27836a..5701a13 100644 --- a/sql/20e_undo.sql +++ b/sql/20e_undo.sql @@ -1,6 +1,6 @@ prompt

Détail du tablespace UNDO :

-SELECT +select /* db-html-report */ a.tablespace_name, a.file_id, a.bytes / 1024 / 1024 AS size_mb, diff --git a/sql/21c_block_corruption.sql b/sql/21c_block_corruption.sql index 2063f91..af2e924 100644 --- a/sql/21c_block_corruption.sql +++ b/sql/21c_block_corruption.sql @@ -1,6 +1,6 @@ prompt

Existance de blocks corrompus :

-SELECT +select /* db-html-report */ * FROM V$DATABASE_BLOCK_CORRUPTION; \ No newline at end of file diff --git a/sql/22a_online_log.sql b/sql/22a_online_log.sql index 70cec9d..26955dc 100644 --- a/sql/22a_online_log.sql +++ b/sql/22a_online_log.sql @@ -2,7 +2,7 @@ prompt

Fichiers de journalisation (Redolog) :

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'; -SELECT +select /* db-html-report */ * FROM V$LOG diff --git a/sql/22b_online_log.sql b/sql/22b_online_log.sql index 8eecf57..b38b719 100644 --- a/sql/22b_online_log.sql +++ b/sql/22b_online_log.sql @@ -3,7 +3,7 @@ alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS'; COL MEMBER FORMAT A90 WRAPPED BREAK ON GROUP# SKIP 1 ON THREAD# ON SEQUENCE# ON TAILLE_MIB ON "STATUS(ARCHIVED)" -SELECT +select /* db-html-report */ 'OnlineLog' t, g.group#, g.thread#, diff --git a/sql/23a_archive_log_per_day.sql b/sql/23a_archive_log_per_day.sql index ded55b4..389105a 100644 --- a/sql/23a_archive_log_per_day.sql +++ b/sql/23a_archive_log_per_day.sql @@ -31,7 +31,7 @@ col 23 for 999 col 24 for 999 -select to_char(first_time, 'YYYY/MM/dd') "Date", +select /* db-html-report */ to_char(first_time, 'YYYY/MM/dd') "Date", count(1) "Total", sum(decode(to_char(first_time, 'hh24'),'00',1,0)) "00", sum(decode(to_char(first_time, 'hh24'),'01',1,0)) "01", diff --git a/sql/23b_archive_log_per_day.sql b/sql/23b_archive_log_per_day.sql index 81d574e..c697d45 100644 --- a/sql/23b_archive_log_per_day.sql +++ b/sql/23b_archive_log_per_day.sql @@ -1,6 +1,6 @@ prompt

Taille des redolog par jour :

-SELECT +select /* db-html-report */ TO_CHAR(FIRST_TIME, 'YYYY/MM/dd') "Jour", COUNT(*) "Nbr de fichiers", ROUND(SUM(BLOCKS*BLOCK_SIZE)/1024/1024, 0) "Taille_Mo" diff --git a/sql/24a_fra_usage.sql b/sql/24a_fra_usage.sql index 07ecbe8..fe77fdd 100644 --- a/sql/24a_fra_usage.sql +++ b/sql/24a_fra_usage.sql @@ -1,6 +1,6 @@ prompt

Fast Recovery Area Usage

-SELECT +select /* db-html-report */ 'Taille FRA MiB' AS PROPERTY, P.VALUE / 1024 / 1024 AS VALUE FROM diff --git a/sql/24b_fra_usage.sql b/sql/24b_fra_usage.sql index bb8f77f..da5fe0b 100644 --- a/sql/24b_fra_usage.sql +++ b/sql/24b_fra_usage.sql @@ -1,2 +1,2 @@ prompt

Fast Recovery Area Usage

-SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE; +select /* db-html-report */ * FROM V$FLASH_RECOVERY_AREA_USAGE; diff --git a/sql/25_last_alertlog_errors.sql b/sql/25_last_alertlog_errors.sql index a0e667f..09dbeca 100644 --- a/sql/25_last_alertlog_errors.sql +++ b/sql/25_last_alertlog_errors.sql @@ -1,6 +1,6 @@ prompt

Les dernières erreurs de la base de données (Les 30 derniers jours et les 50 dernières lignes)

-SELECT +select /* db-html-report */ TO_CHAR(ORIGINATING_TIMESTAMP, 'DD-MM-YYYY HH24:MM:SS') "Date", MESSAGE_TEXT "Message" FROM diff --git a/sql/26_rman_configuration.sql b/sql/26_rman_configuration.sql index f0f5492..a5e1897 100644 --- a/sql/26_rman_configuration.sql +++ b/sql/26_rman_configuration.sql @@ -1,6 +1,6 @@ prompt

Configuration RMAN: pramètres modifiés :

-SELECT +select /* db-html-report */ * FROM V$RMAN_CONFIGURATION; \ No newline at end of file diff --git a/sql/27_last_rman_backup.sql b/sql/27_last_rman_backup.sql index 88c6f80..de84e8f 100644 --- a/sql/27_last_rman_backup.sql +++ b/sql/27_last_rman_backup.sql @@ -2,7 +2,7 @@ prompt

Les dernières sauvegardes RMAN (30 derniers jours/50 dernières lign ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'; -SELECT +select /* db-html-report */ B.SESSION_KEY "Session Key", B.INPUT_TYPE "Type", TO_CHAR(B.START_TIME, 'DD-MM-YYYY HH24:MI') "Start Time", diff --git a/sql/28_sysaux_occupants.sql b/sql/28_sysaux_occupants.sql index 6f67099..1790134 100644 --- a/sql/28_sysaux_occupants.sql +++ b/sql/28_sysaux_occupants.sql @@ -1,6 +1,6 @@ prompt

SYSAUX Occupants

-SELECT /*+ NO_MERGE */ +select /* db-html-report */ /*+ NO_MERGE */ V.*, ROUND(V.SPACE_USAGE_KBYTES / POWER(10, 6), 3) SPACE_USAGE_GBS FROM diff --git a/sql/30a_users.sql b/sql/30a_users.sql index ad4f07c..7faba83 100644 --- a/sql/30a_users.sql +++ b/sql/30a_users.sql @@ -2,7 +2,7 @@ prompt

DBA Users

ALTER SESSION SET NLS_DATE_FORMAT ='YYYY/MM/DD HH24:MI'; -SELECT +select /* db-html-report */ X.USERNAME, X.USER_ID, X.ACCOUNT_STATUS, diff --git a/sql/30b_users.sql b/sql/30b_users.sql index 9a8a267..cb60e90 100644 --- a/sql/30b_users.sql +++ b/sql/30b_users.sql @@ -1,6 +1,6 @@ prompt

DBA_Profiles

-SELECT +select /* db-html-report */ * FROM DBA_PROFILES diff --git a/sql/30c_schema_size.sql b/sql/30c_schema_size.sql index c606171..e4b00b7 100644 --- a/sql/30c_schema_size.sql +++ b/sql/30c_schema_size.sql @@ -1,6 +1,6 @@ prompt

Taille des objets par schéma (Mo):

-SELECT +select /* db-html-report */ DS.OWNER "Owner", ROUND(SUM(DS.BYTES) / 1024 / 1024) "Schema Size MB", DU.DEFAULT_TABLESPACE "Default Tablespace" diff --git a/sql/31a_who_is_connected.sql b/sql/31a_who_is_connected.sql index 90e99bf..ace330f 100644 --- a/sql/31a_who_is_connected.sql +++ b/sql/31a_who_is_connected.sql @@ -2,7 +2,7 @@ prompt

Sessions Aggregate per User and Type

WITH X AS ( - SELECT + select /* db-html-report */ COUNT(*), --con_id, USERNAME, diff --git a/sql/31b_who_is_connected.sql b/sql/31b_who_is_connected.sql index e6a815b..b09feb5 100644 --- a/sql/31b_who_is_connected.sql +++ b/sql/31b_who_is_connected.sql @@ -1,7 +1,7 @@ prompt

Sessions Aggregate per Module and Action

WITH X AS ( - SELECT + select /* db-html-report */ COUNT(*), --con_id, MODULE, diff --git a/sql/31c_who_is_connected.sql b/sql/31c_who_is_connected.sql index 5be8b56..377ce74 100644 --- a/sql/31c_who_is_connected.sql +++ b/sql/31c_who_is_connected.sql @@ -10,7 +10,7 @@ col OSUSER for a10 ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'; -SELECT +select /* db-html-report */ OSUSER, MACHINE, PROGRAM, diff --git a/sql/32_invalid_objects.sql b/sql/32_invalid_objects.sql index ac4a430..9c252a4 100644 --- a/sql/32_invalid_objects.sql +++ b/sql/32_invalid_objects.sql @@ -1,6 +1,6 @@ prompt

Invalid objects

-SELECT +select /* db-html-report */ OWNER, COUNT(*) "invalid objects" FROM diff --git a/sql/33_get_users_objects.sql b/sql/33_get_users_objects.sql index 5c5747c..ffffe2a 100644 --- a/sql/33_get_users_objects.sql +++ b/sql/33_get_users_objects.sql @@ -1,6 +1,6 @@ prompt

Les objets par utilisateur

-SELECT +select /* db-html-report */ * FROM ( diff --git a/sql/34_disable_auto_tasks.sql b/sql/34_disable_auto_tasks.sql index 027b7d5..c12609d 100644 --- a/sql/34_disable_auto_tasks.sql +++ b/sql/34_disable_auto_tasks.sql @@ -1,6 +1,6 @@ prompt

Statut des jobs autotask

-SELECT +select /* db-html-report */ CLIENT_NAME, STATUS, ATTRIBUTES, diff --git a/sql/35a_get_cursor_usage.sql b/sql/35a_get_cursor_usage.sql index a15e36e..4132c31 100644 --- a/sql/35a_get_cursor_usage.sql +++ b/sql/35a_get_cursor_usage.sql @@ -1,7 +1,7 @@ -- SCRIPT - to Set the 'SESSION_CACHED_CURSORS' and 'OPEN_CURSORS' Parameters Based on Usage (Doc ID 208857.1) prompt

Sessions and Cursors usage

-SELECT +select /* db-html-report */ 'session_cached_cursors' PARAMETER, LPAD(VALUE, 5) VALUE, DECODE(VALUE, 0, ' n/a', TO_CHAR(100 * USED / VALUE, '990') diff --git a/sql/35b_cursors_count.sql b/sql/35b_cursors_count.sql index 0240713..0dbe0f3 100644 --- a/sql/35b_cursors_count.sql +++ b/sql/35b_cursors_count.sql @@ -1,6 +1,6 @@ prompt

Curseurs par Session (sans les users SYS, SYSTEM, SYSMAN)

-select c.sid, s.username, count(*) open_cursors +select /* db-html-report */ c.sid, s.username, count(*) open_cursors from gv$open_cursor c, gv$session s where s.sid = c.sid and s.username is not null and s.username not like 'SYS%' diff --git a/sql/36_check_failed_cheduler_jobs.sql b/sql/36_check_failed_cheduler_jobs.sql index 9aaaf92..ed2a36b 100644 --- a/sql/36_check_failed_cheduler_jobs.sql +++ b/sql/36_check_failed_cheduler_jobs.sql @@ -1,6 +1,6 @@ prompt

Failed scheduled jobs

-SELECT +select /* db-html-report */ OWNER, JOB_NAME, JOB_TYPE, diff --git a/sql/37_table_statistics_summary.sql b/sql/37_table_statistics_summary.sql index 0001d3d..857e97a 100644 --- a/sql/37_table_statistics_summary.sql +++ b/sql/37_table_statistics_summary.sql @@ -3,7 +3,7 @@ prompt

Table Statistics Summary

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'; WITH X AS ( - SELECT /*+ NO_MERGE */ + select /* db-html-report */ /*+ NO_MERGE */ --con_id, OWNER, OBJECT_TYPE, diff --git a/sql/38_dictionary_stats.sql b/sql/38_dictionary_stats.sql index daaf23a..e01a906 100644 --- a/sql/38_dictionary_stats.sql +++ b/sql/38_dictionary_stats.sql @@ -1,6 +1,6 @@ prompt

Dictionary Stats / Fixed Objects Stats

-SELECT +select /* db-html-report */ TO_CHAR(MAX(END_TIME), 'dd/mm/yyyy hh24:mi') LATEST, OPERATION FROM diff --git a/sql/39_feature_usage_statistics.sql b/sql/39_feature_usage_statistics.sql index 2b7fe5d..5e26aa9 100644 --- a/sql/39_feature_usage_statistics.sql +++ b/sql/39_feature_usage_statistics.sql @@ -2,7 +2,7 @@ prompt

Les options utilisée (à partir de DBA_FEATURE_USAGE_STATISTICS): Liste des jobs dans : dba_jobs

+prompt

Liste des derniers jobs dans : CDB_SCHEDULER_JOB_LOG

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'; -SELECT - * -FROM - DBA_JOBS; \ No newline at end of file +select /* db-html-report */ +* from +( + select log_date, owner, job_name, status + from CDB_SCHEDULER_JOB_LOG + order by log_date desc +) where rownum <= 20 +; \ No newline at end of file diff --git a/sql/41_sql_stat.sql b/sql/41_sql_stat.sql new file mode 100644 index 0000000..543975d --- /dev/null +++ b/sql/41_sql_stat.sql @@ -0,0 +1,23 @@ +prompt

Top SQL

+ +alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS'; + +select /* db-html-report */ +* from ( +select + a.inst_id, + a.sql_id, + a.elapsed_time / 1000000 as elapsed, + substrb(replace(a.sql_text,'',' '),1,55) as sql_text, + a.cpu_time / 1000000 as cpu_time, + a.buffer_gets, -- Lecture en memoire + a.disk_reads, -- Lecture sur disque + a.physical_read_bytes, + a.executions, + a.rows_processed, + a.last_active_time, -- Last time the statistics of a contributing cursor were updated + b.module +from gv$sqlstats a, gv$sql b +where a.sql_id=b.sql_id +order by a.elapsed_time desc +) where rownum <= 25; \ No newline at end of file diff --git a/sql/cdb/01_show_pdbs.sql b/sql/cdb/01_show_pdbs.sql index 20c57ee..037b1d7 100644 --- a/sql/cdb/01_show_pdbs.sql +++ b/sql/cdb/01_show_pdbs.sql @@ -4,7 +4,7 @@ col application_root for a25 col application_pdb for a25 col application_seed for a25 -SELECT +select /* db-html-report */ p.con_id, p.dbid, p.name, diff --git a/summary.sh b/summary.sh index 7e900c1..5a9e031 100644 --- a/summary.sh +++ b/summary.sh @@ -3,91 +3,82 @@ # Ce script exécute des sql pour fournir une vue global de certains aspect de la base # tous les datafiles, toutes les sauvegardes, toutes les erreur dans alertlog, ... #------------------------------------------------------------------------------ -export LANG=en_US -DATETIME=`date +%Y%m%d%H%M` -HNAME=$(hostname) -OUTPUT_DIR=output/$(date +%Y%m%d) -mkdir -p ${OUTPUT_DIR} + +# Importe les fonctions utilitaires +# Le chemin est relatif au script appelant (rapport_bdd.sh) +source "$(dirname "$0")/sh/utils.sh" + +# Les variables DATETIME, HNAME, OUTPUT_DIR, et l'environnement .env sont déjà gérés par rapport_bdd.sh +# On s'assure que OUTPUT_DIR est défini +: "${OUTPUT_DIR:?OUTPUT_DIR not set by calling script}" +: "${DATETIME:?DATETIME not set by calling script}" +: "${HNAME:?HNAME not set by calling script}" + +log_info "Début de l'exécution des scripts de synthèse." #------------------------------------------------------------------------------ -# inititalisation des variables d'environnement -#------------------------------------------------------------------------------ -export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) - -# Nom du fichier .env -ENV_FILE=${SCRIPTS_DIR}"/.env" - -# Vérifier si le fichier .env existe -if [ ! -f "$ENV_FILE" ]; then - echo "Erreur : Le fichier $ENV_FILE n'existe pas." - echo "Erreur : Impossible de charger les variables d'environnement." - exit 1 -fi - -# Charger les variables d'environnement depuis le fichier .env -source "$ENV_FILE" - - -#------------------------------------------------------------------------------ -# Execution des scripts sql +# Execution des scripts sql de synthèse #------------------------------------------------------------------------------ for sqlfile in summary/*.sql do # on prepare le fichier output FILENAME=$(basename "$sqlfile" | cut -d_ -f2) BASENAME="${FILENAME%.*}" - HTML_FILE=${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html + HTML_FILE="${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html" + + log_info "Génération du rapport de synthèse SQL pour ${FILENAME} dans ${HTML_FILE}" + # insertion du header HTML - cat html/00_html_header.html >> ${HTML_FILE} + cat html/00_html_header.html > "${HTML_FILE}" for sid in $(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3) do export ORAENV_ASK=NO - export ORACLE_SID=$sid + export ORACLE_SID="$sid" + # shellcheck source=/dev/null . oraenv -s > /dev/null # ajout du nom de la base - echo '

Base de données : '$sid'

' >> ${HTML_FILE} + echo "

Base de données : ${sid}

" >> "${HTML_FILE}" # ajouter le resultat du script sql dans la page html - cat summary/01_sql_header.txt $sqlfile | sqlplus -s / as sysdba >> ${HTML_FILE} + # Utilise le sql_header.txt standard + cat sql/sql_header.txt "$sqlfile" | sqlplus -s / as sysdba >> "${HTML_FILE}" done # insertion du footer HTML - cat html/99_html_footer.html >> ${HTML_FILE} - - echo Rapport synthèse pour ${FILENAME} dans : ${HTML_FILE} -done - -#------------------------------------------------------------------------------ -# exécution des scripts dans sh/local si présents -# Chemin du dossier local -#------------------------------------------------------------------------------ -LOCAL_DIR="sh/local" - -for shfile in ${LOCAL_DIR}/*.sh -do - - # on prépare le fichier output - FILENAME=$(basename "$shfile") - BASENAME="${FILENAME%.*}" - HTML_FILE=${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html - - # insertion du header HTML - cat html/00_html_header.html >> ${HTML_FILE} - + cat html/99_html_footer.html >> "${HTML_FILE}" + log_info "Rapport synthèse pour ${FILENAME} généré." + echo "

Retour en haut de page

" >> "${HTML_FILE}" + done + + #------------------------------------------------------------------------------ + # exécution des scripts dans sh/local si présents + #------------------------------------------------------------------------------ + LOCAL_DIR="sh/local" + if [ -d "$LOCAL_DIR" ]; then - echo "[INFO] Détection du dossier local : $LOCAL_DIR" - for f in "$LOCAL_DIR"/*.sh; do - [ -f "$f" ] || continue - echo "[INFO] Exécution du script local : $f" - bash "$f" >> ${HTML_FILE} + log_info "Détection du dossier local : ${LOCAL_DIR}" + for shfile in "${LOCAL_DIR}"/*.sh + do + [ -f "$shfile" ] || continue + # on prépare le fichier output + FILENAME=$(basename "$shfile") + BASENAME="${FILENAME%.*}" + HTML_FILE="${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html" + log_info "Génération du rapport de synthèse Shell pour ${FILENAME} dans ${HTML_FILE}" + # insertion du header HTML + cat html/00_html_header.html > "${HTML_FILE}" + # Exécution du script local en utilisant run_and_print + print_h2 "Résultat du script : ${FILENAME}" >> "${HTML_FILE}" + # Le script shfile lui-même doit être exécuté, et il contient déjà ses propres print_h2/run_and_print + # Donc, on l'exécute directement. + bash "$shfile" >> "${HTML_FILE}" + # insertion du footer HTML + cat html/99_html_footer.html >> "${HTML_FILE}" + log_info "Rapport synthèse pour ${FILENAME} généré." + echo "

Retour en haut de page

" >> "${HTML_FILE}" done else - echo "[INFO] Aucun script local détecté dans ${LOCAL_DIR}." + log_info "Aucun script local détecté dans ${LOCAL_DIR}." fi - - # insertion du footer HTML - cat html/99_html_footer.html >> ${HTML_FILE} - - echo Rapport synthèse pour ${FILENAME} dans : ${HTML_FILE} -done \ No newline at end of file + log_info "Fin de l'exécution des scripts de synthèse." \ No newline at end of file diff --git a/summary/01_sql_header.txt b/summary/01_sql_header.txt deleted file mode 100644 index ddae063..0000000 --- a/summary/01_sql_header.txt +++ /dev/null @@ -1 +0,0 @@ -SET PAGES 999 FEEDBACK OFF MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP OFF