示例#1
0
def setPorts():
    """ Request to alter DAQBroker's network ports

    .. :quickref: Get/Set ports; Get/Set DAQBroker network ports

    :param commport: Integer containing the requested port of the communications port
    :param logport: Integer containing the requested port of the log port

    """
    if ('commport' in request.form):
        commport = request.form['commport']
    elif ('commport' in request.args):
        commport = request.args['commport']
    else:
        commport = None
    if ('logport' in request.form):
        logport = request.form['logport']
    elif ('logport' in request.args):
        logport = request.args['logport']
    else:
        logport = None
    if ((not logport) and (not commport)):
        raise InvalidUsage("No port name provided to change", status_code=400)
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    globalObj = session.query(daqbrokerSettings.Global).filter_by(
        clock=session.query(func.max(daqbrokerSettings.Global.clock))).first()
    if logport:
        globalObj.logport = logport
    if commport:
        globalObj.commport = commport
    session.commit()
    return jsonify("done")
示例#2
0
def getLocalServers():
    """ Get a list of all available database servers to which users have already connected to

    .. :quickref: Get database servers; Get list of database servers to which the machine has made contact

    """
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    serversSelect = []
    for row in session.query(daqbrokerSettings.servers):
        obj = {}
        for field in row.__dict__:
            if not field.startswith('_'):
                obj[field] = getattr(row, field)
        serversSelect.append(obj)
        uri_test = row.engine + "://" + row.server
        if hasattr(current_user, 'conns'):
            for conn in current_user.conns:
                if (conn["id"] == hashlib.sha224(
                        uri_test.encode()).hexdigest()):
                    # print(conn["conn"])
                    if conn["conn"]:
                        serversSelect[-1]["login"] = True
                break
        if "login" not in serversSelect[-1]:
            serversSelect[-1]["login"] = False
    return jsonify(serversSelect)
示例#3
0
def custom_static2(filename):
    """ Request to access specific files in the backup directory

    .. :quickref: Get backup files; Get a specific file from a directory in the DAQBroker backup directory

    """

    #session = daqbrokerSettings.scoped()
    #connection = connect(request)
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    globalsObj = session.query(daqbrokerSettings.Global).filter_by(
        clock=session.query(func.max(daqbrokerSettings.Global.clock))).first()
    if globalsObj:
        globals = {}
        for field in globalsObj.__dict__:
            if not field.startswith('_'):
                globals[field] = getattr(globalsObj, field)
        if 'remarks' in globals:
            globals["remarks"] = json.loads(globals["remarks"])
    else:
        globals = {
            'clock': time.time(),
            'version': '0.1',
            'backupfolder': 'backups',
            'importfolder': 'uploads',
            'tempfolder': 'temp',
            'ntp': None,
            'commport': 9090,
            'logport': 9092,
            'remarks': {}
        }
    return send_from_directory(globals['backupfolder'], filename)
示例#4
0
def testNode():
    """ Attempt to contact a DAQBroker client machine, validate its sharing link and adding the node to the monitoring link

    .. :quickref: Setup client node; Setup a DAQBroker client network node

    :param: id: (String) unique node identifier
    :param: shareStr: (String) share string generated by the client application

    """
    #localConn = sqlite3.connect('localSettings')
    scoped = daqbrokerSettings.getScoped()
    localConn = scoped()
    #localConn.row_factory = dict_factory
    if ('id' in request.form):
        idToTest = request.form['id']
    elif ('id' in request.args):
        idToTest = request.args['id']
    else:
        raise InvalidUsage("No ID provided", status_code=403)
    if ('shareStr' in request.form):
        shareStr = request.form['shareStr']
    elif ('shareStr' in request.args):
        shareStr = request.args['shareStr']
    else:
        raise InvalidUsage("No share string provided", status_code=403)
    smallestClock = time.time() - 24 * 60 * 60
    responses = idTest(idToTest, shareStr)
    if responses:
        if responses[0]["result"]:
            try:
                newNode = daqbrokerSettings.nodes(
                    node=responses[0]["node"]["id"],
                    name=responses[0]["node"]["node"],
                    address=responses[0]["address"],
                    port=responses[0]["node"]["port"],
                    local=responses[0]["node"]["serverAddr"],
                    active=True,
                    lastActive=time.time(),
                    tsyncauto=False,
                    remarks=json.dumps(responses[0]["node"]["details"]))
                localConn.add(newNode)
                localConn.commit()
                localConn.close()
                return jsonify("done")
            except Exception as e:
                #localConn.close()
                traceback.print_exc()
                localConn.rollback()
                raise InvalidUsage(str(e), status_code=500)
        else:
            #localConn.close()

            raise InvalidUsage("Share string comparison failed!",
                               status_code=500)
    else:
        #localConn.close()

        raise InvalidUsage(
            "No node replied, are you sure you are contacting the correct node?",
            status_code=500)
