aboutsummaryrefslogtreecommitdiff
path: root/vendor/supply_drop/lib/supply_drop/plugin.rb
blob: 1784d59db3c9a4d8059302c3b5e6fe9acd4e9b32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
module SupplyDrop
  module Plugin

    def rsync
      SupplyDrop::Util.thread_pool_size = puppet_parallel_rsync_pool_size
      servers = SupplyDrop::Util.optionally_async(find_servers_for_task(current_task), puppet_parallel_rsync)
      failed_servers = servers.map do |server|
        rsync_cmd = SupplyDrop::Rsync.command(
          puppet_source,
          SupplyDrop::Rsync.remote_address(server.user || fetch(:user, ENV['USER']), server.host, puppet_destination),
          :delete => true,
          :excludes => puppet_excludes,
          :ssh => ssh_options.merge(server.options[:ssh_options]||{})
        )
        logger.debug rsync_cmd
        server.host unless system rsync_cmd
      end.compact

      raise "rsync failed on #{failed_servers.join(',')}" if failed_servers.any?
    end

    def prepare
      #run "mkdir -p #{puppet_destination}"
      #run "#{sudo} chown -R $USER: #{puppet_destination}"
    end

    def noop
      puppet(:noop)
    end

    def apply
      puppet(:apply)
    end

    def lock
      if should_lock?
        cmd = <<-GETLOCK
if [ ! -f #{puppet_lock_file} ]; then
    touch #{puppet_lock_file};
else
    stat -c "#{red_text("Puppet in progress, #{puppet_lock_file} owned by %U since %x")}" #{puppet_lock_file} >&2;
    exit 1;
fi
        GETLOCK
        run cmd.gsub(/\s+/, ' ')
      end
    end

    def unlock
      run "rm -f #{puppet_lock_file}; true" if should_lock?
    end

    private

    def should_lock?
      puppet_lock_file && !ENV['NO_PUPPET_LOCK']
    end

    def puppet(command = :noop)
      #puppet_cmd = "cd #{puppet_destination} && #{sudo_cmd} #{puppet_command} --modulepath=#{puppet_lib} #{puppet_parameters}"
      puppet_cmd = "cd #{puppet_destination} && #{sudo_cmd} #{puppet_command} #{puppet_parameters}"
      flag = command == :noop ? '--noop' : ''

      writer = if puppet_stream_output
                 SupplyDrop::Writer::Streaming.new(logger)
               else
                 SupplyDrop::Writer::Batched.new(logger)
               end

      writer = SupplyDrop::Writer::File.new(writer, puppet_write_to_file) unless puppet_write_to_file.nil?

      begin
        run "#{puppet_cmd} #{flag}" do |channel, stream, data|
          writer.collect_output(channel[:host], data)
        end
        logger.debug "Puppet #{command} complete."
      ensure
        writer.all_output_collected
      end
    end

    def red_text(text)
      "\033[0;31m#{text}\033[0m"
    end

    def sudo_cmd
      if fetch(:use_sudo, true)
        sudo(:as => puppet_runner)
      else
        logger.info "NOTICE: puppet_runner configuration invalid when use_sudo is false, ignoring..." unless puppet_runner.nil?
        ''
      end
    end
  end
end