tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2011
- 19 participants
- 635 discussions

17 Aug '11
commit 4a148848c44279733c27de4e5a8f600ac5f2531e
Author: Jacob Appelbaum <jacob(a)appelbaum.net>
Date: Wed Aug 17 19:02:12 2011 +0200
add basic setup.py for install target
---
packages/torouter-web/setup.py | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/packages/torouter-web/setup.py b/packages/torouter-web/setup.py
new file mode 100644
index 0000000..d73e65f
--- /dev/null
+++ b/packages/torouter-web/setup.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python
+from distutils.core import setup
+
+setup(name='torouter-tui',
+ packages=['tui'],
+ package_dir = {'tui': 'src/tui/'},
+ package_data = {'tui': ['src/static']},
+ version='0.1',
+ description='Torouter Web UI',
+ author='Arturo Filasto',
+ author_email='hellais(a)torproject.org',
+ url='https://www.torproject.org/',
+ scripts=['src/runui.py', 'src/view.py', 'src/config.py'])
+
1
0

17 Aug '11
commit 702600566d00c495c418631cd64ee99839fea5a0
Author: Jacob Appelbaum <jacob(a)appelbaum.net>
Date: Wed Aug 17 19:16:53 2011 +0200
add basic install target with static files
---
packages/torouter-web/setup.py | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/packages/torouter-web/setup.py b/packages/torouter-web/setup.py
index d73e65f..7629b6b 100644
--- a/packages/torouter-web/setup.py
+++ b/packages/torouter-web/setup.py
@@ -4,7 +4,9 @@ from distutils.core import setup
setup(name='torouter-tui',
packages=['tui'],
package_dir = {'tui': 'src/tui/'},
- package_data = {'tui': ['src/static']},
+ package_data = {'tui': ['src/tui/']},
+ data_files = [('/usr/share/torouter-tui/static',
+ ['src/static/main.css'])],
version='0.1',
description='Torouter Web UI',
author='Arturo Filasto',
1
0
commit bb4a0df747092bdc0fac0baa0658bf1d314a9de8
Author: Jacob Appelbaum <jacob(a)appelbaum.net>
Date: Wed Aug 17 18:03:43 2011 +0200
Move source into src dir
---
packages/torouter-web/config.py | 15 ---
packages/torouter-web/runui.py | 35 ------
packages/torouter-web/src/config.py | 15 +++
packages/torouter-web/src/runui.py | 35 ++++++
packages/torouter-web/src/static/main.css | 37 ++++++
packages/torouter-web/src/tui/controllers/main.py | 26 ++++
.../torouter-web/src/tui/controllers/network.py | 129 ++++++++++++++++++++
.../torouter-web/src/tui/controllers/old/main.py | 11 ++
.../torouter-web/src/tui/controllers/old/status.py | 9 ++
.../torouter-web/src/tui/controllers/old/wizard.py | 81 ++++++++++++
packages/torouter-web/src/tui/controllers/tor.py | 29 +++++
.../torouter-web/src/tui/models/router_config.py | 19 +++
.../torouter-web/src/tui/utils/configuration.py | 85 +++++++++++++
packages/torouter-web/src/tui/utils/parsing.py | 83 +++++++++++++
packages/torouter-web/src/tui/utils/session.py | 26 ++++
packages/torouter-web/src/tui/views/base.html | 30 +++++
packages/torouter-web/src/tui/views/firewall.html | 7 +
packages/torouter-web/src/tui/views/index.html | 1 +
packages/torouter-web/src/tui/views/login.html | 7 +
packages/torouter-web/src/tui/views/logout.html | 1 +
packages/torouter-web/src/tui/views/main.html | 1 +
packages/torouter-web/src/tui/views/saved.html | 8 ++
packages/torouter-web/src/tui/views/status.html | 3 +
packages/torouter-web/src/tui/views/torconfig.html | 1 +
packages/torouter-web/src/tui/views/torstatus.html | 1 +
packages/torouter-web/src/tui/views/wired.html | 7 +
packages/torouter-web/src/tui/views/wireless.html | 8 ++
packages/torouter-web/src/tui/views/wizard.html | 12 ++
packages/torouter-web/src/view.py | 11 ++
packages/torouter-web/static/main.css | 37 ------
packages/torouter-web/tui/controllers/main.py | 26 ----
packages/torouter-web/tui/controllers/network.py | 129 --------------------
packages/torouter-web/tui/controllers/old/main.py | 11 --
.../torouter-web/tui/controllers/old/status.py | 9 --
.../torouter-web/tui/controllers/old/wizard.py | 81 ------------
packages/torouter-web/tui/controllers/tor.py | 29 -----
packages/torouter-web/tui/models/router_config.py | 19 ---
packages/torouter-web/tui/utils/configuration.py | 85 -------------
packages/torouter-web/tui/utils/parsing.py | 83 -------------
packages/torouter-web/tui/utils/session.py | 26 ----
packages/torouter-web/tui/views/base.html | 30 -----
packages/torouter-web/tui/views/firewall.html | 7 -
packages/torouter-web/tui/views/index.html | 1 -
packages/torouter-web/tui/views/login.html | 7 -
packages/torouter-web/tui/views/logout.html | 1 -
packages/torouter-web/tui/views/main.html | 1 -
packages/torouter-web/tui/views/saved.html | 8 --
packages/torouter-web/tui/views/status.html | 3 -
packages/torouter-web/tui/views/torconfig.html | 1 -
packages/torouter-web/tui/views/torstatus.html | 1 -
packages/torouter-web/tui/views/wired.html | 7 -
packages/torouter-web/tui/views/wireless.html | 8 --
packages/torouter-web/tui/views/wizard.html | 12 --
packages/torouter-web/view.py | 11 --
54 files changed, 683 insertions(+), 683 deletions(-)
diff --git a/packages/torouter-web/__init__.py b/packages/torouter-web/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/torouter-web/config.py b/packages/torouter-web/config.py
deleted file mode 100644
index 8fd716d..0000000
--- a/packages/torouter-web/config.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# tui, Tor web UI
-# by Arturo Filasto' <hellais(a)torproject.org>
-#
-
-import web, os
-
-cache = False
-
-globals = {}
-
-# Add your own (username, password) pair
-authinfo = ("test", "test")
-
-interfaces_file = os.getcwd() + "/../torouter-prep/configs/interfaces"
-
diff --git a/packages/torouter-web/runui.py b/packages/torouter-web/runui.py
deleted file mode 100644
index 3d2dfc8..0000000
--- a/packages/torouter-web/runui.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# tui - Tor web UI
-# by Arturo Filasto' <hellais(a)torproject.org>
-#
-
-import web
-import config
-import tui.controllers
-
-from tui.utils import session
-from view import render
-
-
-# This is the main structure of URLs
-urls = (
- '/', 'tui.controllers.main.index',
-# '/config/(tor|router)', 'tui.controllers.main.config',
- '/network', 'tui.controllers.network.main',
- '/network/firewall', 'tui.controllers.network.firewall',
- '/network/wireless', 'tui.controllers.network.wireless',
- '/network/wired', 'tui.controllers.network.wired',
- '/network/status', 'tui.controllers.network.status',
- '/tor', 'tui.controllers.tor.status',
- '/tor/config', 'tui.controllers.tor.config',
- '/logout', 'tui.controllers.main.logout'
- )
-# '/wizard/([0-9a-f]{1,2})?', 'tui.controllers.wizard.step',
-# '/status', 'tui.controllers.status')
-
-if __name__ == "__main__":
- app = web.application(urls, globals())
- # Add session management to the app
- session.add_session_to_app(app)
- app.internalerror = web.debugerror
- app.run()
-
diff --git a/packages/torouter-web/src/__init__.py b/packages/torouter-web/src/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/torouter-web/src/config.py b/packages/torouter-web/src/config.py
new file mode 100644
index 0000000..8fd716d
--- /dev/null
+++ b/packages/torouter-web/src/config.py
@@ -0,0 +1,15 @@
+# tui, Tor web UI
+# by Arturo Filasto' <hellais(a)torproject.org>
+#
+
+import web, os
+
+cache = False
+
+globals = {}
+
+# Add your own (username, password) pair
+authinfo = ("test", "test")
+
+interfaces_file = os.getcwd() + "/../torouter-prep/configs/interfaces"
+
diff --git a/packages/torouter-web/src/runui.py b/packages/torouter-web/src/runui.py
new file mode 100644
index 0000000..3d2dfc8
--- /dev/null
+++ b/packages/torouter-web/src/runui.py
@@ -0,0 +1,35 @@
+# tui - Tor web UI
+# by Arturo Filasto' <hellais(a)torproject.org>
+#
+
+import web
+import config
+import tui.controllers
+
+from tui.utils import session
+from view import render
+
+
+# This is the main structure of URLs
+urls = (
+ '/', 'tui.controllers.main.index',
+# '/config/(tor|router)', 'tui.controllers.main.config',
+ '/network', 'tui.controllers.network.main',
+ '/network/firewall', 'tui.controllers.network.firewall',
+ '/network/wireless', 'tui.controllers.network.wireless',
+ '/network/wired', 'tui.controllers.network.wired',
+ '/network/status', 'tui.controllers.network.status',
+ '/tor', 'tui.controllers.tor.status',
+ '/tor/config', 'tui.controllers.tor.config',
+ '/logout', 'tui.controllers.main.logout'
+ )
+# '/wizard/([0-9a-f]{1,2})?', 'tui.controllers.wizard.step',
+# '/status', 'tui.controllers.status')
+
+if __name__ == "__main__":
+ app = web.application(urls, globals())
+ # Add session management to the app
+ session.add_session_to_app(app)
+ app.internalerror = web.debugerror
+ app.run()
+
diff --git a/packages/torouter-web/src/static/main.css b/packages/torouter-web/src/static/main.css
new file mode 100644
index 0000000..5626e92
--- /dev/null
+++ b/packages/torouter-web/src/static/main.css
@@ -0,0 +1,37 @@
+
+/* Clear all */
+body { margin: 0;border: 0;padding: 0; }
+
+div.wrapper {
+ min-height: 300px;
+ width: 800px;
+ margin: 0 auto;
+}
+
+div.footer {
+ text-align: center;
+ background-color: #333;
+ color: white;
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+
+div.header {
+ color: white;
+}
+
+div.header ul {
+ list-style: none;
+ height: 20px;
+}
+
+div.header ul li {
+ font-size: 20px;
+ float: left;
+ padding: 5px 10px;
+}
+
+div.header ul#submenu li {
+ font-size: 15px;
+}
+
diff --git a/packages/torouter-web/src/tui/__init__.py b/packages/torouter-web/src/tui/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/torouter-web/src/tui/controllers/__init__.py b/packages/torouter-web/src/tui/controllers/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/torouter-web/src/tui/controllers/main.py b/packages/torouter-web/src/tui/controllers/main.py
new file mode 100644
index 0000000..060caa6
--- /dev/null
+++ b/packages/torouter-web/src/tui/controllers/main.py
@@ -0,0 +1,26 @@
+import web
+import view, config
+from view import render
+from tui.utils import session
+
+"""
+The main page for network configuration
+"""
+class index:
+ def GET(self):
+ if session.is_logged() > 0:
+ return render.base(render.index())
+ else:
+ return render.base(render.login())
+
+ def POST(self):
+ if session.check_login(web.input()) == 0:
+ return render.base(render.index())
+ else:
+ return render.base(render.login())
+
+class logout:
+ def GET(self):
+ session.logout()
+ return render.base(render.logout())
+
diff --git a/packages/torouter-web/src/tui/controllers/network.py b/packages/torouter-web/src/tui/controllers/network.py
new file mode 100644
index 0000000..d189d0c
--- /dev/null
+++ b/packages/torouter-web/src/tui/controllers/network.py
@@ -0,0 +1,129 @@
+import web
+import view, config
+from view import render
+from tui.utils import session,configuration,parsing
+
+"""
+This function is used to generate the network
+submenus.
+"""
+def menu(n):
+ a = []
+ for i in range(0,5):
+ if i == n:
+ a.append("sel")
+ else:
+ a.append("")
+ print a
+ return """<ul id="submenu">
+ <li><a href="/network" class="%s">Main</a></li>
+ <li><a href="/network/firewall" class="%s">Firewall</a></li>
+ <li><a href="/network/wireless" class="%s">Wireless</a></li>
+ <li><a href="/network/wired" class="%s">Wired</a></li>
+ <li><a href="/network/status" class="%s">Status</a></li>
+</ul>
+""" % tuple(a)
+
+"""
+The main page for network configuration
+"""
+class main:
+ # XXX do all the backend stuff
+ def update_config(self, data):
+ return True
+
+ def GET(self):
+ if session.is_logged() > 0:
+ return render.base(render.main(),menu(0))
+ else:
+ return render.base(render.login())
+
+ def POST(self):
+ if session.is_logged() > 0:
+ self.update_config(web.input())
+ return render.base(render.main(),menu(0))
+ else:
+ return render.base(render.login())
+
+"""
+The firewall configuration page
+"""
+class firewall:
+ # XXX do all the backend stuff
+ def update_config(self, data):
+ return True
+
+ def GET(self):
+ if session.is_logged() > 0:
+ return render.base(render.firewall(configuration.get_form("firewall")),menu(0))
+ else:
+ return render.base(render.login())
+
+ def POST(self):
+ if session.is_logged() > 0:
+ self.update_config(web.input())
+ return render.base(render.firewall(),menu(1))
+ else:
+ return render.base(render.login())
+
+
+
+"""
+Wireless network configuration page
+"""
+class wireless:
+ # XXX do all the backend stuff
+ def update_config(self, data):
+ return True
+
+ def GET(self):
+ if session.is_logged() > 0:
+ return render.base(render.wireless(configuration.get_form("wireless")),menu(2))
+ else:
+ return render.base(render.login())
+
+ def POST(self):
+ if session.is_logged() > 0:
+ self.update_config(web.input())
+ print web.input()
+ return render.base(render.saved(web.input()),menu(2))
+ else:
+ return render.base(render.login())
+
+"""
+Wired network configuration page
+"""
+class wired:
+ # XXX do all the backend stuff
+ def update_config(self, data):
+ return True
+
+ def GET(self):
+ if session.is_logged() > 0:
+ return render.base(render.wired(configuration.get_form("wired")),menu(3))
+ else:
+ return render.base(render.login())
+
+ def POST(self):
+ if session.is_logged() > 0:
+ self.update_config(web.input())
+ return render.base(render.wired(),menu(3))
+ else:
+ return render.base(render.login())
+
+"""
+General status page, displays a bit more detail than main
+"""
+class status:
+ def GET(self):
+ itfc = parsing.interfaces(config.interfaces_file)
+ itfc.parse()
+ network = itfc.html_output(itfc.wifi) + itfc.html_output(itfc.eth0) + itfc.html_output(itfc.eth1)
+ return render.base(render.status(network),menu(4))
+
+ def POST(self):
+ itfc = parsing.interfaces(config.interfaces_file)
+ itfc.parse()
+ network = itfc.html_output(itfc.wifi) + itfc.html_output(itfc.eth0) + itfc.html_output(itfc.eth1)
+ return render.base(render.status(),menu(4))
+
diff --git a/packages/torouter-web/src/tui/controllers/old/main.py b/packages/torouter-web/src/tui/controllers/old/main.py
new file mode 100644
index 0000000..9127e72
--- /dev/null
+++ b/packages/torouter-web/src/tui/controllers/old/main.py
@@ -0,0 +1,11 @@
+import web
+
+
+class index:
+ def GET(self):
+ return "index"
+
+class config:
+ def GET(self):
+ return "config"
+
diff --git a/packages/torouter-web/src/tui/controllers/old/status.py b/packages/torouter-web/src/tui/controllers/old/status.py
new file mode 100644
index 0000000..05f0bf8
--- /dev/null
+++ b/packages/torouter-web/src/tui/controllers/old/status.py
@@ -0,0 +1,9 @@
+import web
+import config
+
+from config import views
+from web import form
+
+class status:
+ def GET():
+ print "status"
diff --git a/packages/torouter-web/src/tui/controllers/old/wizard.py b/packages/torouter-web/src/tui/controllers/old/wizard.py
new file mode 100644
index 0000000..7b82df2
--- /dev/null
+++ b/packages/torouter-web/src/tui/controllers/old/wizard.py
@@ -0,0 +1,81 @@
+import web
+
+from web import form
+from config import view
+
+class step:
+ cur_step = 1
+ next_step = 2
+ wiztext = []
+ wizform = []
+
+ wiztext.append("Tor Configuration")
+ wizform.append(form.Form(
+ form.Textbox('Nickname',
+ form.notnull, description="Relay Nickname"),
+ form.Textbox('RelayBandwidthRate',
+ form.notnull, description="Relay Bandwidth Rate"),
+ form.Textbox('RelayBandwidthBurst',
+ form.notnull, description="Relay Bandwidth Burst"),
+ form.Textbox('ContactInfo',
+ form.notnull, description="Contact Info"),
+ form.Textbox('ExitPolicy',
+ form.notnull, description="Exit Policy"),
+ form.Button('Next Step')
+ ))
+
+ wiztext.append("Wireless setup")
+ wizform.append(form.Form(
+ form.Textbox('essid',
+ form.notnull, description="Wireless ESSID"),
+ form.Textbox('mac',
+ form.notnull, description="MAC address"),
+ form.Textbox('whatever',
+ form.notnull, description="Wireless ESSID"),
+ form.Button('Next Step')
+ ))
+
+ wiztext.append("")
+ wizform.append(form.Form(
+ form.Textbox('essid',
+ form.notnull, description="Wireless ESSID"),
+ form.Textbox('mac',
+ form.notnull, description="MAC address"),
+ form.Textbox('whatever',
+ form.notnull, description="Wireless ESSID"),
+ form.Button('Next Step')
+ ))
+
+ wiztext.append("")
+ wizform.append(form.Form(
+ form.Textbox('essid',
+ form.notnull, description="Wireless ESSID"),
+ form.Textbox('mac',
+ form.notnull, description="MAC address"),
+ form.Textbox('whatever',
+ form.notnull, description="Wireless ESSID"),
+ form.Button('Next Step')
+ ))
+
+ def GET(self, step):
+ if step:
+ self.cur_step = int(step)
+ self.next_step = int(step) + 1
+ else:
+ self.cur_step = 1
+ self.next_step = 2
+ if len(self.wizform) < int(self.cur_step):
+ return "Done!"
+ return view.wizard(self.wizform[self.cur_step-1], self.wiztext[self.cur_step-1], self.cur_step, self.next_step)
+
+ def POST(self, step):
+ x = web.input()
+ self.cur_step = int(step)
+ self.next_step = int(step) + 1
+ if len(self.wizform) < int(self.cur_step):
+ return "Done!"
+ return view.wizard(self.wizform[self.cur_step-1], self.wiztext[self.cur_step-1], self.cur_step, self.next_step)
+
+
+
+
diff --git a/packages/torouter-web/src/tui/controllers/tor.py b/packages/torouter-web/src/tui/controllers/tor.py
new file mode 100644
index 0000000..d07cb71
--- /dev/null
+++ b/packages/torouter-web/src/tui/controllers/tor.py
@@ -0,0 +1,29 @@
+import web
+import view, config
+from view import render
+from tui.utils import session
+
+"""
+The main Tor status page
+"""
+class status:
+ def GET(self):
+ return render.base(render.torstatus())
+
+ def POST(self):
+ return render.base(render.torstatus())
+
+"""
+Tor configuration page
+"""
+class config:
+ def update_config(self, data):
+ return True
+
+ def GET(self):
+ return render.base(render.torconfig())
+
+ def POST(self):
+ self.update_config(web.input())
+ return render.base(render.torconfig())
+
diff --git a/packages/torouter-web/src/tui/models/router_config.py b/packages/torouter-web/src/tui/models/router_config.py
new file mode 100644
index 0000000..e83f9aa
--- /dev/null
+++ b/packages/torouter-web/src/tui/models/router_config.py
@@ -0,0 +1,19 @@
+import web
+from config import db
+
+def new_config(conf):
+ db.insert('router_config',
+ essid=conf['essid'],
+ field1=conf['field1'],
+ field2=conf['field2']
+ )
+
+
+def write_config():
+ db.update('router_config',
+ essid=conf['essid'],
+ field1=conf['field1'],
+ field2=conf['field2']
+ )
+
+
diff --git a/packages/torouter-web/src/tui/utils/__init__.py b/packages/torouter-web/src/tui/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/torouter-web/src/tui/utils/configuration.py b/packages/torouter-web/src/tui/utils/configuration.py
new file mode 100644
index 0000000..88bbc05
--- /dev/null
+++ b/packages/torouter-web/src/tui/utils/configuration.py
@@ -0,0 +1,85 @@
+import web
+import config
+
+def get(name):
+ conf = {}
+ # XXX The content of these functions are just
+ # skeletons
+ if name == "wireless":
+ conf['essid'] = "Torouter"
+ conf['encryption'] = "WPA2"
+ conf['key'] = "ljdasjkbcuBH12389Ba"
+ return conf
+ elif name == "firewall":
+ conf['el1'] = "Element 1"
+ conf['el2'] = "Element 2"
+ conf['el3'] = "Element 3"
+ return conf
+ elif name == "wired":
+ conf['el1'] = "Element 1"
+ conf['el2'] = "Element 2"
+ conf['el3'] = "Element 3"
+ return conf
+ elif name == "tor":
+ conf['el1'] = "Element 1"
+ conf['el2'] = "Element 2"
+ conf['el3'] = "Element 3"
+ return conf
+
+def write(name, data):
+ if name == "wireless":
+ return True
+ elif name == "firewall":
+ return True
+ elif name == "wired":
+ return True
+ elif name == "tor":
+ return True
+
+def get_form(name):
+ # Also these are just skeletons
+ if name == "wireless":
+ c = get(name)
+ return web.form.Form(
+ web.form.Textbox(name='essid',
+ description='Wireless ESSID', value=c['essid']),
+ web.form.Dropdown(name='enctype', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
+ description='Wireless encryption scheme', value=c['encryption']),
+ web.form.Password(name='key',
+ description='key', value=c['key']),
+ web.form.Button('save')
+ )
+ elif name == "firewall":
+ c = get(name)
+ return web.form.Form(
+ web.form.Textbox(name='el1',
+ description='The first element', value=c['el2']),
+ web.form.Dropdown(name='el2', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
+ description='The second selement', value=c['el2']),
+ web.form.Password(name='el3',
+ description='The third element', value=c['el3']),
+ web.form.Button('save')
+ )
+ elif name == "wired":
+ c = get(name)
+ return web.form.Form(
+ web.form.Textbox(name='el1',
+ description='The first element', value=c['el2']),
+ web.form.Dropdown(name='el2', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
+ description='The second selement', value=c['el2']),
+ web.form.Password(name='el3',
+ description='The third element', value=c['el3']),
+ web.form.Button('save')
+ )
+ elif name == "tor":
+ c = get(name)
+ return web.form.Form(
+ web.form.Textbox(name='el1',
+ description='The first element', value=c['el2']),
+ web.form.Dropdown(name='el2', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
+ description='The second selement', value=c['el2']),
+ web.form.Password(name='el3',
+ description='The third element', value=c['el3']),
+ web.form.Button('save')
+ )
+
diff --git a/packages/torouter-web/src/tui/utils/parsing.py b/packages/torouter-web/src/tui/utils/parsing.py
new file mode 100644
index 0000000..e9ccc83
--- /dev/null
+++ b/packages/torouter-web/src/tui/utils/parsing.py
@@ -0,0 +1,83 @@
+# These functions are for parsing /etc/network/interface
+# files, they will be used inside torouter to visualize
+# and edit configuration
+import os
+
+class interfaces:
+ def __init__(self,filename):
+ self.fp = open(filename, "r")
+ self.wifi = {}
+ self.eth1 = {}
+ self.eth0 = {}
+
+ def parse_line(self, line, iface):
+ name = line.split(" ")[0]
+ values = " ".join(line.split(" ")[1:]).rstrip()
+ if iface == "uap0":
+ if self.wifi.has_key(name):
+ if type(self.wifi[name]) is list:
+ self.wifi[name].append(values)
+ else:
+ self.wifi[name] = [self.wifi[name],values]
+ else:
+ self.wifi.update({name : values})
+ elif iface == "eth1":
+ if self.eth1.has_key(name):
+ if type(self.eth1[name]) is list:
+ self.eth1[name].append(values)
+ else:
+ self.eth1[name] = [self.eth1[name],values]
+ else:
+ self.eth1.update({name : values})
+ elif iface == "eth0":
+ if self.eth0.has_key(name):
+ if type(self.eth0[name]) is list:
+ self.eth0[name].append(values)
+ else:
+ self.eth0[name] = [self.eth0[name],values]
+ else:
+ self.eth0.update({name : values})
+
+ def parse(self):
+ iface = None
+ for line in self.fp.readlines():
+ line = line.lstrip()
+ if line.startswith("#") or line == "":
+ continue
+ if line.startswith("iface"):
+ iface = line.split(" ")[1]
+ if iface:
+ self.parse_line(line, iface)
+
+ def html_output(self, data):
+ output = "<h3>Interface %s</h3>\n" % data['iface'].split(" ")[0]
+ output += "<table class=\"interface\" id=\"%s\">\n" % data['iface'].split(" ")[0]
+
+ for item in data.items():
+ if item[0] != "iface":
+ if type(item[1]) is list:
+ for i in item[1]:
+ output += "<tr><td>%s</td><td>%s</td></tr>\n" % (item[0], i)
+ else:
+ output += "<tr><td>%s</td><td>%s</td></tr>\n" % (item[0],item[1])
+ output += "</table>"
+ print output
+ return output
+
+ def output(self, data):
+ print "iface %s" % data['iface']
+ for item in data.items():
+ if item[0] != "iface":
+ if type(item[1]) is list:
+ for i in item[1]:
+ print "%s %s" % (item[0], i)
+ else:
+ print "%s %s" % (item[0],item[1])
+
+#interfaces_file = os.getcwd() + "/../../../torouter-prep/configs/interfaces"
+#itfc = interfaces(interfaces_file)
+#itfc.parse()
+#itfc.html_output(itfc.wifi)
+#itfc.html_output(itfc.eth1)
+#itfc.html_output(itfc.eth0)
+
diff --git a/packages/torouter-web/src/tui/utils/session.py b/packages/torouter-web/src/tui/utils/session.py
new file mode 100644
index 0000000..a554dad
--- /dev/null
+++ b/packages/torouter-web/src/tui/utils/session.py
@@ -0,0 +1,26 @@
+import web
+import config
+
+# The main session class
+
+def add_session_to_app(app):
+
+ if web.config.get("_session") is None:
+ store = web.session.DiskStore('sessions')
+ session = web.session.Session(app, store, initializer={'login': 0, 'privilege': 0})
+ web.config._session = session
+ else:
+ session = web.config._session
+
+def is_logged():
+ return web.config._session.login
+
+def check_login(data):
+ if (data.user == config.authinfo[0]) and (data.password == config.authinfo[1]):
+ web.config._session.login = 1
+ return 0
+ return 1
+
+def logout():
+ web.config._session.kill()
+
diff --git a/packages/torouter-web/src/tui/views/base.html b/packages/torouter-web/src/tui/views/base.html
new file mode 100644
index 0000000..bce4110
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/base.html
@@ -0,0 +1,30 @@
+$def with (page,submenu=None)
+
+<!html>
+
+<html>
+<head>
+ <title>TUI - Tor Web User Interface</title>
+ <link REL="stylesheet" href="/static/main.css" type="text/css">
+</head>
+<body>
+<div class="header">
+ <ul id="menu">
+ <li><a href="/">Home</a></li>
+ <li><a href="/network">Network</a></li>
+ <li><a href="/tor">Tor</a></li>
+ <li><a href="/logout">logout</a></li>
+ </ul>
+ $:submenu
+</div>
+
+<div class="wrapper">
+$:page
+</div>
+
+<div class="footer">
+2011 - The Tor Project
+</div>
+
+</body>
+</html>
diff --git a/packages/torouter-web/src/tui/views/firewall.html b/packages/torouter-web/src/tui/views/firewall.html
new file mode 100644
index 0000000..30f5a9b
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/firewall.html
@@ -0,0 +1,7 @@
+$def with (form)
+
+<h2>Firewall configuration page</h2>
+
+<form action="" method="POST">
+$:form.render()
+</form>
diff --git a/packages/torouter-web/src/tui/views/index.html b/packages/torouter-web/src/tui/views/index.html
new file mode 100644
index 0000000..3907d84
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/index.html
@@ -0,0 +1 @@
+The main index
diff --git a/packages/torouter-web/src/tui/views/login.html b/packages/torouter-web/src/tui/views/login.html
new file mode 100644
index 0000000..1377078
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/login.html
@@ -0,0 +1,7 @@
+Login is required
+<form method="POST" action="/">
+ Login: <input type="text" name="user">
+ Password: <input type="password" name="password">
+ <input type="submit" name="login">
+</form>
+
diff --git a/packages/torouter-web/src/tui/views/logout.html b/packages/torouter-web/src/tui/views/logout.html
new file mode 100644
index 0000000..f027ed4
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/logout.html
@@ -0,0 +1 @@
+Successfully logged out!
diff --git a/packages/torouter-web/src/tui/views/main.html b/packages/torouter-web/src/tui/views/main.html
new file mode 100644
index 0000000..dc503e7
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/main.html
@@ -0,0 +1 @@
+the main page
diff --git a/packages/torouter-web/src/tui/views/saved.html b/packages/torouter-web/src/tui/views/saved.html
new file mode 100644
index 0000000..ba14488
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/saved.html
@@ -0,0 +1,8 @@
+$def with (content)
+
+<ul>
+
+$for i in content.items():
+ <li><em>$i[0]</em>: $i[1]</li>
+
+</ul>
diff --git a/packages/torouter-web/src/tui/views/status.html b/packages/torouter-web/src/tui/views/status.html
new file mode 100644
index 0000000..bfe2fcd
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/status.html
@@ -0,0 +1,3 @@
+$def with (content)
+
+$:content
diff --git a/packages/torouter-web/src/tui/views/torconfig.html b/packages/torouter-web/src/tui/views/torconfig.html
new file mode 100644
index 0000000..26bd228
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/torconfig.html
@@ -0,0 +1 @@
+The main Tor config page
diff --git a/packages/torouter-web/src/tui/views/torstatus.html b/packages/torouter-web/src/tui/views/torstatus.html
new file mode 100644
index 0000000..ed83531
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/torstatus.html
@@ -0,0 +1 @@
+The main Tor status page
diff --git a/packages/torouter-web/src/tui/views/wired.html b/packages/torouter-web/src/tui/views/wired.html
new file mode 100644
index 0000000..3676f63
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/wired.html
@@ -0,0 +1,7 @@
+$def with (form)
+
+<h2>Wired configuration page</h2>
+
+<form action="" method="POST">
+$:form.render()
+</form>
diff --git a/packages/torouter-web/src/tui/views/wireless.html b/packages/torouter-web/src/tui/views/wireless.html
new file mode 100644
index 0000000..48242bc
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/wireless.html
@@ -0,0 +1,8 @@
+$def with (form)
+
+<h2>Wireless configuration page</h2>
+
+<form action="" method="POST">
+$:form.render()
+</form>
+
diff --git a/packages/torouter-web/src/tui/views/wizard.html b/packages/torouter-web/src/tui/views/wizard.html
new file mode 100644
index 0000000..0890507
--- /dev/null
+++ b/packages/torouter-web/src/tui/views/wizard.html
@@ -0,0 +1,12 @@
+$def with (wiz_form, text, step, next_step)
+
+<h1>Step number $step</h1>
+
+$text
+
+<form action="/wizard/$next_step" method="POST">
+$:wiz_form.render()
+
+</form>
+
+<!-- a href=/wizard/$next_step>Next ($next_step)</a-->
diff --git a/packages/torouter-web/src/view.py b/packages/torouter-web/src/view.py
new file mode 100644
index 0000000..f4c9b39
--- /dev/null
+++ b/packages/torouter-web/src/view.py
@@ -0,0 +1,11 @@
+import web
+import config
+
+t_globals = dict(
+ datestr=web.datestr,
+ )
+
+# create the render object
+render = web.template.render('tui/views', cache=config.cache, globals=t_globals)
+render._keywords['globals']['render'] = render
+
diff --git a/packages/torouter-web/static/main.css b/packages/torouter-web/static/main.css
deleted file mode 100644
index 5626e92..0000000
--- a/packages/torouter-web/static/main.css
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/* Clear all */
-body { margin: 0;border: 0;padding: 0; }
-
-div.wrapper {
- min-height: 300px;
- width: 800px;
- margin: 0 auto;
-}
-
-div.footer {
- text-align: center;
- background-color: #333;
- color: white;
- padding-top: 20px;
- padding-bottom: 20px;
-}
-
-div.header {
- color: white;
-}
-
-div.header ul {
- list-style: none;
- height: 20px;
-}
-
-div.header ul li {
- font-size: 20px;
- float: left;
- padding: 5px 10px;
-}
-
-div.header ul#submenu li {
- font-size: 15px;
-}
-
diff --git a/packages/torouter-web/tui/__init__.py b/packages/torouter-web/tui/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/torouter-web/tui/controllers/__init__.py b/packages/torouter-web/tui/controllers/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/torouter-web/tui/controllers/main.py b/packages/torouter-web/tui/controllers/main.py
deleted file mode 100644
index 060caa6..0000000
--- a/packages/torouter-web/tui/controllers/main.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import web
-import view, config
-from view import render
-from tui.utils import session
-
-"""
-The main page for network configuration
-"""
-class index:
- def GET(self):
- if session.is_logged() > 0:
- return render.base(render.index())
- else:
- return render.base(render.login())
-
- def POST(self):
- if session.check_login(web.input()) == 0:
- return render.base(render.index())
- else:
- return render.base(render.login())
-
-class logout:
- def GET(self):
- session.logout()
- return render.base(render.logout())
-
diff --git a/packages/torouter-web/tui/controllers/network.py b/packages/torouter-web/tui/controllers/network.py
deleted file mode 100644
index d189d0c..0000000
--- a/packages/torouter-web/tui/controllers/network.py
+++ /dev/null
@@ -1,129 +0,0 @@
-import web
-import view, config
-from view import render
-from tui.utils import session,configuration,parsing
-
-"""
-This function is used to generate the network
-submenus.
-"""
-def menu(n):
- a = []
- for i in range(0,5):
- if i == n:
- a.append("sel")
- else:
- a.append("")
- print a
- return """<ul id="submenu">
- <li><a href="/network" class="%s">Main</a></li>
- <li><a href="/network/firewall" class="%s">Firewall</a></li>
- <li><a href="/network/wireless" class="%s">Wireless</a></li>
- <li><a href="/network/wired" class="%s">Wired</a></li>
- <li><a href="/network/status" class="%s">Status</a></li>
-</ul>
-""" % tuple(a)
-
-"""
-The main page for network configuration
-"""
-class main:
- # XXX do all the backend stuff
- def update_config(self, data):
- return True
-
- def GET(self):
- if session.is_logged() > 0:
- return render.base(render.main(),menu(0))
- else:
- return render.base(render.login())
-
- def POST(self):
- if session.is_logged() > 0:
- self.update_config(web.input())
- return render.base(render.main(),menu(0))
- else:
- return render.base(render.login())
-
-"""
-The firewall configuration page
-"""
-class firewall:
- # XXX do all the backend stuff
- def update_config(self, data):
- return True
-
- def GET(self):
- if session.is_logged() > 0:
- return render.base(render.firewall(configuration.get_form("firewall")),menu(0))
- else:
- return render.base(render.login())
-
- def POST(self):
- if session.is_logged() > 0:
- self.update_config(web.input())
- return render.base(render.firewall(),menu(1))
- else:
- return render.base(render.login())
-
-
-
-"""
-Wireless network configuration page
-"""
-class wireless:
- # XXX do all the backend stuff
- def update_config(self, data):
- return True
-
- def GET(self):
- if session.is_logged() > 0:
- return render.base(render.wireless(configuration.get_form("wireless")),menu(2))
- else:
- return render.base(render.login())
-
- def POST(self):
- if session.is_logged() > 0:
- self.update_config(web.input())
- print web.input()
- return render.base(render.saved(web.input()),menu(2))
- else:
- return render.base(render.login())
-
-"""
-Wired network configuration page
-"""
-class wired:
- # XXX do all the backend stuff
- def update_config(self, data):
- return True
-
- def GET(self):
- if session.is_logged() > 0:
- return render.base(render.wired(configuration.get_form("wired")),menu(3))
- else:
- return render.base(render.login())
-
- def POST(self):
- if session.is_logged() > 0:
- self.update_config(web.input())
- return render.base(render.wired(),menu(3))
- else:
- return render.base(render.login())
-
-"""
-General status page, displays a bit more detail than main
-"""
-class status:
- def GET(self):
- itfc = parsing.interfaces(config.interfaces_file)
- itfc.parse()
- network = itfc.html_output(itfc.wifi) + itfc.html_output(itfc.eth0) + itfc.html_output(itfc.eth1)
- return render.base(render.status(network),menu(4))
-
- def POST(self):
- itfc = parsing.interfaces(config.interfaces_file)
- itfc.parse()
- network = itfc.html_output(itfc.wifi) + itfc.html_output(itfc.eth0) + itfc.html_output(itfc.eth1)
- return render.base(render.status(),menu(4))
-
diff --git a/packages/torouter-web/tui/controllers/old/main.py b/packages/torouter-web/tui/controllers/old/main.py
deleted file mode 100644
index 9127e72..0000000
--- a/packages/torouter-web/tui/controllers/old/main.py
+++ /dev/null
@@ -1,11 +0,0 @@
-import web
-
-
-class index:
- def GET(self):
- return "index"
-
-class config:
- def GET(self):
- return "config"
-
diff --git a/packages/torouter-web/tui/controllers/old/status.py b/packages/torouter-web/tui/controllers/old/status.py
deleted file mode 100644
index 05f0bf8..0000000
--- a/packages/torouter-web/tui/controllers/old/status.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import web
-import config
-
-from config import views
-from web import form
-
-class status:
- def GET():
- print "status"
diff --git a/packages/torouter-web/tui/controllers/old/wizard.py b/packages/torouter-web/tui/controllers/old/wizard.py
deleted file mode 100644
index 7b82df2..0000000
--- a/packages/torouter-web/tui/controllers/old/wizard.py
+++ /dev/null
@@ -1,81 +0,0 @@
-import web
-
-from web import form
-from config import view
-
-class step:
- cur_step = 1
- next_step = 2
- wiztext = []
- wizform = []
-
- wiztext.append("Tor Configuration")
- wizform.append(form.Form(
- form.Textbox('Nickname',
- form.notnull, description="Relay Nickname"),
- form.Textbox('RelayBandwidthRate',
- form.notnull, description="Relay Bandwidth Rate"),
- form.Textbox('RelayBandwidthBurst',
- form.notnull, description="Relay Bandwidth Burst"),
- form.Textbox('ContactInfo',
- form.notnull, description="Contact Info"),
- form.Textbox('ExitPolicy',
- form.notnull, description="Exit Policy"),
- form.Button('Next Step')
- ))
-
- wiztext.append("Wireless setup")
- wizform.append(form.Form(
- form.Textbox('essid',
- form.notnull, description="Wireless ESSID"),
- form.Textbox('mac',
- form.notnull, description="MAC address"),
- form.Textbox('whatever',
- form.notnull, description="Wireless ESSID"),
- form.Button('Next Step')
- ))
-
- wiztext.append("")
- wizform.append(form.Form(
- form.Textbox('essid',
- form.notnull, description="Wireless ESSID"),
- form.Textbox('mac',
- form.notnull, description="MAC address"),
- form.Textbox('whatever',
- form.notnull, description="Wireless ESSID"),
- form.Button('Next Step')
- ))
-
- wiztext.append("")
- wizform.append(form.Form(
- form.Textbox('essid',
- form.notnull, description="Wireless ESSID"),
- form.Textbox('mac',
- form.notnull, description="MAC address"),
- form.Textbox('whatever',
- form.notnull, description="Wireless ESSID"),
- form.Button('Next Step')
- ))
-
- def GET(self, step):
- if step:
- self.cur_step = int(step)
- self.next_step = int(step) + 1
- else:
- self.cur_step = 1
- self.next_step = 2
- if len(self.wizform) < int(self.cur_step):
- return "Done!"
- return view.wizard(self.wizform[self.cur_step-1], self.wiztext[self.cur_step-1], self.cur_step, self.next_step)
-
- def POST(self, step):
- x = web.input()
- self.cur_step = int(step)
- self.next_step = int(step) + 1
- if len(self.wizform) < int(self.cur_step):
- return "Done!"
- return view.wizard(self.wizform[self.cur_step-1], self.wiztext[self.cur_step-1], self.cur_step, self.next_step)
-
-
-
-
diff --git a/packages/torouter-web/tui/controllers/tor.py b/packages/torouter-web/tui/controllers/tor.py
deleted file mode 100644
index d07cb71..0000000
--- a/packages/torouter-web/tui/controllers/tor.py
+++ /dev/null
@@ -1,29 +0,0 @@
-import web
-import view, config
-from view import render
-from tui.utils import session
-
-"""
-The main Tor status page
-"""
-class status:
- def GET(self):
- return render.base(render.torstatus())
-
- def POST(self):
- return render.base(render.torstatus())
-
-"""
-Tor configuration page
-"""
-class config:
- def update_config(self, data):
- return True
-
- def GET(self):
- return render.base(render.torconfig())
-
- def POST(self):
- self.update_config(web.input())
- return render.base(render.torconfig())
-
diff --git a/packages/torouter-web/tui/models/router_config.py b/packages/torouter-web/tui/models/router_config.py
deleted file mode 100644
index e83f9aa..0000000
--- a/packages/torouter-web/tui/models/router_config.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import web
-from config import db
-
-def new_config(conf):
- db.insert('router_config',
- essid=conf['essid'],
- field1=conf['field1'],
- field2=conf['field2']
- )
-
-
-def write_config():
- db.update('router_config',
- essid=conf['essid'],
- field1=conf['field1'],
- field2=conf['field2']
- )
-
-
diff --git a/packages/torouter-web/tui/utils/__init__.py b/packages/torouter-web/tui/utils/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/torouter-web/tui/utils/configuration.py b/packages/torouter-web/tui/utils/configuration.py
deleted file mode 100644
index 88bbc05..0000000
--- a/packages/torouter-web/tui/utils/configuration.py
+++ /dev/null
@@ -1,85 +0,0 @@
-import web
-import config
-
-def get(name):
- conf = {}
- # XXX The content of these functions are just
- # skeletons
- if name == "wireless":
- conf['essid'] = "Torouter"
- conf['encryption'] = "WPA2"
- conf['key'] = "ljdasjkbcuBH12389Ba"
- return conf
- elif name == "firewall":
- conf['el1'] = "Element 1"
- conf['el2'] = "Element 2"
- conf['el3'] = "Element 3"
- return conf
- elif name == "wired":
- conf['el1'] = "Element 1"
- conf['el2'] = "Element 2"
- conf['el3'] = "Element 3"
- return conf
- elif name == "tor":
- conf['el1'] = "Element 1"
- conf['el2'] = "Element 2"
- conf['el3'] = "Element 3"
- return conf
-
-def write(name, data):
- if name == "wireless":
- return True
- elif name == "firewall":
- return True
- elif name == "wired":
- return True
- elif name == "tor":
- return True
-
-def get_form(name):
- # Also these are just skeletons
- if name == "wireless":
- c = get(name)
- return web.form.Form(
- web.form.Textbox(name='essid',
- description='Wireless ESSID', value=c['essid']),
- web.form.Dropdown(name='enctype', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
- description='Wireless encryption scheme', value=c['encryption']),
- web.form.Password(name='key',
- description='key', value=c['key']),
- web.form.Button('save')
- )
- elif name == "firewall":
- c = get(name)
- return web.form.Form(
- web.form.Textbox(name='el1',
- description='The first element', value=c['el2']),
- web.form.Dropdown(name='el2', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
- description='The second selement', value=c['el2']),
- web.form.Password(name='el3',
- description='The third element', value=c['el3']),
- web.form.Button('save')
- )
- elif name == "wired":
- c = get(name)
- return web.form.Form(
- web.form.Textbox(name='el1',
- description='The first element', value=c['el2']),
- web.form.Dropdown(name='el2', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
- description='The second selement', value=c['el2']),
- web.form.Password(name='el3',
- description='The third element', value=c['el3']),
- web.form.Button('save')
- )
- elif name == "tor":
- c = get(name)
- return web.form.Form(
- web.form.Textbox(name='el1',
- description='The first element', value=c['el2']),
- web.form.Dropdown(name='el2', args=['WPA2', 'WPA', 'WEP (not reccomended)', 'open'],
- description='The second selement', value=c['el2']),
- web.form.Password(name='el3',
- description='The third element', value=c['el3']),
- web.form.Button('save')
- )
-
diff --git a/packages/torouter-web/tui/utils/parsing.py b/packages/torouter-web/tui/utils/parsing.py
deleted file mode 100644
index e9ccc83..0000000
--- a/packages/torouter-web/tui/utils/parsing.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# These functions are for parsing /etc/network/interface
-# files, they will be used inside torouter to visualize
-# and edit configuration
-import os
-
-class interfaces:
- def __init__(self,filename):
- self.fp = open(filename, "r")
- self.wifi = {}
- self.eth1 = {}
- self.eth0 = {}
-
- def parse_line(self, line, iface):
- name = line.split(" ")[0]
- values = " ".join(line.split(" ")[1:]).rstrip()
- if iface == "uap0":
- if self.wifi.has_key(name):
- if type(self.wifi[name]) is list:
- self.wifi[name].append(values)
- else:
- self.wifi[name] = [self.wifi[name],values]
- else:
- self.wifi.update({name : values})
- elif iface == "eth1":
- if self.eth1.has_key(name):
- if type(self.eth1[name]) is list:
- self.eth1[name].append(values)
- else:
- self.eth1[name] = [self.eth1[name],values]
- else:
- self.eth1.update({name : values})
- elif iface == "eth0":
- if self.eth0.has_key(name):
- if type(self.eth0[name]) is list:
- self.eth0[name].append(values)
- else:
- self.eth0[name] = [self.eth0[name],values]
- else:
- self.eth0.update({name : values})
-
- def parse(self):
- iface = None
- for line in self.fp.readlines():
- line = line.lstrip()
- if line.startswith("#") or line == "":
- continue
- if line.startswith("iface"):
- iface = line.split(" ")[1]
- if iface:
- self.parse_line(line, iface)
-
- def html_output(self, data):
- output = "<h3>Interface %s</h3>\n" % data['iface'].split(" ")[0]
- output += "<table class=\"interface\" id=\"%s\">\n" % data['iface'].split(" ")[0]
-
- for item in data.items():
- if item[0] != "iface":
- if type(item[1]) is list:
- for i in item[1]:
- output += "<tr><td>%s</td><td>%s</td></tr>\n" % (item[0], i)
- else:
- output += "<tr><td>%s</td><td>%s</td></tr>\n" % (item[0],item[1])
- output += "</table>"
- print output
- return output
-
- def output(self, data):
- print "iface %s" % data['iface']
- for item in data.items():
- if item[0] != "iface":
- if type(item[1]) is list:
- for i in item[1]:
- print "%s %s" % (item[0], i)
- else:
- print "%s %s" % (item[0],item[1])
-
-#interfaces_file = os.getcwd() + "/../../../torouter-prep/configs/interfaces"
-#itfc = interfaces(interfaces_file)
-#itfc.parse()
-#itfc.html_output(itfc.wifi)
-#itfc.html_output(itfc.eth1)
-#itfc.html_output(itfc.eth0)
-
diff --git a/packages/torouter-web/tui/utils/session.py b/packages/torouter-web/tui/utils/session.py
deleted file mode 100644
index a554dad..0000000
--- a/packages/torouter-web/tui/utils/session.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import web
-import config
-
-# The main session class
-
-def add_session_to_app(app):
-
- if web.config.get("_session") is None:
- store = web.session.DiskStore('sessions')
- session = web.session.Session(app, store, initializer={'login': 0, 'privilege': 0})
- web.config._session = session
- else:
- session = web.config._session
-
-def is_logged():
- return web.config._session.login
-
-def check_login(data):
- if (data.user == config.authinfo[0]) and (data.password == config.authinfo[1]):
- web.config._session.login = 1
- return 0
- return 1
-
-def logout():
- web.config._session.kill()
-
diff --git a/packages/torouter-web/tui/views/base.html b/packages/torouter-web/tui/views/base.html
deleted file mode 100644
index bce4110..0000000
--- a/packages/torouter-web/tui/views/base.html
+++ /dev/null
@@ -1,30 +0,0 @@
-$def with (page,submenu=None)
-
-<!html>
-
-<html>
-<head>
- <title>TUI - Tor Web User Interface</title>
- <link REL="stylesheet" href="/static/main.css" type="text/css">
-</head>
-<body>
-<div class="header">
- <ul id="menu">
- <li><a href="/">Home</a></li>
- <li><a href="/network">Network</a></li>
- <li><a href="/tor">Tor</a></li>
- <li><a href="/logout">logout</a></li>
- </ul>
- $:submenu
-</div>
-
-<div class="wrapper">
-$:page
-</div>
-
-<div class="footer">
-2011 - The Tor Project
-</div>
-
-</body>
-</html>
diff --git a/packages/torouter-web/tui/views/firewall.html b/packages/torouter-web/tui/views/firewall.html
deleted file mode 100644
index 30f5a9b..0000000
--- a/packages/torouter-web/tui/views/firewall.html
+++ /dev/null
@@ -1,7 +0,0 @@
-$def with (form)
-
-<h2>Firewall configuration page</h2>
-
-<form action="" method="POST">
-$:form.render()
-</form>
diff --git a/packages/torouter-web/tui/views/index.html b/packages/torouter-web/tui/views/index.html
deleted file mode 100644
index 3907d84..0000000
--- a/packages/torouter-web/tui/views/index.html
+++ /dev/null
@@ -1 +0,0 @@
-The main index
diff --git a/packages/torouter-web/tui/views/login.html b/packages/torouter-web/tui/views/login.html
deleted file mode 100644
index 1377078..0000000
--- a/packages/torouter-web/tui/views/login.html
+++ /dev/null
@@ -1,7 +0,0 @@
-Login is required
-<form method="POST" action="/">
- Login: <input type="text" name="user">
- Password: <input type="password" name="password">
- <input type="submit" name="login">
-</form>
-
diff --git a/packages/torouter-web/tui/views/logout.html b/packages/torouter-web/tui/views/logout.html
deleted file mode 100644
index f027ed4..0000000
--- a/packages/torouter-web/tui/views/logout.html
+++ /dev/null
@@ -1 +0,0 @@
-Successfully logged out!
diff --git a/packages/torouter-web/tui/views/main.html b/packages/torouter-web/tui/views/main.html
deleted file mode 100644
index dc503e7..0000000
--- a/packages/torouter-web/tui/views/main.html
+++ /dev/null
@@ -1 +0,0 @@
-the main page
diff --git a/packages/torouter-web/tui/views/saved.html b/packages/torouter-web/tui/views/saved.html
deleted file mode 100644
index ba14488..0000000
--- a/packages/torouter-web/tui/views/saved.html
+++ /dev/null
@@ -1,8 +0,0 @@
-$def with (content)
-
-<ul>
-
-$for i in content.items():
- <li><em>$i[0]</em>: $i[1]</li>
-
-</ul>
diff --git a/packages/torouter-web/tui/views/status.html b/packages/torouter-web/tui/views/status.html
deleted file mode 100644
index bfe2fcd..0000000
--- a/packages/torouter-web/tui/views/status.html
+++ /dev/null
@@ -1,3 +0,0 @@
-$def with (content)
-
-$:content
diff --git a/packages/torouter-web/tui/views/torconfig.html b/packages/torouter-web/tui/views/torconfig.html
deleted file mode 100644
index 26bd228..0000000
--- a/packages/torouter-web/tui/views/torconfig.html
+++ /dev/null
@@ -1 +0,0 @@
-The main Tor config page
diff --git a/packages/torouter-web/tui/views/torstatus.html b/packages/torouter-web/tui/views/torstatus.html
deleted file mode 100644
index ed83531..0000000
--- a/packages/torouter-web/tui/views/torstatus.html
+++ /dev/null
@@ -1 +0,0 @@
-The main Tor status page
diff --git a/packages/torouter-web/tui/views/wired.html b/packages/torouter-web/tui/views/wired.html
deleted file mode 100644
index 3676f63..0000000
--- a/packages/torouter-web/tui/views/wired.html
+++ /dev/null
@@ -1,7 +0,0 @@
-$def with (form)
-
-<h2>Wired configuration page</h2>
-
-<form action="" method="POST">
-$:form.render()
-</form>
diff --git a/packages/torouter-web/tui/views/wireless.html b/packages/torouter-web/tui/views/wireless.html
deleted file mode 100644
index 48242bc..0000000
--- a/packages/torouter-web/tui/views/wireless.html
+++ /dev/null
@@ -1,8 +0,0 @@
-$def with (form)
-
-<h2>Wireless configuration page</h2>
-
-<form action="" method="POST">
-$:form.render()
-</form>
-
diff --git a/packages/torouter-web/tui/views/wizard.html b/packages/torouter-web/tui/views/wizard.html
deleted file mode 100644
index 0890507..0000000
--- a/packages/torouter-web/tui/views/wizard.html
+++ /dev/null
@@ -1,12 +0,0 @@
-$def with (wiz_form, text, step, next_step)
-
-<h1>Step number $step</h1>
-
-$text
-
-<form action="/wizard/$next_step" method="POST">
-$:wiz_form.render()
-
-</form>
-
-<!-- a href=/wizard/$next_step>Next ($next_step)</a-->
diff --git a/packages/torouter-web/view.py b/packages/torouter-web/view.py
deleted file mode 100644
index f4c9b39..0000000
--- a/packages/torouter-web/view.py
+++ /dev/null
@@ -1,11 +0,0 @@
-import web
-import config
-
-t_globals = dict(
- datestr=web.datestr,
- )
-
-# create the render object
-render = web.template.render('tui/views', cache=config.cache, globals=t_globals)
-render._keywords['globals']['render'] = render
-
1
0

