import re import os import html import sys import math import time import json import io import urllib import urllib.parse import gevent import util import main from Config import config from Plugin import PluginManager from Debug import Debug from Translate import Translate from util import helper from util.Flag import flag from .ZipStream import ZipStream plugin_dir = os.path.dirname(__file__) media_dir = plugin_dir + "/media" loc_cache = {} if "_" not in locals(): _ = Translate(plugin_dir + "/languages/") @PluginManager.registerTo("UiRequest") class UiRequestPlugin(object): # Inject our resources to end of original file streams def actionUiMedia(self, path): if path == "/uimedia/all.js" or path == "/uimedia/all.css": # First yield the original file and header body_generator = super(UiRequestPlugin, self).actionUiMedia(path) for part in body_generator: yield part # Append our media file to the end ext = re.match(".*(js|css)$", path).group(1) plugin_media_file = "%s/all.%s" % (media_dir, ext) if config.debug: # If debugging merge *.css to all.css and *.js to all.js from Debug import DebugMedia DebugMedia.merge(plugin_media_file) if ext == "js": yield _.translateData(open(plugin_media_file).read()).encode("utf8") else: for part in self.actionFile(plugin_media_file, send_header=False): yield part elif path.startswith("/uimedia/globe/"): # Serve WebGL globe files file_name = re.match(".*/(.*)", path).group(1) plugin_media_file = "%s_globe/%s" % (media_dir, file_name) if config.debug and path.endswith("all.js"): # If debugging merge *.css to all.css and *.js to all.js from Debug import DebugMedia DebugMedia.merge(plugin_media_file) for part in self.actionFile(plugin_media_file): yield part else: for part in super(UiRequestPlugin, self).actionUiMedia(path): yield part def actionZip(self): address = self.get["address"] site = self.server.site_manager.get(address) if not site: return self.error404("Site not found") title = site.content_manager.contents.get("content.json", {}).get("title", "") filename = "%s-backup-%s.zip" % (title, time.strftime("%Y-%m-%d_%H_%M")) filename_quoted = urllib.parse.quote(filename) self.sendHeader(content_type="application/zip", extra_headers={'Content-Disposition': 'attachment; filename="%s"' % filename_quoted}) return self.streamZip(site.storage.getPath(".")) def streamZip(self, dir_path): zs = ZipStream(dir_path) while 1: data = zs.read() if not data: break yield data @PluginManager.registerTo("UiWebsocket") class UiWebsocketPlugin(object): def sidebarRenderPeerStats(self, body, site): connected = len([peer for peer in list(site.peers.values()) if peer.connection and peer.connection.connected]) connectable = len([peer_id for peer_id in list(site.peers.keys()) if not peer_id.endswith(":0")]) onion = len([peer_id for peer_id in list(site.peers.keys()) if ".onion" in peer_id]) local = len([peer for peer in list(site.peers.values()) if helper.isPrivateIp(peer.ip)]) peers_total = len(site.peers) # Add myself if site.isServing(): peers_total += 1 if any(site.connection_server.port_opened.values()): connectable += 1 if site.connection_server.tor_manager.start_onions: onion += 1 if peers_total: percent_connected = float(connected) / peers_total percent_connectable = float(connectable) / peers_total percent_onion = float(onion) / peers_total else: percent_connectable = percent_connected = percent_onion = 0 if local: local_html = _("