class SwarmClusterCliOpe::Kubernetes::SyncConfigs::Rsync

Public Instance Methods

local_folder() click to toggle source

@return [String]

# File lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb, line 9
def local_folder
  @configs[:configs][:local]
end
pull() click to toggle source

@return [SwarmClusterCliOpe::ShellCommandResponse]

# File lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb, line 24
def pull
  execute(direction: :down)
end
push() click to toggle source

@return [SwarmClusterCliOpe::ShellCommandResponse]

# File lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb, line 19
def push
  execute(direction: :up)
end
remote_folder() click to toggle source

@return [String]

# File lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb, line 14
def remote_folder
  @configs[:configs][:remote]
end

Private Instance Methods

configs_path(file) click to toggle source

Estrapola la path al file di configurazione @param [String] file @return [String]

# File lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb, line 144
def configs_path(file)
  File.expand_path("../../rsync_cfgs/#{file}", __FILE__)
end
execute(direction: :down) click to toggle source
# File lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb, line 30
def execute(direction: :down)

  if container.nil?
    say "Container non trovato"
    exit
  end

  if yes? "Attenzione, i dati locali o remoti verranno sovrascritti/cancellati?[y,yes]"

    podname = container.name

    if namespace.nil?
      say "Mancata configurazione del namespace tramite argomento o .swarm_cluster_project"
      exit
    end

    # controllo presenza comandi necessari
    command_installed = false
    cmd_ricerca = container.exec(['bash -c "command -v rsync && command -v killall"'])
    unless cmd_ricerca.failed?
      num_commands = cmd_ricerca.raw_result[:stdout].split("\n").count rescue 0
      if num_commands == 2
        command_installed = true
      end
    end

    unless command_installed
      # tentiamo di installarlo
      cmd = container.exec(['bash -c "apt update && apt install -yq rsync psmisc"'])
      if cmd.failed?
        puts "Problemi nell'installazione di rsync nel pod"
      else
        command_installed = true
      end
    end

    if command_installed
      cmd = container.cp_in(configs_path("rsyncd.conf"), "/tmp/.")
      copy_1 = cmd.execute.failed?
      cmd = container.cp_in(configs_path("rsyncd.secrets"), "/tmp/.")
      copy_2 = cmd.execute.failed?
      cmd = container.exec(['bash -c "chmod 600 /tmp/rsyncd.secrets  && chown root /tmp/*"'])
      chmod = cmd.failed?
      if copy_1 or copy_2 or chmod
        puts "problema nella copia dei file di configurazione nel pod"
      else

        begin
          cmd = container.exec('bash -c "rsync --daemon --config=/tmp/rsyncd.conf  --verbose --log-file=/tmp/rsync.log"')
          if cmd.failed?
            say "Rsync non Inizializzato"
          else
            begin
              local_port = rand(30000..40000)

              p = IO.popen(container.base_cmd("port-forward #{podname} #{local_port}:873").string_command)
              pid = p.pid
              say "PID in execuzione port forward:#{pid}"

              begin

                sleep 1

                # forzo i permessi sul file della password
                cmd = ShellCommandExecution.new(["chmod 600 #{ configs_path("password")}"])
                cmd.execute

                # lanciamo il comando quindi per far rsync
                rsync_command = [
                  "rsync -az --no-o --no-g",
                  "--delete",
                  "--password-file=#{ configs_path("password")}"
                ]

                if direction == :up
                  rsync_command << "#{local_folder}/."
                  rsync_command << "rsync://root@0.0.0.0:#{local_port}/archives#{remote_folder}"
                else
                  rsync_command << "rsync://root@0.0.0.0:#{local_port}/archives#{remote_folder}/."
                  rsync_command << local_folder
                end
                say "Eseguo rsync #{rsync_command.join(" ")}"

                cmd = ShellCommandExecution.new(rsync_command)
                cmd.execute

              ensure
                sleep 1
                say "Stoppo porta forwarded"
                Process.kill("INT", pid)
              end
            ensure
              say "Tolgo il servizio di rsyn"
              container.exec('bash -c "killall rsync"')
            end
          end

        ensure
          say "Eseguo pulizia configurazioni caricate"
          container.exec('bash -c "rm -fr /tmp/rsyncd*"')
        end

      end

    end

  end

end