[torouter/master] Merge branch 'master' of ssh://git-rw.torproject.org/torouter
by ioerror@torproject.org 17 Aug '11
by ioerror@torproject.org 17 Aug '11
17 Aug '11
commit 57e54f969b840546925d16ceceb130a0f3927140
Merge: 7026005 525766e
Author: Jacob Appelbaum <jacob(a)appelbaum.net>
Date: Wed Aug 17 19:31:22 2011 +0200
Merge branch 'master' of ssh://git-rw.torproject.org/torouter
packages/torouter-web/src/config.py | 1 +
packages/torouter-web/src/runui.py | 2 +-
packages/torouter-web/src/static/main.css | 14 +++++++++++++
packages/torouter-web/src/tui/controllers/tor.py | 14 +++++++++---
packages/torouter-web/src/tui/utils/parsing.py | 21 ++++++++++++++++++++
packages/torouter-web/src/tui/views/torstatus.html | 4 ++-
6 files changed, 50 insertions(+), 6 deletions(-)
diff --cc packages/torouter-web/src/config.py
index 8fd716d,0000000..15057df
mode 100644,000000..100644
--- a/packages/torouter-web/src/config.py
+++ b/packages/torouter-web/src/config.py
@@@ -1,15 -1,0 +1,16 @@@
+# tui, Tor web UI
+# by Arturo Filasto' <hellais(a)torproject.org>
+#
+
+import web, os
+
+cache = False
+
+globals = {}
+
+# Add your own (username, password) pair
+authinfo = ("test", "test")
+
+interfaces_file = os.getcwd() + "/../torouter-prep/configs/interfaces"
++torrc_file = os.getcwd() + "/../torouter-prep/configs/torrc"
+
diff --cc packages/torouter-web/src/runui.py
index 3d2dfc8,0000000..80836b3
mode 100644,000000..100644
--- a/packages/torouter-web/src/runui.py
+++ b/packages/torouter-web/src/runui.py
@@@ -1,35 -1,0 +1,35 @@@
+# tui - Tor web UI
+# by Arturo Filasto' <hellais(a)torproject.org>
+#
+
+import web
+import config
+import tui.controllers
+
+from tui.utils import session
+from view import render
+
+
+# This is the main structure of URLs
+urls = (
+ '/', 'tui.controllers.main.index',
+# '/config/(tor|router)', 'tui.controllers.main.config',
+ '/network', 'tui.controllers.network.main',
+ '/network/firewall', 'tui.controllers.network.firewall',
+ '/network/wireless', 'tui.controllers.network.wireless',
+ '/network/wired', 'tui.controllers.network.wired',
+ '/network/status', 'tui.controllers.network.status',
+ '/tor', 'tui.controllers.tor.status',
- '/tor/config', 'tui.controllers.tor.config',
++ '/tor/config', 'tui.controllers.tor.torrc',
+ '/logout', 'tui.controllers.main.logout'
+ )
+# '/wizard/([0-9a-f]{1,2})?', 'tui.controllers.wizard.step',
+# '/status', 'tui.controllers.status')
+
+if __name__ == "__main__":
+ app = web.application(urls, globals())
+ # Add session management to the app
+ session.add_session_to_app(app)
+ app.internalerror = web.debugerror
+ app.run()
+
diff --cc packages/torouter-web/src/static/main.css
index 5626e92,0000000..34e26cf
mode 100644,000000..100644
--- a/packages/torouter-web/src/static/main.css
+++ b/packages/torouter-web/src/static/main.css
@@@ -1,37 -1,0 +1,51 @@@
+
+/* Clear all */
+body { margin: 0;border: 0;padding: 0; }
+
+div.wrapper {
+ min-height: 300px;
+ width: 800px;
+ margin: 0 auto;
+}
+
+div.footer {
+ text-align: center;
+ background-color: #333;
+ color: white;
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+
+div.header {
+ color: white;
+}
+
+div.header ul {
+ list-style: none;
+ height: 20px;
+}
+
+div.header ul li {
+ font-size: 20px;
+ float: left;
+ padding: 5px 10px;
+}
+
+div.header ul#submenu li {
+ font-size: 15px;
+}
+
++/* More specific stuff */
++#torrc {
++list-style: none;
++line-height: 2em;
++}
++
++#torrc em {
++font-weight: bold;
++font-style: normal;
++}
++
++
++
++
diff --cc packages/torouter-web/src/tui/controllers/tor.py
index d07cb71,0000000..af8678c
mode 100644,000000..100644
--- a/packages/torouter-web/src/tui/controllers/tor.py
+++ b/packages/torouter-web/src/tui/controllers/tor.py
@@@ -1,29 -1,0 +1,35 @@@
+import web
+import view, config
+from view import render
- from tui.utils import session
++from tui.utils import session, parsing
+
+"""
+The main Tor status page
+"""
+class status:
+ def GET(self):
- return render.base(render.torstatus())
++ trc = parsing.torrc(config.torrc_file)
++ trc.parse()
++ output = trc.html_output()
++ return render.base(render.torstatus(output,config.torrc_file))
+
+ def POST(self):
- return render.base(render.torstatus())
++ trc = parsing.torrc(config.torrc_file)
++ trc.parse()
++ output = trc.html_output()
++ return render.base(render.torstatus(output,config.torrc_file))
+
+"""
+Tor configuration page
+"""
- class config:
++class torrc:
+ def update_config(self, data):
+ return True
+
+ def GET(self):
+ return render.base(render.torconfig())
+
+ def POST(self):
+ self.update_config(web.input())
+ return render.base(render.torconfig())
+
diff --cc packages/torouter-web/src/tui/utils/parsing.py
index e9ccc83,0000000..6acf988
mode 100644,000000..100644
--- a/packages/torouter-web/src/tui/utils/parsing.py
+++ b/packages/torouter-web/src/tui/utils/parsing.py
@@@ -1,83 -1,0 +1,104 @@@
+# These functions are for parsing /etc/network/interface
+# files, they will be used inside torouter to visualize
+# and edit configuration
+import os
+
+class interfaces:
+ def __init__(self,filename):
+ self.fp = open(filename, "r")
+ self.wifi = {}
+ self.eth1 = {}
+ self.eth0 = {}
+
+ def parse_line(self, line, iface):
+ name = line.split(" ")[0]
+ values = " ".join(line.split(" ")[1:]).rstrip()
+ if iface == "uap0":
+ if self.wifi.has_key(name):
+ if type(self.wifi[name]) is list:
+ self.wifi[name].append(values)
+ else:
+ self.wifi[name] = [self.wifi[name],values]
+ else:
+ self.wifi.update({name : values})
+ elif iface == "eth1":
+ if self.eth1.has_key(name):
+ if type(self.eth1[name]) is list:
+ self.eth1[name].append(values)
+ else:
+ self.eth1[name] = [self.eth1[name],values]
+ else:
+ self.eth1.update({name : values})
+ elif iface == "eth0":
+ if self.eth0.has_key(name):
+ if type(self.eth0[name]) is list:
+ self.eth0[name].append(values)
+ else:
+ self.eth0[name] = [self.eth0[name],values]
+ else:
+ self.eth0.update({name : values})
+
+ def parse(self):
+ iface = None
+ for line in self.fp.readlines():
+ line = line.lstrip()
+ if line.startswith("#") or line == "":
+ continue
+ if line.startswith("iface"):
+ iface = line.split(" ")[1]
+ if iface:
+ self.parse_line(line, iface)
+
+ def html_output(self, data):
+ output = "<h3>Interface %s</h3>\n" % data['iface'].split(" ")[0]
+ output += "<table class=\"interface\" id=\"%s\">\n" % data['iface'].split(" ")[0]
+
+ for item in data.items():
+ if item[0] != "iface":
+ if type(item[1]) is list:
+ for i in item[1]:
+ output += "<tr><td>%s</td><td>%s</td></tr>\n" % (item[0], i)
+ else:
+ output += "<tr><td>%s</td><td>%s</td></tr>\n" % (item[0],item[1])
+ output += "</table>"
+ print output
+ return output
+
+ def output(self, data):
+ print "iface %s" % data['iface']
+ for item in data.items():
+ if item[0] != "iface":
+ if type(item[1]) is list:
+ for i in item[1]:
+ print "%s %s" % (item[0], i)
+ else:
+ print "%s %s" % (item[0],item[1])
+
++class torrc:
++ def __init__(self,filename):
++ self.fp = open(filename, "r")
++ self.parsed = []
++
++ def parse(self):
++ for line in self.fp.readlines():
++ if line.startswith("#") or line == "":
++ continue
++ else:
++ self.parsed.append(line)
++
++ def html_output(self):
++ output = "<ul id=\"torrc\">"
++ for line in self.parsed:
++ if line != "\n":
++ output += "<li><em>%s</em> %s</li>" % (line.split(" ")[0], " ".join(line.split(" ")[1:]))
++ output += "</ul>"
++ print output
++ return output
++
+#interfaces_file = os.getcwd() + "/../../../torouter-prep/configs/interfaces"
+#itfc = interfaces(interfaces_file)
+#itfc.parse()
+#itfc.html_output(itfc.wifi)
+#itfc.html_output(itfc.eth1)
+#itfc.html_output(itfc.eth0)
+
diff --cc packages/torouter-web/src/tui/views/torstatus.html
index ed83531,0000000..27b2888
mode 100644,000000..100644
--- a/packages/torouter-web/src/tui/views/torstatus.html
+++ b/packages/torouter-web/src/tui/views/torstatus.html
@@@ -1,1 -1,0 +1,3 @@@
- The main Tor status page
++$def with (content, torrc)
++<h2>This is the content of $:torrc</h2>
++$:content
1
0

