330 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			330 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env zsh
 | |
| 
 | |
| _check_date_if_format() {
 | |
|     local format=`_date_format`
 | |
| 
 | |
|     if [ "$format" != "" ]; then
 | |
|         _check_date $format $1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| _date_format() {
 | |
| 
 | |
|     case $UPDATE_CHECK in
 | |
|         "daily") echo +%d/%m/%Y;;
 | |
|         "weekly") echo +%V/%Y;;
 | |
|         "monthly") echo +%m/%Y;;
 | |
|     esac
 | |
| 
 | |
| }
 | |
| 
 | |
| _check_date_file() {
 | |
|     mkdir -p ~/.config/dotfiles/.data
 | |
|     touch ~/.config/dotfiles/.data/update_date
 | |
| }
 | |
| 
 | |
| _sentence() {
 | |
|     subject0=("Your" "The" "This")
 | |
|     subject1=("system" "machine" "pc" "computer")
 | |
|     adjective=("awesome" "incredible" "amazing" "brave" "hard working" "loyal" "nice" "polite" "powerful" "pro-active" "reliable" "fabulous" "fantastic" "incredible" "outstanding" "remarkable" "spectacular" "splendid" "super" "happy" "cheerful")
 | |
|     verb=("is" "seems" "looks" "appears to be")
 | |
|     no_verb=("is not" "doesn't seem" "doesn't look" "appears not to be")
 | |
|     adverb=("up-to-date" "ready" "updated")
 | |
|     dot=("." "!" "...")
 | |
| 
 | |
|     n_subject0=`shuf -i1-"${#subject0[@]}" -n1`
 | |
|     n_subject1=`shuf -i1-"${#subject1[@]}" -n1`
 | |
|     n_adjective=`shuf -i1-"${#adjective[@]}" -n1`
 | |
|     n_adverb=`shuf -i1-"${#adverb[@]}" -n1`
 | |
|     n_dot=`shuf -i1-"${#dot[@]}" -n1`
 | |
| 
 | |
|     if [ $1 = "updated" ];  then
 | |
|         color="32"
 | |
|         n_verb=`shuf -i1-"${#verb[@]}" -n1`
 | |
|         s_verb=$verb[$n_verb]
 | |
|     elif [ $1 = "not_updated" ]; then
 | |
|         color="31"
 | |
|         n_verb=`shuf -i1-"${#no_verb[@]}" -n1`
 | |
|         s_verb=$no_verb[$n_verb]
 | |
|     fi
 | |
| 
 | |
|     echo "\033[$color;1m$subject0[$n_subject0] $adjective[$n_adjective] $subject1[$n_subject1] $s_verb $adverb[$n_adverb]$dot[$n_dot]\033[0m"
 | |
| }
 | |
| 
 | |
| _check_date() {
 | |
| 
 | |
|     _check_date_file
 | |
| 
 | |
|     old_date=`cat ~/.config/dotfiles/.data/update_date`
 | |
|     new_date=`date $1`
 | |
| 
 | |
|     if [ "$new_date" != "$old_date" ]; then
 | |
|         _sentence not_updated
 | |
|     elif [ "$UPDATE_CHECK_ALWAYS" = "true" ] || [ "$2" = "force" ]; then
 | |
|         _sentence updated
 | |
|     fi
 | |
| }
 | |
| 
 | |
| update-system() {
 | |
| 
 | |
|     echo "\033[32;1m=== Starting system update, please enter your password ===\033[0m"
 | |
|     sudo true
 | |
|     if [ $? -ne 0 ]; then
 | |
|         echo "Could not get sudo..."
 | |
|         return 1
 | |
|     fi
 | |
| 
 | |
|     echo "\033[32;1m=== Updating system ===\033[0m"
 | |
|     start_system_update=`date +%s`
 | |
| 
 | |
|     # Debian based systems
 | |
|     command -v apt > /dev/null 2>&1
 | |
|     if [ $? -eq 0 ]; then
 | |
|         sudo apt update -y
 | |
|         if [ $? -eq 0 ]; then
 | |
|             sudo apt upgrade -y
 | |
|             if [ $? -eq 0 ]; then
 | |
|                 sudo apt autoremove -y
 | |
|             fi
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     # Archlinux based systems
 | |
|     command -v yay > /dev/null 2>&1
 | |
| 
 | |
|     if [ $? -eq 0 ]; then
 | |
|         yay -Syu --noconfirm
 | |
|         yay -Syua --noconfirm
 | |
|     else
 | |
|         command -v pacman > /dev/null 2>&1
 | |
| 
 | |
|         if [ $? -eq 0 ]; then
 | |
|             sudo pacman -Syu --noconfirm
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     # Fedora based systems
 | |
|     command -v dnf > /dev/null 2>&1
 | |
|     if [ $? -eq 0 ]; then
 | |
|         sudo dnf upgrade
 | |
|     fi
 | |
| 
 | |
|     seconds=$((`date +%s` - $start_system_update ))
 | |
|     formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'`
 | |
|     echo "\033[32;1m=== System updated in $formatted ===\033[0m"
 | |
| }
 | |
