Revise servefiles to use Tk to show QR codes, close HTTP server when the QR code image is closed, and support Python 2.

This commit is contained in:
Steveice10 2016-12-17 12:57:51 -08:00
parent 50fcc22fb9
commit 86057c3fc0
2 changed files with 32 additions and 17 deletions

View File

@ -1,5 +1,5 @@
# servefiles # servefiles
Simple Python script for serving local files to FBI's QR code installer. Requires [Python 3](https://www.python.org/downloads/), [Pillow](https://pypi.python.org/pypi/Pillow), [qrcode](https://pypi.python.org/pypi/qrcode), and [netifaces](https://pypi.python.org/pypi/netifaces). Simple Python script for serving local files to FBI's QR code installer. Requires [Python](https://www.python.org/downloads/), [Pillow](https://pypi.python.org/pypi/Pillow), [qrcode](https://pypi.python.org/pypi/qrcode), and [netifaces](https://pypi.python.org/pypi/netifaces).
**Usage**: python servefiles.py (file/directory) **Usage**: python servefiles.py (file/directory)

View File

@ -2,20 +2,25 @@ import atexit
import os import os
import sys import sys
import tempfile import tempfile
import threading
import urllib import urllib
import webbrowser
import http.server
import socketserver
import netifaces import netifaces
import qrcode import qrcode
from PIL import ImageTk
try: try:
from SimpleHTTPServer import SimpleHTTPRequestHandler
from SocketServer import TCPServer
from Tkinter import Tk, Frame, Label, BitmapImage
from urlparse import urljoin from urlparse import urljoin
from urllib import pathname2url from urllib import pathname2url, quote
except ImportError: except ImportError:
from urllib.parse import urljoin from http.server import SimpleHTTPRequestHandler
from socketserver import TCPServer
from tkinter import Tk, Frame, Label, BitmapImage
from urllib.parse import urljoin, quote
from urllib.request import pathname2url from urllib.request import pathname2url
if len(sys.argv) < 2: if len(sys.argv) < 2:
@ -35,12 +40,12 @@ qrData = ""
if os.path.isfile(directory): if os.path.isfile(directory):
if directory.endswith(('.cia', '.tik')): if directory.endswith(('.cia', '.tik')):
qrData += baseUrl + urllib.parse.quote(os.path.basename(directory)) qrData += baseUrl + quote(os.path.basename(directory))
directory = os.path.dirname(directory) directory = os.path.dirname(directory)
else: else:
for file in [ file for file in next(os.walk(directory))[2] if file.endswith(('.cia', '.tik')) ]: for file in [ file for file in next(os.walk(directory))[2] if file.endswith(('.cia', '.tik')) ]:
qrData += baseUrl + urllib.parse.quote(file) + "\n" qrData += baseUrl + quote(file) + "\n"
if len(qrData) == 0: if len(qrData) == 0:
print("No files to serve.") print("No files to serve.")
@ -54,17 +59,27 @@ print("URLS:")
print(qrData) print(qrData)
print("") print("")
print("Creating QR code...") print("Opening HTTP server on port 8080...")
qrFile = tempfile.mkstemp(suffix=".png")[1] server = TCPServer(("", 8080), SimpleHTTPRequestHandler)
atexit.register(os.remove, qrFile) thread = threading.Thread(target=server.serve_forever)
thread.start()
atexit.register(server.shutdown)
print("Displaying QR code...")
qrImage = qrcode.make(qrData) qrImage = qrcode.make(qrData)
qrImage.save(qrFile)
webbrowser.open_new_tab(urljoin('file:', pathname2url(qrFile))) root = Tk()
root.title("QR Code")
print("Listening on port 8080...") frame = Frame(root)
frame.pack()
httpd = socketserver.TCPServer(("", 8080), http.server.SimpleHTTPRequestHandler) qrBitmap = ImageTk.PhotoImage(qrImage)
httpd.serve_forever() qrLabel = Label(frame, image=qrBitmap)
qrLabel.pack()
root.mainloop()
server.shutdown()