17 Aug '11
commit 893291936643514b49ece77d5aecab20e52e2200
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Aug 17 12:53:50 2011 -0400
Bufferevents now requires Libevent 2.0.13-stable.
(Earlier Libevent versions have bufferevent bugs that affect us, and
are missing some APIs that it would be handy to use.)
---
changes/require-le-2.0.13 | 7 +++++++
configure.in | 4 ++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/changes/require-le-2.0.13 b/changes/require-le-2.0.13
new file mode 100644
index 0000000..0b9b2f9
--- /dev/null
+++ b/changes/require-le-2.0.13
@@ -0,0 +1,7 @@
+ o Build changes:
+ - Building Tor with bufferevent support now requires Libevent
+ 2.0.13-stable or later. Previous versions of Libevent had bugs
+ in SSL-related bufferevents and related issues that would make
+ Tor work badly with bufferevents. Requiring 2.0.13-stable also
+ means that Tor with bufferevents can take advantage of Libevent
+ APIs introduced after 2.0.8-rc.
diff --git a/configure.in b/configure.in
index 6437183..4a89df6 100644
--- a/configure.in
+++ b/configure.in
@@ -438,7 +438,7 @@ int x = 1;
AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <event2/event.h>
-#if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000800
+#if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
#error
int x = y(zz);
#else
@@ -446,7 +446,7 @@ int x = 1;
#endif
])], [ AC_MSG_RESULT([yes]) ],
[ AC_MSG_RESULT([no])
- AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.8-rc or later]) ] )
+ AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
fi
fi
fi
1
0

