instrumental_tools 1.0.0 → 1.1.3
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 +4 -4
- data/BUILD.md +15 -0
- data/CHANGELOG.md +17 -1
- data/CUSTOM_METRICS.md +4 -0
- data/INSTALL.md +12 -7
- data/README.md +2 -2
- data/Rakefile +202 -64
- data/TEST.md +18 -0
- data/bin/instrument_server +31 -15
- data/chef/.kitchen.yml +10 -1
- data/chef/instrumental_tools/attributes/default.rb +29 -2
- data/chef/instrumental_tools/recipes/default.rb +188 -17
- data/chef/instrumental_tools/templates/default/instrument_server.erb +46 -0
- data/chef/instrumental_tools/templates/{instrumental.yml.erb → default/instrumental.yml.erb} +6 -6
- data/chef/omnibus.sh +27 -0
- data/conf/instrumental.yml +6 -6
- data/examples/README.md +1 -0
- data/examples/redis/README.md +10 -0
- data/examples/redis/redis_info.sh +10 -0
- data/ext/Rakefile +1 -0
- data/ext/mkrf_conf.rb +18 -0
- data/instrumental_tools.gemspec +8 -2
- data/lib/instrumental_tools/metric_script_executor.rb +45 -6
- data/lib/instrumental_tools/server_controller.rb +4 -1
- data/lib/instrumental_tools/system_inspector.rb +3 -0
- data/lib/instrumental_tools/system_inspector/win32.rb +85 -0
- data/lib/instrumental_tools/version.rb +1 -1
- data/test/integration/default/serverspec/instrumental_tools_spec.rb +32 -16
- data/win32/Makefile +18 -0
- data/win32/installer.nsis.erb +242 -0
- data/win32/logo.ico +0 -0
- data/win32/src/instrumental/InstrumentServerProcess.cs +147 -0
- data/win32/src/instrumental/InstrumentServerProcessWorker.cs +89 -0
- data/win32/src/instrumental/InstrumentServerService.cs +146 -0
- data/win32/src/instrumental/InstrumentServerServiceInstaller.cs +60 -0
- metadata +36 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a27d4c996ef62de7323120f50798c5162414783
|
4
|
+
data.tar.gz: e9cef00763a959a8038d740d899e9ff89d1a1c45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4f571bc227d0cf8e2668337542bfb8de90ac11e57964decb105457257949483befd35f3ee1c281b6db33ca64a48deedf803e2f95535313427e2e357df2621ca
|
7
|
+
data.tar.gz: 670224fe2b26100ea685880bae31f9440f0d24a39604f3f27779dc0c71dd2bdc333f784e844c9e1d5bce37aec3472abda5adccd8402f6bcab86dd85fb421628d
|
data/BUILD.md
CHANGED
@@ -48,3 +48,18 @@ rake package:osx:tarball
|
|
48
48
|
```
|
49
49
|
|
50
50
|
On release, the tarball should be uploaded to the Github releases page and linked to from the main README.md.
|
51
|
+
|
52
|
+
## `exe` packages
|
53
|
+
|
54
|
+
In order to build the Windows installer, you'll need to have [NSIS](http://nsis.sourceforge.net/Main_Page) and [Mono](http://www.mono-project.com/) installed. If you're using Mac OS X, run the following commands:
|
55
|
+
|
56
|
+
```
|
57
|
+
brew install makensis
|
58
|
+
brew install mono
|
59
|
+
```
|
60
|
+
|
61
|
+
To build the installer:
|
62
|
+
|
63
|
+
```
|
64
|
+
rake package:win32:package
|
65
|
+
```
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,20 @@
|
|
1
|
-
### 1.
|
1
|
+
### 1.1.3 [August 17, 2015]
|
2
|
+
* Fix gem installation of tools
|
3
|
+
* Use latest Instrumental Agent
|
4
|
+
|
5
|
+
### 1.1.1 [August 3rd, 2015]
|
6
|
+
* Defaults to secure protocol when connecting
|
7
|
+
|
8
|
+
### 1.1.0 [August 3rd, 2015]
|
9
|
+
* Windows support
|
10
|
+
* Windows installer
|
11
|
+
* Updated Chef scripts to use remote_file
|
12
|
+
* Updated Chef script to support Windows
|
13
|
+
* Use latest `instrumental_agent` gem
|
14
|
+
* Add Powershell integration for custom metrics
|
15
|
+
* Process now disconnects from Instrumental when idling between reports
|
16
|
+
|
17
|
+
### 1.0.0 [May 21st, 2015]
|
2
18
|
* Configurable pid and log file locations
|
3
19
|
* Pid and log file default to $HOME
|
4
20
|
* Process control commands do not require API key
|
data/CUSTOM_METRICS.md
CHANGED
@@ -62,3 +62,7 @@ You may output error information on `STDERR` of your process, and it will be out
|
|
62
62
|
### Timeouts
|
63
63
|
|
64
64
|
Your script is responsible for managing timeouts. The `instrument_server` process will not attempt to terminate your process for you.
|
65
|
+
|
66
|
+
### Powershell Integration
|
67
|
+
|
68
|
+
Windows administrators may create Powershell scripts following the above guidelines. You should write your output to the STDOUT stream using `Write-Output`. The file extension of the Powershell script must be `.ps1` in order for it to be executd by the Instrument Server process.
|
data/INSTALL.md
CHANGED
@@ -4,13 +4,14 @@
|
|
4
4
|
|
5
5
|
Prebuilt `deb` and `rpm` packages are available via the [packagecloud.io](https://packagecloud.io/) service. These files are also available to download directly:
|
6
6
|
|
7
|
-
* 64-bit Debian package (Ubuntu, Debian) [https://s3.amazonaws.com/instrumental-tools/1.
|
8
|
-
* 32-bit Debian package (Ubuntu, Debian) [https://s3.amazonaws.com/instrumental-tools/1.
|
9
|
-
* 64-bit RPM package (RHEL, Amazon AMI) [https://s3.amazonaws.com/instrumental-tools/1.
|
10
|
-
* 32-bit RPM package (RHEL, Amazon AMI) [https://s3.amazonaws.com/instrumental-tools/1.
|
11
|
-
* 64-bit Linux tarball (CoreOS, etc.) [https://s3.amazonaws.com/instrumental-tools/1.
|
12
|
-
* 32-bit Linux tarball (CoreOS, etc.) [https://s3.amazonaws.com/instrumental-tools/1.
|
13
|
-
*
|
7
|
+
* 64-bit Debian package (Ubuntu, Debian) [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_amd64.deb](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_amd64.deb)
|
8
|
+
* 32-bit Debian package (Ubuntu, Debian) [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_i386.deb](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_i386.deb)
|
9
|
+
* 64-bit RPM package (RHEL, Amazon AMI) [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_amd64.rpm](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_amd64.rpm)
|
10
|
+
* 32-bit RPM package (RHEL, Amazon AMI) [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_i386.rpm](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_i386.rpm)
|
11
|
+
* 64-bit Linux tarball (CoreOS, etc.) [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_linux-x86_64.tar.gz](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_linux-x86_64.tar.gz)
|
12
|
+
* 32-bit Linux tarball (CoreOS, etc.) [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_linux-x86.tar.gz](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_linux-x86.tar.gz)
|
13
|
+
* Windows installer [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_win32.exe](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_win32.exe)
|
14
|
+
* 64-bit Mac OS X tarball [https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_osx.tar.gz](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_osx.tar.gz)
|
14
15
|
|
15
16
|
# Ubuntu
|
16
17
|
|
@@ -45,6 +46,10 @@ sudo tar -zxvf ./instrumental-tools_1.0.0_linux-x86_64.tar.gz -C /opt/instrument
|
|
45
46
|
sudo cp /opt/instrumental-tools/etc/instrumental.yml /etc/
|
46
47
|
```
|
47
48
|
|
49
|
+
# Windows
|
50
|
+
|
51
|
+
Download the [installer](https://s3.amazonaws.com/instrumental-tools/1.1.2/instrumental-tools_1.1.2_win32.exe) and run it, adding in your API key when prompted.
|
52
|
+
|
48
53
|
# RubyGems
|
49
54
|
|
50
55
|
```sh
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@ A collection of tools for monitoring servers with Instrumental ([www.instrumenta
|
|
4
4
|
|
5
5
|
## Operating System Support
|
6
6
|
|
7
|
-
`instrumental_tools` is currently officially supported on 32-bit and 64-bit Linux,
|
7
|
+
`instrumental_tools` is currently officially supported on 32-bit and 64-bit Linux, Windows systems and Mac OS X. There are prebuilt packages available for Debian, RHEL and Win32 systems.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -90,7 +90,7 @@ something like this in your capistrano configuration:
|
|
90
90
|
namespaces[:instrumental].tasks[:restart_instrument_server].options[:roles] = [:web, :worker]
|
91
91
|
```
|
92
92
|
|
93
|
-
###
|
93
|
+
### NOTES
|
94
94
|
|
95
95
|
Mac OS users: Due to a bug in Ruby, instrument_server can occasionally deadlock ([bug report](http://bugs.ruby-lang.org/issues/5811)).
|
96
96
|
|
data/Rakefile
CHANGED
@@ -2,9 +2,13 @@
|
|
2
2
|
require 'bundler/gem_tasks'
|
3
3
|
require 'etc'
|
4
4
|
require 'fileutils'
|
5
|
+
require 'find'
|
5
6
|
require 'socket'
|
7
|
+
require 'tempfile'
|
6
8
|
require 'yaml'
|
7
9
|
|
10
|
+
task :default => 'build'
|
11
|
+
|
8
12
|
PACKAGE_CATEGORY = "Utilities"
|
9
13
|
PACKAGECLOUD_REPO = "expectedbehavior/instrumental"
|
10
14
|
CONFIG_DIR = "conf"
|
@@ -14,7 +18,7 @@ GEMSPEC = Bundler::GemHelper.instance.gemspec
|
|
14
18
|
SPEC_PATH = Bundler::GemHelper.instance.spec_path
|
15
19
|
PACKAGE_NAME = GEMSPEC.name.gsub("_", "-") # Debian packages cannot include _ in name
|
16
20
|
VERSION = GEMSPEC.version
|
17
|
-
TRAVELING_RUBY_VERSION = "
|
21
|
+
TRAVELING_RUBY_VERSION = "20150517-2.1.6"
|
18
22
|
TRAVELING_RUBY_FILE = "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-%s.tar.gz"
|
19
23
|
DEST_DIR = File.join("/opt/", PACKAGE_NAME)
|
20
24
|
PACKAGE_OUTPUT_NAME = [PACKAGE_NAME, VERSION].join("_")
|
@@ -33,46 +37,81 @@ EXTRA_ARGS = {
|
|
33
37
|
}
|
34
38
|
|
35
39
|
|
40
|
+
WRAPPER_SCRIPT_SHELL = <<-EOSCRIPT
|
41
|
+
#!/bin/bash
|
42
|
+
set -e
|
43
|
+
|
44
|
+
# Figure out where this script is located.
|
45
|
+
SELFDIR="`dirname \"$0\"`"
|
46
|
+
SELFDIR="`cd \"$SELFDIR\" && pwd`"
|
47
|
+
|
48
|
+
# Tell Bundler where the Gemfile and gems are.
|
49
|
+
export BUNDLE_GEMFILE="$SELFDIR/lib/vendor/Gemfile"
|
50
|
+
unset BUNDLE_IGNORE_CONFIG
|
51
|
+
|
52
|
+
# Run the actual app using the bundled Ruby interpreter.
|
53
|
+
exec "$SELFDIR/lib/ruby/bin/ruby" -rbundler/setup "$SELFDIR/lib/app/%s" "$@"
|
54
|
+
EOSCRIPT
|
55
|
+
|
56
|
+
WRAPPER_SCRIPT_BAT = <<-EOSCRIPT
|
57
|
+
@echo off
|
58
|
+
|
59
|
+
:: Tell Bundler where the Gemfile and gems are.
|
60
|
+
set "BUNDLE_GEMFILE=%%~dp0\\lib\\vendor\\Gemfile"
|
61
|
+
set BUNDLE_IGNORE_CONFIG=
|
62
|
+
|
63
|
+
:: Run the actual app using the bundled Ruby interpreter, with Bundler activated.
|
64
|
+
@"%%~dp0\\lib\\ruby\\bin\\ruby.bat" -rbundler/setup "%%~dp0\\lib\\app\\%s" %%*
|
65
|
+
EOSCRIPT
|
66
|
+
|
36
67
|
ARCHITECTURES = {
|
37
68
|
'linux-x86' => {
|
38
69
|
runtime: TRAVELING_RUBY_FILE % "linux-x86",
|
39
70
|
arch: "i386",
|
40
71
|
packages: %w{deb rpm},
|
41
72
|
platform: "linux",
|
42
|
-
packagecloud: true
|
73
|
+
packagecloud: true,
|
74
|
+
wrapper: WRAPPER_SCRIPT_SHELL,
|
75
|
+
separator: '/',
|
76
|
+
package_from_compressed: true,
|
77
|
+
dest_dir: DEST_DIR
|
43
78
|
},
|
44
79
|
'linux-x86_64' => {
|
45
80
|
runtime: TRAVELING_RUBY_FILE % "linux-x86_64",
|
46
81
|
arch: "amd64",
|
47
82
|
packages: %w{deb rpm},
|
48
83
|
platform: "linux",
|
49
|
-
packagecloud: true
|
84
|
+
packagecloud: true,
|
85
|
+
wrapper: WRAPPER_SCRIPT_SHELL,
|
86
|
+
separator: '/',
|
87
|
+
package_from_compressed: true,
|
88
|
+
dest_dir: DEST_DIR
|
50
89
|
},
|
51
90
|
'osx' => {
|
52
91
|
runtime: TRAVELING_RUBY_FILE % "osx",
|
53
92
|
arch: "x86_64",
|
54
93
|
packages: [],
|
55
94
|
platform: "darwin",
|
56
|
-
packagecloud: false
|
95
|
+
packagecloud: false,
|
96
|
+
wrapper: WRAPPER_SCRIPT_SHELL,
|
97
|
+
separator: '/',
|
98
|
+
dest_dir: DEST_DIR
|
99
|
+
},
|
100
|
+
'win32' => {
|
101
|
+
runtime: TRAVELING_RUBY_FILE % "win32",
|
102
|
+
packages: %w{exe},
|
103
|
+
packagecloud: false,
|
104
|
+
compress_format: 'zip',
|
105
|
+
wrapper: WRAPPER_SCRIPT_BAT,
|
106
|
+
separator: '\\',
|
107
|
+
extension: '.bat',
|
108
|
+
package_from_compressed: false,
|
109
|
+
dest_dir: ''
|
57
110
|
}
|
58
111
|
}
|
59
112
|
|
60
113
|
|
61
|
-
WRAPPER_SCRIPT = <<-EOSCRIPT
|
62
|
-
#!/bin/bash
|
63
|
-
set -e
|
64
|
-
|
65
|
-
# Figure out where this script is located.
|
66
|
-
SELFDIR="`dirname \"$0\"`"
|
67
|
-
SELFDIR="`cd \"$SELFDIR\" && pwd`"
|
68
|
-
|
69
|
-
# Tell Bundler where the Gemfile and gems are.
|
70
|
-
export BUNDLE_GEMFILE="$SELFDIR/lib/vendor/Gemfile"
|
71
|
-
unset BUNDLE_IGNORE_CONFIG
|
72
114
|
|
73
|
-
# Run the actual app using the bundled Ruby interpreter.
|
74
|
-
exec "$SELFDIR/lib/ruby/bin/ruby" -rbundler/setup "$SELFDIR/lib/app/%s" "$@"
|
75
|
-
EOSCRIPT
|
76
115
|
|
77
116
|
BUNDLE_CONFIG = <<-EOBUNDLECONFIG
|
78
117
|
BUNDLE_PATH: .
|
@@ -94,19 +133,27 @@ ARCHITECTURES.each do |name, config|
|
|
94
133
|
task name => ["%s:package" % name]
|
95
134
|
else
|
96
135
|
desc "Package your app for %s" % name
|
97
|
-
task name => ["%s:
|
136
|
+
task name => ["%s:compress" % name]
|
98
137
|
end
|
99
138
|
|
100
139
|
namespace name do
|
101
|
-
desc "Create a
|
102
|
-
task "
|
103
|
-
|
140
|
+
desc "Create a compressed package for %s" % name
|
141
|
+
task "compress" do
|
142
|
+
task("package:bundle_install").invoke(name.to_sym)
|
143
|
+
task(config[:runtime]).invoke
|
144
|
+
create_compressed_package(create_directory_bundle(name, config[:wrapper], config[:separator], config[:extension]), config[:compress_format])
|
104
145
|
end
|
105
146
|
|
106
147
|
if has_packaging
|
107
148
|
desc "Create packages (%s) for %s" % [config[:packages].join(","), name]
|
108
|
-
task "package"
|
109
|
-
|
149
|
+
task "package" do
|
150
|
+
task("package:bundle_install").invoke(name.to_sym)
|
151
|
+
task(config[:runtime]).invoke
|
152
|
+
destination = create_directory_bundle(name, config[:wrapper], config[:separator], config[:extension], config[:dest_dir])
|
153
|
+
if config[:package_from_compressed]
|
154
|
+
destination = create_compressed_package(destination, config[:compress_format])
|
155
|
+
end
|
156
|
+
create_packages(destination, config[:platform], config[:arch], config[:packages])
|
110
157
|
end
|
111
158
|
end
|
112
159
|
|
@@ -114,17 +161,21 @@ ARCHITECTURES.each do |name, config|
|
|
114
161
|
namespace "packagecloud" do
|
115
162
|
desc "Push packages (%s) to package_cloud" % config[:packages].join(",")
|
116
163
|
task "push" do
|
117
|
-
|
164
|
+
destination = create_directory_bundle(name, config[:wrapper], config[:separator], config[:extension], config[:dest_dir])
|
165
|
+
if config[:package_from_compressed]
|
166
|
+
destination = create_compressed_package(destination, config[:compress_format])
|
167
|
+
end
|
168
|
+
packages = create_packages(destination, config[:platform], config[:arch], config[:packages])
|
118
169
|
by_extension = packages.group_by { |path| File.extname(path)[1..-1] }
|
119
170
|
by_extension.each do |extension, files|
|
120
171
|
distros = SUPPORTED_DISTROS[extension]
|
121
172
|
distros.each do |distro|
|
122
173
|
repo = File.join(PACKAGECLOUD_REPO, distro)
|
123
174
|
files.each do |file|
|
124
|
-
yank_cmd =
|
175
|
+
yank_cmd = %Q{package_cloud yank "%s" "%s"} % [repo, file]
|
125
176
|
puts yank_cmd
|
126
177
|
system(yank_cmd)
|
127
|
-
sh
|
178
|
+
sh %Q{package_cloud push "%s" "%s"} % [repo, file]
|
128
179
|
end
|
129
180
|
end
|
130
181
|
end
|
@@ -144,7 +195,7 @@ end
|
|
144
195
|
namespace "package" do
|
145
196
|
|
146
197
|
desc "Install gems to local directory"
|
147
|
-
task :bundle_install do
|
198
|
+
task :bundle_install, [:platform] do |t, args|
|
148
199
|
if RUBY_VERSION !~ /^2\.1\./
|
149
200
|
abort "You can only 'bundle install' using Ruby 2.1, because that's what Traveling Ruby uses."
|
150
201
|
end
|
@@ -153,20 +204,23 @@ namespace "package" do
|
|
153
204
|
spec_path = SPEC_PATH
|
154
205
|
cache_dir = File.join("packaging", "vendor", "*", "*", "cache", "*")
|
155
206
|
|
156
|
-
sh
|
157
|
-
sh
|
158
|
-
sh
|
207
|
+
sh %Q{rm -rf "%s"} % tmp_package_dir
|
208
|
+
sh %Q{mkdir -p "%s"} % tmp_package_dir
|
209
|
+
sh %Q{cp "%s" Gemfile Gemfile.lock "%s"} % [spec_path, tmp_package_dir]
|
159
210
|
|
160
|
-
|
161
|
-
sh "ln -sf %s %s" % [File.expand_path(path), tmp_package_dir]
|
162
|
-
end
|
211
|
+
sh %Q{ln -sf "%s" "%s"} % [File.expand_path("lib"), tmp_package_dir]
|
163
212
|
|
213
|
+
env = if args[:platform] == :win32
|
214
|
+
"INSTALL_WINDOWS=1"
|
215
|
+
else
|
216
|
+
""
|
217
|
+
end
|
164
218
|
Bundler.with_clean_env do
|
165
|
-
sh
|
219
|
+
sh %Q{cd "%s" && env BUNDLE_IGNORE_CONFIG=1 #{env} bundle install --path ../vendor --without development} % tmp_package_dir
|
166
220
|
end
|
167
221
|
|
168
|
-
sh
|
169
|
-
sh
|
222
|
+
sh %Q{rm -rf "%s"} % tmp_package_dir
|
223
|
+
sh %Q{rm -f "%s"} % cache_dir
|
170
224
|
end
|
171
225
|
|
172
226
|
end
|
@@ -175,14 +229,33 @@ def create_packages(directory, platform, architecture, package_formats)
|
|
175
229
|
Array(package_formats).map { |pkg| create_package(directory, pkg, platform, architecture) }
|
176
230
|
end
|
177
231
|
|
178
|
-
def create_package(
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
232
|
+
def create_package(source, pkg, platform, architecture)
|
233
|
+
supported_by_fpm = %w{deb rpm}
|
234
|
+
supported_by_nsis = %w{exe}
|
235
|
+
if supported_by_fpm.include?(pkg)
|
236
|
+
output_name = [[PACKAGE_OUTPUT_NAME, architecture].join("_"), pkg].join(".")
|
237
|
+
extra_args = EXTRA_ARGS[pkg] || ""
|
238
|
+
sh %Q{fpm -s tar -t "%s" -f -n "%s" -v "%s" -a "%s" --license "%s" --vendor "%s" --maintainer "%s" --url "%s" --description "%s" --category "%s" --config-files "%s" -C "%s" -p "%s" %s "%s"} % [pkg, PACKAGE_NAME, VERSION, architecture, LICENSE, VENDOR, MAINTAINER, HOMEPAGE, DESCRIPTION, PACKAGE_CATEGORY, CONFIG_DEST, File.basename(source, ".tar.gz"), output_name, extra_args, source]
|
239
|
+
output_name
|
240
|
+
elsif supported_by_nsis.include?(pkg)
|
241
|
+
nsis_script = File.join("win32", "installer.nsis.erb")
|
242
|
+
installer_name = File.basename(source) + ".exe"
|
243
|
+
template = NSISERBContext.new(installer_name, [source], nsis_script)
|
244
|
+
|
245
|
+
temp = Tempfile.new("nsis", ".")
|
246
|
+
temp.write(template.result)
|
247
|
+
temp.close(false)
|
248
|
+
|
249
|
+
sh %Q{makensis "%s"} % temp.path
|
250
|
+
|
251
|
+
temp.unlink
|
252
|
+
|
253
|
+
else
|
254
|
+
raise StandardError.new("Format %s is not supported" % pkg)
|
255
|
+
end
|
183
256
|
end
|
184
257
|
|
185
|
-
def create_directory_bundle(target, prefix = nil)
|
258
|
+
def create_directory_bundle(target, wrapper_script, separator, extension = nil, prefix = nil)
|
186
259
|
package_dir = [PACKAGE_NAME, VERSION, target].join("_")
|
187
260
|
prefixed_dir = if prefix
|
188
261
|
File.join(package_dir, prefix)
|
@@ -200,52 +273,71 @@ def create_directory_bundle(target, prefix = nil)
|
|
200
273
|
bundle_dir = File.join(dest_vendor_dir, ".bundle")
|
201
274
|
|
202
275
|
|
203
|
-
sh
|
204
|
-
sh
|
205
|
-
sh
|
206
|
-
sh
|
207
|
-
sh
|
276
|
+
sh %Q{rm -rf "%s"} % package_dir
|
277
|
+
sh %Q{mkdir "%s"} % package_dir
|
278
|
+
sh %Q{mkdir -p "%s"} % prefixed_dir
|
279
|
+
sh %Q{mkdir -p "%s"} % config_dest_dir
|
280
|
+
sh %Q{mkdir -p "%s"} % app_dir
|
208
281
|
|
209
282
|
GEMSPEC.files.each do |file|
|
210
283
|
destination_dir = File.join(app_dir, File.dirname(file))
|
211
284
|
FileUtils.mkdir_p(destination_dir)
|
212
285
|
|
213
|
-
sh
|
286
|
+
sh %Q{cp "%s" "%s"} % [file, destination_dir]
|
214
287
|
end
|
215
288
|
|
216
289
|
Dir[File.join(CONFIG_DIR, "*")].each do |file|
|
217
|
-
sh
|
290
|
+
sh %Q{cp "%s" "%s"} % [file, config_dest_dir]
|
218
291
|
end
|
219
292
|
|
220
|
-
sh
|
221
|
-
sh
|
293
|
+
sh %Q{mkdir "%s"} % ruby_dir
|
294
|
+
sh %Q{tar -xzf "%s" -C "%s"} % [traveling_ruby_file, ruby_dir]
|
222
295
|
|
223
296
|
GEMSPEC.executables.each do |file|
|
224
|
-
destination = File.join(prefixed_dir, file)
|
297
|
+
destination = File.join(prefixed_dir, file + extension.to_s)
|
225
298
|
|
226
|
-
|
299
|
+
bin_path = "bin" + separator + file
|
300
|
+
File.open(destination, "w") { |f| f.write(wrapper_script % bin_path) }
|
227
301
|
|
228
|
-
sh
|
302
|
+
sh %Q{chmod +x "%s"} % destination
|
229
303
|
end
|
230
304
|
|
231
|
-
sh
|
232
|
-
sh
|
305
|
+
sh %Q{cp -pR "%s" "%s"} % [vendor_dir, lib_dir]
|
306
|
+
sh %Q{cp "%s" Gemfile Gemfile.lock "%s"} % [spec_path, dest_vendor_dir]
|
233
307
|
|
234
|
-
|
235
|
-
|
236
|
-
end
|
308
|
+
|
309
|
+
sh %Q{ln -sf "../app/%s" "%s"} % ["lib", File.join(dest_vendor_dir, "lib")]
|
237
310
|
|
238
311
|
FileUtils.mkdir_p(bundle_dir)
|
239
312
|
File.open(File.join(bundle_dir, "config"), "w") { |f| f.write(BUNDLE_CONFIG) }
|
313
|
+
|
314
|
+
post_build_dir = File.join(target)
|
315
|
+
post_build_makefile = File.join(post_build_dir, "Makefile")
|
316
|
+
if File.exists?(post_build_makefile)
|
317
|
+
sh %Q{cd "%s" && make clean || /usr/bin/true} % post_build_dir
|
318
|
+
sh %Q{cd "%s" && make install prefix="%s"} % [post_build_dir, File.expand_path(package_dir)]
|
319
|
+
end
|
240
320
|
package_dir
|
241
321
|
end
|
242
322
|
|
243
|
-
def
|
244
|
-
|
323
|
+
def create_compressed_package(package_dir, format = 'tar.gz')
|
324
|
+
format ||= 'tar.gz'
|
325
|
+
case format
|
326
|
+
when 'tar.gz'
|
327
|
+
gzip_file = "%s.tar.gz" % package_dir
|
328
|
+
|
329
|
+
sh %Q{tar -czf "%s" "%s"} % [gzip_file, package_dir]
|
245
330
|
|
246
|
-
|
331
|
+
gzip_file
|
332
|
+
when 'zip'
|
333
|
+
zip_file = "%s.zip" % package_dir
|
247
334
|
|
248
|
-
|
335
|
+
sh %Q{zip -r "%s" "%s"} % [zip_file, package_dir]
|
336
|
+
|
337
|
+
zip_file
|
338
|
+
else
|
339
|
+
raise StandardError.new("Format %s is not supported" % format)
|
340
|
+
end
|
249
341
|
end
|
250
342
|
|
251
343
|
def download_runtime(target)
|
@@ -256,3 +348,49 @@ def download_runtime(target)
|
|
256
348
|
|
257
349
|
sh "cd packaging && curl -L -O --fail %s" % traveling_ruby_url
|
258
350
|
end
|
351
|
+
|
352
|
+
|
353
|
+
class NSISERBContext
|
354
|
+
attr_reader :template_path, :directories, :installer_file_name
|
355
|
+
|
356
|
+
def initialize(installer_name, directories, template_path)
|
357
|
+
@directories = directories
|
358
|
+
@template_path = template_path
|
359
|
+
@installer_file_name = installer_name
|
360
|
+
end
|
361
|
+
|
362
|
+
def template_source
|
363
|
+
File.read(template_path)
|
364
|
+
end
|
365
|
+
|
366
|
+
def removable_artifacts
|
367
|
+
removable_files = Set.new
|
368
|
+
removable_directories = Set.new
|
369
|
+
directories.each do |dir|
|
370
|
+
Find.find(dir) do |path|
|
371
|
+
puts path.inspect
|
372
|
+
if File.file?(path)
|
373
|
+
without_base = path.split(File::SEPARATOR)[1..-1]
|
374
|
+
without_file = without_base[0..-2]
|
375
|
+
removable_files << without_base.join("\\")
|
376
|
+
removable_directories << without_file.join("\\")
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
removable_files << "InstrumentServer.exe"
|
381
|
+
dirs = removable_directories.to_a.sort_by { |path| path.split("\\").size }.reverse
|
382
|
+
[removable_files.to_a, dirs]
|
383
|
+
end
|
384
|
+
|
385
|
+
def service_name
|
386
|
+
"instrument_server"
|
387
|
+
end
|
388
|
+
|
389
|
+
def uninstaller_name
|
390
|
+
"uninstaller.exe"
|
391
|
+
end
|
392
|
+
|
393
|
+
def result
|
394
|
+
ERB.new(template_source).result(binding)
|
395
|
+
end
|
396
|
+
end
|