#!/usr/bin/env python3
import re
import time
import json
import requests
import subprocess
from common . timeout import Timeout
from http . server import BaseHTTPRequestHandler , HTTPServer
from os . path import expanduser
from threading import Thread
from selfdrive . manager import unblock_stdout
from common . params import Params
import os
if __name__ == " __main__ " :
unblock_stdout ( )
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 :
try :
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 Exception :
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 ,
}
with Timeout ( 10 ) :
requests . post ( ' http:// %s /eon/heartbeat/ ' % MASTER_HOST , json = msg , timeout = 5.0 )
except Exception as e :
print ( " Unable to send heartbeat " , e )
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__ " :
control_thread = Thread ( target = control_server )
control_thread . daemon = True
control_thread . start ( )
heartbeat ( )