示例#5
0
def custom_static1(filename):
    """ Request to access specific files in the backup directory

    .. :quickref: Get backup files; Get a specific file from a directory in the DAQBroker backup directory

    """
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    #connection = connect(request)
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    globalsObj = session.query(daqbrokerSettings.Global).filter_by(
        clock=session.query(func.max(daqbrokerSettings.Global.clock))).first()
    if globalsObj:
        globals = {}
        for field in globalsObj.__dict__:
            if not field.startswith('_'):
                globals[field] = getattr(globalsObj, field)
        if 'remarks' in globals:
            globals["remarks"] = json.loads(globals["remarks"])
    else:
        globals = {
            'clock': time.time(),
            'version': '0.1',
            'backupfolder': 'backups',
            'importfolder': 'uploads',
            'tempfolder': 'temp',
            'ntp': None,
            'commport': 9090,
            'logport': 9092,
            'remarks': {}
        }
    #print(request.args)
    #print(filename.split('.'))
    if filename.split('.')[1] == 'zip':
        #print("osijdfposdijfopsdfijdopsifjdopsfij")
        return send_file(os.path.join(globals['tempfolder'], filename),
                         mimetype="zip",
                         attachment_filename="downloaded_files.zip",
                         as_attachment=True)
    else:
        return send_from_directory(globals['tempfolder'], filename)
示例#6
0
def multiFileDownload():
    """ Request to access multiple files in the backup directory

    .. :quickref: Get backup files; Get a specific file from a directory in the DAQBroker backup directory

    """
    try:
        processedRequest = request.get_json()
        scoped = daqbrokerSettings.getScoped()
        session = scoped()
        globalsObj = session.query(
            daqbrokerSettings.Global).filter_by(clock=session.query(
                func.max(daqbrokerSettings.Global.clock))).first()
        if globalsObj:
            globals = {}
            for field in globalsObj.__dict__:
                if not field.startswith('_'):
                    globals[field] = getattr(globalsObj, field)
            if 'remarks' in globals:
                globals["remarks"] = json.loads(globals["remarks"])
        else:
            globals = {
                'clock': time.time(),
                'version': '0.1',
                'backupfolder': 'backups',
                'importfolder': 'uploads',
                'tempfolder': 'temp',
                'ntp': None,
                'commport': 9090,
                'logport': 9092,
                'remarks': {}
            }
        if 'files' in processedRequest:
            files = processedRequest['files']
        else:
            raise InvalidUsage('No file list specified', status_code=400)
        unique = uuid.uuid1()
        zipPath = os.path.join(globals['tempfolder'], str(unique) + '.zip')
        zipf = zipfile.ZipFile(zipPath, 'w', zipfile.ZIP_DEFLATED)
        for file in files:
            thePath = pathlib.Path(
                globals['backupfolder']) / pathlib.Path(file)
            try:
                thePathString = thePath.resolve()
                zipf.write(str(thePathString), arcname=thePath.name)
            except:
                traceback.print_exc()
                thePathString = None
        zipf.close()
        #return send_file(unique,mimetype='zip', attachment_filename="downloaded_files.zip", as_attachment=True)
        return str(unique) + '.zip'
    except Exception as e:
        traceback.print_exc()
        raise InvalidUsage(str(e), status_code=400)
