Modified ftpsync
This commit is contained in:
		
							parent
							
								
									f93bca26ed
								
							
						
					
					
						commit
						9e5c24e082
					
				| 
						 | 
				
			
			@ -8,6 +8,8 @@ global:
 | 
			
		|||
    pre:
 | 
			
		||||
    post:
 | 
			
		||||
  log: logs/sync.log
 | 
			
		||||
  log_dir: logs/
 | 
			
		||||
  data_dir: pub/
 | 
			
		||||
  sync:
 | 
			
		||||
    - ALL
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +20,9 @@ defaults:
 | 
			
		|||
    fail:
 | 
			
		||||
      - scripts/alert.sh
 | 
			
		||||
    post:
 | 
			
		||||
      - scripts/index.py
 | 
			
		||||
      - scripts/index.py ${config}
 | 
			
		||||
  log: logs/${path}.log
 | 
			
		||||
  delay: 4
 | 
			
		||||
  rsync:
 | 
			
		||||
    options: "-rtlHpv --chmod=D0755,F0644 --partial --hard-links --safe-links --stats --delete --delete-after --delay-updates --max-delete=70000"
 | 
			
		||||
    exclude:
 | 
			
		||||
| 
						 | 
				
			
			@ -35,47 +38,44 @@ defaults:
 | 
			
		|||
repos:
 | 
			
		||||
  ARCHLINUX:
 | 
			
		||||
    url: rsync://mirrors.xtom.de/archlinux/
 | 
			
		||||
    delay: 4
 | 
			
		||||
    name: "ArchLinux (x86_64)"
 | 
			
		||||
    path: archlinux
 | 
			
		||||
 | 
			
		||||
  UBUNTU:
 | 
			
		||||
    url: rsync://rsync.archive.ubuntu.com/ubuntu/
 | 
			
		||||
    delay: 4
 | 
			
		||||
    name: "Ubuntu"
 | 
			
		||||
    path: ubuntu
 | 
			
		||||
 | 
			
		||||
  UBUNTU_CD:
 | 
			
		||||
    url: rsync://releases.ubuntu.com/releases/
 | 
			
		||||
    delay: 12
 | 
			
		||||
    name: "Ubuntu Releases"
 | 
			
		||||
    delay: 6
 | 
			
		||||
    path: ubuntu_cd
 | 
			
		||||
 | 
			
		||||
  UBUNTU_CD_OLD:
 | 
			
		||||
    url: rsync://old-releases.ubuntu.com/releases/
 | 
			
		||||
    delay: 12
 | 
			
		||||
    name: "Ubuntu Releases (Old)"
 | 
			
		||||
    delay: 12
 | 
			
		||||
    path: ubuntu_cd_old
 | 
			
		||||
 | 
			
		||||
  DEBIAN:
 | 
			
		||||
    url: rsync://mirrors.xtom.jp/debian/
 | 
			
		||||
    url: rsync://mirrors.xtom.jp/
 | 
			
		||||
    type: ftpsync
 | 
			
		||||
    delay: 4
 | 
			
		||||
    name: Debian
 | 
			
		||||
    path: debian
 | 
			
		||||
    scripts:
 | 
			
		||||
 | 
			
		||||
    # pre: scripts/pre_debian.sh
 | 
			
		||||
    last_sync: "2023-10-12T10:58Z"
 | 
			
		||||
  
 | 
			
		||||
  DEBIAN_CD:
 | 
			
		||||
    url: rsync://ftp.lanet.kr/debian-cd/
 | 
			
		||||
    delay: 12
 | 
			
		||||
    delay: 6
 | 
			
		||||
    name: "Debian CD"
 | 
			
		||||
    path: debian_cd
 | 
			
		||||
  
 | 
			
		||||
  FEDORA:
 | 
			
		||||
    url: rsync://dl.fedoraproject.org/fedora-enchilada/linux/
 | 
			
		||||
    delay: 4
 | 
			
		||||
    name: "Fedora"
 | 
			
		||||
    path: fedora
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +87,6 @@ repos:
 | 
			
		|||
  
 | 
			
		||||
  MANJARO:
 | 
			
		||||
    url: rsync://ftp.riken.jp/manjaro/
 | 
			
		||||
    delay: 4
 | 
			
		||||
    name: Manjaro
 | 
			
		||||
    path: manjaro
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			@ -105,6 +104,18 @@ repos:
 | 
			
		|||
    type: http
 | 
			
		||||
    delay: 12
 | 
			
		||||
 | 
			
		||||
  GNU:
 | 
			
		||||
    name: "GNU"
 | 
			
		||||
    path: gnu
 | 
			
		||||
    url: rsync://ftp.gnu.org/gnu/
 | 
			
		||||
    delay: 12
 | 
			
		||||
 | 
			
		||||
  LINUX:
 | 
			
		||||
    name: "Linux Kernel"
 | 
			
		||||
    path: linux
 | 
			
		||||
    url: rsync://rsync.kernel.org/pub/
 | 
			
		||||
    delay: 12
 | 
			
		||||
 | 
			
		||||
