#!/bin/bash
# - bof - #



<<'comment'

bash <(curl -s https://www.education.isdevelopment.us/Arch.Ins/60-Arch_Btrfs_Snapper-Snapshots-Rollback.sh)



curl -o ~/Arch-Snapper.sh https://www.education.isdevelopment.us/Arch.Ins/60-Arch_Btrfs_Snapper-Snapshots-Rollback.sh
chmod +x ~/Arch-Snapper.sh; ~/./Arch-Snapper.sh;

nvim ~/Arch-Snapper.sh;



# :A
# -  - #
# - Download Arch.iso - #

cd ~/Downloads;
sIso_='ArchLinux_2025-06-01(64bit).iso';
sWs_=https://www.isdevelopment.us/Arch.Img/;
curl $sWs_$sIso_ -o $sIso_;



# :B
# -  - #
# - Arch installation script - #

# - Method   # 1 - #
curl -s "https://www.education.isdevelopment.us/Arch.Ins/60-Arch_Btrfs_Snapper-Snapshots-Rollback.sh" \
        -o ~/Arch-Snapper.sh && chmod +x ~/Arch-Snapper.sh && ~/./Arch-Snapper.sh

# - Method   # 2 - #
aI_=Arch-Snapper.sh;
curl -s "https://www.education.isdevelopment.us/Arch.Ins/60-Arch_Btrfs_Snapper-Snapshots-Rollback.sh" \
        -o ~/$aI_ && chmod +x ~/$aI_ && ~/./$aI_

# - Method   # 3 - #
aI_=Arch-Snapper.sh;
curl -o ~/$aI_  "https://www.education.isdevelopment.us/Arch.Ins/60-Arch_Btrfs_Snapper-Snapshots-Rollback.sh"
chmod +x ~/$aI_; ~/./$aI_;

# - Method   # 4 - #
cd ~/; rm -rf ~/Arch-Snapper.sh; vim ~/Arch-Snapper.sh;
copy & paste this content
chmod +x ~/Arch-Snapper.sh; ~/./Arch-Snapper.sh;



# - Configured - #

# -  - #
# - Vim commands - #
https://vim.rtorr.com/

rm -rf ~/.bashrc;
nvim ~/.bashrc;

rm -rf ~/.zshrc;
nvim ~/.zshrc;

ssh-keygen -R 192.168.1.1

# - On client - #
cd ~/.ssh;
ssh-keygen -t rsa;

cat ~/.ssh/id_rsa.pub;

# - On server - #
nvim ~/.ssh/authorized_keys;

sudo apt install curl git htop inxi net-tools ntp neovim tree -y;
sudo pacman -S curl git htop inxi net-tools ntp neovim tree --noconfirm --needed;

comment



adminUser_=($USER);

# -  - #
# - Overwrite checkComputer - #
 overwriteCc_="No";
#overwriteCc_="Yes";

sSnapper_='# - Snapper is configured - #' sS2_='';
sM1_='Snapper is already configured...';
aS_=~/Arch-Snapper.sh;



source <(curl -s https://www.education.isdevelopment.us/Functions/Functions.sh)
lightVersion_=$( lVersion_ );

sS2_=$(echo $(cat $aDesktopConf_ | grep "$sSnapper_" ));
if [ "$sSnapper_" == "$sS2_" ]; then rm -rf $aS_; echo -e "\n\n\n$sM1_\n\n\n"; sleep 5; exit; fi;



# -  - #
# - Greetings_ - #
function Greetings_(){
  Header_;
  echo -e "\nby Djalmar Enrique Rayo (2025) - GNU General Public License (GPL)";
  echo "----------------------- Light version: $lightVersion_ -----------------------";
  echo -e "\n  Warning: This script is going to install the Snapper-SnapShots"
  echo -e "\nImportant: This procedure will take a few minutes.";
  echo -e "\nProcedure: Open terminal & paste next command:\n";

cat <<"EOF"
  bash <(curl -s https://www.education.isdevelopment.us/Arch.Ins/60-Arch_Btrfs_Snapper-Snapshots-Rollback.sh)
EOF

  echo -e "\n\n";

  while true; do
    read -p "Do you want to start the installation now? (Yy/Nn): " yn
    case $yn in
        [Yy]* )
          echo -e "\n\n\nInstallation starting...\n\n"
          break;;
        [Nn]* )
          rm -rf ~/$aS_;
          exit;
          break;;
        * ) echo "Please answer (y)es or (n)o.";;
    esac
done
}



# -  - #
# - Header_ - #
function Header_(){
  clear;
  echo "";
  figlet "Snapper" | lolcat;
  figlet -f small "SnapShots  Rollback" | lolcat;
}



# -  - #
# - installSnapper_ - #
function installSnapper_(){
  echo -e "\nInstalling snapper...\n\n";

  sudo pacman -S btrfs-progs grub-btrfs inotify-tools snapper --noconfirm --needed;
  yay -S snap-pac-grub snapper-gui --noconfirm --needed;
  yay -S btrfs-assistant --noconfirm --needed;

  echo -e "\n\nSnapper was installed successfully...\n\n\n";
  sleep 10;
}



