#!/usr/bin/env ruby require 'yaml' require 'thread' require 'watcher' module RubyForge module MirrorWatch class Runner def initialize(settings) @settings = settings settings["mirrors"].each do |mirror| watcher = Watcher.new(mirror, settings["url"], settings["size"]) watcher.add_observer self (@mirrors ||= []) << watcher end @mutex = Mutex.new end def update(watcher, active, *args) @mutex.synchronize do puts "#{Time.now.to_s} map is now #{self.to_map}" STDOUT.flush file = File.new(@settings["map"], File::CREAT|File::RDWR, 0644) file.puts self.to_map file.close end end def to_map mirrors = @mirrors.reject do |m| !m.active; end names = mirrors.collect do |m| m.host; end unless names.nil? or names.empty? "server " + names.join("|") else "server" + @settings["fallback"] end end end end end Thread.abort_on_exception = true $THREADS = [] settings = YAML.load(File.new( "mirrorwatch.yml")) RubyForge::MirrorWatch::Runner.new(settings) $THREADS.each do |thread| thread.join end