Esempio n. 1
0
def im_put_file(radio, path_list, buf, offset):
    '''
    Write data to an image file on the Tag
    '''
    def _put_msg(path_list, buf, offset=None):
        tlv_list = path2tlvs(path_list)
        if (offset):
            tlv_list.append(TagTlv(tlv_types.OFFSET, offset))
        tname = TagName(tlv_list)
        msg = TagPut(tname)
        msg.payload = bytearray(buf[0:msg.payload_avail()])
        return (msg, len(msg.payload))

    amt_to_put = len(buf)
    while (amt_to_put):
        req_msg, amt_accepted = _put_msg(path_list,
                                         buf[(len(buf) - amt_to_put):], offset)
        print('im put', req_msg.name)
        error, payload = msg_exchange(radio, req_msg)
        print(error, payload)
        if ((error is not tlv_errors.SUCCESS)
                or (error is tlv_errors, ERETRY)):
            break
        if (payload[0].tlv_type() is tlv_types.OFFSET):
            prev_offset = offset
            offset = payload[0].value()
            amount_to_put -= offset - prev_offset
        else:
            offset += amt_accepted
            amount_to_put -= amt_accepted

    return error, offset
Esempio n. 2
0
def file_update_attrs(radio, path_list, attrs):
    '''
    Retrieve current attributes of a file from remote tag
    '''
    def _file_attr_msg(path_list):
        tname = TagName(path2tlvs(path_list))
        # zzz print('file update attrs', path_list, tname)
        return TagHead(tname)

    req_msg = _file_attr_msg(path_list)
    if (req_msg == None):
        print('file_attr bad request msg')
        return attrs
    # zzz
    print(req_msg.name)
    err, payload = msg_exchange(radio, req_msg)
    if (err == tlv_errors.SUCCESS):
        this_time = time()
        print(payload)
        offset, filesize = payload2values(
            payload,
            [
                tlv_types.OFFSET,
                tlv_types.SIZE,
                # zzz tlv_types.UTC_TIME,
            ])
        if (filesize == None): filesize = 0
        if (offset == None): offset = 0
    else:
        print('file_attr error in response: {}'.format(err))
        this_time = time()
        filesize = 0
    attrs['st_size'] = filesize
    attrs['st_mtime'] = this_time
    return attrs
Esempio n. 3
0
def im_get_dir(radio, path_list, version=None):
    '''
    Get Image Directory

    Returns a list of tuples containing a directory
    name and current state.
    '''

    # zzz print('im_get_dir',path_list)

    def _get_dir_msg(path_list):
        im_name = TagName(path2tlvs(path_list))
        msg = TagGet(im_name)
        return msg

    dir_req = _get_dir_msg(path_list)
    # zzz
    print('dir_req.name', dir_req.name)
    error, payload = msg_exchange(radio, dir_req)
    # zzz print(error, payload)
    rtn_list = []
    if (error == tlv_errors.SUCCESS):
        # zzz print(payload)
        for x in range(0, len(payload), 2):
            version = payload[x].value()
            state = payload[x + 1].value()
            print('im get dir, state: {} version: {}'.format(state, version))
            if (state != 'x'):
                if (state == 'a'): state = 'active'
                elif (state == 'b'): state = 'backup'
                elif (state == 'g'): state = 'golden'
                elif (state == 'n'): state = 'NIB'
                elif (state == 'v'): state = 'valid'
                rtn_list.append((version, state))
    return rtn_list
Esempio n. 4
0
def _put_bytes(radio, tname, buf, offset):
    '''
    Send bytes to a remote file on the tag
    '''

    def _file_put_msg(tname, buf, offset):
        if (offset):
            tname.append(TagTlv(tlv_types.OFFSET, offset))
        msg = TagPut(tname, pl=bytearray(buf))
        return msg

    req_msg = _file_put_msg(tname, buf, offset)
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    name=req_msg.name)
    err, payload, msg_meta = msg_exchange(radio, req_msg)
    if (err == tlv_errors.SUCCESS):
        amtLeft = payload2values(payload,
                             [tlv_types.SIZE,
                             ])[0]
        if (amtLeft == None):
            amtLeft = len(buf)
        if get_cmd_args().verbosity > 2:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        count=len(buf),
                        size=amtLeft)
        return amtLeft
    mylog.error(method=inspect.stack()[0][3],
               lineno=sys._getframe().f_lineno,
               error=err)
    return 0
