require 'fileutils' require 'iron_worker_ng/code/container/base' require 'iron_worker_ng/code/container/zip' require 'iron_worker_ng/code/container/dir' require 'iron_worker_ng/feature/base' require 'iron_worker_ng/feature/common/merge_exec' require 'iron_worker_ng/feature/common/merge_file' require 'iron_worker_ng/feature/common/merge_dir' require 'iron_worker_ng/feature/common/merge_deb' require 'iron_worker_ng/feature/common/set_env' module IronWorkerNG module Code class Base attr_accessor :features attr_accessor :fixators attr_accessor :base_dir attr_accessor :dest_dir attr_accessor :env attr_accessor :zip_package attr_accessor :use_local_iron_worker_ng undef exec undef gem include IronWorkerNG::Feature::Common::MergeFile::InstanceMethods include IronWorkerNG::Feature::Common::MergeDir::InstanceMethods include IronWorkerNG::Feature::Common::MergeDeb::InstanceMethods include IronWorkerNG::Feature::Common::SetEnv::InstanceMethods def initialize(*args, &block) @features = [] @fixators = [] @base_dir = '' @dest_dir = '' @full_remote_build = false @runtime = nil @name = nil @exec = nil @zip_package = nil @use_local_iron_worker_ng = false worker_files = [] if args.length == 1 && args[0].is_a?(String) @name = args[0] elsif args.length == 1 && args[0].is_a?(Hash) @name = args[0][:name] || args[0]['name'] worker_file = args[0][:workerfile] || args[0]['workerfile'] worker_files << worker_file unless worker_file.nil? @env = args[0][:env] || args[0]['env'] exec = args[0][:exec] || args[0]['exec'] || args[0][:worker] || args[0]['worker'] unless exec.nil? merge_exec(exec) end end if @name.is_a?(String) && @name.end_with?('.worker') @name = @name.gsub(/\.worker$/, '') end if @name.is_a?(String) && @name.end_with?('.zip') @zip_package = @name @name = @name.gsub(/\.zip/, '') end if @name.nil? and (not @exec.nil?) @name = guess_name_for_path(@exec.path) end if (not @name.nil?) && @zip_package.nil? worker_files << @name + '.worker' end worker_files.each do |worker_file| IronWorkerNG::Fetcher.fetch(worker_file) do |content| unless content.nil? IronCore::Logger.info 'IronWorkerNG', "Found workerfile with path='#{worker_file}'" if IronWorkerNG::Fetcher.remote?(worker_file) @full_remote_build = true end @base_dir = File.dirname(worker_file) == '.' ? '' : File.dirname(worker_file) + '/' eval(content) break end end end unless block.nil? instance_eval(&block) end if @name.nil? and (not @exec.nil?) @name = guess_name_for_path(@exec.path) end unless @name.nil? @name = File.basename(@name) end end def method_missing(name, *args, &block) if @runtime.nil? runtime(:ruby) send(name, *args, &block) else super(name, *args, &block) end end def guess_name_for_path(path) File.basename(path).gsub(/#{File.extname(path)}$/, '') end def name(name = nil) @name = name if name @name end def name=(name) @name = name end def stack(stack_name = nil) @stack = stack_name if stack_name @stack end def remote_build_command(remote_build_command = nil) @remote_build_command = remote_build_command unless remote_build_command.nil? @remote_build_command end def remote_build_command=(remote_build_command) @remote_build_command = remote_build_command end alias :build :remote_build_command alias :build= :remote_build_command= def full_remote_build(full_remote_build = nil) @full_remote_build = full_remote_build unless full_remote_build.nil? @full_remote_build end def full_remote_build=(full_remote_build) @full_remote_build = full_remote_build end def remote @full_remote_build = true end def runtime(runtime = nil) return @runtime unless runtime unless @runtime.nil? IronCore::Logger.error 'IronWorkerNG', "Runtime is already set to '#{@runtime}'", IronCore::Error end runtime_module = nil runtime = runtime.to_s begin runtime_module = IronWorkerNG::Code::Runtime.const_get(runtime.capitalize) rescue begin runtime_module = IronWorkerNG::Code::Runtime.const_get(runtime.upcase) rescue end end if runtime_module.nil? IronCore::Logger.error 'IronWorkerNG', "Can't find runtime '#{runtime}'" end self.extend(runtime_module) @runtime = runtime end def runtime=(runtime) runtime(runtime) end def fixate @fixators.each do |f| send(f) end end def runtime_bundle(container, local = false) end def runtime_run_code(local = false) '' end def bundle(container, local = false) @features.each do |feature| feature.bundle(container) end if local || ((not remote_build_command) && (not full_remote_build)) container.get_output_stream(@dest_dir + '__runner__.sh') do |runner| runner.write <