191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require 'OSM/StreamParser'
 | |
| require 'socket'
 | |
| require 'digest/sha1'
 | |
| require 'cucumber/rake/task'
 | |
| require 'sys/proctable'
 | |
| 
 | |
| BUILD_FOLDER = 'build'
 | |
| DATA_FOLDER = 'sandbox'
 | |
| PROFILE = 'bicycle'
 | |
| OSRM_PORT = 5000
 | |
| PROFILES_FOLDER = '../profiles'
 | |
| 
 | |
| Cucumber::Rake::Task.new do |t|
 | |
|   t.cucumber_opts = %w{--format pretty}
 | |
| end
 | |
| 
 | |
| areas = {
 | |
|   :kbh => { :country => 'denmark', :bbox => 'top=55.6972 left=12.5222 right=12.624 bottom=55.6376' },
 | |
|   :frd => { :country => 'denmark', :bbox => 'top=55.7007 left=12.4765 bottom=55.6576 right=12.5698' },
 | |
|   :regh => { :country => 'denmark', :bbox => 'top=56.164 left=11.792 bottom=55.403 right=12.731' },
 | |
|   :denmark => { :country => 'denmark', :bbox => nil },
 | |
|   :skaane => { :country => 'sweden', :bbox => 'top=56.55 left=12.4 bottom=55.3 right=14.6' }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| osm_data_area_name = ARGV[1] ? ARGV[1].to_s.to_sym : :kbh
 | |
| raise "Unknown data area." unless areas[osm_data_area_name]
 | |
| osm_data_country = areas[osm_data_area_name][:country]
 | |
| osm_data_area_bbox = areas[osm_data_area_name][:bbox]
 | |
| 
 | |
| 
 | |
| task osm_data_area_name.to_sym {}   #define empty task to prevent rake from whining. will break if area has same name as a task
 | |
| 
 | |
| 
 | |
| def each_process name, &block
 | |
|   Sys::ProcTable.ps do |process|
 | |
|     if process.comm.strip == name.strip && process.state != 'zombie'
 | |
|       yield process.pid.to_i, process.state.strip
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| def up?
 | |
|   find_pid('osrm-routed') != nil
 | |
| end
 | |
| 
 | |
| def find_pid name
 | |
|   each_process(name) { |pid,state| return pid.to_i }
 | |
|   return nil
 | |
| end
 | |
| 
 | |
| def wait_for_shutdown name
 | |
|   timeout = 10
 | |
|   (timeout*10).times do
 | |
|     return if find_pid(name) == nil
 | |
|     sleep 0.1
 | |
|   end
 | |
|   raise "*** Could not terminate #{name}."
 | |
| end
 | |
| 
 | |
| 
 | |
| desc "Rebuild and run tests."
 | |
| task :default => [:build]
 | |
| 
 | |
| desc "Build using CMake."
 | |
| task :build do
 | |
|   if Dir.exists? BUILD_FOLDER
 | |
|     Dir.chdir BUILD_FOLDER do
 | |
|       system "make"
 | |
|     end
 | |
|   else
 | |
|     system "mkdir build; cd build; cmake ..; make"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Setup config files."
 | |
| task :setup do
 | |
| end
 | |
| 
 | |
| desc "Download OSM data."
 | |
| task :download do
 | |
|   Dir.mkdir "#{DATA_FOLDER}" unless File.exist? "#{DATA_FOLDER}"
 | |
|   puts "Downloading..."
 | |
|   puts "curl http://download.geofabrik.de/europe/#{osm_data_country}-latest.osm.pbf -o #{DATA_FOLDER}/#{osm_data_country}.osm.pbf"
 | |
|   raise "Error while downloading data." unless system "curl http://download.geofabrik.de/europe/#{osm_data_country}-latest.osm.pbf -o #{DATA_FOLDER}/#{osm_data_country}.osm.pbf"
 | |
|   if osm_data_area_bbox
 | |
|     puts "Cropping and converting to protobuffer..."
 | |
|     raise "Error while cropping data." unless system "osmosis --read-pbf file=#{DATA_FOLDER}/#{osm_data_country}.osm.pbf --bounding-box #{osm_data_area_bbox} --write-pbf file=#{DATA_FOLDER}/#{osm_data_area_name}.osm.pbf omitmetadata=true"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Crop OSM data"
 | |
| task :crop do
 | |
|   if osm_data_area_bbox
 | |
|     raise "Error while cropping data." unless system "osmosis --read-pbf file=#{DATA_FOLDER}/#{osm_data_country}.osm.pbf --bounding-box #{osm_data_area_bbox} --write-pbf file=#{DATA_FOLDER}/#{osm_data_area_name}.osm.pbf omitmetadata=true"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Reprocess OSM data."
 | |
| task :process => [:extract,:contract] do
 | |
| end
 | |
| 
 | |
| desc "Extract OSM data."
 | |
| task :extract do
 | |
|   Dir.chdir DATA_FOLDER do
 | |
|     raise "Error while extracting data." unless system "../#{BUILD_FOLDER}/osrm-extract #{osm_data_area_name}.osm.pbf --profile ../profiles/#{PROFILE}.lua"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Contract OSM data."
 | |
| task :contract do
 | |
|   Dir.chdir DATA_FOLDER do
 | |
|     raise "Error while contracting data." unless system "../#{BUILD_FOLDER}/osrm-contract #{osm_data_area_name}.osrm"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Delete preprocessing files."
 | |
| task :clean do
 | |
|   File.delete *Dir.glob("#{DATA_FOLDER}/*.osrm")
 | |
|   File.delete *Dir.glob("#{DATA_FOLDER}/*.osrm.*")
 | |
| end
 | |
| 
 | |
| desc "Run all cucumber test"
 | |
| task :test do
 | |
|   system "cucumber"
 | |
|   puts
 | |
| end
 | |
| 
 | |
| desc "Run the routing server in the terminal. Press Ctrl-C to stop."
 | |
| task :run do
 | |
|   Dir.chdir DATA_FOLDER do
 | |
|     system "../#{BUILD_FOLDER}/osrm-routed #{osm_data_area_name}.osrm --port #{OSRM_PORT}"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Launch the routing server in the background. Use rake:down to stop it."
 | |
| task :up do
 | |
|   Dir.chdir DATA_FOLDER do
 | |
|     abort("Already up.") if up?
 | |
|     pipe = IO.popen("../#{BUILD_FOLDER}/osrm-routed #{osm_data_area_name}.osrm --port #{OSRM_PORT} 1>>osrm-routed.log 2>>osrm-routed.log")
 | |
|     timeout = 5
 | |
|     (timeout*10).times do
 | |
|       begin
 | |
|         socket = TCPSocket.new('localhost', OSRM_PORT)
 | |
|         socket.puts 'ping'
 | |
|       rescue Errno::ECONNREFUSED
 | |
|         sleep 0.1
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Stop the routing server."
 | |
| task :down do
 | |
|   pid = find_pid 'osrm-routed'
 | |
|   if pid
 | |
|     Process.kill 'TERM', pid
 | |
|   else
 | |
|     puts "Already down."
 | |
|   end 
 | |
| end
 | |
| 
 | |
| desc "Kill all osrm-extract, osrm-contract and osrm-routed processes."
 | |
| task :kill do
 | |
|   each_process('osrm-routed') { |pid,state| Process.kill 'KILL', pid }
 | |
|   each_process('osrm-contract') { |pid,state| Process.kill 'KILL', pid }
 | |
|   each_process('osrm-extract') { |pid,state| Process.kill 'KILL', pid }
 | |
|   wait_for_shutdown 'osrm-routed'
 | |
|   wait_for_shutdown 'osrm-contract'
 | |
|   wait_for_shutdown 'osrm-extract'  
 | |
| end
 | |
| 
 | |
| desc "Get PIDs of all osrm-extract, osrm-contract and osrm-routed processes."
 | |
| task :pid do
 | |
|   each_process 'osrm-routed' do |pid,state|
 | |
|     puts "#{pid}\t#{state}"
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Stop, reprocess and restart."
 | |
| task :update => [:down,:process,:up] do
 | |
| end
 | |
| 
 | |
| 
 | |
| desc "Remove test cache files."
 | |
| task :sweep do
 | |
|   system "rm test/cache/*"
 | |
| end
 | |
| 
 |