diff --git a/src/TranslationServer.py b/src/TranslationServer.py index b03e5ea..b0ec830 100644 --- a/src/TranslationServer.py +++ b/src/TranslationServer.py @@ -5,14 +5,15 @@ from flask import Flask, request, abort, send_from_directory from flask.ext.cors import CORS from functools import wraps from PortGlosa import traduzir -from subprocess import check_output +from subprocess import check_output, Popen from threading import Lock from time import sleep from logging.handlers import RotatingFileHandler -import os, argparse, thread, logging, sys +import Trie, os, argparse, json, thread, logging, sys MySQLdb=None RUN_MODE=None +DICT_VERSION=None BUNDLES_PATH=None BUNDLES_LIST={} conn=None @@ -39,6 +40,7 @@ def dict_mode(): STANDALONE_SIGNS_PATH=os.path.join(SIGNS_PATH, "STANDALONE") WEBGL_SIGNS_PATH=os.path.join(SIGNS_PATH, "WEBGL") BUNDLES_PATH={"IOS":IOS_SIGNS_PATH, "ANDROID":ANDROID_SIGNS_PATH, "STANDALONE":STANDALONE_SIGNS_PATH, "WEBGL":WEBGL_SIGNS_PATH} + check_version() list_bundles() def connect_database(): @@ -72,6 +74,10 @@ def logger(): log.setLevel(logging.DEBUG) log.addHandler(handler) +def check_version(): + global DICT_VERSION + DICT_VERSION = check_output(["aptitude", "search", "dicionario-vlibras", "-F", "%V"]) + def init_mode(args): global RUN_MODE if args.logfile: logger() @@ -88,12 +94,14 @@ def init_mode(args): def list_bundles(): global BUNDLES_LIST states = ["AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP", "SE", "TO"] - BUNDLES_LIST["DEFAULT"] = set(list_files(BUNDLES_PATH["ANDROID"])) - for state in states: - try: - BUNDLES_LIST[state] = set(os.listdir(os.path.join(BUNDLES_PATH["ANDROID"], state))) - except OSError: - BUNDLES_LIST[state] = set([]) + BUNDLES_LIST["DEFAULT"] = check_platform_files() + for platform, path in BUNDLES_PATH.iteritems(): + BUNDLES_LIST[platform] = {} + for state in states: + try: + BUNDLES_LIST[platform].update({state:set(os.listdir(os.path.join(path, state)))}) + except OSError: + BUNDLES_LIST[platform].update({state:set([])}) def list_files(path): files = [] @@ -103,6 +111,15 @@ def list_files(path): files.append(fname) return files +def check_platform_files(): + android = set(list_files(BUNDLES_PATH["ANDROID"])) + ios = set(list_files(BUNDLES_PATH["IOS"])) + webgl = set(list_files(BUNDLES_PATH["WEBGL"])) + standalone = set(list_files(BUNDLES_PATH["STANDALONE"])) + if android == ios and ios == webgl and webgl == standalone: + return standalone + raise RuntimeError("Inconsistent signs. Check files.") + def check_database(): cursor = conn.cursor() cursor.execute('CREATE DATABASE IF NOT EXISTS signsdb;') @@ -251,9 +268,27 @@ def load_statistics_page(): @app.route("/update", methods=['GET']) def update_list_bundles(): + try: + password = request.args.get('password').encode('utf-8') + except AttributeError: + return "Password not provided", 401 + + Popen('sudo -S <<< '+password+' apt-get update > /dev/null 2>&1', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash").wait() + check_version() list_bundles() return "Successfully updated list.", 200 +@app.route("/version", methods=['GET']) +def get_version(): + return DICT_VERSION, 200 + +@app.route("/signs", methods=['GET']) +def get_signs_list(): + signs = list(BUNDLES_LIST["DEFAULT"]) + #return json.dumps(signs), 200 + trie = Trie.gen(signs) + return json.dumps(trie), 200 + @app.route("//", methods=['GET']) @check_run_mode def get_sign(platform, sign): @@ -273,9 +308,9 @@ def get_sign_state(platform, state, sign): sign = sign.encode("UTF-8") state = state.encode("UTF-8") if " " in sign or platform not in BUNDLES_PATH: abort(400) - file_exists = sign in BUNDLES_LIST[state] - thread.start_new_thread(update_database_statistic, (sign, platform, file_exists)) + file_exists = sign in BUNDLES_LIST[platform][state] if file_exists: + thread.start_new_thread(update_database_statistic, (sign, platform, file_exists)) return send_from_directory(os.path.join(BUNDLES_PATH[platform], state), sign) return get_sign(platform.decode("UTF-8"), sign.decode("UTF-8")) -- libgit2 0.21.2