index:
 | 
			
		||||
  - ARCHLINUX
 | 
			
		||||
  - UBUNTU UBUNTU_CD
 | 
			
		||||
| 
						 | 
				
			
			@ -115,4 +126,6 @@ index:
 | 
			
		|||
  - DIVIDER
 | 
			
		||||
  - ARCHLINUXARM
 | 
			
		||||
  - ASAHILINUX
 | 
			
		||||
  - GNU
 | 
			
		||||
  - LINUX
 | 
			
		||||
  - UBUNTU_CD_OLD
 | 
			
		||||
| 
						 | 
				
			
			@ -1,12 +1,12 @@
 | 
			
		|||
MIRRORNAME="pawe.me"
 | 
			
		||||
TO="${BASE_DIR}/debian"
 | 
			
		||||
MIRRORNAME="${DEB_HOST}"
 | 
			
		||||
TO="${DEB_PATH}"
 | 
			
		||||
HUB=false
 | 
			
		||||
RSYNC_HOST="mirrors.xtom.jp"
 | 
			
		||||
RSYNC_HOST="${DEB_UPSTREAM}"
 | 
			
		||||
RSYNC_PATH="debian"
 | 
			
		||||
INFO_MAINTAINER="Morgan <admin@pawe.me>"
 | 
			
		||||
INFO_COUNTRY=KR
 | 
			
		||||
INFO_LOCATION="Seoul, Korea"
 | 
			
		||||
INFO_THROUGHPUT=500Mb
 | 
			
		||||
LOGDIR="${BASE_DIR}/logs"
 | 
			
		||||
INFO_MAINTAINER="${DEB_ADMIN}"
 | 
			
		||||
INFO_COUNTRY="${DEB_COUNTRY}"
 | 
			
		||||
INFO_LOCATION="${DEB_LOCATION}"
 | 
			
		||||
INFO_THROUGHPUT=1Gbps
 | 
			
		||||
LOGDIR="${DEB_LOG}"
 | 
			
		||||
UIPRETRIES=9
 | 
			
		||||
TRACEHOST="PAWE.ME"
 | 
			
		||||
TRACEHOST="${DEB_HOST}"
 | 
			
		||||
| 
						 | 
				
			
			@ -5,29 +5,35 @@ import yaml
 | 
			
		|||
import jinja2
 | 
			
		||||
import datetime
 | 
			
		||||
 | 
			
		||||
BASE_DIR = "."
 | 
			
		||||
CONFIG_PATH = os.path.join(BASE_DIR, "scripts/config.yml")
 | 
			
		||||
TEMPLATES_DIR = os.path.join(BASE_DIR, "scripts/templates")
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
def get_last_sync(repo_name):
 | 
			
		||||
    if os.path.exists(SYNC_LOG):
 | 
			
		||||
        with open(SYNC_LOG, 'r') as log_file:
 | 
			
		||||
            log_all = reversed(log_file.readlines())
 | 
			
		||||
            for logline in log_all:
 | 
			
		||||
                dist, time, stat = logline.split()
 | 
			
		||||
                if repo_name == dist and stat =="SUCCESS":
 | 
			
		||||
                    return datetime.datetime.strptime(time, '%Y-%m-%dT%H:%MZ').strftime("%Y-%m-%d %H:%M")
 | 
			
		||||
    return "Not Synced"
 | 
			
		||||
# def get_last_sync(repo_name):
 | 
			
		||||
#     if os.path.exists(SYNC_LOG):
 | 
			
		||||
