def load(self, rpcmsg): """Extract RPC parameters from message header in rpcmsg into rpcHeader variables. If a ValueError or IndexError is detected, raises rpcMsgError.""" # Mark time received self.timerecd = common.time2timestamp() # Split data into fields and parse it data = rpcmsg.split(',') try: self.len_total = int(data[0]) self.timesent = data[1].strip() # mktime treats its argument as a localtime(), i.e. HST, so we # must subtract 10 hours (36000.0 seconds): self.msg_time = common.timestamp2time(self.timesent) - 36000.0 self.protocol_ver = data[2].strip() self.seq_num = int(data[3]) self.sender = data[4].strip() self.process_code = int(data[5]) # uid and gid can be blank, according to SOSS rpc spec, and often # are, so we maintain them as strings, not ints. self.uid = data[6].strip() self.gid = data[7].strip() self.receiver = data[8].strip() self.pkt_type = data[9].strip() self.msg_type = data[10].strip() self.len_payload = int(data[11]) self.reserved = '%27s' % '' self.payload = rpcmsg[self.len_hdr:] except ValueError, e: raise rpcMsgError("malformed SOSS rpc message: '%s'" % rpcmsg)
def unpack_sd(self): """Unpack self.payload from a FE message.""" try: tablename = self.payload[0:8] statusdata = self.payload[9:] except IndexError, e: raise rpcMsgError("SOSS RPC SD payload format error: %s" % str(e))
def unpack_ab(self): """Unpack self.payload from an AB message.""" try: (seq_num, result) = self.payload.split(',') seq_num = int(seq_num) result = int(result) except (ValueError, TypeError), e: raise rpcMsgError("SOSS RPC AB payload format error: %s" % str(e))
def unpack_fs(self): """Unpack self.payload from a FS message.""" try: data = self.payload.split(',') (fitspath, fitssize, frameid, propid, starsdir, version, indexpath, indexsize) = data fitssize = int(fitssize) indexsize = int(indexsize) except ValueError, e: raise rpcMsgError("SOSS RPC FT,FS payload error: %s" % str(e))
class TCSstatRpcHeader(object): """TCS RPC Header Class. This is a container for RPC header parameters. """ def __init__(self, rpcmsg=None): """Constructor. Calls load(rpcmsg) to extract header parameters if an RPC message is provided; else calls sethdr() to set default header parameters.""" self.len_hdr = 33 if rpcmsg: self.load(rpcmsg) # must be a packed RPC message type else: self.sethdr() def load(self, rpcmsg): """Extract RPC parameters from message header in rpcmsg into rpcHeader variables. Use this method to parse a message that was received. NOTE: for TCSL and TCSS interfaces (see STATint), rpcmsg is an object that has the actual message imbedded in a "contents" attribute; therefore, the header and payload fields must be extracted from rpcmsg.contents. For all other TCS interfaces, the header and payload fields must be extracted from rpcmsg. If a ValueError or IndexError is detected, raises rpcMsgError.""" # Mark time received self.timerecd = time2timestamp() # Extract string message if necessary if type(rpcmsg) != types.StringType: rpcmsg = rpcmsg.contents # Parse fields of header #? print 'rpcmsg = ',rpcmsg try: self.msg_type = rpcmsg[0:2] self.rcvr_host = rpcmsg[2:6] self.send_host = rpcmsg[6:10] self.proc_id_str = rpcmsg[10:14] self.proc_id = int(self.proc_id_str) self.msg_time_str = rpcmsg[14:29] self.msg_time = timestamp2time(self.msg_time_str) self.len_payload_str = rpcmsg[29:33] self.len_payload = int(self.len_payload_str) self.len_total = self.len_hdr + self.len_payload self.payload = rpcmsg[self.len_hdr:self.len_hdr + self.len_payload] except ValueError, e: raise rpcMsgError("malformed TCS rpc message: '%s'" % rpcmsg) except IndexError, e: raise rpcMsgError("malformed TCS rpc message: '%s'" % rpcmsg)
def unpack_fe(self): """Unpack self.payload from a FE message.""" try: (seq_num, status1, status2, result) = self.payload.split(',') seq_num = int(seq_num) status1 = int(status1) status2 = int(status2) result = int(result) except ValueError, e: raise rpcMsgError("SOSS RPC FT,FE payload format error: %s" % str(e))
def unpack_de(self): """Unpack self.payload from a DE message.""" try: statuslist = self.payload.split(',') seq_num = statuslist.pop(0) seq_num = int(seq_num) statuslist = map(int, statuslist) result = statuslist.pop(0) except (ValueError, TypeError), e: raise rpcMsgError("SOSS RPC DT,DE payload format error: %s" % str(e))
def unpack_en(self): """Unpack self.payload from a EN message.""" try: payload = self.payload.split(',') seq_num = int(payload[0]) result = int(payload[1]) # 'application-level' payload payload = ','.join(payload[2:]) except (ValueError, IndexError, TypeError), e: raise rpcMsgError("SOSS RPC CT,EN payload format error: %s" % str(e))
class SOSScmdRpcHeader(object): """SOSS RPC Header Class. This is a container for RPC header parameters. """ def __init__(self, rpcmsg=None): """Constructor. Calls load(rpcmsg) to extract header parameters if an RPC message is provided; else calls sethdr() to set default header parameters.""" self.len_hdr = 128 if rpcmsg: self.load(rpcmsg) else: self.sethdr() def load(self, rpcmsg): """Extract RPC parameters from message header in rpcmsg into rpcHeader variables. If a ValueError or IndexError is detected, raises rpcMsgError.""" # Mark time received self.timerecd = common.time2timestamp() # Split data into fields and parse it data = rpcmsg.split(',') try: self.len_total = int(data[0]) self.timesent = data[1].strip() # mktime treats its argument as a localtime(), i.e. HST, so we # must subtract 10 hours (36000.0 seconds): self.msg_time = common.timestamp2time(self.timesent) - 36000.0 self.protocol_ver = data[2].strip() self.seq_num = int(data[3]) self.sender = data[4].strip() self.process_code = int(data[5]) # uid and gid can be blank, according to SOSS rpc spec, and often # are, so we maintain them as strings, not ints. self.uid = data[6].strip() self.gid = data[7].strip() self.receiver = data[8].strip() self.pkt_type = data[9].strip() self.msg_type = data[10].strip() self.len_payload = int(data[11]) self.reserved = '%27s' % '' self.payload = rpcmsg[self.len_hdr:] except ValueError, e: raise rpcMsgError("malformed SOSS rpc message: '%s'" % rpcmsg) except IndexError, e: raise rpcMsgError("malformed SOSS rpc message: '%s'" % rpcmsg)
def unpack_ds(self): """Unpack self.payload from a DS message.""" try: # Unpack payload. At the end, _framelist_ will contain a list of # tuples of the form (path, size, frameid)--one for each file to # be transferred. framelist = [] contents = self.payload.split(',') while len(contents) > 0: path = contents.pop(0).strip() size = int(contents.pop(0)) frameid = contents.pop(0).strip().upper() framelist.append((path, size, frameid)) except (ValueError, TypeError), e: raise rpcMsgError("SOSS RPC DT,DS payload format error: %s" % str(e))
def load(self, rpcmsg): """Extract RPC parameters from message header in rpcmsg into rpcHeader variables. Use this method to parse a message that was received. NOTE: for TCSL and TCSS interfaces (see STATint), rpcmsg is an object that has the actual message imbedded in a "contents" attribute; therefore, the header and payload fields must be extracted from rpcmsg.contents. For all other TCS interfaces, the header and payload fields must be extracted from rpcmsg. If a ValueError or IndexError is detected, raises rpcMsgError.""" # Mark time received self.timerecd = time2timestamp() # Extract string message if necessary if type(rpcmsg) != types.StringType: rpcmsg = rpcmsg.contents # Parse fields of header #? print 'rpcmsg = ',rpcmsg try: self.msg_type = rpcmsg[0:2] self.rcvr_host = rpcmsg[2:6] self.send_host = rpcmsg[6:10] self.proc_id_str = rpcmsg[10:14] self.proc_id = int(self.proc_id_str) self.msg_time_str = rpcmsg[14:29] self.msg_time = timestamp2time(self.msg_time_str) self.len_payload_str = rpcmsg[29:33] self.len_payload = int(self.len_payload_str) self.len_total = self.len_hdr + self.len_payload self.payload = rpcmsg[self.len_hdr:self.len_hdr + self.len_payload] except ValueError, e: raise rpcMsgError("malformed TCS rpc message: '%s'" % rpcmsg)