From 67a2faf0a59e13be7309720ca5bfcb342da10d1f Mon Sep 17 00:00:00 2001 From: Andres Jardon Date: Tue, 21 Mar 2023 13:25:02 +0000 Subject: [PATCH] Source code changes and dependency updates for Ruby 3.1 and 3.2 support commit: 6c7988df7868ecfa183fe9778ef5ed5587210698 Author: Andres Jardon Date: 2023-03-20T20:06:16.000Z Source code changes and dependency updates for Ruby 3.1 and 3.2 support commit: 3aa58788849a414fb0ae6ddd94a96d8dbf696f92 Author: Andres Jardon Date: 2023-03-20T18:04:30.000Z Source code changes and dependency updates for Ruby 3.1 and 3.2 support commit: 77a4cc18f931284d4908a4f8bfa1854727e205ad Author: Andres Jardon Date: 2023-03-17T19:53:35.000Z Source code changes and dependency updates for Ruby 3.1 and 3.2 support --- Gemfile | 1 + codedeploy_agent.gemspec | 1 - lib/aws/codedeploy/local/cli_validator.rb | 6 +- lib/instance_agent/log.rb | 2 +- .../plugins/codedeploy/hook_executor.rb | 6 +- .../plugins/codedeploy/installer.rb | 6 +- .../plugins/codedeploy/onpremise_config.rb | 2 +- .../codedeploy/local/cli_validator_spec.rb | 34 ++-- spec/aws/codedeploy/local/deployer_spec.rb | 31 +-- .../plugins/codedeploy/hook_executor_test.rb | 6 +- .../codedeploy/install_instruction_test.rb | 2 +- .../plugins/codedeploy/installer_test.rb | 46 ++--- .../codedeploy/onpremise_config_test.rb | 192 ++++++++---------- .../lib/process_manager/config.rb | 8 +- .../lib/process_manager/master.rb | 2 +- vendor/gems/simple_pid-0.2.1/README.rdoc | 61 ++++++ vendor/gems/simple_pid-0.2.1/lib/core_ext.rb | 1 + .../simple_pid-0.2.1/lib/core_ext/string.rb | 43 ++++ .../gems/simple_pid-0.2.1/lib/simple_pid.rb | 92 +++++++++ .../process_manager-0.0.13.gemspec | 6 - vendor/specifications/simple_pid.gemspec | 53 +++++ 21 files changed, 415 insertions(+), 186 deletions(-) create mode 100644 vendor/gems/simple_pid-0.2.1/README.rdoc create mode 100644 vendor/gems/simple_pid-0.2.1/lib/core_ext.rb create mode 100644 vendor/gems/simple_pid-0.2.1/lib/core_ext/string.rb create mode 100644 vendor/gems/simple_pid-0.2.1/lib/simple_pid.rb create mode 100644 vendor/specifications/simple_pid.gemspec diff --git a/Gemfile b/Gemfile index f463de01..3dc4f6a6 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,7 @@ source 'http://rubygems.org' gemspec gem "process_manager", "0.0.13", :path => "#{File.expand_path(__FILE__)}/../vendor/gems/process_manager-0.0.13" gem "codedeploy-commands", "1.0.0", :path => "#{File.expand_path(__FILE__)}/../vendor/gems/codedeploy-commands-1.0.0" +gem "simple_pid", "0.2.1", :path => "#{File.expand_path(__FILE__)}/../vendor/gems/simple_pid-0.2.1" group :test do gem 'test-unit' diff --git a/codedeploy_agent.gemspec b/codedeploy_agent.gemspec index e0fcd51c..869643d2 100644 --- a/codedeploy_agent.gemspec +++ b/codedeploy_agent.gemspec @@ -18,7 +18,6 @@ Gem::Specification.new do |spec| spec.add_dependency('logging', '~> 2.2') spec.add_dependency('aws-sdk-core', '~> 3') spec.add_dependency('aws-sdk-s3', '~> 1') - spec.add_dependency('simple_pid', '~> 0.2.1') spec.add_dependency('docopt', '~> 0.5.0') spec.add_dependency('concurrent-ruby', '~> 1.1.9') diff --git a/lib/aws/codedeploy/local/cli_validator.rb b/lib/aws/codedeploy/local/cli_validator.rb index bdf06d5d..89583877 100644 --- a/lib/aws/codedeploy/local/cli_validator.rb +++ b/lib/aws/codedeploy/local/cli_validator.rb @@ -27,7 +27,7 @@ def validate(args) raise ValidationError.new("location #{location} cannot be http, only encrypted (https) url endpoints supported") end - if (uri.scheme != 'https' && uri.scheme != 's3' && !File.exists?(location)) + if (uri.scheme != 'https' && uri.scheme != 's3' && !File.exist?(location)) raise ValidationError.new("location #{location} is specified as a file or directory which does not exist") end @@ -41,10 +41,10 @@ def validate(args) if (type == 'directory' && (uri.scheme != 'https' && uri.scheme != 's3' && File.directory?(location))) appspec_filename = args['--appspec-filename'] - if !appspec_filename.nil? && !File.exists?("#{location}/#{appspec_filename}") + if !appspec_filename.nil? && !File.exist?("#{location}/#{appspec_filename}") raise ValidationError.new("Expecting appspec file at location #{location}/#{appspec_filename} but it is not found there. Please either run the CLI from within a directory containing the #{appspec_filename} file or specify a bundle location containing an #{appspec_filename} file in its root directory") end - if appspec_filename.nil? && !File.exists?("#{location}/appspec.yml") && !File.exists?("#{location}/appspec.yaml") + if appspec_filename.nil? && !File.exist?("#{location}/appspec.yml") && !File.exist?("#{location}/appspec.yaml") raise ValidationError.new("Expecting appspec file at location #{location}/appspec.yml or #{location}/appspec.yaml but it is not found there. Please either run the CLI from within a directory containing the appspec.yml or appspec.yaml file or specify a bundle location containing an appspec.yml or appspec.yaml file in its root directory") end end diff --git a/lib/instance_agent/log.rb b/lib/instance_agent/log.rb index ced996b0..b54aa0f8 100644 --- a/lib/instance_agent/log.rb +++ b/lib/instance_agent/log.rb @@ -8,7 +8,7 @@ class InstanceAgent::DeploymentLog def initialize deployment_logs_dir = File.join(InstanceAgent::Config.config[:root_dir], 'deployment-logs') - FileUtils.mkdir_p(deployment_logs_dir) unless File.exists? deployment_logs_dir + FileUtils.mkdir_p(deployment_logs_dir) unless File.exist? deployment_logs_dir @deployment_log ||= Logger.new(File.join(deployment_logs_dir, "#{InstanceAgent::Config.config[:program_name]}-deployments.log"), 8, 64 * 1024 * 1024) @deployment_log.formatter = proc do |severity, datetime, progname, msg| "[#{datetime.strftime('%Y-%m-%d %H:%M:%S.%L')}] #{msg}\n" diff --git a/lib/instance_agent/plugins/codedeploy/hook_executor.rb b/lib/instance_agent/plugins/codedeploy/hook_executor.rb index a4414121..21884d2e 100644 --- a/lib/instance_agent/plugins/codedeploy/hook_executor.rb +++ b/lib/instance_agent/plugins/codedeploy/hook_executor.rb @@ -210,7 +210,7 @@ def script_error_prefix(script_location, script_run_as_user) private def create_script_log_file_if_needed script_log_file_location = File.join(@current_deployment_root_dir, ScriptLog::SCRIPT_LOG_FILE_RELATIVE_LOCATION) - if(!File.exists?(script_log_file_location)) + if(!File.exist?(script_log_file_location)) unless File.directory?(File.dirname(script_log_file_location)) FileUtils.mkdir_p(File.dirname(script_log_file_location)) end @@ -232,7 +232,7 @@ def script_absolute_path(script) def parse_app_spec app_spec_location = File.join(@deployment_archive_dir, @app_spec_path) log(:debug, "Checking for app spec in #{app_spec_location}") - unless File.exists?(app_spec_location) + unless File.exist?(app_spec_location) raise <<-MESSAGE.gsub(/^[\s\t]*/, '').gsub(/\s*\n/, ' ').strip The CodeDeploy agent did not find an AppSpec file within the unpacked revision directory at revision-relative path "#{@app_spec_path}". The revision was unpacked to directory "#{@deployment_archive_dir}", and the AppSpec file was expected but not found at path @@ -249,7 +249,7 @@ def select_correct_deployment_root_dir(current_deployment_root_dir, last_success hook_deployment_mapping = mapping_between_hooks_and_deployments if(select_correct_mapping_for_hooks == LAST_SUCCESSFUL_DEPLOYMENT && !File.exist?(File.join(@deployment_root_dir, 'deployment-archive'))) @deployment_root_dir = last_successful_deployment_root_dir - elsif(select_correct_mapping_for_hooks == MOST_RECENT_DEPLOYMENT && !File.exists?(File.join(@deployment_root_dir, 'deployment-archive'))) + elsif(select_correct_mapping_for_hooks == MOST_RECENT_DEPLOYMENT && !File.exist?(File.join(@deployment_root_dir, 'deployment-archive'))) @deployment_root_dir = most_recent_deployment_dir end end diff --git a/lib/instance_agent/plugins/codedeploy/installer.rb b/lib/instance_agent/plugins/codedeploy/installer.rb index 9450c88e..b53dd733 100644 --- a/lib/instance_agent/plugins/codedeploy/installer.rb +++ b/lib/instance_agent/plugins/codedeploy/installer.rb @@ -27,7 +27,7 @@ def initialize(opts = {}) def install(deployment_group_id, application_specification) cleanup_file = File.join(deployment_instructions_dir, "#{deployment_group_id}-cleanup") - if File.exists?(cleanup_file) + if File.exist?(cleanup_file) commands = InstanceAgent::Plugins::CodeDeployPlugin::InstallInstruction.parse_remove_commands(File.read(cleanup_file)) commands.each do |cmd| cmd.execute @@ -116,7 +116,7 @@ def generate_directory_copy(i, absolute_source_path, destination, file_exists_be private def generate_normal_copy(i, absolute_source_path, destination, file_exists_behavior) - if File.exists?(destination) + if File.exist?(destination) case file_exists_behavior when "DISALLOW" raise "The deployment failed because a specified file already exists at this location: #{destination}" @@ -136,7 +136,7 @@ def generate_normal_copy(i, absolute_source_path, destination, file_exists_behav def fill_in_missing_ancestors(i, destination) missing_ancestors = [] parent_dir = File.dirname(destination) - while !File.exists?(parent_dir) && + while !File.exist?(parent_dir) && parent_dir != "." && parent_dir != "/" missing_ancestors.unshift(parent_dir) parent_dir = File.dirname(parent_dir) diff --git a/lib/instance_agent/plugins/codedeploy/onpremise_config.rb b/lib/instance_agent/plugins/codedeploy/onpremise_config.rb index 1976da21..774c62e0 100644 --- a/lib/instance_agent/plugins/codedeploy/onpremise_config.rb +++ b/lib/instance_agent/plugins/codedeploy/onpremise_config.rb @@ -7,7 +7,7 @@ class OnPremisesConfig def self.configure file_path = InstanceAgent::Config.config[:on_premises_config_file] file_config = nil - if File.exists?(file_path) && File.readable?(file_path) + if File.readable?(file_path) begin file_config = YAML.load(File.read(file_path)).symbolize_keys rescue diff --git a/spec/aws/codedeploy/local/cli_validator_spec.rb b/spec/aws/codedeploy/local/cli_validator_spec.rb index f3a54e68..fa47d944 100644 --- a/spec/aws/codedeploy/local/cli_validator_spec.rb +++ b/spec/aws/codedeploy/local/cli_validator_spec.rb @@ -32,7 +32,7 @@ end it 'returns the same arguments' do - allow(File).to receive(:exists?).with(VALID_FILE).and_return(true) + allow(File).to receive(:exist?).with(VALID_FILE).and_return(true) expect(validator.validate(args)).to equal(args) end end @@ -93,10 +93,10 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(false) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec.yaml").and_return(false) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(false) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec.yaml").and_return(false) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "Expecting appspec file at location #{FAKE_DIRECTORY}/appspec.yml or #{FAKE_DIRECTORY}/appspec.yaml but it is not found there. Please either run the CLI from within a directory containing the appspec.yml or appspec.yaml file or specify a bundle location containing an appspec.yml or appspec.yaml file in its root directory") end end @@ -109,9 +109,9 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec-override.yaml").and_return(false) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec-override.yaml").and_return(false) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "Expecting appspec file at location #{FAKE_DIRECTORY}/appspec-override.yaml but it is not found there. Please either run the CLI from within a directory containing the appspec-override.yaml file or specify a bundle location containing an appspec-override.yaml file in its root directory") end end @@ -129,7 +129,7 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_FILE_WHICH_DOES_NOT_EXIST).and_return(false) + allow(File).to receive(:exist?).with(FAKE_FILE_WHICH_DOES_NOT_EXIST).and_return(false) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "location #{FAKE_FILE_WHICH_DOES_NOT_EXIST} is specified as a file or directory which does not exist") end end @@ -147,7 +147,7 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_FILE).and_return(true) + allow(File).to receive(:exist?).with(FAKE_FILE).and_return(true) allow(File).to receive(:file?).with(FAKE_FILE).and_return(true) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "location #{FAKE_FILE} is specified with type directory but it is a file") end @@ -173,7 +173,7 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) expect{validator.validate(argszip)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "location #{FAKE_DIRECTORY} is specified as a compressed local file but it is a directory") expect{validator.validate(argstgz)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "location #{FAKE_DIRECTORY} is specified as a compressed local file but it is a directory") @@ -189,9 +189,9 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "The only events that can be specified before DownloadBundle are BeforeBlockTraffic,AfterBlockTraffic,ApplicationStop. Please fix the order of your specified events: #{args['--events']}") end end @@ -205,9 +205,9 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "The only events that can be specified before DownloadBundle are BeforeBlockTraffic,AfterBlockTraffic,ApplicationStop. Please fix the order of your specified events: #{args['--events']}") end end @@ -221,9 +221,9 @@ end it 'throws a ValidationError' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) expect{validator.validate(args)}.to raise_error(AWS::CodeDeploy::Local::CLIValidator::ValidationError, "The only events that can be specified before Install are BeforeBlockTraffic,AfterBlockTraffic,ApplicationStop,DownloadBundle,BeforeInstall. Please fix the order of your specified events: #{args['--events']}") end end @@ -237,9 +237,9 @@ end it 'returns the same arguments' do - allow(File).to receive(:exists?).with(FAKE_DIRECTORY).and_return(true) + allow(File).to receive(:exist?).with(FAKE_DIRECTORY).and_return(true) allow(File).to receive(:directory?).with(FAKE_DIRECTORY).and_return(true) - expect(File).to receive(:exists?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) + expect(File).to receive(:exist?).with("#{FAKE_DIRECTORY}/appspec.yml").and_return(true) expect(validator.validate(args)).to equal(args) end end diff --git a/spec/aws/codedeploy/local/deployer_spec.rb b/spec/aws/codedeploy/local/deployer_spec.rb index bdf11077..c22eff03 100644 --- a/spec/aws/codedeploy/local/deployer_spec.rb +++ b/spec/aws/codedeploy/local/deployer_spec.rb @@ -45,11 +45,12 @@ allow(Dir).to receive(:pwd).and_return test_working_directory ProcessManager::Config.config[:root_dir] = test_working_directory allow(AWS::CodeDeploy::Local::Deployer).to receive(:random_deployment_id).and_return(TEST_DEPLOYMENT_ID) - allow(File).to receive(:exists?).with(@config_file_location).and_return(true) + allow(File).to receive(:exist?).with(@config_file_location).and_return(true) allow(File).to receive(:readable?).with(@config_file_location).and_return(true) - allow(File).to receive(:exists?).with(AWS::CodeDeploy::Local::Deployer::CONF_DEFAULT_LOCATION).and_return(false) + allow(File).to receive(:exist?).with(AWS::CodeDeploy::Local::Deployer::CONF_DEFAULT_LOCATION).and_return(false) allow(File).to receive(:readable?).with(AWS::CodeDeploy::Local::Deployer::CONF_DEFAULT_LOCATION).and_return(false) allow(File).to receive(:readable?).with(InstanceAgent::Config.config[:on_premises_config_file]).and_return(false) + allow(File).to receive(:exist?) end def create_config_file(working_directory, log_dir = nil) @@ -114,7 +115,7 @@ def create_config_file(working_directory, log_dir = nil) config_file_location = create_config_file(new_test_working_directory, not_yet_existing_directory) expect(FileUtils).to receive(:mkdir_p).with(not_yet_existing_directory).and_call_original allow(File).to receive(:readable?).with(config_file_location).and_return(true) - allow(File).to receive(:exists?).with(config_file_location).and_return(true) + allow(File).to receive(:exist?).with(config_file_location).and_return(true) AWS::CodeDeploy::Local::Deployer.new(config_file_location) end end @@ -133,7 +134,7 @@ def create_config_file(working_directory, log_dir = nil) end it 'deploys the local file and calls the executor to execute all commands' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -151,7 +152,7 @@ def create_config_file(working_directory, log_dir = nil) context 'when script fails with script error' do it 'prints the correct error message to the screen and exits' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -192,7 +193,7 @@ def create_config_file(working_directory, log_dir = nil) end it 'deploys the local file and calls the executor to execute all specified commands after DownloadBundle and Install commands' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) all_possible_lifecycle_events = AWS::CodeDeploy::Local::Deployer::DEFAULT_ORDERED_LIFECYCLE_EVENTS.to_set.merge(NON_DEFAULT_LIFECYCLE_EVENTS).to_a @@ -221,7 +222,7 @@ def create_config_file(working_directory, log_dir = nil) end it 'corrects the order of download bundle followed by install' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) all_possible_lifecycle_events = AWS::CodeDeploy::Local::Deployer::DEFAULT_ORDERED_LIFECYCLE_EVENTS @@ -254,7 +255,7 @@ def create_config_file(working_directory, log_dir = nil) end it 'deploys the local directory and calls the executor to execute all commands' do - allow(File).to receive(:exists?).with(SAMPLE_DIRECTORY_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_DIRECTORY_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -280,7 +281,7 @@ def create_config_file(working_directory, log_dir = nil) end it 'deploys the local directory and calls the executor to execute all commands' do - allow(File).to receive(:exists?).with(SAMPLE_DIRECTORY_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_DIRECTORY_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -457,7 +458,7 @@ def create_config_file(working_directory, log_dir = nil) "--version"=>false} end it 'defaults to LocalFleet' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -486,7 +487,7 @@ def create_config_file(working_directory, log_dir = nil) "--version"=>false} end it 'defaults to the bundle-location' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -516,7 +517,7 @@ def create_config_file(working_directory, log_dir = nil) "--version"=>false} end it 'generates a spec with the provided value' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -546,7 +547,7 @@ def create_config_file(working_directory, log_dir = nil) "--version"=>false} end it 'generates a spec with the provided value' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -576,7 +577,7 @@ def create_config_file(working_directory, log_dir = nil) "--version"=>false} end it 'generates a spec with the provided value' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). @@ -607,7 +608,7 @@ def create_config_file(working_directory, log_dir = nil) "--version"=>false} end it 'generates a spec with the provided value' do - allow(File).to receive(:exists?).with(SAMPLE_FILE_BUNDLE).and_return(true) + allow(File).to receive(:exist?).with(SAMPLE_FILE_BUNDLE).and_return(true) executor = double(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor) expect(InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor).to receive(:new). diff --git a/test/instance_agent/plugins/codedeploy/hook_executor_test.rb b/test/instance_agent/plugins/codedeploy/hook_executor_test.rb index edd9fa37..f710925d 100644 --- a/test/instance_agent/plugins/codedeploy/hook_executor_test.rb +++ b/test/instance_agent/plugins/codedeploy/hook_executor_test.rb @@ -39,8 +39,8 @@ def create_hook_executor(revision_envs = nil) logger = mock logger.stubs(:log) InstanceAgent::DeploymentLog.stubs(:instance).returns(logger) - File.stubs(:exists?).returns(false) - File.stubs(:exists?).with(){|value| value.is_a?(String) && value.end_with?("/app_spec")}.returns(true) + File.stubs(:exist?).returns(false) + File.stubs(:exist?).with(){|value| value.is_a?(String) && value.end_with?("/app_spec")}.returns(true) end context "when creating a hook command" do @@ -90,7 +90,7 @@ def create_hook_executor(revision_envs = nil) end should "fail if app spec not found" do - File.stubs(:exists?).with(){|value| value.is_a?(String) && value.end_with?("/app_spec")}.returns(false) + File.stubs(:exist?).with(){|value| value.is_a?(String) && value.end_with?("/app_spec")}.returns(false) assert_raised_with_message("The CodeDeploy agent did not find an AppSpec file within the unpacked revision directory at revision-relative path \"app_spec\". The revision was unpacked to directory \"deployment/root/dir/deployment-archive\", and the AppSpec file was expected but not found at path \"deployment/root/dir/deployment-archive/app_spec\". Consult the AWS CodeDeploy Appspec documentation for more information at http://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html", RuntimeError)do @hook_executor = create_hook_executor end diff --git a/test/instance_agent/plugins/codedeploy/install_instruction_test.rb b/test/instance_agent/plugins/codedeploy/install_instruction_test.rb index 0a094e8e..4313933f 100644 --- a/test/instance_agent/plugins/codedeploy/install_instruction_test.rb +++ b/test/instance_agent/plugins/codedeploy/install_instruction_test.rb @@ -60,7 +60,7 @@ class InstallInstructionTest < InstanceAgentTestCase @mock_file.stubs(:close) @mock_file.stubs(:exist?).returns(false) File.stubs(:open).returns(@mock_file) - File.stubs(:exists?).returns(false) + File.stubs(:exist?).returns(false) end should "return a collection containing a copy command and a mkdir command" do diff --git a/test/instance_agent/plugins/codedeploy/installer_test.rb b/test/instance_agent/plugins/codedeploy/installer_test.rb index e588c829..a465ab9d 100644 --- a/test/instance_agent/plugins/codedeploy/installer_test.rb +++ b/test/instance_agent/plugins/codedeploy/installer_test.rb @@ -63,8 +63,8 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .returns(@instruction_builder) @instruction_builder.stubs(:cleanup).returns(nil) - File.stubs(:exists?).returns(false) - File.stubs(:exists?).with("deploy-instructions-dir/ig1-cleanup").returns(false) + File.stubs(:exist?).returns(false) + File.stubs(:exist?).with("deploy-instructions-dir/ig1-cleanup").returns(false) @app_spec.stubs(:permissions).returns([]) @app_spec.stubs(:files).returns([]) @@ -75,7 +75,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase context "with an existing cleanup file" do setup do - File.stubs(:exists?).with("deploy-instructions-dir/ig1-cleanup").returns(true) + File.stubs(:exist?).with("deploy-instructions-dir/ig1-cleanup").returns(true) end should "parse the file, execute the commands and remove the file before generating new install instructions" do @@ -133,8 +133,8 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase :destination => "dst2")]) File.stubs(:directory?).returns(false) - File.stubs(:exists?).returns(false) - File.stubs(:exists?).with(any_of("dst1", "dst2")).returns(true) + File.stubs(:exist?).returns(false) + File.stubs(:exist?).with(any_of("dst1", "dst2")).returns(true) @instruction_builder.stubs(:copy) end @@ -150,7 +150,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase end should "raise an error if the file already exists and @file_exists_behavior is set to 'DISALLOW'" do - File.stubs(:exists?).with("dst2/src2").returns(true) + File.stubs(:exist?).with("dst2/src2").returns(true) assert_raised_with_message("The deployment failed because a specified file already exists at this location: dst2/src2") do @installer.install(@deployment_group_id, @app_spec) @@ -163,7 +163,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase @app_spec .stubs(:file_exists_behavior) .returns("DISALLOW") - File.stubs(:exists?).with("dst2/src2").returns(true) + File.stubs(:exist?).with("dst2/src2").returns(true) assert_raised_with_message("The deployment failed because a specified file already exists at this location: dst2/src2") do @installer.install(@deployment_group_id, @app_spec) @@ -175,7 +175,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .stubs(:files) .returns([stub(:source => "src1", :destination => "dst1")]) - File.stubs(:exists?).with("dst1/src1").returns(true) + File.stubs(:exist?).with("dst1/src1").returns(true) @instruction_builder .expects(:copy) .with("deploy-archive-dir/src1", "dst1/src1") @@ -190,7 +190,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .stubs(:files) .returns([stub(:source => "src1", :destination => "dst1")]) - File.stubs(:exists?).with("dst1/src1").returns(true) + File.stubs(:exist?).with("dst1/src1").returns(true) @instruction_builder .expects(:copy) .with("deploy-archive-dir/src1", "dst1/src1") @@ -203,7 +203,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .stubs(:files) .returns([stub(:source => "src1", :destination => "dst1")]) - File.stubs(:exists?).with("dst1/src1").returns(true) + File.stubs(:exist?).with("dst1/src1").returns(true) @instruction_builder.expects(:copy).never @installer.file_exists_behavior = "RETAIN" @installer.install(@deployment_group_id, @app_spec) @@ -216,14 +216,14 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .stubs(:files) .returns([stub(:source => "src1", :destination => "dst1")]) - File.stubs(:exists?).with("dst1/src1").returns(true) + File.stubs(:exist?).with("dst1/src1").returns(true) @instruction_builder.expects(:copy).never assert_equal(@installer.file_exists_behavior, "DISALLOW") @installer.install(@deployment_group_id, @app_spec) end should "raise an error if the file already exists and @file_exists_behavior is set to some invalid value" do - File.stubs(:exists?).with("dst2/src2").returns(true) + File.stubs(:exist?).with("dst2/src2").returns(true) @installer.file_exists_behavior = "SOMETHING_WEIRD" assert_raised_with_message("The deployment failed because an invalid option was specified for fileExistsBehavior: #{@installer.file_exists_behavior}. Valid options include OVERWRITE, RETAIN, and DISALLOW.") do @@ -236,7 +236,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .stubs(:files) .returns([stub(:source => "src1", :destination => "dst1")]) - File.stubs(:exists?).with("dst1").returns(false) + File.stubs(:exist?).with("dst1").returns(false) command_sequence = sequence("command sequence") @instruction_builder @@ -275,7 +275,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .stubs(:files) .returns([stub(:source => "src1", :destination => "dst1/foo/bar")]) - File.stubs(:exists?).with("dst1").returns(true) + File.stubs(:exist?).with("dst1").returns(true) command_sequence = sequence("command sequence") @instruction_builder @@ -326,7 +326,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .returns([stub(:source => "src1", :destination => "/dst1/foo/bar")]) - File.stubs(:exists?).with("/dst1").returns(true) + File.stubs(:exist?).with("/dst1").returns(true) command_sequence = sequence("command sequence") @instruction_builder @@ -369,7 +369,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase Dir.stubs(:entries) .with("deploy-archive-dir/src1") .returns([".", "..", "foo", "bar"]) - File.stubs(:exists?).with("dst1/bar").returns(true) + File.stubs(:exist?).with("dst1/bar").returns(true) @instruction_builder.stubs(:mkdir) @instruction_builder.stubs(:copy) @@ -383,7 +383,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .with("deploy-archive-dir/src1") .returns([".", "..", "foo", "bar"]) File.stubs(:directory?).with("dst1").returns(true) - File.stubs(:exists?).with("dst1/bar").returns(true) + File.stubs(:exist?).with("dst1/bar").returns(true) @instruction_builder .expects(:copy) .with("deploy-archive-dir/src1/foo", "dst1/foo") @@ -401,7 +401,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase .with("deploy-archive-dir/src1") .returns([".", "..", "foo", "bar"]) File.stubs(:directory?).with("dst1").returns(true) - File.stubs(:exists?).with("dst1/bar").returns(true) + File.stubs(:exist?).with("dst1/bar").returns(true) @instruction_builder .expects(:copy) .with("deploy-archive-dir/src1/foo", "dst1/foo") @@ -466,7 +466,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase end should "raise an error if an entry already exists and @file_exists_behavior is set to 'DISALLOW'" do - File.stubs(:exists?).with("dst1/foo/bar").returns(true) + File.stubs(:exist?).with("dst1/foo/bar").returns(true) Dir.stubs(:entries) .with("deploy-archive-dir/src1") .returns([".", "..", "foo"]) @@ -483,7 +483,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase should "generate a copy command if the file already exists and @file_exists_behavior is set to 'OVERWRITE'" do File.stubs(:directory?).with("dst1/foo").returns(true) - File.stubs(:exists?).with("dst1/foo/bar").returns(true) + File.stubs(:exist?).with("dst1/foo/bar").returns(true) Dir.stubs(:entries) .with("deploy-archive-dir/src1") .returns([".", "..", "foo"]) @@ -499,7 +499,7 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase should "neither generate a copy command nor raise an error if the file already exists and @file_exists_behavior is set to 'RETAIN'" do File.stubs(:directory?).with("dst1/foo").returns(true) - File.stubs(:exists?).with("dst1/foo/bar").returns(true) + File.stubs(:exist?).with("dst1/foo/bar").returns(true) Dir.stubs(:entries) .with("deploy-archive-dir/src1") .returns([".", "..", "foo"]) @@ -555,8 +555,8 @@ class CodeDeployPluginInstallerTest < InstanceAgentTestCase Dir.stubs(:entries) .with("deploy-archive-dir/src3/dir1") .returns(["file1", ".", ".."]) - File.stubs(:exists?).returns(false) - File.stubs(:exists?).with(any_of("dst1","dst3")).returns(true) + File.stubs(:exist?).returns(false) + File.stubs(:exist?).with(any_of("dst1","dst3")).returns(true) @instruction_builder.stubs(:copying_file?).returns(false) @instruction_builder.stubs(:copying_file?).with("dst1/src1").returns(true) @instruction_builder.stubs(:making_directory?).returns(false) diff --git a/test/instance_agent/plugins/codedeploy/onpremise_config_test.rb b/test/instance_agent/plugins/codedeploy/onpremise_config_test.rb index df138eb5..53186100 100644 --- a/test/instance_agent/plugins/codedeploy/onpremise_config_test.rb +++ b/test/instance_agent/plugins/codedeploy/onpremise_config_test.rb @@ -4,9 +4,9 @@ class OnPremiseConfigTest < InstanceAgentTestCase linux_path = '/etc/codedeploy-agent/conf/codedeploy.onpremises.yml' - context "Config file doesn't exist" do + context "Config file does not exist or is not readable" do setup do - File.stubs(:exists?).with(linux_path).returns(false) + File.stubs(:readable?).with(linux_path).returns(false) end should "do nothing" do @@ -14,131 +14,115 @@ class OnPremiseConfigTest < InstanceAgentTestCase end end - context "Linux config file exists" do + context "Linux file is readable" do setup do - File.stubs(:exists?).with(linux_path).returns(true) + File.stubs(:readable?).with(linux_path).returns(true) end - context "Linux file is not readable" do + context "Linux file is valid" do + + linux_file = <<-END + region: us-east-test + aws_access_key_id: linuxkey + aws_secret_access_key: linuxsecretkey + iam_user_arn: test:arn + END + setup do - File.stubs(:readable?).with(linux_path).returns(false) + File.stubs(:read).with(linux_path).returns(linux_file) end - should "do nothing" do + should "set the ENV variables correctly" do OnPremisesConfig.configure + assert_equal 'us-east-test', ENV['AWS_REGION'] + assert_equal 'linuxkey', ENV['AWS_ACCESS_KEY'] + assert_equal 'linuxsecretkey', ENV['AWS_SECRET_KEY'] + assert_equal 'test:arn', ENV['AWS_HOST_IDENTIFIER'] end end - - context "Linux file is readable" do + + context "config file with invalid yaml" do + linux_file = <<-END + invalid yaml content + END + setup do - File.stubs(:readable?).with(linux_path).returns(true) + File.stubs(:read).with(linux_path).returns(linux_file) end - - context "Linux file is valid" do - - linux_file = <<-END - region: us-east-test - aws_access_key_id: linuxkey - aws_secret_access_key: linuxsecretkey - iam_user_arn: test:arn - END - - setup do - File.stubs(:read).with(linux_path).returns(linux_file) - end - - should "set the ENV variables correctly" do + + should "raise an exception" do + assert_raise do OnPremisesConfig.configure - assert_equal 'us-east-test', ENV['AWS_REGION'] - assert_equal 'linuxkey', ENV['AWS_ACCESS_KEY'] - assert_equal 'linuxsecretkey', ENV['AWS_SECRET_KEY'] - assert_equal 'test:arn', ENV['AWS_HOST_IDENTIFIER'] - end - end - - context "config file with invalid yaml" do - linux_file = <<-END - invalid yaml content - END - - setup do - File.stubs(:read).with(linux_path).returns(linux_file) - end - - should "raise an exception" do - assert_raise do - OnPremisesConfig.configure - end end end - - context "config file with session configuration" do - credentials_path = "/etc/codedeploy-agent/conf/.aws_credentials" - linux_file = <<-END - region: us-east-test - iam_session_arn: test:arn - aws_credentials_file: #{credentials_path} - END - access_key_id = "fake-access-key-id-#{rand 1000}" - credentials_file = <<-END + end + + context "config file with session configuration" do + credentials_path = "/etc/codedeploy-agent/conf/.aws_credentials" + linux_file = <<-END + region: us-east-test + iam_session_arn: test:arn + aws_credentials_file: #{credentials_path} + END + access_key_id = "fake-access-key-id-#{rand 1000}" + credentials_file = <<-END [default] aws_access_key_id = #{access_key_id} aws_secret_access_key = fake-secret-access-key aws_session_token = fake-session-token END - - setup do - File.stubs(:read).with(linux_path).returns(linux_file) - File.stubs(:read).with(credentials_path).returns(credentials_file) - File.stubs(:exist?).with(credentials_path).returns(true) - File.stubs(:readable?).with(credentials_path).returns(true) - end - - should "set the ENV variables correctly" do + + setup do + File.stubs(:read).with(linux_path).returns(linux_file) + File.stubs(:read).with(credentials_path).returns(credentials_file) + File.stubs(:exist?).with(credentials_path).returns(true) + File.stubs(:readable?).with(credentials_path).returns(true) + end + + should "set the ENV variables correctly" do + OnPremisesConfig.configure + assert_equal 'us-east-test', ENV['AWS_REGION'] + assert_equal 'test:arn', ENV['AWS_HOST_IDENTIFIER'] + assert_equal '/etc/codedeploy-agent/conf/.aws_credentials', ENV['AWS_CREDENTIALS_FILE'] + assert_equal access_key_id, Aws.config[:credentials].credentials.access_key_id + end + end + + context "config file with both session and user arns" do + linux_file = <<-END + region: us-east-test + iam_session_arn: test:arn + aws_credentials_file: /etc/codedeploy-agent/conf/.aws_credentials + aws_access_key_id: linuxkey + aws_secret_access_key: linuxsecretkey + iam_user_arn: test:arn + END + + setup do + File.stubs(:read).with(linux_path).returns(linux_file) + end + + should "raise an exception" do + assert_raise do OnPremisesConfig.configure - assert_equal 'us-east-test', ENV['AWS_REGION'] - assert_equal 'test:arn', ENV['AWS_HOST_IDENTIFIER'] - assert_equal '/etc/codedeploy-agent/conf/.aws_credentials', ENV['AWS_CREDENTIALS_FILE'] - assert_equal access_key_id, Aws.config[:credentials].credentials.access_key_id end end - - context "config file with both session and user arns" do - linux_file = <<-END - region: us-east-test - iam_session_arn: test:arn - aws_credentials_file: /etc/codedeploy-agent/conf/.aws_credentials - aws_access_key_id: linuxkey - aws_secret_access_key: linuxsecretkey - iam_user_arn: test:arn - END - - setup do - File.stubs(:read).with(linux_path).returns(linux_file) - end - - should "raise an exception" do - assert_raise do - OnPremisesConfig.configure - end - end + end + + context "config file missing region" do + linux_file = <<-END + aws_access_key_id: linuxkey + aws_secret_access_key: linuxsecretkey + iam_user_arn: test:arn + END + + setup do + File.stubs(:read).with(linux_path).returns(linux_file) end - - context "config file missing region" do - linux_file = <<-END - aws_access_key_id: linuxkey - aws_secret_access_key: linuxsecretkey - iam_user_arn: test:arn - END - - setup do - File.stubs(:read).with(linux_path).returns(linux_file) - end - - should "raise an exception" do - assert_raise do - OnPremisesConfig.configure - end + + should "raise an exception" do + assert_raise do + OnPremisesConfig.configure end end end diff --git a/vendor/gems/process_manager-0.0.13/lib/process_manager/config.rb b/vendor/gems/process_manager-0.0.13/lib/process_manager/config.rb index 4a717e20..d8e6fab0 100644 --- a/vendor/gems/process_manager-0.0.13/lib/process_manager/config.rb +++ b/vendor/gems/process_manager-0.0.13/lib/process_manager/config.rb @@ -17,7 +17,7 @@ def self.validate_config end def self.load_config - if File.exists?(config[:config_file]) && File.readable?(config[:config_file]) + if File.readable?(config[:config_file]) file_config = YAML.load(File.read(config[:config_file])).symbolize_keys config.update(file_config) config_loaded_callbacks.each{|c| c.call} @@ -76,8 +76,8 @@ def validate end def validate_log_and_pid_dir(errors) - FileUtils.mkdir_p(ProcessManager::Config.config[:log_dir]) unless File.exists?(ProcessManager::Config.config[:log_dir]) - FileUtils.mkdir_p(ProcessManager::Config.config[:pid_dir]) unless File.exists?(ProcessManager::Config.config[:pid_dir]) + FileUtils.mkdir_p(ProcessManager::Config.config[:log_dir]) unless File.directory?(ProcessManager::Config.config[:log_dir]) + FileUtils.mkdir_p(ProcessManager::Config.config[:pid_dir]) unless File.directory?(ProcessManager::Config.config[:pid_dir]) errors << "Please make sure the path of the log directory exists and is writable: #{config[:log_dir].inspect}" unless file_writable?(config[:log_dir]) && File.directory?(config[:log_dir]) errors << "Please make sure the path of the PID directory exists and is writable: #{config[:pid_dir].inspect}" unless file_writable?(config[:pid_dir]) && File.directory?(config[:pid_dir]) errors @@ -101,7 +101,7 @@ def normalize_log_and_pid_dir def file_writable?(path) return false unless path.present? - if File.exists?(path) + if File.file?(path) || File.directory?(path) File.writable?(path) else File.writable?(File.dirname(path)) diff --git a/vendor/gems/process_manager-0.0.13/lib/process_manager/master.rb b/vendor/gems/process_manager-0.0.13/lib/process_manager/master.rb index 489cf2c1..5b7411cd 100644 --- a/vendor/gems/process_manager-0.0.13/lib/process_manager/master.rb +++ b/vendor/gems/process_manager-0.0.13/lib/process_manager/master.rb @@ -177,7 +177,7 @@ def handle_pid_file if lock_acquired == false ProcessManager::Log.info("Could not acquire lock on #{pid_lock_file} - aborting start!") self.class.abort - elsif File.exists?(pid_file) + elsif File.file?(pid_file) pid = self.class.find_pid if ProcessManager.process_running?(pid) and process_matcher(pid) puts "Pidfile #{pid_file} exists and process #{pid} is running - aborting start!" diff --git a/vendor/gems/simple_pid-0.2.1/README.rdoc b/vendor/gems/simple_pid-0.2.1/README.rdoc new file mode 100644 index 00000000..a70f6d03 --- /dev/null +++ b/vendor/gems/simple_pid-0.2.1/README.rdoc @@ -0,0 +1,61 @@ += simple_pid + +This is a simple library for managing pid files. It was extracted from Kenneth +Kalmer's excellent daemon-kit project (http://github.com/kennethkalmer/daemon-kit). +The daemon-kit framework is amazing for bootstrapping your daemons, but if +you need something more lightweight (e.g., a single file daemon), then you're +out of luck (for now). In the mean time, there weren't any obvious, simple +pid file management libraries that you could trust. This one works well and +has facilities to ensure the process the pid file is pointing to is still running, +so you can handle stale pid files easily. + += Usage + +Some samples of the most common uses: + + require 'rubygems' + require 'simple_pid' + + pid = SimplePid.new("/path/to/your.pid") + + if pid.exists? + unless pid.running? + pid.cleanup + pid.write! + end + else + pid.write! + end + +Most of the above is fairly self-explanatory. You can accomplish all of the +above by calling: + + SimplePid.drop("/path/to/your.pid") + +If the path specified for the pid is unwritable for any reason, it falls back +to using /tmp to store the + +You can cleanup quickly with: + + SimplePid.cleanup("/path/to/your.pid") + +The above cleanup class method returns true if the process wasn't running +and the cleanup was actually run. It returns false if the process was still +running and no cleanup occurred. If you need to force cleanup regardless of +whether the process is running or not, you can do so with: + + SimplePid.cleanup!("/path/to/your.pid") + +You can check to see if the process is running and exit with an error message +if it is like this: + + pid.ensure_stopped! + +The current contents of the pid file can always be accessed like this: + + pid.pid + +== Copyright + +Copyright (c) 2010 Joel Watson. Portions copyright Kenneth +Kalmer. See LICENSE for details. \ No newline at end of file diff --git a/vendor/gems/simple_pid-0.2.1/lib/core_ext.rb b/vendor/gems/simple_pid-0.2.1/lib/core_ext.rb new file mode 100644 index 00000000..204fdfe5 --- /dev/null +++ b/vendor/gems/simple_pid-0.2.1/lib/core_ext.rb @@ -0,0 +1 @@ +require File.dirname(__FILE__) + '/core_ext/string' diff --git a/vendor/gems/simple_pid-0.2.1/lib/core_ext/string.rb b/vendor/gems/simple_pid-0.2.1/lib/core_ext/string.rb new file mode 100644 index 00000000..5a091431 --- /dev/null +++ b/vendor/gems/simple_pid-0.2.1/lib/core_ext/string.rb @@ -0,0 +1,43 @@ +# Extracted from Kenneth Kalmer's excellent daemon-kit project +# on GitHub: http://github.com/kennethkalmer/daemon-kit +# (The MIT License) +# +# Copyright (c) 2009 Kenneth Kalmer (Internet Exchange CC, Clear Planet Information Solutions Pty Ltd) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the 'Software'), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, publish, distribute, +# sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +# THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +require 'pathname' + +class String + + # Assuming the string is a file or path name, convert it into an + # absolute path. + def to_absolute_path + # Pathname is incompatible with Windows, but Windows doesn't have + # real symlinks so File.expand_path is safe. + if RUBY_PLATFORM =~ /(:?mswin|mingw)/ + File.expand_path( self ) + + # Otherwise use Pathname#realpath which respects symlinks. + else + begin + File.expand_path( Pathname.new( self ).realpath.to_s ) + rescue Errno::ENOENT + File.expand_path( Pathname.new( self ).cleanpath.to_s ) + end + end + end +end diff --git a/vendor/gems/simple_pid-0.2.1/lib/simple_pid.rb b/vendor/gems/simple_pid-0.2.1/lib/simple_pid.rb new file mode 100644 index 00000000..efc6520d --- /dev/null +++ b/vendor/gems/simple_pid-0.2.1/lib/simple_pid.rb @@ -0,0 +1,92 @@ +# Much of this was extracted from Kenneth Kalmer's excellent +# daemon-kit project on GitHub: http://github.com/kennethkalmer/daemon-kit + +require File.dirname(__FILE__) + '/core_ext' + +class SimplePid + def initialize(path) + @path = path.to_absolute_path + end + + def self.drop(path) + p = self.new(path) + if p.exists? + unless p.running? + p.cleanup + p.write! + end + else + p.write! + end + end + + def self.cleanup(path) + p = self.new(path) + if p.running? + return false + else + p.cleanup + return true + end + end + + def self.cleanup!(path) + p = self.new(path) + p.cleanup if p.exists? + end + + def exists? + File.file?(@path) + end + + # Returns true if the process is running + def running? + return false unless self.exists? + + # Check if process is in existence + # The simplest way to do this is to send signal '0' + # (which is a single system call) that doesn't actually + # send a signal + begin + Process.kill(0, self.pid) + return true + rescue Errno::ESRCH + return false + rescue ::Exception # for example on EPERM (process exists but does not belong to us) + return true + #rescue Errno::EPERM + # return false + end + end + + # Return the pid contained in the pidfile, or nil + def pid + return nil unless self.exists? + + File.open( @path ) { |f| return f.gets.to_i } + end + + def ensure_stopped! + if self.running? + puts "Process already running with id #{self.pid}" + exit 1 + end + end + + def cleanup + begin + File.delete(@path) + rescue Errno::ENOENT + File.delete("/tmp/#{Pathname.new(@path).basename}") + end + end + alias zap cleanup + + def write! + begin + File.open(@path, "w") { |f| f.puts Process.pid } + rescue Errno::ENOENT, Errno::EACCES + File.open("/tmp/#{Pathname.new(@path).basename}", "w") { |f| f.puts Process.pid } + end + end +end \ No newline at end of file diff --git a/vendor/specifications/process_manager-0.0.13.gemspec b/vendor/specifications/process_manager-0.0.13.gemspec index d8d78629..cd81b911 100644 --- a/vendor/specifications/process_manager-0.0.13.gemspec +++ b/vendor/specifications/process_manager-0.0.13.gemspec @@ -21,22 +21,16 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 2.2.1"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 2.2.1"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 2.2.1"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end diff --git a/vendor/specifications/simple_pid.gemspec b/vendor/specifications/simple_pid.gemspec new file mode 100644 index 00000000..ceddd970 --- /dev/null +++ b/vendor/specifications/simple_pid.gemspec @@ -0,0 +1,53 @@ +# Generated by jeweler +# DO NOT EDIT THIS FILE DIRECTLY +# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{simple_pid} + s.version = "0.2.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["watsonian"] + s.date = %q{2010-06-01} + s.description = %q{A simple, but complete library for managing pidfiles.} + s.email = %q{watsonian@gmail.com} + s.extra_rdoc_files = [ + "LICENSE", + "README.rdoc" + ] + s.files = [ + ".document", + ".gitignore", + "LICENSE", + "README.rdoc", + "Rakefile", + "VERSION", + "lib/core_ext.rb", + "lib/core_ext/string.rb", + "lib/simple_pid.rb", + "simple_pid.gemspec", + "test/helper.rb", + "test/test_simple_pid.rb" + ] + s.homepage = %q{http://github.com/watsonian/simple_pid} + s.rdoc_options = ["--charset=UTF-8"] + s.require_paths = ["lib"] + s.rubygems_version = %q{1.3.7} + s.summary = %q{A simple, but complete library for managing pidfiles.} + s.test_files = [ + "test/helper.rb", + "test/test_simple_pid.rb" + ] + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + else + end + else + end +end +