|
#!/usr/bin/env ruby |
|
|
|
require "optparse" |
|
require "json" |
|
require "findi" |
|
|
|
def report device, mode=:text |
|
|
|
name = device.name |
|
|
|
# special case for an untracked device |
|
unless device.location_finished? |
|
puts name |
|
puts "-" * name.length |
|
puts "The device is currently being located. Try again shortly." |
|
return |
|
end |
|
|
|
hash = { |
|
id: device.id, |
|
name: device.name, |
|
make: device.kind, |
|
model: device.model, |
|
location: { |
|
time: device.location_timestamp, |
|
type: device.location_type, |
|
accuracy: device.horizontal_accuracy, |
|
latitude: device.latitude, |
|
longitude: device.longitude |
|
}, |
|
battery: { |
|
status: device.battery_status, |
|
level: device.battery_level |
|
} |
|
} |
|
|
|
case mode |
|
when :json |
|
puts hash.to_json |
|
when :csv |
|
puts [ |
|
"\"#{device.name}\"", |
|
device.location_timestamp.strftime("%Y-%m-%d %H:%M:%S"), |
|
device.latitude, |
|
device.longitude |
|
].join(",") |
|
when :gmap |
|
puts "http://maps.google.com/?q=#{device.latitude},#{device.longitude}" |
|
else |
|
puts device.name |
|
puts "-" * device.name.length |
|
puts "Latitude: #{device.latitude}" |
|
puts "Longitude: #{device.longitude}" |
|
puts "Time: #{device.location_timestamp.strftime("%Y-%m-%d %H:%M:%S")}" |
|
end |
|
|
|
end |
|
|
|
options = {} |
|
|
|
OptionParser.new { |opts| |
|
opts.banner = "Usage: trackphone [options]" |
|
|
|
opts.on("-u", "--user [username]", "Username") do |user| |
|
options[:user] = user |
|
end |
|
|
|
opts.on("-p", "--password [password]", "Password") do |password| |
|
options[:password] = password |
|
end |
|
|
|
opts.on("-q", "--query [name query]", "Query name of device") do |query| |
|
options[:query] = query |
|
end |
|
|
|
opts.on("-m", "--mode [mode]", "Report mode, options: text, json, csv") do |mode| |
|
options[:mode] = mode.to_sym |
|
end |
|
|
|
}.parse! |
|
|
|
unless options.key?(:user) && options.key?(:password) |
|
puts "Missing user/password option(s)" |
|
exit 1 |
|
end |
|
|
|
# Fetch devices and settings |
|
devices = Findi::Client.new(options[:user], options[:password]).devices |
|
|
|
if options.key?(:query) |
|
devices = devices.select { |d| d.name =~ /#{options[:query]}/i } |
|
end |
|
|
|
if devices.nil? || devices.empty? |
|
puts "No devices to track..." |
|
exit 0 |
|
end |
|
|
|
devices.each { |device| |
|
report device, options[:mode] |
|
} |
Hello Dan,
Thank you for the excellent work.
However when I try to compile the Ruby script I get the following errors :
iPhone:/var/www root# gem install findi
dyld: lazy symbol binding failed: Symbol not found: __OSSwapInt16
Referenced from: /usr/lib/ruby/1.9.1/arm-darwin9/socket.bundle
Expected in: flat namespace
dyld: Symbol not found: __OSSwapInt16
Referenced from: /usr/lib/ruby/1.9.1/arm-darwin9/socket.bundle
Expected in: flat namespace
Trace/BPT trap: 5
Any idea how to solve this ?
Thanks.
Best regards..