engineyard-visualvm 0.5.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.
- data/.gitignore +5 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +23 -0
- data/README.md +102 -0
- data/Rakefile +76 -0
- data/Vagrantfile +94 -0
- data/bin/ey-visualvm +9 -0
- data/cookbooks/apt/README.md +122 -0
- data/cookbooks/apt/files/default/apt-cacher +9 -0
- data/cookbooks/apt/files/default/apt-cacher.conf +144 -0
- data/cookbooks/apt/files/default/apt-proxy-v2.conf +50 -0
- data/cookbooks/apt/metadata.json +34 -0
- data/cookbooks/apt/metadata.rb +13 -0
- data/cookbooks/apt/providers/repository.rb +73 -0
- data/cookbooks/apt/recipes/cacher-client.rb +44 -0
- data/cookbooks/apt/recipes/cacher.rb +45 -0
- data/cookbooks/apt/recipes/default.rb +50 -0
- data/cookbooks/apt/resources/repository.rb +30 -0
- data/cookbooks/gems/recipes/default.rb +16 -0
- data/cookbooks/java/README.md +102 -0
- data/cookbooks/java/attributes/default.rb +29 -0
- data/cookbooks/java/files/default/java.seed +11 -0
- data/cookbooks/java/metadata.json +50 -0
- data/cookbooks/java/metadata.rb +16 -0
- data/cookbooks/java/recipes/default.rb +21 -0
- data/cookbooks/java/recipes/openjdk.rb +39 -0
- data/cookbooks/java/recipes/sun.rb +93 -0
- data/cookbooks/jruby/attributes/default.rb +2 -0
- data/cookbooks/jruby/recipes/default.rb +24 -0
- data/cookbooks/server/recipes/default.rb +9 -0
- data/cookbooks/server/templates/default/server.sh.erb +27 -0
- data/cookbooks/vagrant_main/recipes/default.rb +4 -0
- data/engineyard-visualvm.gemspec +28 -0
- data/ext/org/jruby/ext/jmx/Agent.java +169 -0
- data/ext/org/jruby/ext/jmx/JavaHome.java +7 -0
- data/ext/org/jruby/ext/jmx/RMIServerSocketFactoryImpl.java +37 -0
- data/lib/engineyard-visualvm.rb +8 -0
- data/lib/engineyard-visualvm/agent.jar +0 -0
- data/lib/engineyard-visualvm/cli.rb +205 -0
- data/lib/engineyard-visualvm/version.rb +11 -0
- data/spec/engineyard-visualvm_spec.rb +164 -0
- data/spec/spec_helper.rb +30 -0
- metadata +154 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 Engine Yard, Inc.
|
3
|
+
# See the file LICENSE.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
source "http://rubygems.org"
|
8
|
+
|
9
|
+
group :development do
|
10
|
+
gem "vagrant"
|
11
|
+
gem "chef"
|
12
|
+
|
13
|
+
gem "jmx", :platform => :jruby
|
14
|
+
end
|
15
|
+
|
16
|
+
gemspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
engineyard-visualvm is provided under the terms of the MIT license.
|
2
|
+
|
3
|
+
engineyard-visualvm (c) 2011 Engine Yard, Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person
|
6
|
+
obtaining a copy of this software and associated documentation files
|
7
|
+
(the "Software"), to deal in the Software without restriction,
|
8
|
+
including without limitation the rights to use, copy, modify, merge,
|
9
|
+
publish, distribute, sublicense, and/or sell copies of the Software,
|
10
|
+
and to permit persons to whom the Software is furnished to do so,
|
11
|
+
subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
20
|
+
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
21
|
+
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
22
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# engineyard-visualvm
|
2
|
+
|
3
|
+
`engineyard-visualvm` is a command-line utility for use with JRuby and
|
4
|
+
Engine Yard Cloud that makes it easy to connect Visual VM on a desktop
|
5
|
+
to a running JRuby or Java process in EY Cloud.
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
To start Visual VM on your local machine to an already-running process:
|
10
|
+
|
11
|
+
# Connect by EY Cloud environment and account
|
12
|
+
$ ey-visualvm start --environment=jruby --account=example
|
13
|
+
|
14
|
+
(If you need to see a list of available environments and their
|
15
|
+
associated accounts, use the `ey environments` command from the
|
16
|
+
[engineyard](/engineyard/engineyard) gem.)
|
17
|
+
|
18
|
+
You can also use the `engineyard-visualvm` gem to connect Visual VM to
|
19
|
+
any host where you have an available ssh connection.
|
20
|
+
|
21
|
+
# Connect by hostname:
|
22
|
+
$ ey-visualvm start --host=deploy@example.com
|
23
|
+
|
24
|
+
To connect to a server, the server must be booted with some additional
|
25
|
+
JVM arguments. These can be generated on the server side with:
|
26
|
+
|
27
|
+
$ ey-visualvm jvmargs
|
28
|
+
-Dorg.jruby.ext.jmx.agent.port=5900 -javaagent:/path/to/engineyard-visualvm/agent.jar
|
29
|
+
|
30
|
+
The server JVM binds to the loopback interface and listens on port
|
31
|
+
5900 by default. If you want to use a different interface and/or port
|
32
|
+
than the default, pass `--host=<host-or-ip>` or `--port=<port>` to
|
33
|
+
`ey-visualvm jvmargs`.
|
34
|
+
|
35
|
+
## Acceptance Test
|
36
|
+
|
37
|
+
To verify that a JMX connection to a server can be established, we can
|
38
|
+
use Vagrant and Chef to bootstrap a VM, start a JRuby process with JMX
|
39
|
+
enabled, create an ssh tunnel to the Vagrant box, and use the `jmx`
|
40
|
+
gem to connect to it from Ruby code. The code for this looks like
|
41
|
+
this:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
require 'childprocess'
|
45
|
+
require 'jmx'
|
46
|
+
|
47
|
+
sh "vagrant ssh_config > ssh_config.tmp"
|
48
|
+
sh "vagrant up"
|
49
|
+
at_exit { sh "vagrant halt"; rm_f "ssh_config.tmp" }
|
50
|
+
|
51
|
+
@host, @port = 'localhost', 5900
|
52
|
+
|
53
|
+
ssh = ChildProcess.build("ssh", "-NL", "#{@port}:#{@host}:#{@port}", "-F", "ssh_config.tmp", "default")
|
54
|
+
ssh.start
|
55
|
+
at_exit { ssh.stop }
|
56
|
+
|
57
|
+
require 'engineyard-visualvm'
|
58
|
+
include EngineYard::VisualVM::Helpers
|
59
|
+
server = JMX::MBeanServer.new jmx_service_url
|
60
|
+
|
61
|
+
runtime_config_name = server.query_names('org.jruby:type=Runtime,name=*,service=Config').to_a.first
|
62
|
+
puts "Found runtime #{runtime_config_name}"
|
63
|
+
runtime_config = server[runtime_config_name]
|
64
|
+
puts "Runtime version: #{runtime_config['VersionString']}"
|
65
|
+
puts "OK"
|
66
|
+
```
|
67
|
+
|
68
|
+
To try it yourself, do the following:
|
69
|
+
|
70
|
+
# Ensure you have vagrant and jmx installed
|
71
|
+
$ bundle install
|
72
|
+
|
73
|
+
# Run the acceptance test
|
74
|
+
$ rake acceptance
|
75
|
+
vagrant ssh_config > ssh_config.tmp
|
76
|
+
vagrant up
|
77
|
+
# ... bunch of output as the VM boots and Chef runs...
|
78
|
+
[default] [Tue, 22 Nov 2011 19:52:41 -0800] INFO: execute[start server] ran successfully
|
79
|
+
[Tue, 22 Nov 2011 19:52:41 -0800] INFO: Chef Run complete in 35.157236 seconds
|
80
|
+
[Tue, 22 Nov 2011 19:52:41 -0800] INFO: Running report handlers
|
81
|
+
[Tue, 22 Nov 2011 19:52:41 -0800] INFO: Report handlers complete
|
82
|
+
: stdout
|
83
|
+
Found runtime org.jruby:type=Runtime,name=25292276,service=Config
|
84
|
+
Runtime version: jruby 1.6.5 (ruby-1.8.7-p330) (2011-10-25 9dcd388) (Java HotSpot(TM) Client VM 1.6.0_26) [linux-i386-java]
|
85
|
+
OK
|
86
|
+
vagrant halt
|
87
|
+
[default] Attempting graceful shutdown of linux...
|
88
|
+
rm -f ssh_config.tmp
|
89
|
+
|
90
|
+
## Bits and Pieces
|
91
|
+
|
92
|
+
- Gem: `gem install engineyard-visualvm`
|
93
|
+
- Source: https://github.com/engineyard/engineyard-visualvm
|
94
|
+
- License: MIT; see LICENSE.txt for details.
|
95
|
+
|
96
|
+
## TODO
|
97
|
+
|
98
|
+
- Prompt for a JVM to connect to if more than one JVM process is
|
99
|
+
running on the server
|
100
|
+
- Data collected by `jstatd` is not yet supported, so things like the
|
101
|
+
Visual GC tab are not supported yet.
|
102
|
+
- Additional utilities to make use of the JMX connection remotely
|
data/Rakefile
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 Engine Yard, Inc.
|
3
|
+
# See the file LICENSE.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require "bundler/gem_tasks"
|
8
|
+
require "rake/clean"
|
9
|
+
|
10
|
+
desc "Compile and jar the agent extension class"
|
11
|
+
begin
|
12
|
+
require 'ant'
|
13
|
+
jar_file = "lib/engineyard-visualvm/agent.jar"
|
14
|
+
directory "pkg/classes"
|
15
|
+
CLEAN << "pkg"
|
16
|
+
|
17
|
+
file jar_file => FileList['ext/**/*.java', 'pkg/classes'] do
|
18
|
+
rm_rf FileList['pkg/classes/**/*']
|
19
|
+
ant.javac :srcdir => "ext", :destdir => "pkg/classes",
|
20
|
+
:source => "1.5", :target => "1.5", :debug => true,
|
21
|
+
:classpath => "${java.class.path}:${sun.boot.class.path}",
|
22
|
+
:includeantRuntime => false
|
23
|
+
|
24
|
+
ant.jar :basedir => "pkg/classes", :destfile => jar_file, :includes => "**/*.class" do
|
25
|
+
manifest do
|
26
|
+
attribute :name => "Premain-Class", :value => "org.jruby.ext.jmx.Agent"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :jar => jar_file
|
32
|
+
rescue LoadError
|
33
|
+
task :jar do
|
34
|
+
puts "Run 'jar' with JRuby to re-compile the agent extension class"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Make sure jar gets compiled before the gem is built
|
39
|
+
task :build => :jar
|
40
|
+
|
41
|
+
task :default => :spec
|
42
|
+
|
43
|
+
require 'rspec/core/rake_task'
|
44
|
+
RSpec::Core::RakeTask.new
|
45
|
+
|
46
|
+
task :spec => :jar
|
47
|
+
|
48
|
+
begin
|
49
|
+
require 'childprocess'
|
50
|
+
require 'jmx'
|
51
|
+
task :acceptance => :build do
|
52
|
+
sh "vagrant ssh_config > ssh_config.tmp"
|
53
|
+
sh "vagrant up"
|
54
|
+
at_exit { sh "vagrant halt"; rm_f "ssh_config.tmp" }
|
55
|
+
|
56
|
+
@host, @port = 'localhost', 5900
|
57
|
+
|
58
|
+
ssh = ChildProcess.build("ssh", "-NL", "#{@port}:#{@host}:#{@port}", "-F", "ssh_config.tmp", "default")
|
59
|
+
ssh.start
|
60
|
+
at_exit { ssh.stop }
|
61
|
+
|
62
|
+
require 'engineyard-visualvm'
|
63
|
+
include EngineYard::VisualVM::Helpers
|
64
|
+
server = JMX::MBeanServer.new jmx_service_url
|
65
|
+
|
66
|
+
runtime_config_name = server.query_names('org.jruby:type=Runtime,name=*,service=Config').to_a.first
|
67
|
+
puts "Found runtime #{runtime_config_name}"
|
68
|
+
runtime_config = server[runtime_config_name]
|
69
|
+
puts "Runtime version: #{runtime_config['VersionString']}"
|
70
|
+
puts "OK"
|
71
|
+
end
|
72
|
+
rescue LoadError
|
73
|
+
task :acceptance do
|
74
|
+
fail "Run 'acceptance' with JRuby to actually run the test"
|
75
|
+
end
|
76
|
+
end
|
data/Vagrantfile
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
Vagrant::Config.run do |config|
|
2
|
+
# All Vagrant configuration is done here. The most common configuration
|
3
|
+
# options are documented and commented below. For a complete reference,
|
4
|
+
# please see the online documentation at vagrantup.com.
|
5
|
+
|
6
|
+
# Every Vagrant virtual environment requires a box to build off of.
|
7
|
+
config.vm.box = "base"
|
8
|
+
|
9
|
+
# The url from where the 'config.vm.box' box will be fetched if it
|
10
|
+
# doesn't already exist on the user's system.
|
11
|
+
# config.vm.box_url = "http://domain.com/path/to/above.box"
|
12
|
+
|
13
|
+
# Boot with a GUI so you can see the screen. (Default is headless)
|
14
|
+
# config.vm.boot_mode = :gui
|
15
|
+
|
16
|
+
# Assign this VM to a host only network IP, allowing you to access it
|
17
|
+
# via the IP.
|
18
|
+
config.vm.network "33.33.33.10"
|
19
|
+
|
20
|
+
# Forward a port from the guest to the host, which allows for outside
|
21
|
+
# computers to access the VM, whereas host only networking does not.
|
22
|
+
# config.vm.forward_port "http", 80, 8080
|
23
|
+
|
24
|
+
# Share an additional folder to the guest VM. The first argument is
|
25
|
+
# an identifier, the second is the path on the guest to mount the
|
26
|
+
# folder, and the third is the path on the host to the actual folder.
|
27
|
+
# config.vm.share_folder "v-data", "/vagrant_data", "../data"
|
28
|
+
|
29
|
+
# Enable provisioning with Puppet stand alone. Puppet manifests
|
30
|
+
# are contained in a directory path relative to this Vagrantfile.
|
31
|
+
# You will need to create the manifests directory and a manifest in
|
32
|
+
# the file base.pp in the manifests_path directory.
|
33
|
+
#
|
34
|
+
# An example Puppet manifest to provision the message of the day:
|
35
|
+
#
|
36
|
+
# # group { "puppet":
|
37
|
+
# # ensure => "present",
|
38
|
+
# # }
|
39
|
+
# #
|
40
|
+
# # File { owner => 0, group => 0, mode => 0644 }
|
41
|
+
# #
|
42
|
+
# # file { '/etc/motd':
|
43
|
+
# # content => "Welcome to your Vagrant-built virtual machine!
|
44
|
+
# # Managed by Puppet.\n"
|
45
|
+
# # }
|
46
|
+
#
|
47
|
+
# config.vm.provision :puppet do |puppet|
|
48
|
+
# puppet.manifests_path = "manifests"
|
49
|
+
# puppet.manifest_file = "base.pp"
|
50
|
+
# end
|
51
|
+
|
52
|
+
# Enable provisioning with chef solo, specifying a cookbooks path (relative
|
53
|
+
# to this Vagrantfile), and adding some recipes and/or roles.
|
54
|
+
#
|
55
|
+
# config.vm.provision :chef_solo do |chef|
|
56
|
+
# chef.cookbooks_path = "cookbooks"
|
57
|
+
# chef.add_recipe "mysql"
|
58
|
+
# chef.add_role "web"
|
59
|
+
#
|
60
|
+
# # You may also specify custom JSON attributes:
|
61
|
+
# chef.json = { :mysql_password => "foo" }
|
62
|
+
# end
|
63
|
+
config.vm.provision :chef_solo do |chef|
|
64
|
+
chef.cookbooks_path = "cookbooks"
|
65
|
+
chef.add_recipe("vagrant_main")
|
66
|
+
end
|
67
|
+
|
68
|
+
# Enable provisioning with chef server, specifying the chef server URL,
|
69
|
+
# and the path to the validation key (relative to this Vagrantfile).
|
70
|
+
#
|
71
|
+
# The Opscode Platform uses HTTPS. Substitute your organization for
|
72
|
+
# ORGNAME in the URL and validation key.
|
73
|
+
#
|
74
|
+
# If you have your own Chef Server, use the appropriate URL, which may be
|
75
|
+
# HTTP instead of HTTPS depending on your configuration. Also change the
|
76
|
+
# validation key to validation.pem.
|
77
|
+
#
|
78
|
+
# config.vm.provision :chef_client do |chef|
|
79
|
+
# chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
|
80
|
+
# chef.validation_key_path = "ORGNAME-validator.pem"
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# If you're using the Opscode platform, your validator client is
|
84
|
+
# ORGNAME-validator, replacing ORGNAME with your organization name.
|
85
|
+
#
|
86
|
+
# IF you have your own Chef Server, the default validation client name is
|
87
|
+
# chef-validator, unless you changed the configuration.
|
88
|
+
#
|
89
|
+
# chef.validation_client_name = "ORGNAME-validator"
|
90
|
+
end
|
91
|
+
|
92
|
+
# Local Variables:
|
93
|
+
# mode: ruby
|
94
|
+
# End:
|
data/bin/ey-visualvm
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
Description
|
2
|
+
===========
|
3
|
+
|
4
|
+
This cookbook includes recipes to execute apt-get update to ensure the local APT package cache is up to date or manage apt-cacher and cacher clients. It also includes a LWRP for managing APT repositories in /etc/apt/sources.list.d.
|
5
|
+
|
6
|
+
Recipes
|
7
|
+
=======
|
8
|
+
|
9
|
+
default
|
10
|
+
-------
|
11
|
+
|
12
|
+
This recipe installs the `update-notifier-common` package to provide the timestamp file used to only run `apt-get update` if the cache is less than one day old.
|
13
|
+
|
14
|
+
This recipe should appear first in the run list of Debian or Ubuntu nodes to ensure that the package cache is up to date before managing any `package` resources with Chef.
|
15
|
+
|
16
|
+
This recipe also sets up a local cache directory for preseeding packages.
|
17
|
+
|
18
|
+
cacher
|
19
|
+
------
|
20
|
+
|
21
|
+
Installs the apt-cacher package and service so the system can provide APT caching. You can check the usage report at http://{hostname}:3142/report. The cacher recipe includes the `cacher-client` recipe, so it helps seed itself.
|
22
|
+
|
23
|
+
cacher-client
|
24
|
+
-------------
|
25
|
+
Configures the node to use the apt-cacher server as a client.
|
26
|
+
|
27
|
+
Resources/Providers
|
28
|
+
===================
|
29
|
+
|
30
|
+
This LWRP provides an easy way to manage additional APT repositories. Adding a new repository will notify running the `execute[apt-get-update]` resource.
|
31
|
+
|
32
|
+
# Actions
|
33
|
+
|
34
|
+
- :add: creates a repository file and builds the repository listing
|
35
|
+
- :remove: removes the repository file
|
36
|
+
|
37
|
+
# Attribute Parameters
|
38
|
+
|
39
|
+
- repo_name: name attribute. The name of the channel to discover
|
40
|
+
- uri: the base of the Debian distribution
|
41
|
+
- distribution: this is usually your release's codename...ie something like `karmic`, `lucid` or `maverick`
|
42
|
+
- components: package groupings..when it doubt use `main`
|
43
|
+
- deb_src: whether or not to add the repository as a source repo as well
|
44
|
+
- key_server: the GPG keyserver where the key for the repo should be retrieved
|
45
|
+
- key: if a `key_server` is provided, this is assumed to be the fingerprint, otherwise it is the URI to the GPG key for the repo
|
46
|
+
|
47
|
+
# Examples
|
48
|
+
|
49
|
+
# add the Zenoss repo
|
50
|
+
apt_repository "zenoss" do
|
51
|
+
uri "http://dev.zenoss.org/deb"
|
52
|
+
components ["main","stable"]
|
53
|
+
action :add
|
54
|
+
end
|
55
|
+
|
56
|
+
# add the Nginx PPA; grab key from keyserver
|
57
|
+
apt_repository "nginx-php" do
|
58
|
+
uri "http://ppa.launchpad.net/nginx/php5/ubuntu"
|
59
|
+
distribution node['lsb']['codename']
|
60
|
+
components ["main"]
|
61
|
+
keyserver "keyserver.ubuntu.com"
|
62
|
+
key "C300EE8C"
|
63
|
+
action :add
|
64
|
+
end
|
65
|
+
|
66
|
+
# add the Cloudkick Repo
|
67
|
+
apt_repository "cloudkick" do
|
68
|
+
uri "http://packages.cloudkick.com/ubuntu"
|
69
|
+
distribution node['lsb']['codename']
|
70
|
+
components ["main"]
|
71
|
+
key "http://packages.cloudkick.com/cloudkick.packages.key"
|
72
|
+
action :add
|
73
|
+
end
|
74
|
+
|
75
|
+
# remove Zenoss repo
|
76
|
+
apt_repository "zenoss" do
|
77
|
+
action :remove
|
78
|
+
end
|
79
|
+
|
80
|
+
Usage
|
81
|
+
=====
|
82
|
+
|
83
|
+
Put `recipe[apt]` first in the run list. If you have other recipes that you want to use to configure how apt behaves, like new sources, notify the execute resource to run, e.g.:
|
84
|
+
|
85
|
+
template "/etc/apt/sources.list.d/my_apt_sources.list" do
|
86
|
+
notifies :run, resources(:execute => "apt-get update"), :immediately
|
87
|
+
end
|
88
|
+
|
89
|
+
The above will run during execution phase since it is a normal template resource, and should appear before other package resources that need the sources in the template.
|
90
|
+
|
91
|
+
Put `recipe[apt::cacher]` in the run_list for a server to provide APT caching and add `recipe[apt::cacher-client]` on the rest of the Debian-based nodes to take advantage of the caching server.
|
92
|
+
|
93
|
+
Changes
|
94
|
+
=======
|
95
|
+
|
96
|
+
## v1.2.0:
|
97
|
+
|
98
|
+
* COOK-136: Limit apt-get update to one run per day unless notified.
|
99
|
+
* COOK-471: ignore failure on apt-get update
|
100
|
+
* COOK-533: add support for deb and `deb_src` repos with `apt_repository`
|
101
|
+
|
102
|
+
License and Author
|
103
|
+
==================
|
104
|
+
|
105
|
+
Author:: Joshua Timberman (<joshua@opscode.com>)
|
106
|
+
Author:: Matt Ray (<matt@opscode.com>)
|
107
|
+
Author:: Seth Chisamore (<schisamo@opscode.com>)
|
108
|
+
|
109
|
+
Copyright 2009-2011 Opscode, Inc.
|
110
|
+
|
111
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
112
|
+
you may not use this file except in compliance with the License.
|
113
|
+
You may obtain a copy of the License at
|
114
|
+
|
115
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
116
|
+
|
117
|
+
Unless required by applicable law or agreed to in writing, software
|
118
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
119
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
120
|
+
See the License for the specific language governing permissions and
|
121
|
+
limitations under the License.
|
122
|
+
|