rrunit 0.0.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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/bin/rrunit +54 -0
- data/lib/rrunit/service.rb +94 -0
- data/lib/rrunit/version.rb +3 -0
- data/lib/rrunit.rb +7 -0
- data/rrunit.gemspec +23 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/runit_service_spec.rb +145 -0
- metadata +82 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/rrunit
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
4
|
+
require 'rrunit'
|
5
|
+
require 'optparse'
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
options = {
|
9
|
+
}
|
10
|
+
|
11
|
+
OptionParser.new do |opts|
|
12
|
+
opts.banner = "Usage: rrunit -c <service-command>"
|
13
|
+
|
14
|
+
opts.on('-c', "--command <command>", "The service command") do |command|
|
15
|
+
options[:command] = command
|
16
|
+
end
|
17
|
+
|
18
|
+
opts.on('-l', "--logdir <logdir>", "The service logdir") do |logdir|
|
19
|
+
options[:log_dir] = logdir
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on('-o', "--outputdir <outputdir>", "The directory to output the service") do |output|
|
23
|
+
options[:output] = output
|
24
|
+
end
|
25
|
+
|
26
|
+
opts.on('-e', "--env <json>", "The environment variables") do |env|
|
27
|
+
options[:environment] = JSON.parse(env)
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on('-x', "--xenv <json>", "The exported environment variables") do |env|
|
31
|
+
options[:exported_environment] = JSON.parse(env)
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on('-a', "--args <quoted-string>", "The arguments to the service command") do |args|
|
35
|
+
options[:args] = args.split(' ')
|
36
|
+
end
|
37
|
+
|
38
|
+
end.parse!
|
39
|
+
|
40
|
+
unless options.key?(:command)
|
41
|
+
puts "You must at least specify a command"
|
42
|
+
exit(1)
|
43
|
+
end
|
44
|
+
|
45
|
+
output = options.delete(:output)
|
46
|
+
output = '/tmp' unless output
|
47
|
+
output = "#{output}/#{options[:name]}"
|
48
|
+
|
49
|
+
r = Rrunit::Service.new(options.delete(:command))
|
50
|
+
options.each do |key,value|
|
51
|
+
r.send(key, value)
|
52
|
+
end
|
53
|
+
|
54
|
+
r.write(output)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Rrunit
|
2
|
+
|
3
|
+
class Service
|
4
|
+
|
5
|
+
attr_reader :name
|
6
|
+
attr_reader :command
|
7
|
+
|
8
|
+
def initialize(command)
|
9
|
+
@command = command
|
10
|
+
@name = File.basename(command)
|
11
|
+
@environment = Hash.new
|
12
|
+
@exported_environment = Hash.new
|
13
|
+
@args = Array.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def args(*args)
|
17
|
+
@args = args unless args.empty?
|
18
|
+
args.empty? ? @args : self
|
19
|
+
end
|
20
|
+
|
21
|
+
def log_dir(log_dir=nil)
|
22
|
+
@log_dir = log_dir unless log_dir.nil?
|
23
|
+
log_dir.nil? ? @log_dir : self
|
24
|
+
end
|
25
|
+
|
26
|
+
def environment(env=nil)
|
27
|
+
@environment=env if env.is_a?(Hash)
|
28
|
+
env.nil? ? @environment : self
|
29
|
+
end
|
30
|
+
|
31
|
+
def exported_environment(env=nil)
|
32
|
+
@exported_environment=env if env.is_a?(Hash)
|
33
|
+
env.nil? ? @exported_environment : self
|
34
|
+
end
|
35
|
+
|
36
|
+
def env_var(value)
|
37
|
+
case
|
38
|
+
when value.is_a?(String)
|
39
|
+
"\"#{value}\""
|
40
|
+
else
|
41
|
+
value.to_s
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def service
|
46
|
+
sv = Array.new
|
47
|
+
cmd = "exec #{command}"
|
48
|
+
cmd << " #{@args.join(' ')}" unless @args.empty?
|
49
|
+
sv << "#!/bin/bash"
|
50
|
+
@exported_environment.each do |key, value|
|
51
|
+
sv << "export #{key.to_s.upcase}=#{env_var(value)}"
|
52
|
+
end
|
53
|
+
@environment.each do |key, value|
|
54
|
+
sv << "#{key.to_s.upcase}=#{env_var(value)}"
|
55
|
+
end
|
56
|
+
sv << cmd
|
57
|
+
sv.join("\n")
|
58
|
+
end
|
59
|
+
|
60
|
+
def log_service
|
61
|
+
if @log_dir
|
62
|
+
sv = Array.new
|
63
|
+
cmd = "exec svlogd -tt #{@log_dir}"
|
64
|
+
sv << "#!/bin/bash"
|
65
|
+
sv << cmd
|
66
|
+
sv.join("\n")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def write(path)
|
71
|
+
@output_directory = path
|
72
|
+
FileUtils.mkdir_p @output_directory
|
73
|
+
File.open("#{@output_directory}/run", 'w') do |f|
|
74
|
+
f << service
|
75
|
+
f << "\n"
|
76
|
+
end
|
77
|
+
FileUtils.chmod 0755, "#{@output_directory}/run"
|
78
|
+
if @log_dir
|
79
|
+
FileUtils.mkdir_p "#{@output_directory}/log"
|
80
|
+
File.open("#{@output_directory}/log/run", 'w') do |f|
|
81
|
+
f << log_service
|
82
|
+
f << "\n"
|
83
|
+
end
|
84
|
+
FileUtils.chmod 0755, "#{@output_directory}/log/run"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def rm
|
89
|
+
FileUtils.rm_r @output_directory
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/lib/rrunit.rb
ADDED
data/rrunit.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "rrunit/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "rrunit"
|
7
|
+
s.version = Rrunit::VERSION
|
8
|
+
s.authors = ["John Axel Eriksson"]
|
9
|
+
s.email = ["john@insane.se"]
|
10
|
+
s.homepage = "https://github.com/johnae/rrunit"
|
11
|
+
s.summary = %q{Creates and writes runit service files}
|
12
|
+
s.description = %q{Creates and writes runit service files}
|
13
|
+
|
14
|
+
s.rubyforge_project = "rrunit"
|
15
|
+
|
16
|
+
s.add_development_dependency "bundler", ">= 1.0.10"
|
17
|
+
s.add_development_dependency('rspec', '>= 2.6.0')
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
rrunit_path = File.expand_path('./lib', File.dirname(__FILE__))
|
2
|
+
$:.unshift(rrunit_path) if File.directory?(rrunit_path) && !$:.include?(rrunit_path)
|
3
|
+
|
4
|
+
require 'rrunit'
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.mock_with :rspec
|
8
|
+
config.color_enabled = true
|
9
|
+
config.formatter = 'd'
|
10
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Rrunit
|
4
|
+
describe Service do
|
5
|
+
|
6
|
+
context "default settings" do
|
7
|
+
|
8
|
+
let(:runit_service) { Service.new('/usr/bin/service') }
|
9
|
+
|
10
|
+
it "has a name" do
|
11
|
+
runit_service.name.should == 'service'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a command" do
|
15
|
+
runit_service.command.should == '/usr/bin/service'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "has a basic runit run string" do
|
19
|
+
runit_service.service.should == ["#!/bin/bash","exec #{runit_service.command}"].join("\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
context "with arguments" do
|
25
|
+
|
26
|
+
let(:runit_service) { Service.new('service').args('-arg1', 1, '-arg2', 2) }
|
27
|
+
|
28
|
+
it "has arguments for command" do
|
29
|
+
runit_service.args.should == ['-arg1', 1, '-arg2', 2]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has a runit run string with arguments" do
|
33
|
+
runit_service.service.should == ["#!/bin/bash","exec #{runit_service.command} -arg1 1 -arg2 2"].join("\n")
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with environment" do
|
39
|
+
|
40
|
+
let(:runit_service) {
|
41
|
+
Service.new('service')
|
42
|
+
.environment(variable1: "127.0.0.1", variable2: "www.google.com", variable3: 100)
|
43
|
+
.exported_environment(evariable1: "exported")
|
44
|
+
}
|
45
|
+
|
46
|
+
it "has a runit run string with environment variables set" do
|
47
|
+
runit_service.service.should == ["#!/bin/bash", "export EVARIABLE1=\"exported\"", "VARIABLE1=\"127.0.0.1\"", "VARIABLE2=\"www.google.com\"", "VARIABLE3=100", "exec #{runit_service.command}"].join("\n")
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with log_dir" do
|
53
|
+
|
54
|
+
let(:runit_service) {
|
55
|
+
Service.new('service')
|
56
|
+
.args('-arg1', 1, '-arg2', 2)
|
57
|
+
.log_dir('/tmp/somedir')
|
58
|
+
}
|
59
|
+
|
60
|
+
it "has a log_dir" do
|
61
|
+
runit_service.log_dir.should == '/tmp/somedir'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "has a log_service" do
|
65
|
+
runit_service.log_service.should == ["#!/bin/bash","exec svlogd -tt #{runit_service.log_dir}"].join("\n")
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when writing the files" do
|
71
|
+
|
72
|
+
let(:runit_output_directory) { "/tmp/runit_generator_spec_output_directory" }
|
73
|
+
|
74
|
+
before do
|
75
|
+
FileUtils.rm_rf(runit_output_directory)
|
76
|
+
runit_service.write(runit_output_directory)
|
77
|
+
end
|
78
|
+
|
79
|
+
after(:all) do
|
80
|
+
FileUtils.rm_rf(runit_output_directory)
|
81
|
+
end
|
82
|
+
|
83
|
+
context "without log dir" do
|
84
|
+
|
85
|
+
let(:runit_service) {
|
86
|
+
Service.new('service')
|
87
|
+
.args('-arg1', 1, '-arg2', 2)
|
88
|
+
.exported_environment(var1: 100, var2: "HELLO")
|
89
|
+
}
|
90
|
+
|
91
|
+
it "writes the runit configuration files to specified location" do
|
92
|
+
File.directory?(runit_output_directory).should be true
|
93
|
+
File.exists?("#{runit_output_directory}/run").should be true
|
94
|
+
end
|
95
|
+
|
96
|
+
it "the runit run file should be executable" do
|
97
|
+
File.stat("#{runit_output_directory}/run").executable?.should be true
|
98
|
+
end
|
99
|
+
|
100
|
+
it "the program run file should contain the service" do
|
101
|
+
File.read("#{runit_output_directory}/run").should == runit_service.service+"\n"
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
context "with log dir" do
|
107
|
+
|
108
|
+
let(:runit_service) {
|
109
|
+
Service.new('service')
|
110
|
+
.args('-arg1', 1, '-arg2', 2)
|
111
|
+
.exported_environment(var1: 100, var2: "HELLO")
|
112
|
+
.log_dir('/tmp/somedir')
|
113
|
+
}
|
114
|
+
|
115
|
+
it "writes the runit configuration files to specified location" do
|
116
|
+
File.directory?(runit_output_directory).should be true
|
117
|
+
File.exists?("#{runit_output_directory}/run").should be true
|
118
|
+
end
|
119
|
+
|
120
|
+
it "the runit run file should be executable" do
|
121
|
+
File.stat("#{runit_output_directory}/run").executable?.should be true
|
122
|
+
end
|
123
|
+
|
124
|
+
it "the runit run file should contain the service" do
|
125
|
+
File.read("#{runit_output_directory}/run").should == runit_service.service+"\n"
|
126
|
+
end
|
127
|
+
|
128
|
+
it "writes the runit log service to specified location" do
|
129
|
+
File.directory?("#{runit_output_directory}/log").should be true
|
130
|
+
File.exists?("#{runit_output_directory}/log/run").should be true
|
131
|
+
end
|
132
|
+
|
133
|
+
it "the runit log service run file should be executable" do
|
134
|
+
File.stat("#{runit_output_directory}/log/run").executable?.should be true
|
135
|
+
end
|
136
|
+
|
137
|
+
it "the runit log service run file should contain the log service" do
|
138
|
+
File.read("#{runit_output_directory}/log/run").should == runit_service.log_service+"\n"
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rrunit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- John Axel Eriksson
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-06-23 00:00:00.000000000 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: &2164580600 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.10
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2164580600
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &2164580100 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.6.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2164580100
|
37
|
+
description: Creates and writes runit service files
|
38
|
+
email:
|
39
|
+
- john@insane.se
|
40
|
+
executables:
|
41
|
+
- rrunit
|
42
|
+
extensions: []
|
43
|
+
extra_rdoc_files: []
|
44
|
+
files:
|
45
|
+
- .gitignore
|
46
|
+
- Gemfile
|
47
|
+
- Rakefile
|
48
|
+
- bin/rrunit
|
49
|
+
- lib/rrunit.rb
|
50
|
+
- lib/rrunit/service.rb
|
51
|
+
- lib/rrunit/version.rb
|
52
|
+
- rrunit.gemspec
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
- spec/unit/runit_service_spec.rb
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: https://github.com/johnae/rrunit
|
57
|
+
licenses: []
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project: rrunit
|
76
|
+
rubygems_version: 1.6.2
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Creates and writes runit service files
|
80
|
+
test_files:
|
81
|
+
- spec/spec_helper.rb
|
82
|
+
- spec/unit/runit_service_spec.rb
|