Esempio n. 5
0
def im_delete_file(radio, path_list):
    """
    Delete the file from the remote tag

    Return True  if error == success
    """
    def _delete_msg(path_list):
        im_name = TagName(path2tlvs(path_list))
        msg = TagDelete(im_name)
        return msg

    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3], path=path_list)
    delete_req = _delete_msg(path_list)
    if get_cmd_args().verbosity > 2:
        mylog.debug(
            method=inspect.stack()[0][3],
            name=delete_req.name,
        )
    error, payload, msg_meta = msg_exchange(radio, delete_req)
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3], error=error, data=payload)
    if (error) and (error != tlv_errors.SUCCESS):
        error = tlv_errors.SUCCESS
    mylog.info(
        method=inspect.stack()[0][3],
        error=error,
    )
    return error
Esempio n. 6
0
def file_truncate(radio, path_list, offset):

    def _truncate_msg(tname, offset):
        msg = TagPut(tname,
                     pl=TagTlvList([(tlv_types.INTEGER, offset)]))
        return msg

    tname = TagName(path2tlvs(path_list))
    req_msg = _truncate_msg(tname, offset)
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    name=req_msg.name, offset=offset)
    err, payload, msg_meta = msg_exchange(radio, req_msg)
    if (err == tlv_errors.SUCCESS):
        amtLeft = payload2values(payload,
                             [tlv_types.SIZE,
                             ])[0]
        if get_cmd_args().verbosity > 2:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        offset=amtLeft)
        return amtLeft
    mylog.error(method=inspect.stack()[0][3],
               lineno=sys._getframe().f_lineno,
               error=err)
    return -2
Esempio n. 7
0
def im_close_file(radio, path_list, offset):
    def _close_msg(path_list):
        im_name = TagName(path2tlvs(path_list))
        im_name.append(TagTlv(tlv_types.OFFSET, offset))
        msg = TagPut(im_name, pl=TagTlvList([TagTlv(tlv_types.EOF)]))
        return msg

    close_req = _close_msg(path_list)
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3],
                    name=close_req.name,
                    data=close_req.payload)
    error, payload, msg_meta = msg_exchange(radio, close_req)
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3],
                    error=error,
                    data=close_req.payload,
                    meta=msg_meta)
    if (error) \
       and (error != tlv_errors.SUCCESS) \
       and (error != tlv_errors.EODATA):
        return 0
    offset = payload2values(payload, [
        tlv_types.OFFSET,
    ])[0]
    if (offset):
        return offset
    else:
        return 0
Esempio n. 8
0
def simple_get_record(radio, path_list):
    '''
    Simple Record Data Transfer function
    '''
    def _file_record_msg(path_list):
        # / <node_id> / "tag" / "info" / "sens" / "gps" / "xyz"
        tlv_list = path2tlvs(path_list)
        tname = TagName(tlv_list)
        if get_cmd_args().verbosity > 3:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        name=tname)
        return TagGet(tname)

    end = time() + DEADMAN_TIME # deadman timer
    accum_bytes = bytearray()
    req_msg = _file_record_msg(path_list)
    while time() < end:
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    name=req_msg.name)
        err, payload, msg_meta = msg_exchange(radio, req_msg)
        if get_cmd_args().verbosity > 2:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        error=err,
                        data=payload)
        if (err == tlv_errors.SUCCESS) or \
           (err == tlv_errors.EODATA):
            if (err == tlv_errors.EODATA):
                mylog.info('end of data',
                           method=inspect.stack()[0][3],
                           error=err)
            break
        else:
            mylog.error('error',
                       method=inspect.stack()[0][3],
                       lineno=sys._getframe().f_lineno,
                       error=err)
            if err != tlv_errors.EBUSY:
                break
    if time() > end:
        mylog.warn('deadman timeout',
                   method=inspect.stack()[0][3],
                   lineno=sys._getframe().f_lineno,
                   end=end, now=time())
    if get_cmd_args().verbosity > 1:
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    error=err,
                    data=payload)
    return err, payload, msg_meta
Esempio n. 9
0
def im_close_file(radio, path_list):
    def _close_msg(path_list):
        im_name = TagName(path2tlvs(path_list))
        msg = TagPut(im_name, pl=[TagTlv(tlv_types.EOF)])
        return msg

    close_req = _close_msg(path_list)
    # zzz
    print(close_req.name)
    error, payload = msg_exchange(radio, close_req)
    if (error) and (error != tlv_errors.SUCCESS):
        return False
    return True
