deluge/webui/webuiserver.py

212 lines
5.6 KiB
Python

#
# Copyright (c) 2006 Alon Zakai ('Kripken') <kripkensteiner@gmail.com>
#
# 2006-15-9
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Docs:
#
# All httpserver-related issues are done through GET (html, javascript, css,
# etc.). All torrentcore issues are doen through POST.
#
import time
import BaseHTTPServer
import sys, os
import webbrowser
sys.path.append("/media/sda2/svn/deluge-trac/trunk/library")
import flood # or whatever the core is renamed to be
import json
# Constants
HOST_NAME = 'localhost'
PORT_NUMBER = 9999
HTML_DIR = "www/com.WebUI.WebUIApp"
HEADERS_TEXT = "text/plain"
HEADERS_HTML = "text/html"
HEADERS_CSS = "text/css"
HEADERS_JS = "text/javascript"
manager = None
httpd = None
class webuiServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def get_secret_str(self):
return "?" + secret
def pulse(self):
global manager
manager.handle_events()
def write_headers(self, content_type, data_length=None):
self.send_response(200)
self.send_header("Content-type", content_type)
if data_length is not None:
self.send_header("Content-length", data_length)
self.end_headers()
def do_POST(self):
global manager
input_length = int(self.headers.get('Content-length'))
command = self.rfile.read(input_length)
print "POST command:", command
if command == "quit":
httpd.ready = False
# self.write_headers(HEADERS_TEXT)
# self.wfile.write("OK: quit")
# List torrents, and pulse the heartbeat
elif command == "list":
self.pulse() # Start by ticking the clock
data = []
unique_IDs = manager.get_unique_IDs()
for unique_ID in unique_IDs:
temp = manager.get_torrent_state(unique_ID)
temp["unique_ID"] = unique_ID # We add the unique_ID ourselves
data.append(temp)
self.write_headers(HEADERS_TEXT)
self.wfile.write(json.write(data))
else:
# Basically we can just send Python commands, to be run in exec(command)... but that
# would be slow, I guess
print "UNKNOWN POST COMMAND:", command
def do_GET(self):
# self.wfile.write("<h1>webuiServer 0.5.1.1</h1>")
print "Contacted from:", self.client_address
if "?" in self.path:
command = self.path[1:self.path.find("?")]
else:
command = self.path[1:]
if command == "":
command = "WebUI.html"
if not self.path[-(len(self.get_secret_str())):] == self.get_secret_str():
self.write_headers(HEADERS_HTML)
self.wfile.write("<html><head><title>webuiServer</title></head><body>")
self.wfile.write("<p>Invalid access. Run 'webuiserver SECRET', then access 'localhost:9999/?SECRET'.</p>")
self.wfile.write("</body></html>")
return
if "." in command:
extension = command[command.rfind("."):]
else:
extension = ""
print "Handling: ", self.path, ":", command, ":", extension
try:
filey = open("./" + HTML_DIR + "/" + command, 'rb')
lines = filey.readlines()
filey.close()
data = "".join(lines)
if extension == ".html":
self.write_headers(HEADERS_HTML, len(data))
elif extension == ".js":
self.write_headers(HEADERS_JS, len(data))
elif extension == ".css":
self.write_headers(HEADERS_CSS, len(data))
else:
print "What is this?", extension
self.wfile.write(data)
except IOError:
self.write_headers(HEADERS_HTML)
self.wfile.write("<html><head><title>webuiServer</title></head><body>")
self.wfile.write("<h1>webuiServer 0.5.1.1</h1>")
self.wfile.write("No such command: " + command)
class webuiServer(BaseHTTPServer.HTTPServer):
def serve_forever(self):
self.ready = True
while self.ready:
self.handle_request()
self.server_close()
########
# Main #
########
print "-------------------"
print "webuiServer 0.5.1.1"
print "-------------------"
print ""
try:
secret = sys.argv[1]
except IndexError:
print "USAGE: 'webuiserver.py S', where S is the secret password used to access via a browser"
secret = ""
if not secret == "":
# manager.add_torrent("xubuntu-6.10-desktop-i386.iso.torrent",
# os.path.expanduser("~") + "/Temp", True)
httpd = webuiServer((HOST_NAME, PORT_NUMBER), webuiServerHandler)
print time.asctime(), "HTTP Server Started - %s:%s" % (HOST_NAME, PORT_NUMBER)
manager = flood.manager("FL", "0500", "webui",
os.path.expanduser("~") + "/Temp")#, blank_slate=True)
webbrowser.open("localhost:9999/?" + secret)
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
print time.asctime(), "HTTP Server Stopped - %s:%s" % (HOST_NAME, PORT_NUMBER)
print "Shutting down manager..."
manager.quit()
### OLD
# # Check if the manager is running
# if not command == "init":
# if manager is None:
# self.write_headers(HEADERS_TEXT)
# self.wfile.write("ERROR: manager is None")
# return
#
# if command == "init":
# if manager is not None:
# print "ERROR: Trying to init, but already active"
# return
#
# manager = webui.manager("FL", "0500", "webui",
# os.path.expanduser("~") + "/Temp")#, blank_slate=True)
# self.write_headers(HEADERS_TEXT)
# self.wfile.write("OK: init")