puppet-herald 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +5 -0
  5. data/README.md +73 -0
  6. data/Rakefile +6 -0
  7. data/bin/puppet-herald +13 -0
  8. data/config.ru +2 -0
  9. data/db/migrate/20141211165540_create_nodes.rb +10 -0
  10. data/db/migrate/20141211171305_create_reports.rb +16 -0
  11. data/db/migrate/20141211171326_create_log_entries.rb +13 -0
  12. data/db/schema.rb +47 -0
  13. data/db/seeds.rb +0 -0
  14. data/lib/puppet-herald.rb +37 -0
  15. data/lib/puppet-herald/app.rb +112 -0
  16. data/lib/puppet-herald/cli.rb +53 -0
  17. data/lib/puppet-herald/database.rb +50 -0
  18. data/lib/puppet-herald/javascript.rb +34 -0
  19. data/lib/puppet-herald/models/log-entry.rb +3 -0
  20. data/lib/puppet-herald/models/node.rb +7 -0
  21. data/lib/puppet-herald/models/report.rb +78 -0
  22. data/lib/puppet-herald/public/.bowerrc +3 -0
  23. data/lib/puppet-herald/public/app.js +27 -0
  24. data/lib/puppet-herald/public/bower.json +15 -0
  25. data/lib/puppet-herald/public/components/artifact/artifact-directive.js +12 -0
  26. data/lib/puppet-herald/public/components/artifact/artifact-directive_test.js +17 -0
  27. data/lib/puppet-herald/public/components/artifact/artifact.js +31 -0
  28. data/lib/puppet-herald/public/components/directives/directives.js +5 -0
  29. data/lib/puppet-herald/public/components/directives/status-button.html +7 -0
  30. data/lib/puppet-herald/public/components/directives/status-button.js +54 -0
  31. data/lib/puppet-herald/public/components/filters/filters.js +12 -0
  32. data/lib/puppet-herald/public/css/herald.css +38 -0
  33. data/lib/puppet-herald/public/img/shield97.svg +17 -0
  34. data/lib/puppet-herald/public/node/node.html +30 -0
  35. data/lib/puppet-herald/public/node/node.js +24 -0
  36. data/lib/puppet-herald/public/nodes/nodes.html +29 -0
  37. data/lib/puppet-herald/public/nodes/nodes.js +24 -0
  38. data/lib/puppet-herald/public/report/report.html +24 -0
  39. data/lib/puppet-herald/public/report/report.js +24 -0
  40. data/lib/puppet-herald/stubs/puppet.rb +29 -0
  41. data/lib/puppet-herald/version.rb +20 -0
  42. data/lib/puppet-herald/views/app.erb +42 -0
  43. data/lib/puppet-herald/views/err500.erb +31 -0
  44. data/puppet-herald.gemspec +62 -0
  45. data/spec/model_helper.rb +2 -0
  46. data/spec/spec_helper.rb +37 -0
  47. data/spec/support/active_record.rb +17 -0
  48. data/spec/unit/fixtures/changed-notify.yaml +278 -0
  49. data/spec/unit/models/report_spec.rb +38 -0
  50. metadata +331 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWNhZTUzMzk1M2ExNzcwNGFiZDVkNTNmNDBkZGYxNmQxNzUyYjg2MQ==