| 
 | |
| update-rust() {
 | |
| 
 | |
|     # Update rust if installed
 | |
|     command -v rustup > /dev/null 2>&1
 | |
|     if [ $? -ne 0 ]; then
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     start_rust_update=`date +%s`
 | |
|     echo "\033[32;1m=== Updating rustup ===\033[0m"
 | |
|     rustup self update
 | |
| 
 | |
|     echo "\033[32;1m=== Updating rust ===\033[0m"
 | |
|     rustup update
 | |
| 
 | |
|     cargo install-update --help > /dev/null 2>&1
 | |
| 
 | |
|     if [ $? -ne 0 ]; then
 | |
| 
 | |
|         pkg-config --libs --cflags openssl > /dev/null 2>&1
 | |
| 
 | |
|         # We need to install openssl
 | |
|         if [ $? -ne 0 ]; then
 | |
| 
 | |
|             # Ask for sudo right now
 | |
|             sudoresult=$(sudo -nv 2>&1)
 | |
| 
 | |
|             if [ $? -eq 0 ]; then
 | |
|                 command -v apt > /dev/null 2>&1
 | |
|                 if [ $? -eq 0 ]; then
 | |
|                     sudo apt install -y libssl-dev
 | |
|                 fi
 | |
| 
 | |
|                 # For fedora
 | |
|                 command -v dnf > /dev/null 2>&1
 | |
|                 if [ $? -eq 0 ]; then
 | |
|                     sudo dnf install openssl-devel
 | |
|                 fi
 | |
|             elif echo $sudoresult | grep -q '^sudo:'; then
 | |
|                 echo "\033[32;1m=== libssl-dev is needed to update rust packages, please enter your password ===\033[0m"
 | |
|                 sudo true
 | |
|                 if [ $? -ne 0 ]; then
 | |
|                     echo "Could not get sudo..."
 | |
|                     return 1
 | |
|                 fi
 | |
|             else
 | |
|                 echo "\033[33;1m=== You are not a sudoer, cannot install cargo-update... ===\033[0m"
 | |
|                 return 1
 | |
|             fi
 | |
| 
 | |
|         fi
 | |
| 
 | |
|         echo "\033[32;1m=== Installing rust packages updater ===\033[0m"
 | |
|         cargo install cargo-update
 | |
|     fi
 | |
| 
 | |
|     echo "\033[32;1m=== Updating rust packages ===\033[0m"
 | |
|     cargo install-update -ag
 | |
| 
 | |
|     seconds=$((`date +%s` - $start_rust_update ))
 | |
|     formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'`
 | |
|     echo "\033[32;1m=== Rust updated in $formatted ===\033[0m"
 | |
| 
 | |
| }
 | |
| 
 | |
| update-npm() {
 | |
| 
 | |
|     # Update node packages if installed
 | |
|     command -v npm > /dev/null 2>&1
 | |
|     if [ $? -ne 0 ]; then
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     if [ ! -d ~/.npmbin ]; then
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     start_npm_update=`date +%s`
 | |
|     echo "\033[32;1m=== Updating node packages ===\033[0m"
 | |
| 
 | |
|     for package in $(npm -g outdated --parseable --depth=0 | cut -d: -f3)
 | |
|     do
 | |
|         npm -g install "$package"
 | |
|     done
 | |
| 
 | |
|     seconds=$((`date +%s` - $start_npm_update ))
 | |
|     formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'`
 | |
|     echo "\033[32;1m=== Node packages updated in $formatted ===\033[0m"
 | |
| }
 | |
| 
 | |
