#!/usr/bin/env python
# simple service that waits for network access and tries to update every 3 hours
import os
import time
import subprocess
from common . basedir import BASEDIR
from common . params import Params
from selfdrive . swaglog import cloudlog
from selfdrive . version import dirty
NICE_LOW_PRIORITY = [ " nice " , " -n " , " 19 " ]
def main ( gctx = None ) :
params = Params ( )
while True :
# try network
r = subprocess . call ( [ " ping " , " -W " , " 4 " , " -c " , " 1 " , " 8.8.8.8 " ] )
if r :
time . sleep ( 60 )
continue
# If there are modifications we preserve full history
# and disable update prompting.
# Otherwise, only store head to save space
if dirty :
r = subprocess . call ( NICE_LOW_PRIORITY + [ " git " , " fetch " , " --unshallow " ] )
is_update_available = False
else :
r = subprocess . call ( NICE_LOW_PRIORITY + [ " git " , " fetch " , " --depth=1 " ] )
is_update_available = check_is_update_available ( )
is_update_available_str = " 1 " if is_update_available else " 0 "
params . put ( " IsUpdateAvailable " , is_update_available_str )
cloudlog . info ( " IsUpdateAvailable: %s " , is_update_available_str )
cloudlog . info ( " git fetch: %r " , r )
if r :
time . sleep ( 60 )
continue
# download apks
r = subprocess . call ( [ " nice " , " -n " , " 19 " , os . path . join ( BASEDIR , " apk/external/patcher.py " ) , " download " ] )
cloudlog . info ( " patcher download: %r " , r )
time . sleep ( 60 * 60 * 3 )
def check_is_update_available ( ) :
try :
local_rev = subprocess . check_output ( NICE_LOW_PRIORITY + [ " git " , " rev-parse " , " @ " ] )
upstream_rev = subprocess . check_output ( NICE_LOW_PRIORITY + [ " git " , " rev-parse " , " @ {u} " ] )
return upstream_rev != local_rev
except subprocess . CalledProcessError :
cloudlog . exception ( " updated: failed to compare local and upstream " )
return False
if __name__ == " __main__ " :
main ( )