5
+ data.tar.gz: !binary |-
6
+ ZjBjNjQyMjYzMjc2ZGU0Y2Y4MTA3NWQyMTI1NzIxNGIxMDMwNGQzOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZjVhZjY1ZGYwOGE1ODc1YjcxYzNjMDhjYzFlNTIwY2E1M2VkYjgzNWZkYWQ0
10
+ NTY4N2M2ZmUxNmVlZDMzN2U0MTZjMDg2MDMzZWI4MjNmY2FhYzNmOTZhMTJl
11
+ YjZmMTA4MjVlZDk1OTFmNzM2YzM0Yjk0ZWZhMzEyOWIyZjAyMzU=
12
+ data.tar.gz: !binary |-
13
+ NzhhZGI2ZDhmYzFiY2I4MzYzMmY3YzMwMDM1ZTRlM2YwYzU4NWEzNDFhNWE3
14
+ ZDEzOWU1YmFiNjZhNjE3NDQyNzY0ZmIwYTY0OGExNTc4OTUzZWNlZmE1ZTI0
15
+ YzFlNDI4NDk4YjExODViYjUzYjZkMDJjZjg0YWMxMTUwODM1YWM=
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore bundle .vendor dir
11
+ /.vendor
12
+ /coverage
13
+
14
+ /Gemfile.lock
15
+
16
+ # Ignore the default SQLite database.
17
+ /db/*.sqlite3
18
+ /db/*.sqlite3-journal
19
+
20
+ # Ignore all logfiles and tempfiles.
21
+ /log/*.log
22
+ /tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source ENV['GEM_SOURCE'] || "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ # vim:ft=ruby
data/README.md ADDED
@@ -0,0 +1,73 @@
1
+ puppet-herald gem
2
+ ========
3
+
4
+ Overview
5
+ --------
6
+
7
+ Herald is a puppet report processor. He provides a gateway for consuming puppet reports, a REST API and a simple Web app to display reports.
8
+
9
+ Puppet module
10
+ -----
11
+
12
+ There is/will be a puppet module that handle installation and configuration of Herald and prerequisites. Check that out: https://github.com/wavesoftware/puppet-herald
13
+
14
+ Prerequisites
15
+ -----
16
+
17
+ * `libpq-dev`
18
+
19
+ On Ubuntu/Debian system install them with:
20
+
21
+ ```shell
22
+ sudo apt-get install libpq-dev
23
+ ```
24
+
25
+ Installation
26
+ -----
27
+
28
+ Install Herald and all dependencies from http://rubygems.org:
29
+ ```shell
30
+ sudo gem install puppet-herald
31
+ ```
32
+
33
+ Configuration
34
+ -----
35
+
36
+ If you like to use PostgreSQL database to hold reports, you will need to configure it. By default, Herald will use a sqlite file that he tries to create in your home directory. Check out `puppet-herald --help` for description.
37
+
38
+ ###Create a database
39
+
40
+ Just create a database for Herald (this is just a sample):
41
+ ```sql
42
+ CREATE ROLE pherald LOGIN PASSWORD '<YOUR PASSWORD>' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
43
+ CREATE DATABASE "pherald" WITH OWNER = pherald
44
+ ENCODING = 'UTF8'
45
+ TABLESPACE = pg_default;
46
+ ```
47
+
48
+ Usage
49
+ -----
50
+
51
+ ```shell
52
+ $ puppet-herald --help
53
+ ```
54
+
55
+ Example of running a server with using sqlite and binding to other host and port:
56
+
57
+ ```shell
58
+ puppet-herald --dbconn sqlite:///var/lib/puppet/reports/pherald.db --bind master.cluster.vm --port 8081
59
+ ```
60
+
61
+ ###Contributing
62
+
63
+ Contributions are welcome!
64
+
65
+ To contribute, follow the standard [git flow](http://danielkummer.github.io/git-flow-cheatsheet/) of:
66
+
67
+ 1. Fork it
68
+ 1. Create your feature branch (`git checkout -b feature/my-new-feature`)
69
+ 1. Commit your changes (`git commit -am 'Add some feature'`)
70
+ 1. Push to the branch (`git push origin feature/my-new-feature`)
71
+ 1. Create new Pull Request
72
+
73
+ Even if you can't contribute code, if you have an idea for an improvement please open an [issue](https://github.com/wavesoftware/gem-puppet-herald/issues).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'puppet-herald/app'
2
+ require 'sinatra/activerecord/rake'
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ task :default => :spec
data/bin/puppet-herald ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $0 = 'puppet-herald'
4
+
5
+ begin
6
+ require 'puppet-herald/cli'
7
+ rescue LoadError
8
+ require 'rubygems'
9
+ require 'puppet-herald/cli'
10
+ end
11
+
12
+ # Process command line options and run Puppet Herald
13
+ PuppetHerald::CLI.parse_options
data/config.ru ADDED
@@ -0,0 +1,2 @@
1
+ require 'puppet-herald/app'
2
+ run PuppetHerald::App
@@ -0,0 +1,10 @@
1
+ class CreateNodes < ActiveRecord::Migration
2
+ def change
3
+ create_table :nodes do |t|
4
+ t.string :name
5
+ t.string :status
6
+ t.integer :no_of_reports
7
+ t.datetime :last_run
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ class CreateReports < ActiveRecord::Migration
2
+ def change
3
+ create_table :reports do |t|
4
+ t.string :status
5
+ t.string :environment
6
+ t.string :transaction_uuid
7
+ t.string :configuration_version
8
+ t.string :puppet_version
9
+ t.string :kind
10
+ t.string :host
11
+ t.datetime :time
12
+
13
+ t.references :node
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ class CreateLogEntries < ActiveRecord::Migration
2
+ def change
3
+ create_table :log_entries do |t|
4
+ t.datetime :time
5
+ t.string :level
6
+ t.string :source
7
+ t.integer :line
8
+ t.text :message
9
+
10
+ t.references :report
11
+ end
12
+ end
13
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,47 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20141211171326) do
15
+
16
+ # These are extensions that must be enabled in order to support this database
17
+ enable_extension "plpgsql"
18
+
19
+ create_table "log_entries", force: true do |t|
20
+ t.datetime "time"
21
+ t.string "level"
22
+ t.string "source"
23
+ t.integer "line"
24
+ t.text "message"
25
+ t.integer "report_id"
26
+ end
27
+
28
+ create_table "nodes", force: true do |t|
29
+ t.string "name"
30
+ t.string "status"
31
+ t.integer "no_of_reports"
32
+ t.datetime "last_run"
33
+ end
34
+
35
+ create_table "reports", force: true do |t|
36
+ t.string "status"
37
+ t.string "environment"
38
+ t.string "transaction_uuid"
39
+ t.string "configuration_version"
40
+ t.string "puppet_version"
41
+ t.string "kind"
42
+ t.string "host"
43
+ t.datetime "time"
44
+ t.integer "node_id"
45
+ end
46
+
47
+ end
data/db/seeds.rb ADDED
File without changes
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'pry'
3
+ rescue LoadError
4
+ # Do nothing here
5
+ end
6
+
7
+ module PuppetHerald
8
+
9
+ @@root = File.dirname(File.dirname(File.realpath(__FILE__)))
10
+
11
+ def self.relative_dir dir
12
+ File.join @@root, dir
13
+ end
14
+
15
+ def self.port
16
+ @@port
17
+ end
18
+
19
+ def self.environment
20
+ env = :production
21
+ unless ENV['PUPPET_HERALD_ENV'].nil?
22
+ env = ENV['PUPPET_HERALD_ENV'].to_sym
23
+ end
24
+ return env
25
+ end
26
+
27
+ def self.is_in_dev?
28
+ return [:development, :dev, :test, :ci].include? environment
29
+ end
30
+
31
+ def self.is_in_prod?
32
+ return !is_in_dev?
33
+ end
34
+ end
35
+
36
+ require 'puppet-herald/database'
37
+ require 'puppet-herald/app'
@@ -0,0 +1,112 @@
1
+ require 'sinatra/base'
2
+ require "sinatra/namespace"
3
+ require 'sinatra/activerecord'
4
+ require 'puppet-herald'
5
+ require 'puppet-herald/javascript'
6
+ require 'puppet-herald/models/node'
7
+ require 'puppet-herald/models/report'
8
+
9
+ module PuppetHerald
10
+ class App < Sinatra::Base
11
+ register Sinatra::Namespace
12
+ register Sinatra::ActiveRecordExtension
13
+ configure [:production, :development] do
14
+ enable :logging
15
+ PuppetHerald::Database.setup self
16
+ end
17
+ if PuppetHerald::is_in_dev?
18
+ set :environment, :development
19
+ else
20
+ set :environment, :production
21
+ end
22
+
23
+ def self.bug ex
24
+ file = Tempfile.new(['puppet-herald-bug', '.log'])
25
+ filepath = file.path
26
+ file.close
27
+ file.unlink
28
+ message = "v#{PuppetHerald::VERSION}-#{ex.class.to_s}: #{ex.message}"
29
+ contents = message + "\n\n" + ex.backtrace.join("\n") + "\n"
30
+ File.write(filepath, contents)
31
+ bugo = {
32
+ :message => message,
33
+ :homepage => PuppetHerald::HOMEPAGE,
34
+ :bugfile => filepath,
35
+ :help => "Please report this bug to #{PuppetHerald::HOMEPAGE} by passing contents of bug file: #{filepath}"
36
+ }
37
+ return bugo
38
+ end
39
+
40
+ error do
41
+ @bug = PuppetHerald::App.bug(env['sinatra.error'])
42
+ erb :err500
43
+ end
44
+
45
+ get %r{/app\.min\.(js\.map|js)} do |ext|
46
+ content_type 'application/javascript'
47
+ ugly = PuppetHerald::Javascript::uglify '/app.min.js.map'
48
+ ugly[ext]
49
+ end
50
+
51
+ get '/' do
52
+ redirect "/app.html", 301
53
+ end
54
+
55
+ get '/index.html' do
56
+ redirect "/app.html", 301
57
+ end
58
+
59
+ get '/app.html' do
60
+ if PuppetHerald::is_in_prod?
61
+ @minified = '.min'
62
+ @files = ['/app.min.js']
63
+ else
64
+ @minified = ''
65
+ @files = PuppetHerald::Javascript::files
66
+ end
67
+ erb :app
68
+ end
69
+
70
+ get '/version.json' do
71
+ content_type 'application/json'
72
+ ver = {}
73
+ [:VERSION, :LICENSE, :NAME, :PACKAGE, :SUMMARY, :DESCRIPTION, :HOMEPAGE].each do |const|
74
+ ver[const.downcase] = PuppetHerald::const_get const
75
+ end
76
+ ver.to_json
77
+ end
78
+
79
+ namespace '/api' do
80
+ namespace '/v1' do
81
+
82
+ put '/provide-log' do
83
+ content_type 'application/json'
84
+ yaml = request.body.read
85
+ report = Report.create_from_yaml yaml
86
+
87
+ {:status => :ok}.to_json
88
+ end
89
+
90
+ get '/nodes' do
91
+ content_type 'application/json'
92
+ nodes = Node.all
93
+ nodes.to_json
94
+ end
95
+
96
+ get '/node/:id' do
97
+ content_type 'application/json'
98
+ id = params[:id]
99
+ Node.get_with_reports(id).
100
+ to_json(:include => :reports)
101
+ end
102
+
103
+ get '/report/:id' do
104
+ content_type 'application/json'
105
+ id = params[:id]
106
+ Report.get_with_log_entries(id).
107
+ to_json(:include => :log_entries)
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,53 @@
1
+ require 'micro-optparse'
2
+ require 'puppet-herald'
3
+ require 'puppet-herald/version'
4
+ require 'puppet-herald/database'
5
+
6
+ module PuppetHerald
7
+ class CLI
8
+
9
+ def self.parse_options
10
+ usage = ""
11
+ banner = <<-eos
12
+ #{PuppetHerald::NAME} v#{PuppetHerald::VERSION} - #{PuppetHerald::SUMMARY}
13
+
14
+ #{PuppetHerald::DESCRIPTION}
15
+
16
+ Usage: #{$0} [options]
17
+
18
+ For --dbconn option you can use both PostgreSQL and SQLite3 (postgresql://host/db, sqlite://file/path).
19
+ CAUTION! For security reasons, don't pass password in connection string, use --passfile option!
20
+
21
+ eos
22
+ home = File.expand_path('~')
23
+ defaultdb = "sqlite://#{home}/pherald.db"
24
+ defaultdbpass = "#{home}/.pherald.pass"
25
+ parser = Parser.new do |p|
26
+ p.banner = banner
27
+ p.version = PuppetHerald::VERSION
28
+ p.option :bind, "Hostname to bind to", :default => 'localhost'
29
+ p.option :port, "Port to use", :default => 11303, :value_satisfies => lambda {|x| x >= 100 && x <= 65000}
30
+ p.option :dbconn, "Connection string to database, see info above", :default => defaultdb
31
+ p.option :passfile, "If using postgresql, this file will be read for password to database", :default => defaultdbpass
32
+ end
33
+ options = parser.process!
34
+
35
+ puts "Starting #{PuppetHerald::NAME} v#{PuppetHerald::VERSION}..."
36
+ PuppetHerald::Database.dbconn = options[:dbconn]
37
+ PuppetHerald::Database.passfile = options[:passfile]
38
+ begin
39
+ PuppetHerald::Database.validate! :echo => true
40
+ rescue Exception => ex
41
+ STDERR.puts "FATAL ERROR - Database configuration is invalid!\n\n#{ex.message}"
42
+ exit 2
43
+ end
44
+ begin
45
+ PuppetHerald::App.run! options
46
+ rescue Exception => ex
47
+ bug = PuppetHerald::App.bug(ex)
48
+ STDERR.puts "FATAL ERROR - Unexpected error occured, mayby a bug?\n\n#{bug[:message]}\n\n#{bug[:help]}"
49
+ exit 1
50
+ end
51
+ end
52
+ end
53
+ end