17 Aug '11
commit d2cd67c83fff5097d214c8c86169054a5558b902
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Aug 17 13:07:43 2011 -0400
Use evbuffer_copyout() in inspect_evbuffer().
---
changes/require-le-2.0.13 | 5 +++++
src/or/buffers.c | 26 ++++++++------------------
2 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/changes/require-le-2.0.13 b/changes/require-le-2.0.13
index 0b9b2f9..56e7b31 100644
--- a/changes/require-le-2.0.13
+++ b/changes/require-le-2.0.13
@@ -5,3 +5,8 @@
Tor work badly with bufferevents. Requiring 2.0.13-stable also
means that Tor with bufferevents can take advantage of Libevent
APIs introduced after 2.0.8-rc.
+
+ o Minor bugfixes:
+ - Use evbuffer_copyout() in inspect_evbuffer(). This fixes a memory
+ leak, and lets Libevent worry about how to best copy data out
+ of a buffer.
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 488289c..c9c8e43 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -1054,13 +1054,13 @@ fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto)
#ifdef USE_BUFFEREVENTS
/** Try to read <b>n</b> bytes from <b>buf</b> at <b>pos</b> (which may be
* NULL for the start of the buffer), copying the data only if necessary. Set
- * *<b>data</b> to a pointer to the desired bytes. Set <b>free_out</b> to 1
+ * *<b>data_out</b> to a pointer to the desired bytes. Set <b>free_out</b> to 1
* if we needed to malloc *<b>data</b> because the original bytes were
* noncontiguous; 0 otherwise. Return the number of bytes actually available
- * at <b>data</b>.
+ * at *<b>data_out</b>.
*/
static ssize_t
-inspect_evbuffer(struct evbuffer *buf, char **data, size_t n, int *free_out,
+inspect_evbuffer(struct evbuffer *buf, char **data_out, size_t n, int *free_out,
struct evbuffer_ptr *pos)
{
int n_vecs, i;
@@ -1075,25 +1075,15 @@ inspect_evbuffer(struct evbuffer *buf, char **data, size_t n, int *free_out,
struct evbuffer_iovec v;
i = evbuffer_peek(buf, n, pos, &v, 1);
tor_assert(i == 1);
- *data = v.iov_base;
+ *data_out = v.iov_base;
*free_out = 0;
return v.iov_len;
} else {
- struct evbuffer_iovec *vecs =
- tor_malloc(sizeof(struct evbuffer_iovec)*n_vecs);
- size_t copied = 0;
- i = evbuffer_peek(buf, n, NULL, vecs, n_vecs);
- tor_assert(i == n_vecs);
- *data = tor_malloc(n);
- for (i=0; i < n_vecs; ++i) {
- size_t copy = n - copied;
- if (copy > vecs[i].iov_len)
- copy = vecs[i].iov_len;
- tor_assert(copied+copy <= n);
- memcpy(data+copied, vecs[i].iov_base, copy);
- copied += copy;
- }
+ ev_ssize_t copied;
+ *data_out = tor_malloc(n);
*free_out = 1;
+ copied = evbuffer_copyout(buf, *data_out, n);
+ tor_assert(copied >= 0 && (size_t)copied == n);
return copied;
}
}
1
0
commit 4e61f4660c8c5bd5b5fa8a045dd2a39deada65cc
Author: Damian Johnson <atagar(a)torproject.org>
Date: Wed Aug 17 10:16:13 2011 -0700
Adding a dialog for showing usage stats
Dialog is enabled for bridges, guards, and exits to show client locale and exit
port usage statistics.
---
README | 1 +
src/cli/connections/__init__.py | 2 +-
src/cli/connections/connPanel.py | 74 ++++++++++++++++++++++++++++++-
src/cli/connections/countPopup.py | 86 +++++++++++++++++++++++++++++++++++++
4 files changed, 159 insertions(+), 4 deletions(-)
diff --git a/README b/README
index 119d24e..cbaf31a 100644
--- a/README
+++ b/README
@@ -174,6 +174,7 @@ Layout:
connPanel.py - (page 2) lists the active tor connections
circEntry.py - circuit entries in the connection panel
connEntry.py - individual connections to or from the system
+ countPopup.py - displays client locale or exit port counts
descriptorPopup.py - displays raw descriptor and consensus entries
entries.py - common parent for connPanel display entries
diff --git a/src/cli/connections/__init__.py b/src/cli/connections/__init__.py
index 0f29d23..abd3410 100644
--- a/src/cli/connections/__init__.py
+++ b/src/cli/connections/__init__.py
@@ -2,5 +2,5 @@
Connection panel related resources.
"""
-__all__ = ["circEntry", "connEntry", "connPanel", "descriptorPopup", "entries"]
+__all__ = ["circEntry", "connEntry", "connPanel", "countPopup", "descriptorPopup", "entries"]
diff --git a/src/cli/connections/connPanel.py b/src/cli/connections/connPanel.py
index 923902c..9745176 100644
--- a/src/cli/connections/connPanel.py
+++ b/src/cli/connections/connPanel.py
@@ -2,13 +2,14 @@
Listing of the currently established connections tor has made.
"""
+import re
import time
import curses
import threading
import cli.popups
-from cli.connections import descriptorPopup, entries, connEntry, circEntry
+from cli.connections import countPopup, descriptorPopup, entries, connEntry, circEntry
from util import connections, enum, panel, torTools, uiTools
DEFAULT_CONFIG = {"features.connection.resolveApps": True,
@@ -68,6 +69,32 @@ class ConnectionPanel(panel.Panel, threading.Thread):
self._cond = threading.Condition() # used for pausing the thread
self.valsLock = threading.RLock()
+ # Tracks exiting port and client country statistics
+ self._clientLocaleUsage = {}
+ self._exitPortUsage = {}
+
+ # If we're a bridge and been running over a day then prepopulates with the
+ # last day's clients.
+
+ conn = torTools.getConn()
+ bridgeClients = conn.getInfo("status/clients-seen")
+
+ if bridgeClients:
+ # Response has a couple arguments...
+ # TimeStarted="2011-08-17 15:50:49" CountrySummary=us=16,de=8,uk=8
+
+ countrySummary = None
+ for arg in bridgeClients.split():
+ if arg.startswith("CountrySummary="):
+ countrySummary = arg[15:]
+ break
+
+ if countrySummary:
+ for entry in countrySummary.split(","):
+ if re.match("^..=[0-9]+$", entry):
+ locale, count = entry.split("=", 1)
+ self._clientLocaleUsage[locale] = int(count)
+
# Last sampling received from the ConnectionResolver, used to detect when
# it changes.
self._lastResourceFetch = -1
@@ -84,7 +111,7 @@ class ConnectionPanel(panel.Panel, threading.Thread):
entry.getLines()[0].isInitialConnection = True
# listens for when tor stops so we know to stop reflecting changes
- torTools.getConn().addStatusListener(self.torStateListener)
+ conn.addStatusListener(self.torStateListener)
def torStateListener(self, conn, eventType):
"""
@@ -155,6 +182,22 @@ class ConnectionPanel(panel.Panel, threading.Thread):
self.valsLock.release()
+ def isClientsAllowed(self):
+ """
+ True if client connections are permissable, false otherwise.
+ """
+
+ conn = torTools.getConn()
+ return "Guard" in conn.getMyFlags([]) or conn.getOption("BridgeRelay") == "1"
+
+ def isExitsAllowed(self):
+ """
+ True if exit connections are permissable, false otherwise.
+ """
+
+ policy = torTools.getConn().getExitPolicy()
+ return policy and policy.isExitingAllowed()
+
def showSortDialog(self):
"""
Provides the sort dialog for our connections.
@@ -214,6 +257,10 @@ class ConnectionPanel(panel.Panel, threading.Thread):
elif key == ord('d') or key == ord('D'):
# presents popup for raw consensus data
descriptorPopup.showDescriptorPopup(self)
+ elif (key == ord('c') or key == ord('C')) and self.isClientsAllowed():
+ countPopup.showCountDialog(countPopup.CountType.CLIENT_LOCALE, self._clientLocaleUsage)
+ elif (key == ord('e') or key == ord('E')) and self.isExitsAllowed():
+ countPopup.showCountDialog(countPopup.CountType.EXIT_PORT, self._exitPortUsage)
else: isKeystrokeConsumed = False
self.valsLock.release()
@@ -263,6 +310,13 @@ class ConnectionPanel(panel.Panel, threading.Thread):
options.append(("page down", "scroll down a page", None))
options.append(("enter", "edit configuration option", None))
options.append(("d", "raw consensus descriptor", None))
+
+ if self.isClientsAllowed():
+ options.append(("c", "client locale usage summary", None))
+
+ if self.isExitsAllowed():
+ options.append(("e", "exit port usage summary", None))
+
options.append(("l", "listed identity", self._listingType.lower()))
options.append(("s", "sort ordering", None))
options.append(("u", "resolving utility", resolverUtil))
@@ -411,8 +465,22 @@ class ConnectionPanel(panel.Panel, threading.Thread):
# Adds any new connection and circuit entries.
for lIp, lPort, fIp, fPort in newConnections:
newConnEntry = connEntry.ConnectionEntry(lIp, lPort, fIp, fPort)
- if newConnEntry.getLines()[0].getType() != connEntry.Category.CIRCUIT:
+ newConnLine = newConnEntry.getLines()[0]
+
+ if newConnLine.getType() != connEntry.Category.CIRCUIT:
newEntries.append(newConnEntry)
+
+ # updates exit port and client locale usage information
+ if newConnLine.isPrivate():
+ if newConnLine.getType() == connEntry.Category.INBOUND:
+ # client connection, update locale information
+ clientLocale = newConnLine.foreign.getLocale()
+
+ if clientLocale:
+ self._clientLocaleUsage[clientLocale] = self._clientLocaleUsage.get(clientLocale, 0) + 1
+ elif newConnLine.getType() == connEntry.Category.EXIT:
+ exitPort = newConnLine.foreign.getPort()
+ self._exitPortUsage[exitPort] = self._exitPortUsage.get(exitPort, 0) + 1
for circuitID in newCircuits:
status, purpose, path = newCircuits[circuitID]
diff --git a/src/cli/connections/countPopup.py b/src/cli/connections/countPopup.py
new file mode 100644
index 0000000..341087f
--- /dev/null
+++ b/src/cli/connections/countPopup.py
@@ -0,0 +1,86 @@
+"""
+Provides a dialog with client locale or exiting port counts.
+"""
+
+import curses
+import operator
+
+import cli.controller
+import cli.popups
+
+from util import enum, log, uiTools
+
+CountType = enum.Enum("CLIENT_LOCALE", "EXIT_PORT")
+
+def showCountDialog(countType, counts):
+ """
+ Provides a dialog with bar graphs and percentages for the given set of
+ counts. Pressing any key closes the dialog.
+
+ Arguments:
+ countType - type of counts being presented
+ counts - mapping of labels to counts
+ """
+
+ isNoStats = not counts
+ noStatsMsg = "Usage stats aren't available yet, press any key..."
+
+ if isNoStats:
+ popup, width, height = cli.popups.init(3, len(noStatsMsg) + 4)
+ else:
+ popup, width, height = cli.popups.init(4 + max(1, len(counts)), 80)
+ if not popup: return
+
+ try:
+ control = cli.controller.getController()
+
+ popup.win.box()
+
+ # dialog title
+ if countType == CountType.CLIENT_LOCALE:
+ title = "Client Locales"
+ elif countType == CountType.EXIT_PORT:
+ title = "Exiting Port Usage"
+ else:
+ title = ""
+ log.log(log.WARN, "Unrecognized count type: %s" % countType)
+
+ popup.addstr(0, 0, title, curses.A_STANDOUT)
+
+ if isNoStats:
+ popup.addstr(1, 2, noStatsMsg, curses.A_BOLD | uiTools.getColor("cyan"))
+ else:
+ sortedCounts = sorted(counts.iteritems(), key=operator.itemgetter(1))
+ sortedCounts.reverse()
+
+ # constructs string formatting for the max key and value display width
+ keyWidth, valWidth, valueTotal = 3, 1, 0
+ for k, v in sortedCounts:
+ keyWidth = max(keyWidth, len(k))
+ valWidth = max(valWidth, len(str(v)))
+ valueTotal += v
+
+ labelFormat = "%%-%is %%%ii (%%%%%%-2i)" % (keyWidth, valWidth)
+
+ for i in range(height - 4):
+ k, v = sortedCounts[i]
+ label = labelFormat % (k, v, v * 100 / valueTotal)
+ popup.addstr(i + 1, 2, label, curses.A_BOLD | uiTools.getColor("green"))
+
+ # All labels have the same size since they're based on the max widths.
+ # If this changes then this'll need to be the max label width.
+ labelWidth = len(label)
+
+ # draws simple bar graph for percentages
+ fillWidth = v * (width - 4 - labelWidth) / valueTotal
+ for j in range(fillWidth):
+ popup.addstr(i + 1, 3 + labelWidth + j, " ", curses.A_STANDOUT | uiTools.getColor("red"))
+
+ popup.addstr(height - 2, 2, "Press any key...")
+
+ popup.win.refresh()
+
+ curses.cbreak()
+ control.getScreen().getch()
+ finally: cli.popups.finalize()
+
1
0

r24956: {website} Fix the tor browser images to be the correct scale and size, (in website/trunk: css images projects/en)
by Andrew Lewman 17 Aug '11
by Andrew Lewman 17 Aug '11
17 Aug '11
Author: phobos
Date: 2011-08-17 16:55:15 +0000 (Wed, 17 Aug 2011)
New Revision: 24956
Added:
website/trunk/images/tbb-screenshot1.jpg
website/trunk/images/tbb-screenshot2.jpg
website/trunk/images/tbb-screenshot3a.jpg
website/trunk/images/tbb-screenshot3b.jpg
website/trunk/images/tbb-split-screenshot1.jpg
website/trunk/images/tbb-split-screenshot2.jpg
Modified:
website/trunk/css/layout.css
website/trunk/projects/en/torbrowser-split.wml
website/trunk/projects/en/torbrowser.wml
Log:
Fix the tor browser images to be the correct scale and size, fixes
ticket 2674. Thank to jeremy for fixing this.
Modified: website/trunk/css/layout.css
===================================================================
--- website/trunk/css/layout.css 2011-08-17 03:59:30 UTC (rev 24955)
+++ website/trunk/css/layout.css 2011-08-17 16:55:15 UTC (rev 24956)
@@ -226,7 +226,7 @@
width: 960px;
}
- #content img { max-width: 550px; }
+ #content img { max-width: 710px; }
#breadcrumbs { padding: 0 0 10px 5px; }
Added: website/trunk/images/tbb-screenshot1.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/tbb-screenshot1.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
Added: website/trunk/images/tbb-screenshot2.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/tbb-screenshot2.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
Added: website/trunk/images/tbb-screenshot3a.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/tbb-screenshot3a.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
Added: website/trunk/images/tbb-screenshot3b.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/tbb-screenshot3b.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
Added: website/trunk/images/tbb-split-screenshot1.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/tbb-split-screenshot1.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
Added: website/trunk/images/tbb-split-screenshot2.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/tbb-split-screenshot2.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
Modified: website/trunk/projects/en/torbrowser-split.wml
===================================================================
--- website/trunk/projects/en/torbrowser-split.wml 2011-08-17 03:59:30 UTC (rev 24955)
+++ website/trunk/projects/en/torbrowser-split.wml 2011-08-17 16:55:15 UTC (rev 24956)
@@ -100,7 +100,7 @@
<p>After you have downloaded all the files above, double click on the file with the icon of a box (1).</p>
- <p><img src="$(IMGROOT)/tbb-split-screenshot1.png" alt="Screenshot of starting extraction process"></p>
+ <p><img src="$(IMGROOT)/tbb-split-screenshot1.jpg" alt="Screenshot of starting extraction process"></p>
<p>Click on the button labelled <strong>Browse...</strong> (2) and select where you want
to save the bundle then click <strong>OK</strong> (3). At least 50 MB free
@@ -112,7 +112,7 @@
<p>Click <strong>Install</strong> (4) to begin extraction. This may take a
few minutes to complete.</p>
- <p><img src="$(IMGROOT)/tbb-split-screenshot2.png" alt="Screenshot of extraction process"></p>
+ <p><img src="$(IMGROOT)/tbb-split-screenshot2.jpg" alt="Screenshot of extraction process"></p>
<p>Once the extraction has completed, see the <a href="<page projects/torbrowser>#Usage">usage instructions</a> for how to start Tor.</p>
</div>
Modified: website/trunk/projects/en/torbrowser.wml
===================================================================
--- website/trunk/projects/en/torbrowser.wml 2011-08-17 03:59:30 UTC (rev 24955)
+++ website/trunk/projects/en/torbrowser.wml 2011-08-17 16:55:15 UTC (rev 24956)
@@ -220,7 +220,7 @@
<p>Click <strong>Extract</strong> (3) to begin extraction. This may take a
few minutes to complete.</p>
- <p><img src="$(IMGROOT)/tbb-screenshot1.png" alt="Screenshot of
+ <p><img src="$(IMGROOT)/tbb-screenshot1.jpg" alt="Screenshot of
extraction process" /></p>
<a id="Usage"></a>
@@ -233,7 +233,7 @@
<p>The Vidalia window will shortly appear.</p>
- <p><img src="$(IMGROOT)/tbb-screenshot2.png" alt="Screenshot of
+ <p><img src="$(IMGROOT)/tbb-screenshot2.jpg" alt="Screenshot of
bundle startup" /></p>
<p>Once Tor is ready, Firefox will automatically be opened. Only web pages
@@ -251,12 +251,12 @@
For privacy reasons, the list of
webpages you visited and any cookies will be deleted.</p>
- <p><img src="$(IMGROOT)/tbb-screenshot3a.png" alt="Screenshot of
+ <p><img src="$(IMGROOT)/tbb-screenshot3a.jpg" alt="Screenshot of
Firefox" /></p>
<p>With the Tor Browser Bundle, Vidalia and Tor will automatically close. With the Tor IM Browser Bundle you need to also close Pidgin by right-clicking on the Pidgin icon (7), and choosing Quit (8).</p>
- <p><img src="$(IMGROOT)/tbb-screenshot3b.png" alt="Screenshot of
+ <p><img src="$(IMGROOT)/tbb-screenshot3b.jpg" alt="Screenshot of
Pidgin" /></p>
<p>To use the Tor Browser Bundle or Tor IM Browser Bundle again, repeat the steps in <a href="#Usage">"Usage"</a>.</p>
1
0

[torouter/master] Add support for displaying content of torrc file
by hellais@torproject.org 17 Aug '11
by hellais@torproject.org 17 Aug '11
17 Aug '11
commit d435505bea5b9d735447f4900d7e502cae11412f
Author: Arturo Filastò <hellais(a)torproject.org>
Date: Wed Aug 17 18:16:22 2011 +0200
Add support for displaying content of torrc file
---
packages/torouter-web/config.py | 1 +
packages/torouter-web/runui.py | 2 +-
packages/torouter-web/static/main.css | 14 ++++++++++++++
packages/torouter-web/tui/controllers/tor.py | 14 ++++++++++----
packages/torouter-web/tui/utils/parsing.py | 21 +++++++++++++++++++++
packages/torouter-web/tui/views/torstatus.html | 4 +++-
6 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/packages/torouter-web/config.py b/packages/torouter-web/config.py
index 8fd716d..15057df 100644
--- a/packages/torouter-web/config.py
+++ b/packages/torouter-web/config.py
@@ -12,4 +12,5 @@ globals = {}
authinfo = ("test", "test")
interfaces_file = os.getcwd() + "/../torouter-prep/configs/interfaces"
+torrc_file = os.getcwd() + "/../torouter-prep/configs/torrc"
diff --git a/packages/torouter-web/runui.py b/packages/torouter-web/runui.py
index 3d2dfc8..80836b3 100644
--- a/packages/torouter-web/runui.py
+++ b/packages/torouter-web/runui.py
@@ -20,7 +20,7 @@ urls = (
'/network/wired', 'tui.controllers.network.wired',
'/network/status', 'tui.controllers.network.status',
'/tor', 'tui.controllers.tor.status',
- '/tor/config', 'tui.controllers.tor.config',
+ '/tor/config', 'tui.controllers.tor.torrc',
'/logout', 'tui.controllers.main.logout'
)
# '/wizard/([0-9a-f]{1,2})?', 'tui.controllers.wizard.step',
diff --git a/packages/torouter-web/static/main.css b/packages/torouter-web/static/main.css
index 5626e92..34e26cf 100644
--- a/packages/torouter-web/static/main.css
+++ b/packages/torouter-web/static/main.css
@@ -35,3 +35,17 @@ div.header ul#submenu li {
font-size: 15px;
}
+/* More specific stuff */
+#torrc {
+list-style: none;
+line-height: 2em;
+}
+
+#torrc em {
+font-weight: bold;
+font-style: normal;
+}
+
+
+
+
diff --git a/packages/torouter-web/tui/controllers/tor.py b/packages/torouter-web/tui/controllers/tor.py
index d07cb71..af8678c 100644
--- a/packages/torouter-web/tui/controllers/tor.py
+++ b/packages/torouter-web/tui/controllers/tor.py
@@ -1,22 +1,28 @@
import web
import view, config
from view import render
-from tui.utils import session
+from tui.utils import session, parsing
"""
The main Tor status page
"""
class status:
def GET(self):
- return render.base(render.torstatus())
+ trc = parsing.torrc(config.torrc_file)
+ trc.parse()
+ output = trc.html_output()
+ return render.base(render.torstatus(output,config.torrc_file))
def POST(self):
- return render.base(render.torstatus())
+ trc = parsing.torrc(config.torrc_file)
+ trc.parse()
+ output = trc.html_output()
+ return render.base(render.torstatus(output,config.torrc_file))
"""
Tor configuration page
"""
-class config:
+class torrc:
def update_config(self, data):
return True
diff --git a/packages/torouter-web/tui/utils/parsing.py b/packages/torouter-web/tui/utils/parsing.py
index e9ccc83..6acf988 100644
--- a/packages/torouter-web/tui/utils/parsing.py
+++ b/packages/torouter-web/tui/utils/parsing.py
@@ -74,6 +74,27 @@ class interfaces:
else:
print "%s %s" % (item[0],item[1])
+class torrc:
+ def __init__(self,filename):
+ self.fp = open(filename, "r")
+ self.parsed = []
+
+ def parse(self):
+ for line in self.fp.readlines():
+ if line.startswith("#") or line == "":
+ continue
+ else:
+ self.parsed.append(line)
+
+ def html_output(self):
+ output = "<ul id=\"torrc\">"
+ for line in self.parsed:
+ if line != "\n":
+ output += "<li><em>%s</em> %s</li>" % (line.split(" ")[0], " ".join(line.split(" ")[1:]))
+ output += "</ul>"
+ print output
+ return output
+
#interfaces_file = os.getcwd() + "/../../../torouter-prep/configs/interfaces"
#itfc = interfaces(interfaces_file)
#itfc.parse()
diff --git a/packages/torouter-web/tui/views/torstatus.html b/packages/torouter-web/tui/views/torstatus.html
index ed83531..27b2888 100644
--- a/packages/torouter-web/tui/views/torstatus.html
+++ b/packages/torouter-web/tui/views/torstatus.html
@@ -1 +1,3 @@
-The main Tor status page
+$def with (content, torrc)
+<h2>This is the content of $:torrc</h2>
+$:content
1
0

[torouter/master] Merge branch 'master' of ssh://git-rw.torproject.org/torouter
by hellais@torproject.org 17 Aug '11
by hellais@torproject.org 17 Aug '11
17 Aug '11
commit 525766e515148f9da5e78d39d1905264a4d14bad
Merge: d435505 24b92ab
Author: Arturo Filastò <hellais(a)torproject.org>
Date: Wed Aug 17 18:16:55 2011 +0200
Merge branch 'master' of ssh://git-rw.torproject.org/torouter
packages/Makefile | 9 +++++++++
packages/torouter-prep/configs/hostname | 1 +
packages/torouter-prep/configs/hosts | 1 +
packages/torouter-prep/debian/changelog | 2 +-
packages/torouter-prep/debian/control | 2 +-
packages/torouter-prep/debian/files | 2 +-
packages/torouter-prep/src/torouter_config.sh | 3 ++-
7 files changed, 16 insertions(+), 4 deletions(-)
1
0