Fix issue/22 (behaviour if RTL-SDR stick fails or gets removed).
This commit is contained in:
		
							
								
								
									
										35
									
								
								openwebrx.py
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								openwebrx.py
									
									
									
									
									
								
							@@ -86,7 +86,7 @@ def access_log(data):
 | 
				
			|||||||
	logs.access_log.write("["+datetime.datetime.now().isoformat()+"] "+data+"\n")
 | 
						logs.access_log.write("["+datetime.datetime.now().isoformat()+"] "+data+"\n")
 | 
				
			||||||
	logs.access_log.flush()
 | 
						logs.access_log.flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rtl_thread=spectrum_dsp=server_fail=None
 | 
					receiver_failed=spectrum_thread_watchdog_last_tick=rtl_thread=spectrum_dsp=server_fail=None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
	global clients, clients_mutex, pypy, lock_try_time, avatar_ctime, cfg, logs
 | 
						global clients, clients_mutex, pypy, lock_try_time, avatar_ctime, cfg, logs
 | 
				
			||||||
@@ -154,6 +154,8 @@ def main():
 | 
				
			|||||||
	print "[openwebrx-main] Starting spectrum thread."
 | 
						print "[openwebrx-main] Starting spectrum thread."
 | 
				
			||||||
	spectrum_thread=threading.Thread(target = spectrum_thread_function, args = ())
 | 
						spectrum_thread=threading.Thread(target = spectrum_thread_function, args = ())
 | 
				
			||||||
	spectrum_thread.start()
 | 
						spectrum_thread.start()
 | 
				
			||||||
 | 
						spectrum_watchdog_thread=threading.Thread(target = spectrum_watchdog_thread_function, args = ())
 | 
				
			||||||
 | 
						spectrum_watchdog_thread.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	get_cpu_usage()
 | 
						get_cpu_usage()
 | 
				
			||||||
	bcastmsg_thread=threading.Thread(target = bcastmsg_thread_function, args = ())
 | 
						bcastmsg_thread=threading.Thread(target = bcastmsg_thread_function, args = ())
 | 
				
			||||||
@@ -223,10 +225,20 @@ def mutex_watchdog_thread_function():
 | 
				
			|||||||
	while True:
 | 
						while True:
 | 
				
			||||||
		if lock_try_time != 0 and time.time()-lock_try_time > 3.0: 
 | 
							if lock_try_time != 0 and time.time()-lock_try_time > 3.0: 
 | 
				
			||||||
			#if 3 seconds pass without unlock
 | 
								#if 3 seconds pass without unlock
 | 
				
			||||||
			print "[openwebrx-watchdog] Mutex unlock timeout. Locker: \""+str(clients_mutex_locker)+"\" Now unlocking..." 
 | 
								print "[openwebrx-mutex-watchdog] Mutex unlock timeout. Locker: \""+str(clients_mutex_locker)+"\" Now unlocking..." 
 | 
				
			||||||
			clients_mutex.release()
 | 
								clients_mutex.release()
 | 
				
			||||||
		time.sleep(0.5)	
 | 
							time.sleep(0.5)	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def spectrum_watchdog_thread_function():
 | 
				
			||||||
 | 
						global spectrum_thread_watchdog_last_tick, receiver_failed
 | 
				
			||||||
 | 
						while True:
 | 
				
			||||||
 | 
							time.sleep(60)
 | 
				
			||||||
 | 
							if spectrum_thread_watchdog_last_tick and time.time()-spectrum_thread_watchdog_last_tick > 60.0: 
 | 
				
			||||||
 | 
								print "[openwebrx-spectrum-watchdog] Spectrum timeout. Seems like no I/Q data is coming from the receiver.\nFor RTL-SDR, it is a common problem to randomly fail after a time, due to:\n1) overheat,\n2) insufficient current."
 | 
				
			||||||
 | 
								print "[openwebrx-spectrum-watchdog] Deactivating receiver."
 | 
				
			||||||
 | 
								receiver_failed="spectrum"
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def check_server():
 | 
					def check_server():
 | 
				
			||||||
	global spectrum_dsp, server_fail, rtl_thread
 | 
						global spectrum_dsp, server_fail, rtl_thread
 | 
				
			||||||
	if server_fail: return server_fail	
 | 
						if server_fail: return server_fail	
 | 
				
			||||||