#         with open(SYNC_LOG, 'r') as log_file:
 | 
			
		||||
#             log_all = reversed(log_file.readlines())
 | 
			
		||||
#             for logline in log_all:
 | 
			
		||||
#                 dist, time, stat = logline.split()
 | 
			
		||||
#                 if repo_name == dist and stat =="SUCCESS":
 | 
			
		||||
#                     return datetime.datetime.strptime(time, '%Y-%m-%dT%H:%MZ').strftime("%Y-%m-%d %H:%M")
 | 
			
		||||
#     return "Not Synced"
 | 
			
		||||
 | 
			
		||||
# main()
 | 
			
		||||
 | 
			
		||||
if __name__=="__main__":
 | 
			
		||||
 | 
			
		||||
    if len(sys,argv) == 3:
 | 
			
		||||
        print(sys.argv)
 | 
			
		||||
 | 
			
		||||
    CONFIG_PATH = sys.argv[1]
 | 
			
		||||
 | 
			
		||||
    with open(CONFIG_PATH, 'r') as f:
 | 
			
		||||
        config = yaml.safe_load(f)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    BASE_DIR = config.get("BASE_DIR", ".")
 | 
			
		||||
    THEME = "new"
 | 
			
		||||
    TEMPLATES_DIR = os.path.join(os.path.join(BASE_DIR, "scripts/templates"), THEME)
 | 
			
		||||
    LOG_DIR = os.path.join(BASE_DIR, config['global'].get("log_dir", "logs"))
 | 
			
		||||
    OUTPUT_PATH = os.path.join(os.path.join(BASE_DIR, config['global'].get("data_dir", ".")), "index.html")
 | 
			
		||||
 | 
			
		||||
    env = jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATES_DIR))
 | 
			
		||||
    base_template = env.get_template('base.html')
 | 
			
		||||
    full_template = env.get_template('full.html')
 | 
			
		||||