| update-dotfiles() {
 | |
|     start_dotfiles_update=`date +%s`
 | |
| 
 | |
|     current_dir=$PWD
 | |
| 
 | |
|     echo "\033[32;1m=== Updating oh-my-zsh ===\033[0m"
 | |
|     cd ~/.config/oh-my-zsh && git pull
 | |
| 
 | |
|     echo "\033[32;1m=== Updating dotfiles ===\033[0m"
 | |
|     cd ~/.config/dotfiles && git pull
 | |
| 
 | |
|     if [ -d ~/.config/awesome/.git ]; then
 | |
|         echo "\033[32;1m=== Updating awesome config ===\033[0m"
 | |
|         cd ~/.config/awesome/ && git pull
 | |
|     fi
 | |
| 
 | |
|     cd $current_dir
 | |
| 
 | |
|     seconds=$((`date +%s` - $start_dotfiles_update ))
 | |
|     formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'`
 | |
|     echo "\033[32;1m=== Dotfiles updated in $formatted ===\033[0m"
 | |
| }
 | |
| 
 | |
| update-neovim() {
 | |
|     command -v nvim > /dev/null 2>&1
 | |
|     if [ $? -ne 0 ]; then
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     start_neovim_update=`date +%s`
 | |
|     echo "\033[32;1m=== Updating neovim packages ===\033[0m"
 | |
| 
 | |
|     nvim +PlugUpdate +qall
 | |
| 
 | |
|     seconds=$((`date +%s` - $start_neovim_update ))
 | |
|     formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'`
 | |
|     echo "\033[32;1m=== Neovim updated in $formatted ===\033[0m"
 | |
| }
 | |
| 
 | |
| _print_help() {
 | |
|     echo
 | |
| }
 | |
| 
 | |
| partial-test() {
 | |
|     case $1 in;
 | |
|         "system") return 0;;
 | |
|         "rust") return 0;;
 | |
|         "npm") return 0;;
 | |
|         "dotfiles") return 0;;
 | |
|         "neovim") return 0;;
 | |
|         "check") return 0;;
 | |
|         "startup") return 0;;
 | |
|         *) return 1;;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| partial-update() {
 | |
|     case $1 in;
 | |
|         "system") update-system;;
 | |
|         "rust") update-rust;;
 | |
|         "npm") update-npm;;
 | |
|         "dotfiles") update-dotfiles;;
 | |
|         "neovim") update-neovim;;
 | |
|         "check") _check_date_if_format force;;
 | |
|         "startup") _check_date_if_format;;
 | |
|         *) return 1
 | |
|     esac
 | |
| }
 | |
| 
 | |
| main() {
 | |
| 
 | |
|     if [ $# -eq 0 ]; then
 | |
| 
 | |
|         start=`date +%s`
 | |
|         echo "\033[32;1m=== Starting full update ===\033[0m"
 | |
| 
 | |
|         # Update the system
 | |
|         update-system
 | |
| 
 | |
|         # Update rust and rust packages
 | |
|         update-rust
 | |
| 
 | |
|         # Update npm and npm packages
 | |
|         update-npm
 | |
| 
 | |
|         # Update the dotfiles
 | |
|         update-dotfiles
 | |
| 
 | |
|         # Update the neovim packages
 | |
|         update-neovim
 | |
| 
 | |
|         format=`_date_format`
 | |
| 
 | |
|         if [ $? -eq 0 ]; then
 | |
|             _check_date_file
 | |
|             date $format > ~/.config/dotfiles/.data/update_date
 | |
|         fi
 | |
| 
 | |
|         seconds=$((`date +%s` - $start ))
 | |
|         formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'`
 | |
|         echo "\033[32;1m=== Update finished in $formatted ===\033[0m"
 | |
| 
 | |
|         _check_date_if_format force
 | |
| 
 | |
|     else
 | |
| 
 | |
|         for part in $@; do
 | |
|             partial-test $part
 | |
|             if [ $? -ne 0 ]; then
 | |
|                 echo "\033[1;31merror:\033[0m unrocognized update command \"$part\""
 | |
|                 return 1
 | |
|             fi
 | |
|         done
 | |
| 
 | |
|         for part in $@; do
 | |
|             partial-update $part
 | |
|         done
 | |
| 
 | |
|     fi
 | |
| 
 | |
| }
 | |
| 
 | |
| main $@
 |