@@ -242,7 +254,7 @@ def apply_csdr_cfg_to_dsp(dsp):
 | 
				
			|||||||
	dsp.csdr_through = cfg.csdr_through	
 | 
						dsp.csdr_through = cfg.csdr_through	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def spectrum_thread_function():
 | 
					def spectrum_thread_function():
 | 
				
			||||||
	global clients, spectrum_dsp
 | 
						global clients, spectrum_dsp, spectrum_thread_watchdog_last_tick
 | 
				
			||||||
	spectrum_dsp=dsp=getattr(plugins.dsp,cfg.dsp_plugin).plugin.dsp_plugin()
 | 
						spectrum_dsp=dsp=getattr(plugins.dsp,cfg.dsp_plugin).plugin.dsp_plugin()
 | 
				
			||||||
	dsp.nc_port=cfg.iq_server_port
 | 
						dsp.nc_port=cfg.iq_server_port
 | 
				
			||||||
	dsp.set_demodulator("fft")
 | 
						dsp.set_demodulator("fft")
 | 
				
			||||||
@@ -260,9 +272,14 @@ def spectrum_thread_function():
 | 
				
			|||||||
		print "[openwebrx-spectrum] Note: CSDR_DYNAMIC_BUFSIZE_ON = 1"
 | 
							print "[openwebrx-spectrum] Note: CSDR_DYNAMIC_BUFSIZE_ON = 1"
 | 
				
			||||||
	print "[openwebrx-spectrum] Spectrum thread started." 
 | 
						print "[openwebrx-spectrum] Spectrum thread started." 
 | 
				
			||||||
	bytes_to_read=int(dsp.get_fft_bytes_to_read())
 | 
						bytes_to_read=int(dsp.get_fft_bytes_to_read())
 | 
				
			||||||
 | 
						spectrum_thread_counter=0
 | 
				
			||||||
	while True:
 | 
						while True:
 | 
				
			||||||
		data=dsp.read(bytes_to_read)
 | 
							data=dsp.read(bytes_to_read)
 | 
				
			||||||
		#print "gotcha",len(data),"bytes of spectrum data via spectrum_thread_function()"
 | 
							#print "gotcha",len(data),"bytes of spectrum data via spectrum_thread_function()"
 | 
				
			||||||
 | 
							if spectrum_thread_counter >= cfg.fft_fps: 
 | 
				
			||||||
 | 
								spectrum_thread_counter=0
 | 
				
			||||||
 | 
								spectrum_thread_watchdog_last_tick = time.time() #once every second
 | 
				
			||||||
 | 
							else: spectrum_thread_counter+=1
 | 
				
			||||||
		cma("spectrum_thread")
 | 
							cma("spectrum_thread")
 | 
				
			||||||
		correction=0
 | 
							correction=0
 | 
				
			||||||
		for i in range(0,len(clients)):
 | 
							for i in range(0,len(clients)):
 | 
				
			||||||
@@ -359,7 +376,7 @@ class WebRXHandler(BaseHTTPRequestHandler):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	def do_GET(self):
 | 
						def do_GET(self):
 | 
				
			||||||
		self.connection.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
 | 
							self.connection.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
 | 
				
			||||||
		global dsp_plugin, clients_mutex, clients, avatar_ctime, sw_version
 | 
							global dsp_plugin, clients_mutex, clients, avatar_ctime, sw_version, receiver_failed
 | 
				
			||||||
		rootdir = 'htdocs' 
 | 
							rootdir = 'htdocs' 
 | 
				
			||||||
		self.path=self.path.replace("..","")
 | 
							self.path=self.path.replace("..","")
 | 
				
			||||||
		path_temp_parts=self.path.split("?")
 | 
							path_temp_parts=self.path.split("?")
 | 
				
			||||||
@@ -372,6 +389,7 @@ class WebRXHandler(BaseHTTPRequestHandler):
 | 
				
			|||||||
			# there's even another cool tip at http://stackoverflow.com/questions/4419650/how-to-implement-timeout-in-basehttpserver-basehttprequesthandler-python
 | 
								# there's even another cool tip at http://stackoverflow.com/questions/4419650/how-to-implement-timeout-in-basehttpserver-basehttprequesthandler-python
 | 
				
			||||||
			#if self.path[:5]=="/lock": cma("do_GET /lock/") # to test mutex_watchdog_thread. Do not uncomment in production environment!
 | 
								#if self.path[:5]=="/lock": cma("do_GET /lock/") # to test mutex_watchdog_thread. Do not uncomment in production environment!
 | 
				
			||||||
			if self.path[:4]=="/ws/":
 | 
								if self.path[:4]=="/ws/":
 | 
				
			||||||
 | 
									if receiver_failed: self.send_error(500,"Internal server error")
 | 
				
			||||||
				try:
 | 
									try:
 | 
				
			||||||
					# ========= WebSocket handshake  =========
 | 
										# ========= WebSocket handshake  =========
 | 
				
			||||||
					ws_success=True
 | 
										ws_success=True
 | 
				
			||||||