示例#7
0
def listInstFiles():
    """ Request to list an instrument's current data file structure

    .. :quickref: Get instrument files; Get instrument's stored data files

    :param instName: Name of the requested instrument

    :returns: JSON encoded string containing the collected file structure of the requested instrument.

    """
    #localConn = sqlite3.connect('localSettings')
    #localConn.row_factory = dict_factory
    #session=daqbrokerSettings.scoped()
    # dbQuery = "SELECT * FROM global a INNER JOIN (SELECT max(clock) clock FROM global) b ON a.clock=b.clock"
    # result = localConn.execute(dbQuery)
    # for row in result:
    #     globals = row
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    globalsObj = session.query(
        daqbrokerSettings.Global).filter_by(
        clock=session.query(
            func.max(
                daqbrokerSettings.Global.clock))).first()
    if globalsObj:
        globals = {}
        for field in globalsObj.__dict__:
            if not field.startswith('_'):
                globals[field] = getattr(globalsObj, field)
        if 'remarks' in globals:
            globals["remarks"]=json.loads(globals["remarks"])
    else:
        globals = {
            'clock': time.time(),
            'version': '0.1',
            'backupfolder': 'backups',
            'importfolder': 'uploads',
            'tempfolder': 'addons',
            'ntp': None,
            'commport': 9090,
            'logport': 9092,
            'remarks': {}}
    if('instName' in request.form):
        instName = request.form["instName"]
    elif('instName' in request.args):
        instName = request.args["instName"]
    else:
        localConn.close()
        raise InvalidUsage('No instrument name supplied', status_code=400)
    folder = os.path.join(globals["backupfolder"], current_user.server, current_user.database, instName)
    dirs = get_directory_structure(folder)
    return jsonify(dirs)
示例#8
0
def queryNodes():
    """ Get the list of local active network DAQBroker clients

    .. :quickref: Get node list; Get list of active remote DAQBroker clients

    :param: nodeName : (String) unique identifier sting of a node

    :returns: JSON encoded object of requested node if **nodeName** is specified. List of existing nodes if not. A node is an object with the following attributes

            | ``node`` : (String) unique node identifier
            | ``name`` : (String) visible name of node
            | ``address`` : (String) network address as seen from the server application
            | ``port`` : (Integer) remote communications port
            | ``active`` : (Boolean) flagged for monitoring
            | ``lastActive`` : (Integer) last activity timestamp
            | ``tsyncauto`` : (Boolean) flagged for software synchronization
            | ``remarks`` : (String) Extra health information

    """
    nodes = []
    nodes2 = []
    processes = []
    #daqbrokerSettings.setupLocalVars(localPath)
    scoped = daqbrokerSettings.getScoped()
    localConn = scoped()
    if ('nodeName' in request.form) or ('nodeName' in request.args):
        if 'nodeName' in request.form:
            nodeName = request.form['nodeName']
        elif 'nodeName' in request.args:
            nodeName = request.args['nodeName']
        theNode = localConn.query(
            daqbrokerSettings.nodes).filter_by(node=nodeName).first()
        #for row in localConn.execute("SELECT * FROM nodes WHERE node = ?", (nodeName,)):
        #    theNode = row
        if not (theNode is None):
            theObjct2 = {}
            for field in theNode.__dict__:
                if not field.startswith('_'):
                    theObjct2[field] = getattr(theNode, field)
            return jsonify(theObjct2)
        else:
            raise InvalidUsage('Could not find the requested node',
                               status_code=500)
    else:
        for node in localConn.query(daqbrokerSettings.nodes).all():
            theObjct2 = {}
            for field in node.__dict__:
                if not field.startswith('_'):
                    theObjct2[field] = getattr(node, field)
            nodes.append(theObjct2)
        #localConn.close()
        return jsonify(nodes)