| 
						 | 
				
			
			@ -50,8 +56,8 @@ if __name__=="__main__":
 | 
			
		|||
            context = {
 | 
			
		||||
                'path': repo_data['path'],
 | 
			
		||||
                'name': repo_data['name'],
 | 
			
		||||
                'lastsync': get_last_sync(repo_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']
 | 
			
		||||
            }
 | 
			
		||||
            print(context)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,91 @@
 | 
			
		|||
user user;
 | 
			
		||||
worker_processes auto;
 | 
			
		||||
pid /run/nginx.pid;
 | 
			
		||||
include /etc/nginx/modules-enabled/*.conf;
 | 
			
		||||
 | 
			
		||||
events {
 | 
			
		||||
	worker_connections 768;
 | 
			
		||||
	# multi_accept on;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
http {
 | 
			
		||||
 | 
			
		||||
	##
 | 
			
		||||
	# Basic Settings
 | 
			
		||||
	##
 | 
			
		||||
 | 
			
		||||
	sendfile on;
 | 
			
		||||
	tcp_nopush on;
 | 
			
		||||
	types_hash_max_size 2048;
 | 
			
		||||
	# server_tokens off;
 | 
			
		||||
 | 
			
		||||
	# server_names_hash_bucket_size 64;
 | 
			
		||||
	# server_name_in_redirect off;
 | 
			
		||||
 | 
			
		||||
	include /etc/nginx/mime.types;
 | 
			
		||||
	default_type application/octet-stream;
 | 
			
		||||
 | 
			
		||||
	##
 | 
			
		||||
	# SSL Settings
 | 
			
		||||
	##
 | 
			
		||||
 | 
			
		||||
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
 | 
			
		||||
	ssl_prefer_server_ciphers on;
 | 
			
		||||
 | 
			
		||||
	##
 | 
			
		||||
	# Logging Settings
 | 
			
		||||
	##
 | 
			
		||||
 | 
			
		||||
	log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
 | 
			
		||||
                                '$status $body_bytes_sent "$http_referer" '
 | 
			
		||||
                                '"$http_user_agent" "$http_x_forwarded_for" '
 | 
			
		||||
                                '"$host" sn="$server_name" ' 'rt=$request_time '
 | 
			
		||||
                                'ua="$upstream_addr" us="$upstream_status" '
 | 
			
		||||
                                'ut="$upstream_response_time" ul="$upstream_response_length" '
 | 
			
		||||
                                'cs=$upstream_cache_status' ;
 | 
			
		||||
 | 
			
		||||
	access_log /var/log/nginx/access.log;
 | 
			
		||||
	error_log /var/log/nginx/error.log;
 | 
			
		||||
 | 
			
		||||
	##
 | 
			
		||||
	# Gzip Settings
 | 
			
		||||
	##
 | 
			
		||||
 | 
			
		||||
	gzip on;
 | 
			
		||||
 | 
			
		||||
	# gzip_vary on;
 | 
			
		||||
	# gzip_proxied any;
 | 
			
		||||
	# gzip_comp_level 6;
 | 
			
		||||
	# gzip_buffers 16 8k;
 | 
			
		||||
	# gzip_http_version 1.1;
 | 
			
		||||
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
 | 
			
		||||
 | 
			
		||||
	##
 | 
			
		||||
	# Virtual Host Configs
 | 
			
		||||
	##
 | 
			
		||||
 | 
			
		||||
	include /etc/nginx/conf.d/*.conf;
 | 
			
		||||
	include /etc/nginx/sites-enabled/*;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#mail {
 | 
			
		||||
#	# See sample authentication script at:
 | 
			
		||||
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
 | 
			
		||||
#
 | 
			
		||||
#	# auth_http localhost/auth.php;
 | 
			
		||||
#	# pop3_capabilities "TOP" "USER";
 | 
			
		||||
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
 | 
			
		||||
#
 | 
			
		||||
#	server {
 | 
			
		||||
#		listen     localhost:110;
 | 
			
		||||
#		protocol   pop3;
 | 
			
		||||
#		proxy      on;
 | 
			
		||||
#	}
 | 
			
		||||
#
 | 
			
		||||
#	server {
 | 
			
		||||
#		listen     localhost:143;
 | 
			
		||||
#		protocol   imap;
 | 
			
		||||
#		proxy      on;
 | 
			
		||||
#	}
 | 
			
		||||
#}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
server {
 | 
			
		||||
    listen 80 ;
 | 
			
		||||
    listen [::]:80 ;
 | 
			
		||||
    server_name repo.city;
 | 
			
		||||
    
 | 
			
		||||
    access_log /var/log/nginx/repo-city-access.log main_ext;
 | 
			
		||||
    error_log /var/log/nginx/repo-city-error.log  warn;
 | 
			
		||||
 
 | 
			
		||||
    root /srv/mirror;
 | 
			
		||||
 | 
			
		||||
    location /scripts/ {
 | 
			
		||||
        return 404;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    location / {
 | 
			
		||||
        autoindex on;
 | 
			
		||||
        fancyindex on;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
server {
 | 
			
		||||
    listen 127.0.0.1:80;
 | 
			
		||||
    server_name 127.0.0.1;
 | 
			
		||||
    location /nginx_status {
 | 
			
		||||
        stub_status on;
 | 
			
		||||
        access_log off;
 | 
			
		||||
        allow 127.0.0.1;
 | 
			
		||||
        deny all;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,10 +65,10 @@ sync_repo() {
 | 
			
		|||
        return
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    path="${BASE_DIR}/$path/"
 | 
			
		||||
    full_path="${BASE_DIR}/$(parse_yaml global.data_dir)/$path/"
 | 
			
		||||
    log="${BASE_DIR}/$log"
 | 
			
		||||
 | 
			
		||||
    echo -e "--------\nRepo:      $name\nType:      $type\nUpstream:  $url\nPath:      $path\nLog:       $log\n--------"
 | 
			
		||||
    echo -e "--------\nRepo:      $name\nType:      $type\nUpstream:  $url\nPath:      $full_path\nLog:       $log\n--------"
 | 
			
		||||
 | 
			
		||||
    if [[ ! -v DRY_RUN ]]; then
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -82,18 +82,26 @@ sync_repo() {
 | 
			
		|||
                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
 | 
			
		||||
                echo rsync ${rsync_options} ${exclude} $url $full_path >> $log
 | 
			
		||||
                rsync ${rsync_options} ${exclude} $url $full_path >> $log 2>> ${log}-error
 | 
			
		||||
                ;;
 | 
			
		||||
            "ftpsync")
 | 
			
		||||
                cd ${BASE_DIR}/scripts
 | 
			
		||||
                export BASE_DIR=${BASE_DIR}
 | 
			
		||||
 | 
			
		||||
                export DEB_ADMIN="Morgan <mirror@devpg.net>"
 | 
			
		||||
                export DEB_COUNTRY="Korea"
 | 
			
		||||
                export DEB_LOCATION="Korea/Seoul"
 | 
			
		||||
                export DEB_PATH="$full_path"
 | 
			
		||||
                export DEB_HOST="$(parse_yaml global.hostname)"
 | 
			
		||||
                export DEB_UPSTREAM="$url"
 | 
			
		||||
                export DEB_LOG="${BASE_DIR}/$(parse_yaml global.log_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
 | 
			
		||||
                python3 -u $BASE_DIR/scripts/getFetch.py "${url}" $full_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
 | 
			
		||||
                ;;
 | 
			
		||||
| 
						 | 
				
			
			@ -277,6 +285,7 @@ for repo in "${repos[@]}"; do
 | 
			
		|||
 | 
			
		||||
        repo_post_scripts=($(get_repo_config ${repo} "scripts.post[]"))
 | 
			
		||||
        for script in "${repo_post_scripts[@]}"; do
 | 
			
		||||
            script=${script/\${config\}/$CONFIG}
 | 
			
		||||
            execute $BASE_DIR/$script $repo
 | 
			
		||||
        done
 | 
			
		||||
    fi
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,99 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="UTF-8">
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
  <title>repo.city</title>
 | 
			
		||||
  <link rel="icon" type="image/x-icon" href="favicon.ico">
 | 
			
		||||
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans:wght@300;400;500;600;700;800;900&display=swap"
 | 
			
		||||
    rel="stylesheet">
 | 
			
		||||
  <script src="https://cdn.tailwindcss.com"></script>
 | 
			
		||||
  <script>
 | 
			
		||||
    tailwind.config = {
 | 
			
		||||
      darkMode: 'class'
 | 
			
		||||
    }
 | 
			
		||||
    // if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
 | 
			
		||||
    //  document.documentElement.classList.add('dark')
 | 
			
		||||
    if (localStorage.theme === 'dark') {
 | 
			
		||||
      document.documentElement.classList.add('dark')
 | 
			
		||||
    } else {
 | 
			
		||||
      document.documentElement.classList.remove('dark')
 | 
			
		||||
    }
 | 
			
		||||
  </script>
 | 
			
		||||
  <style>
 | 
			
		||||
    .url {
 | 
			
		||||
      font-style: italic;
 | 
			
		||||
      color: rgb(86, 105, 151);
 | 
			
		||||
    }
 | 
			
		||||
  </style>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body class="font-sans text-gray-900 bg-gray-100 py-12 px-6 mx-auto max-w-5xl dark:bg-gray-900">
 | 
			
		||||
  <header class="mb-10 ml-2">
 | 
			
		||||
    <h1 class="text-3xl font-bold mb-2 text-black dark:text-white">Welcome to <a href="https://repo.city"
 | 
			
		||||
                     class="text-blue-900 dark:text-blue-300 font-bold">REPO.CITY</a>!</h1>
 | 
			
		||||
    <h2 class="text-xl text-gray-600 dark:text-gray-300">Simple mirroring & archiving server.</h2>
 | 
			
		||||
  </header>
 | 
			
		||||
  <main>
 | 
			
		||||
    <section class="mb-12">
 | 
			
		||||
      <h2 class="dark:text-gray-200 text-2xl font-semibold mb-5 ml-2">Mirroring List</h2>
 | 
			
		||||
      <div id="mirrorList" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4">
 | 
			
		||||
 | 
			
		||||
        {{ repos }}
 | 
			
		||||
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </section>
 | 
			
		||||
    <section class="mb-12">
 | 
			
		||||
      <h2 class="dark:text-gray-200 text-2xl font-semibold mb-5 ml-2">Additional Mirror</h2>
 | 
			
		||||
      <!-- <button onclick="toggleView('httpView')" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded mb-4">View More</button> -->
 | 
			
		||||
      <div id="httpView" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4">
 | 
			
		||||
 | 
			
		||||
        {{ repos_more }}
 | 
			
		||||
 | 
			
		||||
        <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="/cd-image"
 | 
			
		||||
              class="text-blue-900 hover:text-blue-600 dark:text-blue-600 dark:hover:text-blue-400">Image Files</a></h3>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </section>
 | 
			
		||||
    <section class="ml-2">
 | 
			
		||||
      <h2 class="dark:text-gray-200 text-2xl font-semibold mb-4">Server Details</h2>
 | 
			
		||||
        <p class="mb-2 text-gray-800 dark:text-gray-500"><strong>Location:</strong> Seoul, Korea</p>
 | 
			
		||||
  <p class="mb-2 text-gray-800 dark:text-gray-500"><strong>Bandwidth:</strong> ~1Gbps</p>
 | 
			
		||||
  <p class="mb-2 text-gray-800 dark:text-gray-500"><strong>Storage size:</strong> 32TiB</p>
 | 
			
		||||
  <p class="mb-2 text-gray-800 dark:text-gray-500"><strong>Sync delay:</strong> 4hrs</p>  
 | 
			
		||||
  <p class="mb-2 text-gray-800 dark:text-gray-500"><strong>Contact:</strong> <a href="mailto:mirror@devpg.net">mirror@devpg.net</a></p>
 | 
			
		||||
  <p class="mb-2 text-gray-800 dark:text-gray-500"><strong>Maintainer:</strong> <a href="https://github.com/morgan9e">@morgan9e</a></p>
 | 
			
		||||
      <p class="text-gray-500 dark:text-gray-600 url">This mirror is based on <a href="https://github.com/morgan9e/reposync" class="text-blue-500 dark:text-blue-800">reposync</a>.</p>
 | 
			
		||||
      <p class="text-gray-500 dark:text-gray-600 url">For additional mirroring requests, please contact me at email above.</p>
 | 
			
		||||
    </section>
 | 
			
		||||
    <button
 | 
			
		||||
      class="fixed bottom-6 right-6 bg-blue-200 hover:bg-blue-300 text-blue-700 dark:bg-blue-800 dark:hover:bg-blue-600 dark:text-white w-10 h-10 rounded-full flex items-center justify-center"
 | 
			
		||||
      onclick="toggleDarkMode()">
 | 
			
		||||
      +
 | 
			
		||||
    </button>
 | 
			
		||||
  </main>
 | 
			
		||||
 | 
			
		||||
  <footer class="mt-10 text-center text-gray-600">
 | 
			
		||||
    <a href="mailto:mirror@devpg.net">© REPO.CITY</a>
 | 
			
		||||
  </footer>
 | 
			
		||||
 | 
			
		||||
  <script>
 | 
			
		||||
    function toggleView(elementId) {
 | 
			
		||||
      const element = document.getElementById(elementId);
 | 
			
		||||
      element.style.display = element.style.display === "none" ? "block" : "none";
 | 
			
		||||
    }
 | 
			
		||||
    function toggleDarkMode() {
 | 
			
		||||
      if (document.documentElement.classList.contains('dark')) {
 | 
			
		||||
        document.documentElement.classList.remove('dark');
 | 
			
		||||
        localStorage.theme = 'light';
 | 
			
		||||
      } else {
 | 
			
		||||
        document.documentElement.classList.add('dark');
 | 
			
		||||
        localStorage.theme = 'dark';
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  </script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
<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="/{{path}}"
 | 
			
		||||
      class="text-blue-900 hover:text-blue-600 dark:text-blue-600 dark:hover:text-blue-400">{{name}}</a></h3>
 | 
			
		||||
  <p class="text-gray-600 dark:text-gray-300">Last Updated: {{lastsync}}</p>
 | 
			
		||||
  <p class="text-gray-600 dark:text-gray-300">Upstream: <span class="url">{{upstream}}</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
<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="/{{path}}"
 | 
			
		||||
      class="text-blue-900 hover:text-blue-600 dark:text-blue-600 dark:hover:text-blue-400">{{name}}</a></h3>
 | 
			
		||||
  <p class="text-gray-600 dark:text-gray-300">Last Updated: {{lastsync}}</p>
 | 
			
		||||
  <p class="text-gray-600 dark:text-gray-300">Upstream: <span class="url">{{upstream}}</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
		Loading…
	
		Reference in New Issue