• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kolejny skrypt w Bashu - backupy

0 głosów
182 wizyt
pytanie zadane 18 lutego w Inne języki przez whiteman808 Mądrala (5,560 p.)

Zerknie ktoś na mój kolejny skrypt w Bashu? Wprawdzie nie dokończony, zakładam wątek bo może ktoś mądrzejszy ode mnie w Bashu powie na co zwrócić uwagę i na co uważać przy pisaniu skryptów

#!/bin/bash

# Constants
SCRIPT_NAME="${0##*/}"
LOCKFILE="/tmp/restic-backup.lock"
readonly SCRIPT_NAME
readonly LOCKFILE

# Options
RESTIC_REPOSITORY=""
RESTIC_PASSWORD_COMMAND=""
RESTIC_COMPRESSION="on"
RESTIC_CACHE_DIR="/var/cache/restic"
BACKUP_SOURCES=()
BACKUP_DESTINATION=""
EXCLUDE_FILE="/etc/restic/exclude"
CHECK_DATA_SUBSET="5%"
RCLONE_PROGRAM="rclone"
CONFIG_FILE=""
RESTIC_INIT_ARGS=()
RESTIC_UNLOCK_ARGS=()
RESTIC_BACKUP_ARGS=(
  "--exclude-file='${EXCLUDE_FILE}'"
  "--tag=scheduled"
)
RESTIC_CHECK_ARGS=(
  "--with-cache"
  "--read-data-subset='${CHECK_DATA_SUBSET}'"
)

export RESTIC_REPOSITORY
export RESTIC_PASSWORD_COMMAND
export RESTIC_COMPRESSION
export RESTIC_CACHE_DIR

# Functions
shell_quote() {
  printf "'%s'" "${1//\'/\'\\\'\'}"
}

warn() {
  local -r script_name="${0##*/}"
  local -ar msg=("$@")
  printf "%s: %b\n" "${script_name}" "${msg[*]}" >&2
}

die() {
  # some snippets in this function are copied from
  # https://mywiki.wooledge.org/BashFAQ/101
  local exit_code=$?
  if [[ "$1" != *[^0-9]* ]]; then
    exit_code=$1
    shift
  fi
  local -ar msg=("$@")
  warn "${msg[@]}"
  exit "${exit_code}"
}

check_deps() {
  if ! command -v restic >/dev/null 2>&1; then
    cat >&2 <<EOF
Error: 'restic' not found in PATH.

Restic is a tool used for doing backups. You can install it using the method
supported by your system, typically the distribution's package manager on Linux.

Example:
  Arch Linux:   pacman -S restic
  Debian:       apt install restic

For other systems, you can find in the Internet installation instructions
appropriate for them or compile restic from source.

Project: https://github.com/restic/restic
EOF
    exit 1
  fi
}

usage() {
  cat <<EOF
${SCRIPT_NAME} <command>

Commands:
  init     create repository
  unlock   remove stale locks
  backup   create backup
  check    verify repository
EOF
  local -ri exit_code="${1:-0}"
  exit "${exit_code}"
}

get_config_path() {
  local -r override="$1"
  [[ -n "${override}" ]] && echo "${override}" && return
  local -r xdg="${XDG_CONFIG_HOME:-"${HOME}/.config"}/restic-backup/config"
  [[ -f "${xdg}" ]] && echo "${xdg}" && return
  echo "/etc/restic/config"
}

check_for_missing_config_file() {
  [[ -f "${CONFIG_FILE}" ]] || die "Config file not found: '${CONFIG_FILE}'"
  [[ -r "${CONFIG_FILE}" ]] || die "Config file not readable: '${CONFIG_FILE}'"
}

