class Sixconfig < ActiveRecord::Base has_and_belongs_to_many :mods belongs_to :server belongs_to :appsetting belongs_to :action six_guid def from_updater_yml(yml) yml.each_pair do |key, value| end end def all_mods(srv = self.server) hash = Hash.new m = [] m += srv.mods if srv self.mods.each { |mod| m << mod unless m.include?(mod) } m.each {|mod| if (mod.new_record? && !mod.exists?(self.appsetting)); mod.disabled = true; end } m end def exec "" end def execute(action, setting, server, autoskip, inweb) #self.auto_skip_status(setting, server, false) if autoskip h = self.output_yml(setting, server) cl = "" if action action.tasks.each do |task| cl += " --#{task}" unless task == "Default" end end if inweb Sixconfig.start_updater_inweb(cl) return h end case RUBY_PLATFORM when /-mingw32$/, /-mswin32$/ cl += " --wait" end Sixconfig.start_updater(cl) h end def clear_skip_status(server_override = nil) self.all_mods(server_override).each do |mod| mod.skip = false mod.save end end def auto_skip_status(setting_override = false, server_override = nil, force = false) setting = if setting_override setting_override else self.appsetting end srv = if server_override server_override else self.server end setting = Appsetting.new unless setting self.all_mods(srv).each do |mod| if force mod.skip = false else mod.update_version(setting.real_modpath) mod.update_skip end mod.save end end def output_yml(setting = nil, server = nil) yml = self.to_updater_yml(setting, server) File.open(File.join(SixUpdaterWeb::DATA_PATH, 'six-updater.yml'), 'w') do |file| file.puts yml.to_yaml end yml end def self.path path = SixUpdaterWeb::RUBY_PATH.clone path.gsub!("/", "\\") end def self.app_path # Dirty workaround for Windows six-updater.rb inside BASE_PATH will take precedence over ruby\bin\six-updater(.bat) case RUBY_PLATFORM when /-mingw32$/, /-mswin32$/ "six-updater.bat" else "six-updater" end end def self.start_updater(cl) SixUpdaterWeb::run_program(path, app_path, SixUpdaterWeb::BASE_PATH, cl) end def self.start_updater_inweb(cl) logger.info "Starting #{self.app_path} with #{cl} from #{SixUpdaterWeb::BASE_PATH}" #$stdout.sync = true ActiveRecord::Base.connection_pool.clear_stale_cached_connections! Thread.new(cl, logger) do |cl, logger| #out = [] Dir.chdir SixUpdaterWeb::BASE_PATH do |dir| session = Logsession.new session.save buff2 = [] status = Open3.popen3("#{self.app_path} #{cl}") do |io_in, io_out, io_err, waitth| previous = Time.now io_out.each do |buffer| logger.info buffer entry = Log.new entry.logsession = session entry.content = buffer buff2 << entry if Time.now - previous > 2 begin buff2.each do |e| e.save buff2 -= [e] end buff2 = [] previous = Time.now rescue logger.warn "Updater Thread Exception Caught" logger.debug "#{$!}" end end #out << buffer end end begin buff2.each { |e| e.save } rescue logger.warn "Updater Thread Exception Caught" logger.debug "#{$!}" end end ActiveRecord::Base.connection_pool.clear_stale_cached_connections! end sleep 2 end def to_updater_yml(setting_override = nil, server_override = nil) setting = if setting_override setting_override else self.appsetting end srv = if server_override server_override else self.server end setting = Appsetting.new unless setting hash = setting.to_updater_yml hash[:folders] = [] self.all_mods(srv).each do |mod| y = mod.to_updater_yml hash[:folders] << y unless hash[:folders].include?(y) end hash[:server] = srv.to_updater_yml if srv hash end end