示例#9
0
def getLog():
    """ Get the entries of logged events between a specific time interval.

    .. :quickref: Get logged events; Get logged events within time frame

    :param: timeLogStart: (Integer) start timestamp
    :param: timeLogEnd: (Integer) end timestamp


    :returns: List of event entries (strings) inside the requested time interval

    """
    processRequest = request.get_json()
    if not 'timeLogEnd' in processRequest:
        raise InvalidUsage("End time not provided", status_code=400)
    if not 'timeLogStart' in processRequest:
        raise InvalidUsage("Start time not provided", status_code=400)
    if not 'reqid' in processRequest:
        raise InvalidUsage("Unique request identifier not provided",
                           status_code=400)
    unique = str(uuid.uuid1().hex)
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    emptyIndex = next(i for i, val in enumerate(current_app.config['workers'])
                      if val == -1)
    current_app.config['workers'][emptyIndex] = 0
    newJob = daqbrokerSettings.jobs(clock=time.time() * 1000,
                                    jobid=unique,
                                    type=0,
                                    username=current_user.username,
                                    status=0,
                                    data=emptyIndex,
                                    reqid=processRequest["reqid"])
    session.add(newJob)
    session.commit()
    daqbrokerSettings.workerpool.submit(getLogEntries,
                                        int(processRequest['timeLogStart']),
                                        int(processRequest['timeLogEnd']),
                                        str(unique),
                                        current_app.config['workers'],
                                        emptyIndex, base_dir)
    return json.dumps({'id': str(unique), 'type': 'log entry'})
示例#10
0
def queryGlobals():
    """ Query local machine storage for settings

    .. :quickref: Get local settings; Get local server settings

    :returns: JSON encoded string containing local machine settings. This is an object with the following keys:

            | ``clock`` : Timestamp of last alteration to settings
            | ``version`` : Version of the server application being used
            | ``backupfolder`` : Backup folder
            | ``importfolder`` : Imports folder
            | ``tempfolder`` : Temporary file folder
            | ``ntp`` : NTP server used for software synchronization
            | ``logport`` : Network port for logging server
            | ``commport`` : Network port for communication
            | ``remarks`` : JSON encoded string containing machine health information

    """
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    globalObj = session.query(daqbrokerSettings.Global).filter_by(
        clock=session.query(func.max(daqbrokerSettings.Global.clock))).first()
    if globalObj:
        globals = {}
        for field in globalObj.__dict__:
            if not field.startswith('_'):
                globals[field] = getattr(globalObj, field)
    else:
        globals = {
            'clock': time.time(),
            'version': '0.1',
            'backupfolder': 'backups',
            'importfolder': 'uploads',
            'addonfolder': 'addons',
            'ntp': None,
            'remarks': {},
            'commport': 9090,
            'logport': 9092,
            'isDefault': True
        }  # Default values, should I use this?
    return jsonify(globals)
