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.
		
		
		
		
			
				
					79 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					79 lines
				
				2.3 KiB
			| 
								 
											5 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import time
							 | 
						||
| 
								 | 
							
								import json
							 | 
						||
| 
								 | 
							
								import subprocess
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import requests
							 | 
						||
| 
								 | 
							
								from timezonefinder import TimezoneFinder
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from common.params import Params
							 | 
						||
| 
								 | 
							
								from selfdrive.swaglog import cloudlog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def set_timezone(valid_timezones, timezone):
							 | 
						||
| 
								 | 
							
								  if timezone not in valid_timezones:
							 | 
						||
| 
								 | 
							
								    cloudlog.error(f"Timezone not supported {timezone}")
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cloudlog.info(f"Setting timezone to {timezone}")
							 | 
						||
| 
								 | 
							
								  try:
							 | 
						||
| 
								 | 
							
								    subprocess.check_call(f'sudo timedatectl set-timezone {timezone}', shell=True)
							 | 
						||
| 
								 | 
							
								  except subprocess.CalledProcessError:
							 | 
						||
| 
								 | 
							
								    cloudlog.exception(f"Error setting timezone to {timezone}")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def main():
							 | 
						||
| 
								 | 
							
								  params = Params()
							 | 
						||
| 
								 | 
							
								  tf = TimezoneFinder()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # Get allowed timezones
							 | 
						||
| 
								 | 
							
								  valid_timezones = subprocess.check_output('timedatectl list-timezones', shell=True, encoding='utf8').strip().split('\n')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while True:
							 | 
						||
| 
								 | 
							
								    time.sleep(60)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    is_onroad = params.get("IsOffroad") != b"1"
							 | 
						||
| 
								 | 
							
								    if is_onroad:
							 | 
						||
| 
								 | 
							
								      continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Set based on param
							 | 
						||
| 
								 | 
							
								    timezone = params.get("Timezone", encoding='utf8')
							 | 
						||
| 
								 | 
							
								    if timezone is not None:
							 | 
						||
| 
								 | 
							
								      cloudlog.info("Setting timezone based on param")
							 | 
						||
| 
								 | 
							
								      set_timezone(valid_timezones, timezone)
							 | 
						||
| 
								 | 
							
								      continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    location = params.get("LastGPSPosition", encoding='utf8')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Find timezone based on IP geolocation if no gps location is available
							 | 
						||
| 
								 | 
							
								    if location is None:
							 | 
						||
| 
								 | 
							
								      cloudlog.info("Setting timezone based on IP lookup")
							 | 
						||
| 
								 | 
							
								      try:
							 | 
						||
| 
								 | 
							
								        r = requests.get("https://ipapi.co/timezone", timeout=10)
							 | 
						||
| 
								 | 
							
								        if r.status_code == 200:
							 | 
						||
| 
								 | 
							
								          set_timezone(valid_timezones, r.text)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								          cloudlog.error(f"Unexpected status code from api {r.status_code}")
							 | 
						||
| 
								 | 
							
								      except requests.exceptions.RequestException:
							 | 
						||
| 
								 | 
							
								        cloudlog.exception("Error getting timezone based on IP")
							 | 
						||
| 
								 | 
							
								        continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Find timezone by reverse geocoding the last known gps location
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								      cloudlog.info("Setting timezone based on GPS location")
							 | 
						||
| 
								 | 
							
								      try:
							 | 
						||
| 
								 | 
							
								        location = json.loads(location)
							 | 
						||
| 
								 | 
							
								      except Exception:
							 | 
						||
| 
								 | 
							
								        cloudlog.exception("Error parsing location")
							 | 
						||
| 
								 | 
							
								        continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      timezone = tf.timezone_at(lng=location['longitude'], lat=location['latitude'])
							 | 
						||
| 
								 | 
							
								      if timezone is None:
							 | 
						||
| 
								 | 
							
								        cloudlog.error(f"No timezone found based on location, {location}")
							 | 
						||
| 
								 | 
							
								        continue
							 | 
						||
| 
								 | 
							
								      set_timezone(valid_timezones, timezone)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  main()
							 |