# -  - #
# - rootSnapper_ - #
function rootSnapper_(){
  echo -e "\n\nConfiguring root Snapper...\n\n";

  sudo umount /.snapshots;
  sudo rm -rf /.snapshots;
  sudo snapper -c root create-config /;
  sudo btrfs subvolume delete /.snapshots;
  sudo mkdir /.snapshots;

  # -  - #
  # - Mount fstab already configured - #
  sudo mount -av;

  sudo chmod 750 /.snapshots;
  sudo chmod a+rx /.snapshots;
  sudo chown :$adminUser_ /.snapshots;

  echo -e "\n\nResults of ls -lahg /\n\n";
  ls -lahg /;

  echo -e "\n\nroot Snapper has been configured...\n\n\n";
  sleep 10;
}



# -  - #
# - homeSnapper_ - #
function homeSnapper_(){
  local fS_=/etc/fstab \
        tFs_=~/fstab.tmp \
        sH_=/home \
        sS1_='' sS2_='';

  echo -e "\nConfiguring home Snapper...\n\n";

  sudo snapper -c home create-config $sH_;
  sudo btrfs subvolume delete $sH_/.snapshots;
  sudo rm -rf $sH_/.snapshots;

  sudo btrfs subvolume create $sH_/.snapshots;
  sudo sudo chmod a+rx $sH_/.snapshots;
  sudo chmod 750 $sH_/.snapshots;
  sudo chmod a+rx $sH_/.snapshots;
  sudo chown :$adminUser_ $sH_/.snapshots;

  echo -e "\n\nResults of ls -lah $sH_\n\n";
  ls -lahg $sH_;
  echo -e "\n\nhome Snapper has been configured...\n\n\n";
  sleep 10;

  # -  - #
  # - Show disk mounting - #
  echo -e "Adding /home/.snapshot subvolume to /etc/fstab...\n\n";

  cd ~/;
  sS1_=$(echo $(cat $fS_ | grep "$sH_" ) | awk '{print $1;}');
  sS2_=$sS1_"  /home/.snapshots btrfs rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@home/.snapshots 0       0";
  cp $fS_ $tFs_;
  echo "$sS2_" >> $tFs_;
  sudo mv $tFs_ $fS_;
  sudo mount -av;

  echo -e "\n\n\nlsblk -f as shown ...\n\n";
  lsblk -fp;
  echo -e "\n\n\nfstab as is shown ...\n\n";
  cat $fS_;

  echo -e "\n\n/home/.snapshot subvolume has been added to $fS_...\n\n\n";
  sleep 10;

  echo -e "\n\nhome Snapper has been configured...\n\n\n";
  sleep 10;
}



<<'comment'
┌─[is_derayo]──[ArchBtrfs]:~$
└──>> lsblk -f;

NAME   FSTYPE  FSVER            LABEL       UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat    FAT32            BOOT        62FC-188C                             638.4M     0% /boot/efi
├─sda2 btrfs                    Arch        20069706-ebce-4c1c-bbd7-2ac3e8ae883e   30.5G    31% /.snapshots
│                                                                                               /home/.snapshots
│                                                                                               /var/cache
│                                                                                               /var/log
│                                                                                               /var
│                                                                                               /home
│                                                                                               /
└─sda3 btrfs                    Data        c2d1b225-9c00-40fa-944c-4301356f5bf2   52.4G     0% /Data
sr0    iso9660 Joliet Extension ARCH_202506 2025-06-01-09-10-39-00
zram0  swap    1                zram0       871202cc-b8be-4ded-b80c-d7d421baa608                [SWAP]

# -  - #
# - Show new /etc/fstab - #
cat /etc/fstab;

┌─[is_derayo]──[ArchBtrfs]:~$
└──>> cat /etc/fstab;
# <file system>                            <dir>         <type>  <options>                                                                                               <dump>  <pass>
UUID=62FC-188C                              /boot/efi     vfat    rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro   0       2
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e   /             btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@                0       0
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e   /home         btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@home            0       0
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e   /.snapshots   btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@.snapshots      0       0
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e   /var          btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@var             0       0
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e   /var/cache    btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@cache           0       0
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e   /var/log      btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@log             0       0
UUID=c2d1b225-9c00-40fa-944c-4301356f5bf2   /Data         btrfs   rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@Data            0       0
UUID=20069706-ebce-4c1c-bbd7-2ac3e8ae883e  /home/.snapshots btrfs rw,noatime,nodiratime,compress=lzo,ssd,discard=async,space_cache=v2,autodefrag,subvol=/@home/.snapshots 0       0
comment



