caco 0.1.0

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.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +10 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +12 -0
  6. data/Gemfile.lock +227 -0
  7. data/Guardfile +42 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +97 -0
  10. data/Rakefile +10 -0
  11. data/bin/_guard-core +29 -0
  12. data/bin/bundle +114 -0
  13. data/bin/byebug +29 -0
  14. data/bin/caco +29 -0
  15. data/bin/coderay +29 -0
  16. data/bin/console +20 -0
  17. data/bin/eyaml +29 -0
  18. data/bin/guard +29 -0
  19. data/bin/listen +29 -0
  20. data/bin/pry +29 -0
  21. data/bin/rake +29 -0
  22. data/bin/safe_yaml +29 -0
  23. data/bin/setup +8 -0
  24. data/bin/thor +29 -0
  25. data/bin/tilt +29 -0
  26. data/caco.gemspec +43 -0
  27. data/exe/caco +27 -0
  28. data/lib/caco.rb +115 -0
  29. data/lib/caco/barman.rb +10 -0
  30. data/lib/caco/barman/cell/global.rb +4 -0
  31. data/lib/caco/barman/cell/node.rb +15 -0
  32. data/lib/caco/barman/install.rb +25 -0
  33. data/lib/caco/barman/view/global.erb +7 -0
  34. data/lib/caco/barman/view/node.erb +8 -0
  35. data/lib/caco/cell.rb +8 -0
  36. data/lib/caco/config.rb +23 -0
  37. data/lib/caco/debian.rb +28 -0
  38. data/lib/caco/debian/add_user.rb +18 -0
  39. data/lib/caco/debian/apt_key_install.rb +19 -0
  40. data/lib/caco/debian/apt_repo_add.rb +17 -0
  41. data/lib/caco/debian/apt_sources_list.rb +15 -0
  42. data/lib/caco/debian/apt_update.rb +33 -0
  43. data/lib/caco/debian/cell/service.rb +19 -0
  44. data/lib/caco/debian/cell/sources_list.rb +7 -0
  45. data/lib/caco/debian/package_install.rb +21 -0
  46. data/lib/caco/debian/package_installed.rb +17 -0
  47. data/lib/caco/debian/service_enable.rb +26 -0
  48. data/lib/caco/debian/service_install.rb +31 -0
  49. data/lib/caco/debian/user_home.rb +17 -0
  50. data/lib/caco/debian/view/service.erb +18 -0
  51. data/lib/caco/debian/view/sources_list.erb +10 -0
  52. data/lib/caco/downloader.rb +41 -0
  53. data/lib/caco/executer.rb +33 -0
  54. data/lib/caco/facter.rb +41 -0
  55. data/lib/caco/file_link.rb +36 -0
  56. data/lib/caco/file_reader.rb +24 -0
  57. data/lib/caco/file_writer.rb +57 -0
  58. data/lib/caco/finder.rb +13 -0
  59. data/lib/caco/grafana.rb +6 -0
  60. data/lib/caco/grafana/install.rb +26 -0
  61. data/lib/caco/haproxy.rb +12 -0
  62. data/lib/caco/haproxy/cell/conf_postgres.rb +4 -0
  63. data/lib/caco/haproxy/cell/conf_stats.rb +4 -0
  64. data/lib/caco/haproxy/conf_get.rb +15 -0
  65. data/lib/caco/haproxy/conf_set.rb +52 -0
  66. data/lib/caco/haproxy/install.rb +9 -0
  67. data/lib/caco/haproxy/view/conf_postgres.erb +25 -0
  68. data/lib/caco/haproxy/view/conf_stats.erb +6 -0
  69. data/lib/caco/macro.rb +2 -0
  70. data/lib/caco/postgres.rb +44 -0
  71. data/lib/caco/postgres/build_augeas.rb +20 -0
  72. data/lib/caco/postgres/conf_get.rb +37 -0
  73. data/lib/caco/postgres/conf_set.rb +54 -0
  74. data/lib/caco/postgres/database_create.rb +28 -0
  75. data/lib/caco/postgres/extension_create.rb +28 -0
  76. data/lib/caco/postgres/hba_set.rb +65 -0
  77. data/lib/caco/postgres/install.rb +34 -0
  78. data/lib/caco/postgres/shell.rb +13 -0
  79. data/lib/caco/postgres/sql.rb +17 -0
  80. data/lib/caco/postgres/user_change_password.rb +13 -0
  81. data/lib/caco/postgres/user_create.rb +33 -0
  82. data/lib/caco/prometheus.rb +15 -0
  83. data/lib/caco/prometheus/adapter_install_pg.rb +107 -0
  84. data/lib/caco/prometheus/adapter_install_postgresql.rb +47 -0
  85. data/lib/caco/prometheus/cell/alertmanager_conf.rb +4 -0
  86. data/lib/caco/prometheus/cell/alerts.rb +4 -0
  87. data/lib/caco/prometheus/cell/conf.rb +7 -0
  88. data/lib/caco/prometheus/exporter_install.rb +35 -0
  89. data/lib/caco/prometheus/install.rb +50 -0
  90. data/lib/caco/prometheus/install_alert_manager.rb +62 -0
  91. data/lib/caco/prometheus/view/alertmanager_conf.erb +13 -0
  92. data/lib/caco/prometheus/view/alerts.erb +18 -0
  93. data/lib/caco/prometheus/view/conf.erb +34 -0
  94. data/lib/caco/rbenv.rb +8 -0
  95. data/lib/caco/rbenv/cell/profile.rb +4 -0
  96. data/lib/caco/rbenv/install.rb +56 -0
  97. data/lib/caco/rbenv/install_version.rb +17 -0
  98. data/lib/caco/rbenv/view/profile.erb +3 -0
  99. data/lib/caco/repmgr.rb +15 -0
  100. data/lib/caco/repmgr/cell/conf.rb +43 -0
  101. data/lib/caco/repmgr/conf.rb +25 -0
  102. data/lib/caco/repmgr/install.rb +25 -0
  103. data/lib/caco/repmgr/node_register_primary.rb +34 -0
  104. data/lib/caco/repmgr/node_register_standby.rb +25 -0
  105. data/lib/caco/repmgr/node_registered.rb +15 -0
  106. data/lib/caco/repmgr/node_role.rb +18 -0
  107. data/lib/caco/repmgr/view/conf.erb +27 -0
  108. data/lib/caco/settings_loader.rb +67 -0
  109. data/lib/caco/settings_loader_monkeypatch.rb +28 -0
  110. data/lib/caco/ssh.rb +6 -0
  111. data/lib/caco/ssh/authorized_keys_add.rb +82 -0
  112. data/lib/caco/sudo.rb +6 -0
  113. data/lib/caco/sudo/sudoers_add.rb +15 -0
  114. data/lib/caco/timescale.rb +6 -0
  115. data/lib/caco/timescale/install.rb +25 -0
  116. data/lib/caco/unpacker.rb +76 -0
  117. data/lib/caco/version.rb +3 -0
  118. metadata +398 -0
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'thor' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("thor", "thor")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'tilt' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("tilt", "tilt")
@@ -0,0 +1,43 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "caco/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "caco"
8
+ spec.version = Caco::VERSION
9
+ spec.authors = ["Celso Fernandes"]
10
+ spec.email = ["celso.fernandes@gmail.com"]
11
+
12
+ spec.summary = %q{Caco, The Frog}
13
+ spec.description = %q{Caco, configure your machines like you develop your web apps}
14
+ spec.homepage = "https://github.com/fernandes/caco"
15
+ spec.license = "MIT"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "cells-erb", "~> 0.1"
27
+ spec.add_dependency "cells", "~> 4.1"
28
+ spec.add_dependency "config"
29
+ spec.add_dependency "down", "~> 5.0"
30
+ spec.add_dependency "hiera-eyaml"
31
+ spec.add_dependency "http", "~> 4.0"
32
+ spec.add_dependency "marcel"
33
+ spec.add_dependency "ruby-augeas"
34
+ spec.add_dependency "trailblazer-cells"
35
+ spec.add_dependency "trailblazer", "~> 2.1"
36
+ spec.add_development_dependency "bundler", "~> 2.0"
37
+ spec.add_development_dependency "rake", "~> 13.0"
38
+ spec.add_development_dependency "minitest", "~> 5.0"
39
+ spec.add_development_dependency "minitest-reporters"
40
+ spec.add_development_dependency "trailblazer-developer"
41
+ spec.add_development_dependency "fakefs"
42
+ spec.add_development_dependency "webmock"
43
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "caco"
4
+
5
+ ENV['CACO_ENV'] ||= 'development'
6
+ APP_PATH = Bundler.root
7
+
8
+ Caco.root = Pathname.new(APP_PATH)
9
+
10
+ Caco::SettingsLoader.(params: {
11
+ keys_path: Caco.root.join("keys"),
12
+ data_path: Caco.root.join("data")
13
+ })
14
+
15
+ # puts "starting"
16
+
17
+ fqdn = Caco::Facter.("networking", "fqdn")
18
+ puts "[Caco] Running for: #{fqdn}"
19
+
20
+ begin
21
+ require Caco.root.join("nodes", fqdn)
22
+ rescue LoadError => e
23
+ path = Caco.root.join("nodes", fqdn).to_s
24
+ puts "Could not find manifest at #{path}.rb"
25
+ end
26
+
27
+ # puts "finishing"
@@ -0,0 +1,115 @@
1
+ # Ruby Dependencies
2
+ require 'delegate'
3
+ require 'digest'
4
+ require 'erb'
5
+ require 'json'
6
+ require 'open3'
7
+
8
+ # Gems
9
+ require 'augeas'
10
+ require 'cells-erb'
11
+ require 'config'
12
+ require 'declarative'
13
+ # Monkey Patching to remove !Warning!
14
+ module Declarative
15
+ class Defaults
16
+ def handle_array_and_deprecate(variables)
17
+ wrapped = Defaults.wrap_arrays(variables)
18
+
19
+ variables.merge(wrapped)
20
+ end
21
+ end
22
+ end
23
+
24
+ require 'down'
25
+ require 'down/http'
26
+ Down.backend Down::Http
27
+
28
+ require 'hiera/backend/eyaml'
29
+ require 'hiera/backend/eyaml/options'
30
+ require 'hiera/backend/eyaml/parser/parser'
31
+ require 'marcel'
32
+ require 'trailblazer'
33
+ require 'trailblazer/cells'
34
+
35
+ # System (order dependant)
36
+ require "caco/config"
37
+ require "caco/macro"
38
+ require "caco/executer"
39
+
40
+ require "caco/facter"
41
+ require "caco/file_writer"
42
+ require "caco/file_reader"
43
+ require "caco/file_link"
44
+ require "caco/downloader"
45
+ require "caco/finder"
46
+ require "caco/unpacker"
47
+ require "caco/settings_loader"
48
+ require "caco/version"
49
+
50
+ # modules
51
+ require "caco/debian"
52
+
53
+ require "caco/barman"
54
+ require "caco/grafana"
55
+ require "caco/haproxy"
56
+ require "caco/postgres"
57
+ require "caco/prometheus"
58
+ require "caco/rbenv"
59
+ require "caco/repmgr"
60
+ require "caco/ssh"
61
+ require "caco/sudo"
62
+ require "caco/timescale"
63
+
64
+ module Caco
65
+ class << self
66
+ attr_accessor :root
67
+ end
68
+
69
+ class Error < StandardError; end
70
+ # Your code goes here...
71
+
72
+ class FixtureNotExist < StandardError; end
73
+ end
74
+
75
+ module Cell
76
+ # Erb contains helpers that are messed up in Rails and do escaping.
77
+ module Erb
78
+ def template_options_for(_options)
79
+ {
80
+ template_class: ::Tilt::ERBTemplate,
81
+ escape_html: false,
82
+ escape_attrs: false,
83
+ suffix: "erb"
84
+ }
85
+ end
86
+ end
87
+ end
88
+
89
+ class Trailblazer::Cell
90
+ include Cell::Erb
91
+ self.view_paths = [File.expand_path("../", __FILE__)]
92
+
93
+ def property(key)
94
+ return nil if model.nil?
95
+ return nil unless model.has_key?(key) and model.is_a?(Hash)
96
+ return model[key]
97
+ end
98
+ end
99
+
100
+ class Trailblazer::Operation
101
+ class InvalidParam < StandardError; end
102
+
103
+ def p(message)
104
+ method_name = (caller[0] =~ /`([^']*)'/ and $1)
105
+ puts "#{self.class}##{method_name}: #{message}"
106
+ end
107
+ end
108
+
109
+ def trbreaks(klass = nil)
110
+ bind_to = klass.nil? ? self.class : klass
111
+ bind_to.instance_methods(false).each do |m|
112
+ Pry::Byebug::Breakpoints.add_method("#{bind_to}##{m}")
113
+ end
114
+ true
115
+ end
@@ -0,0 +1,10 @@
1
+ module Caco
2
+ module Barman
3
+ end
4
+ end
5
+
6
+ require 'caco/barman/install'
7
+
8
+ # Templates
9
+ require 'caco/barman/cell/global'
10
+ require 'caco/barman/cell/node'
@@ -0,0 +1,4 @@
1
+ module Caco::Barman::Cell
2
+ class Global < Trailblazer::Cell
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module Caco::Barman::Cell
2
+ class Node < Trailblazer::Cell
3
+ def name
4
+ property(:name)
5
+ end
6
+
7
+ def description
8
+ property(:description)
9
+ end
10
+
11
+ def host
12
+ property(:host)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ module Caco::Barman
2
+ class Install < Trailblazer::Operation
3
+ class Repo < Trailblazer::Operation
4
+ step Subprocess(Caco::Debian::AptKeyInstall),
5
+ input: ->(_ctx, **) {{
6
+ url: 'https://dl.2ndquadrant.com/gpg-key.asc',
7
+ fingerprint: '8565 305C EA7D 0B66 4933 D250 9904 CD4B D6BA F0C3'
8
+ }}
9
+ step Subprocess(Caco::Debian::AptRepoAdd),
10
+ input: ->(_ctx, **) {{
11
+ name: '2ndquadrant-dl-default-release',
12
+ url: 'https://dl.2ndquadrant.com/default/release/apt',
13
+ release: "#{Caco::Facter.("os", "distro", "codename")}-2ndquadrant",
14
+ component: 'main'
15
+ }}
16
+ end
17
+
18
+ step Subprocess(Repo)
19
+ step Subprocess(Caco::Debian::AptUpdate)
20
+ step Subprocess(Caco::Debian::PackageInstall),
21
+ input: ->(_ctx, **) {{
22
+ package: 'barman'
23
+ }}
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ [barman]
2
+ barman_user = barman
3
+ configuration_files_directory = /etc/barman.d
4
+ barman_home = /var/lib/barman
5
+ log_file = /var/log/barman/barman.log
6
+ log_level = INFO
7
+ compression = gzip
@@ -0,0 +1,8 @@
1
+ [<%= name %>]
2
+ description = "<%= description %>"
3
+ conninfo = host=<%= host %> user=barman dbname=postgres
4
+ streaming_conninfo = host=<%= host %> user=streaming_barman
5
+ backup_method = postgres
6
+ streaming_archiver = on
7
+ archiver = on
8
+ slot_name = barman
@@ -0,0 +1,8 @@
1
+ module Caco
2
+ class Cell
3
+ def self.inherited(subclass)
4
+ subclass.include Cell::Erb
5
+ subclass.view_paths = ["lib"]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ module Caco
2
+ class << self
3
+ attr_accessor :config
4
+ end
5
+
6
+ def self.configure
7
+ self.config ||= Configuration.new
8
+ yield(config)
9
+ end
10
+
11
+ class Configuration
12
+ attr_accessor :root
13
+ attr_accessor :eyaml_parser
14
+ attr_accessor :write_files
15
+ attr_accessor :write_files_root
16
+
17
+ def initialize
18
+ @root = 'donotreply@example.com'
19
+ @write_files = true
20
+ @write_files_root = nil
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ require 'caco/debian/apt_repo_add'
2
+ require 'caco/debian/apt_key_install'
3
+ require 'caco/debian/apt_sources_list'
4
+ require 'caco/debian/apt_update'
5
+ require 'caco/debian/package_installed'
6
+ require 'caco/debian/package_install'
7
+ require 'caco/debian/service_enable'
8
+ require 'caco/debian/service_install'
9
+ require 'caco/debian/user_home'
10
+ require 'caco/debian/add_user'
11
+
12
+ # Templates
13
+ require 'caco/debian/cell/service'
14
+ require 'caco/debian/cell/sources_list'
15
+
16
+ module Caco
17
+ module Debian
18
+ @@apt_updated = false
19
+
20
+ def self.apt_updated
21
+ @@apt_updated
22
+ end
23
+
24
+ def self.apt_updated=(value)
25
+ @@apt_updated = !!value
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ module Caco::Debian
2
+ class AddUser < Trailblazer::Operation
3
+ step Subprocess(Caco::Debian::UserHome),
4
+ input: ->(_ctx, user:, **) {{
5
+ user: user
6
+ }},
7
+ Output(:success) => End(:success),
8
+ Output(:failure) => Track(:success)
9
+
10
+ step Subprocess(Caco::Executer),
11
+ input: ->(_ctx, user:, **) {{
12
+ command: "adduser --disabled-password --gecos '' --quiet --force-badname #{user}"
13
+ }}
14
+
15
+ step ->(ctx, **) { ctx[:created] = true },
16
+ id: :mark_created
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ class Caco::Debian::AptKeyInstall < Trailblazer::Operation
2
+ step Subprocess(Caco::Executer),
3
+ Output(:failure) => Track(:success),
4
+ Output(:success) => End(:success),
5
+ input: ->(_ctx, fingerprint:, **) {{
6
+ command: "apt-key list|egrep -i '#{fingerprint}'"
7
+ }},
8
+ output: { check_key_exist_exit_code: :exit_code, check_key_exist_output: :output },
9
+ id: :check_key_exist
10
+
11
+ step Subprocess(Class.new(Caco::Executer)),
12
+ input: ->(_ctx, url:, **) {{
13
+ command: "wget -q -O - #{url} | apt-key add -"
14
+ }},
15
+ output: ->(_ctx, exit_code:, output:, **) {{
16
+ install_key_exit_code: exit_code, install_key_output: output, apt_key_executed: true
17
+ }},
18
+ id: :install_key
19
+ end
@@ -0,0 +1,17 @@
1
+ module Caco::Debian
2
+ class AptRepoAdd < Trailblazer::Operation
3
+ step ->(ctx, url:, release:, component:, **) {
4
+ ctx[:content] = "deb #{url} #{release} #{component}"
5
+ },
6
+ id: :build_repo_content
7
+
8
+ step ->(ctx, name:, **) {
9
+ ctx[:path] = "/etc/apt/sources.list.d/#{name}.list"
10
+ },
11
+ id: :build_repo_path
12
+
13
+ step Subprocess(Caco::FileWriter),
14
+ input: [:path, :content],
15
+ output: { file_created: :repo_created, file_changed: :repo_changed }
16
+ end
17
+ end