sambot 0.1.133 → 0.1.136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b87f23b7adc229d597cf7be106dc222ff4bc4f5a
4
- data.tar.gz: ecd50d622fa1cfb2547b40cb079cbccc68b3f747
3
+ metadata.gz: 6021e47fdeb14f7d2ee79b256a8fbb1f011c84aa
4
+ data.tar.gz: d1ed6d2ea608e4d2c286e3377caafd303b1c46d3
5
5
  SHA512:
6
- metadata.gz: 2dc15a5f97c34c46625803880bacd1aa4feb6a4602c263d0772197e06b7e0fb33e25064d87879db9dd66c3b34bf95df229defb87e6883d57e1b6a004600a94d2
7
- data.tar.gz: e722b607b8aac892aff0af052ed23d1681a5dfa8c2d6d7555915defa096a3eed9d7afbb51d0b04fed848325ce7fcd2831d554d9d3a8310f86092064dc645a230
6
+ metadata.gz: 1f0f44f6c2463845aca95ee0d07a82a7fadacec412cdea183d264e8c6918c122c34b37b0ca5350af0566d5432bf5e2a856b12baa385635bb3536ec9e1d11516e
7
+ data.tar.gz: 5fd140e6e19c2cc2279249010d3d9d9f3c6de97731559e392afa2c50f9f954abd4341a99507d66ffabc1986f1c6fdd9b0bd8d64c32f775ebe5386be2d5b8e700
@@ -1,11 +1,13 @@
1
1
  #frozen_string_literal: true
2
+ require 'awesome_print'
2
3
 
3
4
  module Sambot
4
5
  module Chef
5
6
  class Generator
6
7
 
7
8
  def self.from_templates(config, cookbook_essentials, cookbook_generated_files)
8
- platforms = config['platforms']
9
+ platforms = config[:platforms] if config.has_key?(:platforms)
10
+ platforms = config['platforms'] if config.has_key?('platforms')
9
11
  cookbook_essentials.each { |path| exists!(path) } if cookbook_essentials
10
12
  cookbook_generated_files.each do |template_name, opts|
11
13
  generate_from_template(template_name.to_s, opts, platforms)
@@ -55,7 +55,7 @@ module Sambot
55
55
  end
56
56
 
57
57
  def read_template(template, cookbook_name, platforms)
58
- result = Template.new("#{template}.erb").evaluate({platforms: platforms}) do |contents|
58
+ result = Template.new("#{template}.erb").evaluate({platforms: platforms}, {:pattern => '<!--% %-->'}) do |contents|
59
59
  contents.gsub(/@@cookbook_name@@/, cookbook_name)
60
60
  end
61
61
  YAML.load(result.gsub(/\_@/, '<%=').gsub(/@\_/, '%>'))
data/lib/sambot/cli.rb CHANGED
@@ -46,17 +46,5 @@ module Sambot
46
46
  end
47
47
  end
48
48
 
49
- desc 'start', 'Start a new Sambot session'
50
- def start
51
- execute(need_dev_credentials: true, need_sudo_password: true) do
52
- Workflow::Session.new.start(ENV['SAMBOT_DEV_USERNAME'], ENV['SAMBOT_DEV_PASSWORD'], ENV['SAMBOT_SUDO_PASSWORD'])
53
- end
54
- end
55
-
56
- desc 'stop', 'Stop any active Sambot session'
57
- def stop
58
- execute(need_sudo_password: true) { Workflow::Session.new.stop }
59
- end
60
-
61
49
  end
62
50
  end
@@ -19,7 +19,7 @@ module Sambot
19
19
  def find_platform_by_image_id(id)
20
20
  available_images = all
21
21
  image = available_images.find { |x| x[:value] == id }
22
- image[:name].match?(/Linux/) ? 'L' : 'W'
22
+ image[:name].match(/Linux/) ? 'L' : 'W'
23
23
  end
24
24
 
25
25
  end
@@ -11,10 +11,11 @@ module Sambot
11
11
  File.expand_path(File.join(File.dirname(__FILE__), 'templates', @filename))
12
12
  end
13
13
 
14
- def evaluate(context = {})
14
+ def evaluate(context = {}, opts = {})
15
15
  input = File.read(path)
16
16
  input = yield(input) if block_given?
17
- eruby = Erubis::Eruby.new(input)
17
+ puts opts
18
+ eruby = Erubis::Eruby.new(input, opts)
18
19
  eruby.evaluate(context)
19
20
  end
20
21
 
@@ -5,9 +5,8 @@ provisioner:
5
5
  require_chef_omnibus: 12
6
6
  cookbooks_path:
7
7
  - .
8
-
9
8
  platforms:
10
- <% if @platforms.include?('centos') %>
9
+ <!--% if @platforms.include?('centos') %-->
11
10
  - name: centos
12
11
  transport:
13
12
  username: chefuser
@@ -34,8 +33,8 @@ platforms:
34
33
  - "test-kitchen"
35
34
  - "consul-agent"
36
35
  - "vault-client"
37
- <% end %>
38
- <% if @platforms.include?('windows') %>
36
+ <!--% end %-->
37
+ <!--% if @platforms.include?('windows') %-->
39
38
  - name: windows
40
39
  transport:
41
40
  name: winrm
@@ -65,7 +64,7 @@ platforms:
65
64
  - "test-kitchen"
66
65
  - "consul-agent"
67
66
  - "vault-client"
68
- <% end %>
67
+ <!--% end %-->
69
68
 
70
69
  verifier:
71
70
  name: inspec
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  provisioner:
3
3
  name: chef_zero
4
- log_level: _@= ENV['TEST_KITCHEN_LOG_LEVEL'] || 'info' @_
4
+ log_level: <%= ENV['TEST_KITCHEN_LOG_LEVEL'] || 'info' %>
5
5
  require_chef_omnibus: 12
6
6
  cookbooks_path:
7
7
  - .
8
8
 
9
9
  platforms:
10
- <% if @platforms.include?('centos') %>
10
+ <!--% if @platforms.include?('centos') %-->
11
11
  - name: centos
12
12
  transport:
13
13
  ssh_key: ./id_rsa
@@ -23,8 +23,8 @@ platforms:
23
23
  public_key_path: ./id_rsa.pub
24
24
  rackspace_region: 'lon'
25
25
  server_name: @@cookbook_name@@-_@ Time.now.to_i @_
26
- <% end %>
27
- <% if @platforms.include?('windows') %>
26
+ <!--% end %-->
27
+ <!--% if @platforms.include?('windows') %-->
28
28
  - name: windows
29
29
  driver:
30
30
  name: rax
@@ -40,7 +40,7 @@ platforms:
40
40
  rackconnect_wait: true
41
41
  platform: windows
42
42
  user_data: winrm_config
43
- <% end %>
43
+ <!--% end %-->
44
44
 
45
45
  verifier:
46
46
  name: inspec
@@ -14,13 +14,13 @@ provisioner:
14
14
  - .
15
15
 
16
16
  platforms:
17
- <% if @platforms.include?('centos') %>
17
+ <!--% if @platforms.include?('centos') %-->
18
18
  - name: "centos-7.2"
19
19
  driver:
20
20
  network:
21
21
  - ["private_network", {ip: "192.168.255.10"}]
22
- <% end %>
23
- <% if @platforms.include?('windows') %>
22
+ <!--% end %-->
23
+ <!--% if @platforms.include?('windows') %-->
24
24
  - name: windows-2012R2
25
25
  driver:
26
26
  box: salesforce/Server2012R2
@@ -29,7 +29,7 @@ platforms:
29
29
  transport:
30
30
  name: winrm
31
31
  elevated: true
32
- <% end %>
32
+ <!--% end %-->
33
33
 
34
34
  verifier:
35
35
  name: inspec
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sambot
4
- VERSION = '0.1.133'.freeze
4
+ VERSION = '0.1.136'.freeze
5
5
  end
@@ -9,7 +9,6 @@ module Sambot
9
9
  FORMULAS = {
10
10
  'git': 'git',
11
11
  'vault': 'vault',
12
- 'haproxy': 'haproxy',
13
12
  'ruby-build': 'ruby-build',
14
13
  'rbenv': 'rbenv'
15
14
  }
data/lib/sambot.rb CHANGED
@@ -19,25 +19,10 @@ require_relative 'sambot/rackspace/flavors'
19
19
  require_relative 'sambot/rackspace/images'
20
20
  require_relative 'sambot/rackspace/instances'
21
21
 
22
- require_relative 'sambot/dns/records'
23
- require_relative 'sambot/dns/repository'
24
-
25
- require_relative 'sambot/workflow/tunnel'
26
- require_relative 'sambot/workflow/tunnels'
27
22
  require_relative 'sambot/workflow/brew'
28
- require_relative 'sambot/workflow/proxy'
29
- require_relative 'sambot/workflow/dns'
30
- require_relative 'sambot/workflow/session'
31
23
  require_relative 'sambot/workflow/vault'
32
24
  require_relative 'sambot/workflow/workstation'
33
25
 
34
- #require_relative 'sambot/slack/product_tag'
35
- #require_relative 'sambot/slack/work_item'
36
- #require_relative 'sambot/slack/api'
37
- #require_relative 'sambot/slack/formatter'
38
- #require_relative 'sambot/slack/gus_bot'
39
- #require_relative 'sambot/slack/dispatcher'
40
-
41
26
  require_relative 'sambot/cli'
42
27
 
43
28
  module Sambot
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sambot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.133
4
+ version: 0.1.136
5
5
  platform: ruby
6
6
  authors:
7
7
  - Olivier Kouame
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-04 00:00:00.000000000 Z
11
+ date: 2017-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor-hollaback
@@ -453,8 +453,6 @@ files:
453
453
  - lib/sambot/cli.rb
454
454
  - lib/sambot/commands/cookbook_cmd.rb
455
455
  - lib/sambot/config.rb
456
- - lib/sambot/dns/records.rb
457
- - lib/sambot/dns/repository.rb
458
456
  - lib/sambot/docs/build.txt
459
457
  - lib/sambot/docs/clean.txt
460
458
  - lib/sambot/docs/configure.txt
@@ -495,10 +493,6 @@ files:
495
493
  - lib/sambot/version.rb
496
494
  - lib/sambot/workflow/brew.rb
497
495
  - lib/sambot/workflow/dns.rb
498
- - lib/sambot/workflow/proxy.rb
499
- - lib/sambot/workflow/session.rb
500
- - lib/sambot/workflow/tunnel.rb
501
- - lib/sambot/workflow/tunnels.rb
502
496
  - lib/sambot/workflow/vault.rb
503
497
  - lib/sambot/workflow/workstation.rb
