|
|
|
@ -31,8 +31,13 @@ FINALIZED = os.path.join(STAGING_ROOT, "finalized") |
|
|
|
|
|
|
|
|
|
OVERLAY_INIT = Path(os.path.join(BASEDIR, ".overlay_init")) |
|
|
|
|
|
|
|
|
|
DAYS_NO_CONNECTIVITY_MAX = 14 # do not allow to engage after this many days |
|
|
|
|
DAYS_NO_CONNECTIVITY_PROMPT = 10 # send an offroad prompt after this many days |
|
|
|
|
# do not allow to engage after this many hours onroad and this many routes |
|
|
|
|
HOURS_NO_CONNECTIVITY_MAX = 27 |
|
|
|
|
ROUTES_NO_CONNECTIVITY_MAX = 84 |
|
|
|
|
# send an offroad prompt after this many hours onroad and this many routes |
|
|
|
|
HOURS_NO_CONNECTIVITY_PROMPT = 23 |
|
|
|
|
ROUTES_NO_CONNECTIVITY_PROMPT = 80 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserRequest: |
|
|
|
|
NONE = 0 |
|
|
|
@ -271,13 +276,15 @@ class Updater: |
|
|
|
|
if len(self.branches): |
|
|
|
|
self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys())) |
|
|
|
|
|
|
|
|
|
last_update = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) |
|
|
|
|
last_uptime_onroad = self.params.get("UptimeOnroad", return_default=True) |
|
|
|
|
last_route_count = self.params.get("RouteCount", return_default=True) |
|
|
|
|
if update_success: |
|
|
|
|
write_time_to_param(self.params, "LastUpdateTime") |
|
|
|
|
self.params.put("LastUpdateTime", datetime.datetime.now(datetime.UTC).replace(tzinfo=None)) |
|
|
|
|
self.params.put("LastUpdateUptimeOnroad", last_uptime_onroad) |
|
|
|
|
self.params.put("LastUpdateRouteCount", last_route_count) |
|
|
|
|
else: |
|
|
|
|
t = self.params.get("LastUpdateTime") |
|
|
|
|
if t is not None: |
|
|
|
|
last_update = t |
|
|
|
|
last_uptime_onroad = self.params.get("LastUpdateUptimeOnroad") or last_uptime_onroad |
|
|
|
|
last_route_count = self.params.get("LastUpdateRouteCount") or last_route_count |
|
|
|
|
|
|
|
|
|
if exception is None: |
|
|
|
|
self.params.remove("LastUpdateException") |
|
|
|
@ -315,8 +322,8 @@ class Updater: |
|
|
|
|
for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"): |
|
|
|
|
set_offroad_alert(alert, False) |
|
|
|
|
|
|
|
|
|
now = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) |
|
|
|
|
dt = now - last_update |
|
|
|
|
dt_uptime_onroad = (self.params.get("UptimeOnroad", return_default=True) - last_uptime_onroad) / (60*60) |
|
|
|
|
dt_route_count = self.params.get("RouteCount", return_default=True) - last_route_count |
|
|
|
|
build_metadata = get_build_metadata() |
|
|
|
|
if failed_count > 15 and exception is not None and self.has_internet: |
|
|
|
|
if build_metadata.tested_channel: |
|
|
|
@ -325,11 +332,11 @@ class Updater: |
|
|
|
|
extra_text = exception |
|
|
|
|
set_offroad_alert("Offroad_UpdateFailed", True, extra_text=extra_text) |
|
|
|
|
elif failed_count > 0: |
|
|
|
|
if dt.days > DAYS_NO_CONNECTIVITY_MAX: |
|
|
|
|
if dt_uptime_onroad > HOURS_NO_CONNECTIVITY_MAX and dt_route_count > ROUTES_NO_CONNECTIVITY_MAX: |
|
|
|
|
set_offroad_alert("Offroad_ConnectivityNeeded", True) |
|
|
|
|
elif dt.days > DAYS_NO_CONNECTIVITY_PROMPT: |
|
|
|
|
remaining = max(DAYS_NO_CONNECTIVITY_MAX - dt.days, 1) |
|
|
|
|
set_offroad_alert("Offroad_ConnectivityNeededPrompt", True, extra_text=f"{remaining} day{'' if remaining == 1 else 's'}.") |
|
|
|
|
elif dt_uptime_onroad > HOURS_NO_CONNECTIVITY_PROMPT and dt_route_count > ROUTES_NO_CONNECTIVITY_PROMPT: |
|
|
|
|
remaining = max(HOURS_NO_CONNECTIVITY_MAX - dt_uptime_onroad, 1) |
|
|
|
|
set_offroad_alert("Offroad_ConnectivityNeededPrompt", True, extra_text=f"{remaining} hour{'' if remaining == 1 else 's'}.") |
|
|
|
|
|
|
|
|
|
def check_for_update(self) -> None: |
|
|
|
|
cloudlog.info("checking for updates") |
|
|
|
|