pullmatic 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +11 -0
- data/LICENSE +22 -0
- data/LICENSE.txt +21 -0
- data/README.md +42 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/pullmatic +5 -0
- data/bin/setup +7 -0
- data/lib/pullmatic.rb +22 -0
- data/lib/pullmatic/cli.rb +61 -0
- data/lib/pullmatic/resource/etc.rb +76 -0
- data/lib/pullmatic/resource/filesystem.rb +49 -0
- data/lib/pullmatic/resource/interface.rb +71 -0
- data/lib/pullmatic/resource/network.rb +131 -0
- data/lib/pullmatic/resource/os.rb +87 -0
- data/lib/pullmatic/resource/user_group.rb +64 -0
- data/lib/pullmatic/version.rb +3 -0
- data/pullmatic.gemspec +36 -0
- metadata +251 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c19282cab64ec1443bd67f5875cdb15868a76063
|
4
|
+
data.tar.gz: 96beb52667053d002ef5328ec55f5aea3af193fe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e4b95f6b81d8ed5588071608f15fbc6e0ccccf8d23ae5328ea3c3f6cb2434738a2dd358d8e5e906b2b5d08421aa1e2fdc3bed6129209b6c5935e677be5b54fd5
|
7
|
+
data.tar.gz: fbc14cb0ccd987ed66c89b6ba989766a3d343b8d9bce9bf9d526297d1290be2657a396a137ce7be83d36ec0ac9ca17bcd03c27bdb6c84b09c4227b3d081a83c6
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format documentation
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Masayuki Takahashi
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 TODO: Write your name
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Pullmatic
|
2
|
+
|
3
|
+
Pullmatic ia a tool for collecting server states and printing as JSON string via SSH.
|
4
|
+
|
5
|
+
[](https://travis-ci.org/masayuki038/pullmatic)
|
6
|
+
[](https://coveralls.io/github/masayuki038/pullmatic?branch=master)
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'pullmatic'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install pullmatic
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
Usage: pullmatic export --host=[host] [options]
|
27
|
+
|
28
|
+
Options:
|
29
|
+
--user ssh user
|
30
|
+
--password ssh password
|
31
|
+
--sudo_password sudo password
|
32
|
+
|
33
|
+
Examples:
|
34
|
+
```
|
35
|
+
$ pullmatic export --host=10.14.28.139 > server.json
|
36
|
+
```
|
37
|
+
|
38
|
+
|
39
|
+
## License
|
40
|
+
|
41
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
42
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "pullmatic"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/pullmatic
ADDED
data/bin/setup
ADDED
data/lib/pullmatic.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'thor'
|
3
|
+
require 'oj'
|
4
|
+
require 'specinfra'
|
5
|
+
require 'specinfra/helper/set'
|
6
|
+
require 'specinfra/helper/detect_os'
|
7
|
+
require 'specinfra/backend'
|
8
|
+
|
9
|
+
require "pullmatic/version"
|
10
|
+
require "pullmatic/cli"
|
11
|
+
require "pullmatic/resource/os"
|
12
|
+
require "pullmatic/resource/filesystem"
|
13
|
+
require "pullmatic/resource/interface"
|
14
|
+
require "pullmatic/resource/network"
|
15
|
+
require "pullmatic/resource/user_group"
|
16
|
+
require "pullmatic/resource/etc"
|
17
|
+
|
18
|
+
include Specinfra::Helper::Set
|
19
|
+
|
20
|
+
module Pullmatic
|
21
|
+
set :backend, :exec
|
22
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
class CLI < Thor
|
3
|
+
class_option :print, type: :boolean, desc: "Print STDOUT"
|
4
|
+
|
5
|
+
desc "export", "export server info as json/excel"
|
6
|
+
option :host, :required => true
|
7
|
+
option :user
|
8
|
+
option :password
|
9
|
+
option :sudo_password
|
10
|
+
def export
|
11
|
+
set :backend, "ssh"
|
12
|
+
set :request_pty, true
|
13
|
+
set :host, options[:host]
|
14
|
+
ssh_options = {}
|
15
|
+
ssh_options[:user] = options[:user] if options[:user]
|
16
|
+
ssh_options[:password] = options[:password] if options[:password]
|
17
|
+
set :ssh_options, ssh_options
|
18
|
+
set :sudo_password, options[:sudo_password] if options[:sudo_password]
|
19
|
+
|
20
|
+
os = get_os
|
21
|
+
filesystem = get_filesystem
|
22
|
+
interface = get_interface
|
23
|
+
network = get_network
|
24
|
+
user_group = get_user_group
|
25
|
+
etc = get_etc
|
26
|
+
|
27
|
+
puts Oj.dump({:os => os, :filesystem => filesystem, :interface => interface, :network => network, :user_group => user_group, :etc => etc}, {:indent => 1})
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
desc "get_server", "get_server"
|
33
|
+
def get_os
|
34
|
+
execute(Pullmatic::Resource::Os)
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_filesystem
|
38
|
+
execute(Pullmatic::Resource::Filesystem)
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_interface
|
42
|
+
execute(Pullmatic::Resource::Interface)
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_network
|
46
|
+
execute(Pullmatic::Resource::Network)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_user_group
|
50
|
+
execute(Pullmatic::Resource::UserGroup)
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_etc
|
54
|
+
execute(Pullmatic::Resource::Etc)
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute(klass)
|
58
|
+
klass.execute
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
module Resource
|
3
|
+
class Etc
|
4
|
+
include Specinfra::Helper::Set
|
5
|
+
def self.execute
|
6
|
+
self.new.execute
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
sshd_config = host_inventory['sshd_config']
|
11
|
+
services = host_inventory['services']
|
12
|
+
{:sshd_config => sshd_config, :services => services}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Specinfra::Command::Linux::Base::Inventory
|
19
|
+
class << self
|
20
|
+
def get_sshd_config
|
21
|
+
'/bin/cat /etc/ssh/sshd_config'
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_services
|
25
|
+
'/usr/sbin/service --status-all'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Specinfra::Command::Redhat::V7::Inventory < Specinfra::Command::Linux::Base::Inventory
|
31
|
+
class << self
|
32
|
+
def get_services
|
33
|
+
'/usr/bin/systemctl list-units --type=service | /bin/grep -e "\.service"'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module Specinfra
|
39
|
+
class HostInventory
|
40
|
+
class SshdConfig < Base
|
41
|
+
def get
|
42
|
+
cmd = backend.command.get(:get_inventory_sshd_config)
|
43
|
+
ret = backend.run_command(cmd)
|
44
|
+
if ret.exit_status == 0
|
45
|
+
parse(ret.stdout)
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse(ret)
|
52
|
+
entries = []
|
53
|
+
ret.split("\n").each do |l|
|
54
|
+
entries << l if l =~ /^[^#]/
|
55
|
+
end
|
56
|
+
entries
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Services < Base
|
61
|
+
def get
|
62
|
+
cmd = backend.command.get(:get_inventory_services)
|
63
|
+
ret = backend.run_command(cmd)
|
64
|
+
if ret.exit_status == 0
|
65
|
+
parse(ret.stdout)
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse(ret)
|
72
|
+
ret.split("\n")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
module Resource
|
3
|
+
class Filesystem
|
4
|
+
def self.execute
|
5
|
+
self.new.execute
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute
|
9
|
+
fs = host_inventory['filesystem']
|
10
|
+
partitions = fs.map do |dev, spec|
|
11
|
+
[[:name, dev], [:mount, spec["mount"]], [:type, spec["type"]], [:kb_size, spec["kb_size"].to_i], [:kb_used, spec["kb_used"].to_i], [:kb_available, spec["kb_available"].to_i], [:percent_used, spec["percent_used"]], [:mount, spec["mount"]]].to_h
|
12
|
+
end
|
13
|
+
partitions
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Specinfra::Command::Linux::Base::Inventory
|
20
|
+
class << self
|
21
|
+
def get_filesystem
|
22
|
+
'df -T'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Specinfra
|
28
|
+
class HostInventory
|
29
|
+
class Filesystem
|
30
|
+
def parse(ret)
|
31
|
+
filesystem = {}
|
32
|
+
ret.each_line do |line|
|
33
|
+
next if line =~ /^Filesystem\s+/
|
34
|
+
if line =~ /^(.+?)\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\%)\s+(.+)$/
|
35
|
+
device = $1
|
36
|
+
filesystem[device] = {}
|
37
|
+
filesystem[device]['type'] = $2
|
38
|
+
filesystem[device]['kb_size'] = $3
|
39
|
+
filesystem[device]['kb_used'] = $4
|
40
|
+
filesystem[device]['kb_available'] = $5
|
41
|
+
filesystem[device]['percent_used'] = $6
|
42
|
+
filesystem[device]['mount'] = $7
|
43
|
+
end
|
44
|
+
end
|
45
|
+
filesystem
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
module Resource
|
3
|
+
class Interface
|
4
|
+
def self.execute
|
5
|
+
self.new.execute
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute
|
9
|
+
ip = host_inventory['ip']
|
10
|
+
default_gateway = host_inventory['default_gateway']
|
11
|
+
{:ip => ip, :default_gateway => default_gateway}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Specinfra::Command::Linux::Base::Inventory
|
18
|
+
class << self
|
19
|
+
def get_ip
|
20
|
+
'/sbin/ip addr'
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_default_gateway
|
24
|
+
'/sbin/ip route'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Specinfra
|
30
|
+
class HostInventory
|
31
|
+
class Ip < Base
|
32
|
+
def get
|
33
|
+
cmd = backend.command.get(:get_inventory_ip)
|
34
|
+
ret = backend.run_command(cmd)
|
35
|
+
if ret.exit_status == 0
|
36
|
+
parse(ret.stdout)
|
37
|
+
else
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse(ret)
|
43
|
+
ifs = {}
|
44
|
+
name = ipv4 = ipv6 = nil
|
45
|
+
ret.split("\n").each do |l|
|
46
|
+
name = $2 if l =~ /^(\d+):\s(\w+):/
|
47
|
+
ipv4 = $1 if l =~ /^\s+inet\s([0-9.\/]+)/
|
48
|
+
ipv6 = $1 if l =~ /^\s+inet6\s([0-9a-f:.\/]+)/
|
49
|
+
ifs[name] = {:ipv4 => ipv4, :ipv6 => ipv6}
|
50
|
+
end
|
51
|
+
ifs
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class DefaultGateway < Base
|
56
|
+
def get
|
57
|
+
cmd = backend.command.get(:get_inventory_default_gateway)
|
58
|
+
ret = backend.run_command(cmd)
|
59
|
+
if ret.exit_status == 0
|
60
|
+
parse(ret.stdout)
|
61
|
+
else
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse(ret)
|
67
|
+
ret.split("\n")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
module Resource
|
3
|
+
class Network
|
4
|
+
def self.execute
|
5
|
+
self.new.execute
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute
|
9
|
+
hosts = host_inventory['hosts']
|
10
|
+
filter = host_inventory['iptables_filter']
|
11
|
+
nat = host_inventory['iptables_nat']
|
12
|
+
resolv = host_inventory['resolv']
|
13
|
+
{:hosts => hosts, :iptables => {:filter => filter, :nat => nat}, :resolv => resolv}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Specinfra::Command::Linux::Base::Inventory
|
20
|
+
class << self
|
21
|
+
def get_hosts
|
22
|
+
'/bin/cat /etc/hosts'
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_resolv
|
26
|
+
'/bin/cat /etc/resolv.conf'
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_iptables_filter
|
30
|
+
'/sbin/iptables -L'
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_iptables_nat
|
34
|
+
'/sbin/iptables -t nat -L'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module Specinfra
|
40
|
+
class HostInventory
|
41
|
+
class Hosts < Base
|
42
|
+
def get
|
43
|
+
cmd = backend.command.get(:get_inventory_hosts)
|
44
|
+
ret = backend.run_command(cmd)
|
45
|
+
if ret.exit_status == 0
|
46
|
+
parse(ret.stdout)
|
47
|
+
else
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def parse(ret)
|
53
|
+
entries = []
|
54
|
+
ret.split("\n").each do |l|
|
55
|
+
entries << l if l =~ /^[^#]+/
|
56
|
+
end
|
57
|
+
entries
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Resolv < Base
|
62
|
+
def get
|
63
|
+
cmd = backend.command.get(:get_inventory_resolv)
|
64
|
+
ret = backend.run_command(cmd)
|
65
|
+
if ret.exit_status == 0
|
66
|
+
parse(ret.stdout)
|
67
|
+
else
|
68
|
+
nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse(ret)
|
73
|
+
entries = []
|
74
|
+
ret.split("\n").each do |l|
|
75
|
+
entries << l if l =~ /^[^;]/
|
76
|
+
end
|
77
|
+
entries
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class IptablesBase < Base
|
82
|
+
def parse(ret)
|
83
|
+
entries = {}
|
84
|
+
chain = nil
|
85
|
+
ret.each_line do |l|
|
86
|
+
l.chomp!
|
87
|
+
case l
|
88
|
+
when /^Chain INPUT/
|
89
|
+
chain = :input
|
90
|
+
when /^Chain FORWARD/
|
91
|
+
chain = :forward
|
92
|
+
when /^Chain OUTPUT/
|
93
|
+
chain = :output
|
94
|
+
when /^Chain PREROUTING/
|
95
|
+
chain = :prerouting
|
96
|
+
when /^Chain POSTROUTING/
|
97
|
+
chain = :postrouting
|
98
|
+
end
|
99
|
+
entries[chain] ||= []
|
100
|
+
entries[chain] << l unless (l =~ /^target/ || l.size == 0)
|
101
|
+
end
|
102
|
+
entries
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class IptablesFilter < IptablesBase
|
107
|
+
def get
|
108
|
+
cmd = backend.command.get(:get_inventory_iptables_filter)
|
109
|
+
ret = backend.run_command(cmd)
|
110
|
+
if ret.exit_status == 0
|
111
|
+
parse(ret.stdout)
|
112
|
+
else
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class IptablesNat < IptablesBase
|
119
|
+
def get
|
120
|
+
cmd = backend.command.get(:get_inventory_iptables_nat)
|
121
|
+
ret = backend.run_command(cmd)
|
122
|
+
if ret.exit_status == 0
|
123
|
+
parse(ret.stdout)
|
124
|
+
else
|
125
|
+
nil
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
module Resource
|
3
|
+
class Os
|
4
|
+
include Specinfra::Helper::Set
|
5
|
+
def self.execute
|
6
|
+
self.new.execute
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
os_info = Specinfra.backend.os_info
|
11
|
+
hostname = host_inventory['hostname']
|
12
|
+
selinux = host_inventory['selinux']
|
13
|
+
timezone = host_inventory['timezone']
|
14
|
+
uname = host_inventory['uname']
|
15
|
+
{:os_info => os_info, :hostname => hostname, :selinux => selinux, :timezone => timezone, :uname => uname}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Specinfra::Command::Linux::Base::Inventory
|
22
|
+
class << self
|
23
|
+
def get_selinux
|
24
|
+
Specinfra.backend.command.get(:check_selinux_has_mode, "enabled")
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_timezone
|
28
|
+
'/bin/cat /etc/sysconfig/clock'
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_uname
|
32
|
+
'uname -a'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Specinfra::Command::Redhat::V7::Inventory < Specinfra::Command::Linux::Base::Inventory
|
38
|
+
class << self
|
39
|
+
def get_timezone
|
40
|
+
"timedatectl status | grep 'Timezone' | sed -e 's/^.*Timezone: \\(.*\\)$/\\1/'"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module Specinfra
|
46
|
+
class HostInventory
|
47
|
+
class Selinux < Base
|
48
|
+
def get
|
49
|
+
cmd = backend.command.get(:get_inventory_selinux)
|
50
|
+
ret = backend.run_command(cmd)
|
51
|
+
if ret.exit_status == 0
|
52
|
+
"enabled"
|
53
|
+
else
|
54
|
+
"disabled"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Timezone < Base
|
60
|
+
def get
|
61
|
+
cmd = backend.command.get(:get_inventory_timezone)
|
62
|
+
ret = backend.run_command(cmd)
|
63
|
+
if ret.exit_status == 0
|
64
|
+
parse(ret.stdout)
|
65
|
+
else
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def parse(ret)
|
71
|
+
ret.split("\n")[0]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class Uname < Base
|
76
|
+
def get
|
77
|
+
cmd = backend.command.get(:get_inventory_uname)
|
78
|
+
ret = backend.run_command(cmd)
|
79
|
+
if ret.exit_status == 0
|
80
|
+
ret.stdout.chomp
|
81
|
+
else
|
82
|
+
nil
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Pullmatic
|
2
|
+
module Resource
|
3
|
+
class UserGroup
|
4
|
+
include Specinfra::Helper::Set
|
5
|
+
def self.execute
|
6
|
+
self.new.execute
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
users = host_inventory['users']
|
11
|
+
groups = host_inventory['groups']
|
12
|
+
{:users => users, :groups => groups}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Specinfra::Command::Linux::Base::Inventory
|
19
|
+
class << self
|
20
|
+
def get_users
|
21
|
+
'/bin/cat /etc/passwd'
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_groups
|
25
|
+
'/bin/cat /etc/group'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module Specinfra
|
31
|
+
class HostInventory
|
32
|
+
class Users < Base
|
33
|
+
def get
|
34
|
+
cmd = backend.command.get(:get_inventory_users)
|
35
|
+
ret = backend.run_command(cmd)
|
36
|
+
if ret.exit_status == 0
|
37
|
+
parse(ret.stdout)
|
38
|
+
else
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def parse(ret)
|
44
|
+
ret.split("\n")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Groups < Base
|
49
|
+
def get
|
50
|
+
cmd = backend.command.get(:get_inventory_groups)
|
51
|
+
ret = backend.run_command(cmd)
|
52
|
+
if ret.exit_status == 0
|
53
|
+
parse(ret.stdout)
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse(ret)
|
60
|
+
ret.split("\n")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/pullmatic.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'pullmatic/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "pullmatic"
|
8
|
+
spec.version = Pullmatic::VERSION
|
9
|
+
spec.authors = ['Masayuki Takahashi']
|
10
|
+
spec.email = ['masayuki038@gmail.com']
|
11
|
+
|
12
|
+
spec.summary = %q{A tool for collecting server states and printing as JSON string.}
|
13
|
+
spec.description = %q{A tool for collecting server states and printing as JSON string via SSH.}
|
14
|
+
spec.homepage = ""
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "bin"
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "guard"
|
26
|
+
spec.add_development_dependency "guard-rspec"
|
27
|
+
spec.add_development_dependency "pry"
|
28
|
+
spec.add_development_dependency "pry-remote"
|
29
|
+
spec.add_development_dependency "pry-nav"
|
30
|
+
spec.add_development_dependency "coveralls"
|
31
|
+
|
32
|
+
spec.add_dependency "specinfra", "~> 2.40"
|
33
|
+
spec.add_dependency "oj"
|
34
|
+
spec.add_dependency "ox"
|
35
|
+
spec.add_dependency "thor"
|
36
|
+
end
|
metadata
ADDED
@@ -0,0 +1,251 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pullmatic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Masayuki Takahashi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-rspec
|
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
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-remote
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-nav
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: coveralls
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: specinfra
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '2.40'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '2.40'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: oj
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: ox
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: thor
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
description: A tool for collecting server states and printing as JSON string via SSH.
|
196
|
+
email:
|
197
|
+
- masayuki038@gmail.com
|
198
|
+
executables:
|
199
|
+
- console
|
200
|
+
- pullmatic
|
201
|
+
- setup
|
202
|
+
extensions: []
|
203
|
+
extra_rdoc_files: []
|
204
|
+
files:
|
205
|
+
- ".gitignore"
|
206
|
+
- ".rspec"
|
207
|
+
- ".travis.yml"
|
208
|
+
- Gemfile
|
209
|
+
- Guardfile
|
210
|
+
- LICENSE
|
211
|
+
- LICENSE.txt
|
212
|
+
- README.md
|
213
|
+
- Rakefile
|
214
|
+
- bin/console
|
215
|
+
- bin/pullmatic
|
216
|
+
- bin/setup
|
217
|
+
- lib/pullmatic.rb
|
218
|
+
- lib/pullmatic/cli.rb
|
219
|
+
- lib/pullmatic/resource/etc.rb
|
220
|
+
- lib/pullmatic/resource/filesystem.rb
|
221
|
+
- lib/pullmatic/resource/interface.rb
|
222
|
+
- lib/pullmatic/resource/network.rb
|
223
|
+
- lib/pullmatic/resource/os.rb
|
224
|
+
- lib/pullmatic/resource/user_group.rb
|
225
|
+
- lib/pullmatic/version.rb
|
226
|
+
- pullmatic.gemspec
|
227
|
+
homepage: ''
|
228
|
+
licenses:
|
229
|
+
- MIT
|
230
|
+
metadata: {}
|
231
|
+
post_install_message:
|
232
|
+
rdoc_options: []
|
233
|
+
require_paths:
|
234
|
+
- lib
|
235
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
236
|
+
requirements:
|
237
|
+
- - ">="
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: '0'
|
240
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
241
|
+
requirements:
|
242
|
+
- - ">="
|
243
|
+
- !ruby/object:Gem::Version
|
244
|
+
version: '0'
|
245
|
+
requirements: []
|
246
|
+
rubyforge_project:
|
247
|
+
rubygems_version: 2.2.2
|
248
|
+
signing_key:
|
249
|
+
specification_version: 4
|
250
|
+
summary: A tool for collecting server states and printing as JSON string.
|
251
|
+
test_files: []
|