504
498
  - sambot.gemspec
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sambot
4
- module DNS
5
- class Records
6
-
7
- RACKSPACE_PROXY_IP = '134.213.17.37'
8
- DEFAULT_TF_FILENAME = 'dyn_dns.tf'
9
-
10
- def initialize(repository)
11
- @repository = repository
12
- end
13
-
14
- def remove(hostname, team, commit_changes = false)
15
- change(team, hostname, commit_changes) do |contents|
16
- if contents['module'].key?(hostname)
17
- contents['module'].delete(hostname)
18
- UI.debug("The entry \"#{hostname}\" has been deleted.")
19
- else
20
- UI.debug("The entry \"#{hostname}\" was not found.")
21
- end
22
- end
23
- end
24
-
25
- def add(hostname, internal_address, team, commit_changes = false)
26
- change(team, hostname, commit_changes) do |contents|
27
- if contents['module'].key?(hostname)
28
- UI.debug("The entry for \"<#{hostname}>\" will be overwritten.")
29
- else
30
- UI.debug("A new entry for \"<#{hostname}>\" will be added.")
31
- end
32
- contents['module'][hostname] = {
33
- 'source' => '../../modules/combined_dns',
34
- 'dnszone' => 'brighter.io',
35
- 'name' => hostname,
36
- 'enable-int' => '1',
37
- 'int-value' => internal_address,
38
- 'int-type' => 'A',
39
- 'enable-ext' => '1',
40
- 'ext-value' => RACKSPACE_PROXY_IP,
41
- 'ext-type' => 'A'
42
- }
43
- end
44
- end
45
-
46
- private
47
-
48
- def change(team, hostname, commit_changes = false)
49
- @repository.clone do |directory|
50
- folder = shared_hostname?(hostname) ? find_shared_folder(hostname) : find_team_name(team)
51
- containing_folder = File.join(directory, folder)
52
- UI.debug("Modifying DNS records in the folder #{containing_folder}")
53
- Dir.chdir(containing_folder) do
54
- contents = Rhcl.parse(File.read(DEFAULT_TF_FILENAME))
55
- yield contents
56
- open(DEFAULT_TF_FILENAME, 'w') do |f|
57
- f << Rhcl.dump(contents)
58
- end
59
- if commit_changes
60
- commit_msg = "DNS update for hostname #{hostname}"
61
- `commit -am #{commit_msg}`
62
- `git push`
63
- end
64
- end
65
- end
66
- end
67
-
68
- def find_shared_folder(name)
69
- folder = name.split('-')[0]
70
- UI.debug('This record is a shared entry so will go into the shared folder ' + folder + '.')
71
- folder
72
- end
73
-
74
- def shared_hostname?(name)
75
- name.start_with?('patch', 'stable', 'unstable')
76
- end
77
-
78
- def find_team_name(name)
79
- UI.debug('This record is a team-specifc entry so will go into the team folder.')
80
- raise ApplicationError, 'A team name (symbol i.e. PHX) must be provided if this is not a record for a shared endpoint i.e. patch-api or stable-jetstream.' unless name
81
- sanitized_name = name.upcase
82
- case sanitized_name
83
- when 'PHX'
84
- 'phx'
85
- when 'AVG'
86
- 'avengers'
87
- when 'GD'
88
- 'guardians'
89
- when 'NW'
90
- 'nightswatch'
91
- else
92
- raise ApplicationError, 'Unknown team name, should be PHX, AVG, GD or NW'
93
- end
94
- end
95
-
96
- end
97
- end
98
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rhcl'
4
-
5
- module Sambot
6
- module DNS
7
- class Repository
8
-
9
- def initialize(url = 'git@github.exacttarget.com:ads-devops/as-terraform-dns-config.git', name = 'as-terraform-dns-config')
10
- @url = url
11
- @name = name
12
- end
13
-
14
- def records
15
- Records.new(self)
16
- end
17
-
18
- def list_records
19
- records = []
20
- clone do |directory|
21
- records << ['Module', 'Hostname', 'Enable Internal IP', 'Enable External IP', 'External IP', 'Internal IP']
22
- Dir['*'].each do |folder|
23
- filename = File.join(directory, "#{folder}/dyn_dns.tf")
24
- contents = Rhcl.parse(File.read(filename))
25
- modules = contents['module']
26
- modules.each do |section|
27
- record = section[1]
28
- next unless record['int-type'] == 'A' || record['ext-type'] == 'A'
29
- records << [folder, record['name'], record['enable-int'], record['enable-ext'], record['ext-value'], record['int-value']]
30
- end
31
- end
32
- end
33
- records
34
- end
35
-
36
- def clone
37
- tmp = Dir.mktmpdir
38
- Dir.chdir(tmp) do
39
- `git clone #{@url} #{@name}`
40
- repo = File.join(tmp, @name, 'rackspace')
41
- puts repo
42
- Dir.chdir(repo) do
43
- `git checkout master`
44
- yield(repo)
45
- end
46
- end
47
- end
48
-
49
- end
50
- end
51
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sambot
4
- module Workflow
5
- class Proxy
6
-
7
- CONFIG_PATH = '/tmp/haproxy.conf'
8
-
9
- def self.start(forwards)
10
- template = Sambot::Template.new('haproxy.conf.erb')
11
- services = forwards.map do |key, value|
12
- name = key.to_s.split('.')[0]
13
- UI.debug("Proxying #{name}.brighter.io:#{value[:proxy_port]} to 0.0.0.0:#{value[:tunnel_port]}")
14
- {
15
- name: name,
16
- tunnel_port: value[:tunnel_port],
17
- local_port: value[:proxy_port]
18
- }
19
- end
20
- frontends = {}
21
- services.map {|x| x[:local_port]}.uniq.each { |a| frontends[a] = [] }
22
- services.each do |service|
23
- frontends[service[:local_port]] << service
24
- end
25
- template.write({frontends: frontends}, CONFIG_PATH)
26
- Runtime.sudo("haproxy -f #{CONFIG_PATH}", flag_errors: true)
27
- end
28
-
29
- def self.stop
30
- Runtime.sudo("killall haproxy", flag_errors: false)
31
- end
32
-
33
- end
34
- end
35
- end
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'titan'
3
- require 'net/ssh'
4
- require 'dante'
5
- require 'haproxy-tools'
6
-
7
- module Dante
8
- class Runner
9
- def log(message)
10
- Sambot::UI.info message
11
- end
12
- end
13
- end
14
-
15
- module Sambot
16
- module Workflow
17
- class Session
18
-
19
- BASTION_HOST_IP = '146.177.10.174'
20
-
21
- FORWARDS = {
22
- 'rundeck.brighter.io': {
23
- tunnel_port: 9004, dest_port: 4440, proxy_port: 443
24
- },
25
- 'chef.brighter.io': {
26
- tunnel_port: 9000, dest_port: 443, proxy_port: 443
27
- },
28
- 'teamcity.brighter.io': {
29
- tunnel_port: 9001, dest_port: 8111, proxy_port: 443
30
- },
31
- 'splunk.brighter.io': {
32
- tunnel_port: 9002, dest_port: 8080, proxy_port: 443
33
- },
34
- 'vault.brighter.io': {
35
- tunnel_port: 9003, dest_port: 8200, proxy_port: 8200
36
- }
37
- }
38
-
39
- def start(user, pass, sudo_password)
40
- stop
41
- unless verify_credentials(user, pass)
42
- UI.error 'The session could not be started'
43
- exit
44
- end
45
- DNS.update_hosts(FORWARDS)
46
- Proxy.start(FORWARDS)
47
- Runtime.sudo("ifconfig lo0 -alias 127.0.0.1")
48
- Runtime.sudo("ifconfig lo0 alias 127.0.0.1 up")
49
- Tunnels.start(user, pass, BASTION_HOST_IP, FORWARDS)
50
- run_connectivity_checks()
51
- setup_secrets_management(user, pass)
52
- UI.info("Your session has now started - run `sambot session stop` to close it")
53
- end
54
-
55
- def stop
56
- Tunnels.stop(FORWARDS)
57
- DNS.reset_hosts(FORWARDS)
58
- Proxy.stop
59
- release_ports(FORWARDS)
60
- end
61
-
62
- private
63
-
64
-
65
- def release_ports(forwards)
66
- forwards.each do |k, v|
67
- output = Runtime.sudo("lsof -wni tcp:#{v[:tunnel_port]}", flag_errors: true)
68
- if output.strip.size > 0
69
- line = output.strip.lines[1]
70
- pid = line.split[1]
71
- UI.debug(line)
72
- Runtime.sudo("kill -9 #{pid}")
73
- end
74
- end
75
- #TODO RELEASE PROXY PORTS
76
- end
77
-
78
- def verify_credentials(username, password)
79
- full_username = "DEV\\#{username}"
80
- begin
81
- Net::SSH.start(BASTION_HOST_IP, full_username, :password => password, :non_interactive => true) do |ssh|; end
82
- return true
83
- rescue Timeout::Error
84
- puts " Timed out"
85
- rescue Errno::EHOSTUNREACH
86
- puts " Host unreachable"
87
- rescue Errno::ECONNREFUSED
88
- puts " Connection refused"
89
- rescue Net::SSH::Disconnect
90
- UI.error "Invalid username or password provided"
91
- end
92
- return false
93
- end
94
-
95
- def run_connectivity_checks
96
- #TODO
97
- end
98
-
99
- def setup_secrets_management(username, password)
100
- unless Vault.has_environment_variables?(FORWARDS)
101
- UI.info("You have either not configured your workstation or you have not opened up a new shell to pick up the changes applied during configuration")
102
- end
103
- UI.debug "Authenticating with Hashicorp Vault in Rackspace DEV/QE"
104
- token = Vault.authenticate(username, password, FORWARDS)
105
- UI.debug "Saving your Vault authentication token to ~/.vault-token"
106
- Vault.save_token(token)
107
- end
108
-
109
- end
110
- end
111
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'awesome_print'
3
-
4
- module Sambot
5
- module Workflow
6
- class Tunnel
7
-
8
- def self.create(session, host, port, local_port)
9
- UI.debug "Creating a tunnel from 0.0.0.0:#{local_port} to #{host}:#{port}"
10
- session.forward.local("0.0.0.0", local_port, host, port)
11
- end
12
-
13
- end
14
- end
15
- end
@@ -1,40 +0,0 @@
1
- module Sambot
2
- module Workflow
3
-
4
- class Tunnels
5
-
6
- PID_PATH = '/tmp/sambot-session.pid'
7
-
8
- LOG_PATH = '/tmp/sambot-session.log'
9
-
10
- SESSION_ID = 'sambot'
11
-
12
- def self.start(username, password, bastion_host_ip, forwards)
13
- UI.info("Starting daemon for tunneling - log is available at #{LOG_PATH}")
14
- Dante::Runner.new(SESSION_ID).execute(daemonize: true, pid_path: PID_PATH, log_path: LOG_PATH) do
15
- setup_ssh_tunnels(username, password, bastion_host_ip, forwards)
16
- end
17
- sleep(2)
18
- puts "----- Background Daemon Log -----"
19
- puts File.read(LOG_PATH)
20
- puts "---------------------------------"
21
- end
22
-
23
- def self.stop(forwards)
24
- Dante::Runner.new(SESSION_ID).execute(kill: true, pid_path: PID_PATH)
25
- UI.debug("All active sessions have been closed")
26
- File.delete(LOG_PATH) if File.exist?(LOG_PATH)
27
- end
28
-
29
- def self.setup_ssh_tunnels(username, password, bastion_host_ip, forwards)
30
- full_username = "DEV\\#{username}"
31
- UI.debug "Opening a connection to the Rackspace DEV/QE environment"
32
- Net::SSH.start(bastion_host_ip, full_username, password: password) do |session|
33
- forwards.each { |key, value| Tunnel.create(session, key, value[:dest_port], value[:tunnel_port]) }
34
- session.loop {true}
35
- end
36
- end
37
-
38
- end
39
- end
40
- end