Esempio n. 10
0
def im_get_dir(radio, path_list, version=None):
    '''
    Get Image Directory

    Returns a list of tuples containing a directory
    name and current state.
    '''
    mylog.debug(method=inspect.stack()[0][3], path=path_list)

    def _get_dir_msg(path_list, version):
        tlv_list = path2tlvs(path_list)
        if (version):
            tlv_list.append(TagTlv(tlv_types.VERSION, version))
        im_name = TagName(tlv_list)
        msg = TagGet(im_name)
        return msg

    if (version):
        dir_req = _get_dir_msg(path_list, version)
    else:
        dir_req = _get_dir_msg(path_list, None)

    mylog.debug(method=inspect.stack()[0][3], name=dir_req.name)
    error, payload, msg_meta = msg_exchange(radio, dir_req)
    mylog.debug(method=inspect.stack()[0][3],
                error=error,
                data=payload,
                meta=msg_meta)
    rtn_list = []
    if (error == tlv_errors.SUCCESS):
        if get_cmd_args().verbosity > 2:
            mylog.debug(method=inspect.stack()[0][3], data=payload)
        for x in range(0, len(payload), 2):
            version = payload[x].value()
            state = payload[x + 1].value()
            if get_cmd_args().verbosity > 2:
                mylog.debug(method=inspect.stack()[0][3],
                            state=state,
                            version=version)
            if (state == 'a'): state = 'active'
            elif (state == 'b'): state = 'backup'
            elif (state == 'g'): state = 'golden'
            elif (state == 'n'): state = 'NIB'
            elif (state == 'v'): state = 'valid'
            rtn_list.append((version, state))
    return rtn_list
Esempio n. 11
0
def im_set_version(radio, path_list):
    def _set_version_msg(path_list):
        tlv_list = path2tlvs(path_list[:-1])
        tlv_list.append(TagTlv(tlv_types.VERSION, path_list[-1].split('.')))
        req_obj = TagPut(TagName(tlv_list))
        return req_obj

    req_msg = _set_version_msg(path_list)
    if get_cmd_args().verbosity > 2:
        mylog.debug(
            method=inspect.stack()[0][3],
            name=req_msg.name,
        )
    err, payload, msg_meta = msg_exchange(radio, req_msg)
    if (err is None):
        err = tlv_errors.SUCCESS
    mylog.debug(method=inspect.stack()[0][3], error=err)
    return err
Esempio n. 12
0
def file_update_attrs(radio, path_list, attrs):
    '''
    Retrieve current attributes of a file from remote tag
    '''

    def _file_attr_msg(path_list):
        tname = TagName(path2tlvs(path_list))
        return TagHead(tname)

    req_msg = _file_attr_msg(path_list)
    if (req_msg == None):
        mylog.error('bad request',
                    method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    path=path_list)
        return attrs
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    name=req_msg.name)
    err, payload, msg_meta = msg_exchange(radio, req_msg)
    if (err == tlv_errors.SUCCESS):
        if get_cmd_args().verbosity > 2:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        data=payload)
        offset, filesize = payload2values(payload,
                                          [tlv_types.OFFSET,
                                           tlv_types.SIZE,
                                           # zzz tlv_types.UTC_TIME,
                                          ])
        this_time = time() # zzz need to set from response value
        if (filesize == None): filesize = 0
        if (offset == None): offset = 0
    else:
        mylog.error('response failure', method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    error=err)
        this_time = -1
        filesize = 0
    attrs['st_size']  = filesize
    attrs['st_mtime'] = this_time
    attrs['rssi'] = msg_meta[0]
    return attrs
Esempio n. 13
0
def _put_bytes(radio, tname, buf, offset):
    def _file_put_msg(tname, buf, offset):
        if (offset):
            tname.append(TagTlv(tlv_types.OFFSET, offset))
        msg = TagPut(tname, pl=bytearray(buf))
        return msg

    req_msg = _file_put_msg(tname, buf, offset)
    # zzz print(req_msg.name)
    err, payload = msg_exchange(radio, req_msg)
    if (err == tlv_errors.SUCCESS):
        amt = payload2values(payload, [
            tlv_types.SIZE,
        ])[0]
        if (amt == None): amt = 0
        # zzz
        print(len(buf), amt, err)
        return len(buf) - amt
    return 0
Esempio n. 14
0
def im_delete_file(radio, path_list):
    """
    Delete the file from the remote tag

    Return True  if error == success
    """
    def _delete_msg(path_list):
        im_name = TagName(path2tlvs(path_list))
        msg = TagDelete(im_name)
        return msg

    # zzz
    print(path_list)
    delete_req = _delete_msg(path_list)
    # zzz
    print(delete_req.name)
    error, payload = msg_exchange(radio, delete_req)
    if (error) and (error != tlv_errors.SUCCESS):
        return False
    print(payload)
    return True
