Skip to content

Commit 93f1b85

Browse files
committed
Install 1Password CLI from package repo
1 parent cfd9f6f commit 93f1b85

File tree

5 files changed

+137
-19
lines changed

5 files changed

+137
-19
lines changed

cookbooks/boxcutter_onepassword/kitchen.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ platforms:
4040
image: boxcutter/dokken-ubuntu-24.04
4141
pid_one_command: /bin/systemd
4242

43+
- name: debian-12
44+
driver:
45+
image: boxcutter/dokken-debian-12
46+
pid_one_command: /bin/systemd
47+
4348
- name: centos-stream-9
4449
driver:
4550
image: boxcutter/dokken-centos-stream-9
@@ -57,6 +62,16 @@ suites:
5762
inspec_tests:
5863
- test/integration/cli
5964
attributes:
65+
lifecycle:
66+
pre_converge:
67+
- remote: |
68+
bash -xc '
69+
set +x
70+
mkdir -p /etc/cinc
71+
ln -s /etc/cinc /etc/chef
72+
echo "<%= ENV['OP_SERVICE_ACCOUNT_TOKEN'] %>" > /etc/chef/op_service_account_token
73+
set -x
74+
'
6075
6176
- name: service-account
6277
named_run_list: boxcutter_onepassword_test_service_account
@@ -104,4 +119,4 @@ suites:
104119
echo "<%= ENV['OP_CONNECT_TOKEN'] %>" > /etc/chef/op_connect_token
105120
echo "<%= ENV['OP_SERVICE_ACCOUNT_TOKEN'] %>" > /etc/chef/op_service_account_token
106121
set -x
107-
'
122+
'

cookbooks/boxcutter_onepassword/libraries/onepassword.rb

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
module Boxcutter
22
class OnePassword
3+
def self.op_whoami(type = 'auto')
4+
command = "#{op_cli} whoami"
5+
shellout = Mixlib::ShellOut.new(command, :env => op_environment(type))
6+
shellout.run_command
7+
shellout.error!
8+
shellout.stdout.strip
9+
end
310
def self.op_read(reference, type = 'auto')
411
environment = op_environment(type)
5-
6-
if !::File.exist?('/usr/local/bin/op')
7-
install_op_cli
8-
end
12+
cli = op_cli
913

1014
# 1Password Connect Server does not support op user get --me
1115
if ['auto', 'service_account'].include?(type)
12-
command = '/usr/local/bin/op user get --me'
16+
command = "#{cli} user get --me"
1317
shellout = Mixlib::ShellOut.new(command, :env => environment)
1418
shellout.run_command
1519
shellout.error!
1620
Chef::Log.debug("boxcutter_onepassword[op_read]: op user get --me\n#{shellout.stdout}")
1721
end
1822

19-
command = "/usr/local/bin/op read '#{reference}'"
23+
command = "#{cli} read '#{reference}'"
2024
shellout = Mixlib::ShellOut.new(command, :env => environment)
2125
shellout.run_command
2226
shellout.error!
@@ -26,11 +30,7 @@ def self.op_read(reference, type = 'auto')
2630
def self.op_document_get(item, vault, type = 'auto')
2731
environment = op_environment(type)
2832

29-
if !::File.exist?('/usr/local/bin/op')
30-
install_op_cli
31-
end
32-
33-
op_document_cmd = ['/usr/local/bin/op', 'document', 'get', "'#{item}'"]
33+
op_document_cmd = [op_cli, 'document', 'get', "'#{item}'"]
3434
op_document_cmd << "--vault '#{vault}'" unless vault.nil?
3535

3636
command = op_document_cmd.join(' ')
@@ -61,10 +61,23 @@ def self.op_environment(type)
6161
environment
6262
end
6363

64+
def self.bootstrap_op_cli
65+
'/opt/onepassword/bin/op'
66+
end
67+
68+
def self.op_cli
69+
if !::File.exist?('/usr/bin/op')
70+
install_bootstrap_op_cli
71+
return bootstrap_op_cli
72+
end
73+
74+
'/usr/bin//op'
75+
end
76+
6477
# If "op_read" is called during compile time, this might happen before
6578
# the main default recipe runs to install the cli. Bootstrap the 1Password
6679
# cli at compile time to ensure things don't fail at this point.
67-
def self.install_op_cli
80+
def self.install_bootstrap_op_cli
6881
require 'rbconfig'
6982
require 'net/http'
7083
require 'uri'
@@ -73,6 +86,7 @@ def self.install_op_cli
7386
architecture = RbConfig::CONFIG['host_cpu']
7487
puts "MISCHA: architecture #{architecture}"
7588

