charmkit 0.3.6 → 0.3.8

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
2
  SHA1:
3
- metadata.gz: ade5fcd9040118f5e59723c07c7b97be5b0e026f
4
- data.tar.gz: c71e7aab78d9205e14b11c736a1f43cb389ae5c1
3
+ metadata.gz: 24756041722bd6f0869ceaa2bf01c29b7d580af1
4
+ data.tar.gz: 07dc358b6837a4686090776d750c95595a8e15ac
5
5
  SHA512:
6
- metadata.gz: e313cf279ac792d03412d9a4059a8d3d185020a3732ae9ea1e2ff205ef52c592fb71c44c89577af45d18f5fbcc965d3e6652dc92bbf49e0f0c53c47573aed174
7
- data.tar.gz: fd1622e6f39d1d83364579dc31d11f965457202f732fe65dcf2df57b96d5fea8a2d98885c3ab1d1ed5382116625d17f8fe258b4369bfc3a8bda917d2d2695a19
6
+ metadata.gz: 8c4dc17926306904a09e18d34efb3ed1ee913544e6b6b0a77e00519e227e31d2b93c30197ddbd0f3e8313e1055443ec9cd15cc300a22de8e0509a51dcfe20b3a
7
+ data.tar.gz: 1b376bb8a1fae54c63847b054a819ddbf2e3754b98998d61493ffa6b8b2b3923059a88d90a219839c883bd170eefa11a789981d6adb78822dcbe4f531f418d5c
data/README.md CHANGED
@@ -19,19 +19,22 @@ Or install it yourself as:
19
19
 
20
20
  ## Usage
21
21
 
22
+ Define all install, configure, upgrade tasks within a normal **Rakefile**. The
23
+ hooks will then need to just call those tasks:
24
+
22
25
  In **hooks/install**:
23
26
 
24
27
  ```
25
28
  #!/bin/sh
26
29
 
27
30
  apt-get update
28
- apt-get install -qyf ruby
31
+ apt-get install -qyf ruby --no-install-recommends
29
32
  gem install bundler
30
33
 
31
34
  bundle install --local --quiet
32
35
 
33
36
  # Runs the lib/install.rb hook
34
- bundle exec charmkit install
37
+ bundle exec rake dokuwiki:install
35
38
  ```
36
39
 
37
40
  In other hooks call *charmkit* with the execing hook (eg. **hooks/config-changed**)
