def run(self): SOCK_CLOSE_STATE = 1 SOCK_OPENTRY_STATE = 2 SOCK_OPEN_STATE = 3 SOCK_CONNECTTRY_STATE = 4 SOCK_CONNECT_STATE = 5 idle_state = 1 datasent_state = 2 sys.stdout.write('thread for %r ' % self.serverip) sys.stdout.write('is starting\r\n') # TCPClient instance creation client = TCPClient(2, self.serverip, self.serverport) filename = self.serverip + '_log.txt' #print(filename) IsTimeout = 0 self.f = open(filename, 'w+') while True: if client.state is SOCK_CLOSE_STATE: cur_state = client.state client.state = client.open() if client.state != cur_state: sys.stdout.write('client.state is %r\r\n' % client.state) time.sleep(1) elif client.state is SOCK_OPEN_STATE: cur_state = client.state client.state = client.connect() if client.state != cur_state: sys.stdout.write('client.state is %r\r\n' % client.state) time.sleep(1) elif client.state is SOCK_CONNECT_STATE: if client.working_state == idle_state: try: client.write(msg) client.working_state = datasent_state self.istimeout = 0 self.totaltrycount += 1 self.timer1 = threading.Timer(5.0, self.myTimer) self.timer1.start() except Exception as e: sys.stdout.write('%r\r\n' % e) elif client.working_state == datasent_state: response = client.readline() if (response != ""): sys.stdout.write(response) sys.stdout.write('\n') sys.stdout.flush() self.timer1.cancel() self.istimeout = 0 if (msg in response): logstr = '[' + self.serverip + ']' + strftime( "%d %b %Y %H:%M:%S", localtime()) + ': success\r\n' sys.stdout.write(logstr) self.successcount += 1 time.sleep(10) client.working_state = idle_state else: logstr = '[' + self.serverip + ']' + strftime( "%d %b %Y %H:%M:%S", localtime()) + ': fail by broken data\r\n' sys.stdout.write(logstr) self.failcount += 1 self.f.write(logstr) self.f.write("\r\n") time.sleep(10) client.working_state = idle_state if self.istimeout is 1: self.timer1.cancel() self.istimeout = 0 logstr = '[' + self.serverip + ']' + strftime( "%d %b %Y %H:%M:%S", localtime()) + ': fail by timeout\r\n' sys.stdout.write(logstr) self.failcount += 1 self.f.write(logstr) self.f.write("\r\n") time.sleep(5) client.working_state = idle_state response = ""
class comthread(threading.Thread): def __init__(self, id, dst_ip): threading.Thread.__init__(self) self.exitflag = False self.bank = 0 self.id = id self.alive = True self.command = idle_msg self.dst_ip = dst_ip self.outputs = [] self.is_request = False self.is_start = False self.timer1 = None if (id % 4) is 0: self.dst_port = 5001 self.power_port = 0 self.switch_port = 4 self.redled_port = 8 self.blueled_port = 9 elif (id % 4) is 1: self.dst_port = 5002 self.power_port = 1 self.switch_port = 5 self.redled_port = 10 self.blueled_port = 11 elif (id % 4) is 2: self.dst_port = 5003 self.power_port = 3 self.switch_port = 7 self.redled_port = 14 self.blueled_port = 15 elif (id % 4) is 3: self.dst_port = 5004 self.power_port = 2 self.switch_port = 6 self.redled_port = 12 self.blueled_port = 13 lastnumindex = dst_ip.rfind('.') lastnum = int(dst_ip[lastnumindex + 1:len(dst_ip)]) self.module_ip = dst_ip[:lastnumindex + 1] + str(lastnum + id + 1) + "\r" # sys.stdout.write('module ip: %r\n' % self.module_ip) self.client = TCPClient(2, self.dst_ip, self.dst_port) def stop(self): sys.stdout.write('[ComThread %r] ' % self.id) sys.stdout.write('is shutdowning\r\n') if self.client is not None: self.client.close() if self.timer1 is not None: self.timer1.cancel() self.alive = False def run(self): sys.stdout.write('[ComThread %r] Hello\r\n' % self.id) # self.client.open() while self.alive: if self.client.state is SOCK_CLOSE_STATE: cur_state = self.client.state self.client.state = self.client.open() # if self.client.state != cur_state: # print(self.client.state) elif self.client.state is SOCK_OPEN_STATE: cur_state = self.client.state self.client.state = self.client.connect() # if self.client.state != cur_state: # print(self.client.state) elif self.client.state is SOCK_CONNECT_STATE: if self.client.working_state == idle_state: try: self.outputs.insert( 0, [self.power_port, POWER_OFF, 'POWER OFF']) # sys.stdout.write('>') time.sleep(0.1) # check input switch value self.client.working_state = check_sw_1_state # logger.debug("Waiting SW%r input\r\n" % (switch_port -4)) except: time.sleep(1) elif self.client.working_state == check_sw_1_state: if (self.command == keypressed_msg): sys.stdout.write( '[ComThread %r] got key pressed message\r\n' % self.id) self.command = idle_msg self.client.working_state = check_sw_2_state elif self.client.working_state == check_sw_2_state: if (self.command == keyreleased_msg): sys.stdout.write( '[ComThread %r] got keyreleased message\r\n' % self.id) self.command = idle_msg self.client.working_state = ready_state elif self.client.working_state == ready_state: try: self.outputs.insert( 0, [self.redled_port, LED_OFF, 'RED LED OFF']) self.outputs.insert( 0, [self.blueled_port, LED_OFF, 'BLUE LED OFF']) self.outputs.insert( 0, [self.power_port, POWER_ON, 'POWER ON']) self.outputs.insert( 0, [self.redled_port, LED_ON, 'RED LED ON']) self.outputs.insert( 0, [self.redled_port, LED_OFF, 'RED LED OFF']) self.client.working_state = gout_1_state sys.stdout.write('timer1 start\r\n') self.timer1 = threading.Timer(10.0, timeoutfunc) IsTimeout = 0 self.timer1.start() except Exception as e: sys.stdout.write('%r\r\n' % e) sys.stdout.write('timer1 stop\r\n') self.timer1.cancel() time.sleep(1) elif self.client.working_state == gout_1_state: if (len(self.outputs) == 0): self.client.working_state = init_state sys.stdout.write('\r\ninit_state\r\n') else: time.sleep(0.5) if IsTimeout is 1: # self.timer1.cancel() self.client.outputs.remove() self.client.working_state = idle_state elif self.client.working_state == init_state: response = self.client.readline() # logger.debug("[init_state] [%r] %r" % (len(response), response)) if (response != ""): sys.stdout.write(response) # sys.stdout.flush() if ("9: Load Boot Loader code then write to Flash via TFTP." in response): self.client.write("2") # print 'timer1 stop' self.timer1.cancel() self.client.working_state = menuselect_state sys.stdout.write('\r\nmenuselect_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("init_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == menuselect_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() if ("Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)" in response): self.client.write("Y") self.timer1.cancel() self.client.working_state = flasherase_state # sys.stdout.write('\r\nflasherase_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() elif ("3: System Boot system code via Flash" in response): self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("menuselect_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == flasherase_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() if ("Input device IP (10.10.10.123)" in response): for i in range(12): self.client.write("\b \b") time.sleep(0.1) self.timer1.cancel() self.client.working_state = localIP_state # sys.stdout.write('\r\nlocalIP_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("flasherase_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == localIP_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() response = "" self.timer1.cancel() self.client.write(self.module_ip) self.client.working_state = localIP2_state # sys.stdout.write('\r\nlocalIP2_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("localIP_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == localIP2_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() self.timer1.cancel() self.client.working_state = localIPDone_state # sys.stdout.write('\r\nlocalIPDone_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("localIP2_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == localIPDone_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() if ("Input server IP (10.10.10.3)" in response): for i in range(10): self.client.write("\b \b") time.sleep(0.1) self.timer1.cancel() self.client.working_state = serverIP_state # sys.stdout.write('\r\nserverIP_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("localIPDone_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == serverIP_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() self.client.write("192.168.10.212\r") # self.client.write("192.168.10.235\r") self.timer1.cancel() self.client.working_state = serverIP2_state # sys.stdout.write('\r\nserverIP2_state\r\n') self.timer1 = threading.Timer(3.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("serverIP_state timeout") self.timer1.cancel() self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == serverIP2_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() self.timer1.cancel() self.client.working_state = checkOrder_state sys.stdout.write('\r\ncheckOrder_state\r\n') self.timer1 = threading.Timer(30.0, timeoutfunc) IsTimeout = 0 self.timer1.start() response = "" if IsTimeout is 1: sys.stdout.write("serverIP2_state timeout") self.timer1.cancel() self.client.working_state = fail_state # sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == checkOrder_state: if self.is_request is False: self.is_request = True else: if self.is_start is True: self.timer1.cancel() self.client.working_state = serverIPDone_state # sys.stdout.write('\r\nserverIPDone_state\r\n') if IsTimeout is 1: sys.stdout.write("checkOrder_state timeout") self.timer1.cancel() self.client.working_state = fail_state self.is_request = False sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == serverIPDone_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() if ("Input Linux Kernel filename ()" in response): self.client.write("std.bin\r") self.client.working_state = filename_state # sys.stdout.write('\r\nfilename_state\r\n') response = "" elif self.client.working_state == filename_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) # sys.stdout.flush() # self.timer1.cancel() self.client.working_state = filenameDone_state # sys.stdout.write('\r\nfilenameDone_state\r\n') # self.timer1 = threading.Timer(30.0, timeoutfunc) # IsTimeout = 0 # self.timer1.start() response = "" # if IsTimeout is 1: # sys.stdout.write("filename_state timeout") # self.timer1.cancel() # self.client.working_state = fail_state # sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == filenameDone_state: ch = self.client.read() if (ch != ''): self.client.str_list.append(ch) sys.stdout.write("%c" % ch) # sys.stdout.flush() if (ch == '\r'): response = ''.join(self.client.str_list) # sys.stdout.write('[%r-%r]' % (self.bank, self.id)) del self.client.str_list[:] if ("done" in response): # self.timer1.cancel() self.client.working_state = tftpDone_state # sys.stdout.write('\r\ntftpDone_state\r\n') self.is_request = False self.is_start = False # self.timer1 = threading.Timer(30.0, timeoutfunc) # IsTimeout = 0 # self.timer1.start() elif ("Retry count exceeded; starting again" in response): self.client.retrycount += 1 # logger.debug("retrycount: %r\r\n" % self.client.retrycount) if (self.client.retrycount >= 10): self.client.retrycount = 0 self.client.working_state = fail_state sys.stdout.write('\r\nfail_state\r\n') response = "" # if IsTimeout is 1: # sys.stdout.write("filenameDone_state timeout") # self.timer1.cancel() # self.client.working_state = fail_state # sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == tftpDone_state: ch = self.client.read() if (ch != ''): self.client.str_list.append(ch) # if(ch is '#'): # sys.stdout.write("%c" % ch) # sys.stdout.flush() if (ch == '\r'): response = ''.join(self.client.str_list) # sys.stdout.write(response) sys.stdout.write('%r' % self.id) del self.client.str_list[:] if ("Verifying Checksum ... Bad Data CRC" in response): # self.timer1.cancel() sys.stdout.write( 'Flashing Failed. Bad CRC\r\n') self.client.write("\r\n\r\n") self.client.working_state = fail_state sys.stdout.write('\r\fail_state\r\n') # self.is_start = False # self.is_request = False # self.timer1 = threading.Timer(10.0, timeoutfunc) # IsTimeout = 0 # self.timer1.start() elif ("Verifying Checksum ... OK" in response): self.client.working_state = flashVerified_state sys.stdout.write('\r\nflashverified_state\r\n') response = "" elif self.client.working_state == flashVerified_state: ch = self.client.read() if (ch != ''): self.client.str_list.append(ch) # if(ch is '#'): # sys.stdout.write("%c" % ch) # sys.stdout.flush() if (ch == '\r'): response = ''.join(self.client.str_list) # sys.stdout.write(response) sys.stdout.write('%r' % self.id) del self.client.str_list[:] if ("Please press Enter to activate this console." in response): # self.timer1.cancel() sys.stdout.write('enter CRLF \r\n') self.client.write("\r\n\r\n") self.client.working_state = done_state sys.stdout.write('\r\done_state\r\n') # self.is_start = False # self.is_request = False # self.timer1 = threading.Timer(10.0, timeoutfunc) # IsTimeout = 0 # self.timer1.start() elif ("failsafe button BTN_1 was pressed" in response): self.client.working_state = done_state sys.stdout.write('\r\ndone_state\r\n') response = "" elif self.client.working_state == done_state: response = self.client.readline() if (response != ""): sys.stdout.write(response) if ("root@" in response): #Standard # if ("IPS-231-0000 login:"******"\r\n") sys.stdout.flush() self.client.write("\r") sys.stdout.write( "===============================================\n" ) sys.stdout.write( " Bank %r, ID %r Firmware Update Succeeded!!!\n" % (self.bank, self.id)) sys.stdout.write( "===============================================\n" ) sys.stdout.flush() # BLUELED ON (HIGH) # self.timer1.cancel() self.outputs.insert( 0, [self.blueled_port, LED_ON, 'BLUE LED ON']) self.outputs.insert( 0, [self.power_port, POWER_OFF, 'POWER OFF']) self.client.working_state = gout_2_state sys.stdout.write('\r\ngout_2_state\r\n') elif ("Please press Enter to activate this console." in response): self.client.write("\r\n\r\n") else: self.client.write("\r\n") response = "" # if IsTimeout is 1: # sys.stdout.write("done_state timeout") # self.timer1.cancel() # self.client.working_state = fail_state # sys.stdout.write('\r\nfail_state\r\n') elif self.client.working_state == fail_state: self.outputs.insert( 0, [self.redled_port, LED_ON, 'RED LED ON']) self.outputs.insert( 0, [self.power_port, POWER_OFF, 'POWER OFF']) self.client.working_state = gout_2_state sys.stdout.write('\r\ngout_2_state\r\n') elif self.client.working_state == gout_2_state: if (len(self.outputs) == 0): logger.debug( "You can remove a module on bank%r now\r\n" % self.id) self.client.working_state = idle_state sys.stdout.write('\r\nidle_state\r\n') sys.stdout.write('[ComThread %r] Bye! \r\n' % self.id) self.client.close()