示例#11
0
def checkFolders():
    """ Get or set the folders available to use as backup, import or temporary folder

    .. :quickref: Get/Set folders; Get/Set usable server folders

    :param addFolder: String containing the folder to be added to the list of available folders
    :param setFolder: String containing the folder to be set as a specific type of folder
    :param folderChange (optional): An integer defining the path to be set. Can be set to 0 (backup), 1 (import) or 2 (temp). If not supplied, no folder is changed

    :returns: If **folderChange** and **addFolder** are not provided, returns a JSON encoded string of a list of available folders. Each object in the list contains the following keys:

            | ``path`` : string containing the address of the NTP server

    """
    addFolder = False
    setFolder = False
    returnQs = []
    if ('addFolder' in request.form):
        addFolder = True
        toAddFolder = request.form['addFolder']
    elif ('addFolder' in request.args):
        addFolder = True
        toAddFolder = request.args['addFolder']
    if ('setFolder' in request.form):
        setFolder = True
        toSetFolder = request.form['setFolder']
    elif ('setFolder' in request.args):
        setFolder = True
        toSetFolder = request.args['setFolder']
    if setFolder or addFolder:
        if ('folderChange' in request.form):
            folderChange = request.form['folderChange']
        elif ('folderChange' in request.args):
            folderChange = request.args['folderChange']
        else:
            raise InvalidUsage('No folder type supplied', status_code=500)
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    globalObj = session.query(daqbrokerSettings.Global).filter_by(
        clock=session.query(func.max(daqbrokerSettings.Global.clock))).first()
    try:
        if (addFolder and not setFolder):
            theFolder = session.query(
                daqbrokerSettings.folder).filter_by(path=toAddFolder)
            if not theFolder:
                theFolder = daqbrokerSettings.folder(clock=time.time(),
                                                     path=toAddFolder,
                                                     type=0,
                                                     remarks='{}')
                session.add(theFolder)
            if int(folderChange) == 0:
                globalObj.backupfolder = toAddFolder
            elif int(folderChange) == 1:
                globalObj.importfolder = toAddFolder
            elif int(folderChange) == 2:
                globalObj.tempfolder = toAddFolder
            else:
                raise InvalidUsage('Invalid folder type supplied',
                                   status_code=500)
            session.commit()
            if os.path.isdir(toAddFolder):
                toReturn = {'error': 0}
            else:
                toReturn = {
                    'error':
                    0,
                    'warning':
                    'Path not found on server, make sure this path exists before using it!'
                }
            return jsonify(toReturn)
        elif (setFolder and not addFolder):
            if int(folderChange) == 0:
                globalObj.backupfolder = toAddFolder
            elif int(folderChange) == 1:
                globalObj.importfolder = toAddFolder
            elif int(folderChange) == 2:
                globalObj.tempfolder = toAddFolder
            else:
                raise InvalidUsage('Invalid folder type supplied',
                                   status_code=500)
            session.commit()
            if os.path.isdir(toSetFolder):
                toReturn = {'error': 0}
            else:
                toReturn = {
                    'error':
                    0,
                    'warning':
                    'Path not found on server, make sure this path exists before using it!'
                }
            return jsonify(toReturn)
        else:
            folders = []
            for folder in session.query(daqbrokerSettings.folder):
                objc = {}
                for field in folder.__dict__:
                    if not field.startswith('_'):
                        objc[field] = getattr(folder, field)
                folders.append(objc)
                folders[-1]["good"] = os.path.isdir(folders[-1]["path"])
            return jsonify(folders)
    except Exception as e:
        session.rollback()
        traceback.print_exc()
        raise InvalidUsage(str(e), status_code=500)
示例#12
0
def checkNTPServers():
    """ Set or get the NTP servers used for software synchronization by DAQBroker

    .. :quickref: Get/Set NTP servers; Get/Set NTP servers

    :param addServer: string containing the address of the NTP server to add/update to the list of available servers
    :param setServer: string containing the address of the NTP server to set as the synchronization server
    :param port: Integer containing the port of the NTP server

    :returns: If **addServer** and **setServer** are not provided, returns a JSON encoded string of a list of available NTP servers. Each object in the list contains the following keys:

            | ``address`` : string containing the address of the NTP server
            | ``port`` : integer containing the NTP network port

    """
    addServer = False
    setServer = False
    returnQs = []
    if ('addServer' in request.form):
        addServer = True
        toAddServer = request.form['addServer']
    elif ('addServer' in request.args):
        addServer = True
        toAddServer = request.args['addServer']
    if ('setServer' in request.form):
        setServer = True
        toSetServer = request.form['setServer']
    elif ('setServer' in request.args):
        setServer = True
        toSetServer = request.args['setServer']
    if ('port' in request.form):
        port = request.form['port']
    elif ('port' in request.args):
        port = request.args['port']
    else:
        port = 123
    scoped = daqbrokerSettings.getScoped()
    session = scoped()
    if addServer or setServer:
        try:
            newNTP = daqbrokerSettings.ntp(clock=time.time(),
                                           server=toAddServer,
                                           port=port)
            getNTPTime(toAddServer)
        except:
            raise InvalidUsage('Could not contact NTP server', status_code=500)
        session.add(newNTP)
        session.commit()
        return jsonify("done")
    elif setServer and not addServer:
        currNTP = session.query(
            daqbrokerSettings.ntp).filter_by(clock=session.query(
                func.max(daqbrokerSettings.ntp.clock))).first()
        currNTP = toSetServer
        return jsonify("done")
    elif addServer and setServer:
        raise InvalidUsage(
            "Please provide only a server to add or to set, not both!",
            status_code=500)
    else:
        ntpServers = []
        for ntp in session.query(daqbrokerSettings.ntp):
            objc = {}
            for field in ntp.__dict__:
                if not field.startswith('_'):
                    objc[field] = getattr(ntp, field)
            ntpServers.append(objc)
        return jsonify(ntpServers)
