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