| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -83,6 +83,14 @@ def make_attrs(*args): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			_httpxargs = dict(timeout=20) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			def convert_to_ws(url): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if url.startswith('http://'): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					url = url.replace('http', 'ws', 1) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				elif url.startswith('https://'): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					url = url.replace('https', 'wss', 1) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				return url | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			def output_board(brd): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				print('Name:\t%s' % brd.name) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				print('Class:\t%s' % brd.brdclass) | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -118,6 +126,7 @@ async def fwd_data(reader, writer): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			async def run_exec(baseurl, authkey, board, args): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				url = urllib.parse.urljoin(baseurl, 'board/%s/exec' % urllib.parse.quote(board, safe='')) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				url = convert_to_ws(url) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				stdin, stdout = await aioconsole.stream.get_standard_streams() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				async with websockets.connect(url) as ws, wsfwd.WSFWDClient(ws.recv, ws.send) as client: | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -338,7 +347,7 @@ class TestExecClient(unittest.IsolatedAsyncioTestCase): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						ret, stdout = await self.runAsyncMain() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						webcon.assert_called_with(urllib.parse.urljoin('http://someserver/', 'board/cora-z7s/exec')) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						webcon.assert_called_with(urllib.parse.urljoin('ws://someserver/', 'board/cora-z7s/exec')) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					await server.__aexit__(None, None, None) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -417,6 +426,17 @@ class TestClient(unittest.TestCase): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					return ret, stdout.getvalue() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				def test_converttows(self): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					testpairs = [ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						('http://somelkjdf/sdoijef/http/https/', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						'ws://somelkjdf/sdoijef/http/https/'), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						('https://oiweufjk/aoijeskfj/sadfoije/http/https/', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						'wss://oiweufjk/aoijeskfj/sadfoije/http/https/'), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					for orig, new in testpairs: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						self.assertEqual(convert_to_ws(orig), new, 'failed to convert: %s' % repr(orig)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				def test_sshpubkey(self): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					fname = 'fname' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					rdata = 'foo' | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |