ccs 0.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3f41c587aec81ba6914fde371c7645779d220d63
4
- data.tar.gz: 01c7949ac8d27300b681841b13b9a51cb9104de3
2
+ SHA256:
3
+ metadata.gz: ddc7a13cb4e185260a511ead10fd9f75387fecdd42a4138d19e0a0de35cd9caf
4
+ data.tar.gz: 8c99aa2c31cbd7a66bb1023f8b32872478691268b475b80f9bf6c203ebb978a1
5
5
  SHA512:
6
- metadata.gz: 7b49503f5dd0556a88568bad93e9755e47d7bbc851d7855647d291f9771d69492af08f7a51eff302b096fa1ed2ea9f149eb4b5d777aae56659b5b6c7e80d9b3c
7
- data.tar.gz: a993d334971f5a8989eff75fad704a6f45d2b8e1ec35b7c07073cd01d05291ec0a64bb2a351d4ba5d07ae1b50497ef6691e7c125a3bba87b94a42e1a71b6597b
6
+ metadata.gz: 6c8f8bff758c7917bee0a1f779f5a97594c863d19ae96a673b8ca630cfe0189649d326130c44b622799ce489b9486492c1bf9fb74ee38c6e998167f29a7cb8a5
7
+ data.tar.gz: 0ac4cd8805f4addd47e7b224a7eff2a7fab360856294aed60444846946d9563c294d415bdbba9f72da3d7fe2f966b1cec18d5f51b97fc615e6a0da49d6da8d94
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
55
55
  ## Enforcement
56
56
 
57
57
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at hello@pipello.io. All
58
+ reported by contacting the project team at me@tkowalewski.pl. All
59
59
  complaints will be reviewed and investigated and will result in a response that
60
60
  is deemed necessary and appropriate to the circumstances. The project team is
61
61
  obligated to maintain confidentiality with regard to the reporter of an incident.
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 pipello.io
3
+ Copyright (c) 2017 me@tkowalewski.pl
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # CCS
2
2
 
3
+ Configuration control system
3
4
 
4
5
  ## Installation
5
6
 
@@ -19,17 +20,68 @@ Or install it yourself as:
19
20
 
20
21
  ## Usage
21
22
 
23
+ ccs cp [OPTIONS] <(LocalPath|STDIN)|(CCSUri|Uri)> <(CCSUri|Uri)|(LocalPath|STDOUT)>
24
+
25
+ Options:
26
+ -a CCS_ACCESS_TOKEN, CCS Access Token
27
+ --access-token
28
+ -p CCS_PASSPHRASE, CCS Passphrase
29
+ --passphrase
30
+
31
+
22
32
  ## Example
23
33
 
34
+ Download to STDOUT
35
+
36
+ ccs cp ccs://workspace-name/0.1.0/path/to/file.yml -
37
+ ccs cp http://host.tld:9292/workspace-name/0.1.0/path/to/file.yml -
38
+ ccs cp https://host.tld/workspace-name/0.1.0/path/to/file.yml -
39
+
40
+ Download to local file
41
+
42
+ ccs cp ccs://workspace-name/0.1.0/path/to/file.yml /local/path/to/file.yml
43
+
44
+ Upload local file
45
+
46
+ ccs cp /local/path/to/file.yml ccs://workspace-name/0.1.0/path/to/file.yml
47
+
48
+ Upload content from STDIN
49
+
50
+ echo "{ a: 1 }" | ccs cp - ccs://workspace-name/0.1.0/path/to/file.yml
51
+ cat /local/path/to/file.yml | ccs cp - ccs://workspace-name/0.1.0/path/to/file.yml
52
+
53
+ ## API
54
+
55
+ Upload
56
+
57
+ require 'ccs'
58
+
59
+ destination = 'ccs://workspace-name/0.1.0/path/to/file.yml'
60
+ access_token = ENV.fetch('CCS_ACCESS_TOKEN')
61
+ passphrase = 'MyPassphrase'
62
+ content = 'RAILS_ENV=production'
63
+
64
+ Ccs::Document.new(destination, access_token, passphrase).upload(content)
65
+
66
+ Download
67
+
68
+ require 'ccs'
69
+
70
+ source = 'ccs://workspace-name/0.1.0/path/to/file.yml'
71
+ access_token = ENV.fetch('CCS_ACCESS_TOKEN')
72
+ passphrase = 'MyPassphrase'
73
+
74
+ Ccs::Document.new(source, access_token, passphrase).download
75
+
24
76
  ## Development
25
77
 
26
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
78
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
27
79
 
28
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
80
+ To install this gem onto your local machine, run `bin/rake install`. To release a new version, update the version number in `version.rb`, and then run `bin/rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
29
81
 
30
82
  ## Contributing
31
83
 
32
- Bug reports and pull requests are welcome on GitHub at https://github.com/pipello/ccs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
84
+ Bug reports and pull requests are welcome on GitHub at https://github.com/occson/ccs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
33
85
 
34
86
 
35
87
  ## License
data/exe/ccs ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'ccs'
6
+ require 'yaml'
7
+ require 'optparse'
8
+ require 'io/console'
9
+
10
+ options = {
11
+ 'access_token' => ENV['CCS_ACCESS_TOKEN'],
12
+ 'passphrase' => ENV['CCS_PASSPHRASE']
13
+ }
14
+
15
+ option_parser = OptionParser.new do |option_parser|
16
+ option_parser.banner = 'Usage: ccs [COMMAND [OPTIONS]]'
17
+
18
+ option_parser.separator ''
19
+ option_parser.separator 'Configuration Control System (CCS)'
20
+ option_parser.separator ''
21
+ option_parser.separator 'Commands:'
22
+ option_parser.separator ' cp Copy'
23
+
24
+ option_parser.separator ''
25
+ option_parser.separator format('Version: %<version>s', version: Ccs::VERSION)
26
+ end
27
+
28
+ case ARGV.shift
29
+ when 'cp'
30
+ option_parser = OptionParser.new do |option_parser|
31
+ option_parser.banner = 'Usage: ccs cp [OPTIONS] <(LocalPath|STDIN)|(CCSUri|Uri)> <(CCSUri|Uri)|(LocalPath|STDOUT)>'
32
+ option_parser.separator ''
33
+ option_parser.separator 'Configuration Control System (CCS) - Copy'
34
+ option_parser.separator ''
35
+ option_parser.separator 'Options:'
36
+
37
+ option_parser.on('-a CCS_ACCESS_TOKEN', '--access-token CCS_ACCESS_TOKEN', String, 'CCS Access Token') do |v|
38
+ options['access_token'] = v
39
+ end
40
+
41
+ option_parser.on('-p CCS_PASSPHRASE', '--passphrase CCS_PASSPHRASE', String, 'CCS Passphrase') do |v|
42
+ options['passphrase'] = v
43
+ end
44
+
45
+ option_parser.separator ''
46
+ option_parser.separator 'Configure via environment variables:'
47
+ option_parser.separator ' CCS_ACCESS_TOKEN'
48
+ option_parser.separator ' CCS_PASSPHRASE'
49
+
50
+ option_parser.separator ''
51
+ option_parser.separator 'Examples:'
52
+ option_parser.separator ' Download to STDOUT'
53
+ option_parser.separator ' ccs cp ccs://workspace-name/0.1.0/path/to/file.yml -'
54
+ option_parser.separator ' ccs cp http://host.tld:9292/workspace-name/0.1.0/path/to/file.yml -'
55
+ option_parser.separator ' ccs cp https://host.tld/workspace-name/0.1.0/path/to/file.yml -'
56
+ option_parser.separator ' Download to local file'
57
+ option_parser.separator ' ccs cp ccs://workspace-name/0.1.0/path/to/file.yml /local/path/to/file.yml'
58
+ option_parser.separator ' Upload local file'
59
+ option_parser.separator ' ccs cp /local/path/to/file.yml ccs://workspace-name/0.1.0/path/to/file.yml'
60
+ option_parser.separator ' Upload content from STDIN'
61
+ option_parser.separator ' echo "{ a: 1 }" | ccs cp - ccs://workspace-name/0.1.0/path/to/file.yml'
62
+ option_parser.separator ' cat /local/path/to/file.yml | ccs cp - ccs://workspace-name/0.1.0/path/to/file.yml'
63
+ option_parser.separator ''
64
+
65
+ option_parser.separator format('Version: %<version>s', version: Ccs::VERSION)
66
+ end
67
+
68
+ arguments = option_parser.parse!
69
+
70
+ unless options.values.any?
71
+ puts option_parser
72
+ exit(1)
73
+ end
74
+
75
+ raise OptionParser::MissingArgument, 'access_token' unless options['access_token']
76
+ raise OptionParser::MissingArgument, 'passphrase' unless options['passphrase']
77
+ raise OptionParser::MissingArgument, 'source' unless arguments.fetch(0, nil)
78
+ raise OptionParser::MissingArgument, 'destination' unless arguments.fetch(1, nil)
79
+
80
+ exit(1) unless Ccs::Commands::Copy.new(arguments[0], arguments[1], options['access_token'], options['passphrase']).call
81
+ else
82
+ puts option_parser
83
+ exit(1)
84
+ end
data/lib/ccs.rb CHANGED
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'json'
3
5
  require 'openssl'
4
6
  require 'base64'
7
+ require 'uri'
5
8
 
6
9
  require 'ccs/version'
7
- require 'ccs/downloader'
10
+ require 'ccs/encrypter'
8
11
  require 'ccs/decrypter'
9
- require 'ccs/configuration_file'
12
+ require 'ccs/uploader'
13
+ require 'ccs/downloader'
14
+ require 'ccs/document'
15
+ require 'ccs/commands/copy'
10
16
 
11
- module Ccs
12
- end
17
+ module Ccs; end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ module Commands
5
+ class Copy
6
+ def initialize(source, destination, access_token, passphrase)
7
+ @source = source
8
+ @destination = destination
9
+ @access_token = access_token
10
+ @passphrase = passphrase
11
+ end
12
+
13
+ def call
14
+ download? ? download : upload
15
+ end
16
+
17
+ private
18
+
19
+ def download?
20
+ @source.match?(%r{\A(ccs|https?):\/\/})
21
+ end
22
+
23
+ def download
24
+ content = Document.new(@source, @access_token, @passphrase).download
25
+ return unless content
26
+
27
+ (@destination.eql?('-') ? STDOUT : File.new(@destination, 'w')).print content
28
+ end
29
+
30
+ def upload
31
+ content = @source.eql?('-') ? STDIN.read : File.read(@source)
32
+ Document.new(@destination, @access_token, @passphrase).upload(content)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
4
  class Decrypter
3
5
  def initialize(passphrase, content)
@@ -5,7 +7,7 @@ module Ccs
5
7
  @content = content
6
8
  end
7
9
 
8
- def decrypt
10
+ def call
9
11
  decryptor.pkcs5_keyivgen(@passphrase, ciphertext_salt, 1)
10
12
  result = decryptor.update(encrypted)
11
13
  result << decryptor.final
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ class Document
5
+ def initialize(uri, access_token, passphrase)
6
+ @uri = build_uri(uri)
7
+ @access_token = access_token
8
+ @passphrase = passphrase
9
+ end
10
+
11
+ def upload(content)
12
+ Uploader.new(@uri, content, @access_token, @passphrase).call
13
+ end
14
+
15
+ def download
16
+ Downloader.new(@uri, @access_token, @passphrase).call
17
+ end
18
+
19
+ private
20
+
21
+ def build_uri(uri)
22
+ URI uri.sub('ccs://', 'https://api.occson.com/')
23
+ end
24
+ end
25
+ end
@@ -1,36 +1,41 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
4
  class Downloader
3
- def initialize(token, configuration_file)
4
- @token = token
5
- @configuration_file = configuration_file
5
+ def initialize(uri, access_token, passphrase)
6
+ @uri = uri
7
+ @access_token = access_token
8
+ @passphrase = passphrase
6
9
  end
7
10
 
8
- def download
11
+ def call
9
12
  response = http.request(request)
13
+ body = response.body
14
+ return unless response.code.eql? '200'
15
+ json = JSON.parse body
10
16
 
11
- return unless response.class == Net::HTTPOK
12
-
13
- JSON.parse(response.body)
17
+ Decrypter.new(@passphrase, json['encrypted_content']).call
14
18
  end
15
19
 
16
20
  private
17
21
 
18
- def uri
19
- @uri ||= URI format('https://pipello.io/api/v1/ccs/%s/%s', @configuration_file.version, @configuration_file.path)
20
- end
21
-
22
22
  def http
23
- Net::HTTP.new(uri.host, uri.port).tap do |http|
24
- http.use_ssl = uri.scheme == 'https'
23
+ @http ||= Net::HTTP.new(@uri.host, @uri.port).tap do |http|
24
+ http.use_ssl = @uri.scheme.eql?('https')
25
25
  end
26
26
  end
27
27
 
28
28
  def request
29
- Net::HTTP::Get.new(uri.path, headers)
29
+ Net::HTTP::Get.new(@uri.path, headers).tap do |request|
30
+ request["User-Agent"] = format('ccs/%s', Ccs::VERSION)
31
+ end
30
32
  end
31
33
 
32
34
  def headers
33
- { 'Authorization' => format('Token token=%s', @token) }
35
+ {
36
+ 'Authorization' => format('Token token=%<access_token>s', access_token: @access_token),
37
+ 'Content-Type' => 'application/json'
38
+ }
34
39
  end
35
40
  end
36
41
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ class Encrypter
5
+ def initialize(passphrase, content, salt)
6
+ @passphrase = passphrase
7
+ @content = content
8
+ @salt = salt
9
+ end
10
+
11
+ def call
12
+ encryptor.pkcs5_keyivgen(@passphrase, @salt, 1)
13
+ encrypted = encryptor.update(@content)
14
+ encrypted << encryptor.final
15
+
16
+ openssl_salted_ciphertext = 'Salted__' + @salt + encrypted
17
+ Base64.strict_encode64(openssl_salted_ciphertext)
18
+ end
19
+
20
+ private
21
+
22
+ def encryptor
23
+ @encryptor ||= OpenSSL::Cipher::AES.new(256, :CBC).encrypt
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ccs
4
+ class Uploader
5
+ def initialize(uri, content, access_token, passphrase)
6
+ @uri = uri
7
+ @content = content
8
+ @access_token = access_token
9
+ @passphrase = passphrase
10
+ end
11
+
12
+ def call
13
+ request.body = { encrypted_content: encrypted_content }.to_json
14
+ http.request(request).code.eql? '201'
15
+ end
16
+
17
+ private
18
+
19
+ def http
20
+ @http ||= Net::HTTP.new(@uri.host, @uri.port).tap do |http|
21
+ http.use_ssl = @uri.scheme.eql?('https')
22
+ end
23
+ end
24
+
25
+ def request
26
+ @request ||= Net::HTTP::Post.new(@uri.path, headers).tap do |request|
27
+ request["User-Agent"] = format('ccs/%s', Ccs::VERSION)
28
+ end
29
+ end
30
+
31
+ def headers
32
+ {
33
+ 'Authorization' => format('Token token=%<access_token>s', access_token: @access_token),
34
+ 'Content-Type' => 'application/json'
35
+ }
36
+ end
37
+
38
+ def encrypted_content
39
+ @encrypted_content ||= Encrypter.new(@passphrase, @content, salt).call
40
+ end
41
+
42
+ def salt
43
+ @access_token[0...8]
44
+ end
45
+ end
46
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ccs
2
- VERSION = '0.2.0'.freeze
4
+ VERSION = '3.0.0'
3
5
  end
metadata CHANGED
@@ -1,74 +1,146 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ccs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - pipello.io
7
+ - tkowalewski
8
+ - paweljw
8
9
  autorequire:
9
- bindir: bin
10
+ bindir: exe
10
11
  cert_chain: []
11
- date: 2017-02-14 00:00:00.000000000 Z
12
+ date: 2020-10-23 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
+ name: inch
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '1.13'
20
+ version: 0.8.0
20
21
  type: :development
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '1.13'
27
+ version: 0.8.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: pry
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 0.11.3
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 0.11.3
27
42
  - !ruby/object:Gem::Dependency
28
43
  name: rake
29
44
  requirement: !ruby/object:Gem::Requirement
30
45
  requirements:
31
46
  - - "~>"
32
47
  - !ruby/object:Gem::Version
33
- version: '10.0'
48
+ version: 13.0.1
34
49
  type: :development
35
50
  prerelease: false
36
51
  version_requirements: !ruby/object:Gem::Requirement
37
52
  requirements:
38
53
  - - "~>"
39
54
  - !ruby/object:Gem::Version
40
- version: '10.0'
55
+ version: 13.0.1
56
+ - !ruby/object:Gem::Dependency
57
+ name: reek
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 4.7.3
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 4.7.3
41
70
  - !ruby/object:Gem::Dependency
42
71
  name: rspec
43
72
  requirement: !ruby/object:Gem::Requirement
44
73
  requirements:
45
74
  - - "~>"
46
75
  - !ruby/object:Gem::Version
47
- version: '3.0'
76
+ version: 3.7.0
48
77
  type: :development
49
78
  prerelease: false
50
79
  version_requirements: !ruby/object:Gem::Requirement
51
80
  requirements:
52
81
  - - "~>"
53
82
  - !ruby/object:Gem::Version
54
- version: '3.0'
83
+ version: 3.7.0
55
84
  - !ruby/object:Gem::Dependency
56
85
  name: rubocop
57
86
  requirement: !ruby/object:Gem::Requirement
58
87
  requirements:
59
88
  - - "~>"
60
89
  - !ruby/object:Gem::Version
61
- version: 0.44.1
90
+ version: 0.52.1
62
91
  type: :development
63
92
  prerelease: false
64
93
  version_requirements: !ruby/object:Gem::Requirement
65
94
  requirements:
66
95
  - - "~>"
67
96
  - !ruby/object:Gem::Version
68
- version: 0.44.1
97
+ version: 0.52.1
98
+ - !ruby/object:Gem::Dependency
99
+ name: simplecov
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 0.15.1
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 0.15.1
112
+ - !ruby/object:Gem::Dependency
113
+ name: webmock
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: 3.3.0
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: 3.3.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: yard
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.9.11
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 0.9.11
69
140
  description: ''
70
141
  email:
71
- - hello@pipello.io
142
+ - me@tkowalewski.pl
143
+ - p@steamshard.net
72
144
  executables:
73
145
  - ccs
74
146
  extensions: []
@@ -78,13 +150,16 @@ files:
78
150
  - CODE_OF_CONDUCT.md
79
151
  - LICENSE.txt
80
152
  - README.md
81
- - bin/ccs
153
+ - exe/ccs
82
154
  - lib/ccs.rb
83
- - lib/ccs/configuration_file.rb
155
+ - lib/ccs/commands/copy.rb
84
156
  - lib/ccs/decrypter.rb
157
+ - lib/ccs/document.rb
85
158
  - lib/ccs/downloader.rb
159
+ - lib/ccs/encrypter.rb
160
+ - lib/ccs/uploader.rb
86
161
  - lib/ccs/version.rb
87
- homepage: https://github.com/pipello/ccs
162
+ homepage: https://github.com/occson/ccs
88
163
  licenses:
89
164
  - MIT
90
165
  metadata: {}
@@ -103,9 +178,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
178
  - !ruby/object:Gem::Version
104
179
  version: '0'
105
180
  requirements: []
106
- rubyforge_project:
107
- rubygems_version: 2.5.2
181
+ rubygems_version: 3.0.3
108
182
  signing_key:
109
183
  specification_version: 4
110
- summary: ''
184
+ summary: Configuration Control System (CCS)
111
185
  test_files: []
data/bin/ccs DELETED
@@ -1,57 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'ccs'
4
- require 'optparse'
5
- require 'io/console'
6
-
7
- options = {}
8
-
9
- opt_parser = OptionParser.new do |opt|
10
- opt.banner = 'Usage: ccs [OPTIONS] <CCSUri> <LocalPath|STDOUT>'
11
- opt.separator ''
12
- opt.separator 'Options:'
13
-
14
- opt.on('-t TOKEN', '--token TOKEN', String, 'API Token') do |v|
15
- options[:token] = v
16
- end
17
-
18
- opt.on('-d', '--decrypt', 'Ask for passphrase and decrypt') do |v|
19
- options[:decrypt] = v
20
- end
21
-
22
- opt.on('-h','--help', 'help') do
23
- puts opt_parser
24
- end
25
-
26
- opt.separator ''
27
- opt.separator 'Examples:'
28
- opt.separator ' ccs -t 8b5a196e-a116-4c64-8472-f7c6e1c2de3b ccs://0.1.0/path/to/file.yml'
29
- opt.separator ' ccs -t 8b5a196e-a116-4c64-8472-f7c6e1c2de3b ccs://0.1.0/path/to/file.yml local/path/to/file.yml'
30
-
31
- opt.separator ''
32
- opt.separator format('Version: %s', Ccs::VERSION)
33
- end
34
-
35
- arguments = opt_parser.parse!
36
-
37
- if ARGV.empty?
38
- puts opt_parser
39
- exit(-1)
40
- end
41
-
42
- raise OptionParser::MissingArgument if options[:token].nil?
43
- raise OptionParser::MissingArgument if arguments[0].nil?
44
-
45
- configuration_file = Ccs::ConfigurationFile.new(arguments[0])
46
- destination = arguments[1] ? File.new(arguments[1], 'w') : STDOUT
47
-
48
- json = Ccs::Downloader.new(options[:token], configuration_file).download
49
-
50
- if options[:decrypt]
51
- print 'Passphrase: '
52
- passphrase = STDIN.noecho(&:gets)
53
-
54
- destination.puts Ccs::Decrypter.new(passphrase.chomp, json['encrypted_content']).decrypt
55
- else
56
- destination.puts json['encrypted_content']
57
- end
@@ -1,29 +0,0 @@
1
- module Ccs
2
- class ConfigurationFile
3
- def initialize(uri)
4
- @uri = uri
5
- end
6
-
7
- def version
8
- parts[0]
9
- end
10
-
11
- def path
12
- parts[1]
13
- end
14
-
15
- def to_path
16
- Pathname.new path
17
- end
18
-
19
- def to_s
20
- format 'ccs://%s/%s', version, path
21
- end
22
-
23
- private
24
-
25
- def parts
26
- @parts ||= @uri.sub('ccs://', '').split('/', 2)
27
- end
28
- end
29
- end