Added interactive config
This commit is contained in:
		
							parent
							
								
									d2eeadba89
								
							
						
					
					
						commit
						bdc2eb09bb
					
				| 
						 | 
					@ -40,13 +40,13 @@
 | 
				
			||||||
        <div class="bg-white dark:bg-gray-800 col-span-1 md:col-span-2 shadow-lg rounded-lg p-5">
 | 
					        <div class="bg-white dark:bg-gray-800 col-span-1 md:col-span-2 shadow-lg rounded-lg p-5">
 | 
				
			||||||
  <h3 class="dark:text-white text-lg font-semibold mb-1"><a href="/archlinux"
 | 
					  <h3 class="dark:text-white text-lg font-semibold mb-1"><a href="/archlinux"
 | 
				
			||||||
      class="text-blue-500 hover:text-blue-700">ArchLinux (x86_64)</a></h3>
 | 
					      class="text-blue-500 hover:text-blue-700">ArchLinux (x86_64)</a></h3>
 | 
				
			||||||
  <p class="text-gray-600 dark:text-gray-300">Last Updated: Not Synced</p>
 | 
					  <p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-12 11:24</p>
 | 
				
			||||||
  <p class="text-gray-600 dark:text-gray-300">Upstream: <span class="url">rsync://mirrors.xtom.de/archlinux/</span></p>
 | 
					  <p class="text-gray-600 dark:text-gray-300">Upstream: <span class="url">rsync://mirrors.xtom.de/archlinux/</span></p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="bg-white dark:bg-gray-800 col-span-1 shadow-lg rounded-lg p-5">
 | 
					<div class="bg-white dark:bg-gray-800 col-span-1 shadow-lg rounded-lg p-5">
 | 
				
			||||||
  <h3 class="dark:text-white text-lg font-semibold mb-1"><a href="/ubuntu"
 | 
					  <h3 class="dark:text-white text-lg font-semibold mb-1"><a href="/ubuntu"
 | 
				
			||||||
      class="text-blue-500 hover:text-blue-700">Ubuntu</a></h3>
 | 
					      class="text-blue-500 hover:text-blue-700">Ubuntu</a></h3>
 | 
				
			||||||
  <p class="text-gray-600 dark:text-gray-300">Last Updated: Not Synced</p>
 | 
					  <p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-12 11:24</p>
 | 
				
			||||||
  <p class="text-gray-600 dark:text-gray-300">Upstream: <span class="url">rsync://rsync.archive.ubuntu.com/ubuntu/</span></p>
 | 
					  <p class="text-gray-600 dark:text-gray-300">Upstream: <span class="url">rsync://rsync.archive.ubuntu.com/ubuntu/</span></p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="bg-white dark:bg-gray-800 col-span-1 shadow-lg rounded-lg p-5">
 | 
					<div class="bg-white dark:bg-gray-800 col-span-1 shadow-lg rounded-lg p-5">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,19 +1,25 @@
 | 
				
			||||||
BASE_DIR: /srv/mirror
 | 
					BASE_DIR: /srv/mirror
 | 
				
			||||||
ENV: ./scripts/.env
 | 
					
 | 
				
			||||||
 | 
					# Any path under this must be in relative of BASE_DIR.
 | 
				
			||||||
 | 
					# Script doesnt do any kind of outbound check, so make sure to check all paths.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
global:
 | 
					global:
 | 
				
			||||||
 | 
					  scripts:
 | 
				
			||||||
 | 
					    pre:
 | 
				
			||||||
 | 
					    post:
 | 
				
			||||||
 | 
					  log: logs/sync.log
 | 
				
			||||||
 | 
					  sync:
 | 
				
			||||||
 | 
					    - ALL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defaults:
 | 
				
			||||||
  type: rsync
 | 
					  type: rsync
 | 
				
			||||||
  scripts:
 | 
					  scripts:
 | 
				
			||||||
    pre:
 | 
					    pre:
 | 
				
			||||||
    # - ./scripts/cleanup.sh
 | 
					 | 
				
			||||||
    fail:
 | 
					    fail:
 | 
				
			||||||
      - ./scripts/alert.sh
 | 
					      - scripts/alert.sh
 | 
				
			||||||
    post:
 | 
					    post:
 | 
				
			||||||
      - ./script/index.py
 | 
					      - scripts/index.py
 | 
				
			||||||
    # - ./script/rotate_log.py
 | 
					  log: logs/${path}.log
 | 
				
			||||||
  log: ./logs/sync.log
 | 
					 | 
				
			||||||
  log_dir: ./logs/
 | 
					 | 
				
			||||||
  sync:
 | 
					 | 
				
			||||||
    - ALL
 | 
					 | 
				
			||||||
  rsync:
 | 
					  rsync:
 | 
				
			||||||
    options: "-rtlHpv --chmod=D0755,F0644 --partial --hard-links --safe-links --stats --delete --delete-after --delay-updates --max-delete=70000"
 | 
					    options: "-rtlHpv --chmod=D0755,F0644 --partial --hard-links --safe-links --stats --delete --delete-after --delay-updates --max-delete=70000"
 | 
				
			||||||
    exclude:
 | 
					    exclude:
 | 
				
			||||||
