mirror of
https://github.com/morgan9e/mirror
synced 2026-04-14 00:14:15 +09:00
Init
This commit is contained in:
105
base.html
Normal file
105
base.html
Normal file
@@ -0,0 +1,105 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Mirror Archive</title>
|
||||
<style>
|
||||
body {
|
||||
font-size: 1.1em;
|
||||
margin: 0;
|
||||
margin-top: 6em;
|
||||
padding: 0;
|
||||
}
|
||||
table, th, td {
|
||||
border: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th + th, td + td {
|
||||
padding: 6px 16px;
|
||||
}
|
||||
th, td {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
h2, h3 {
|
||||
margin-bottom: 0.4em;
|
||||
}
|
||||
footer {
|
||||
margin-top: 1.5em;
|
||||
font-size: 0.75em;
|
||||
}
|
||||
.container {
|
||||
width: 80%;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 0 20px;
|
||||
}
|
||||
.details {
|
||||
line-height: 1.8;
|
||||
}
|
||||
.subtitle {
|
||||
font-style: italic;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<h2>Mirror Archive</h2>
|
||||
</header>
|
||||
<main>
|
||||
<div class="mirrorList">
|
||||
<h3>Archive List</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Last Updated (UTC)</th>
|
||||
<th>Sync Time</th>
|
||||
<th>Source</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="/archlinux">/archlinux</a></td>
|
||||
<td>@@archlinux@@</td>
|
||||
<td>rsync://mirror.constant.com/archlinux</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/debian">/debian</a></td>
|
||||
<td>@@debian@@</td>
|
||||
<td>rsync://mirrors.xtom.com/debian</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/debian-cd">/debian-cd</a></td>
|
||||
<td>@@debian_cd@@</td>
|
||||
<td>rsync://mirrors.xtom.com/debian-cd</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/fedora">/fedora</a></td>
|
||||
<td>@@fedora@@</td>
|
||||
<td>rsync://dl.fedoraproject.org/fedora-enchilada</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/rpmfusion">/rpmfusion</a></td>
|
||||
<td>@@rpmfusion@@</td>
|
||||
<td>rsync://download1.rpmfusion.org/rpmfusion</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="details">
|
||||
<h3>Server Details</h3>
|
||||
<strong>Location:</strong> Seoul, Korea<br>
|
||||
<strong>Bandwidth:</strong> 1 Gbps ~ 100 Mbps<br>
|
||||
<strong>Sync delay:</strong> ~ 4 hours <br>
|
||||
<strong>Contact:</strong> <a href="">mirror[at]devpg[d0t]net</a><br>
|
||||
</div>
|
||||
<footer>
|
||||
Maintained by Av from Korea <span style="font-size: 0.65em">🏳️🌈🏳️⚧️</span>
|
||||
</footer>
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
54
dosync.sh
Normal file
54
dosync.sh
Normal file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
TIMENOW=$(date '+%Y-%m-%d_%H:%M:%S');
|
||||
LOCKFILE="/srv/mirror/scripts/.lock";
|
||||
WAITLIMIT=30;
|
||||
LOGFILE="/srv/mirror/logs/current.log"
|
||||
SYNCLOG="/srv/mirror/logs/master.log"
|
||||
|
||||
cleanup() {
|
||||
echo "Cleaning up...";
|
||||
rm -f "$LOCKFILE";
|
||||
exit;
|
||||
}
|
||||
|
||||
trap cleanup INT TERM KILL EXIT
|
||||
|
||||
if [ -f $LOCKFILE ]; then
|
||||
echo "Previous session $(cat $LOCKFILE) exists." | tee -a ${SYNCLOG}
|
||||
while [ $WAITLIMIT -ne 0 ]; do
|
||||
echo "Waiting for previous session.. ${WAITLIMIT} tries left.." | tee -a ${SYNCLOG};
|
||||
sleep 60;
|
||||
WAITLIMIT=$(($WAITLIMIT-1));
|
||||
if [ ! -f $LOCKFILE ]; then
|
||||
break;
|
||||
fi
|
||||
done
|
||||
echo "Sync job at $TIMENOW blocked by previous job $(cat $LOCKFILE)." | tee -a ${SYNCLOG} >(/srv/mirror/scripts/alert.sh $(cat <&0))
|
||||
exit;
|
||||
fi
|
||||
|
||||
echo $$ > $LOCKFILE;
|
||||
|
||||
echo "Starting sync job at $TIMENOW, $$" | tee ${LOGFILE} | tee -a ${SYNCLOG}
|
||||
|
||||
{
|
||||
/srv/mirror/scripts/sync.sh archlinux &
|
||||
/srv/mirror/scripts/sync.sh debian &
|
||||
/srv/mirror/scripts/sync.sh rpmfusion &
|
||||
wait;
|
||||
|
||||
# /srv/mirror/scripts/sync.sh ubuntu_cd &
|
||||
# /srv/mirror/scripts/sync.sh ubuntu_cd_old &
|
||||
# /srv/mirror/scripts/sync.sh debian_cd &
|
||||
# wait;
|
||||
|
||||
# /srv/mirror/scripts/sync.sh linux &
|
||||
# wait;
|
||||
|
||||
} 2>&1 | tee -a ${LOGFILE} | tee -a ${SYNCLOG}
|
||||
|
||||
wait;
|
||||
echo Finished sync job $$ $TIMENOW at $(date '+%Y-%m-%d_%H:%M:%S') | tee -a ${LOGFILE} | tee -a ${SYNCLOG}
|
||||
|
||||
rm $LOCKFILE;
|
||||
52
ftpsync.conf
Normal file
52
ftpsync.conf
Normal file
@@ -0,0 +1,52 @@
|
||||
########################################################################
|
||||
########################################################################
|
||||
## This is a sample configuration file for the ftpsync mirror script. ##
|
||||
## Only options most users may need are included. For documentation ##
|
||||
## and all available options see ftpsync.conf(5). ##
|
||||
########################################################################
|
||||
########################################################################
|
||||
|
||||
BASE_DIR=${BASE_DIR-"/srv/mirror"}
|
||||
DATA_DIR=${DATA_DIR-"/srv/mirror/pub"}
|
||||
|
||||
echo $BASE_DIR $DATA_DIR
|
||||
|
||||
MIRRORNAME="mirror.morgan.kr"
|
||||
TO="${DATA_DIR}/debian"
|
||||
# MAILTO="$LOGNAME"
|
||||
HUB=false
|
||||
|
||||
########################################################################
|
||||
## Connection options
|
||||
########################################################################
|
||||
|
||||
RSYNC_HOST="mirrors.xtom.com"
|
||||
RSYNC_PATH="debian"
|
||||
# RSYNC_USER=
|
||||
# RSYNC_PASSWORD=
|
||||
|
||||
########################################################################
|
||||
## Mirror information options
|
||||
########################################################################
|
||||
|
||||
INFO_MAINTAINER="Morgan <mirror@morgan.kr>"
|
||||
# INFO_SPONSOR="Example <https://example.com>"
|
||||
INFO_COUNTRY=KR
|
||||
INFO_LOCATION="Seoul, Korea"
|
||||
INFO_THROUGHPUT=1Gb
|
||||
|
||||
########################################################################
|
||||
## Include and exclude options
|
||||
########################################################################
|
||||
|
||||
# ARCH_INCLUDE="amd64 arm64 riscv64 source"
|
||||
# ARCH_EXCLUDE=
|
||||
|
||||
########################################################################
|
||||
## Log option
|
||||
########################################################################
|
||||
|
||||
LOGDIR="${BASE_DIR}/logs"
|
||||
|
||||
UIPRETRIES=9
|
||||
TRACEHOST="mirror.morgan.kr"
|
||||
90
index.py
Normal file
90
index.py
Normal file
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import datetime
|
||||
|
||||
base_path = sys.argv[1]
|
||||
assert os.path.exists(base_path)
|
||||
|
||||
out_path = os.path.join(base_path, "pub/")
|
||||
log_path = os.path.join(base_path, "logs/all.log")
|
||||
template = os.path.join(base_path, "scripts/base.html")
|
||||
index = os.path.join(out_path, "index.html")
|
||||
|
||||
assert os.path.exists(log_path)
|
||||
assert os.path.exists(template)
|
||||
|
||||
with open(log_path, 'r') as f:
|
||||
log = f.read().splitlines()
|
||||
log.reverse()
|
||||
|
||||
with open(template, 'r') as f:
|
||||
html_file = f.read()
|
||||
|
||||
target_dists = re.findall("@@([^@@]+)@@", html_file)
|
||||
source_dists = set(line.split(" ")[2] for line in log)
|
||||
|
||||
print(target_dists)
|
||||
|
||||
status = {k: [[0, 0], 0, 0] for k in target_dists}
|
||||
|
||||
for target in target_dists:
|
||||
for line in log:
|
||||
time, stat, dist = (spl := line.split(" "))[:3]
|
||||
time = datetime.datetime.strptime(time, '%Y%m%d_%H%M')
|
||||
|
||||
if dist == target:
|
||||
if stat == "DONE":
|
||||
if not status[target][0][0]:
|
||||
status[target][0][0] = time
|
||||
if len(spl) == 5:
|
||||
status[target][0][1] = spl[4]
|
||||
|
||||
elif stat == "ERROR":
|
||||
if not status[target][1]:
|
||||
status[target][1] = time
|
||||
|
||||
elif stat == "STARTED":
|
||||
if not status[target][2]:
|
||||
status[target][2] = time
|
||||
|
||||
if status[target][0][0]:
|
||||
break
|
||||
|
||||
print(status)
|
||||
|
||||
error_tmpl = "<br><span style='color:red;font-size:12px'>{}</span>"
|
||||
|
||||
for target in status:
|
||||
# if status[target][1] exists, recently errored
|
||||
done = status[target][0]
|
||||
error = status[target][1]
|
||||
running = status[target][2]
|
||||
|
||||
HTML = done[0].strftime("%Y-%m-%d %H:00") if done[0] else "Not Synced"
|
||||
|
||||
if error and (error > running):
|
||||
HTML += error_tmpl.format(f'ERR {error.strftime("%Y-%m-%d %H:%M")}')
|
||||
|
||||
if running:
|
||||
HTML += error_tmpl.format(f'RUN {running.strftime("%Y-%m-%d %H:%M")}')
|
||||
|
||||
HTML += "</td><td>"
|
||||
|
||||
def sec_to_hum(sec):
|
||||
if sec >= 60:
|
||||
if sec >= 3600:
|
||||
return f"{sec//3600}h {(sec%3600)//60}m"
|
||||
return f"{sec//60}m {sec%60}s"
|
||||
return f"{sec}s"
|
||||
|
||||
HTML += sec_to_hum(int(done[1])) if done[1] else ""
|
||||
|
||||
html_file = html_file.replace(f"@@{target}@@", HTML)
|
||||
|
||||
with open(index, 'w') as f:
|
||||
f.write(html_file)
|
||||
|
||||
print("Written to index.html")
|
||||
1761
quick-fedora-mirror
Normal file
1761
quick-fedora-mirror
Normal file
File diff suppressed because it is too large
Load Diff
192
quick-fedora-mirror.conf
Normal file
192
quick-fedora-mirror.conf
Normal file
@@ -0,0 +1,192 @@
|
||||
# Configuration file for quick-fedora-mirror
|
||||
# This file is sourced by the shell and must be in valid sh syntax.
|
||||
|
||||
#### Required settings
|
||||
# Required: The the directory holding your copy of all of the modules you
|
||||
# mirror. Does not include any module name
|
||||
DESTD=/srv/mirror/pub/
|
||||
|
||||
# Required: The file in which to store the last mirror time.
|
||||
# Note: this really should not be in the repository itself.
|
||||
TIMEFILE=/srv/mirror/logs/qfs_lastsync
|
||||
|
||||
#### Settings Involving How and What to Mirror
|
||||
# The remote host to rsync from, not including a module name
|
||||
REMOTE=rsync://dl.fedoraproject.org
|
||||
|
||||
# The master module, which holds the other modules
|
||||
# Note that the mirror you pull from MUST have this master module. You cannot
|
||||
# use quick-fedora-mirror to pull from a host which does not have a master
|
||||
# module containing the other modules.
|
||||
MASTERMODULE=fedora-buffet
|
||||
|
||||
# Tier 1 Fedora mirrors should uncomment the following to get the proper
|
||||
# pre-bitflip content.
|
||||
# MASTERMODULE=fedora-buffet0
|
||||
# PREBITFLIP=1
|
||||
|
||||
# Define if the entire repository (all modules under fedora-buffet) should be
|
||||
# mirrored. If set, MODULES (below) is ignored
|
||||
# MIRRORBUFFET=
|
||||
|
||||
# An array containing the modules to be mirrored
|
||||
MODULES=(fedora-enchilada)
|
||||
|
||||
#### Filtering
|
||||
# A regular expression used to filter the file lists. It must be quoted (or
|
||||
# very carefully escaped). Entries matching this expression will not be synced
|
||||
# and are expected not to be present locally. They will also be ignored by
|
||||
# quick-fedora-hardlink. Cannot contain commas. Run against the file list that
|
||||
# includes sizes (by quick-fedora-mirror) and the fullfiletimelist (by
|
||||
# quick-fedora-hardlink), so don't use expressions that would match those
|
||||
# metadata (which are digit strings and single characters). Example is a heavy
|
||||
# filter which gives you an x86_64-only mirror with source packages, debuginfo
|
||||
# packages, Alpha and Beta releases, and most image files excluded.
|
||||
#FILTEREXP='(/i386|/armhfp|/source|/SRPMS|/debug/|\.iso|\.img|\.qcow2|\.raw\.xz|\.box|/releases/test)'
|
||||
FILTEREXP='(/i386|/armhfp|\.img|\.raw\.xz|\.box|/releases/test)'
|
||||
|
||||
#### Email
|
||||
# If you wish to receive email notices of transfers you can call this script
|
||||
# via cron, or configure the following. Note that email won't be sent if
|
||||
# quick-fedora-mirror is run interactively.
|
||||
|
||||
# Address to receive status email
|
||||
# EMAILDEST=
|
||||
|
||||
# Subject to use for messages
|
||||
# EMAILSUBJECT=
|
||||
|
||||
|
||||
#### Logging
|
||||
# Verbosity levels - info sent to stdout; usually this gets mailed to root when
|
||||
# being run by cron
|
||||
# 0 - quiet
|
||||
# 1 - quiet if no changes, otherwise basic transfer info
|
||||
# 2 - no -q to rsync
|
||||
# 3 - very slightly more verbosity
|
||||
# 4 - One -v to rsync
|
||||
# 5 - Another -v to rsync
|
||||
# 6 - Output of all settings
|
||||
# 7 - Add --progress to rsync
|
||||
# 8 - Shell script trace
|
||||
VERBOSE=5
|
||||
|
||||
# Define (to anything) to enable logging to the systemd journal (via
|
||||
# systemd-cat). the identifier "quick-fedora-mirror" is used, so logs can be
|
||||
# retrieved with: journalctl -t quick-fedora-mirror
|
||||
# LOGJOURNAL=
|
||||
|
||||
# Define to a full path to enable logging to that file.
|
||||
# The provided file must already exist and be writable.
|
||||
# Is only considered if LOGJOURNAL above is not defined.
|
||||
LOGFILE=/srv/mirror/logs/fedora-qs.log
|
||||
|
||||
# Logging fields - Each character selects a piece of information to log.
|
||||
# @ - Absolutely everything.
|
||||
# a - aborted run recovery
|
||||
# A - each recovered file from an aborted run
|
||||
# c - rsync calls
|
||||
# C - rsync call completions
|
||||
# d - File/directory deletion start/end
|
||||
# D - all file/directory deletes
|
||||
# e - minor errors
|
||||
# E - serious errors
|
||||
# F - all transferred files (not impl)
|
||||
# g - file list generation start/end
|
||||
# k - lock contention
|
||||
# l - per-module local file list generation (recursive find) start/end
|
||||
# L - file list generation counts
|
||||
# m - mirrormanager checkin
|
||||
# M - mirrormanager checkin detail
|
||||
# n - lack of updates in a run
|
||||
# N - lack of updates in a module
|
||||
# o - remote file list download start/end
|
||||
# p - module processing start/end
|
||||
# p - per-module module processing start/end
|
||||
# r - run start
|
||||
# R - run end
|
||||
# s - Basic transfer statistics
|
||||
# S - Detailed transfer statistics
|
||||
# t - directory time updates (not impl)
|
||||
# LOGITEMS=aeElrRs
|
||||
|
||||
#### Tuneables
|
||||
# Rsync timeout value, in seconds
|
||||
# Will be passed to rsync via --timeout.
|
||||
RSYNCTIMEOUT=600
|
||||
|
||||
# In some situations rsync may experience a bug which causes it to emit lines like the following:
|
||||
# WARNING: foo failed verification -- update put into partial-dir (will try again).
|
||||
# These will break transfers and will not go away. Define
|
||||
# RSYNC_PARTIAL_DIR_BUG (to anything) to work around this.
|
||||
# RSYNC_PARTIAL_DIR_BUG=
|
||||
|
||||
# When q-f-m fails to run becuse it is already running, it checks the time
|
||||
# since the last successful run. If that is larger than this value, it logs a
|
||||
# serious error. Thid helps to detect a hung run or issues with slow
|
||||
# transfers.
|
||||
# WARNDELAY=$((60 * 60 * 24)) # One day
|
||||
|
||||
# When q-f-m encounters an error calling rsync, it may (depending on the error)
|
||||
# sleep and retry. It will always sleep with exponential backup. Set
|
||||
# MAXRETRIES to limit the number of times it retries.
|
||||
MAXRETRIES=10
|
||||
|
||||
#### Important file and directory locations
|
||||
# curl binary (only if MirrorManager checkins are enabled; see below).
|
||||
# CURL=/usr/bin/curl
|
||||
|
||||
# rsync binary
|
||||
# RSYNC=/usr/bin/rsync
|
||||
|
||||
# mktemp will be called after this file is sourced to make a temporary
|
||||
# directory. This directory can contain a large amount of data, and that data
|
||||
# is specified by the server. If your /tmp is small and you are concerned
|
||||
# about the server potentially sending extra-huge files and filling things up,
|
||||
# you can set TMPDIR here.
|
||||
# TMPDIR=/srv/mirror/.tmp
|
||||
|
||||
#### Settings which most (Fedora) missors should not change
|
||||
# Mapping of MODULES to directory names, as an associative array
|
||||
# Fedora mirrors shouldn't change this
|
||||
# MODULEMAPPING=(fedora-alt alt fedora-archive archive
|
||||
# fedora-enchilada fedora fedora-epel epel)
|
||||
#
|
||||
# The name of the file holding the file list on the mirror host Note: the
|
||||
# string '$mdir' will be replaced with the name of the current module directory
|
||||
# in context, and so the '$' must be escaped or the string quoted.
|
||||
# FILELIST='fullfiletimelist-$mdir'
|
||||
|
||||
# An array of extra file lists to be transferred. They won't be processed, but
|
||||
# will implicitly be included in every transfer because file lists can't be
|
||||
# included in the file lists. '$mdir' is substituted as above.
|
||||
# Note that if you change this, you will want to do a run with -a to pick up
|
||||
# those extra files even in unchanged modules.
|
||||
EXTRAFILES=(fullfilelist imagelist-\$mdir)
|
||||
|
||||
# Array of default options to pass to rsync
|
||||
# Will be modified automatically according to VERBOSITY level; no need to set
|
||||
# -q, -v or --info here.
|
||||
#
|
||||
# You can add excludes here, but the script will always detect those files as
|
||||
# missing and will add them back to the file list. This may generate
|
||||
# complaints from rsync, but should not cause any problems, though it is almost
|
||||
# certainly better to use the provided FILTEREXP to do exclusion instead.
|
||||
#
|
||||
# Note that some of these options may be required for proper operation of the
|
||||
# script. You really should be careful if you change things here, as the
|
||||
# default value is carefully crafted and rsync can react in unexpected ways to
|
||||
# seeminly compatible sets of arguments.
|
||||
# RSYNCOPTS=(-aSH -f 'R .~tmp~' --stats --preallocate --delay-updates --out-format='@ %i %n%L')
|
||||
|
||||
# By default quick-fedora-mirror will try to detect and recover from an aborted
|
||||
# rsync run by moving any already downloaded files into place before
|
||||
# processing, Define NORSYNCRECOVERY (to anything) to prevent this.
|
||||
# NORSYNCRECOVERY=
|
||||
|
||||
# Define KEEPDIRTIMES (to anything) to make a third rsync call which restores
|
||||
# the timestamps of any directories which were modified after file removal.
|
||||
# This won't ensure that timestamps are always up to date, but its good enough
|
||||
# if you don't modify your repository locally. Maintaining directory
|
||||
# timestamps isn't important for mirroring in any case.
|
||||
# KEEPDIRTIMES=
|
||||
24
stat.sh
Normal file
24
stat.sh
Normal file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
echo "<h3><bold>$(date +%Y%m%d)</bold></h3><h4><bold>Log</bold></h4>"> /srv/mirror/pub/stat.html
|
||||
|
||||
AFILE="/var/log/nginx/mirror/access.log"
|
||||
|
||||
echo "<pre>$(/srv/mirror/scripts/ngparse.py html $AFILE)</pre>" >> /srv/mirror/pub/stat.html
|
||||
|
||||
echo "<h4><bold>Traffic</bold></h4>" >> /srv/mirror/pub/stat.html
|
||||
|
||||
vnstati -i enp1s0 -d --output /srv/mirror/pub/stat.jpg
|
||||
|
||||
echo "<img src='/stat.jpg'></img>" >> /srv/mirror/pub/stat.html
|
||||
|
||||
for i in /var/log/nginx/mirror/access.log-*;
|
||||
do
|
||||
DATE=${i#*-}
|
||||
if [ ! -f /srv/mirror/pub/stat/$DATE.html ]; then
|
||||
echo $DATE
|
||||
echo "<date>$DATE</date>" >> /srv/mirror/pub/stat/$DATE.html;
|
||||
echo "<pre>$(/srv/mirror/scripts/ngparse.py html $i)</pre>" >> /srv/mirror/pub/stat/$DATE.html
|
||||
echo "<br/><br/>" >> /srv/mirror/pub/stat/$DATE.html
|
||||
echo "<br/><br/>" >> /srv/mirror/pub/stat/$DATE.html
|
||||
fi
|
||||
done
|
||||
130
sync.sh
Normal file
130
sync.sh
Normal file
@@ -0,0 +1,130 @@
|
||||
#!/bin/bash
|
||||
|
||||
TIMENOW=$(date -u '+%Y%m%d_%H%M')
|
||||
BASE_DIR="/srv/mirror"
|
||||
ALERT="$BASE_DIR/scripts/alert.sh"
|
||||
DATA_DIR="$BASE_DIR/pub"
|
||||
|
||||
echo $TIMENOW $BASE_DIR $DATA_DIR $USER
|
||||
|
||||
if [[ "$USER" == "root" ]]; then
|
||||
echo "Dont run as root."
|
||||
sudo -u user $0 $@
|
||||
exit
|
||||
fi
|
||||
|
||||
# option="-rtlHpvi --chmod=D0755,F0644 --partial --hard-links --safe-links --stats --delete --delete-after --delay-updates --max-delete=70000 -P"
|
||||
|
||||
option="-rlptHS -B 8192 --chmod=D0755,F0644 --partial --hard-links --safe-links --delete-after --delay-updates --itemize-changes --delete --stats --no-i-r --verbose"
|
||||
# exclude="--exclude=.*.?????? --exclude='.~tmp~/' --exclude='Packages*' --exclude='Sources*' --exclude='Release*' --exclude='*.links.tar.gz*' --exclude='/other' --exclude='/sources'"
|
||||
|
||||
ubuntu="rsync://rsync.archive.ubuntu.com/ubuntu/"
|
||||
ubuntu_cd="rsync://releases.ubuntu.com/releases/"
|
||||
ubuntu_cd_old="rsync://old-releases.ubuntu.com/releases/"
|
||||
debian="rsync://mirrors.xtom.jp/debian/"
|
||||
debian_cd="rsync://ftp.riken.jp/debian-cd/"
|
||||
fedora="rsync://dl.fedoraproject.org/fedora-enchilada/linux/"
|
||||
epel="rsync://dl.fedoraproject.org/fedora-epel/"
|
||||
rpmfusion="rsync://download1.rpmfusion.org/rpmfusion/"
|
||||
archlinux="rsync://mirror.constant.com/archlinux/"
|
||||
raspbian="rsync://archive.raspbian.org/archive/"
|
||||
manjaro="rsync://ftp.riken.jp/manjaro/"
|
||||
gnu="rsync://ftp.gnu.org/gnu/"
|
||||
kali_images="rsync://repo.jing.rocks/kali-images"
|
||||
kali="rsync://repo.jing.rocks/kali"
|
||||
linux="rsync://rsync.kernel.org/pub/"
|
||||
fail="rsync://aa"
|
||||
|
||||
if [[ ! -v $1 ]]; then
|
||||
echo Not found.
|
||||
exit
|
||||
fi
|
||||
|
||||
ubuntu_cd_name="ubuntu-cd"
|
||||
debian_cd_name="debian-cd"
|
||||
ubuntu_cd_old_name="ubuntu-old"
|
||||
kali_images_name="kali-images"
|
||||
|
||||
dist=$1
|
||||
echo Syncing $1...
|
||||
set -o pipefail
|
||||
LASTLOG=`head -1 ${BASE_DIR}/logs/${dist}.log`
|
||||
|
||||
mv ${BASE_DIR}/logs/${dist}.log ${BASE_DIR}/logs/previous/${dist}-${LASTLOG}.log
|
||||
mv ${BASE_DIR}/logs/${dist}-error.log ${BASE_DIR}/logs/previous/${dist}-error-${LASTLOG}.log
|
||||
|
||||
if [[ -v ${dist}_name ]]; then
|
||||
dist_name_var="${dist}_name"
|
||||
dist_dir=${!dist_name_var}
|
||||
else
|
||||
dist_dir=$dist
|
||||
fi
|
||||
|
||||
echo ${TIMENOW} >> ${BASE_DIR}/logs/${dist}.log
|
||||
echo ${TIMENOW} >> ${BASE_DIR}/logs/${dist}-error.log
|
||||
echo "${TIMENOW}: Mirroring ${dist} from ${!dist} to ${DATA_DIR}/${dist}"
|
||||
echo "${TIMENOW} STARTED ${dist}" >> ${BASE_DIR}/logs/all.log
|
||||
TMEASURE=$(date +%s)
|
||||
TRY=3
|
||||
while [ $TRY -ne 0 ]; do
|
||||
echo Try $TRY...
|
||||
if [ "$dist" == "debian" ];
|
||||
then
|
||||
cd ${BASE_DIR}/scripts;
|
||||
export BASE_DIR=${BASE_DIR}
|
||||
export DATA_DIR=${DATA_DIR}
|
||||
./ftpsync
|
||||
EXIT=$?
|
||||
elif [ "$dist" == "fedora" ];
|
||||
then
|
||||
unset RSYNC_CONNECT_PROG
|
||||
# echo "Running stage 1 sync." | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
# echo "rsync -rlptHi --chmod=D0755,F0644 --safe-links --delete-delay --delay-updates --stats --progress -v --no-motd --log-file=rsync_fedora.log rsync://ftp.kaist.ac.kr/fedora /srv/mirror/pub/fedora/" | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
# rsync -rlptHi --chmod=D0755,F0644 --safe-links --delete-delay --delay-updates --stats --progress -v --no-motd --log-file=/srv/mirror/logs/rsync_fedora.log rsync://ftp.kaist.ac.kr/fedora /srv/mirror/pub/fedora/ 2> >(tee -a ${BASE_DIR}/logs/${dist}-error.log) | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
echo "Running via quick-fedora-mirror (Stage 1)." | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
cd ${BASE_DIR}/scripts;
|
||||
./quick-fedora-mirror 2> >(tee -a ${BASE_DIR}/logs/${dist}-error.log) | tee -a ${BASE_DIR}/logs/${dist}.log;
|
||||
EXIT=$?
|
||||
|
||||
echo "Running via quick-fedora-mirror (Stage 2)." | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
cd ${BASE_DIR}/scripts;
|
||||
FILTEREXP='(./development/rawhide/.*\.(iso|qcow2|img|raw\.xz)$)' \
|
||||
./quick-fedora-mirror 2> >(tee -a ${BASE_DIR}/logs/${dist}-error.log) | tee -a ${BASE_DIR}/logs/${dist}.log;
|
||||
else
|
||||
unset RSYNC_CONNECT_PROG
|
||||
if [ "$dist" == "kali_images" ];
|
||||
then
|
||||
# export RSYNC_CONNECT_PROG='ssh zhr0 nc %H 873'
|
||||
echo Connecting to RSYNC PROG
|
||||
fi
|
||||
echo "rsync ${option} ${exclude} ${!dist} ${DATA_DIR}/${dist_dir}" | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
rsync ${option} ${exclude} ${!dist} ${DATA_DIR}/${dist_dir} 2> >(tee -a ${BASE_DIR}/logs/${dist}-error.log) | tee -a ${BASE_DIR}/logs/${dist}.log
|
||||
EXIT=$?
|
||||
fi
|
||||
if [[ $EXIT == 0 ]]; then break; fi
|
||||
TRY=$(($TRY-1))
|
||||
done
|
||||
|
||||
if [ $EXIT -ne 0 ];
|
||||
then
|
||||
MSG="Sync ${dist} failed at ${TIMENOW}.\nLog: $(tail -n 1 ${BASE_DIR}/logs/${dist}-error.log)"
|
||||
if [ -f "$ALERT" ];
|
||||
then
|
||||
${ALERT} "${MSG}"
|
||||
fi
|
||||
|
||||
echo Sync ${dist} Error
|
||||
echo "${TIMENOW} ERROR ${dist}" >> ${BASE_DIR}/logs/all.log
|
||||
else
|
||||
echo Sync ${dist} Success
|
||||
if [ `echo ${BASE_DIR}/logs/${dist}-error.log | wc -l` -eq 1 ];
|
||||
then
|
||||
rm ${BASE_DIR}/logs/${dist}-error.log
|
||||
fi
|
||||
echo "${TIMENOW} DONE ${dist} $(date '+%Y%m%d_%H%M') $(($(date +%s)-$TMEASURE))" >> ${BASE_DIR}/logs/all.log
|
||||
cd $BASE_DIR
|
||||
echo "Updating Index"
|
||||
python3 -u ./scripts/index.py ${BASE_DIR}
|
||||
fi
|
||||
|
||||
exit;
|
||||
39
tmux.sh
Normal file
39
tmux.sh
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
SESSION_NAME=$1
|
||||
WINDOW_NAME=$2
|
||||
COMMAND=$3
|
||||
|
||||
export SHELL=/bin/bash
|
||||
|
||||
echo [$(date)] $SESSION_NAME $WINDOW_NAME \"$COMMAND\"
|
||||
|
||||
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
|
||||
|
||||
if tmux list-windows -t "$SESSION_NAME" | grep -q "$WINDOW_NAME"; then
|
||||
PANE_ID=$(tmux list-panes -t "$SESSION_NAME:$WINDOW_NAME" -F "#{pane_id}" | head -n 1)
|
||||
|
||||
if [ -n "$(ps -o state= -o comm= -t "$(tmux list-panes -F "#{pane_tty}" -t "$SESSION_NAME:$WINDOW_NAME" | head -n 1)" | grep -v -E '(bash|zsh|fish|sh|tmux)')" ]; then
|
||||
echo "ERROR-BUSY"
|
||||
exit 1
|
||||
|
||||
else
|
||||
echo "EXECUTE"
|
||||
tmux send-keys -t "$SESSION_NAME:$WINDOW_NAME" "$COMMAND" C-m
|
||||
fi
|
||||
|
||||
else
|
||||
echo "CREATE-WINDOW-EXECUTE"
|
||||
tmux new-window -t "$SESSION_NAME" -n "$WINDOW_NAME"
|
||||
tmux send-keys -t "$SESSION_NAME:$WINDOW_NAME" "$COMMAND" C-m
|
||||
fi
|
||||
|
||||
else
|
||||
echo "CREATE-SESSION-CREATE-WINDOW-EXECUTE"
|
||||
tmux new-session -d -s "$SESSION_NAME" -n "$WINDOW_NAME"
|
||||
tmux send-keys -t "$SESSION_NAME:$WINDOW_NAME" "$COMMAND" C-m
|
||||
fi
|
||||
|
||||
# 0 */4 * * * /home/user/tmux.sh cron mirror "/srv/mirror/scripts/dosync.sh" | tee -a $HOME/cron.log
|
||||
# 0 */4 * * * /home/user/tmux.sh cron fedora "/srv/mirror/scripts/fedora-sync.sh" | tee -a $HOME/cron.log
|
||||
|
||||
Reference in New Issue
Block a user