From bedc34b009391c71b5dc339767dccbcc2d228d9d Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Wed, 5 Dec 2012 01:21:34 +0000
Subject: [PATCH] Migrated mirroring code into i2p2www

---
 i2p2www/__init__.py                           |  50 +++++++++--
 .../pages/downloads}/mirrors                  |   3 +-
 i2p2www/pages/downloads/select.html           |  17 ++++
 mirror.i2p2/mirror.god => mirror.god.old      |   0
 mirror.i2p2/app.py                            |  80 ------------------
 mirror.i2p2/static/images/i2plogo.png         | Bin 8725 -> 0 bytes
 mirror.i2p2/static/style.css                  |   0
 mirror.i2p2/templates/select.html             |  29 -------
 8 files changed, 64 insertions(+), 115 deletions(-)
 rename {mirror.i2p2 => i2p2www/pages/downloads}/mirrors (53%)
 create mode 100644 i2p2www/pages/downloads/select.html
 rename mirror.i2p2/mirror.god => mirror.god.old (100%)
 delete mode 100644 mirror.i2p2/app.py
 delete mode 100644 mirror.i2p2/static/images/i2plogo.png
 delete mode 100644 mirror.i2p2/static/style.css
 delete mode 100644 mirror.i2p2/templates/select.html

diff --git a/i2p2www/__init__.py b/i2p2www/__init__.py
index 242778431..7fc864311 100644
--- a/i2p2www/__init__.py
+++ b/i2p2www/__init__.py
@@ -6,6 +6,11 @@ import os.path
 import os
 import fileinput
 import codecs
+from random import randint
+try:
+    import json
+except ImportError:
+    import simplejson as json
 
 
 TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages')
@@ -14,6 +19,8 @@ STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static')
 BLOG_DIR = os.path.join(os.path.dirname(__file__), 'blog')
 MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings')
 
+MIRRORS_FILE = os.path.join(TEMPLATE_DIR, 'downloads/mirrors')
+
 app = application = Flask('i2p2www', template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR)
 app.debug =  bool(os.environ.get('APP_DEBUG', 'False'))
 babel = Babel(app)
@@ -248,6 +255,26 @@ def meetings_show_rst(id):
 ###################
 # Download handlers
 
+# Read in mirrors from file
+def read_mirrors():
+    file = open(MIRRORS_FILE, 'r')
+    dat = file.read()
+    file.close()
+    lines=dat.split('\n')
+    ret={}
+    for line in lines:
+        try:
+            obj=json.loads(line)
+        except ValueError:
+            continue
+        if 'protocol' not in obj:
+            continue
+        protocol=obj['protocol']
+        if protocol not in ret:
+            ret[protocol]=[]
+        ret[protocol].append(obj)
+    return ret
+
 # List of downloads
 @app.route('/<string:lang>/download')
 def downloads_list():
@@ -257,16 +284,29 @@ def downloads_list():
 # Specific file downloader
 @app.route('/<string:lang>/download/<path:file>')
 def downloads_select(file):
-    # TODO: implement
     if (file == 'debian'):
         return render_template('downloads/debian.html')
-    pass
+    mirrors=read_mirrors()
+    obj=[]
+    for protocol in mirrors.keys():
+        a={}
+        a['name']=protocol
+        a['mirrors']=mirrors[protocol]
+        for mirror in a['mirrors']:
+            mirror['url']=mirror['url'] % file
+        obj.append(a)
+    return render_template('downloads/select.html', mirrors=obj, file=file)
 
 @app.route('/download/<string:protocol>/any/<path:file>')
-@app.route('/download/<string:protocol>/<string:mirror>/<path:file>')
+@app.route('/download/<string:protocol>/<int:mirror>/<path:file>')
 def downloads_redirect(protocol, file, mirror=None):
-    # TODO: implement
-    pass
+    mirrors=read_mirrors()
+    if not protocol in mirrors:
+        abort(404)
+    mirrors=mirrors[protocol]
+    if mirror:
+        return redirect(mirrors[mirror]['url'] % file)
+    return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % file)
 
 
 #####################
diff --git a/mirror.i2p2/mirrors b/i2p2www/pages/downloads/mirrors
similarity index 53%
rename from mirror.i2p2/mirrors
rename to i2p2www/pages/downloads/mirrors
index 5afeaf675..82ab9b31b 100644
--- a/mirror.i2p2/mirrors
+++ b/i2p2www/pages/downloads/mirrors
@@ -1,2 +1,3 @@
+{"url": "http://i2p.googlecode.com/files/%s", "org": "Google Code", "org_url": "http://code.google.com", "protocol": "http", "country": "us"}
 {"url": "http://golden.mtveurope.org/~yang/i2p_mirror/%s", "org": "VServer.si", "org_url": "http://www.vserver.si", "protocol": "http", "country": "lu"}