Esempio n. 15
0
def file_get_bytes(radio, path_list, amount_to_get, file_offset):
    '''
    File Byte Data Transfer function
    '''
    accum_bytes = bytearray()
    eof = False

    def _file_bytes_msg(path_list, amount_to_get, file_offset):
        # / <node_id> / "tag" / "sd" / 0 / devname / byte [/ fileno]
        tlv_list = path2tlvs(path_list)
        tlv_list.extend([
            TagTlv(tlv_types.OFFSET, file_offset),
            TagTlv(tlv_types.SIZE, amount_to_get)
        ])
        tname = TagName(tlv_list)
        # zzz
        print(tname)
        return TagGet(tname)

    accum_bytes = bytearray()
    tries = 3
    while (amount_to_get) and (tries):
        req_msg = _file_bytes_msg(path_list, amount_to_get, file_offset)
        # zzz print(req_msg.name)
        err, payload = msg_exchange(radio, req_msg)
        if (err == tlv_errors.SUCCESS):
            offset, amt2get, block = payload2values(payload, [
                tlv_types.OFFSET,
                tlv_types.SIZE,
                tlv_types.BLOCK,
            ])
            # zzz print('read pos: {}, len: {}, error: {}'.format(offset, amt2get, err))
            if (block):
                accum_bytes += block
                file_offset += len(block)
                amount_to_get -= len(block)
            if (eof):
                print('eof: {}'.format(offset))
                break
            if (offset) and (offset != file_offset):
                print('bad offset, expected: {}, got: {}'.format(
                    file_offset, offset))
                break
            if (amt2get) and (amt2get != amount_to_get):
                print('bad size, expected: {}, got: {}'.format(
                    amount_to_get, amt2get))
                break
        elif (err == tlv_errors.EBUSY):
            # zzz print('busy')
            continue
        elif (err == tlv_errors.EODATA):
            print('end of file, offset: {}'.format(offset))
            eof = True
            break
        else:
            print('unexpected error: {}, offset: {}'.format(err, offset))
            break
    # zzz
    print('read p/l:{}/{}'.format(file_offset - len(accum_bytes),
                                  len(accum_bytes)))
    return accum_bytes, eof
Esempio n. 16
0
def file_get_bytes(radio, path_list, amount_to_get, file_offset):
    '''
    File Byte Data Transfer function
    '''
    accum_bytes = bytearray()
    eof = False

    def _file_bytes_msg(path_list, amount_to_get, file_offset):
        # / <node_id> / "tag" / "sd" / 0 / blockname / byte [/ fileno]
        tlv_list = path2tlvs(path_list)
        tlv_list.extend([TagTlv(tlv_types.OFFSET, file_offset),
                         TagTlv(tlv_types.SIZE, amount_to_get)])
        tname = TagName(tlv_list)
        if get_cmd_args().verbosity > 2:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        name=tname)
        return TagGet(tname)

    end = time() + DEADMAN_TIME # deadman timer
    accum_bytes = bytearray()
    eof = False
    while (amount_to_get > 0) and time() < end:
        req_msg = _file_bytes_msg(path_list, amount_to_get, file_offset)
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    name=req_msg.name)
        err, payload, msg_meta = msg_exchange(radio, req_msg)
        if get_cmd_args().verbosity > 3:
            mylog.debug(method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        error=err,
                        data=payload)
        if (err == tlv_errors.SUCCESS) or \
           (err == tlv_errors.EODATA):
            offset, amt2get, block = payload2values(payload,
                                                    [tlv_types.OFFSET,
                                                     tlv_types.SIZE,
                                                     tlv_types.BLOCK,
                                                    ])
            if get_cmd_args().verbosity > 2:
                mylog.debug(method=inspect.stack()[0][3],
                            lineno=sys._getframe().f_lineno,
                            offset=offset,
                            count=amt2get,
                            size=0 if not block else len(block),
                            error=err)
            if not block:
                block = payload2special(payload,
                               [tlv_types.INTEGER,
                                tlv_types.UTC_TIME,
                                tlv_types.VERSION,
                                tlv_types.GPS,
                                tlv_types.STRING])
            if block:
                accum_bytes   += block
                file_offset   += len(block)
                amount_to_get -= len(block)

            if (err == tlv_errors.EODATA):
                mylog.info('end of data',
                           method=inspect.stack()[0][3],
                           offset=file_offset,
                           count=amount_to_get,
                           error=err)
                eof = True
                break

            if (offset) and (offset != file_offset):
                mylog.warn('offset mismatch',
                           method=inspect.stack()[0][3],
                           offset=file_offset,
                           size=offset)
                break
            if (amt2get) and (amt2get != amount_to_get):
                mylog.warn('size mismatch',
                           method=inspect.stack()[0][3],
                           size=amount_to_get,
                           count=amt2get)
                break
        elif (err == tlv_errors.EBUSY):
            mylog.info('busy',
                       method=inspect.stack()[0][3],
                       offset=file_offset,
                       error=err)
            continue
        else:
            mylog.error('unexpected', method=inspect.stack()[0][3],
                        lineno=sys._getframe().f_lineno,
                        offset=file_offset,
                        error=err)
            break
    if get_cmd_args().verbosity > 2:
        mylog.debug(method=inspect.stack()[0][3],
                    lineno=sys._getframe().f_lineno,
                    count=file_offset-len(accum_bytes),
                    size=len(accum_bytes),
                    eof=eof)
    return accum_bytes, eof