| 
						 | 
					@ -25,35 +31,32 @@ global:
 | 
				
			||||||
      - "*.links.tar.gz*"
 | 
					      - "*.links.tar.gz*"
 | 
				
			||||||
      - "/other"
 | 
					      - "/other"
 | 
				
			||||||
      - "/sources"
 | 
					      - "/sources"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
repos:
 | 
					repos:
 | 
				
			||||||
  ARCHLINUX:
 | 
					  ARCHLINUX:
 | 
				
			||||||
    url: rsync://mirrors.xtom.de/archlinux/
 | 
					    url: rsync://mirrors.xtom.de/archlinux/
 | 
				
			||||||
    duration: 4
 | 
					    duration: 4
 | 
				
			||||||
    name: "ArchLinux (x86_64)"
 | 
					    name: "ArchLinux (x86_64)"
 | 
				
			||||||
    path: archlinux
 | 
					    path: archlinux
 | 
				
			||||||
    log: ./logs/archlinux
 | 
					
 | 
				
			||||||
    last_sync: "2023-10-09T23:48Z"
 | 
					 | 
				
			||||||
  UBUNTU:
 | 
					  UBUNTU:
 | 
				
			||||||
    url: rsync://rsync.archive.ubuntu.com/ubuntu/
 | 
					    url: rsync://rsync.archive.ubuntu.com/ubuntu/
 | 
				
			||||||
    duration: 4
 | 
					    duration: 4
 | 
				
			||||||
    name: "Ubuntu"
 | 
					    name: "Ubuntu"
 | 
				
			||||||
    path: ubuntu
 | 
					    path: ubuntu
 | 
				
			||||||
    log: ./logs/ubuntu
 | 
					
 | 
				
			||||||
    last_sync: "2023-10-09T23:48Z"
 | 
					 | 
				
			||||||
  UBUNTU_CD:
 | 
					  UBUNTU_CD:
 | 
				
			||||||
    url: rsync://releases.ubuntu.com/releases/
 | 
					    url: rsync://releases.ubuntu.com/releases/
 | 
				
			||||||
    duration: 24
 | 
					    duration: 12
 | 
				
			||||||
    name: "Ubuntu Releases"
 | 
					    name: "Ubuntu Releases"
 | 
				
			||||||
    path: ubuntu_cd
 | 
					    path: ubuntu_cd
 | 
				
			||||||
    log: ./logs/ubuntu_cd
 | 
					
 | 
				
			||||||
    last_sync: "2023-10-09T23:48Z"
 | 
					 | 
				
			||||||
  UBUNTU_CD_OLD:
 | 
					  UBUNTU_CD_OLD:
 | 
				
			||||||
    url: rsync://old-releases.ubuntu.com/releases/
 | 
					    url: rsync://old-releases.ubuntu.com/releases/
 | 
				
			||||||
    duration: 24
 | 
					    duration: 12
 | 
				
			||||||
    name: "Ubuntu Releases (Old)"
 | 
					    name: "Ubuntu Releases (Old)"
 | 
				
			||||||
    path: ubuntu_cd_old
 | 
					    path: ubuntu_cd_old
 | 
				
			||||||
    log: ./logs/ubuntu_cd_old
 | 
					
 | 
				
			||||||
    last_sync: "2023-10-09T23:48Z"
 | 
					 | 
				
			||||||
  DEBIAN:
 | 
					  DEBIAN:
 | 
				
			||||||
    url: rsync://mirrors.xtom.jp/debian/
 | 
					    url: rsync://mirrors.xtom.jp/debian/
 | 
				
			||||||
    type: ftpsync
 | 
					    type: ftpsync
 | 
				
			||||||