# -  - #
# - snapperConfig_ - #
function snapperConfig_(){
  local rS_=/etc/snapper/configs/root \
        hS_=/etc/snapper/configs/home;

<<'comment'
  # -  - #
  # - Confire snapper - #
  sudo vim /etc/snapper/configs/root;
  sudo vim /etc/snapper/configs/home;

  ALLOW_USERS="is_derayo"
  ALLOW_GROUPS="wheel"

  TIMELINE_MIN_AGE="3600"
  TIMELINE_LIMIT_HOURLY="5"
  TIMELINE_LIMIT_DAYLY="7"
  TIMELINE_LIMIT_WEEKLY="0"
  TIMELINE_LIMIT_MONTHLY="0"
  TIMELINE_LIMIT_YEARLY="0"
comment

  echo -e "\n\nConfiguring root & home Snapper config files...";

  # -  - #
  # - Configure snapper configs (root) - #
  sudo sed -i 's/ALLOW_USERS=""/ALLOW_USERS="'$adminUser_'"/' $rS_;
  sudo sed -i 's/ALLOW_GROUPS=""/ALLOW_GROUPS="wheel"/' $rS_;
  sudo sed -i 's/TIMELINE_MIN_AGE="3600"/TIMELINE_MIN_AGE="3600"/' $rS_;
  sudo sed -i 's/TIMELINE_LIMIT_HOURLY="10"/TIMELINE_LIMIT_HOURLY="5"/' $rS_;
  sudo sed -i 's/TIMELINE_LIMIT_DAILY="10"/TIMELINE_LIMIT_DAILY="7"/' $rS_;
  sudo sed -i 's/TIMELINE_LIMIT_WEEKLY="0"/TIMELINE_LIMIT_WEEKLY="0"/' $rS_;
  sudo sed -i 's/TIMELINE_LIMIT_MONTHLY="10"/TIMELINE_LIMIT_MONTHLY="0"/' $rS_;
  sudo sed -i 's/TIMELINE_LIMIT_QUARTERLY="0"/TIMELINE_LIMIT_QUARTERLY="0"/' $rS_;
  sudo sed -i 's/TIMELINE_LIMIT_YEARLY="10"/TIMELINE_LIMIT_YEARLY="0"/' $rS_;

  # -  - #
  # - Configure snapper configs (home) - #
  sudo sed -i 's/ALLOW_USERS=""/ALLOW_USERS="'$adminUser_'"/' $hS_;
  sudo sed -i 's/ALLOW_GROUPS=""/ALLOW_GROUPS="wheel"/' $hS_;
  sudo sed -i 's/TIMELINE_MIN_AGE="3600"/TIMELINE_MIN_AGE="3600"/' $hS_;
  sudo sed -i 's/TIMELINE_LIMIT_HOURLY="10"/TIMELINE_LIMIT_HOURLY="5"/' $hS_;
  sudo sed -i 's/TIMELINE_LIMIT_DAILY="10"/TIMELINE_LIMIT_DAILY="7"/' $hS_;
  sudo sed -i 's/TIMELINE_LIMIT_WEEKLY="0"/TIMELINE_LIMIT_WEEKLY="0"/' $hS_;
  sudo sed -i 's/TIMELINE_LIMIT_MONTHLY="10"/TIMELINE_LIMIT_MONTHLY="0"/' $hS_;
  sudo sed -i 's/TIMELINE_LIMIT_QUARTERLY="0"/TIMELINE_LIMIT_QUARTERLY="0"/' $hS_;
  sudo sed -i 's/TIMELINE_LIMIT_YEARLY="10"/TIMELINE_LIMIT_YEARLY="0"/' $hS_;

  echo -e "\n\nConfiguring root & home Snapper config files was successful...";
}



# -  - #
# - snapperTimeline_ - #
function snapperTimeline_(){
  echo -e "\n\nEnabling Snapper-timeline...\n";

  # -  - #
  # - Enable snapper-timeline - #

  sudo systemctl enable --now snapper-timeline.timer;
  sudo systemctl restart snapper-timeline.timer;
  systemctl status snapper-timeline.timer;

  sudo systemctl enable --now snapper-cleanup.timer;
  sudo systemctl restart snapper-cleanup.timer;
  systemctl status snapper-cleanup.timer;

  sudo systemctl enable --now grub-btrfsd;
  sudo systemctl restart grub-btrfsd;
  systemctl status grub-btrfsd;

  echo -e "\n\nSnapper-timeline is enabled...\n\n\n";
  sleep 10;

  # -  - #
  # - Show snapper snapshots - #
  echo -e "Btrfs subvolumes list...\n";
  sudo btrfs subvolume list /;
  #sudo btrfs subvolume list /home;
  echo -e "\nBtrfs subvolumes as right now...\n\n\n";
  sleep 10;
}



