PageRenderTime 93ms CodeModel.GetById 39ms RepoModel.GetById 0ms app.codeStats 0ms

/sinatra/lib/geomena/web.rb

https://bitbucket.org/donpdonp/geomena
Ruby | 136 lines | 113 code | 19 blank | 4 comment | 13 complexity | 063b494051a9e9a5044935c27f61bf38 MD5 | raw file
  1. module Geomena
  2. class Web < Sinatra::Base
  3. set :views, settings.root + '/../../views'
  4. configure do
  5. set :sessions, true
  6. @@log = Logger.new(STDOUT)
  7. Version = File.open(File.dirname(__FILE__)+"/../../public/version") {|f| f.read } rescue Errno::ENOTDIR
  8. end
  9. get '/' do
  10. erb :index, :locals => {:ocount => GCouch.count, :aplast => GCouch.last}
  11. end
  12. get '/api' do
  13. redirect "http://bitbucket.org/donpdonp/geomena/wiki/APIReference"
  14. end
  15. get '/search' do
  16. if mac_valid?(params[:q])
  17. mac = mac_clean(params[:q])
  18. redirect "/ap/#{mac}"
  19. else
  20. redirect "/essid/#{params[:q]}"
  21. end
  22. end
  23. get '/locate' do
  24. erb :locate
  25. end
  26. post '/' do
  27. geodata = JSON.parse(request.body.read)
  28. @@log.info("W3C Lookup: #{geodata}")
  29. towers = geodata["wifi_towers"]
  30. return if towers.nil? || towers.size == 0
  31. towers.each do |tower|
  32. macaddr = mac_clean(tower["mac_address"])
  33. response = GCouch.get_by_mac(macaddr)
  34. ap = first_ap(response)
  35. if ap
  36. answer = {"location" => {"latitude" => ap["latitude"],
  37. "longitude" => ap["longitude"],
  38. "accuracy" => 150},
  39. "access_token" => "abc123"}
  40. GCouch.log(macaddr,"success")
  41. return answer.to_json
  42. else
  43. GCouch.log(macaddr,"failure")
  44. end
  45. end
  46. return ""
  47. end
  48. get '/ap/:mac' do |mac|
  49. response = GCouch.get_by_mac(mac)
  50. puts "response #{response.inspect}"
  51. ap = first_ap(response)
  52. ocount = GCouch.get_observation_count_for_mac(mac)
  53. puts ":locals => {:ap => #{ap}, :mac => #{mac}, :ocount => #{ocount}}"
  54. erb :apshow, :locals => {:ap => ap, :mac => mac, :ocount => ocount}
  55. end
  56. post '/ap/:mac' do |mac|
  57. payload = {:mac => mac_clean(mac),
  58. :essid => params[:essid],
  59. :latitude => params[:latitude],
  60. :longitude => params[:longitude],
  61. :essid => params[:essid]}
  62. if params[:id]
  63. payload.merge!({:id => params[:id], :_rev => params[:rev]})
  64. GCouch.put(payload)
  65. else
  66. payload.merge!({:created_at => Time.now.utc.iso8601})
  67. GCouch.put(payload)
  68. end
  69. redirect "/ap/#{params[:mac]}"
  70. end
  71. get '/essid/:essid' do |essid|
  72. essids = GCouch.get_by_essid(essid)["rows"]
  73. if essids.size > 1
  74. erb :essids, :locals => {:essids => essids, :essid => essid}
  75. elsif essids.size == 1
  76. redirect "/ap/#{essids[0]["value"]["mac"]}"
  77. elsif essids.size == 0
  78. session[:searchmsg] = "Network name not found. Use the mac address to create a new record."
  79. redirect "/"
  80. end
  81. end
  82. post '/bitbucket' do
  83. system("./stop.sh; hg pull; hg update; hg log -l 1|head -1|cut -d' ' -f4 > public/version; ./start.sh")
  84. end
  85. get '/about' do
  86. erb :about
  87. end
  88. get '/clients' do
  89. erb :clients
  90. end
  91. get '/data' do
  92. erb :data
  93. end
  94. get '/data/heatmap' do
  95. erb :heatmap
  96. end
  97. private
  98. def first_ap(aps)
  99. if aps["rows"].size > 0
  100. aps["rows"].first["value"]
  101. end
  102. end
  103. def mac_clean(mac)
  104. # take off leading and trailing space
  105. mac = mac.strip
  106. # fill in "0"s if needed
  107. mac = mac.split(':').map {|m| if m.length == 1; "0"+m; else m; end }.join
  108. # remove the ":" or "-" seperators
  109. mac = mac.gsub(':','').gsub('-','')
  110. # lowercase
  111. mac = mac.downcase
  112. end
  113. def mac_valid?(mac)
  114. !!mac.match(/^\s*..:..:..:..:..:..\s*$/)
  115. end
  116. end
  117. end