| 
						 | 
					@ -61,50 +64,47 @@ repos:
 | 
				
			||||||
    name: Debian
 | 
					    name: Debian
 | 
				
			||||||
    path: debian
 | 
					    path: debian
 | 
				
			||||||
    scripts:
 | 
					    scripts:
 | 
				
			||||||
    # pre: ./scripts/pre_debian.sh
 | 
					    # pre: scripts/pre_debian.sh
 | 
				
			||||||
    last_sync: "2023-10-09T23:48Z"
 | 
					    last_sync: "2023-10-12T10:58Z"
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  DEBIAN_CD:
 | 
					  DEBIAN_CD:
 | 
				
			||||||
    url: rsync://ftp.lanet.kr/debian-cd/
 | 
					    url: rsync://ftp.lanet.kr/debian-cd/
 | 
				
			||||||
    duration: 24
 | 
					    duration: 12
 | 
				
			||||||
    name: "Debian CD"
 | 
					    name: "Debian CD"
 | 
				
			||||||
    path: debian_cd
 | 
					    path: debian_cd
 | 
				
			||||||
    log: ./logs/debian_cd
 | 
					  
 | 
				
			||||||
    last_sync: "2023-10-09T23:48Z"
 | 
					 | 
				
			||||||
  FEDORA:
 | 
					  FEDORA:
 | 
				
			||||||
    url: rsync://dl.fedoraproject.org/fedora-enchilada/linux/
 | 
					    url: rsync://dl.fedoraproject.org/fedora-enchilada/linux/
 | 
				
			||||||
    duration: 4
 | 
					    duration: 4
 | 
				
			||||||
    name: "Fedora"
 | 
					    name: "Fedora"
 | 
				
			||||||
    path: fedora
 | 
					    path: fedora
 | 
				
			||||||
    log: ./logs/fedora
 | 
					  
 | 
				
			||||||
    last_sync: "2023-10-09T23:30Z"
 | 
					 | 
				
			||||||
  RASPBIAN:
 | 
					  RASPBIAN:
 | 
				
			||||||
    url: rsync://archive.raspbian.org/archive/
 | 
					    url: rsync://archive.raspbian.org/archive/
 | 
				
			||||||
    duration: 6
 | 
					    duration: 6
 | 
				
			||||||
    name: "Raspbian"
 | 
					    name: "Raspbian"
 | 
				
			||||||
    path: raspbian
 | 
					    path: raspbian
 | 
				
			||||||
    log: ./logs/raspbian
 | 
					  
 | 
				
			||||||
    last_sync: "2023-10-09T23:30Z"
 | 
					 | 
				
			||||||
  MANJARO:
 | 
					  MANJARO:
 | 
				
			||||||
    url: rsync://ftp.riken.jp/manjaro/
 | 
					    url: rsync://ftp.riken.jp/manjaro/
 | 
				
			||||||
    duration: 4
 | 
					    duration: 4
 | 
				
			||||||
    name: Manjaro
 | 
					    name: Manjaro
 | 
				
			||||||
    path: manjaro
 | 
					    path: manjaro
 | 
				
			||||||
    log: ./logs/manjaro
 | 
					  
 | 
				
			||||||
    last_sync: "2023-10-09T23:30Z"
 | 
					 | 
				
			||||||
  ARCHLINUXARM:
 | 
					  ARCHLINUXARM:
 | 
				
			||||||
    name: "ArchLinux (ARM)"
 | 
					    name: "ArchLinux (ARM)"
 | 
				
			||||||
    path: archlinuxarm
 | 
					    path: archlinuxarm
 | 
				
			||||||
    url: http://jp.mirror.archlinuxarm.org/
 | 
					    url: http://jp.mirror.archlinuxarm.org/
 | 
				
			||||||
    type: http
 | 
					    type: http
 | 
				
			||||||
    duration: 12
 | 
					    duration: 12
 | 
				
			||||||
    last_sync: "2023-10-09T23:30Z"
 | 
					  
 | 
				
			||||||
  ASAHILINUX:
 | 
					  ASAHILINUX:
 | 
				
			||||||
    name: "AsahiLinux"
 | 
					    name: "AsahiLinux"
 | 
				
			||||||
    path: asahilinux
 | 
					    path: asahilinux
 | 
				
			||||||
    url: https://cdn.asahilinux.org/
 | 
					    url: https://cdn.asahilinux.org/
 | 
				
			||||||
    type: http
 | 
					    type: http
 | 
				
			||||||
    duration: 12
 | 
					    duration: 12
 | 
				
			||||||
    last_sync: "2023-10-09T23:30Z"
 | 
					
 | 
				
			||||||