示例#13
0
    def login():
        """ Start a session or update an existing session with a login with a given user to a specific database. A database server is defined by an address and a database engine. Only one user is allowed to be connected to a single database server at any time. This request is always run for session start automatically for any request. For single command line requests, these parameters MUST be supplied apart from the target request parameters unless the user uses already existing sessions, which is unusual. It is also required to run to connect to a new server, and the user does not have credentials for said server

        .. :quickref: Log to server; Login to a specified server and engine

        :param: username: (String) username
        :param: user: (String) alias of  **username**
        :param: password: (String) user password
        :param: pass: (String) alias of  **password**
        :param: serverName: (String) server address to connect to. Defaults to 'localhost'
        :param: server: (String) alias of  **serverName**
        :param: serverEngine: (String) server address to connect to
        :param: engine: (String) alias of  **serverEngine**
        :param: database: (String - optional) DAQBroker database to point server session
        :param: engine: (String - optional) alias of  **database**


        """
        browserList = [
            'aol', 'ask', 'baidu', 'bing', 'camino', 'chrome', 'firefox',
            'galeon', 'google', 'kmeleon', 'konqueror', 'links', 'lynx',
            'mozilla', 'msie', 'msn', 'netscape', 'opera', 'safari',
            'seamonkey', 'webkit', 'yahoo'
        ]
        if request.method == 'POST':
            if request.is_json:
                requestCheck = request.get_json()
            else:
                requestCheck = request.form
            allGood = True
            loginCreds = {}
            if 'username' in requestCheck:
                loginCreds['username'] = requestCheck['username']
            elif 'user' in requestCheck:
                loginCreds['username'] = requestCheck['user']
            else:
                allGood = False
            if 'password' in requestCheck:
                loginCreds['password'] = requestCheck['password']
            elif 'pass' in requestCheck:
                loginCreds['password'] = requestCheck['pass']
            else:
                allGood = False
            if 'serverName' in requestCheck:
                loginCreds['server'] = requestCheck['serverName']
            elif 'server' in requestCheck:
                loginCreds['server'] = requestCheck['server']
            elif 'newServerName' in requestCheck:
                loginCreds['server'] = requestCheck['newServerName']
            else:
                # allGood=False
                loginCreds['server'] = "localhost"
            if 'serverEngine' in requestCheck:
                loginCreds['engine'] = requestCheck['serverEngine']
            elif 'engine' in requestCheck:
                loginCreds['engine'] = requestCheck['engine']
            elif 'newServerEngine' in requestCheck:
                loginCreds['engine'] = requestCheck['newServerEngine']
            else:
                # allGood=False
                loginCreds['engine'] = 'mysql'
            if 'database' in requestCheck:
                loginCreds['database'] = requestCheck['database']
            if 'dbname' in requestCheck:
                loginCreds['database'] = requestCheck['dbname']
            if allGood:
                if 'database' in loginCreds:
                    user = User(loginCreds['username'], loginCreds['password'],
                                loginCreds['server'], loginCreds['engine'],
                                loginCreds['database'])
                else:
                    user = User(loginCreds['username'], loginCreds['password'],
                                loginCreds['server'], loginCreds['engine'])
                if user.id:
                    usersArray.append(user)
                    login_user(user)
                    scoped = daqbrokerSettings.getScoped()
                    localSession = scoped()
                    newServer = daqbrokerSettings.servers(
                        server=loginCreds["server"],
                        engine=loginCreds["engine"])
                    localSession.merge(newServer)
                    localSession.commit()
                else:
                    if request.user_agent.browser not in browserList:
                        raise InvalidUsage('Error connecting to database',
                                           status_code=500)
                    else:
                        return render_template('login.html')
                if "CURRENT_URL" in session:
                    next = session["CURRENT_URL"]
                    session.pop("CURRENT_URL", None)
                else:
                    next = None
                if not request.user_agent.browser:
                    return redirect(next or url_for('daqbroker.main'),
                                    code=307)
                else:
                    return redirect(next or url_for('daqbroker.main'))
            else:
                if request.user_agent.browser not in browserList:
                    raise InvalidUsage('Error connecting to database',
                                       status_code=500)
                else:
                    return render_template('login.html')
        else:
            return render_template('login.html')
