From af63b535a31fad47bacb52ccc0fb64f3c6793a00 Mon Sep 17 00:00:00 2001 From: cybiohub Date: Mon, 13 Dec 2021 21:33:48 -0500 Subject: [PATCH] First Commit --- README.md | 9 ++- bin/majserver.sh | 179 +++++++++++++++++++++++++++++++++++++++++++++++ md/logo.png | Bin 0 -> 13638 bytes 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 bin/majserver.sh create mode 100644 md/logo.png diff --git a/README.md b/README.md index 05ba8a0..d7ae202 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ | ![alt text][logo] | Integration & Securite Systeme | | ------------- |:-------------:| -# Login Alert -This script is used to update Linux systems (Ubuntu and Debian). It is a script to launch the apt-get by generating execution logs. It allows better control for technicians who do not know Linux. +# Majserver +This script is used to update Linux systems (Ubuntu and Debian) with the apt-get command. A basic script, but which allows you to, + +- Speed up the update by forcing the use of IPv4 only. +- Generate an execution log for logging. +- Allows better control for technicians unfamiliar with Linux. +- Prevents the execution of some tasks if a restart of the system is necessary. --- [logo]: ./md/logo.png "Cybionet" diff --git a/bin/majserver.sh b/bin/majserver.sh new file mode 100644 index 0000000..fb67d9a --- /dev/null +++ b/bin/majserver.sh @@ -0,0 +1,179 @@ +#! /bin/bash +#set -x +# * ************************************************************************** +# * Creation: (c) 2004-2021 Cybionet - Ugly Codes Division +# * +# * File: majserver.sh +# * Version: 0.1.12b +# * +# * Comment: Tool to configure update system. +# * +# * Date: December 16, 2017 +# * Modification: November 25, 2021 +# * +# * ************************************************************************** +# * chmod 500 majserver.sh +# **************************************************************************** + + +############################################################################################# +# ## CONSTANTS + +# ## Location of the log file. +readonly APTLOG='/var/log/maj-update.log' + +# ## Force use of IPv4. To disable this option empty the variable. +readonly FORCEIPV4='-o Acquire::ForceIPv4=true' + + +############################################################################################# +# ## VARIABLES + +# ## Retrieval of date and year +aptDate=$(date +%Y-%m-%d) +appYear=$(date +%Y) + +# ## Application informations. +appHeader="(c) 2004-${appYear} Cybionet - Ugly Codes Division" +readonly appVersion='0.1.12b' + + +############################################################################################# +# ## VERIFICATION + +# ## Check if the script are running under root user. +if [ "${EUID}" -ne '0' ] ; then + echo -e "\n\e[34m${appHeader}\e[0m\n" + echo -e "\n\n\n\e[33mCAUTION: This script must be run as root.\e[0m" + exit 0 +else + echo -e "\n\e[34m${appHeader}\e[0m\n" +fi + + +############################################################################################# +# ## FUNCTIONS + +# ## Show warning to remember to take snapshot. +function reminderCheck() { + echo -n -e "\e[38;5;208mWARNING:\e[0m Have you taken the snapshot of the virtual machine before updating it? [y|N] " + read ANSWER + if [ "${ANSWER}" != 'y' ]; then + echo 'Have a nice day!' + exit 0 + fi +} + +# ## Launch update. +function aptUpdate() { + apt-get update "${FORCEIPV4}" + echo "${aptDate} - UpDate Repository" >> "${APTLOG}" +} + +# ## Launch upgrade. +function aptUpgrade() { + reminderCheck + apt-get upgrade "${FORCEIPV4}" + echo "${aptDate} - UpGrade System" >> "${APTLOG}" +} + +# ## Launch dist-upgrade. +function aptDistUpgrade() { + reminderCheck + apt-get dist-upgrade "${FORCEIPV4}" + echo "${aptDate} - Distribution UpGrade" >> "${APTLOG}" +} + +# ## Launch autoremove. +function autoRemove() { + if [ -f '/var/run/reboot-required' ]; then + echo -e "\e[38;5;208mWARNING: Reboot the system before removing old package.\e[0m" + exit 0 + fi + + echo -n -e "\n\e[38;5;208mWARNING:\e[0m Are you sure you want to do this? [y|N] " + read ANSWER + if [ "${ANSWER}" != 'y' ]; then + echo 'Have a nice day!' + exit 0 + fi + + apt-get autoremove + echo "${aptDate} - Autoremove Packages" >> "${APTLOG}" +} + +# ## Launch autoclean. +function autoClean() { + if [ -f '/var/run/reboot-required' ]; then + echo -e "\e[38;5;208mWARNING: Reboot the system before cleaning archive packages.\e[0m" + exit 0 + fi + + apt-get autoclean + echo "${aptDate} - Autoclean Archive Packages" >> "${APTLOG}" +} + +# ## Check if intervention is necessairy. +function aptCheck() { + apt-get check +} + +# ## Show the content of the log. +function showlog() { + cat "${APTLOG}" +} + +# ## Show the version of this app (hidden option). +function version() { + echo -e "Version: ${appVersion}\n" +} + +# ## Check if the system requires a reboot. +# ## Result: 0 (Ok), 1 (Reboot). +function rebootNeeded() { + if [ -f '/var/run/reboot-required' ]; then + echo -e "\e[38;5;208mWARNING: A system restart is required.\e[0m" + fi +} + + +############################################################################################# +# ## MENU + +case "${1}" in + update) + aptUpdate + ;; + upgrade) + aptUpdate + aptUpgrade + rebootNeeded + ;; + distupgrade|dist-upgrade) + aptDistUpgrade + rebootNeeded + ;; + autoremove) + autoRemove + ;; + autoclean) + autoClean + ;; + check) + aptCheck + ;; + showlog) + showlog + ;; + version) + version + ;; + *) + echo 'Options: update | upgrade | dist-upgrade | autoremove | autoclean | check | showlog' + ;; +esac + +# ## Exit. +exit 0 + +# ## END diff --git a/md/logo.png b/md/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a96973c0442561d4147ba6b27fe7474506836ac3 GIT binary patch literal 13638 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 YKXkqjl4O^p8UO$Q07*qoM6N<$f`T5dQ2+n{ literal 0 HcmV?d00001