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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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