示例#14
0
def gatherNodeData():
    """ Gathers general purpose information from a supplied node

            :param type: (Integer) type of request

                    | ``1`` : Network port data request
                    | ``2`` : Serial port data request

            :param order: (String) type of request. Required when **type=2**

                    | ``getPorts`` : Get serial port list
                    | ``getPortData`` : Get data from specific port

            :param remarks: (string) JSON encoded string with relevant extra information. Required when **type=2** and **order='getPortData'**

    """
    processRequest = request.get_json()
    scoped = daqbrokerSettings.getScoped()
    localConn = scoped()
    #localConn = sqlite3.connect('localSettings')
    #localConn.row_factory = dict_factory
    theNode = localConn.query(daqbrokerSettings.nodes).filter_by(
        name=processRequest["node"]).first()
    #for row in localConn.execute("SELECT * FROM nodes WHERE name = ?", (processRequest["node"],)):
    #    theNode = row
    if int(processRequest["type"]) == 1:
        unique = uuid.uuid1()
        p = workerpool.submit(getPortData,
                              int(processRequest["remarks"]["port"]), theNode,
                              int(processRequest["remarks"]["parseInterval"]),
                              processRequest["remarks"]["command"],
                              str(unique), app.config['workers'], False)
        # p.start()
        current_app.config['workers'].append({
            'id': str(unique),
            'process': p.pid,
            'status': 0,
            'data': [],
            'time': time.time()
        })
        return json.dumps({'id': str(unique), 'type': 'peripheralRequest'})
    elif int(processRequest["type"]) == 2:
        if 'order' in processRequest:
            if processRequest["order"] == "getPorts":
                unique = uuid.uuid1()
                p = workerpool.submit(getCommPorts, theNode, str(unique),
                                      current_app.config['workers'])
                # p.start()
                current_app.config['workers'].append({
                    'id': str(unique),
                    'process': p.pid,
                    'status': 0,
                    'data': [],
                    'time': time.time()
                })
                return json.dumps({
                    'id': str(unique),
                    'type': 'peripheralRequest'
                })
            elif processRequest["order"] == "getPortData":
                unique = uuid.uuid1()
                p = workerpool.submit(
                    getCOMData, processRequest["remarks"]["device"], theNode,
                    int(processRequest["remarks"]["parseInterval"]),
                    processRequest["remarks"]["command"],
                    int(processRequest["remarks"]["baudRates"]),
                    processRequest["remarks"]["parity"],
                    int(processRequest["remarks"]["dataBits"]),
                    processRequest["remarks"]["stopBits"], str(unique),
                    app.config['workers'])
                # p.start()
                current_app.config['workers'].append({
                    'id': str(unique),
                    'process': p.pid,
                    'status': 0,
                    'data': [],
                    'time': time.time()
                })
                return json.dumps({
                    'id': str(unique),
                    'type': 'peripheralRequest'
                })
            else:
                raise InvalidUsage('Wrong order issued', status_code=400)
    elif int(processRequest["type"]) == 3:
        print("External")
    else:
        raise InvalidUsage('Wrong routine type', status_code=400)
