Module: KamalBackup::CLI::Helpers

Included in:
KamalBackup::CLI, CommandBase
Defined in:
lib/kamal_backup/cli.rb

Instance Method Summary collapse

Instance Method Details

#accessory_nameObject



61
62
63
# File 'lib/kamal_backup/cli.rb', line 61

def accessory_name
  @accessory_name ||= bridge.accessory_name(preferred: local_preferences.accessory_name)
end

#accessory_reboot_commandObject



90
91
92
93
94
95
# File 'lib/kamal_backup/cli.rb', line 90

def accessory_reboot_command
  argv = ["bin/kamal", "accessory", "reboot", accessory_name]
  argv.concat(["-c", options[:config_file]]) if options[:config_file]
  argv.concat(["-d", options[:destination]]) if options[:destination]
  Shellwords.join(argv)
end

#bridgeObject



41
42
43
44
45
46
47
# File 'lib/kamal_backup/cli.rb', line 41

def bridge
  @bridge ||= KamalBridge.new(
    redactor: redactor,
    config_file: options[:config_file],
    destination: options[:destination]
  )
end

#command_envObject



14
15
16
# File 'lib/kamal_backup/cli.rb', line 14

def command_env
  CLI.command_env || ENV
end

#confirm!(message) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
# File 'lib/kamal_backup/cli.rb', line 106

def confirm!(message)
  return if options[:yes]

  unless $stdin.tty?
    raise ConfigurationError, "confirmation required; rerun with --yes"
  end

  unless yes?("#{message} [y/N]")
    raise ConfigurationError, "aborted"
  end
end

#default_deploy_config?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/kamal_backup/cli.rb', line 53

def default_deploy_config?
  File.file?(File.expand_path(KamalBridge::DEFAULT_CONFIG_FILE))
end

#deploy_snippetObject



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/kamal_backup/cli.rb', line 158

def deploy_snippet
  <<~YAML
    accessories:
      backup:
        image: ghcr.io/crmne/kamal-backup:#{VERSION}
        host: your-server.example.com
        env:
          clear:
            APP_NAME: your-app
            DATABASE_ADAPTER: postgres
            DATABASE_URL: postgres://your-app@your-db:5432/your_app_production
            BACKUP_PATHS: /data/storage
            RESTIC_REPOSITORY: s3:https://s3.example.com/your-app-backups
            RESTIC_INIT_IF_MISSING: "true"
            BACKUP_SCHEDULE_SECONDS: "86400"
          secret:
            - PGPASSWORD
            - RESTIC_PASSWORD
            - AWS_ACCESS_KEY_ID
            - AWS_SECRET_ACCESS_KEY
        volumes:
          - "your_app_storage:/data/storage:ro"
  YAML
end

#deployment_mode?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/kamal_backup/cli.rb', line 49

def deployment_mode?
  !options[:destination].to_s.strip.empty? || !options[:config_file].to_s.strip.empty?
end

#direct_appObject



22
23
24
# File 'lib/kamal_backup/cli.rb', line 22

def direct_app
  @direct_app ||= App.new(config: Config.new(env: command_env), redactor: redactor)
end

#ensure_remote_version_match!Object

Raises:



80
81
82
83
84
85
86
87
88
# File 'lib/kamal_backup/cli.rb', line 80

def ensure_remote_version_match!
  return if remote_version == VERSION

  raise ConfigurationError, <<~MESSAGE.strip
    local gem version #{VERSION} does not match remote accessory version #{remote_version}.
    Reboot the backup accessory to pick up the latest image:
    #{accessory_reboot_command}
  MESSAGE
end

#exec_remote(argv, require_version_match: true) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# File 'lib/kamal_backup/cli.rb', line 69

def exec_remote(argv, require_version_match: true)
  ensure_remote_version_match! if require_version_match

  result = bridge.execute_on_accessory(
    accessory_name: accessory_name,
    command: Shellwords.join(argv)
  )
  print(result.stdout)
  result
end

#init_config_rootObject



131
132
133
134
# File 'lib/kamal_backup/cli.rb', line 131

def init_config_root
  config_file = options[:config_file] || KamalBridge::DEFAULT_CONFIG_FILE
  File.dirname(File.expand_path(config_file))
end

#local_appObject



26
27
28
# File 'lib/kamal_backup/cli.rb', line 26

def local_app
  @local_app ||= App.new(config: local_command_config, redactor: redactor)
end

#local_command_configObject



34
35
36
37
38
39
# File 'lib/kamal_backup/cli.rb', line 34

def local_command_config
  @local_command_config ||= begin
    defaults = deployment_mode? ? bridge.local_restore_defaults(accessory_name: accessory_name) : {}
    Config.new(env: command_env, defaults: defaults)
  end
end

#local_preferencesObject



30
31
32
# File 'lib/kamal_backup/cli.rb', line 30

def local_preferences
  @local_preferences ||= Config.new(env: command_env)
end


97
98
99
100
101
102
103
104
# File 'lib/kamal_backup/cli.rb', line 97

def print_remote_version_status
  status = remote_version == VERSION ? "in sync" : "out of sync"

  puts("local: #{VERSION}")
  puts("remote: #{remote_version}")
  puts("status: #{status}")
  puts("fix: #{accessory_reboot_command}") if status == "out of sync"
end

#prompt_required(label) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/kamal_backup/cli.rb', line 118

def prompt_required(label)
  unless $stdin.tty?
    raise ConfigurationError, "#{label.downcase} is required; pass it on the command line"
  end

  value = ask("#{label}:").to_s.strip
  if value.empty?
    raise ConfigurationError, "#{label.downcase} is required"
  else
    value
  end
end

#redactorObject



18
19
20
# File 'lib/kamal_backup/cli.rb', line 18

def redactor
  @redactor ||= Redactor.new(env: command_env)
end

#remote_versionObject



65
66
67
# File 'lib/kamal_backup/cli.rb', line 65

def remote_version
  @remote_version ||= bridge.remote_version(accessory_name: accessory_name)
end

#shared_config_pathObject



136
137
138
# File 'lib/kamal_backup/cli.rb', line 136

def shared_config_path
  File.join(init_config_root, "kamal-backup.yml")
end

#shared_config_templateObject



150
151
152
153
154
155
156
# File 'lib/kamal_backup/cli.rb', line 150

def shared_config_template
  <<~YAML
    # Shared defaults for kamal-backup in this app.
    # Set this when your accessory is not named "backup".
    accessory: backup
  YAML
end

#version_remote_mode?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/kamal_backup/cli.rb', line 57

def version_remote_mode?
  deployment_mode? || default_deploy_config?
end

#write_init_file(path, contents) ⇒ Object



140
141
142
143
144
145
146
147
148
# File 'lib/kamal_backup/cli.rb', line 140

def write_init_file(path, contents)
  if File.exist?(path)
    say "Exists: #{path}", :yellow
  else
    FileUtils.mkdir_p(File.dirname(path))
    File.write(path, contents)
    say "Created: #{path}", :green
  end
end