Module: VagrantDockerCertificatesManager::Registry

Defined in:
lib/vagrant-docker-certificates-manager/util/registry.rb

Class Method Summary collapse

Class Method Details

.adopt(fp, owner) ⇒ Boolean

Adds an owner to an already tracked certificate.

rubocop:disable Naming/PredicateMethod -- boolean return kept for symmetry with #release

Parameters:

  • fp (String)

    Certificate fingerprint.

  • owner (String, #to_s)

    Vagrant machine id adopting the certificate.

Returns:

  • (Boolean)

    Whether the certificate was already tracked.



61
62
63
64
65
66
67
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 61

def adopt(fp, owner)
  data = load
  return false unless data[fp]
  data[fp]["owners"] = Array(data[fp]["owners"]) | [owner.to_s]
  save(data)
  true
end

.allObject



96
97
98
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 96

def all
  load
end

.db_pathObject



10
11
12
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 10

def db_path
  File.join(Dir.home, ".vagrant.d", "vdcm", "certs.json")
end

.ensure_dir!Object



14
15
16
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 14

def ensure_dir!
  FileUtils.mkdir_p(File.dirname(db_path))
end

.find_by_path(path) ⇒ Object

rubocop:enable Naming/PredicateMethod



91
92
93
94
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 91

def find_by_path(path)
  data = load
  data.find { |_fp, v| File.expand_path(v["path"]) == File.expand_path(path) }
end

.loadHash

Loads tracked certificates from the best-effort local registry.

A corrupt or missing registry must not block Vagrant actions, because the OS trust store remains the source of truth.

Returns:

  • (Hash)

    Registry data keyed by certificate fingerprint.



24
25
26
27
28
29
30
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 24

def load
  ensure_dir!
  return {} unless File.exist?(db_path)
  JSON.parse(File.read(db_path))
rescue StandardError
  {}
end

.others_for_os?(fp, os) ⇒ Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 100

def others_for_os?(fp, os)
  load.any? { |k, v| k != fp && v["os"].to_s == os.to_s }
end

.release(fp, owner) ⇒ Boolean

Releases one owner from a tracked certificate.

Keep the certificate installed while at least one Vagrant machine still owns it.

rubocop:disable Naming/PredicateMethod -- boolean return kept for symmetry with #adopt

Parameters:

  • fp (String)

    Certificate fingerprint.

  • owner (String, #to_s)

    Vagrant machine id releasing the certificate.

Returns:

  • (Boolean)

    Whether other owners remain after the release.



79
80
81
82
83
84
85
86
87
88
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 79

def release(fp, owner)
  data = load
  rec  = data[fp]
  return false unless rec
  owners = Array(rec["owners"])
  owners.delete(owner.to_s)
  rec["owners"] = owners
  save(data)
  !owners.empty?
end

.save(data) ⇒ Object



32
33
34
35
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 32

def save(data)
  ensure_dir!
  File.write(db_path, JSON.pretty_generate(data))
end

.track(fp, attrs) ⇒ void

This method returns an undefined value.

Tracks a certificate fingerprint and its ownership metadata.

Parameters:

  • fp (String)

    Certificate fingerprint.

  • attrs (Hash)

    Persisted metadata such as path, name, OS, and owners.



42
43
44
45
46
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 42

def track(fp, attrs)
  data = load
  data[fp] = attrs
  save(data)
end

.untrack(fp) ⇒ Object



48
49
50
51
52
53
# File 'lib/vagrant-docker-certificates-manager/util/registry.rb', line 48

def untrack(fp)
  data = load
  removed = !data.delete(fp).nil?
  save(data)
  removed
end