The directory:
/private/var/root/Library/Caches/locationd
contains:
WMM.dat cache.plist clients.plist consolidated.db ephemeris/ glgps_nvs.bin lto2.dat stats.plis
If we run strings
on lto2.dat
, the last line indicates:
BCMLTO33
which hints to a Broadcom Long Term Orbits (LTO) with Assisted-GPS (AGPS) module.
consolidated.db is an sqlite3 database keeping a record of GPS locations. It can be found at:
/private/var/root/Library/Caches/locationd
in order to extract the last known location, one can issue:
/usr/bin/sqlite3 /private/var/root/Library/Caches/locationd/consolidated.db "select latitude,longitude from CellLocation order by Timestamp desc limit 1"
We can trigger activator commands by using an application called TerminalActivator (hopefully updated soon . . .) which acts as a bridge between console commands and Activator.
<?php $pois = array( // add your own POIs to the array new POI(55.761895,37.628174,"notify_post 'Lock Screen'") ); class POI { var $latitude; var $longitude; var $accuracy = 10; var $command; function __construct() { $argc = func_num_args(); $argv = func_get_args(); if(method_exists($this,$cons='__construct'.$argc)) { call_user_func_array(array($this,$cons),$argv); } } function __construct4($la, $lo, $cm, $ac) { $this->latitude = $la; $this->longitude = $lo; $this->command = $cm; $this->accuracy = $ac; } function __construct3($la, $lo, $cm) { $this->latitude = $la; $this->longitude = $lo; $this->command = $cm; } } $db = new PDO('sqlite:/private/var/root/Library/Caches/locationd/consolidated.db'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $q = $db->prepare("SELECT Latitude,Longitude FROM CellLocation ORDER BY Timestamp DESC LIMIT 1"); $q->execute(); $row = $q->fetchObject(); foreach($pois as $poi) { // S = R^2 * (lo_{2}-lo_{1})(sin(la_{1}-sin(la_{2})) if(pow(6371*1000,2) // R_{earth} = 6371 km * abs($row->Longitude-$poi->longitude) * abs(sin($row->Latitude)-sin($poi->latitude)) < $poi->accuracy) { system($poi->command); } } return null; ?>
We can save the PHP script to /usr/local/bin
and create a plist file called com.gpstrigger.plist
in the directory /Library/LaunchDaemons
that will run every hour and check whether our location is within the accuracy range of any POIs:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.gpstrigger</string> <key>ProgramArguments</key> <array> <string>/usr/bin/php</string> <string>/path/to/gpstrigger.php</string> </array> <key>RunAtLoad</key> <true/> <key>StartInterval</key> <integer>3600</integer> </dict> </plist>
We can program TerminalActivator to trigger any Activator action but any terminal commands are possible.