|
#!/usr/bin/python |
|
|
|
# filedrop.py |
|
|
|
import qrcode |
|
import sys |
|
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer |
|
import shutil |
|
import os |
|
|
|
|
|
###### |
|
|
|
import qrcode.image.base |
|
|
|
BLACK = "\033[40m" |
|
WHITE = "\033[107m" |
|
DEFAULT = "\033[49m" |
|
SPACER = " " |
|
|
|
class CliImage(qrcode.image.base.BaseImage): |
|
"""Cli image builder.""" |
|
|
|
def __init__(self, border, width, box_size): |
|
super(CliImage, self).__init__(border, width, box_size) |
|
size = (self.width + border * 2) |
|
self.border = border |
|
self.width = width |
|
self.lines = [[WHITE] * (size + 1) for i in xrange(size)] |
|
|
|
def drawrect(self, row, col): |
|
self.lines[row + self.border][col + self.border] = BLACK |
|
|
|
def save(self, stream, kind=None): |
|
stream.write(self.to_string()) |
|
|
|
def to_string(self): |
|
return ('\n'.join(SPACER.join(l) + DEFAULT for l in self.lines)) |
|
|
|
|
|
###### |
|
|
|
class FileHandler(BaseHTTPRequestHandler): |
|
|
|
def do_GET(self): |
|
"""Serve a GET request.""" |
|
|
|
fileno = self.path.split("/")[-1] |
|
f = self.dispatch_request() |
|
if f: |
|
shutil.copyfileobj(f, self.wfile) |
|
f.close() |
|
|
|
def do_HEAD(self): |
|
"""Serve a HEAD request.""" |
|
f = self.dispatch_request() |
|
if f: |
|
f.close() |
|
|
|
def dispatch_request(self): |
|
fileno = int(self.path.split("/")[-1]) |
|
if fileno < 0 or fileno > len(self.__class__.server.filenames): |
|
print fileno |
|
self.send_error(404, "File not found") |
|
return None |
|
|
|
f = open(self.__class__.server.filenames[fileno], 'rb') |
|
self.send_response(200) |
|
self.send_header("Content-type", "application/octet-stream") |
|
fs = os.fstat(f.fileno()) |
|
self.send_header("Content-Length", str(fs.st_size)) |
|
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) |
|
self.end_headers() |
|
return f |
|
|
|
class FileServer(object): |
|
|
|
def __init__(self, filenames, host=None, port=8080): |
|
self.filenames = filenames |
|
self.cur = None |
|
self.port = port |
|
self.addr = host or socket.gethostbyname(socket.gethostname()) |
|
Handler = type("BoundFileHandler", (FileHandler, object), {"server": self}) |
|
self.httpd = HTTPServer(("", self.port), Handler) |
|
|
|
def file_addr(self, f): |
|
return "http://%s:%d/%s" % (self.addr, self.port, f) |
|
|
|
def __iter__(self): |
|
return self |
|
|
|
def next(self): |
|
if self.cur is None: |
|
self.cur = 0 |
|
else: |
|
self.cur += 1 |
|
|
|
if self.cur >= len(self.filenames): |
|
raise StopIteration() |
|
|
|
return self.file_addr(self.cur) |
|
|
|
def serve(self): |
|
self.httpd.handle_request() |
|
|
|
|
|
def main(*args): |
|
addr = args[0] |
|
names = args[1:] |
|
server = FileServer(names, addr) |
|
for name in server: |
|
print name |
|
print qrcode.make(name, image_factory=CliImage).to_string() |
|
server.serve() |
|
|
|
|
|
if __name__ == '__main__': |
|
main(*sys.argv[1:]) |