@@ -509,7 +527,7 @@ class WebRXHandler(BaseHTTPRequestHandler):
 | 
				
			|||||||
			elif self.path in ("/status", "/status/"):
 | 
								elif self.path in ("/status", "/status/"):
 | 
				
			||||||
				#self.send_header('Content-type','text/plain')
 | 
									#self.send_header('Content-type','text/plain')
 | 
				
			||||||
				getbands=lambda: str(int(cfg.shown_center_freq-cfg.samp_rate/2))+"-"+str(int(cfg.shown_center_freq+cfg.samp_rate/2))
 | 
									getbands=lambda: str(int(cfg.shown_center_freq-cfg.samp_rate/2))+"-"+str(int(cfg.shown_center_freq+cfg.samp_rate/2))
 | 
				
			||||||
				self.wfile.write("status=active\nname="+cfg.receiver_name+"\nsdr_hw="+cfg.receiver_device+"\nop_email="+cfg.receiver_admin+"\nbands="+getbands()+"\nusers="+str(len(clients))+"\nusers_max="+str(cfg.max_clients)+"\navatar_ctime="+avatar_ctime+"\ngps="+str(cfg.receiver_gps)+"\nasl="+str(cfg.receiver_asl)+"\nloc="+cfg.receiver_location+"\nsw_version="+sw_version+"\nantenna="+cfg.receiver_ant+"\n")
 | 
									self.wfile.write("status="+("inactive" if receiver_failed else "active")+"\nname="+cfg.receiver_name+"\nsdr_hw="+cfg.receiver_device+"\nop_email="+cfg.receiver_admin+"\nbands="+getbands()+"\nusers="+str(len(clients))+"\nusers_max="+str(cfg.max_clients)+"\navatar_ctime="+avatar_ctime+"\ngps="+str(cfg.receiver_gps)+"\nasl="+str(cfg.receiver_asl)+"\nloc="+cfg.receiver_location+"\nsw_version="+sw_version+"\nantenna="+cfg.receiver_ant+"\n")
 | 
				
			||||||
				print "[openwebrx-httpd] GET /status/ from",self.client_address[0]			
 | 
									print "[openwebrx-httpd] GET /status/ from",self.client_address[0]			
 | 
				
			||||||
			else:
 | 
								else:
 | 
				
			||||||
				f=open(rootdir+self.path)
 | 
									f=open(rootdir+self.path)
 | 
				
			||||||
@@ -517,11 +535,8 @@ class WebRXHandler(BaseHTTPRequestHandler):
 | 
				
			|||||||
				extension=self.path[(len(self.path)-4):len(self.path)]
 | 
									extension=self.path[(len(self.path)-4):len(self.path)]
 | 
				
			||||||
				extension=extension[2:] if extension[1]=='.' else extension[1:]
 | 
									extension=extension[2:] if extension[1]=='.' else extension[1:]
 | 
				
			||||||
				checkresult=check_server()
 | 
									checkresult=check_server()
 | 
				
			||||||
				if extension == "wrx" and checkresult:
 | 
									if extension == "wrx" and (checkresult or receiver_failed):
 | 
				
			||||||
					self.send_response(500)
 | 
										self.send_302("inactive.html")
 | 
				
			||||||
					self.send_header('Content-type','text/html')
 | 
					 | 
				
			||||||
					self.end_headers()
 | 
					 | 
				
			||||||
					self.wfile.write("<html><body><h1>OpenWebRX Internal Server Error</h1>Please check the server log for details.</body></html>")
 | 
					 | 
				
			||||||
					return
 | 
										return
 | 
				
			||||||
				if extension == "wrx" and ((self.headers['user-agent'].count("Chrome")==0 and self.headers['user-agent'].count("Firefox")==0 and (not "Googlebot" in self.headers['user-agent'])) if 'user-agent' in self.headers.keys() else True) and (not request_param.count("unsupported")):
 | 
									if extension == "wrx" and ((self.headers['user-agent'].count("Chrome")==0 and self.headers['user-agent'].count("Firefox")==0 and (not "Googlebot" in self.headers['user-agent'])) if 'user-agent' in self.headers.keys() else True) and (not request_param.count("unsupported")):
 | 
				
			||||||
					self.send_302("upgrade.html")
 | 
										self.send_302("upgrade.html")
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user