validate_config_values() {
  for var in RESTIC_PASSWORD_COMMAND BACKUP_DESTINATION; do
    [[ -z "${!var}" ]] &&
      die "Missing required config variable: ${var} in '${CONFIG_FILE}'"
  done
  [[ ${#BACKUP_SOURCES[@]} -eq 0 ]] &&
    die "Missing required config variable: BACKUP_SOURCES in '${CONFIG_FILE}'"
}

parse_global_args() {
  while (($# > 0)); do
    case "$1" in
    -c | --config)
      ( (($# < 2)) || [[ -z "$2" ]]) && die 1 "--config requires an argument"
      CONFIG_FILE="$2"
      shift 2
      ;;
    --)
      shift
      break
      ;;
    -*) die "Unknown global option: $1" ;;
    *) break ;;
    esac
  done
  REMAINING_ARGS=("$@")
}

ensure_cache_dir() {
  mkdir -p -- "${RESTIC_CACHE_DIR}" ||
    die "Cannot create cache directory: '${RESTIC_CACHE_DIR}'"
}

build_common_args() {
  [[ "${BACKUP_DESTINATION}" == rclone:* ]] &&
    BACKUP_CMD_ARGS+=(-o "rclone.program='${RCLONE_PROGRAM}'")
}

restic_wrapper() {
  local -r subcmd="$1"
  shift
  local -a -r args=("$@")
  build_common_args args
  restic "${subcmd}" "${args[@]}" &
  RESTIC_PID="$!"
  wait "${RESTIC_PID}"
}

cmd_init() {
  restic_wrapper init "${RESTIC_INIT_ARGS[@]}"
}

cmd_unlock() {
  restic_wrapper unlock "${RESTIC_UNLOCK_ARGS[@]}"
}

cmd_backup() {
  restic_wrapper backup "${RESTIC_BACKUP_ARGS[@]}"
}

cmd_check() {
  restic_wrapper check "${RESTIC_CHECK_ARGS[@]}"
}

dispatch_subcommand() {
  local -r cmd="$1"
  case ${cmd} in
  init) cmd_init ;;
  unlock) cmd_unlock ;;
  backup) cmd_backup ;;
  check) cmd_check ;;
  *) die "Unknown subcommand: '${cmd}'" ;;
  esac
}

cleanup() {
  flock -u 9
  rm -f "${LOCKFILE}"
}

handle_sigint() {
  echo "Interrupted, stopping restic..."

  if [[ -n "${RESTIC_PID}" ]]; then
    kill -INT "${RESTIC_PID}"
    wait "${RESTIC_PID}"
  fi

  exit 130
}

main() {
  pgrep -f "restic" >/dev/null && die 1 "restic already running, skipping"
  exec 9>"${LOCKFILE}"
  flock -n 9 || die 1 "Another script instance is already running"
  trap cleanup EXIT
  trap handle_sigint INT TERM

  check_deps
  parse_global_args "$@"
  CONFIG_FILE="$(get_config_path "${CONFIG_FILE}")"
  check_for_missing_config_file "${CONFIG_FILE}"
  # shellcheck source=/dev/null
  . "${CONFIG_FILE}"
  validate_config_values "${CONFIG_FILE}"
  (($# > 0)) || die "Missing subcommand"
  ensure_cache_dir
  dispatch_subcommand "${REMAINING_ARGS[@]}"
}

# Run script
main "$@"
komentarz 19 lutego przez Edd Obywatel (1,430 p.)
Wygląda nieźle, trzaskasz te skrypty w zawrotnym tempie ;) To Twoje? Czy AI?
1
komentarz 20 lutego przez whiteman808 Mądrala (5,560 p.)
Moje. Czasem robię lekkie kopiuj-wklej z poprzednich swoich skryptów + modyfikacje ale nie wyręczam się AI

1 odpowiedź

0 głosów
odpowiedź 28 kwietnia przez niezalogowany

Witamy Pana

Przejrzeliśmy Pana skrypt. Tak jak Pan napisał, jest Pan w trakcie prac. Chcielibyśmy pomóc.

1. Proszę zwrócić uwagę na ten fragment ( BACKUP_CMD_ARGS nigdzie nie istnieje )

build_common_args() {
  [[ "${BACKUP_DESTINATION}" == rclone:* ]] &&
    BACKUP_CMD_ARGS+=(-o "rclone.program='${RCLONE_PROGRAM}'")
}

2. Cytowanie tablic ( bash nie rozwija ${EXCLUDE_FILE )

RESTIC_BACKUP_ARGS=(
  "--exclude-file=${EXCLUDE_FILE}"
  "--tag=scheduled"
)

3. Jest Pan pewien, że nie chce Pan tutaj poprawić na coś takiego? Bo samo restic może zamulić.

pgrep -f "restic" >/dev/null && die 1 "restic already running"

4. To Repo nie jest walidowane.

for var in RESTIC_PASSWORD_COMMAND BACKUP_DESTINATION RESTIC_REPOSITORY; do

Pozdrawiamy
Życzymy samych sukcesów!

Podobne pytania

0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 7 lutego w Inne języki przez whiteman808 Mądrala (5,560 p.)
+1 głos
1 odpowiedź 724 wizyt
pytanie zadane 13 czerwca 2021 w Inne języki przez mattaha Użytkownik (690 p.)
0 głosów
0 odpowiedzi 429 wizyt
pytanie zadane 21 czerwca 2021 w Nasze projekty przez mattaha Użytkownik (690 p.)

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...