index:
 | 
					index:
 | 
				
			||||||
  - ARCHLINUX
 | 
					  - ARCHLINUX
 | 
				
			||||||
  - UBUNTU UBUNTU_CD
 | 
					  - UBUNTU UBUNTU_CD
 | 
				
			||||||
| 
						 | 
					@ -115,4 +115,4 @@ index:
 | 
				
			||||||
  - DIVIDER
 | 
					  - DIVIDER
 | 
				
			||||||
  - ARCHLINUXARM
 | 
					  - ARCHLINUXARM
 | 
				
			||||||
  - ASAHILINUX
 | 
					  - ASAHILINUX
 | 
				
			||||||
  - UBUNTU_CD_OLD
 | 
					  - UBUNTU_CD_OLD
 | 
				
			||||||
| 
						 | 
					@ -6,22 +6,21 @@ import jinja2
 | 
				
			||||||
import datetime
 | 
					import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BASE_DIR = "."
 | 
					BASE_DIR = "."
 | 
				
			||||||
 | 
					 | 
				
			||||||
CONFIG_PATH = os.path.join(BASE_DIR, "scripts/config.yml")
 | 
					CONFIG_PATH = os.path.join(BASE_DIR, "scripts/config.yml")
 | 
				
			||||||
TEMPLATES_DIR = os.path.join(BASE_DIR, "scripts/templates")
 | 
					TEMPLATES_DIR = os.path.join(BASE_DIR, "scripts/templates")
 | 
				
			||||||
LOG_DIR = os.path.join(BASE_DIR, "logs")
 | 
					LOG_DIR = os.path.join(BASE_DIR, "logs")
 | 
				
			||||||
 | 
					SYNC_LOG = os.path.join(LOG_DIR, "sync.log")
 | 
				
			||||||
OUTPUT_PATH = os.path.join(BASE_DIR, "index.html")
 | 
					OUTPUT_PATH = os.path.join(BASE_DIR, "index.html")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# def get_last_sync(repo_name):
 | 
					def get_last_sync(repo_name):
 | 
				
			||||||
#     log_path = os.path.join(LOG_DIR, f"all.log")
 | 
					    if os.path.exists(SYNC_LOG):
 | 
				
			||||||
#     if os.path.exists(log_path):
 | 
					        with open(SYNC_LOG, 'r') as log_file:
 | 
				
			||||||
#         with open(log_path, 'r') as log_file:
 | 
					            log_all = reversed(log_file.readlines())
 | 
				
			||||||
#             log_all = reversed(log_file.readlines())
 | 
					            for logline in log_all:
 | 
				
			||||||
#             for logline in log_all:
 | 
					                dist, time, stat = logline.split()
 | 
				
			||||||
#                 time, stat, dist = logline.split()
 | 
					                if repo_name == dist and stat =="SUCCESS":
 | 
				
			||||||
#                 if repo_name == dist and stat =="DONE":
 | 
					                    return datetime.datetime.strptime(time, '%Y-%m-%dT%H:%MZ').strftime("%Y-%m-%d %H:%M")
 | 
				
			||||||
#                     return datetime.datetime.strptime(time, '%Y%m%d_%H%M').strftime("%Y-%m-%d %H:%M")
 | 
					    return "Not Synced"
 | 
				
			||||||
