This commit is contained in:
parent
7752a4a21a
commit
d2eeadba89
|
@ -0,0 +1,158 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>PAWE.ME</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')
|
||||||
|
} else {
|
||||||
|
document.documentElement.classList.remove('dark')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.url {
|
||||||
|
font-style: italic;
|
||||||
|
color: #5d7abf;
|
||||||
|
|
||||||
|
} </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">
|
||||||
|
<h1 class="text-4xl font-bold mb-2"><a href="http://PAWE.ME/"
|
||||||
|
class="text-blue-500 hover:text-blue-700">PAWE.ME</a></h1>
|
||||||
|
<h2 class="text-lg text-gray-600 dark:text-gray-300">Simple mirroring & archiving server.</h2>
|
||||||
|
<!-- <h2 class="text-lg text-blue-400 dark:text-blue-200 italic"><a href="#">Hide my Email</a>, <a href="#">Invidious</a>, <a href="#">Proxy</a>.</h2> -->
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<section class="mb-12">
|
||||||
|
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Mirroring List</h2>
|
||||||
|
<div id="mirrorList" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4">
|
||||||
|
<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"
|
||||||
|
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">Upstream: <span class="url">rsync://mirrors.xtom.de/archlinux/</span></p>
|
||||||
|
</div>
|
||||||
|
<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"
|
||||||
|
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">Upstream: <span class="url">rsync://rsync.archive.ubuntu.com/ubuntu/</span></p>
|
||||||
|
</div>
|
||||||
|
<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_cd"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Ubuntu Releases</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">Upstream: <span class="url">rsync://releases.ubuntu.com/releases/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/debian"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Debian</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">Upstream: <span class="url">rsync://mirrors.xtom.jp/debian/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/debian_cd"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Debian CD</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">Upstream: <span class="url">rsync://ftp.lanet.kr/debian-cd/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/fedora"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Fedora</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">Upstream: <span class="url">rsync://dl.fedoraproject.org/fedora-enchilada/linux/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/manjaro"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Manjaro</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">Upstream: <span class="url">rsync://ftp.riken.jp/manjaro/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/raspbian"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Raspbian</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">Upstream: <span class="url">rsync://archive.raspbian.org/archive/</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="mb-12">
|
||||||
|
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">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">
|
||||||
|
<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="/archlinuxarm"
|
||||||
|
class="text-blue-500 hover:text-blue-700">ArchLinux (ARM)</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">Upstream: <span class="url">http://jp.mirror.archlinuxarm.org/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/asahilinux"
|
||||||
|
class="text-blue-500 hover:text-blue-700">AsahiLinux</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">Upstream: <span class="url">https://cdn.asahilinux.org/</span></p>
|
||||||
|
</div>
|
||||||
|
<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="/ubuntu_cd_old"
|
||||||
|
class="text-blue-500 hover:text-blue-700">Ubuntu Releases (Old)</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">Upstream: <span class="url">rsync://old-releases.ubuntu.com/releases/</span></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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-500 hover:text-blue-700">Image Files</a></h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Server Info</h2>
|
||||||
|
<ul class="space-y-2 mb-5">
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">Xeon CPU</li>
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">64GiB Memory</li>
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">1Gbps Network, Seoul, Korea</li>
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">32TB Storage</li>
|
||||||
|
</ul>
|
||||||
|
<p class="text-gray-700 dark:text-gray-400 url">Fill out <a href="/form.html" class="text-blue-600 dark:text-blue-700">this</a> form to request additional mirroring.</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">© PAWE.ME</a>
|
||||||
|
<br/>
|
||||||
|
<a href="https://github.com/morgan9e/pawe.me"><i>source</i></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>
|
179
pub/index.html
179
pub/index.html
|
@ -1,179 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>PAWE.ME</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')
|
|
||||||
} 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">
|
|
||||||
<h1 class="text-4xl font-bold mb-2"><a href="http://PAWE.ME"
|
|
||||||
class="text-blue-500 hover:text-blue-700">PAWE.ME</a></h1>
|
|
||||||
<h2 class="text-lg text-gray-600 dark:text-gray-300">Simple mirroring & archiving server.</h2>
|
|
||||||
<h2 class="text-lg text-blue-400 dark:text-blue-200 italic"><a href="#">Hide my Email</a>, <a href="#">Invidious</a>, <a href="#">Proxy</a>.</h2>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<section class="mb-12">
|
|
||||||
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Mirroring List</h2>
|
|
||||||
<div id="mirrorList" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4">
|
|
||||||
|
|
||||||
<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"
|
|
||||||
class="text-blue-500 hover:text-blue-700">ArchLinux (x86_64)</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 08:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://mirror.rackspace.com/archlinux/</span></p>
|
|
||||||
</div>
|
|
||||||
<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"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Ubuntu</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 06:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://rsync.archive.ubuntu.com/ubuntu/</span></p>
|
|
||||||
</div>
|
|
||||||
<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_cd"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Ubuntu Releases</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 00:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://releases.ubuntu.com/releases/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/debian"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Debian</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 06:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span class="url">rsync://ftp.halifax.rwth-aachen.de/debian/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/debian_cd"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Debian Releases</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 00:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span class="url">rsync://ftp.lanet.kr/debian-cd/</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<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="/manjaro"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Manjaro</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 08:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://ftp.riken.jp/manjaro/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/raspbian"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Raspbian</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 08:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://archive.raspbian.org/archive/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/fedora"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Fedora</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">Source: <span
|
|
||||||
class="url">rsync://dl.fedoraproject.org/fedora-enchilada/linux/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/epel"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Epel</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">Source: <span
|
|
||||||
class="url">rsync://dl.fedoraproject.org/fedora-epel/</span></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
<section class="mb-12">
|
|
||||||
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">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">
|
|
||||||
<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="/archlinuxarm"
|
|
||||||
class="text-blue-500 hover:text-blue-700">ArchLinux (ARM)</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-07-07 00:50</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">http://jp.mirror.archlinuxarm.org/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/asahilinux"
|
|
||||||
class="text-blue-500 hover:text-blue-700">AsahiLinux</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-10-05 00:00</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span class="url">https://cdn.asahilinux.org/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/ubuntu_cd_old"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Ubuntu Releases (Old)</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: 2023-03-06 14:39</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://old-releases.ubuntu.com/releases/</span></p>
|
|
||||||
</div>
|
|
||||||
<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-500 hover:text-blue-700">Image Files</a></h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Server Info</h2>
|
|
||||||
<ul class="space-y-2 mb-5">
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">Xeon E5 CPU</li>
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">12GiB Memory</li>
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">750Mbps Network, Seoul, Korea</li>
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">18TB Storage</li>
|
|
||||||
</ul>
|
|
||||||
<p class="text-gray-500 dark:text-gray-600 url">Fill out <a href="/form.html" class="text-blue-500 dark:text-blue-800">this</a> form to request additional mirroring.</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">© PAWE.ME</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 @@
|
||||||
|
../index.html
|
|
@ -1,179 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>PAWE.ME</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')
|
|
||||||
} 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">
|
|
||||||
<h1 class="text-4xl font-bold mb-2"><a href="http://PAWE.ME"
|
|
||||||
class="text-blue-500 hover:text-blue-700">PAWE.ME</a></h1>
|
|
||||||
<h2 class="text-lg text-gray-600 dark:text-gray-300">Simple mirroring & archiving server.</h2>
|
|
||||||
<h2 class="text-lg text-blue-400 dark:text-blue-200 italic"><a href="#">Hide my Email</a>, <a href="#">Invidious</a>, <a href="#">Proxy</a>.</h2>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<section class="mb-12">
|
|
||||||
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Mirroring List</h2>
|
|
||||||
<div id="mirrorList" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-4">
|
|
||||||
|
|
||||||
<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"
|
|
||||||
class="text-blue-500 hover:text-blue-700">ArchLinux (x86_64)</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@archlinux@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://mirror.rackspace.com/archlinux/</span></p>
|
|
||||||
</div>
|
|
||||||
<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"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Ubuntu</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@ubuntu@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://rsync.archive.ubuntu.com/ubuntu/</span></p>
|
|
||||||
</div>
|
|
||||||
<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_cd"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Ubuntu Releases</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@ubuntu_cd@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://releases.ubuntu.com/releases/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/debian"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Debian</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@debian@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span class="url">rsync://ftp.halifax.rwth-aachen.de/debian/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/debian_cd"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Debian Releases</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@debian_cd@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span class="url">rsync://ftp.lanet.kr/debian-cd/</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<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="/manjaro"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Manjaro</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@manjaro@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://ftp.riken.jp/manjaro/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/raspbian"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Raspbian</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@raspbian@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://archive.raspbian.org/archive/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/fedora"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Fedora</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@fedora@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://dl.fedoraproject.org/fedora-enchilada/linux/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/epel"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Epel</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@epel@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://dl.fedoraproject.org/fedora-epel/</span></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
<section class="mb-12">
|
|
||||||
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">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">
|
|
||||||
<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="/archlinuxarm"
|
|
||||||
class="text-blue-500 hover:text-blue-700">ArchLinux (ARM)</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@archlinuxarm@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">http://jp.mirror.archlinuxarm.org/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/asahilinux"
|
|
||||||
class="text-blue-500 hover:text-blue-700">AsahiLinux</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@asahilinux@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span class="url">https://cdn.asahilinux.org/</span></p>
|
|
||||||
</div>
|
|
||||||
<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="/ubuntu_cd_old"
|
|
||||||
class="text-blue-500 hover:text-blue-700">Ubuntu Releases (Old)</a></h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Last Updated: @@ubuntu_cd_old@@</p>
|
|
||||||
<p class="text-gray-600 dark:text-gray-300">Source: <span
|
|
||||||
class="url">rsync://old-releases.ubuntu.com/releases/</span></p>
|
|
||||||
</div>
|
|
||||||
<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-500 hover:text-blue-700">Image Files</a></h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Server Info</h2>
|
|
||||||
<ul class="space-y-2 mb-5">
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">Xeon E5 CPU</li>
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">12GiB Memory</li>
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">750Mbps Network, Seoul, Korea</li>
|
|
||||||
<li class="text-gray-600 dark:text-gray-500">18TB Storage</li>
|
|
||||||
</ul>
|
|
||||||
<p class="text-gray-500 dark:text-gray-600 url">Fill out <a href="/form.html" class="text-blue-500 dark:text-blue-800">this</a> form to request additional mirroring.</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">© PAWE.ME</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,118 @@
|
||||||
|
BASE_DIR: /srv/mirror
|
||||||
|
ENV: ./scripts/.env
|
||||||
|
global:
|
||||||
|
type: rsync
|
||||||
|
scripts:
|
||||||
|
pre:
|
||||||
|
# - ./scripts/cleanup.sh
|
||||||
|
fail:
|
||||||
|
- ./scripts/alert.sh
|
||||||
|
post:
|
||||||
|
- ./script/index.py
|
||||||
|
# - ./script/rotate_log.py
|
||||||
|
log: ./logs/sync.log
|
||||||
|
log_dir: ./logs/
|
||||||
|
sync:
|
||||||
|
- ALL
|
||||||
|
rsync:
|
||||||
|
options: "-rtlHpv --chmod=D0755,F0644 --partial --hard-links --safe-links --stats --delete --delete-after --delay-updates --max-delete=70000"
|
||||||
|
exclude:
|
||||||
|
- ".*.??????"
|
||||||
|
- ".~tmp~/"
|
||||||
|
- "Packages*"
|
||||||
|
- "Sources*"
|
||||||
|
- "Release*"
|
||||||
|
- "*.links.tar.gz*"
|
||||||
|
- "/other"
|
||||||
|
- "/sources"
|
||||||
|
repos:
|
||||||
|
ARCHLINUX:
|
||||||
|
url: rsync://mirrors.xtom.de/archlinux/
|
||||||
|
duration: 4
|
||||||
|
name: "ArchLinux (x86_64)"
|
||||||
|
path: archlinux
|
||||||
|
log: ./logs/archlinux
|
||||||
|
last_sync: "2023-10-09T23:48Z"
|
||||||
|
UBUNTU:
|
||||||
|
url: rsync://rsync.archive.ubuntu.com/ubuntu/
|
||||||
|
duration: 4
|
||||||
|
name: "Ubuntu"
|
||||||
|
path: ubuntu
|
||||||
|
log: ./logs/ubuntu
|
||||||
|
last_sync: "2023-10-09T23:48Z"
|
||||||
|
UBUNTU_CD:
|
||||||
|
url: rsync://releases.ubuntu.com/releases/
|
||||||
|
duration: 24
|
||||||
|
name: "Ubuntu Releases"
|
||||||
|
path: ubuntu_cd
|
||||||
|
log: ./logs/ubuntu_cd
|
||||||
|
last_sync: "2023-10-09T23:48Z"
|
||||||
|
UBUNTU_CD_OLD:
|
||||||
|
url: rsync://old-releases.ubuntu.com/releases/
|
||||||
|
duration: 24
|
||||||
|
name: "Ubuntu Releases (Old)"
|
||||||
|
path: ubuntu_cd_old
|
||||||
|
log: ./logs/ubuntu_cd_old
|
||||||
|
last_sync: "2023-10-09T23:48Z"
|
||||||
|
DEBIAN:
|
||||||
|
url: rsync://mirrors.xtom.jp/debian/
|
||||||
|
type: ftpsync
|
||||||
|
duration: 4
|
||||||
|
name: Debian
|
||||||
|
path: debian
|
||||||
|
scripts:
|
||||||
|
# pre: ./scripts/pre_debian.sh
|
||||||
|
last_sync: "2023-10-09T23:48Z"
|
||||||
|
DEBIAN_CD:
|
||||||
|
url: rsync://ftp.lanet.kr/debian-cd/
|
||||||
|
duration: 24
|
||||||
|
name: "Debian CD"
|
||||||
|
path: debian_cd
|
||||||
|
log: ./logs/debian_cd
|
||||||
|
last_sync: "2023-10-09T23:48Z"
|
||||||
|
FEDORA:
|
||||||
|
url: rsync://dl.fedoraproject.org/fedora-enchilada/linux/
|
||||||
|
duration: 4
|
||||||
|
name: "Fedora"
|
||||||
|
path: fedora
|
||||||
|
log: ./logs/fedora
|
||||||
|
last_sync: "2023-10-09T23:30Z"
|
||||||
|
RASPBIAN:
|
||||||
|
url: rsync://archive.raspbian.org/archive/
|
||||||
|
duration: 6
|
||||||
|
name: "Raspbian"
|
||||||
|
path: raspbian
|
||||||
|
log: ./logs/raspbian
|
||||||
|
last_sync: "2023-10-09T23:30Z"
|
||||||
|
MANJARO:
|
||||||
|
url: rsync://ftp.riken.jp/manjaro/
|
||||||
|
duration: 4
|
||||||
|
name: Manjaro
|
||||||
|
path: manjaro
|
||||||
|
log: ./logs/manjaro
|
||||||
|
last_sync: "2023-10-09T23:30Z"
|
||||||
|
ARCHLINUXARM:
|
||||||
|
name: "ArchLinux (ARM)"
|
||||||
|
path: archlinuxarm
|
||||||
|
url: http://jp.mirror.archlinuxarm.org/
|
||||||
|
type: http
|
||||||
|
duration: 12
|
||||||
|
last_sync: "2023-10-09T23:30Z"
|
||||||
|
ASAHILINUX:
|
||||||
|
name: "AsahiLinux"
|
||||||
|
path: asahilinux
|
||||||
|
url: https://cdn.asahilinux.org/
|
||||||
|
type: http
|
||||||
|
duration: 12
|
||||||
|
last_sync: "2023-10-09T23:30Z"
|
||||||
|
index:
|
||||||
|
- ARCHLINUX
|
||||||
|
- UBUNTU UBUNTU_CD
|
||||||
|
- DEBIAN DEBIAN_CD
|
||||||
|
- FEDORA
|
||||||
|
- MANJARO
|
||||||
|
- RASPBIAN
|
||||||
|
- DIVIDER
|
||||||
|
- ARCHLINUXARM
|
||||||
|
- ASAHILINUX
|
||||||
|
- UBUNTU_CD_OLD
|
|
@ -49,8 +49,8 @@ def parseIndex(url, base = "", idx = 0, dirs = [], ret = []):
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
if len(sys.argv) != 3:
|
if len(sys.argv) != 3 and len(sys.argv) != 4:
|
||||||
print("Usage: createFetch.py [URL] [Path]")
|
print("Usage: createFetch.py [URL] [Path] (fetch)")
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
# urls = {"archlinuxarm": "http://jp.mirror.archlinuxarm.org/", "asahilinux": "https://cdn.asahilinux.org/", "linux-surface": "https://pkg.surfacelinux.com/arch/"}
|
# urls = {"archlinuxarm": "http://jp.mirror.archlinuxarm.org/", "asahilinux": "https://cdn.asahilinux.org/", "linux-surface": "https://pkg.surfacelinux.com/arch/"}
|
||||||
|
@ -73,6 +73,9 @@ if __name__ == "__main__":
|
||||||
files = parseIndex('', base = url, dirs = [bpath])
|
files = parseIndex('', base = url, dirs = [bpath])
|
||||||
filename = url.split('/')[2]+'.fetch'
|
filename = url.split('/')[2]+'.fetch'
|
||||||
|
|
||||||
|
if len(sys.argv) == 4:
|
||||||
|
filename = sys.argv[3]
|
||||||
|
|
||||||
with open(filename, 'w') as f:
|
with open(filename, 'w') as f:
|
||||||
f.write(json.dumps(files, indent=4))
|
f.write(json.dumps(files, indent=4))
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
TIMENOW=$(date '+%Y%m%d_%H%M')
|
|
||||||
BASE_DIR="/srv/mirror"
|
|
||||||
|
|
||||||
DIST_ARR=('archlinuxarm' 'asahilinux')
|
|
||||||
|
|
||||||
in=0
|
|
||||||
for di in "${DIST_ARR[@]}"
|
|
||||||
do
|
|
||||||
if [ "$di" == "$1" ]; then in=1; fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$in" -ne 1 ]; then
|
|
||||||
echo Not declared;exit;
|
|
||||||
fi
|
|
||||||
|
|
||||||
dist=$1
|
|
||||||
|
|
||||||
echo HTTP Mirroring ${dist} started at ${TIMENOW}.
|
|
||||||
echo "${TIMENOW} STARTED ${dist}" >> ${BASE_DIR}/logs/all.log
|
|
||||||
cd $BASE_DIR/scripts/http
|
|
||||||
|
|
||||||
echo ${dist} Fetch >> $BASE_DIR/logs/http.log
|
|
||||||
python3 -u $BASE_DIR/scripts/http/fetchFile.py ${dist} $BASE_DIR/${dist}/ >> $BASE_DIR/logs/${dist}.log 2>&1
|
|
||||||
echo ${dist} Download >> $BASE_DIR/logs/http.log
|
|
||||||
python3 -u $BASE_DIR/scripts/http/getFile.py $BASE_DIR/scripts/http/${dist}.fetch >> $BASE_DIR/logs/${dist}.log 2>&1
|
|
||||||
if [ $? -eq 0 ];
|
|
||||||
then
|
|
||||||
echo Sync ${dist} Success
|
|
||||||
echo "${TIMENOW} DONE ${dist}" >> ${BASE_DIR}/logs/all.log
|
|
||||||
cd $BASE_DIR
|
|
||||||
echo "Updating Index"
|
|
||||||
python3 -u ./scripts/index.py ${BASE_DIR}
|
|
||||||
fi
|
|
|
@ -1,48 +1,80 @@
|
||||||
import os, sys, re
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os, sys
|
||||||
|
import yaml
|
||||||
|
import jinja2
|
||||||
import datetime
|
import datetime
|
||||||
from pprint import pprint
|
|
||||||
|
|
||||||
base_path = sys.argv[1]
|
BASE_DIR = "."
|
||||||
assert os.path.exists(base_path)
|
|
||||||
|
|
||||||
log_path = os.path.join(base_path, "logs/all.log")
|
CONFIG_PATH = os.path.join(BASE_DIR, "scripts/config.yml")
|
||||||
assert os.path.exists(log_path)
|
TEMPLATES_DIR = os.path.join(BASE_DIR, "scripts/templates")
|
||||||
|
LOG_DIR = os.path.join(BASE_DIR, "logs")
|
||||||
|
OUTPUT_PATH = os.path.join(BASE_DIR, "index.html")
|
||||||
|
|
||||||
html_path = os.path.join(base_path, "scripts/base.html")
|
# def get_last_sync(repo_name):
|
||||||
index = os.path.join(base_path, "index.html")
|
# log_path = os.path.join(LOG_DIR, f"all.log")
|
||||||
assert os.path.exists(html_path)
|
# if os.path.exists(log_path):
|
||||||
|
# with open(log_path, 'r') as log_file:
|
||||||
|
# log_all = reversed(log_file.readlines())
|
||||||
|
# for logline in log_all:
|
||||||
|
# time, stat, dist = logline.split()
|
||||||
|
# if repo_name == dist and stat =="DONE":
|
||||||
|
# return datetime.datetime.strptime(time, '%Y%m%d_%H%M').strftime("%Y-%m-%d %H:%M")
|
||||||
|
# return "Not Synced"
|
||||||
|
|
||||||
with open(log_path, 'r') as f:
|
# main()
|
||||||
log_file = f.read().splitlines()
|
|
||||||
log_file.reverse()
|
|
||||||
|
|
||||||
with open(html_path, 'r') as f:
|
if __name__=="__main__":
|
||||||
html_file = f.read()
|
with open(CONFIG_PATH, 'r') as f:
|
||||||
dists = re.findall("@@([^@@]+)@@", html_file)
|
config = yaml.safe_load(f)
|
||||||
pprint(dists)
|
|
||||||
|
|
||||||
logs = {}
|
env = jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATES_DIR))
|
||||||
for dist in dists:
|
base_template = env.get_template('base.html')
|
||||||
logs[dist] = []
|
full_template = env.get_template('full.html')
|
||||||
|
half_template = env.get_template('half.html')
|
||||||
|
|
||||||
for logline in log_file:
|
main_repos = []
|
||||||
print(logline)
|
additional_repos = []
|
||||||
time, stat, dist = logline.split(" ")
|
|
||||||
if stat == "DONE":
|
|
||||||
time = datetime.datetime.strptime(time, '%Y%m%d_%H%M')
|
|
||||||
if dist in logs.keys():
|
|
||||||
logs[dist].append(time)
|
|
||||||
|
|
||||||
last = {}
|
DIV = 0
|
||||||
for dist in logs:
|
for line in config['index']:
|
||||||
if logs[dist]:
|
if line == "DIVIDER":
|
||||||
last[dist] = sorted(logs[dist])[-1].strftime("%Y-%m-%d %H:%M")
|
DIV = 1
|
||||||
|
continue
|
||||||
|
repos_line = line.split()
|
||||||
|
for repo_name in repos_line:
|
||||||
|
repo_data = config['repos'].get(repo_name)
|
||||||
|
if not repo_data:
|
||||||
|
continue
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'path': repo_data['path'],
|
||||||
|
'name': repo_data['name'],
|
||||||
|
'lastsync': repo_data.get('lastsync', "Not Synced"),
|
||||||
|
'upstream': repo_data['url']
|
||||||
|
}
|
||||||
|
print(context)
|
||||||
|
if len(repos_line) > 1:
|
||||||
|
(main_repos if not DIV else additional_repos).append(half_template.render(**context))
|
||||||
else:
|
else:
|
||||||
last[dist] = "Not Synced"
|
(main_repos if not DIV else additional_repos).append(full_template.render(**context))
|
||||||
pprint(last)
|
|
||||||
|
|
||||||
for dist in last:
|
html_output = base_template.render(
|
||||||
html_file = html_file.replace(f"@@{dist}@@", last[dist])
|
repos="\n".join(main_repos),
|
||||||
|
repos_more="\n".join(additional_repos)
|
||||||
|
)
|
||||||
|
|
||||||
with open(index, 'w') as f:
|
try:
|
||||||
f.write(html_file)
|
with open(OUTPUT_PATH, 'w') as f:
|
||||||
|
f.write(html_output)
|
||||||
|
|
||||||
|
except:
|
||||||
|
if len(sys.argv) == 2:
|
||||||
|
if os.path.exists(sys.argv[1]):
|
||||||
|
if not os.path.isdir(sys.argv[1]):
|
||||||
|
print(f"Writing to {sys.argv[1]}")
|
||||||
|
with open(sys.argv[1], 'w') as f:
|
||||||
|
f.write(html_output)
|
||||||
|
else:
|
||||||
|
print(html_output)
|
||||||
|
|
184
scripts/sync.sh
184
scripts/sync.sh
|
@ -1,79 +1,141 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
TIMENOW=$(date '+%Y%m%d_%H%M')
|
|
||||||
BASE_DIR="/srv/mirror"
|
|
||||||
ALERT=""
|
|
||||||
|
|
||||||
option="-rtlHpv --chmod=D0755,F0644 --partial --hard-links --safe-links --stats --delete --delete-after --delay-updates --max-delete=70000"
|
CONFIG_PATH="./scripts/config.yml"
|
||||||
|
YAML="./scripts/yq"
|
||||||
|
|
||||||
exclude="--exclude=.*.?????? --exclude='.~tmp~/' --exclude='Packages*' --exclude='Sources*' --exclude='Release*' --exclude='*.links.tar.gz*' --exclude='/other' --exclude='/sources'"
|
BASE_DIR=$($YAML eval ".BASE_DIR" "${CONFIG_PATH}")
|
||||||
|
TIMESTAMP=$(date '+%Y-%m-%dT%H:%MZ')
|
||||||
|
|
||||||
ubuntu="rsync://rsync.archive.ubuntu.com/ubuntu/"
|
parse_yaml() {
|
||||||
ubuntu_cd="rsync://releases.ubuntu.com/releases/"
|
echo $($YAML eval ".$1" "${CONFIG_PATH}")
|
||||||
ubuntu_cd_old="rsync://old-releases.ubuntu.com/releases/"
|
}
|
||||||
debian="rsync://mirrors.xtom.jp/debian/"
|
|
||||||
debian_cd="rsync://ftp.lanet.kr/debian-cd/"
|
|
||||||
fedora="rsync://dl.fedoraproject.org/fedora-enchilada/linux/"
|
|
||||||
epel="rsync://dl.fedoraproject.org/fedora-epel/"
|
|
||||||
fedora_cd=""
|
|
||||||
archlinux="rsync://mirror.rackspace.com/archlinux/"
|
|
||||||
raspbian="rsync://archive.raspbian.org/archive/"
|
|
||||||
manjaro="rsync://ftp.riken.jp/manjaro/"
|
|
||||||
|
|
||||||
DIST_ARR=('archlinux' 'debian' 'debian_cd' 'ubuntu' 'ubuntu_cd' 'ubuntu_cd_old' 'raspbian' 'epel' 'fedora' 'fedora_cd' 'manjaro')
|
sync_repo() {
|
||||||
|
|
||||||
in=0
|
local repo=$1
|
||||||
for di in "${DIST_ARR[@]}"
|
local type=$(parse_yaml "repos.${repo}.type")
|
||||||
do
|
local url=$(parse_yaml "repos.${repo}.url")
|
||||||
if [ "$di" == "$1" ]; then in=1; fi
|
local path=$(parse_yaml "repos.${repo}.path")
|
||||||
done
|
local log=$(parse_yaml "repos.${repo}.log")
|
||||||
|
|
||||||
if [ "$in" -ne 1 ]; then
|
if [[ "$type" == "null" ]]; then
|
||||||
echo Not declared;exit;
|
type=$(parse_yaml "global.type")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dist=$1
|
if [[ "$log" == "null" ]]; then
|
||||||
echo Syncing $1...
|
log="$(parse_yaml "global.log_dir")$path"
|
||||||
|
fi
|
||||||
|
|
||||||
LASTLOG=`head -1 ${BASE_DIR}/logs/${dist}.log`
|
log=$(realpath $log)
|
||||||
|
path="${BASE_DIR}/$path/"
|
||||||
|
echo -e "----\n| Repo: $repo\n| Type: $type\n| Upstream: $url\n| Path: $path\n| Log: $log\n----"
|
||||||
|
|
||||||
mv ${BASE_DIR}/logs/${dist}.log ${BASE_DIR}/logs/previous/${dist}-${LASTLOG}.log
|
rotate_log $log
|
||||||
mv ${BASE_DIR}/logs/${dist}-error.log ${BASE_DIR}/logs/previous/${dist}-error-${LASTLOG}.log
|
|
||||||
|
|
||||||
echo ${TIMENOW} >> ${BASE_DIR}/logs/${dist}.log
|
case $type in
|
||||||
echo ${TIMENOW} >> ${BASE_DIR}/logs/${dist}-error.log
|
"rsync")
|
||||||
echo "${TIMENOW}: Mirroring ${dist} from ${!dist} to ${BASE_DIR}/${dist}"
|
local rsync_options=$(parse_yaml 'global.rsync.options')
|
||||||
echo "${TIMENOW} STARTED ${dist}" >> ${BASE_DIR}/logs/all.log
|
local exclude_list=($(parse_yaml 'global.rsync.exclude[]'))
|
||||||
|
local exclude=""
|
||||||
if [ "$dist" == "debian" ];
|
for ex in "${exclude_list[@]}"; do
|
||||||
then
|
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
|
cd ${BASE_DIR}/scripts
|
||||||
export BASE_DIR=${BASE_DIR}
|
export BASE_DIR=${BASE_DIR}
|
||||||
./ftpsync
|
./ftpsync >> $log 2>> ${log}-error
|
||||||
else
|
cd ${BASE_DIR}
|
||||||
echo "rsync ${option} ${exclude} ${!dist} ${BASE_DIR}/${dist}" >> ${BASE_DIR}/logs/${dist}.log
|
;;
|
||||||
rsync ${option} ${exclude} ${!dist} ${BASE_DIR}/${dist} >> ${BASE_DIR}/logs/${dist}.log 2>> ${BASE_DIR}/logs/${dist}-error.log
|
"http")
|
||||||
fi
|
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
|
||||||
|
|
||||||
if [ $? -ne 0 ];
|
clean_log $log
|
||||||
then
|
}
|
||||||
cd ${ALERT}
|
|
||||||
MSG="${dist} failed at ${TIMENOW}"
|
rotate_log() {
|
||||||
if [ -n "$ALERT" ];
|
local log_file=$1
|
||||||
then
|
if [[ -f $log_file ]]; then
|
||||||
${ALERT}/alert alert "${MSG}"
|
PREV_LOG=$(cat "$log_file" | head -n 1)
|
||||||
|
old_log_file="$(dirname $log_file)/old/$(basename $log_file)-$PREV_LOG"
|
||||||
|
mkdir -p "$(dirname $old_log_file)"
|
||||||
|
mv "$log_file" "$old_log_file"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo Sync ${dist} Error
|
local error_file=$1-error
|
||||||
echo "${TIMENOW} ERROR ${dist}" >> ${BASE_DIR}/logs/all.log
|
if [[ -f $error_file ]]; then
|
||||||
echo curl -X POST -d 'email=DEVPG.NET' -d "title=${dist}" -d "content=${MSG}" https://one.devpg.net/send
|
PREV_LOG=$(cat "$error_file" | head -n 1)
|
||||||
else
|
old_error_file="$(dirname $error_file)/old/$(basename $error_file)-$PREV_LOG"
|
||||||
echo Sync ${dist} Success
|
mkdir -p "$(dirname $old_error_file)"
|
||||||
if [ `echo ${BASE_DIR}/logs/${dist}-error.log | wc -l` -eq 1 ];
|
mv "$error_file" "$old_error_file"
|
||||||
then
|
|
||||||
rm ${BASE_DIR}/logs/${dist}-error.log
|
|
||||||
fi
|
fi
|
||||||
echo "${TIMENOW} DONE ${dist}" >> ${BASE_DIR}/logs/all.log
|
|
||||||
cd $BASE_DIR
|
echo $TIMESTAMP >> $log_file
|
||||||
echo "Updating Index"
|
echo $TIMESTAMP >> $error_file
|
||||||
python3 -u ./scripts/index.py ${BASE_DIR}
|
}
|
||||||
|
|
||||||
|
clean_log() {
|
||||||
|
local error_file=$1-error
|
||||||
|
nl=$(cat "$error_file" | wc -l)
|
||||||
|
if [ $nl -eq 1 ]; then
|
||||||
|
rm "$error_file"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
##########
|
||||||
|
# Main #
|
||||||
|
##########
|
||||||
|
|
||||||
|
echo Started job $TIMESTAMP..
|
||||||
|
|
||||||
|
global_pre_scripts=($(parse_yaml 'global.scripts.pre[]'))
|
||||||
|
for script in "${global_pre_scripts[@]}"; do
|
||||||
|
$script
|
||||||
|
done
|
||||||
|
|
||||||
|
repos=($(parse_yaml 'global.sync[]'))
|
||||||
|
|
||||||
|
if [[ "${repos[0]}" == "ALL" ]]; then
|
||||||
|
repos=($($YAML eval '.repos | keys| .[]' "${CONFIG_PATH}"))
|
||||||
fi
|
fi
|
||||||
|
for repo in "${repos[@]}"; do
|
||||||
|
echo Checking $repo...
|
||||||
|
duration=$(parse_yaml "repos.${repo}.duration")
|
||||||
|
last_sync_timestamp=$(date -d "$(parse_yaml "repos.${repo}.last_sync")" +%s)
|
||||||
|
next_sync_timestamp=$(( last_sync_timestamp + duration * 3600 ))
|
||||||
|
next_sync_timestamp=1
|
||||||
|
if [ $next_sync_timestamp -le $(date +%s) ]; then
|
||||||
|
echo "Lastsync $last_sync_timestamp"
|
||||||
|
echo "Syncing $repo..."
|
||||||
|
|
||||||
|
sync_repo $repo
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
global_fail_scripts=($(parse_yaml 'global.scripts.fail[]'))
|
||||||
|
for script in "${global_fail_scripts[@]}"; do
|
||||||
|
$script
|
||||||
|
done
|
||||||
|
echo "Error syncing $repo"
|
||||||
|
else
|
||||||
|
$YAML eval ".repos.${repo}.last_sync = \"$TIMESTAMP\"" -i "${CONFIG_PATH}"
|
||||||
|
echo "Successfully synced $repo."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
global_post_scripts=($(parse_yaml 'global.scripts.post[]'))
|
||||||
|
for script in "${global_post_scripts[@]}"; do
|
||||||
|
$script
|
||||||
|
done
|
||||||
|
|
||||||
|
echo Ended job $TIMESTAMP..
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>PAWE.ME</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')
|
||||||
|
} else {
|
||||||
|
document.documentElement.classList.remove('dark')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.url {
|
||||||
|
font-style: italic;
|
||||||
|
color: #5d7abf;
|
||||||
|
|
||||||
|
} </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">
|
||||||
|
<h1 class="text-4xl font-bold mb-2"><a href="http://PAWE.ME/"
|
||||||
|
class="text-blue-500 hover:text-blue-700">PAWE.ME</a></h1>
|
||||||
|
<h2 class="text-lg text-gray-600 dark:text-gray-300">Simple mirroring & archiving server.</h2>
|
||||||
|
<!-- <h2 class="text-lg text-blue-400 dark:text-blue-200 italic"><a href="#">Hide my Email</a>, <a href="#">Invidious</a>, <a href="#">Proxy</a>.</h2> -->
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<section class="mb-12">
|
||||||
|
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">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">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-500 hover:text-blue-700">Image Files</a></h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="dark:text-gray-200 text-2xl font-semibold mb-5">Server Info</h2>
|
||||||
|
<ul class="space-y-2 mb-5">
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">Xeon CPU</li>
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">64GiB Memory</li>
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">1Gbps Network, Seoul, Korea</li>
|
||||||
|
<li class="text-gray-600 dark:text-gray-500">32TB Storage</li>
|
||||||
|
</ul>
|
||||||
|
<p class="text-gray-700 dark:text-gray-400 url">Fill out <a href="/form.html" class="text-blue-600 dark:text-blue-700">this</a> form to request additional mirroring.</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">© PAWE.ME</a>
|
||||||
|
<br/>
|
||||||
|
<a href="https://github.com/morgan9e/pawe.me"><i>source</i></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-500 hover:text-blue-700">{{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-500 hover:text-blue-700">{{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>
|
Binary file not shown.
Loading…
Reference in New Issue