You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							4.5 KiB
						
					
					
				
			
		
		
	
	
							150 lines
						
					
					
						
							4.5 KiB
						
					
					
				| #!/usr/bin/env python3
 | |
| import re
 | |
| import time
 | |
| import json
 | |
| import base64
 | |
| import requests
 | |
| import subprocess
 | |
| from http.server import BaseHTTPRequestHandler, HTTPServer
 | |
| from os.path import expanduser
 | |
| from threading import Thread
 | |
| 
 | |
| from common.params import Params
 | |
| import os
 | |
| 
 | |
| 
 | |
| MASTER_HOST = "testing.comma.life"
 | |
| 
 | |
| 
 | |
| def get_workdir():
 | |
|   continue_sh = open('/data/data/com.termux/files/continue.sh').read()
 | |
|   for l in continue_sh.split('\n'):
 | |
|     if l.startswith('#'):
 | |
|       continue
 | |
| 
 | |
|     if 'cd "$HOME/one"' in l:
 | |
|       work_dir = expanduser('~/one')
 | |
|       return work_dir
 | |
| 
 | |
|   work_dir = '/data/openpilot'
 | |
|   return work_dir
 | |
| 
 | |
| 
 | |
| def heartbeat():
 | |
|   work_dir = get_workdir()
 | |
|   env = {
 | |
|     "LD_LIBRARY_PATH": "",
 | |
|     "ANDROID_DATA": "/data",
 | |
|     "ANDROID_ROOT": "/system",
 | |
|   }
 | |
| 
 | |
|   while True:
 | |
| 
 | |
|     with open(os.path.join(work_dir, "selfdrive", "common", "version.h")) as _versionf:
 | |
|       version = _versionf.read().split('"')[1]
 | |
| 
 | |
|     # subprocess.check_output(["/system/bin/screencap", "-p", "/tmp/screen.png"], cwd=work_dir, env=env)
 | |
|     # screenshot = base64.b64encode(open('/tmp/screen.png').read())
 | |
|     tmux = ""
 | |
| 
 | |
|     try:
 | |
|       tmux = os.popen('tail -n 100 /tmp/tmux_out').read()
 | |
|     except:
 | |
|       pass
 | |
| 
 | |
|     params = Params()
 | |
|     msg = {
 | |
|       'version': version,
 | |
|       'dongle_id': params.get("DongleId").rstrip().decode('utf8'),
 | |
|       'remote': subprocess.check_output(["git", "config", "--get", "remote.origin.url"], cwd=work_dir).decode('utf8').rstrip(),
 | |
|       'revision': subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=work_dir).decode('utf8').rstrip(),
 | |
|       'serial': subprocess.check_output(["getprop", "ro.boot.serialno"]).decode('utf8').rstrip(),
 | |
|       # 'screenshot': screenshot,
 | |
|       'tmux': tmux,
 | |
|     }
 | |
| 
 | |
|     try:
 | |
|       requests.post('http://%s/eon/heartbeat/' % MASTER_HOST, json=msg, timeout=10.0)
 | |
|     except:
 | |
|       print("Unable to reach master")
 | |
| 
 | |
|     time.sleep(5)
 | |
| 
 | |
| 
 | |
| class HTTPHandler(BaseHTTPRequestHandler):
 | |
|     def _set_headers(self, response=200, content='text/html'):
 | |
|         self.send_response(response)
 | |
|         self.send_header('Content-type', content)
 | |
|         self.end_headers()
 | |
| 
 | |
|     def do_GET(self):
 | |
|         self._set_headers()
 | |
|         self.wfile.write("EON alive")
 | |
| 
 | |
|     def do_HEAD(self):
 | |
|         self._set_headers()
 | |
| 
 | |
|     def do_POST(self):
 | |
|         # Doesn't do anything with posted data
 | |
|         self._set_headers(response=204)
 | |
| 
 | |
|         content_length = int(self.headers['Content-Length'])
 | |
|         post_data = self.rfile.read(content_length)
 | |
|         post_data = json.loads(post_data)
 | |
| 
 | |
|         if 'command' not in post_data or 'dongle_id' not in post_data:
 | |
|           return
 | |
| 
 | |
|         params = Params()
 | |
|         if params.get("DongleId").rstrip() != post_data['dongle_id']:
 | |
|           return
 | |
| 
 | |
|         if post_data['command'] == "reboot":
 | |
|           subprocess.check_output(["reboot"])
 | |
| 
 | |
|         if post_data['command'] == "update":
 | |
|           print("Pulling new version")
 | |
|           work_dir = get_workdir()
 | |
|           env = {
 | |
|             "GIT_SSH_COMMAND": "ssh -i /data/gitkey",
 | |
|             "LD_LIBRARY_PATH": "/data/data/com.termux/files/usr/lib/",
 | |
|             "ANDROID_DATA": "/data",
 | |
|             "ANDROID_ROOT": "/system",
 | |
|           }
 | |
| 
 | |
|           subprocess.check_output(["git", "reset", "--hard"], cwd=work_dir, env=env)
 | |
|           # subprocess.check_output(["git", "clean", "-xdf"], cwd=work_dir, env=env)
 | |
|           try:
 | |
|             subprocess.check_output(["git", "fetch", "--unshallow"], cwd=work_dir, env=env)
 | |
|           except subprocess.CalledProcessError:
 | |
|             pass
 | |
| 
 | |
|           if 'revision' in post_data and re.match(r'\b[0-9a-f]{5,40}\b', post_data['revision']):
 | |
|             subprocess.check_output(["git", "fetch", "origin"], cwd=work_dir, env=env)
 | |
|             subprocess.check_output(["git", "checkout", post_data['revision']], cwd=work_dir, env=env)
 | |
|           else:
 | |
|             subprocess.check_output(["git", "pull"], cwd=work_dir, env=env)
 | |
| 
 | |
|           subprocess.check_output(["git", "submodule", "update"], cwd=work_dir, env=env)
 | |
|           subprocess.check_output(["git", "lfs", "pull"], cwd=work_dir, env=env)
 | |
|           subprocess.check_output(["reboot"], cwd=work_dir, env=env)
 | |
| 
 | |
| 
 | |
| def control_server(server_class=HTTPServer, handler_class=HTTPHandler, port=8080):
 | |
|     server_address = ('', port)
 | |
|     httpd = server_class(server_address, handler_class)
 | |
|     print('Starting httpd...')
 | |
|     httpd.serve_forever()
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   heartbeat_thread = Thread(target=heartbeat)
 | |
|   heartbeat_thread.daemon = True
 | |
|   heartbeat_thread.start()
 | |
| 
 | |
|   control_thread = Thread(target=control_server)
 | |
|   control_thread.daemon = True
 | |
|   control_thread.start()
 | |
| 
 | |
|   while True:
 | |
|     time.sleep(1)
 | |
| 
 |