# -  - #
# - configureHooks_ - #
function configureHooks_(){
  local hD_=/etc/pacman.d/hooks/;
  local hF_=$hD_'50-bootbackup.hook' \
        tF_=~/tmp.txt;
  # -  - #
  # - Configure hooks - #
  echo -e "Configuring $hF_ file...\n";
  echo -e "This hook will backup /boot partition everytime it's a general backup ...\n";

  sudo mkdir -p $hD_;

  echo -e "[Trigger]" > $tF_;
  echo -e "Operation = Upgrade" >> $tF_;
  echo -e "Operation = Install" >> $tF_;
  echo -e "Operation = Remove" >> $tF_;
  echo -e "Type = Package" >> $tF_;
  echo -e "Target = *\n" >> $tF_;

  echo -e "[Action]" >> $tF_;
  echo -e "Depends = rsync" >> $tF_;
  echo -e "Description = Performing /boot backup pre-transaction to /.bootBackup..." >> $tF_;
  echo -e "When = PreTransaction" >> $tF_;
  echo -e 'Exec = /usr/bin/bash -c "rsync -a --mkpath --delete /boot /.bootBackup/$(date +%Y_%m_%d_%H.%M.%S)_pre-Transaction/; /usr/bin/rOBoots.sh;"' >> $tF_;

  sudo mv $tF_ $hF_;
  sudo chown root:root $hF_;

  echo -e "\n$hF_ file has been configured...\n\n\n";
  sleep 10;
  # -  - #
  # - Create /usr/bin/rOBoots.sh file - #
  removeOldBoots_;

<<'comment'
[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Package
Target = *

[Action]
Depends = rsync
Description = Performing /boot backup pre-transaction...
When = PreTransaction
Exec = /usr/bin/bash -c "rsync -a --mkpath --delete /boot /.bootBackup/$(date +%Y_%m_%d_%H.%M.%S)_pre-Transaction/; /usr/bin/rOBoots.sh;"

[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Package
Target = *

[Action]
Depends = rsync
Description = Performing /boot backup post-transaction...
When = PostTransaction
Exec = /usr/bin/bash -c "rsync -a --mkpath --delete /boot /.bootBackup/$(date +%Y_%m_%d_%H.%M.%S)_post-Transaction/; /usr/bin/rOBoots.sh;"
comment

}



# -  - #
# - removeOldBoots_ - #
function removeOldBoots_(){
  local rOb_=/usr/bin/rOBoots.sh \
        tF_=~/tmp.txt;

cat <<"EOT" >> $tF_;
#!/bin/bash
# - bof - #



# -  - #
# - Remove old /.bootBackup - #
# - /usr/bin/rOBoots.sh - #
# -  - #


sS1_='' sS2_='' sS3_='';


nD_=$(find /.bootBackup/* -maxdepth 0 -type d | wc -l);
nD_=$(( nD_ - 4 ));
sDl_=$(find /.bootBackup/* -maxdepth 0 -type d);

if [[ "$nD_" -le "0" ]]; then
      exit; fi;

while true;
  do
    sS1_=$(echo $sDl_ | awk '{print $1}');
    sS3_=$sS3_$sS1_' ';
    sDl_=$(echo "${sDl_/$sS1_/"$sS2_"}");
    nD_=$(( nD_ - 1 ));
    if [[ "$nD_" == "0" ]]; then
      break; fi;
  done

sudo rm -rf $sS3_;



# - eof - #
EOT

sudo mv $tF_ $rOb_;
sudo chmod +x $rOb_;
sudo chown root:root $rOb_;
}



# -  - #
# - snapperRollback_ - #
function snapperRollback_(){
  local sRb_=/etc/snapper-rollback.conf \
        sRf_='snapper-rollback' \
        sDisk_='';

  # -  - #
  # - Configure snapper Rollback - #
  echo -e "Installing & configuring $sRb_...\n";

  # -  - #
  # - Use sda / vda Btrfs root partition - according to installation  - #
  sDisk_=/dev/$(diskName_);

  cd ~/Downloads;
  curl -L -O https://aur.archlinux.org/cgit/aur.git/snapshot/$sRf_.tar.gz;
  tar -xf $sRf_.tar.gz;
  cd $sRf_;
  makepkg -sic;
  cd ..;

  sudo sed -i "s/@snapshots/@.snapshots/" $sRb_;
  sudo sed -i '$ a dev = '"$sDisk_" $sRb_;

<<'comment'
  # - config for btrfs root - #
  [root]
  # - Name of your linux root subvolume - #
  subvol_main = @

  # - Name of your snapper snapshot subvolume - #
  subvol_snapshots = @.snapshots

  # - Directory to which your btrfs root is mounted - #
  mountpoint = /btrfsroot

  # - Device file for btrfs root - #
  # - If your btrfs root isn't mounted to `mountpoint` directory, then automatically - #
  # - mount this device there before rolling back. This parameter is optional, but - #
  # - if unset, you'll have to mount your btrfs root manually - #
  # - dev = /dev/sda42 - #
  dev = /dev/vda3
comment

  rm -rf $sRf_*;

  echo -e "\n\nSnapper-rollback has been configured...\n\n\n";
  cd $Dir_;
  sleep 10;
}



# -  - #
# - diskName_ - #
function diskName_(){
  local fS_=/etc/fstab \
        sH_=/home \
        sS1_='' sS2_='UUID=' sS3_='' sS4_='' sS5_='';

  sS1_=$(echo $(cat $fS_ | grep "$sH_" ) | awk '{print $1;}');
  sS4_=$(echo "${sS1_/$sS2_/"$sS3_"}");
  sS5_=$(echo $(lsblk -f | grep "$sS4_" ) | awk '{print $1;}');
  sS5_=$(echo "${sS5_/"├─"/"$sS3_"}");

  echo $sS5_;
}



# -  - #
# - snapperRollbackHooks_ - #
function snapperRollbackHooks_(){
  local sS1_='snapper Rollback hooks' \
        sRbh_=/etc/initcpio/hooks/;
  local sStw_=$sRbh_'SwitchSnapRotoRw' \
        tF_=~/tmp.txt;

  # -  - #
  # - Configuring - #
  echo -e "Configuring $sS1_...";

  sudo mkdir -p $sRbh_; 
  sudo rm -rf $sStw_;

  echo -e "#!""/usr/bin/bash" > $tF_;
  echo -e "run_hook() {" >> $tF_;
  echo -e '  local current_dev=$(resolve_device "$root");' >>  $tF_;
  echo -e '  if [[ $(blkid ${current_dev} -s TYPE -o value) = "btrfs" ]]; then' >>  $tF_;
  echo -e '    current_snap=$(mktemp -d);' >>  $tF_;
  echo -e '    mount -t btrfs -o ro,"${rootflags}" "${current_dev}" "${current_snap}";' >>  $tF_;
  echo -e '    if [[ $(btrfs property get "${current_snap}" ro) != "ro=false" ]]; then' >>  $tF_;
  echo -e '      snaproot=$(mktemp -d);' >>  $tF_;
  echo -e '      mount -t btrfs -o rw,subvolid=5 "${current_dev}" "${snaproot}";' >>  $tF_;
  echo -e '      rwdir=$(mktemp -d);' >>  $tF_;
  echo -e '      mkdir -p ${snaproot}${rwdir};' >>  $tF_;
  echo -e '      btrfs sub snap "${current_snap}" "${snaproot}${rwdir}/rw";' >>  $tF_;
  echo -e '      umount "${current_snap}";' >>  $tF_;
  echo -e '      umount "${snaproot}";' >>  $tF_;
  echo -e '      rmdir "${current_snap}";' >>  $tF_;
  echo -e '      rmdir "${snaproot}";' >>  $tF_;
  echo -e '      rootflags=",subvol=${rwdir}/rw";' >>  $tF_;
  echo -e '    else' >>  $tF_;
  echo -e '      umount "${current_snap}";' >>  $tF_;
  echo -e '      rmdir "${current_snap}";' >>  $tF_;
  echo -e '    fi;' >>  $tF_;
  echo -e '  fi;' >>  $tF_;
  echo -e '}' >>  $tF_;

  sudo mv $tF_ $sStw_;
  sudo chown root:root $sStw_;

<<'comment'
#!/usr/bin/bash
run_hook() {
  local current_dev=$(resolve_device "$root");                                  # Resolve devices for blkid
  if [[ $(blkid ${current_dev} -s TYPE -o value) = "btrfs" ]]; then
    current_snap=$(mktemp -d);                                                  # Create ramdom mountpoint in root of initrafms
    mount -t btrfs -o ro,"${rootflags}" "$current_dev" "${current_snap}"
    if [[ $(btrfs property get "${current_snap}" ro) != "ro=false" ]]; then     # Check if the snapshot is in read-only mode
      snaproot=$(mktemp -d);
      mount -t btrfs -o rw,subvolid=5 "${current_dev}" "${snaproot}";
      rwdir=$(mktemp -d);
      mkdir -p ${snaproot}${rwdir}                                              # Create a random folder in root fs of btrfs device
      btrfs sub snap "${current_snap}" "${snaproot}${rwdir}/rw";
      umount "${current_snap}";
      umount "${snaproot}";
      rmdir "${current_snap}";
      rmdir "${snaproot}";
      rootflags=",subvol=${rwdir}/rw";
    else
      umount "${current_snap}";
      rmdir "${current_snap}";
    fi;
  fi;
}
comment

  echo -e "\n$sS1_ were configured successfully...\n\n\n";
  cd $Dir_;
  sleep 10;
}



# -  - #
# - snapperRollbackInstall_ - #
function snapperRollbackInstall_(){
  local sS1_='snapper Rollback install' \
        sRbh_=/etc/initcpio/install/;
  local sStw_=$sRbh_'SwitchSnapRotoRw' \
        tF_=~/tmp.txt;

  # -  - #
  # - Configuring - #
  echo -e "Configuring $sS1_...";

  sudo mkdir -p $sRbh_; 
  sudo rm -rf $sStw_;

  echo -e "#!""/usr/bin/bash" > $tF_;
  echo -e 'build() {' >> $tF_;
  echo -e '  add_module btrfs' >> $tF_;
  echo -e '  add_binary btrfs' >> $tF_;
  echo -e '  add_binary btrfsck' >> $tF_;
  echo -e '  add_binary blkid' >> $tF_;
  echo -e '  add_runscript' >> $tF_;
  echo -e '}\n' >> $tF_;
  echo -e 'help() {' >> $tF_;
  echo -e '  cat <<HELPOF' >> $tF_;
  echo -e 'This hook creates a copy of the snapshot in read only mode before boot.' >> $tF_;
  echo -e 'HELPOF' >> $tF_;
  echo -e '}' >> $tF_;

  sudo mv $tF_ $sStw_;
  sudo chown root:root $sStw_;

<<'comment'
#!/usr/bin/bash
build() {
  add_module btrfs
  add_binary btrfs
  add_binary btrfsck
  add_binary blkid
  add_runscript
}

help() {
  cat <<HELPOF
This hook creates a copy of the snapshot in read only mode before boot.
HELPOF
}
comment

  echo -e "\n$sS1_ was configured successfully...\n\n\n";
  cd $Dir_;
  sleep 10;
}



# -  - #
# - rebuildMkinitcpio_ - #
function rebuildMkinitcpio_(){
  local iF_='mkinitcpio.conf' \
        eT_=/etc/ \
        sS1_='' sS2_='' sS3_='';
  local mKi_=$eT_$iF_ \
        tF_=~/tmp.txt;

  # -  - #
  # - Configuring - #
  echo -e "Rebuilding $iF_...\n";

  sS1_='^HOOKS=(';
  sS2_=$(echo $(cat $mKi_ | grep $sS1_));
  sS3_="${sS2_%?}";
  sS3_=$sS3_' SwitchSnapRotoRw)';

  sudo sed -i 's/'"$sS2_"'/'"$sS3_"'/' $mKi_;

  sudo mkinitcpio -P;
  sudo sed -i '6 i '"$sSnapper_" $aDesktopConf_;
  sleep 10;
  
  echo -e "\n\n";
  sudo snapper list;

  echo -e "\n\n$iF_ was configured successfully...\n\n\n";
  cd $Dir_;
  sleep 10;
}



# -  - #
# - RootHomeSnapshot_ - #
function RootHomeSnapshot_(){
  local rhSn_='root & home manual snapshot';

  echo -e "\n$rhSn_ in process...\n\n";

  sudo snapper -c root create --description 'Manual root Snapshot '$(date +%Y-%m-%d_%H-%M-%S);
  sudo snapper -c home create --description 'Manual home Snapshot '$(date +%Y-%m-%d_%H-%M-%S);
  sudo snapper list;

  sudo rsync -a --mkpath --delete /boot/ "/.bootBackup/$(date +%Y_%m_%d_%H.%M.%S)_Manual/"
  echo -e "\n\n$rhSn_ were successfully executed...\n\n\n";
  sleep 10;
}



# -  - #
# - setDefaultBoot_ - #
function setDefaultBoot_(){
  local sS1_='' sS2_;

  echo -e "\n\n\nLooking for default subvolume...\n";

  sS1_=$(sudo btrfs subvolume list /);
  sS2_=$(echo $sS1_ | awk '{print $2}');

  sudo btrfs subvolume get-default /;
  sudo btrfs subvolume set-default $sS2_ /;
  sudo btrfs subvolume get-default /;

  echo -e "\n\nSubvolume $sS2_ was set as default...\n\n\n";
  sleep 10;
}



checkComputer_ $aS_;
Greetings_;
distroVersion_;
update_;
installSnapper_;
rootSnapper_;
homeSnapper_;
snapperConfig_;
snapperTimeline_;
configureHooks_;
snapperRollback_;
snapperRollbackHooks_;
snapperRollbackInstall_;
rebuildMkinitcpio_;
RootHomeSnapshot_;
setDefaultBoot_;



rm -rf ~/$aS_;

echo -e "\n\n";
duf;
echo -e "\n\n\n15 seconds pause...\n\n";
sleep 15;



<<'comment'
# -  - #
# - Snapper list - #
snapper list;

# │ Type   │ Pre # │ Date                            │ User │ Cleanup  │ Description                                                              │ Userdata
───┼────────┼───────┼─────────────────────────────────┼──────┼──────────┼──────────────────────────────────────────────────────────────────────────┼─────────
 0 │ single │       │                                 │ root │          │ current                                                                  │
 1 │ single │       │ Sun 09 Feb 2025 12:23:54 AM EST │ root │ number   │ gtksourceview3 snap-pac                                                  │
 2 │ pre    │       │ Sun 09 Feb 2025 12:24:07 AM EST │ root │ number   │ pacman -U --needed --config /etc/pacman.conf -- /home/is_derayo/.cache/y │
 3 │ post   │     2 │ Sun 09 Feb 2025 12:24:08 AM EST │ root │ number   │ snap-pac-grub snapper-gui-git                                            │
 4 │ single │       │ Sun 09 Feb 2025 01:00:14 AM EST │ root │ timeline │ timeline                                                                 │
16 │ single │       │ Sun 09 Feb 2025 01:00:14 PM EST │ root │ timeline │ timeline                                                                 │
17 │ pre    │       │ Sun 09 Feb 2025 01:20:31 PM EST │ root │ number   │ pacman -Syu --noconfirm                                                  │
18 │ post   │    17 │ Sun 09 Feb 2025 01:21:13 PM EST │ root │ number   │ acpi_call binutils gcc gcc-libs glibc libelf libsysprof-capture libtool  │
19 │ pre    │       │ Sun 09 Feb 2025 01:41:15 PM EST │ root │ number   │ pacman -S alsa-utils                                                     │
20 │ post   │    19 │ Sun 09 Feb 2025 01:41:17 PM EST │ root │ number   │ alsa-utils                                                               │
21 │ pre    │       │ Sun 09 Feb 2025 01:50:10 PM EST │ root │ number   │ pacman -S pulseaudio pulseaudio-alsa pulseaudio-bluetooth --noconfirm -- │
22 │ post   │    21 │ Sun 09 Feb 2025 01:50:14 PM EST │ root │ number   │ alsa-plugins bluez-libs pulseaudio pulseaudio-alsa pulseaudio-bluetooth  │
23 │ single │       │ Sun 09 Feb 2025 02:00:20 PM EST │ root │ timeline │ timeline                                                                 │
24 │ pre    │       │ Sun 09 Feb 2025 02:44:11 PM EST │ root │ number   │ /usr/bin/pacman -U /Data/Documents/Downloads/snapper-rollback/snapper-ro │
25 │ post   │    24 │ Sun 09 Feb 2025 02:44:11 PM EST │ root │ number   │ snapper-rollback                                                         │



# -  - #
# - Snapper-rollback to backup 24 - #
# - Very good (Working) - #
sudo snapper-rollback 24;

# - To test - #
sudo snapper --ambit classic rollback 3;




# -  - #
# - Snapper commands - #

snapper list-configs;
sudo snapper list-configs;
ls -lah /etc/snapper/configs;

snapper -c root get-config;
snapper -c home get-config;

sudo snapper -c root get-config;
sudo snapper -c home get-config;

sudo snapper -c root create --description 'Manual root Snapshot '$(date +%Y-%m-%d_%H-%M-%S);
sudo snapper -c home create --description 'Manual home Snapshot '$(date +%Y-%m-%d_%H-%M-%S);



# -  - #
# - Very important to boot from snapshots - #

snapper ls;
snapper list;
sudo btrfs subvolume list /;
sudo btrfs subvolume get-default /;
sudo btrfs subvolume set-default 256 /;

sudo btrfs subvolume show /;
sudo btrfs subvolume show /home;
sudo btrfs subvolume show /Data;

sudo btrfs filesystem show /;
sudo btrfs filesystem show /home;
sudo btrfs filesystem show /Data;

sudo btrfs filesystem usage /;
sudo btrfs filesystem usage /home;
sudo btrfs filesystem usage /Data;



sudo snapper delete 4 5;      # - Pairs (pre - post) - )
snapper ls;
sudo snapper delete 11 12;
snapper ls;



snapper -c root list;
snapper -c root list | grep 16;
snapper -c home list;

sudo snapper -c root get-config;
snapper -c root list;
snapper -c root list | grep 16;
snapper -c home list;
sudo snapper -c root list;
sudo snapper -c home list;
sudo snapper -c root create --description 'Manual rootSnapshot '$(date +%Y-%m-%d_%H-%M-%S);
sudo snapper -c home create --description 'Manual homeSnapshot '$(date +%Y-%m-%d_%H-%M-%S);
snapper -c root status 0..3;
snapper -c root status 1..3;
sudo snapper -c root status 1..3;
sudo snapper -c root diff 0..3 /swap.img;
sudo snapper -c root delete 3;
sudo snapper -c home delete 3;
sudo snapper -c root delete 0-3;
sudo snapper -c root delete 2-70;



sudo snapper -c home create-config /home;
btrfs property get /home/.snapshots/Home_2022-01-15_23-01-35

snapper -c root list;
sudo snapper -c root undochange 9..14;

# -  - #
# - Boot on the snapshot you need "9" - #
# - Rollback into snapshot "9" - #
snapper -c root list;
sudo snapper -c root --ambit classic -v rollback -d "Snapper rollback before" 9;


sudo snapper -c root -v rollback 9;
sudo snapper -c root -v rollback -d "Snapper rollback before" 9;
sudo grub-mkconfig -o /boot/grub/grub.cfg;
sudo btrfs subvolume get-default /


# -  - #
# - Create /home snapshots - #
sudo snapper -c home create --description 'Manual homeSnapshot '$(date +%Y-%m-%d_%H-%M-%S);
sudo btrfs subvolume snapshot /home /home/.snapshots;
sudo btrfs subvolume snapshot /home /home/.snapshots/'Home_'$(date +%Y-%m-%d_%H-%M-%S);
sudo btrfs subvolume list .;
sudo btrfs subvolume list /;
sudo btrfs subvolume list /home;
sudo btrfs subvolume list /Data;



sudo snapper -c home create --description 'Manual homeSnapshot '$(date +%Y-%m-%d_%H-%M-%S);
sudo snapper -c root create --description 'Manual rootSnapshot '$(date +%Y-%m-%d_%H-%M-%S);



# -  - #
# - Create manual /Data snapshot - #
sudo btrfs subvolume snapshot /Data /Data/.snapshots/'Data_'$(date +%Y-%m-%d_%H-%M-%S);



sudo btrfs subvolume list /Data;

ID 256 gen 18 top level 5 path @Data
ID 257 gen 18 top level 256 path .snapshots
ID 258 gen 11 top level 256 path Documents
ID 259 gen 16 top level 258 path Documents/Downloads
ID 260 gen 11 top level 258 path Documents/Music
ID 261 gen 15 top level 258 path Documents/Pictures
ID 262 gen 15 top level 258 path Documents/Videos
ID 263 gen 11 top level 256 path Images
ID 264 gen 11 top level 263 path Images/Backup
ID 265 gen 11 top level 263 path Images/Programs
ID 266 gen 11 top level 263 path Images/VManager
ID 267 gen 18 top level 257 path .snapshots/Data_2025-07-01_20-07-24



# -  - #
# - Delete manual /Data snapshot - #
sudo btrfs subvolume delete /Data/.snapshots/Data_2025-07-01_20-07-24;



# -  - #
# - Create manual Snapper snapshots - #
sudo snapper -c root create --description 'Manual snapshot 2022-01-15_15-11';
sudo snapper -c root create --description 'Manual snapshot '$(date +%Y-%m-%d_%H-%M-%S)

sudo snapper -c root create -t pre -p;
"3"

Update
Copy files
Add files
etc.

sudo snapper -c root create -t post --prenumber 3;

# -  - #
# - Trigger a snapshot with a command - #
sudo snapper -c root create --command 'fallocate -l 2G /Data/dir1/file6.img';



# -  - #
# - List changes between snapshots - #
snapper -c root status 0..3;
snapper -c root status 1..3;
sudo snapper -c root status 1..3;
sudo snapper -c root diff 0..3 /swap.img;

snapper -c root status 1..3;
+..... /boot/grub/grub-btrfs.cfg
c..... /boot/grub/grub.cfg
c..... /var/log/auth.log
c..... /var/log/journal/8719c1f0d8974993ab12019ec0fd4629/system.journal
c..... /var/log/journal/8719c1f0d8974993ab12019ec0fd4629/user-1000.journal
c..... /var/log/snapper.log
c..... /var/log/syslog

snapper -c root status 0..3;
c..... /boot/grub/grub-btrfs.cfg
+..... /swap.img
c..... /var/cache/apt/pkgcache.bin
c..... /var/cache/apt/srcpkgcache.bin
c..... /var/lib/apt/lists/us.archive.ubuntu.com_ubuntu_dists_jammy_InRelease
c..... /var/log/auth.log
c..... /var/log/journal/8719c1f0d8974993ab12019ec0fd4629/system.journal
c..... /var/log/journal/8719c1f0d8974993ab12019ec0fd4629/user-1000.journal
c..... /var/log/kern.log
c..... /var/log/snapper.log
c..... /var/log/syslog

sudo snapper -c root diff 0..3 /swap.img;
Binary files /swap.img and /.snapshots/3/snapshot/swap.img differ



# -  - #
# - Delete snapshots - #
snapper -c root list;
 # | Type   | Pre # | Date                            | User | Cleanup  | Description                            
---+--------+-------+---------------------------------+------+----------+---------------------------------------
0  | single |       |                                 | root |          | current                                        
1  | single |       | Sat 15 Jan 2022 08:00:38 PM UTC | root | timeline | timeline                                       
2  | single |       | Sat 15 Jan 2022 08:12:31 PM UTC | root |          | Manual snapshot on 2022-01-15_15-11            
3  | pre    |       | Sat 15 Jan 2022 08:15:27 PM UTC | root |          |                                                
4  | single |       | Sat 15 Jan 2022 08:42:19 PM UTC | root |          | Manual snapshot on 2022-01-15_20-01-19

sudo snapper -c root delete 3;
snapper -c root list;
 # | Type   | Pre # | Date                            | User | Cleanup  | Description                           
---+--------+-------+---------------------------------+------+----------+---------------------------------------
0  | single |       |                                 | root |          | current                               
1  | single |       | Sat 15 Jan 2022 08:00:38 PM UTC | root | timeline | timeline                              
2  | single |       | Sat 15 Jan 2022 08:12:31 PM UTC | root |          | Manual snapshot on 2022-01-15_15-11   
4  | single |       | Sat 15 Jan 2022 08:42:19 PM UTC | root |          | Manual snapshot on 2022-01-15_20-01-19

comment



<<'comment'
cd ~/; rm -rf ~/Arch-Snapper.sh; vim ~/Arch-Snapper.sh;
copy & paste this content
chmod +x ~/Arch-Snapper.sh; ~/./Arch-Snapper.sh;

ssh-keygen -R 192.168.1.1
~/./Arch-Snapper.sh;
comment



# - eof - #