118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| # tar.sh - backup files via tar.
 | |
| # Copyright (c) 2022 ge <https://nixhacks.net/>
 | |
| #
 | |
| # This program is free software: you can redistribute it and/or modify
 | |
| # it under the terms of the GNU General Public License as published by
 | |
| # the Free Software Foundation, either version 3 of the License, or
 | |
| # (at your option) any later version.
 | |
| #
 | |
| # This program is distributed in the hope that it will be useful,
 | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| # GNU General Public License for more details.
 | |
| #
 | |
| # You should have received a copy of the GNU General Public License
 | |
| # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | |
| 
 | |
| handler::tar() {
 | |
|     # Backup local files with tar(1). Handle 'file' URI scheme.
 | |
|     #
 | |
|     # Usage: handler::tar URI
 | |
| 
 | |
|     log "Run handler handler::tar() ..."
 | |
| 
 | |
|     local uri
 | |
|     local src_path
 | |
|     local dst_path
 | |
|     local opts
 | |
|     local archive
 | |
|     local compr
 | |
|     local exclude
 | |
|     local file_ext
 | |
| 
 | |
|     uri="$1"
 | |
|     dst_path="$__main_target_path"
 | |
| 
 | |
|     parse_uri "$uri"
 | |
| 
 | |
|     if [ -f "$path" ] || [ -d "$path" ]; then
 | |
|         src_path="$path"
 | |
|     else
 | |
|         echo "Error: Path '$path' from URI '$uri' does not exists" >&2
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     if [[ "$src_path" == "$dst_path" ]]; then
 | |
|         echo "Error: Source and destination paths is the same: $src_path; $dst_path" >&2
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     # Exit if tar is not installed
 | |
|     is_installed tar
 | |
| 
 | |
|     # Overwrire __tar_options
 | |
|     if [ -n "$tar_options" ]; then
 | |
|         opts="$tar_options"
 | |
|     else
 | |
|         opts="$__tar_options"
 | |
|     fi
 | |
| 
 | |
|     # Overwrite __tar_exclude
 | |
|     if [ "$tar_exclude" ]; then
 | |
|         for item in "${tar_exclude[@]}"; do
 | |
|             exclude+=" --exclude $item"
 | |
|         done
 | |
|     else
 | |
|         exclude=
 | |
|     fi
 | |
| 
 | |
|     # Overwrite __compression
 | |
|     if [ "$compression" ]; then
 | |
|         compr="$compression"
 | |
|     else
 | |
|         compr="$__compression"
 | |
|     fi
 | |
| 
 | |
|     # Select filename extension by compression type.
 | |
|     # Make sure for the `--auto-compress` is enabled in __tar_options
 | |
|     # Refference: https://www.gnu.org/software/tar/manual/html_node/gzip.html
 | |
|     case "$compr" in
 | |
|         gzip|gz)    file_ext='.tar.gz';;    # gzip
 | |
|         tgz)        file_ext='.tgz';;       # gzip
 | |
|         taz)        file_ext='.taz';;       # gzip
 | |
|         compress|Z) file_ext='.tar.Z';;     # compress
 | |
|         taZ)        file_ext='.taZ';;       # compress
 | |
|         bzip2|bz2)  file_ext='.tar.bz2';;   # bzip2
 | |
|         tz2)        file_ext='.tz2';;       # bzip2
 | |
|         tbz2)       file_ext='.tbz2';;      # bzip2
 | |
|         tbz)        file_ext='.tbz';;       # bzip2
 | |
|         lzip|lz)    file_ext='.tar.lz';;    # lzip
 | |
|         lzma)       file_ext='.tar.lzma';;  # lzma
 | |
|         tlz)        file_ext='.tlz';;       # lzma
 | |
|         lzop|lzo)   file_ext='.tar.lzo';;   # lzop
 | |
|         xz)         file_ext='.tar.xz';;    # xz
 | |
|         zstd|zst)   file_ext='.tar.zst';;   # zstd
 | |
|         tzst)       file_ext='.tzst';;      # zstd
 | |
|         *)          file_ext='.tar.gz';;    # Force gzip
 | |
|     esac
 | |
| 
 | |
|     archive="${dst_path}/$(gen_backup_name "$file_ext")"
 | |
| 
 | |
|     [ "$__verbose" ] && {
 | |
|         echo "Source path: $src_path"
 | |
|         echo "Destination path: $dst_path"
 | |
|         echo "Command: tar $exclude $opts $archive $src_path"
 | |
|     }
 | |
| 
 | |
|     log "Archiving $src_path to $archive ..."
 | |
|     log "Command: tar $exclude $opts $archive $src_path"
 | |
| 
 | |
|     # Run tar
 | |
|     try tar "$exclude" "$opts" "$archive" "$src_path"
 | |
| 
 | |
|     # Append path to 'backups' array
 | |
|     backups+=("$archive")
 | |
| }
 |