-{"url": "http://a.mirror.geti2p.net/releases/current/%s", "org": "welterde", "protocol": "http", "country": "de"}
\ No newline at end of file
+{"url": "http://a.mirror.geti2p.net/releases/current/%s", "org": "welterde", "protocol": "http", "country": "de"}
diff --git a/i2p2www/pages/downloads/select.html b/i2p2www/pages/downloads/select.html
new file mode 100644
index 000000000..3eaf46a91
--- /dev/null
+++ b/i2p2www/pages/downloads/select.html
@@ -0,0 +1,17 @@
+{% extends "global/layout.html" %}
+{% block title %}Mirror selection{% endblock %}
+{% block content %}
+<h1>Mirror selection</h1>
+<h2>File: /{{ file }}</h2>
+{% for protocol in mirrors -%}
+<div class="protocol">
+  <h3>{{ protocol.name | upper }}</h3>
+  <ul>
+    <li><a href="{{ url_for('downloads_redirect', protocol=protocol.name, file=file) }}">Any mirror</a></li>
+    {% for mirror in protocol.mirrors -%}
+    <li><img src="{{ url_for('static', filename='images/'+mirror.country+'.png') }}" />&nbsp;{% if mirror.org_url %}<a href="{{ mirror.org_url }}">{% endif %}{{ mirror.org }}{% if mirror.org_url %}</a>{% endif %} <a href="{{ url_for('downloads_redirect', protocol=protocol.name, file=file, mirror=loop.index-1) }}">[Download]</a></li>
+    {%- endfor %}
+  </ul>
+</div>
+{%- endfor %}
+{% endblock %}
diff --git a/mirror.i2p2/mirror.god b/mirror.god.old
similarity index 100%
rename from mirror.i2p2/mirror.god
rename to mirror.god.old
diff --git a/mirror.i2p2/app.py b/mirror.i2p2/app.py
deleted file mode 100644
index 8c26e2375..000000000
--- a/mirror.i2p2/app.py
+++ /dev/null
@@ -1,80 +0,0 @@
-from flask import Flask, redirect, request, render_template, abort
-from random import randint
-from sys import argv
-try:
-    import json
-except ImportError:
-    import simplejson as json
-
-
-# try to create an memcache client
-if len(argv[3:]) > 0:
-    try:
-        try:
-            from cmemcache import Client
-        except ImportError:
-            from memcache import Client
-        client=Client(argv[3:])
-    except ImportError:
-        client=None
-
-# create application
-app=Flask(__name__)
-
-# extract domain
-domain=argv[1]
-
-# extract port
-port=int(argv[2])
-
-def read_mirrors():
-    file = open('mirrors', 'r')
-    dat = file.read()
-    file.close()
-    lines=dat.split('\n')
-    ret={}
-    for line in lines:
-        try:
-            obj=json.loads(line)
-        except ValueError:
-            pass
-        if 'protocol' not in obj:
-            continue
-        protocol=obj['protocol']
-        if protocol not in ret:
-            ret[protocol]=[]
-        ret[protocol].append(obj)
-    return ret
-
-
-@app.route('/')
-def index():
-    return redirect('http://www.%s/download' % domain)
-
-@app.route('/select/<path:f>')
-def select(f):
-    mirrors=read_mirrors()
-    obj=[]
-    for protocol in mirrors.keys():
-        a={}
-        a['name']=protocol.upper()
-        a['mirrors']=mirrors[protocol]
-        for mirror in a['mirrors']:
-            mirror['url']=mirror['url'] % f
-        obj.append(a)
-    return render_template('select.html', mirrors=obj, file=f, domain=domain)
-
-@app.route('/<protocol>/<path:f>')
-def get(protocol, f):
-    mirrors=read_mirrors()
-    if not protocol in mirrors:
-        abort(404)
-    mirrors=mirrors[protocol]
-    return redirect(mirrors[randint(0, len(mirrors) - 1)]['url'] % f)
-
-@app.route('/<f>')
-def old_get(f):
-    return redirect('http://i2p.googlecode.com/files/%s' % f)
-
-if __name__ == '__main__':
-    app.run(port=port)
diff --git a/mirror.i2p2/static/images/i2plogo.png b/mirror.i2p2/static/images/i2plogo.png
deleted file mode 100644
index f7beff26bac365f3b7a6fd6e2bbbe52ed5d61c32..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8725
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

diff --git a/mirror.i2p2/static/style.css b/mirror.i2p2/static/style.css
deleted file mode 100644
index e69de29bb..000000000
diff --git a/mirror.i2p2/templates/select.html b/mirror.i2p2/templates/select.html
deleted file mode 100644
index fc031ca1c..000000000
--- a/mirror.i2p2/templates/select.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
-  <head>
-    <title>I2P - Mirror selection - /{{ file }}</title>
-    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" type="text/css">
-  </head>
-  <body>
-    <div class="logo">
-      <a href="{{ domain }}" class="fade"><img src="{{ url_for('static', filename='images/i2plogo.png') }}" alt="I2P Logo" title="Invisible Internet Project (I2P)" /></a>
-    </div>
-    <div class="header">
-      <h1>Mirror selection</h1>
-      <h2>File: /{{ file }}</h2>
-    </div>
-    {% for protocol in mirrors -%}
-    <div class="protocol">
-      <h3>{{ protocol.name }}</h3>
-      <ul>
-      {% for mirror in protocol.mirrors -%}
-        <li><a href="{{ mirror.url }}">{{ mirror.url }}</a> {% if mirror.org_url %}<a href="{{ mirror.org_url }}">{% endif %}{{ mirror.org }}{% if mirror.org_url %}</a>{% endif %}</li>
-      {% endfor %}
-      </ul>
-    </div>
-    {%- endfor %}
-  </body>
-</html>  
-
-- 
GitLab