89+
# https://releases.1password.com/developers/cli/
7690
url = 'https://cache.agilebits.com/dist/1P/op2/pkg/v2.31.1/op_linux_amd64_v2.31.1.zip'
7791
if ['aarch64', 'arm64'].include?(architecture)
7892
url = 'https://cache.agilebits.com/dist/1P/op2/pkg/v2.31.1/op_linux_arm64_v2.31.1.zip'
@@ -94,8 +108,10 @@ def self.install_op_cli
94108
end
95109
end
96110

97-
unzip_file(tmp_path, 'op', '/usr/local/bin')
98-
::File.chmod(0o755, '/usr/local/bin/op')
111+
bootstrap_op_cli_dirname = ::File.dirname(bootstrap_op_cli)
112+
FileUtils.mkdir_p(bootstrap_op_cli_dirname) unless Dir.exist?(bootstrap_op_cli_dirname)
113+
unzip_file(tmp_path, 'op', bootstrap_op_cli_dirname)
114+
::File.chmod(0o755, ::File.join(bootstrap_op_cli_dirname, 'op'))
99115
end
100116

101117
def self.unzip_file(zip_file, filename, destination)

cookbooks/boxcutter_onepassword/recipes/cli.rb

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,91 @@
1616
# See the License for the specific language governing permissions and
1717
# limitations under the License.
1818

19-
boxcutter_onepassword_zipfile 'op' do
20-
bin_links %w{op}
19+
case node['platform']
20+
when 'ubuntu', 'debian'
21+
case node['kernel']['machine']
22+
when 'x86_64', 'amd64'
23+
node.default['fb_apt']['sources']['onepassword'] = {
24+
'key' => 'onepassword',
25+
'url' => 'https://downloads.1password.com/linux/debian/amd64',
26+
'suite' => 'stable',
27+
'components' => ['main'],
28+
}
29+
when 'aarch64', 'arm64'
30+
node.default['fb_apt']['sources']['onepassword'] = {
31+
'key' => 'onepassword',
32+
'url' => 'https://downloads.1password.com/linux/debian/arm64',
33+
'suite' => 'stable',
34+
'components' => ['main'],
35+
}
36+
end
37+
38+
# curl -sS https://downloads.1password.com/linux/keys/1password.asc
39+
node.default['fb_apt']['keymap']['onepassword'] = <<~EOS
40+
-----BEGIN PGP PUBLIC KEY BLOCK-----
41+
42+
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
86+
P4I7jHwe0BN3iNAG1nKbGg==
87+
=+LeX
88+
-----END PGP PUBLIC KEY BLOCK-----
89+
EOS
90+
when 'centos'
91+
node.default['fb_yum_repos']['repos']['onepassword'] = {
92+
'repos' => {
93+
'onepassword' => {
94+
'name' => '1Password Stable Channel',
95+
'baseurl' => 'https://downloads.1password.com/linux/rpm/stable/$basearch',
96+
'gpgcheck' => true,
97+
'repo_gpgcheck' => true,
98+
'gpgkey' => 'https://downloads.1password.com/linux/keys/1password.asc',
99+
},
100+
},
101+
}
102+
end
103+
104+
package '1password-cli' do
105+
action :upgrade
21106
end

cookbooks/boxcutter_onepassword/test/cookbooks/boxcutter_onepassword_test/recipes/cli.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
# Recipe:: cli
44
#
55

6+
puts "MISCHA: #{Boxcutter::OnePassword::op_whoami}"
7+
68
include_recipe 'boxcutter_onepassword::cli'
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
describe command('/opt/op/bin/op -h') do
1+
describe command('/usr/bin/op -h') do
22
its('exit_status') { should eq 0 }
33
its('stdout') { should match(/1Password CLI/) }
44
end
55

6-
describe command('/usr/local/bin/op') do
6+
describe command('/usr/bin/op') do
77
it { should exist }
88
end

0 commit comments

Comments
 (0)