示例#15
0
def setupLocalSettings(localSettings='localSettings'):
    try:
        #print(os.path.dirname(os.path.realpath(__file__)))
        #print(os.path.realpath(__file__))
        #print(sys._MEIPASS)
        if not os.path.isdir(os.path.join(base_dir, 'static')):
            print(
                "Server files not found on this directory. Setting up required files . . ."
            )
            canUseLocal = False
            useLocal = False
            if os.path.isfile(os.path.join(base_dir, 'server.zip')):
                canUseLocal = True
            if canUseLocal:
                useLocal = False
                choice = input(
                    "Server files found in local compressed file, use these? (Could be out of date)\n\t1. Yes\n\t2. No\nMake a choice[1]:"
                )
                if choice == '1':
                    useLocal = True
            if useLocal:
                z = zipfile.ZipFile(os.path.join(base_dir, 'server.zip'))
                z.extractall(path=base_dir)
                print("done")
            else:
                zipFiles = requests.get(
                    "https://daqbroker.com/downloads/server.zip")
                if zipFiles.ok:
                    z = zipfile.ZipFile(io.BytesIO(zipFiles.content))
                    z.extractall(path=base_dir)
                    print("done")
                else:
                    sys.exit(
                        "Files not found on remote server. Make sure you have internet connection before trying again."
                    )
        if os.path.isfile(localSettings):  # Must create new local settings
            isNewDB = False
        else:  # Already there, let's hope with no problems
            isNewDB = True
        databases = []
        daqbrokerSettings.setupLocalVars(localSettings)
        scoped = daqbrokerSettings.getScoped()
        session = scoped()
        daqbrokerSettings.daqbroker_settings_local.metadata.create_all(
            daqbrokerSettings.localEngine)
        #id = snowflake.make_snowflake(snowflake_file='snowflake')
        if isNewDB:
            newGlobal = daqbrokerSettings.Global(clock=time.time(),
                                                 version=VERSION,
                                                 backupfolder="backups",
                                                 importfolder="import",
                                                 tempfolder="temp",
                                                 ntp="NONE",
                                                 logport=9092,
                                                 commport=9090,
                                                 remarks="{}")
            session.add(newGlobal)
            newFolder = daqbrokerSettings.folder(clock=time.time(),
                                                 path="backups",
                                                 type="0",
                                                 remarks="{}")
            session.add(newFolder)
            newFolder = daqbrokerSettings.folder(clock=time.time(),
                                                 path="imports",
                                                 type="0",
                                                 remarks="{}")
            session.add(newFolder)
            newFolder = daqbrokerSettings.folder(clock=time.time(),
                                                 path="temp",
                                                 type="0",
                                                 remarks="{}")
            session.add(newFolder)
            newNode = daqbrokerSettings.nodes(node=monitorServer.globalID,
                                              name="localhost",
                                              address="127.0.0.1",
                                              port=9091,
                                              local="127.0.0.1",
                                              active=True,
                                              lastActive=time.time(),
                                              tsyncauto=False,
                                              remarks="{}")
            session.add(newNode)
            globals = {
                'clock': time.time(),
                'version': VERSION,
                'backupfolder': 'backups',
                'importfolder': 'import',
                'tempfolder': 'temp',
                'ntp': None,
                'remarks': {},
                'commport': 9090,
                'logport': 9092,
                'isDefault': True
            }  # Default values, should I use this?
        else:
            maxGlobal = session.query(
                daqbrokerSettings.Global).filter_by(clock=session.query(
                    func.max(daqbrokerSettings.Global.clock))).first()
            if maxGlobal:
                globals = {}
                for field in maxGlobal.__dict__:
                    if not field.startswith('_'):
                        globals[field] = getattr(maxGlobal, field)
            else:
                pass  # Something very wrong happened with the local settings, this should be handled with a GUI
        session.commit()
        return globals
    except Exception as e:
        traceback.print_exc()
        session.rollback()
        sys.exit(
            'Could not set up local settings, make sure you have the correct access rights for this folder and restart the application!'
        )