@@ -39,7 +42,7 @@ In other hooks call *charmkit* with the execing hook (eg. **hooks/config-changed
39
42
  ```
40
43
  #!/bin/sh
41
44
 
42
- bundle exec charmkit config-changed
45
+ bundle exec rake dokuwiki:config_changed
43
46
  ```
44
47
 
45
48
  Same for **hooks/upgrade-charm**
@@ -47,67 +50,85 @@ Same for **hooks/upgrade-charm**
47
50
  ```
48
51
  #!/bin/sh
49
52
 
50
- bundle exec charmkit upgrade-charm
53
+ bundle exec rake dokuwiki:install
54
+ bundle exec rake dokuwiki:config_changed
55
+
51
56
  ```
52
57
 
53
58
  ## Writing Charmkit style hooks
54
59
 
55
- All Charmkit hooks must reside in the charm's toplevel **lib/** directory. Those
56
- files must match the name of the hook you want to assicate to and must end with
57
- a **.rb** extension.
58
-
59
- For example, if my hook runs `bundle exec charmkit config-changed` then in my
60
- **lib/** directory should exist a file named **lib/config-changed.rb**.
61
-
62
- To start, you'll want to inherit from the **Charmkit** class. The class name should also
63
- reflect the name of the hook being executed and should be in a standard Ruby camelcase style.
64
-
65
- See the syntax below for a the **config-changed** hook being run:
60
+ All Charmkit hooks will reside in a normal **Rakefile**.
66
61
 
67
62
  ### Syntax
68
63
 
69
64
  ```ruby
70
65
  require 'charmkit'
71
66
 
72
- class ConfigChanged < Charmkit
73
- plugin :core
74
- plugin :hookenv
67
+ namespace :dokuwiki do
75
68
 
76
- def summon
77
- package [
78
- 'nginx-full', 'php-fpm', 'php-cgi', 'php-curl', 'php-gd', 'php-json',
79
- 'php-mcrypt', 'php-readline', 'php-mbstring', 'php-xml'
80
- ], :update_cache
69
+ desc "Install required apt packages"
70
+ task :install_deps do
71
+ pkgs = [
72
+ 'nginx-full', 'php-fpm', 'php-cgi', 'php-curl', 'php-gd', 'php-json',
73
+ 'php-mcrypt', 'php-readline', 'php-mbstring', 'php-xml'
74
+ ]
75
+ `apt-get update`
76
+ `apt-get install -qyf #{pkgs.join(' ')}`
77
+ end
81
78
 
79
+ desc "Install Dokuwiki"
80
+ task :install => [:install_deps] do
81
+ app_path = `config-get app_path`
82
+ resource_path = `resource-get stable-release`
82
83
  hook_path = ENV['JUJU_CHARM_DIR']
83
- app_path = config 'app_path'
84
84
 
85
- mkdir app_path unless is_dir? app_path
85
+ mkdir_p app_path unless Dir.exists? app_path
86
86
 
87
- release = config 'release'
87
+ `tar xf #{resource_path} -C #{app_path} --strip-components=1`
88
+ rm "#{app_path}/conf/install.php" if File.exists? "#{app_path}/conf/install.php"
89
+ cp "#{hook_path}/templates/acl.auth.php", "#{app_path}/conf/acl.auth.php"
90
+ cp "#{hook_path}/templates/local.php", "#{app_path}/conf/local.php"
91
+ cp "#{hook_path}/templates/plugins.local.php", "#{app_path}/conf/plugin.local.php"
88
92
 
89
- case release
90
- when "stable"
91
- resource_path = resource 'stable-release'
92
- when "development"
93
- resource_path = resource 'development-release'
94
- else
95
- status :blocked, "Unknown release given #{release}"
96
- exit 1
97
- end
93
+ version = File.read "#{app_path}/VERSION"
94
+ `application-version-set '#{version}'`
95
+ `status-set active Dokuwiki Install finished.`
96
+ end
98
97
 
99
- run "tar xf #{resource_path} -C #{app_path} --strip-components=1"
98
+ desc "Configure Dokuwiki"
99
+ task :config_changed do
100
+ app_path = `config-get app_path`
101
+ hook_path = ENV['JUJU_CHARM_DIR']
100
102
 
101
- rm "#{app_path}/conf/install.php" unless !is_file? "#{app_path}/conf/install.php"
103
+ admin_user = `config-get #{admin_user}`
104
+ admin_password = `config-get admin_password`
105
+ admin_name = `config-get admin_name`
106
+ admin_email = `config-get admin_email`
107
+ template "#{hook_path}/templates/users.auth.php",
108
+ "#{app_path}/conf/users.auth.php",
109
+ admin_user: admin_user,
110
+ admin_password: admin_password,
111
+ admin_name: admin_name,
112
+ admin_email: admin_email
113
+
114
+ template "#{hook_path}/templates/vhost.conf",
115
+ "/etc/nginx/sites-enabled/default",
116
+ public_address: unit('public-address'),
117
+ app_path: app_path
118
+
119
+ chown_R 'www-data', 'www-data', app_path
120
+
121
+ # TODO: service :restart, "nginx"
122
+ # TODO: service :restart, "php7.0-fpm"
123
+ `systemctl restart php7.0-fpm`
124
+ `systemctl restart nginx`
125
+ `status-set active Ready`
102
126
  end
103
127
  end
104
128
  ```
105
129
 
106
- The core of Charmkit is relatively small and everything is handled through
107
- plugins. Current plugins are:
108
-
109
- * core - Gives you access to things like *package*, *mkdir_p*, *chown_R*, etc.
110
- * hookenv - Provides access to Juju hook items such as *resource*, *unit*, *juju-log*, etc.
130
+ The core of Charmkit contains a few helpers such as template rendering but
131
+ otherwise kept relatively small.
111
132
 
112
133
  ## Packaging the Charm
113
134
 
data/Rakefile CHANGED
@@ -1,6 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require "yard"
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
7
  task :default => :spec
8
+
9
+ YARD::Rake::YardocTask.new
data/charmkit.gemspec CHANGED
@@ -21,10 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_dependency "tty-command", "~> 0.2.0"
25
-
26
24
  spec.add_development_dependency "bundler", "~> 1.13"
27
25
  spec.add_development_dependency "rake", "~> 10.0"
28
26
  spec.add_development_dependency "rspec", "~> 3.0"
29
27
  spec.add_development_dependency "pry", "~> 0.10.4"
28
+ spec.add_development_dependency "yard"
30
29
  end
@@ -1,76 +1,5 @@
1
1
  # -*- mode:ruby -*-
2
2
 
3
- name "dokuwiki"
4
- summary "Dokuwiki is a simple to use wiki"
5
- desc <<~EOF
6
- DokuWiki is a simple to use and highly versatile Open Source wiki software
7
- that doesn't require a database. It is loved by users for its clean and
8
- readable syntax.
9
- EOF
10
- maintainer 'Adam Stokes <adam.stokes@ubuntu.com>'
11
- license 'MIT'
12
- copyright_holder 'Canonical Ltd.'
13
- copyright_year '2016'
14
- url "https://github.com/battlemidget/juju-charm-dokuwiki.rb"
15
- bugs "https://github.com/battlemidget/juju-charm-dokuwiki.rb/issues"
16
-
17
- series "xenial"
18
- series "trusty"
19
-
20
- # CONFIG ######################################################################
21
- # These items will be exposed to the charm via `config-get`
22
- config "app_path" do
23
- type :string
24
- default "/srv/app"
25
- desc "Where to store dokuwiki source"
26
- end
27
-
28
- config "release" do
29
- type :string
30
- default "/srv/app"
31
- desc "Dokuwiki release"
32
- end
33
-
34
- config "admin_user" do
35
- type :string
36
- default "admin"
37
- desc "Admin username (default: admin)"
38
- end
39
-
40
- config "admin_password" do
41
- type :string
42
- default "5f4dcc3b5aa765d61d8327deb882cf99"
43
- desc "Admin password md5 hash format (default password: password)"
44
- end
45
-
46
- config "admin_name" do
47
- type :string
48
- default "The Admin"
49
- desc "Name of admin"
50
- end
51
-
52
- config "admin_email" do
53
- type :string
54
- default "adam@root.me"
55
- desc "Admin email"
56
- end
57
- # END #########################################################################
58
-
59
- # RESOURCES ###################################################################
60
- # These items will be exposed to the charm via `resource-get`
61
- resource "stable-release" do
62
- type :file
63
- filename "stable.tgz"
64
- desc "Dokuwiki stable"
65
- end
66
-
67
- resource "development-release" do
68
- type :file
69
- filename "deveopment.tgz"
70
- desc "Dokuwiki development"
71
- end
72
- # END #########################################################################
73
-
74
3
  depends_on "nginx-full"
75
4
  depends_on "php-fpm"
76
5
  depends_on "php-cgi"
@@ -0,0 +1,30 @@
1
+ require 'charmkit'
2
+
3
+ class Install < Charmkit
4
+ plugin :core
5
+ plugin :nginx
6
+ plugin :php
7
+
8
+ incant :nginx_install do |nginx|
9
+ ngnix.install
10
+ nginx.set_vhost server_name: config('server_name'),
11
+ application_path: config('app_path')
12
+ end
13
+ incant :php_install do |php|
14
+ php.install version: 7,
15
+ plugins: ['fpm',
16
+ 'cgi',
17
+ 'curl',
18
+ 'gd',
19
+ 'json',
20
+ 'mcrypt',
21
+ 'readline',
22
+ 'mbstring',
23
+ 'xml']
24
+ end
25
+
26
+
27
+ def summon
28
+ log "Running example charm code"
29
+ end
30
+ end
@@ -0,0 +1 @@
1
+ example charm demo using charmkit
@@ -1,9 +1 @@
1
- require 'charmkit'
2
-
3
- class Install < Charmkit
4
- plugin :core
5
-
6
- def summon
7
- puts run 'ls -l /tmp'
8
- end
9
- end
1
+ require 'charmkit/helpers'
data/examples/template.rb CHANGED
@@ -1,6 +1,4 @@
1
1
  require 'charmkit'
2
2
 
3
- template 'templates/user_auth.txt', '/tmp/user_auth.txt',
3
+ template 'examples/templates/user_auth.txt', '/tmp/user_auth.txt',
4
4
  firstname: "joe", lastname: "bob"
5
-
6
- file "/tmp/another-test.txt", content: "owned"
@@ -0,0 +1,25 @@
1
+ require 'erb'
2
+
3
+ module Charmkit
4
+ module Helpers
5
+ # Processes templates
6
+ #
7
+ # template 'my-template.erb' '/etc/config/me.conf', service_name: "nginx"
8
+ class TemplateRenderer
9
+ def self.empty_binding
10
+ binding
11
+ end
12
+
13
+ def self.render(template_content, locals = {})
14
+ b = empty_binding
15
+ locals.each { |k, v| b.local_variable_set(k, v) }
16
+ ERB.new(template_content).result(b)
17
+ end
18
+ end
19
+
20
+ def template(src, dst, **context)
21
+ rendered = TemplateRenderer.render(File.read(src), context)
22
+ File.write(dst, rendered)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ class Charmkit
2
+ module Plugins
3
+ module NGINXPlugin
4
+ module InstanceMethods
5
+ class NGINX
6
+ include Charmkit::Helpers::FS
7
+ def initialize
8
+ if !is_installed? 'nginx-full'
9
+ status :maintenance, 'Installing NGINX'
10
+ package ['nginx-full']
11
+ status :active, "NGINX installed."
12
+ end
13
+ yield(self)
14
+ end
15
+ def install_vhost
16
+ puts "installing vhost"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ register_plugin(:nginx, NGINXPlugin)
22
+ end
23
+ end
@@ -1,4 +1,4 @@
1
- class Charmkit
1
+ module Charmkit
2
2
  def self.version
3
3
  Gem::Version.new VERSION::STRING
4
4
  end
@@ -6,7 +6,7 @@ class Charmkit
6
6
  module VERSION
7
7
  MAJOR = 0
8
8
  MINOR = 3
9
- PATCH = 6
9
+ PATCH = 8
10
10
  PRE = nil
11
11
 
12
12
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
data/lib/charmkit.rb CHANGED
@@ -1,71 +1,8 @@
1
1
  require "charmkit/version"
2
+ require "charmkit/helpers/template"
2
3
 
3
- class Charmkit
4
+ module Charmkit
4
5
  # A generic exception by Charmkit
5
6
  class Error < StandardError; end
6
-
7
- @opts = {}
8
-
9
- module Plugins
10
- @plugins = {}
11
-
12
- def self.load_plugin(name)
13
- unless plugin = @plugins[name]
14
- require "charmkit/plugins/#{name}"
15
- raise Error, "plugin #{name} did not register itself correctly in Charmkit::Plugins" unless plugin = @plugins[name]
16
- end
17
- plugin
18
- end
19
-
20
- def self.register_plugin(name, mod)
21
- @plugins[name] = mod
22
- end
23
-
24
- module Base
25
- module ClassMethods
26
- # Generic options for this class, plugins store their options here.
27
- attr_reader :opts
28
-
29
- def inherited(subclass)
30
- subclass.instance_variable_set(:@opts, opts.dup)
31
- subclass.opts.each do |key, value|
32
- if value.is_a?(Enumerable) && !value.frozen?
33
- subclass.opts[key] = value.dup
34
- end
35
- end
36
- end
37
- def plugin(plugin, *args, &block)
38
- plugin = Plugins.load_plugin(plugin) if plugin.is_a?(Symbol)
39
- plugin.load_dependencies(self, *args, &block) if plugin.respond_to?(:load_dependencies)
40
- self.include(plugin::InstanceMethods) if defined?(plugin::InstanceMethods)
41
- self.extend(plugin::ClassMethods) if defined?(plugin::ClassMethods)
42
- plugin.configure(self, *args, &block) if plugin.respond_to?(:configure)
43
- nil
44
- end
45
-
46
- end
47
- module InstanceMethods
48
- # The class-level options hash. This should probably not be modified at
49
- # the instance level.
50
- def opts
51
- self.class.opts
52
- end
53
-
54
- # This performs the actual work of installing, configuring, restarting
55
- # of services.
56
- #
57
- # class Install < Charmkit
58
- # def summon
59
- # cp "#{ENV['JUJU_CHARM_DIR']}/templates/nginx.conf.tpl",
60
- # "/etc/nginx/nginx.conf"
61
- # end
62
- # end
63
- def summon
64
- end
65
- end
66
- end
67
- end
68
-
69
- extend Plugins::Base::ClassMethods
70
- plugin Plugins::Base
71
7
  end
8
+ extend Charmkit::Helpers
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: charmkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Stokes
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-02 00:00:00.000000000 Z
11
+ date: 2016-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: tty-command
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 0.2.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 0.2.0
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -80,11 +66,24 @@ dependencies:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
68
  version: 0.10.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
83
  description: ''
84
84
  email:
85
85
  - battlemidget@users.noreply.github.com
86
- executables:
87
- - charmkit
86
+ executables: []
88
87
  extensions: []
89
88
  extra_rdoc_files: []
90
89
  files:
@@ -99,16 +98,17 @@ files:
99
98
  - bin/console
100
99
  - bin/setup
101
100
  - charmkit.gemspec
102
- - examples/CKfile
101
+ - examples/Charmkitfile
103
102
  - examples/basic.rb
103
+ - examples/demo/lib/install.rb
104
+ - examples/demo/readme
104
105
  - examples/plugin_loader.rb
105
106
  - examples/template.rb
106
107
  - examples/templates/user_auth.txt
107
- - exe/charmkit
108
108
  - lib/charmkit.rb
109
109
  - lib/charmkit/extend/string_tools.rb
110
- - lib/charmkit/plugins/core.rb
111
- - lib/charmkit/plugins/hookenv.rb
110
+ - lib/charmkit/helpers/template.rb
111
+ - lib/charmkit/plugins/nginx.rb
112
112
  - lib/charmkit/version.rb
113
113
  homepage: http://charmkit.org
114
114
  licenses:
data/exe/charmkit DELETED
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "charmkit/extend/string_tools"
4
-
5
- if ARGV.length > 1
6
- puts "To many arguments, should be one of 'install, config-changed, start, stop, upgrade-charm'"
7
- exit 1
8
- end
9
-
10
- hook_name = ARGV.pop
11
-
12
- if File.exists?("./lib/#{hook_name}.rb")
13
- require "./lib/#{hook_name}"
14
- else
15
- puts "Could not find hook in ./lib/#{hook_name}.rb"
16
- exit 1
17
- end
18
-
19
- puts "Loading #{hook_name}"
20
- m = Object.const_get(hook_name.classify).new
21
- m.summon
@@ -1,84 +0,0 @@
1
- require 'fileutils'
2
- require 'tty-command'
3
- require 'erb'
4
-
5
- class Charmkit
6
- module Plugins
7
- module Core
8
- module InstanceMethods
9
- FileUtils.singleton_methods.each do |m|
10
- define_method m, FileUtils.method(m).to_proc
11
- end
12
-
13
- def file(dst, content:)
14
- File.write(dst, content)
15
- end
16
-
17
- def is_file?(path)
18
- return File.exists? path
19
- end
20
-
21
- def is_dir?(path)
22
- return Dir.exists? path
23
- end
24
-
25
- def cat(src)
26
- return File.read(src)
27
- end
28
-
29
- # Run commands optionally getting it's output, error
30
- #
31
- # run 'ls -l /tmp'
32
- def run(data)
33
- if ENV['DRYRUN']
34
- puts "DRYRUN: #{data}"
35
- else
36
- cmd = TTY::Command.new(printer: :null)
37
- return cmd.run(data)
38
- end
39
- end
40
-
41
-
42
- # Processes templates
43
- #
44
- # template 'my-template.erb' '/etc/config/me.conf', service_name: "nginx"
45
- class TemplateRenderer
46
- def self.empty_binding
47
- binding
48
- end
49
-
50
- def self.render(template_content, locals = {})
51
- b = empty_binding
52
- locals.each { |k, v| b.local_variable_set(k, v) }
53
- ERB.new(template_content).result(b)
54
- end
55
- end
56
-
57
- def template(src, dst, **context)
58
- rendered = TemplateRenderer.render(File.read(src), context)
59
- File.write(dst, rendered)
60
- end
61
-
62
-
63
- # Installs packages
64
- #
65
- # package ['nginx-full'], :update_cache
66
- def package(packages, *opts)
67
- if opts.include?(:update_cache)
68
- run "apt-get update"
69
- end
70
- run "apt-get install -qyf #{packages.join(' ')}"
71
- end
72
-
73
- def is_installed?(package)
74
- begin
75
- run "dpkg -s #{package}" and return true
76
- rescue
77
- return false
78
- end
79
- end
80
- end
81
- end
82
- register_plugin(:core, Core)
83
- end
84
- end
@@ -1,44 +0,0 @@
1
- class Charmkit
2
- module Plugins
3
- module HookEnv
4
- module InstanceMethods
5
- # calls status-set in juju environment
6
- def status(level=:maintenance, msg="")
7
- levels = [:maintenance, :active, :blocked, :waiting]
8
- raise unless levels.include?(level)
9
- run "status-set #{level.to_s} '#{msg}'"
10
- end
11
-
12
- def config(item)
13
- out, err = run "config-get '#{item}'"
14
- return out.chomp
15
- end
16
-
17
- def resource(item)
18
- out, err = run "resource-get '#{item}'"
19
- return out.chomp
20
- end
21
-
22
- def unit(item)
23
- out, err = run "unit-get '#{item}'"
24
- return out.chomp
25
- end
26
-
27
- def action(item)
28
- out, err = run "action-get '#{item}'"
29
- return out.chomp
30
- end
31
-
32
- def action=(item)
33
- out, err = run "action-set '#{item}'"
34
- return out.chomp
35
- end
36
-
37
- def log(msg)
38
- run "juju-log #{msg}"
39
- end
40
- end
41
- end
42
- register_plugin(:hookenv, HookEnv)
43
- end
44
- end