added
This commit is contained in:
commit
7752a4a21a
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
|
@ -0,0 +1,77 @@
|
|||
<!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 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>
|
||||
<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">
|
||||
<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"></h2>
|
||||
</header>
|
||||
<form id="contactForm" class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4">
|
||||
<h2 class="text-2xl font-semibold mb-5">Request Form</h2>
|
||||
<div class="mb-4">
|
||||
<label class="block text-gray-700 text-sm font-bold mb-2" for="email">
|
||||
Email
|
||||
</label>
|
||||
<input class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" id="email" type="email" placeholder="Email">
|
||||
</div>
|
||||
<div class="mb-4 hidden">
|
||||
<label class="block text-gray-700 text-sm font-bold mb-2" for="title">
|
||||
Title
|
||||
</label>
|
||||
<input class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" id="title" type="text" placeholder="Title" value="New Request">
|
||||
</div>
|
||||
<div class="mb-6">
|
||||
<label class="block text-gray-700 text-sm font-bold mb-2" for="content">
|
||||
Content
|
||||
</label>
|
||||
<textarea class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" id="content" placeholder="Content" rows="5"></textarea>
|
||||
</div>
|
||||
<div class="flex items-center justify-between">
|
||||
<button id="sendButton" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" type="button">
|
||||
Send Message
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<p class="text-gray-800 text-xs italic"> Only Rsync & HTTP File server is available. HTTP mirroring cycle is much slower than Rsync. Feel free to request!</p>
|
||||
<script>
|
||||
document.getElementById('sendButton').addEventListener('click', function() {
|
||||
const email = document.getElementById('email').value;
|
||||
const title = document.getElementById('title').value;
|
||||
const content = document.getElementById('content').value;
|
||||
|
||||
let formData = new URLSearchParams();
|
||||
formData.append('email', email);
|
||||
formData.append('title', title);
|
||||
formData.append('content', content);
|
||||
|
||||
fetch(PUSHNOTIFICAATIONURL, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: formData.toString(),
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then((data) => {
|
||||
console.log(data);
|
||||
alert("Sent to Administrator. Reply may take 2-3 days.");
|
||||
})
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,179 @@
|
|||
<!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,70 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Log Viewer</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<input type="text" id="logPath" placeholder="Enter log file path or URL">
|
||||
<select id="intervalSelector">
|
||||
<option value="1000">1 sec</option>
|
||||
<option value="2000">2 sec</option>
|
||||
<option value="3000">3 sec</option>
|
||||
</select>
|
||||
<button onclick="startFetchingLog()">Start Fetching</button>
|
||||
<button onclick="toggleFetching()">Toggle Fetching</button>
|
||||
|
||||
<div id="logContent" style="white-space: pre-wrap;"></div>
|
||||
|
||||
<script>
|
||||
let interval;
|
||||
let isFetching = false;
|
||||
|
||||
function fetchLog(path) {
|
||||
fetch(path)
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
const reversedData = data.split("\n").reverse().join("\n");
|
||||
document.getElementById('logContent').textContent = reversedData;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('There was an error fetching the log:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function startFetchingLog() {
|
||||
stopFetching(); // Stop any existing fetching
|
||||
|
||||
const path = document.getElementById('logPath').value;
|
||||
const fetchInterval = parseInt(document.getElementById('intervalSelector').value);
|
||||
if (path) {
|
||||
fetchLog(path); // Initial fetch
|
||||
interval = setInterval(() => fetchLog(path), fetchInterval); // Fetch the log file at the selected interval
|
||||
isFetching = true;
|
||||
}
|
||||
}
|
||||
|
||||
function stopFetching() {
|
||||
if (interval) {
|
||||
clearInterval(interval);
|
||||
isFetching = false;
|
||||
}
|
||||
}
|
||||
|
||||
function toggleFetching() {
|
||||
if (isFetching) {
|
||||
stopFetching();
|
||||
} else {
|
||||
startFetchingLog();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
User-Agent: *
|
||||
Disallow: /
|
|
@ -0,0 +1,179 @@
|
|||
<!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>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,12 @@
|
|||
MIRRORNAME="pawe.me"
|
||||
TO="${BASE_DIR}/debian"
|
||||
HUB=false
|
||||
RSYNC_HOST="mirrors.xtom.jp"
|
||||
RSYNC_PATH="debian"
|
||||
INFO_MAINTAINER="Morgan <admin@pawe.me>"
|
||||
INFO_COUNTRY=KR
|
||||
INFO_LOCATION="Seoul, Korea"
|
||||
INFO_THROUGHPUT=500Mb
|
||||
LOGDIR="${BASE_DIR}/logs"
|
||||
UIPRETRIES=9
|
||||
TRACEHOST="PAWE.ME"
|
|
@ -0,0 +1,80 @@
|
|||
import requests, json, sys
|
||||
from bs4 import BeautifulSoup as bs4
|
||||
|
||||
def tree(idx: int, flag = False) -> str:
|
||||
idx += 1
|
||||
if idx == 1:
|
||||
if flag :
|
||||
return "├────"
|
||||
return "├──"
|
||||
elif idx == 2:
|
||||
if flag :
|
||||
return "│ ├────"
|
||||
return "│ ├──"
|
||||
else:
|
||||
if flag :
|
||||
return "│ " * (idx - 2) + "├────"
|
||||
return "│ " * (idx - 2) + "├──"
|
||||
|
||||
def parseIndex(url, base = "", idx = 0, dirs = [], ret = []):
|
||||
|
||||
print(f"D {(tree(idx)+url):<40} {''.join(dirs):>80}")
|
||||
html = bs4(requests.get(base + url).text, features="html.parser")
|
||||
|
||||
hrefs = [a["href"] for a in html.find_all('a')]
|
||||
hrefs = [i for i in hrefs if i[0] != '?']
|
||||
fls = []
|
||||
for href in hrefs:
|
||||
if href[-1] == "/": # if dir
|
||||
if href[0] != "/" and href[0] != ".":
|
||||
parseIndex(href, base + url, idx + 1, dirs + [href], ret)
|
||||
else:
|
||||
if href[0:2] == "./" and "/" not in href[2:]:
|
||||
href = href[2:]
|
||||
assert "/" not in href
|
||||
print(f"F {(tree(idx, 1)+href):<80}") # if file
|
||||
fls.append(href)
|
||||
|
||||
while len(ret) <= idx:
|
||||
ret.append({})
|
||||
|
||||
if ''.join(dirs) not in ret[idx].keys():
|
||||
ret[idx][''.join(dirs)] = []
|
||||
|
||||
for fl in fls:
|
||||
ret[idx][''.join(dirs)].append({fl: base + url + fl})
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: createFetch.py [URL] [Path]")
|
||||
sys.exit()
|
||||
|
||||
# urls = {"archlinuxarm": "http://jp.mirror.archlinuxarm.org/", "asahilinux": "https://cdn.asahilinux.org/", "linux-surface": "https://pkg.surfacelinux.com/arch/"}
|
||||
|
||||
if "http" in sys.argv[1]:
|
||||
if input(f"[*] Download from {sys.argv[1]}? ") in "Yy":
|
||||
url = sys.argv[1]
|
||||
else:
|
||||
sys.exit()
|
||||
else:
|
||||
print("[*] Not supported")
|
||||
sys.exit()
|
||||
|
||||
bpath = sys.argv[2]
|
||||
assert(bpath[-1] == '/')
|
||||
|
||||
print()
|
||||
print(f"[*] Downloading File list from {url} with base path {bpath}")
|
||||
|
||||
files = parseIndex('', base = url, dirs = [bpath])
|
||||
filename = url.split('/')[2]+'.fetch'
|
||||
|
||||
with open(filename, 'w') as f:
|
||||
f.write(json.dumps(files, indent=4))
|
||||
|
||||
print()
|
||||
print(f"[*] Saved to {filename}.")
|
|
@ -0,0 +1,114 @@
|
|||
# import asyncio, aiohttp, aiofiles
|
||||
import json, os, sys
|
||||
import requests, time
|
||||
# from tqdm import tqdm
|
||||
|
||||
def byteSize(size):
|
||||
pr = ""
|
||||
if size > 1024:
|
||||
size = round(size / 1024, 1)
|
||||
pr = "K"
|
||||
if size > 1024:
|
||||
size = round(size / 1024, 1)
|
||||
pr = "M"
|
||||
if size > 1024:
|
||||
size = round(size / 1024, 1)
|
||||
pr = "G"
|
||||
return f"{size}{pr}"
|
||||
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: getFiles.py [fetch file]")
|
||||
sys.exit()
|
||||
|
||||
listf = sys.argv[1]
|
||||
if not os.path.exists(listf):
|
||||
print("There is no such file..")
|
||||
sys.exit()
|
||||
|
||||
print(f"Downloading from fetchFile {listf}")
|
||||
|
||||
def spchr(string, num = 25, pad = 0):
|
||||
if len(string) > num:
|
||||
string = string[0:20] + ".." + string[-4:]
|
||||
if pad > num:
|
||||
string = string + ' '*(pad-len(string))
|
||||
return string
|
||||
|
||||
with open(listf, 'r') as f:
|
||||
jstr = json.loads(f.read())
|
||||
|
||||
for stage in jstr:
|
||||
for redirs in stage.keys():
|
||||
der = redirs.split('/')
|
||||
for i in range(len(der)):
|
||||
dpath = '/'.join(der[0:i])
|
||||
if not os.path.exists(dpath) and dpath:
|
||||
print(f"[*] Making new directory {dpath}")
|
||||
os.mkdir(dpath)
|
||||
|
||||
for stage in jstr:
|
||||
for dosta in stage:
|
||||
print(f"[*] Downloading path {dosta}")
|
||||
fpaths = []
|
||||
furls = []
|
||||
|
||||
for fls in stage[dosta]:
|
||||
fna = list(fls.keys())[0]
|
||||
fpa = fls[fna]
|
||||
fpaths.append(dosta + fna)
|
||||
furls.append(fpa)
|
||||
|
||||
assert len(fpaths) == len(furls)
|
||||
|
||||
# pbar = tqdm(total=len(fpaths))
|
||||
# print(furls)
|
||||
dlist = []
|
||||
for url, path in zip(furls, fpaths):
|
||||
if os.path.exists(path):
|
||||
flen = os.path.getsize(path)
|
||||
wlen = requests.get(url, stream=True).headers['Content-length']
|
||||
if int(flen) != int(wlen):
|
||||
dlist.append((path, url))
|
||||
else:
|
||||
dlist.append((path, url))
|
||||
|
||||
for path, url in dlist:
|
||||
print(f"[*] Fetch {url} ", end = "")
|
||||
wfil = requests.get(url, stream=True)
|
||||
wlen = wfil.headers['Content-length']
|
||||
print(byteSize(int(wlen)))
|
||||
|
||||
with open(path, 'wb') as f:
|
||||
if wlen is None: # no content length header
|
||||
f.write(wfil.content)
|
||||
|
||||
else:
|
||||
# pbar = tqdm(total=int(wlen), desc=spchr(' '+path, pad = 30))
|
||||
for data in wfil.iter_content(chunk_size=4096):
|
||||
f.write(data)
|
||||
# print(".", end = "")
|
||||
# pbar.update(len(data))
|
||||
# print()
|
||||
# async def getHTTP(session, url):
|
||||
# async with session.get(url) as resp:
|
||||
# try:
|
||||
# reqa = await resp.read()
|
||||
# # pbar.update(1)
|
||||
# return reqa
|
||||
# except:
|
||||
# print(url)
|
||||
# return
|
||||
|
||||
# async def agetReq():
|
||||
# async with aiohttp.ClientSession() as session:
|
||||
# tasks = []
|
||||
# for url in furls:
|
||||
# tasks.append(asyncio.ensure_future(getHTTP(session, url)))
|
||||
|
||||
# getReqs = await asyncio.gather(*tasks)
|
||||
|
||||
# for i, getReq in enumerate(getReqs):
|
||||
# async with aiofiles.open(fpaths[i], mode='wb') as handle:
|
||||
# await handle.write(getReq)
|
||||
|
||||
# asyncio.run(agetReq())
|
|
@ -0,0 +1,35 @@
|
|||
#!/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
|
|
@ -0,0 +1,48 @@
|
|||
import os, sys, re
|
||||
import datetime
|
||||
from pprint import pprint
|
||||
|
||||
base_path = sys.argv[1]
|
||||
assert os.path.exists(base_path)
|
||||
|
||||
log_path = os.path.join(base_path, "logs/all.log")
|
||||
assert os.path.exists(log_path)
|
||||
|
||||
html_path = os.path.join(base_path, "scripts/base.html")
|
||||
index = os.path.join(base_path, "index.html")
|
||||
assert os.path.exists(html_path)
|
||||
|
||||
with open(log_path, 'r') as f:
|
||||
log_file = f.read().splitlines()
|
||||
log_file.reverse()
|
||||
|
||||
with open(html_path, 'r') as f:
|
||||
html_file = f.read()
|
||||
dists = re.findall("@@([^@@]+)@@", html_file)
|
||||
pprint(dists)
|
||||
|
||||
logs = {}
|
||||
for dist in dists:
|
||||
logs[dist] = []
|
||||
|
||||
for logline in log_file:
|
||||
print(logline)
|
||||
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 = {}
|
||||
for dist in logs:
|
||||
if logs[dist]:
|
||||
last[dist] = sorted(logs[dist])[-1].strftime("%Y-%m-%d %H:%M")
|
||||
else:
|
||||
last[dist] = "Not Synced"
|
||||
pprint(last)
|
||||
|
||||
for dist in last:
|
||||
html_file = html_file.replace(f"@@{dist}@@", last[dist])
|
||||
|
||||
with open(index, 'w') as f:
|
||||
f.write(html_file)
|
|
@ -0,0 +1,79 @@
|
|||
#!/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"
|
||||
|
||||
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.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')
|
||||
|
||||
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 Syncing $1...
|
||||
|
||||
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
|
||||
|
||||
echo ${TIMENOW} >> ${BASE_DIR}/logs/${dist}.log
|
||||
echo ${TIMENOW} >> ${BASE_DIR}/logs/${dist}-error.log
|
||||
echo "${TIMENOW}: Mirroring ${dist} from ${!dist} to ${BASE_DIR}/${dist}"
|
||||
echo "${TIMENOW} STARTED ${dist}" >> ${BASE_DIR}/logs/all.log
|
||||
|
||||
if [ "$dist" == "debian" ];
|
||||
then
|
||||
cd ${BASE_DIR}/scripts
|
||||
export BASE_DIR=${BASE_DIR}
|
||||
./ftpsync
|
||||
else
|
||||
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
|
||||
fi
|
||||
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
cd ${ALERT}
|
||||
MSG="${dist} failed at ${TIMENOW}"
|
||||
if [ -n "$ALERT" ];
|
||||
then
|
||||
${ALERT}/alert alert "${MSG}"
|
||||
fi
|
||||
|
||||
echo Sync ${dist} Error
|
||||
echo "${TIMENOW} ERROR ${dist}" >> ${BASE_DIR}/logs/all.log
|
||||
echo curl -X POST -d 'email=DEVPG.NET' -d "title=${dist}" -d "content=${MSG}" https://one.devpg.net/send
|
||||
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}" >> ${BASE_DIR}/logs/all.log
|
||||
cd $BASE_DIR
|
||||
echo "Updating Index"
|
||||
python3 -u ./scripts/index.py ${BASE_DIR}
|
||||
fi
|
Loading…
Reference in New Issue