#     return "Not Synced"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# main()
 | 
					# main()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +50,8 @@ if __name__=="__main__":
 | 
				
			||||||
            context = {
 | 
					            context = {
 | 
				
			||||||
                'path': repo_data['path'],
 | 
					                'path': repo_data['path'],
 | 
				
			||||||
                'name': repo_data['name'],
 | 
					                'name': repo_data['name'],
 | 
				
			||||||
                'lastsync': repo_data.get('lastsync', "Not Synced"),
 | 
					                'lastsync': get_last_sync(repo_name),
 | 
				
			||||||
 | 
					                # 'lastsync': repo_data.get('lastsync', "Not Synced"),
 | 
				
			||||||
                'upstream': repo_data['url']
 | 
					                'upstream': repo_data['url']
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            print(context)
 | 
					            print(context)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										281
									
								
								scripts/sync.sh
								
								
								
								
							
							
						
						
									
										281
									
								
								scripts/sync.sh
								
								
								
								
							| 
						 | 
					@ -1,66 +1,109 @@
 | 
				
			||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONFIG_PATH="./scripts/config.yml"
 | 
					# Default locations.
 | 
				
			||||||
 | 
					CONFIG="./scripts/config.yml"
 | 
				
			||||||
YAML="./scripts/yq"
 | 
					YAML="./scripts/yq"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BASE_DIR=$($YAML eval ".BASE_DIR" "${CONFIG_PATH}")
 | 
					function usage() {
 | 
				
			||||||
TIMESTAMP=$(date '+%Y-%m-%dT%H:%MZ')
 | 
					    cat <<EOF
 | 
				
			||||||
 | 
					Usage: $0 [-c config_path] [-y yq_path]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Flags:
 | 
				
			||||||
 | 
					    -c, --config_path:      config file path
 | 
				
			||||||
 | 
					    -y, --yq:               yq binary path (>v4.35.2)
 | 
				
			||||||
 | 
					    -v, --verbose
 | 
				
			||||||
 | 
					      -> -b, --base-dir:         overrides base_dir
 | 
				
			||||||
 | 
					      -> -d, --dry-run:          dry run
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function error() {
 | 
				
			||||||
 | 
					    echo $0: "$1"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function debug() {
 | 
				
			||||||
 | 
					    if [[ -v DEBUG ]]; then
 | 
				
			||||||
 | 
					        echo debug: "$1"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function execute() {
 | 
				
			||||||
 | 
					    debug "Executing script: \"$@\""
 | 
				
			||||||
 | 
					    if [[ ! -v DRY_RUN ]]; then
 | 
				
			||||||
 | 
					        $@
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
parse_yaml() {
 | 
					parse_yaml() {
 | 
				
			||||||
    echo $($YAML eval ".$1" "${CONFIG_PATH}")
 | 
					    echo $($YAML eval ".$1" "${CONFIG}")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get_repo_config() {
 | 
				
			||||||
 | 
					    local LOCAL_CFG=$($YAML eval ".repos.$1.$2" "${CONFIG}")
 | 
				
			||||||
 | 
					    if [[ "$LOCAL_CFG" == "null" || "$LOCAL_CFG" == "" ]]; then
 | 
				
			||||||
 | 
					        echo $($YAML eval ".defaults.$2" "${CONFIG}");
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    echo $LOCAL_CFG
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # 1 if global 0 if local
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sync_repo() {
 | 
					sync_repo() {
 | 
				
			||||||
 | 
					 | 
				
			||||||
    local repo=$1
 | 
					    local repo=$1
 | 
				
			||||||
    local type=$(parse_yaml "repos.${repo}.type")
 | 
					    local name=$(get_repo_config ${repo} name)
 | 
				
			||||||
    local url=$(parse_yaml "repos.${repo}.url")
 | 
					    local type=$(get_repo_config ${repo} type)
 | 
				
			||||||
    local path=$(parse_yaml "repos.${repo}.path")
 | 
					    local url=$(get_repo_config ${repo} url)
 | 
				
			||||||
    local log=$(parse_yaml "repos.${repo}.log")
 | 
					    local path=$(get_repo_config ${repo} path)
 | 
				
			||||||
 | 
					    local log; log=$(get_repo_config ${repo} log) || log=${log/\${path\}/$path};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ "$type" == "null" ]]; then
 | 
					    if [[ "$type" == "null" || "$url" == "null" || "$path" == "null" || "$log" == "null" ]]; then
 | 
				
			||||||
        type=$(parse_yaml "global.type")
 | 
					        echo "Error config wrong."
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ "$log" == "null" ]]; then
 | 
					 | 
				
			||||||
        log="$(parse_yaml "global.log_dir")$path"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    log=$(realpath $log)
 | 
					 | 
				
			||||||
    path="${BASE_DIR}/$path/"
 | 
					    path="${BASE_DIR}/$path/"
 | 
				
			||||||
    echo -e "----\n|  Repo: $repo\n|  Type: $type\n|  Upstream: $url\n|  Path: $path\n|  Log: $log\n----"
 | 
					    log="${BASE_DIR}/$log"
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    rotate_log $log
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case $type in
 | 
					    echo -e "--------\nRepo:      $name\nType:      $type\nUpstream:  $url\nPath:      $path\nLog:       $log\n--------"
 | 
				
			||||||
        "rsync")
 | 
					 | 
				
			||||||
            local rsync_options=$(parse_yaml 'global.rsync.options')
 | 
					 | 
				
			||||||
            local exclude_list=($(parse_yaml 'global.rsync.exclude[]'))
 | 
					 | 
				
			||||||
            local exclude=""
 | 
					 | 
				
			||||||
            for ex in "${exclude_list[@]}"; do
 | 
					 | 
				
			||||||
                exclude="${exclude} --exclude='${ex}'"
 | 
					 | 
				
			||||||
            done
 | 
					 | 
				
			||||||
            echo rsync ${rsync_options} ${exclude} $url $path >> $log
 | 
					 | 
				
			||||||
            rsync ${rsync_options} ${exclude} $url $path >> $log 2>> ${log}-error
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "ftpsync")
 | 
					 | 
				
			||||||
            cd ${BASE_DIR}/scripts
 | 
					 | 
				
			||||||
            export BASE_DIR=${BASE_DIR}
 | 
					 | 
				
			||||||
            ./ftpsync >> $log 2>> ${log}-error
 | 
					 | 
				
			||||||
            cd ${BASE_DIR}
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "http")
 | 
					 | 
				
			||||||
            echo ${repo} Fetch >> $log 2>> ${log}-error
 | 
					 | 
				
			||||||
            python3 -u $BASE_DIR/scripts/getFetch.py "${url}" $path $BASE_DIR/scripts/${path}.fetch >> $log 2>> ${log}-error
 | 
					 | 
				
			||||||
            echo ${repo} Download >> $log 2>> ${log}-error
 | 
					 | 
				
			||||||
            python3 -u $BASE_DIR/scripts/getFile.py $BASE_DIR/scripts/${path}.fetch >> $log 2>> ${log}-error
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            echo "Unknown type $type for $repo." | tee ${log}-error
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    clean_log $log
 | 
					    if [[ ! -v DRY_RUN ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        rotate_log $log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case $type in
 | 
				
			||||||
 | 
					            "rsync")
 | 
				
			||||||
 | 
					                local rsync_options=$(get_repo_config $repo 'rsync.options')
 | 
				
			||||||
 | 
					                local exclude_list=($(get_repo_config $repo 'rsync.exclude[]'))
 | 
				
			||||||
 | 
					                local exclude=""
 | 
				
			||||||
 | 
					                for ex in "${exclude_list[@]}"; do
 | 
				
			||||||
 | 
					                    exclude="${exclude} --exclude='${ex}'"
 | 
				
			||||||
 | 
					                done
 | 
				
			||||||
 | 
					                echo rsync ${rsync_options} ${exclude} $url $path >> $log
 | 
				
			||||||
 | 
					                rsync ${rsync_options} ${exclude} $url $path >> $log 2>> ${log}-error
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            "ftpsync")
 | 
				
			||||||
 | 
					                cd ${BASE_DIR}/scripts
 | 
				
			||||||
 | 
					                export BASE_DIR=${BASE_DIR}
 | 
				
			||||||
 | 
					                ./ftpsync >> $log 2>> ${log}-error
 | 
				
			||||||
 | 
					                cd ${BASE_DIR}
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            "http")
 | 
				
			||||||
 | 
					                echo ${repo} Fetch >> $log 2>> ${log}-error
 | 
				
			||||||
 | 
					                python3 -u $BASE_DIR/scripts/getFetch.py "${url}" $path $BASE_DIR/scripts/${path}.fetch >> $log 2>> ${log}-error
 | 
				
			||||||
 | 
					                echo ${repo} Download >> $log 2>> ${log}-error
 | 
				
			||||||
 | 
					                python3 -u $BASE_DIR/scripts/getFile.py $BASE_DIR/scripts/${path}.fetch >> $log 2>> ${log}-error
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            *)
 | 
				
			||||||
 | 
					                echo "Unknown type $type for $repo." | tee ${log}-error
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        clean_log $log
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rotate_log() {
 | 
					rotate_log() {
 | 
				
			||||||
| 
						 | 
					@ -92,50 +135,158 @@ clean_log() {
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function global_log() {
 | 
				
			||||||
 | 
					    GLOBAL_LOG_FILE="$(parse_yaml 'global.log')"
 | 
				
			||||||
 | 
					    echo "$1 $TIMESTAMP SUCCESS" >> $GLOBAL_LOG_FILE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function global_log_error() {
 | 
				
			||||||
 | 
					    GLOBAL_LOG_FILE="$(parse_yaml 'global.log')"
 | 
				
			||||||
 | 
					    echo "$1 $TIMESTAMP ERROR" >> $GLOBAL_LOG_FILE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##########
 | 
					##########
 | 
				
			||||||
#  Main  # 
 | 
					#  Main  # 
 | 
				
			||||||
##########
 | 
					##########
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo Started job $TIMESTAMP..
 | 
					while [ "$1" != "" ]; do
 | 
				
			||||||
 | 
					    case $1 in
 | 
				
			||||||
global_pre_scripts=($(parse_yaml 'global.scripts.pre[]'))
 | 
					    -c | --config)
 | 
				
			||||||
for script in "${global_pre_scripts[@]}"; do
 | 
					        shift
 | 
				
			||||||
    $script
 | 
					        if [[ -z $1 ]]; then
 | 
				
			||||||
 | 
					            error "option '-c' requires argument 'config_path'"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        CONFIG=$1
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    -y | --yq)
 | 
				
			||||||
 | 
					        shift
 | 
				
			||||||
 | 
					        if [[ -z $1 ]]; then
 | 
				
			||||||
 | 
					            error "option '-y' requires argument 'yq_path'"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        YAML=$1
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    -b | --base-dir)
 | 
				
			||||||
 | 
					        shift
 | 
				
			||||||
 | 
					        if [[ -z $1 ]]; then
 | 
				
			||||||
 | 
					            error "option '-b' requires argument 'base_dir'"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        BASE_DIR_OVERRIDE=$1
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    -h | --help)
 | 
				
			||||||
 | 
					        usage
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    -v | --verbose)
 | 
				
			||||||
 | 
					        DEBUG=1
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    -d | --dry-run)
 | 
				
			||||||
 | 
					        DRY_RUN=1
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    *)
 | 
				
			||||||
 | 
					        usage
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					    shift
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -v DEBUG ]]; then
 | 
				
			||||||
 | 
					    debug "DEBUG=1"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					if [[ -v DRY_RUN ]]; then
 | 
				
			||||||
 | 
					    debug "DRY_RUN=1"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					debug CONFIG="\"${CONFIG}\""
 | 
				
			||||||
 | 
					debug YQ="\"${YAML}\""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ ! -f ${CONFIG} ]]; then
 | 
				
			||||||
 | 
					    error "config not found."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ ! -f ${YAML} ]]; then
 | 
				
			||||||
 | 
					    error "yq not found."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BASE_DIR=$($YAML eval ".BASE_DIR" "${CONFIG}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -v DEBUG && -v BASE_DIR_OVERRIDE ]]; then
 | 
				
			||||||
 | 
					    debug "Overriding $BASE_DIR to $BASE_DIR_OVERRIDE"
 | 
				
			||||||
 | 
					    BASE_DIR="$BASE_DIR_OVERRIDE"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TIMESTAMP=$(date '+%Y-%m-%dT%H:%MZ')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					debug BASE_DIR="\"${BASE_DIR}\""
 | 
				
			||||||
 | 
					debug TIMESTAMP="\"${TIMESTAMP}\""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo Started job $TIMESTAMP..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd $BASE_DIR
 | 
				
			||||||
 | 
					# PRE
 | 
				
			||||||
 | 
					global_pre_scripts=($(parse_yaml 'global.scripts.pre[]'))
 | 
				
			||||||
 | 
					for script in "${global_pre_scripts[@]}"; do
 | 
				
			||||||
 | 
					    execute $BASE_DIR/$script
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
repos=($(parse_yaml 'global.sync[]'))
 | 
					repos=($(parse_yaml 'global.sync[]'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [[ "${repos[0]}" == "ALL" ]]; then
 | 
					if [[ "${repos[0]}" == "ALL" ]]; then
 | 
				
			||||||
    repos=($($YAML eval '.repos | keys| .[]' "${CONFIG_PATH}"))
 | 
					    repos=($($YAML eval '.repos | keys | .[]' "${CONFIG}"))
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
for repo in "${repos[@]}"; do
 | 
					for repo in "${repos[@]}"; do
 | 
				
			||||||
    echo Checking $repo...
 | 
					    cd $BASE_DIR
 | 
				
			||||||
    duration=$(parse_yaml "repos.${repo}.duration")
 | 
					    debug "Checking $repo..."
 | 
				
			||||||
    last_sync_timestamp=$(date -d "$(parse_yaml "repos.${repo}.last_sync")" +%s)
 | 
					    
 | 
				
			||||||
 | 
					    duration=$(get_repo_config ${repo} "duration")
 | 
				
			||||||
 | 
					    last_sync_timestamp=$(date -d "$(get_repo_config ${repo} "last_sync")" +%s)
 | 
				
			||||||
    next_sync_timestamp=$(( last_sync_timestamp + duration * 3600 ))
 | 
					    next_sync_timestamp=$(( last_sync_timestamp + duration * 3600 ))
 | 
				
			||||||
    next_sync_timestamp=1
 | 
					    
 | 
				
			||||||
 | 
					    if [[ -v DEBUG ]]; then
 | 
				
			||||||
 | 
					        next_sync_timestamp=1
 | 
				
			||||||
 | 
					        # read -p "Continue? " choice
 | 
				
			||||||
 | 
					        # case "$choice" in
 | 
				
			||||||
 | 
					        #     y) next_sync_timestamp=1;;
 | 
				
			||||||
 | 
					        #     *) continue;;
 | 
				
			||||||
 | 
					        # esac
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [ $next_sync_timestamp -le $(date +%s) ]; then
 | 
					    if [ $next_sync_timestamp -le $(date +%s) ]; then
 | 
				
			||||||
        echo "Lastsync $last_sync_timestamp"
 | 
					        debug "Lastsync was $last_sync_timestamp."
 | 
				
			||||||
        echo "Syncing $repo..."
 | 
					        echo "Syncing $repo..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        repo_pre_scripts=($(get_repo_config ${repo} "scripts.pre[]"))
 | 
				
			||||||
 | 
					        for script in "${repo_pre_scripts[@]}"; do
 | 
				
			||||||
 | 
					            execute $BASE_DIR/$script $repo
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sync_repo $repo
 | 
					        sync_repo $repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if [ $? -ne 0 ]; then
 | 
					        if [ $? -ne 0 ]; then
 | 
				
			||||||
            global_fail_scripts=($(parse_yaml 'global.scripts.fail[]'))
 | 
					            repo_fail_scripts=($(get_repo_config ${repo} "scripts.fail[]"))
 | 
				
			||||||
            for script in "${global_fail_scripts[@]}"; do
 | 
					            for script in "${repo_fail_scripts[@]}"; do
 | 
				
			||||||
                $script
 | 
					                execute $BASE_DIR/$script $repo
 | 
				
			||||||
            done
 | 
					            done
 | 
				
			||||||
            echo "Error syncing $repo"
 | 
					
 | 
				
			||||||
 | 
					            global_log_error $repo
 | 
				
			||||||
 | 
					            echo "Error during syncing $repo."
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            $YAML eval ".repos.${repo}.last_sync = \"$TIMESTAMP\"" -i "${CONFIG_PATH}"
 | 
					
 | 
				
			||||||
 | 
					            global_log $repo
 | 
				
			||||||
 | 
					            $YAML eval ".repos.${repo}.last_sync = \"$TIMESTAMP\"" -i "${CONFIG}"
 | 
				
			||||||
            echo "Successfully synced $repo."
 | 
					            echo "Successfully synced $repo."
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        repo_post_scripts=($(get_repo_config ${repo} "scripts.post[]"))
 | 
				
			||||||
 | 
					        for script in "${repo_post_scripts[@]}"; do
 | 
				
			||||||
 | 
					            execute $BASE_DIR/$script $repo
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# POST
 | 
				
			||||||
global_post_scripts=($(parse_yaml 'global.scripts.post[]'))
 | 
					global_post_scripts=($(parse_yaml 'global.scripts.post[]'))
 | 
				
			||||||
for script in "${global_post_scripts[@]}"; do
 | 
					for script in "${global_post_scripts[@]}"; do
 | 
				
			||||||
    $script
 | 
					    execute $BASE_DIR/$script
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo Ended job $TIMESTAMP..
 | 
					echo Ended job $TIMESTAMP..
 | 
				
			||||||
		Loading…
	
		Reference in New Issue