systemd_service_check 1.0.0 → 1.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 +4 -4
 - data/.rubocop.yml +1 -0
 - data/.travis.yml +3 -0
 - data/{lib/systemd_service_check/CHANGELOG.md → CHANGELOG.md} +11 -3
 - data/README.md +164 -84
 - data/lib/systemd_service_check.rb +50 -4
 - data/lib/systemd_service_check/cli.rb +31 -20
 - data/lib/systemd_service_check/ssh.rb +44 -0
 - data/lib/systemd_service_check/utils.rb +56 -0
 - data/lib/systemd_service_check/version.rb +1 -1
 - data/systemd_service_check.gemspec +6 -6
 - data/systemd_service_check.sample.yml +43 -7
 - metadata +38 -10
 - data/lib/systemd_service_check/base.rb +0 -110
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: bcc52f7b0040ae6d343dc5f258d468e2b9a105352d44a73406f2615d3325eff3
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: a1e5b4b490e994a11f03707f5ebda9bf17cb5895f49c9d9808e5b9358168c6a8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: f576d59a803b1a3875f83dd018752dab4911b2dec4ba04a470374338e8f42513de9a06171bd990605c30a0bbde791c9705bafe6fad1fa2bf4773f46cb66ff14b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: bece1d59dc14f99ab8ce9c1fada8e7a9b2daf605b35816a5d8af264c60c5d595e474a6c988fa259f2f79fd953ba34c74e01ec25854d46f5434bb31526941ffa8
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/.travis.yml
    CHANGED
    
    
| 
         @@ -4,9 +4,17 @@ Please confirm details from the following. 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            https://github.com/k-ta-yamada/systemd_service_check/releases
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            ## v1.1.0
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            2018-02-08 +0900
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            - issues: https://github.com/k-ta-yamada/systemd_service_check/milestone/2?closed=1
         
     | 
| 
      
 12 
     | 
    
         
            +
            - release: https://github.com/k-ta-yamada/systemd_service_check/releases/tag/v1.1.0
         
     | 
| 
      
 13 
     | 
    
         
            +
            - commits: https://github.com/k-ta-yamada/systemd_service_check/compare/v1.0.0...v1.1.0
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       7 
15 
     | 
    
         
             
            ## v1.0.0
         
     | 
| 
       8 
16 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
            2018-01-28  
     | 
| 
      
 17 
     | 
    
         
            +
            2018-01-28 +0900
         
     | 
| 
       10 
18 
     | 
    
         | 
| 
       11 
19 
     | 
    
         
             
            - issues: https://github.com/k-ta-yamada/systemd_service_check/milestone/1?closed=1
         
     | 
| 
       12 
20 
     | 
    
         
             
            - release: https://github.com/k-ta-yamada/systemd_service_check/releases/tag/v1.0.0
         
     | 
| 
         @@ -14,14 +22,14 @@ https://github.com/k-ta-yamada/systemd_service_check/releases 
     | 
|
| 
       14 
22 
     | 
    
         | 
| 
       15 
23 
     | 
    
         
             
            ## v0.0.0
         
     | 
| 
       16 
24 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
            2018-01-25  
     | 
| 
      
 25 
     | 
    
         
            +
            2018-01-25 +0900
         
     | 
| 
       18 
26 
     | 
    
         | 
| 
       19 
27 
     | 
    
         
             
            - release: https://github.com/k-ta-yamada/systemd_service_check/releases/tag/v0.0.0
         
     | 
| 
       20 
28 
     | 
    
         
             
            - commits: https://github.com/k-ta-yamada/systemd_service_check/compare/v0.0.0-alpha...v0.0.0
         
     | 
| 
       21 
29 
     | 
    
         | 
| 
       22 
30 
     | 
    
         
             
            ## v0.0.0-alpha
         
     | 
| 
       23 
31 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
            2018-01-23  
     | 
| 
      
 32 
     | 
    
         
            +
            2018-01-23 +0900
         
     | 
| 
       25 
33 
     | 
    
         | 
| 
       26 
34 
     | 
    
         
             
            - release: https://github.com/k-ta-yamada/systemd_service_check/releases/tag/v0.0.0-alpha
         
     | 
| 
       27 
35 
     | 
    
         
             
            - commits: https://github.com/k-ta-yamada/systemd_service_check/compare/4e4adbd...v0.0.0-alpha
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            [](https://badge.fury.io/rb/systemd_service_check)
         
     | 
| 
       4 
4 
     | 
    
         
             
            [](https://travis-ci.org/k-ta-yamada/systemd_service_check)
         
     | 
| 
      
 5 
     | 
    
         
            +
            [](http://inch-ci.org/github/k-ta-yamada/systemd_service_check)
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
            This gem provide `ssc` command to check multiple `systemd service`
         
     | 
| 
       7 
8 
     | 
    
         
             
            etc on multiple remote servers using net-ssh.
         
     | 
| 
         @@ -41,7 +42,10 @@ usage as CLI: `ssc check -y ./path/to/setting.yml` 
     | 
|
| 
       41 
42 
     | 
    
         
             
            ```rb
         
     | 
| 
       42 
43 
     | 
    
         
             
            require 'systemd_service_check'
         
     | 
| 
       43 
44 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
            envs = ['dev', 'stg']
         
     | 
| 
      
 46 
     | 
    
         
            +
            yaml = './your_settings.yml'
         
     | 
| 
      
 47 
     | 
    
         
            +
            role = 'app'
         
     | 
| 
      
 48 
     | 
    
         
            +
            ssc = SystemdServiceCheck::Base.new(envs, yaml, role)
         
     | 
| 
       45 
49 
     | 
    
         | 
| 
       46 
50 
     | 
    
         
             
            puts ssc.to_json
         
     | 
| 
       47 
51 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -51,43 +55,100 @@ puts ssc.to_json 
     | 
|
| 
       51 
55 
     | 
    
         
             
            ```sh
         
     | 
| 
       52 
56 
     | 
    
         
             
            $ ssc help
         
     | 
| 
       53 
57 
     | 
    
         
             
            Commands:
         
     | 
| 
       54 
     | 
    
         
            -
              ssc check ENV [ENV...] options  # check target ENV Servers.
         
     | 
| 
       55 
     | 
    
         
            -
              ssc help [COMMAND] 
     | 
| 
       56 
     | 
    
         
            -
              ssc version 
     | 
| 
      
 58 
     | 
    
         
            +
              ssc check ENV [ENV...] [options]  # check target ENV Servers.
         
     | 
| 
      
 59 
     | 
    
         
            +
              ssc help [COMMAND]                # Describe available commands or one specific command
         
     | 
| 
      
 60 
     | 
    
         
            +
              ssc version                       # return SystemdServiceCheck::VERSION
         
     | 
| 
       57 
61 
     | 
    
         
             
            ```
         
     | 
| 
       58 
62 
     | 
    
         | 
| 
       59 
63 
     | 
    
         
             
            ```sh
         
     | 
| 
       60 
64 
     | 
    
         
             
            $ ssc help check
         
     | 
| 
       61 
65 
     | 
    
         
             
            Usage:
         
     | 
| 
       62 
     | 
    
         
            -
              ssc check ENV [ENV...] options
         
     | 
| 
      
 66 
     | 
    
         
            +
              ssc check [ENV [ENV...]] [options]
         
     | 
| 
       63 
67 
     | 
    
         | 
| 
       64 
68 
     | 
    
         
             
            Options:
         
     | 
| 
       65 
     | 
    
         
            -
              - 
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
              - 
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
      
 69 
     | 
    
         
            +
              -y, [--yaml=YAML]      # setting yaml file
         
     | 
| 
      
 70 
     | 
    
         
            +
                                     # Default: ./systemd_service_check.sample.yml
         
     | 
| 
      
 71 
     | 
    
         
            +
              -r, [--role=ROLE]      # Target the specified role
         
     | 
| 
      
 72 
     | 
    
         
            +
              -f, [--format=FORMAT]  # [t]able, [j]son, [a]wesome_print
         
     | 
| 
      
 73 
     | 
    
         
            +
                                     # Default: table
         
     | 
| 
       69 
74 
     | 
    
         | 
| 
       70 
75 
     | 
    
         
             
            check target ENV Servers.
         
     | 
| 
      
 76 
     | 
    
         
            +
            If `ENV` is omitted, the value of the first env of servers described in yaml is used.
         
     | 
| 
      
 77 
     | 
    
         
            +
            If `all` is specified for `ENV`, all ENVs are targeted.
         
     | 
| 
       71 
78 
     | 
    
         
             
            ```
         
     | 
| 
       72 
79 
     | 
    
         | 
| 
       73 
80 
     | 
    
         
             
            ```sh
         
     | 
| 
       74 
81 
     | 
    
         
             
            $ ssc check
         
     | 
| 
       75 
     | 
    
         
            -
            ENV | IP            | HOSTNAME | USER | SERVICE_NAME                   | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
            dev | 192.168.1.101 | centos7  | root | sshd.service                   | loaded     | active       | running   | enabled         | notify
         
     | 
| 
       78 
     | 
    
         
            -
            dev | 192.168.1.101 | centos7  | root | firewalld.service              | loaded     | inactive     | dead      | disabled        | dbus
         
     | 
| 
       79 
     | 
    
         
            -
            dev | 192.168.1.101 | centos7  | root | rsyslog.service                | loaded     | active       | running   | enabled         | notify
         
     | 
| 
       80 
     | 
    
         
            -
            dev | 192.168.1.101 | centos7  | root | network.service                | loaded     | active       | exited    | bad             | forking
         
     | 
| 
       81 
     | 
    
         
            -
            dev | 192.168.1.101 | centos7  | root | systemd-tmpfiles-clean.timer   | loaded     | active       | waiting   | static          | 
     | 
| 
       82 
     | 
    
         
            -
            dev | 192.168.1.101 | centos7  | root | dummy_long_name_size_30_______ | not-found  | inactive     | dead      | 
     | 
| 
      
 82 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME                   | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 83 
     | 
    
         
            +
            ----|------|---------------|----------|------|--------------------------------|------------|--------------|-----------|-----------------|--------
         
     | 
| 
      
 84 
     | 
    
         
            +
            dev |      | 192.168.1.101 | centos7  | root | sshd.service                   | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 85 
     | 
    
         
            +
            dev |      | 192.168.1.101 | centos7  | root | firewalld.service              | loaded     | inactive     | dead      | disabled        | dbus
         
     | 
| 
      
 86 
     | 
    
         
            +
            dev |      | 192.168.1.101 | centos7  | root | rsyslog.service                | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 87 
     | 
    
         
            +
            dev |      | 192.168.1.101 | centos7  | root | network.service                | loaded     | active       | exited    | bad             | forking
         
     | 
| 
      
 88 
     | 
    
         
            +
            dev |      | 192.168.1.101 | centos7  | root | systemd-tmpfiles-clean.timer   | loaded     | active       | waiting   | static          |
         
     | 
| 
      
 89 
     | 
    
         
            +
            dev |      | 192.168.1.101 | centos7  | root | dummy_long_name_size_30_______ | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME  | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 92 
     | 
    
         
            +
            ----|------|---------------|----------|------|---------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 93 
     | 
    
         
            +
            dev | ap   | 192.168.1.101 | centos7  | root | sshd.service  | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 94 
     | 
    
         
            +
            dev | ap   | 192.168.1.101 | centos7  | root | nginx.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME       | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 97 
     | 
    
         
            +
            ----|------|---------------|----------|------|--------------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 98 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | sshd.service       | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 99 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | postgresql.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 100 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | pgpool.service     | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 101 
     | 
    
         
            +
            ```
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            #### role
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
            ```sh
         
     | 
| 
      
 106 
     | 
    
         
            +
            $ ssc check --role ap
         
     | 
| 
      
 107 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME  | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 108 
     | 
    
         
            +
            ----|------|---------------|----------|------|---------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 109 
     | 
    
         
            +
            dev | ap   | 192.168.1.101 | centos7  | root | sshd.service  | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 110 
     | 
    
         
            +
            dev | ap   | 192.168.1.101 | centos7  | root | nginx.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 111 
     | 
    
         
            +
            ```
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            ```sh
         
     | 
| 
      
 114 
     | 
    
         
            +
            $ ssc check --role db
         
     | 
| 
      
 115 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME       | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 116 
     | 
    
         
            +
            ----|------|---------------|----------|------|--------------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 117 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | sshd.service       | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 118 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | postgresql.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 119 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | pgpool.service     | not-found  | inactive     | dead      |                 |
         
     | 
| 
       83 
120 
     | 
    
         
             
            ```
         
     | 
| 
       84 
121 
     | 
    
         | 
| 
      
 122 
     | 
    
         
            +
            ```sh
         
     | 
| 
      
 123 
     | 
    
         
            +
            $ ssc check all --role db
         
     | 
| 
      
 124 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME       | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 125 
     | 
    
         
            +
            ----|------|---------------|----------|------|--------------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 126 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | sshd.service       | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 127 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | postgresql.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 128 
     | 
    
         
            +
            dev | db   | 192.168.1.101 | centos7  | root | pgpool.service     | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME       | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 131 
     | 
    
         
            +
            ----|------|---------------|----------|------|--------------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 132 
     | 
    
         
            +
            stg | db   | 192.168.1.101 | centos7  | root | sshd.service       | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 133 
     | 
    
         
            +
            stg | db   | 192.168.1.101 | centos7  | root | postgresql.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 134 
     | 
    
         
            +
            stg | db   | 192.168.1.101 | centos7  | root | pgpool.service     | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
            ENV | ROLE | IP            | HOSTNAME | USER | SERVICE_NAME       | LOAD_STATE | ACTIVE_STATE | SUB_STATE | UNIT_FILE_STATE | TYPE
         
     | 
| 
      
 137 
     | 
    
         
            +
            ----|------|---------------|----------|------|--------------------|------------|--------------|-----------|-----------------|-------
         
     | 
| 
      
 138 
     | 
    
         
            +
            prd | db   | 192.168.1.101 | centos7  | root | sshd.service       | loaded     | active       | running   | enabled         | notify
         
     | 
| 
      
 139 
     | 
    
         
            +
            prd | db   | 192.168.1.101 | centos7  | root | postgresql.service | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 140 
     | 
    
         
            +
            prd | db   | 192.168.1.101 | centos7  | root | pgpool.service     | not-found  | inactive     | dead      |                 |
         
     | 
| 
      
 141 
     | 
    
         
            +
            ```
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
            #### formatting sample
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
       85 
145 
     | 
    
         
             
            ```sh
         
     | 
| 
       86 
146 
     | 
    
         
             
            $ ssc check --format=json | jq
         
     | 
| 
       87 
147 
     | 
    
         
             
            [
         
     | 
| 
       88 
148 
     | 
    
         
             
              {
         
     | 
| 
       89 
149 
     | 
    
         
             
                "server": {
         
     | 
| 
       90 
150 
     | 
    
         
             
                  "env": "dev",
         
     | 
| 
      
 151 
     | 
    
         
            +
                  "role": null,
         
     | 
| 
       91 
152 
     | 
    
         
             
                  "ip": "192.168.1.101",
         
     | 
| 
       92 
153 
     | 
    
         
             
                  "user": "root",
         
     | 
| 
       93 
154 
     | 
    
         
             
                  "options": {
         
     | 
| 
         @@ -95,16 +156,13 @@ $ ssc check --format=json | jq 
     | 
|
| 
       95 
156 
     | 
    
         
             
                    "keys": [
         
     | 
| 
       96 
157 
     | 
    
         
             
                      ""
         
     | 
| 
       97 
158 
     | 
    
         
             
                    ],
         
     | 
| 
       98 
     | 
    
         
            -
                    "logger": "#<Logger: 
     | 
| 
       99 
     | 
    
         
            -
                    "password_prompt": "#<Net::SSH::Prompt: 
     | 
| 
      
 159 
     | 
    
         
            +
                    "logger": "#<Logger:0x00007fba5bb2d730>",
         
     | 
| 
      
 160 
     | 
    
         
            +
                    "password_prompt": "#<Net::SSH::Prompt:0x00007fba5bb2d5a0>",
         
     | 
| 
       100 
161 
     | 
    
         
             
                    "user": "root"
         
     | 
| 
       101 
162 
     | 
    
         
             
                  },
         
     | 
| 
       102 
163 
     | 
    
         
             
                  "services": [
         
     | 
| 
       103 
164 
     | 
    
         
             
                    "sshd.service",
         
     | 
| 
       104 
     | 
    
         
            -
                     
     | 
| 
       105 
     | 
    
         
            -
                    "rsyslog.service",
         
     | 
| 
       106 
     | 
    
         
            -
                    "network.service",
         
     | 
| 
       107 
     | 
    
         
            -
                    "systemd-tmpfiles-clean.timer",
         
     | 
| 
      
 165 
     | 
    
         
            +
                    ...,
         
     | 
| 
       108 
166 
     | 
    
         
             
                    "dummy_long_name_size_30_______"
         
     | 
| 
       109 
167 
     | 
    
         
             
                  ],
         
     | 
| 
       110 
168 
     | 
    
         
             
                  "hostname": "centos7"
         
     | 
| 
         @@ -118,45 +176,57 @@ $ ssc check --format=json | jq 
     | 
|
| 
       118 
176 
     | 
    
         
             
                    "unit_file_state": "enabled",
         
     | 
| 
       119 
177 
     | 
    
         
             
                    "type": "notify"
         
     | 
| 
       120 
178 
     | 
    
         
             
                  },
         
     | 
| 
      
 179 
     | 
    
         
            +
                  ...,
         
     | 
| 
       121 
180 
     | 
    
         
             
                  {
         
     | 
| 
       122 
     | 
    
         
            -
                    "service_name": " 
     | 
| 
       123 
     | 
    
         
            -
                    "load_state": " 
     | 
| 
      
 181 
     | 
    
         
            +
                    "service_name": "dummy_long_name_size_30_______",
         
     | 
| 
      
 182 
     | 
    
         
            +
                    "load_state": "not-found",
         
     | 
| 
       124 
183 
     | 
    
         
             
                    "active_state": "inactive",
         
     | 
| 
       125 
184 
     | 
    
         
             
                    "sub_state": "dead",
         
     | 
| 
       126 
     | 
    
         
            -
                    "unit_file_state":  
     | 
| 
       127 
     | 
    
         
            -
                    "type":  
     | 
| 
      
 185 
     | 
    
         
            +
                    "unit_file_state": null,
         
     | 
| 
      
 186 
     | 
    
         
            +
                    "type": null
         
     | 
| 
      
 187 
     | 
    
         
            +
                  }
         
     | 
| 
      
 188 
     | 
    
         
            +
                ]
         
     | 
| 
      
 189 
     | 
    
         
            +
              },
         
     | 
| 
      
 190 
     | 
    
         
            +
              ...,
         
     | 
| 
      
 191 
     | 
    
         
            +
              {
         
     | 
| 
      
 192 
     | 
    
         
            +
                "server": {
         
     | 
| 
      
 193 
     | 
    
         
            +
                  "env": "dev",
         
     | 
| 
      
 194 
     | 
    
         
            +
                  "role": "db",
         
     | 
| 
      
 195 
     | 
    
         
            +
                  "ip": "192.168.1.101",
         
     | 
| 
      
 196 
     | 
    
         
            +
                  "user": "root",
         
     | 
| 
      
 197 
     | 
    
         
            +
                  "options": {
         
     | 
| 
      
 198 
     | 
    
         
            +
                    "password": "vagrant",
         
     | 
| 
      
 199 
     | 
    
         
            +
                    "keys": [
         
     | 
| 
      
 200 
     | 
    
         
            +
                      ""
         
     | 
| 
      
 201 
     | 
    
         
            +
                    ],
         
     | 
| 
      
 202 
     | 
    
         
            +
                    "logger": "#<Logger:0x00007fba5bad2c90>",
         
     | 
| 
      
 203 
     | 
    
         
            +
                    "password_prompt": "#<Net::SSH::Prompt:0x00007fba5bb2d5a0>",
         
     | 
| 
      
 204 
     | 
    
         
            +
                    "user": "root"
         
     | 
| 
       128 
205 
     | 
    
         
             
                  },
         
     | 
| 
      
 206 
     | 
    
         
            +
                  "services": [
         
     | 
| 
      
 207 
     | 
    
         
            +
                    "sshd.service",
         
     | 
| 
      
 208 
     | 
    
         
            +
                    "postgresql.service",
         
     | 
| 
      
 209 
     | 
    
         
            +
                    "pgpool.service"
         
     | 
| 
      
 210 
     | 
    
         
            +
                  ],
         
     | 
| 
      
 211 
     | 
    
         
            +
                  "hostname": "centos7"
         
     | 
| 
      
 212 
     | 
    
         
            +
                },
         
     | 
| 
      
 213 
     | 
    
         
            +
                "services": [
         
     | 
| 
       129 
214 
     | 
    
         
             
                  {
         
     | 
| 
       130 
     | 
    
         
            -
                    "service_name": " 
     | 
| 
      
 215 
     | 
    
         
            +
                    "service_name": "sshd.service",
         
     | 
| 
       131 
216 
     | 
    
         
             
                    "load_state": "loaded",
         
     | 
| 
       132 
217 
     | 
    
         
             
                    "active_state": "active",
         
     | 
| 
       133 
218 
     | 
    
         
             
                    "sub_state": "running",
         
     | 
| 
       134 
219 
     | 
    
         
             
                    "unit_file_state": "enabled",
         
     | 
| 
       135 
220 
     | 
    
         
             
                    "type": "notify"
         
     | 
| 
       136 
221 
     | 
    
         
             
                  },
         
     | 
| 
      
 222 
     | 
    
         
            +
                  ...,
         
     | 
| 
       137 
223 
     | 
    
         
             
                  {
         
     | 
| 
       138 
     | 
    
         
            -
                    "service_name": " 
     | 
| 
       139 
     | 
    
         
            -
                    "load_state": "loaded",
         
     | 
| 
       140 
     | 
    
         
            -
                    "active_state": "active",
         
     | 
| 
       141 
     | 
    
         
            -
                    "sub_state": "exited",
         
     | 
| 
       142 
     | 
    
         
            -
                    "unit_file_state": "bad",
         
     | 
| 
       143 
     | 
    
         
            -
                    "type": "forking"
         
     | 
| 
       144 
     | 
    
         
            -
                  },
         
     | 
| 
       145 
     | 
    
         
            -
                  {
         
     | 
| 
       146 
     | 
    
         
            -
                    "service_name": "systemd-tmpfiles-clean.timer",
         
     | 
| 
       147 
     | 
    
         
            -
                    "load_state": "loaded",
         
     | 
| 
       148 
     | 
    
         
            -
                    "active_state": "active",
         
     | 
| 
       149 
     | 
    
         
            -
                    "sub_state": "waiting",
         
     | 
| 
       150 
     | 
    
         
            -
                    "unit_file_state": "static",
         
     | 
| 
       151 
     | 
    
         
            -
                    "type": "n/a"
         
     | 
| 
       152 
     | 
    
         
            -
                  },
         
     | 
| 
       153 
     | 
    
         
            -
                  {
         
     | 
| 
       154 
     | 
    
         
            -
                    "service_name": "dummy_long_name_size_30_______",
         
     | 
| 
      
 224 
     | 
    
         
            +
                    "service_name": "pgpool.service",
         
     | 
| 
       155 
225 
     | 
    
         
             
                    "load_state": "not-found",
         
     | 
| 
       156 
226 
     | 
    
         
             
                    "active_state": "inactive",
         
     | 
| 
       157 
227 
     | 
    
         
             
                    "sub_state": "dead",
         
     | 
| 
       158 
     | 
    
         
            -
                    "unit_file_state":  
     | 
| 
       159 
     | 
    
         
            -
                    "type":  
     | 
| 
      
 228 
     | 
    
         
            +
                    "unit_file_state": null,
         
     | 
| 
      
 229 
     | 
    
         
            +
                    "type": null
         
     | 
| 
       160 
230 
     | 
    
         
             
                  }
         
     | 
| 
       161 
231 
     | 
    
         
             
                ]
         
     | 
| 
       162 
232 
     | 
    
         
             
              }
         
     | 
| 
         @@ -166,8 +236,8 @@ $ ssc check --format=json | jq 
     | 
|
| 
       166 
236 
     | 
    
         
             
            ```sh
         
     | 
| 
       167 
237 
     | 
    
         
             
            $ ssc check --format=awesome_print
         
     | 
| 
       168 
238 
     | 
    
         
             
            [
         
     | 
| 
       169 
     | 
    
         
            -
                [0] #<Struct:SystemdServiceCheck:: 
     | 
| 
       170 
     | 
    
         
            -
                    server = #<Struct:SystemdServiceCheck::Base::Server: 
     | 
| 
      
 239 
     | 
    
         
            +
                [0] #<Struct:SystemdServiceCheck::SSH::Result:0x7fb39db78678
         
     | 
| 
      
 240 
     | 
    
         
            +
                    server = #<Struct:SystemdServiceCheck::Base::Server:0x7fb39dac6ec8
         
     | 
| 
       171 
241 
     | 
    
         
             
                        env = "dev",
         
     | 
| 
       172 
242 
     | 
    
         
             
                        hostname = "centos7",
         
     | 
| 
       173 
243 
     | 
    
         
             
                        ip = "192.168.1.101",
         
     | 
| 
         @@ -176,22 +246,20 @@ $ ssc check --format=awesome_print 
     | 
|
| 
       176 
246 
     | 
    
         
             
                                       :keys => [
         
     | 
| 
       177 
247 
     | 
    
         
             
                                [0] ""
         
     | 
| 
       178 
248 
     | 
    
         
             
                            ],
         
     | 
| 
       179 
     | 
    
         
            -
                                     :logger => #<Logger: 
     | 
| 
       180 
     | 
    
         
            -
                            :password_prompt => #<Net::SSH::Prompt: 
     | 
| 
      
 249 
     | 
    
         
            +
                                     :logger => #<Logger:0x00007fb39dac5d98 @level=4, @progname=nil, @default_formatter=#<Logger::Formatter:0x00007fb39dac5cf8 @datetime_format=nil>, @formatter=nil, @logdev=#<Logger::LogDevice:0x00007fb39dac5ca8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDERR>>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x00007fb39dac5c30>>>,
         
     | 
| 
      
 250 
     | 
    
         
            +
                            :password_prompt => #<Net::SSH::Prompt:0x00007fb39dac5bb8>,
         
     | 
| 
       181 
251 
     | 
    
         
             
                                       :user => "root"
         
     | 
| 
       182 
252 
     | 
    
         
             
                        },
         
     | 
| 
      
 253 
     | 
    
         
            +
                        role = nil,
         
     | 
| 
       183 
254 
     | 
    
         
             
                        services = [
         
     | 
| 
       184 
255 
     | 
    
         
             
                            [0] "sshd.service",
         
     | 
| 
       185 
     | 
    
         
            -
                             
     | 
| 
       186 
     | 
    
         
            -
                            [2] "rsyslog.service",
         
     | 
| 
       187 
     | 
    
         
            -
                            [3] "network.service",
         
     | 
| 
       188 
     | 
    
         
            -
                            [4] "systemd-tmpfiles-clean.timer",
         
     | 
| 
      
 256 
     | 
    
         
            +
                            ...,
         
     | 
| 
       189 
257 
     | 
    
         
             
                            [5] "dummy_long_name_size_30_______"
         
     | 
| 
       190 
258 
     | 
    
         
             
                        ],
         
     | 
| 
       191 
259 
     | 
    
         
             
                        user = "root"
         
     | 
| 
       192 
260 
     | 
    
         
             
                    >,
         
     | 
| 
       193 
261 
     | 
    
         
             
                    services = [
         
     | 
| 
       194 
     | 
    
         
            -
                        [0] #<Struct:SystemdServiceCheck:: 
     | 
| 
      
 262 
     | 
    
         
            +
                        [0] #<Struct:SystemdServiceCheck::SSH::Service:0x7fb39da6bc08
         
     | 
| 
       195 
263 
     | 
    
         
             
                            active_state = "active",
         
     | 
| 
       196 
264 
     | 
    
         
             
                            load_state = "loaded",
         
     | 
| 
       197 
265 
     | 
    
         
             
                            service_name = "sshd.service",
         
     | 
| 
         @@ -199,45 +267,57 @@ $ ssc check --format=awesome_print 
     | 
|
| 
       199 
267 
     | 
    
         
             
                            type = "notify",
         
     | 
| 
       200 
268 
     | 
    
         
             
                            unit_file_state = "enabled"
         
     | 
| 
       201 
269 
     | 
    
         
             
                        >,
         
     | 
| 
       202 
     | 
    
         
            -
                         
     | 
| 
      
 270 
     | 
    
         
            +
                        ...,
         
     | 
| 
      
 271 
     | 
    
         
            +
                        [5] #<Struct:SystemdServiceCheck::SSH::Service:0x7fb39db78bc8
         
     | 
| 
       203 
272 
     | 
    
         
             
                            active_state = "inactive",
         
     | 
| 
       204 
     | 
    
         
            -
                            load_state = " 
     | 
| 
       205 
     | 
    
         
            -
                            service_name = " 
     | 
| 
      
 273 
     | 
    
         
            +
                            load_state = "not-found",
         
     | 
| 
      
 274 
     | 
    
         
            +
                            service_name = "dummy_long_name_size_30_______",
         
     | 
| 
       206 
275 
     | 
    
         
             
                            sub_state = "dead",
         
     | 
| 
       207 
     | 
    
         
            -
                            type =  
     | 
| 
       208 
     | 
    
         
            -
                            unit_file_state =  
     | 
| 
       209 
     | 
    
         
            -
                         
     | 
| 
       210 
     | 
    
         
            -
             
     | 
| 
      
 276 
     | 
    
         
            +
                            type = nil,
         
     | 
| 
      
 277 
     | 
    
         
            +
                            unit_file_state = nil
         
     | 
| 
      
 278 
     | 
    
         
            +
                        >
         
     | 
| 
      
 279 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 280 
     | 
    
         
            +
                >,
         
     | 
| 
      
 281 
     | 
    
         
            +
                ...,
         
     | 
| 
      
 282 
     | 
    
         
            +
                [2] #<Struct:SystemdServiceCheck::SSH::Result:0x7fb39e044cd8
         
     | 
| 
      
 283 
     | 
    
         
            +
                    server = #<Struct:SystemdServiceCheck::Base::Server:0x7fb39dac6888
         
     | 
| 
      
 284 
     | 
    
         
            +
                        env = "dev",
         
     | 
| 
      
 285 
     | 
    
         
            +
                        hostname = "centos7",
         
     | 
| 
      
 286 
     | 
    
         
            +
                        ip = "192.168.1.101",
         
     | 
| 
      
 287 
     | 
    
         
            +
                        options = {
         
     | 
| 
      
 288 
     | 
    
         
            +
                                   :password => "vagrant",
         
     | 
| 
      
 289 
     | 
    
         
            +
                                       :keys => [
         
     | 
| 
      
 290 
     | 
    
         
            +
                                [0] ""
         
     | 
| 
      
 291 
     | 
    
         
            +
                            ],
         
     | 
| 
      
 292 
     | 
    
         
            +
                                     :logger => #<Logger:0x00007fb39e9c9858 @level=4, @progname=nil, @default_formatter=#<Logger::Formatter:0x00007fb39e9c9808 @datetime_format=nil>, @formatter=nil, @logdev=#<Logger::LogDevice:0x00007fb39e9c9790 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDERR>>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x00007fb39e9c96f0>>>,
         
     | 
| 
      
 293 
     | 
    
         
            +
                            :password_prompt => #<Net::SSH::Prompt:0x00007fb39dac5bb8>,
         
     | 
| 
      
 294 
     | 
    
         
            +
                                       :user => "root"
         
     | 
| 
      
 295 
     | 
    
         
            +
                        },
         
     | 
| 
      
 296 
     | 
    
         
            +
                        role = "db",
         
     | 
| 
      
 297 
     | 
    
         
            +
                        services = [
         
     | 
| 
      
 298 
     | 
    
         
            +
                            [0] "sshd.service",
         
     | 
| 
      
 299 
     | 
    
         
            +
                            [1] "postgresql.service",
         
     | 
| 
      
 300 
     | 
    
         
            +
                            [2] "pgpool.service"
         
     | 
| 
      
 301 
     | 
    
         
            +
                        ],
         
     | 
| 
      
 302 
     | 
    
         
            +
                        user = "root"
         
     | 
| 
      
 303 
     | 
    
         
            +
                    >,
         
     | 
| 
      
 304 
     | 
    
         
            +
                    services = [
         
     | 
| 
      
 305 
     | 
    
         
            +
                        [0] #<Struct:SystemdServiceCheck::SSH::Service:0x7fb39dbd5b98
         
     | 
| 
       211 
306 
     | 
    
         
             
                            active_state = "active",
         
     | 
| 
       212 
307 
     | 
    
         
             
                            load_state = "loaded",
         
     | 
| 
       213 
     | 
    
         
            -
                            service_name = " 
     | 
| 
      
 308 
     | 
    
         
            +
                            service_name = "sshd.service",
         
     | 
| 
       214 
309 
     | 
    
         
             
                            sub_state = "running",
         
     | 
| 
       215 
310 
     | 
    
         
             
                            type = "notify",
         
     | 
| 
       216 
311 
     | 
    
         
             
                            unit_file_state = "enabled"
         
     | 
| 
       217 
312 
     | 
    
         
             
                        >,
         
     | 
| 
       218 
     | 
    
         
            -
                         
     | 
| 
       219 
     | 
    
         
            -
             
     | 
| 
       220 
     | 
    
         
            -
                            load_state = "loaded",
         
     | 
| 
       221 
     | 
    
         
            -
                            service_name = "network.service",
         
     | 
| 
       222 
     | 
    
         
            -
                            sub_state = "exited",
         
     | 
| 
       223 
     | 
    
         
            -
                            type = "forking",
         
     | 
| 
       224 
     | 
    
         
            -
                            unit_file_state = "bad"
         
     | 
| 
       225 
     | 
    
         
            -
                        >,
         
     | 
| 
       226 
     | 
    
         
            -
                        [4] #<Struct:SystemdServiceCheck::Base::Service:0x7fabed8c6db0
         
     | 
| 
       227 
     | 
    
         
            -
                            active_state = "active",
         
     | 
| 
       228 
     | 
    
         
            -
                            load_state = "loaded",
         
     | 
| 
       229 
     | 
    
         
            -
                            service_name = "systemd-tmpfiles-clean.timer",
         
     | 
| 
       230 
     | 
    
         
            -
                            sub_state = "waiting",
         
     | 
| 
       231 
     | 
    
         
            -
                            type = "n/a",
         
     | 
| 
       232 
     | 
    
         
            -
                            unit_file_state = "static"
         
     | 
| 
       233 
     | 
    
         
            -
                        >,
         
     | 
| 
       234 
     | 
    
         
            -
                        [5] #<Struct:SystemdServiceCheck::Base::Service:0x7fabeca9b1f0
         
     | 
| 
      
 313 
     | 
    
         
            +
                        ...,
         
     | 
| 
      
 314 
     | 
    
         
            +
                        [2] #<Struct:SystemdServiceCheck::SSH::Service:0x7fb39e045048
         
     | 
| 
       235 
315 
     | 
    
         
             
                            active_state = "inactive",
         
     | 
| 
       236 
316 
     | 
    
         
             
                            load_state = "not-found",
         
     | 
| 
       237 
     | 
    
         
            -
                            service_name = " 
     | 
| 
      
 317 
     | 
    
         
            +
                            service_name = "pgpool.service",
         
     | 
| 
       238 
318 
     | 
    
         
             
                            sub_state = "dead",
         
     | 
| 
       239 
     | 
    
         
            -
                            type =  
     | 
| 
       240 
     | 
    
         
            -
                            unit_file_state =  
     | 
| 
      
 319 
     | 
    
         
            +
                            type = nil,
         
     | 
| 
      
 320 
     | 
    
         
            +
                            unit_file_state = nil
         
     | 
| 
       241 
321 
     | 
    
         
             
                        >
         
     | 
| 
       242 
322 
     | 
    
         
             
                    ]
         
     | 
| 
       243 
323 
     | 
    
         
             
                >
         
     | 
| 
         @@ -1,6 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'net/ssh'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'thor'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'awesome_print'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'table_print'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'yaml'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'json'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'pry' # forDebug
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       1 
9 
     | 
    
         
             
            require "systemd_service_check/version"
         
     | 
| 
       2 
     | 
    
         
            -
            require  
     | 
| 
      
 10 
     | 
    
         
            +
            require 'systemd_service_check/utils'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'systemd_service_check/ssh'
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            module SystemdServiceCheck
         
     | 
| 
      
 14 
     | 
    
         
            +
              # Base
         
     | 
| 
      
 15 
     | 
    
         
            +
              class Base
         
     | 
| 
      
 16 
     | 
    
         
            +
                include Utils
         
     | 
| 
      
 17 
     | 
    
         
            +
                include SSH
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                attr_reader :envs, :role, :servers, :target_envs, :target_servers, :results
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                # @param envs [Arrat<String>]
         
     | 
| 
      
 22 
     | 
    
         
            +
                # @param yaml [String]
         
     | 
| 
      
 23 
     | 
    
         
            +
                # @param role [String]
         
     | 
| 
      
 24 
     | 
    
         
            +
                def initialize(envs, yaml, role = nil)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  raise Utils::InvalidOptionError, "Argument `yaml` must not be blank." if blank? yaml
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  @envs           = envs || []
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @role           = role.nil? || role.empty? ? nil : role
         
     | 
| 
      
 29 
     | 
    
         
            +
                  @servers        = servers_from(yaml)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @target_envs    = configure_target_envs(envs, @servers)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @target_servers = configure_target_servers(@servers, @target_envs, @role)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  @results        = []
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def run
         
     | 
| 
      
 36 
     | 
    
         
            +
                  @results = @target_servers.map { |server| ssh(server) }
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                def to_json
         
     | 
| 
      
 40 
     | 
    
         
            +
                  @results.map do |result|
         
     | 
| 
      
 41 
     | 
    
         
            +
                    { server:   result.server.to_h,
         
     | 
| 
      
 42 
     | 
    
         
            +
                      services: result.services.map(&:to_h) }
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end.to_json
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                private
         
     | 
| 
       3 
47 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 48 
     | 
    
         
            +
                def blank?(yaml)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  yaml.nil? || yaml.empty?
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,8 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'systemd_service_check'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'thor'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'awesome_print'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'table_print'
         
     | 
| 
       5 
     | 
    
         
            -
            require 'pry' # forDebug
         
     | 
| 
       6 
2 
     | 
    
         | 
| 
       7 
3 
     | 
    
         
             
            # ###############################################################################
         
     | 
| 
       8 
4 
     | 
    
         
             
            # MEMO: This patch is a copy of https://github.com/arches/table_print/pull/70
         
     | 
| 
         @@ -13,33 +9,43 @@ require 'table_print-patch-pr70/formatter' 
     | 
|
| 
       13 
9 
     | 
    
         
             
            module SystemdServiceCheck
         
     | 
| 
       14 
10 
     | 
    
         
             
              # CLI
         
     | 
| 
       15 
11 
     | 
    
         
             
              class CLI < Thor
         
     | 
| 
       16 
     | 
    
         
            -
                class  
     | 
| 
      
 12 
     | 
    
         
            +
                class InvalidFormatOptionError < StandardError; end
         
     | 
| 
       17 
13 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
                option :format,
         
     | 
| 
       19 
     | 
    
         
            -
                       type:    :string,
         
     | 
| 
       20 
     | 
    
         
            -
                       aliases: '-f',
         
     | 
| 
       21 
     | 
    
         
            -
                       desc:    "[t]able, [j]son, [a]wesome_print",
         
     | 
| 
       22 
     | 
    
         
            -
                       banner:  'table',
         
     | 
| 
       23 
     | 
    
         
            -
                       default: 'table'
         
     | 
| 
       24 
14 
     | 
    
         
             
                option :yaml,
         
     | 
| 
       25 
15 
     | 
    
         
             
                       type:    :string,
         
     | 
| 
       26 
16 
     | 
    
         
             
                       aliases: '-y',
         
     | 
| 
       27 
17 
     | 
    
         
             
                       desc:    'setting yaml file',
         
     | 
| 
       28 
     | 
    
         
            -
                       banner:  './systemd_service_check.sample.yml',
         
     | 
| 
       29 
18 
     | 
    
         
             
                       default: './systemd_service_check.sample.yml'
         
     | 
| 
      
 19 
     | 
    
         
            +
                option :role,
         
     | 
| 
      
 20 
     | 
    
         
            +
                       type:    :string,
         
     | 
| 
      
 21 
     | 
    
         
            +
                       aliases: '-r',
         
     | 
| 
      
 22 
     | 
    
         
            +
                       desc:    'Target the specified role'
         
     | 
| 
      
 23 
     | 
    
         
            +
                option :format,
         
     | 
| 
      
 24 
     | 
    
         
            +
                       type:    :string,
         
     | 
| 
      
 25 
     | 
    
         
            +
                       aliases: '-f',
         
     | 
| 
      
 26 
     | 
    
         
            +
                       desc:    '[t]able, [j]son, [a]wesome_print',
         
     | 
| 
      
 27 
     | 
    
         
            +
                       default: 'table'
         
     | 
| 
       30 
28 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                 
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                   
     | 
| 
       34 
     | 
    
         
            -
                   
     | 
| 
      
 29 
     | 
    
         
            +
                description = <<~DESCRIPTION
         
     | 
| 
      
 30 
     | 
    
         
            +
                  check target ENV Servers.
         
     | 
| 
      
 31 
     | 
    
         
            +
                  If `ENV` is omitted, the value of the first env of servers described in yaml is used.
         
     | 
| 
      
 32 
     | 
    
         
            +
                  If `all` is specified for `ENV`, all ENVs are targeted.
         
     | 
| 
      
 33 
     | 
    
         
            +
                DESCRIPTION
         
     | 
| 
      
 34 
     | 
    
         
            +
                desc 'check [ENV [ENV...]] [options]', description
         
     | 
| 
      
 35 
     | 
    
         
            +
                def check(*envs) # rubocop:disable Metrics/AbcSize:
         
     | 
| 
      
 36 
     | 
    
         
            +
                  raise InvalidFormatOptionError unless format_option_validate
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  @ssc = Base.new(envs, options[:yaml], options[:role])
         
     | 
| 
      
 39 
     | 
    
         
            +
                  @ssc.run
         
     | 
| 
       35 
40 
     | 
    
         
             
                  disp
         
     | 
| 
       36 
     | 
    
         
            -
                rescue  
     | 
| 
      
 41 
     | 
    
         
            +
                rescue InvalidFormatOptionError => e
         
     | 
| 
       37 
42 
     | 
    
         
             
                  puts "<#{e}>",
         
     | 
| 
       38 
43 
     | 
    
         
             
                       "  [#{options[:format]}] is invalid value."
         
     | 
| 
       39 
44 
     | 
    
         
             
                  puts "  #{e.backtrace_locations.first}"
         
     | 
| 
       40 
45 
     | 
    
         
             
                end
         
     | 
| 
       41 
46 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                desc  
     | 
| 
      
 47 
     | 
    
         
            +
                desc 'version',
         
     | 
| 
      
 48 
     | 
    
         
            +
                     'return SystemdServiceCheck::VERSION'
         
     | 
| 
       43 
49 
     | 
    
         
             
                def version
         
     | 
| 
       44 
50 
     | 
    
         
             
                  puts VERSION
         
     | 
| 
       45 
51 
     | 
    
         
             
                end
         
     | 
| 
         @@ -66,8 +72,11 @@ module SystemdServiceCheck 
     | 
|
| 
       66 
72 
     | 
    
         
             
                  ap @ssc.results
         
     | 
| 
       67 
73 
     | 
    
         
             
                end
         
     | 
| 
       68 
74 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
                 
     | 
| 
       70 
     | 
    
         
            -
                 
     | 
| 
      
 75 
     | 
    
         
            +
                # rubocop:disable Metrics/LineLength
         
     | 
| 
      
 76 
     | 
    
         
            +
                COLS = %i[env role ip hostname user service_name].concat(Utils::PROPERTY_TO_SNAKE_SYM).freeze
         
     | 
| 
      
 77 
     | 
    
         
            +
                # rubocop:enable Metrics/LineLength
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                def disp_table # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
         
     | 
| 
       71 
80 
     | 
    
         
             
                  service_name_width =
         
     | 
| 
       72 
81 
     | 
    
         
             
                    @ssc.results.map(&:services).flatten.map(&:service_name).map(&:size).max
         
     | 
| 
       73 
82 
     | 
    
         | 
| 
         @@ -80,10 +89,12 @@ module SystemdServiceCheck 
     | 
|
| 
       80 
89 
     | 
    
         
             
                  end
         
     | 
| 
       81 
90 
     | 
    
         | 
| 
       82 
91 
     | 
    
         
             
                  # ref: https://github.com/erikhuda/thor/blob/master/lib/thor/shell.rb#L14
         
     | 
| 
      
 92 
     | 
    
         
            +
                  # rubocop:disable Style/GuardClause
         
     | 
| 
       83 
93 
     | 
    
         
             
                  if RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ && !ENV["ANSICON"]
         
     | 
| 
       84 
94 
     | 
    
         
             
                    puts "-- For colors on windows, please setup `ANSICON`.",
         
     | 
| 
       85 
95 
     | 
    
         
             
                         "-- ANSICON: https://github.com/adoxa/ansicon"
         
     | 
| 
       86 
96 
     | 
    
         
             
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
                  # rubocop:enable Style/GuardClause
         
     | 
| 
       87 
98 
     | 
    
         
             
                end
         
     | 
| 
       88 
99 
     | 
    
         | 
| 
       89 
100 
     | 
    
         
             
                def decorate_ansi_color(services)
         
     | 
| 
         @@ -0,0 +1,44 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # SystemdServiceCheck
         
     | 
| 
      
 2 
     | 
    
         
            +
            module SystemdServiceCheck
         
     | 
| 
      
 3 
     | 
    
         
            +
              # SSH
         
     | 
| 
      
 4 
     | 
    
         
            +
              module SSH
         
     | 
| 
      
 5 
     | 
    
         
            +
                # @param server [Utils::Server]
         
     | 
| 
      
 6 
     | 
    
         
            +
                # @return [Utils::Result]
         
     | 
| 
      
 7 
     | 
    
         
            +
                def ssh(server)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  services = []
         
     | 
| 
      
 9 
     | 
    
         
            +
                  Net::SSH.start(*server.conn_info) do |ssh|
         
     | 
| 
      
 10 
     | 
    
         
            +
                    server[:hostname] = hostname(ssh)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    services =
         
     | 
| 
      
 12 
     | 
    
         
            +
                      server[:services].map { |service_name| systemctl_show(ssh, service_name) }
         
     | 
| 
      
 13 
     | 
    
         
            +
                    # TODO: store in Result object
         
     | 
| 
      
 14 
     | 
    
         
            +
                    # puts ssh.exec!("systemctl list-timers")
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  Utils::Result.new(server, services)
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                # @param ssh [Net::SSH::Connection::Session]
         
     | 
| 
      
 20 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 21 
     | 
    
         
            +
                def hostname(ssh)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  ssh.exec!('hostname').chomp
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                # @param ssh [Net::SSH::Connection::Session]
         
     | 
| 
      
 26 
     | 
    
         
            +
                # @param service_name [String]
         
     | 
| 
      
 27 
     | 
    
         
            +
                # @return [Utils::Service]
         
     | 
| 
      
 28 
     | 
    
         
            +
                def systemctl_show(ssh, service_name)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  prop = ssh.exec!("systemctl show #{service_name} -p #{Utils::PROPERTY.join(",")}")
         
     | 
| 
      
 30 
     | 
    
         
            +
                  Utils::Service.new(service_name, *split_property(prop))
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                private
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def split_property(property)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  ret = property.split("\n")
         
     | 
| 
      
 37 
     | 
    
         
            +
                                .map { |v| v.split("=") }
         
     | 
| 
      
 38 
     | 
    
         
            +
                                .map { |(v1, v2)| [Thor::Util.snake_case(v1).to_sym, v2] }
         
     | 
| 
      
 39 
     | 
    
         
            +
                                .each_with_object({}) { |(k, v), memo| memo[k] = v }
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  Utils::PROPERTY_TO_SNAKE_SYM.map { |k| ret[k] }
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SystemdServiceCheck
         
     | 
| 
      
 2 
     | 
    
         
            +
              # Included in: SystemdServiceCheck::Base
         
     | 
| 
      
 3 
     | 
    
         
            +
              module Utils
         
     | 
| 
      
 4 
     | 
    
         
            +
                # TODO: systemctl show -p
         
     | 
| 
      
 5 
     | 
    
         
            +
                PROPERTY = %w[LoadState ActiveState SubState UnitFileState Type].freeze
         
     | 
| 
      
 6 
     | 
    
         
            +
                PROPERTY_TO_SNAKE_SYM = PROPERTY.map { |v| Thor::Util.snake_case(v).to_sym }
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                class InvalidOptionError < StandardError; end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                Server = Struct.new(:env, :role, :ip, :user, :options, :services, :hostname) do
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # @return [Array<String, String, Hash>] for Net::SSH.start(*conn_info)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  # @see SSH
         
     | 
| 
      
 13 
     | 
    
         
            +
                  # @see Net::SSH
         
     | 
| 
      
 14 
     | 
    
         
            +
                  def conn_info
         
     | 
| 
      
 15 
     | 
    
         
            +
                    [ip, user, options]
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
                Service = Struct.new(:service_name, *PROPERTY_TO_SNAKE_SYM)
         
     | 
| 
      
 19 
     | 
    
         
            +
                Result  = Struct.new(:server, :services)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                # @param yaml_filename [String] YAML filename with the description of the setting.
         
     | 
| 
      
 22 
     | 
    
         
            +
                # @return [Array<Utils::Server>]
         
     | 
| 
      
 23 
     | 
    
         
            +
                def servers_from(yaml_filename) # rubocop:disable Metrics/AbcSize
         
     | 
| 
      
 24 
     | 
    
         
            +
                  yaml = JSON.parse(YAML.load_file(yaml_filename).to_json, symbolize_names: true)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  yaml[:servers].map do |s|
         
     | 
| 
      
 27 
     | 
    
         
            +
                    raise InvalidOptionError, "ENV: #{s[:env]}" if [s[:password], s[:key]].all?(&:nil?) # rubocop:disable Metrics/LineLength
         
     | 
| 
      
 28 
     | 
    
         
            +
                    options = { password: s[:password], keys: [s[:key] || ""] }
         
     | 
| 
      
 29 
     | 
    
         
            +
                    Server.new(s[:env], s[:role], s[:ip], s[:user], options, s[:services])
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                # @param argv [Array<String>] Array of ENVs specified with the `ssc check` command.
         
     | 
| 
      
 34 
     | 
    
         
            +
                # @param servers [Array<Utils::Server>] Server settings.
         
     | 
| 
      
 35 
     | 
    
         
            +
                # @return [Array<String>] Environment list to be processed.
         
     | 
| 
      
 36 
     | 
    
         
            +
                def configure_target_envs(argv, servers)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  all_envs = servers.map { |s| s[:env] }.uniq
         
     | 
| 
      
 38 
     | 
    
         
            +
                  target_envs = all_envs & argv
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                  # If there is no argument.
         
     | 
| 
      
 41 
     | 
    
         
            +
                  target_envs = all_envs.first if target_envs.empty? && argv.empty?
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # If there is only one argument and it is `all`.
         
     | 
| 
      
 43 
     | 
    
         
            +
                  target_envs = all_envs if argv.size == 1 && argv.first == 'all'
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  Array(target_envs)
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                # @param servers [Array<Utils::Server>]
         
     | 
| 
      
 49 
     | 
    
         
            +
                # @param target_envs [Array<String>] Environment list to be processed.
         
     | 
| 
      
 50 
     | 
    
         
            +
                # @return [Array<Utils::Server>]
         
     | 
| 
      
 51 
     | 
    
         
            +
                def configure_target_servers(servers, target_envs, role)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  servers.select { |s| target_envs.include?(s[:env]) }
         
     | 
| 
      
 53 
     | 
    
         
            +
                         .select { |s| role.nil? || role.empty? ? true : s[:role] == role }
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -9,12 +9,10 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       9 
9 
     | 
    
         
             
              spec.authors       = ["k-ta-yamada"]
         
     | 
| 
       10 
10 
     | 
    
         
             
              spec.email         = ["key.luvless@gmail.com"]
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
              spec. 
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
              spec.description   =
         
     | 
| 
       16 
     | 
    
         
            -
                'This gem provide `ssc` command to check multiple `systemd service` \
         
     | 
| 
       17 
     | 
    
         
            -
                etc on multiple remote servers using net-ssh.'
         
     | 
| 
      
 12 
     | 
    
         
            +
              spec.required_ruby_version = '>= 2.3.0'
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              spec.summary       = 'This gem provide `ssc` command to check multiple `systemd service` etc on multiple remote servers using net-ssh.'
         
     | 
| 
      
 15 
     | 
    
         
            +
              spec.description   = 'This gem provide `ssc` command to check multiple `systemd service` etc on multiple remote servers using net-ssh.'
         
     | 
| 
       18 
16 
     | 
    
         
             
              spec.homepage      = "https://github.com/k-ta-yamada/systemd_service_check"
         
     | 
| 
       19 
17 
     | 
    
         
             
              spec.license       = "MIT"
         
     | 
| 
       20 
18 
     | 
    
         | 
| 
         @@ -40,6 +38,8 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       40 
38 
     | 
    
         
             
              spec.add_development_dependency "minitest", "~> 5.0"
         
     | 
| 
       41 
39 
     | 
    
         
             
              spec.add_development_dependency "rake", "~> 10.0"
         
     | 
| 
       42 
40 
     | 
    
         | 
| 
      
 41 
     | 
    
         
            +
              spec.add_development_dependency 'capture_stdout'
         
     | 
| 
      
 42 
     | 
    
         
            +
              spec.add_development_dependency 'minitest-reporters'
         
     | 
| 
       43 
43 
     | 
    
         
             
              spec.add_development_dependency 'pry-doc'
         
     | 
| 
       44 
44 
     | 
    
         
             
              spec.add_development_dependency 'pry-theme'
         
     | 
| 
       45 
45 
     | 
    
         
             
              spec.add_development_dependency 'rubocop'
         
     | 
| 
         @@ -6,27 +6,63 @@ services: &default_services 
     | 
|
| 
       6 
6 
     | 
    
         
             
              - network.service
         
     | 
| 
       7 
7 
     | 
    
         
             
              - systemd-tmpfiles-clean.timer
         
     | 
| 
       8 
8 
     | 
    
         
             
              - dummy_long_name_size_30_______
         
     | 
| 
      
 9 
     | 
    
         
            +
            ap_services: &ap_services
         
     | 
| 
      
 10 
     | 
    
         
            +
              - sshd.service
         
     | 
| 
      
 11 
     | 
    
         
            +
              - nginx.service
         
     | 
| 
      
 12 
     | 
    
         
            +
            db_services: &db_services
         
     | 
| 
      
 13 
     | 
    
         
            +
              - sshd.service
         
     | 
| 
      
 14 
     | 
    
         
            +
              - postgresql.service
         
     | 
| 
      
 15 
     | 
    
         
            +
              - pgpool.service
         
     | 
| 
       9 
16 
     | 
    
         | 
| 
       10 
17 
     | 
    
         
             
            # SERVERS TO BE CHECKED [Array of Hash]
         
     | 
| 
       11 
18 
     | 
    
         
             
            servers:
         
     | 
| 
       12 
     | 
    
         
            -
              # only password
         
     | 
| 
       13 
19 
     | 
    
         
             
              - env:      dev
         
     | 
| 
      
 20 
     | 
    
         
            +
                # role:     ap
         
     | 
| 
       14 
21 
     | 
    
         
             
                ip:       192.168.1.101
         
     | 
| 
       15 
22 
     | 
    
         
             
                user:     root
         
     | 
| 
      
 23 
     | 
    
         
            +
                # only password
         
     | 
| 
       16 
24 
     | 
    
         
             
                password: vagrant
         
     | 
| 
       17 
25 
     | 
    
         
             
                # key:      ./.vagrant/machines/centos7/virtualbox/private_key
         
     | 
| 
       18 
26 
     | 
    
         
             
                services: *default_services
         
     | 
| 
       19 
     | 
    
         
            -
               
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 27 
     | 
    
         
            +
              - env:      dev
         
     | 
| 
      
 28 
     | 
    
         
            +
                role:     ap # This value is specified by the `--role` option
         
     | 
| 
       21 
29 
     | 
    
         
             
                ip:       192.168.1.101
         
     | 
| 
       22 
30 
     | 
    
         
             
                user:     root
         
     | 
| 
      
 31 
     | 
    
         
            +
                # only private key
         
     | 
| 
       23 
32 
     | 
    
         
             
                # password: vagrant
         
     | 
| 
       24 
33 
     | 
    
         
             
                key:      ./.vagrant/machines/centos7/virtualbox/private_key
         
     | 
| 
       25 
     | 
    
         
            -
                services: * 
     | 
| 
       26 
     | 
    
         
            -
               
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 34 
     | 
    
         
            +
                services: *ap_services
         
     | 
| 
      
 35 
     | 
    
         
            +
              - env:      dev
         
     | 
| 
      
 36 
     | 
    
         
            +
                role:     db
         
     | 
| 
       28 
37 
     | 
    
         
             
                ip:       192.168.1.101
         
     | 
| 
       29 
38 
     | 
    
         
             
                user:     root
         
     | 
| 
      
 39 
     | 
    
         
            +
                # password and private key (private key will be used preferentially)
         
     | 
| 
       30 
40 
     | 
    
         
             
                password: invalid-dummy-password
         
     | 
| 
       31 
41 
     | 
    
         
             
                key:      ./.vagrant/machines/centos7/virtualbox/private_key
         
     | 
| 
       32 
     | 
    
         
            -
                services: * 
     | 
| 
      
 42 
     | 
    
         
            +
                services: *db_services
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              - env:      stg
         
     | 
| 
      
 45 
     | 
    
         
            +
                role:     ap
         
     | 
| 
      
 46 
     | 
    
         
            +
                ip:       192.168.1.101
         
     | 
| 
      
 47 
     | 
    
         
            +
                user:     root
         
     | 
| 
      
 48 
     | 
    
         
            +
                password: vagrant
         
     | 
| 
      
 49 
     | 
    
         
            +
                services: *ap_services
         
     | 
| 
      
 50 
     | 
    
         
            +
              - env:      stg
         
     | 
| 
      
 51 
     | 
    
         
            +
                role:     db
         
     | 
| 
      
 52 
     | 
    
         
            +
                ip:       192.168.1.101
         
     | 
| 
      
 53 
     | 
    
         
            +
                user:     root
         
     | 
| 
      
 54 
     | 
    
         
            +
                password: vagrant
         
     | 
| 
      
 55 
     | 
    
         
            +
                services: *db_services
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
              - env:      prd
         
     | 
| 
      
 58 
     | 
    
         
            +
                role:     ap
         
     | 
| 
      
 59 
     | 
    
         
            +
                ip:       192.168.1.101
         
     | 
| 
      
 60 
     | 
    
         
            +
                user:     root
         
     | 
| 
      
 61 
     | 
    
         
            +
                password: vagrant
         
     | 
| 
      
 62 
     | 
    
         
            +
                services: *ap_services
         
     | 
| 
      
 63 
     | 
    
         
            +
              - env:      prd
         
     | 
| 
      
 64 
     | 
    
         
            +
                role:     db
         
     | 
| 
      
 65 
     | 
    
         
            +
                ip:       192.168.1.101
         
     | 
| 
      
 66 
     | 
    
         
            +
                user:     root
         
     | 
| 
      
 67 
     | 
    
         
            +
                password: vagrant
         
     | 
| 
      
 68 
     | 
    
         
            +
                services: *db_services
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: systemd_service_check
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.1.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - k-ta-yamada
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2018- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2018-02-08 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
         @@ -52,6 +52,34 @@ dependencies: 
     | 
|
| 
       52 
52 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       53 
53 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       54 
54 
     | 
    
         
             
                    version: '10.0'
         
     | 
| 
      
 55 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 56 
     | 
    
         
            +
              name: capture_stdout
         
     | 
| 
      
 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: minitest-reporters
         
     | 
| 
      
 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'
         
     | 
| 
       55 
83 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       56 
84 
     | 
    
         
             
              name: pry-doc
         
     | 
| 
       57 
85 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -164,9 +192,8 @@ dependencies: 
     | 
|
| 
       164 
192 
     | 
    
         
             
                - - ">="
         
     | 
| 
       165 
193 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       166 
194 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       167 
     | 
    
         
            -
            description:  
     | 
| 
       168 
     | 
    
         
            -
               
     | 
| 
       169 
     | 
    
         
            -
                  etc on multiple remote servers using net-ssh.
         
     | 
| 
      
 195 
     | 
    
         
            +
            description: This gem provide `ssc` command to check multiple `systemd service` etc
         
     | 
| 
      
 196 
     | 
    
         
            +
              on multiple remote servers using net-ssh.
         
     | 
| 
       170 
197 
     | 
    
         
             
            email:
         
     | 
| 
       171 
198 
     | 
    
         
             
            - key.luvless@gmail.com
         
     | 
| 
       172 
199 
     | 
    
         
             
            executables:
         
     | 
| 
         @@ -178,6 +205,7 @@ files: 
     | 
|
| 
       178 
205 
     | 
    
         
             
            - ".rubocop.yml"
         
     | 
| 
       179 
206 
     | 
    
         
             
            - ".rubocop_todo.yml"
         
     | 
| 
       180 
207 
     | 
    
         
             
            - ".travis.yml"
         
     | 
| 
      
 208 
     | 
    
         
            +
            - CHANGELOG.md
         
     | 
| 
       181 
209 
     | 
    
         
             
            - CODE_OF_CONDUCT.md
         
     | 
| 
       182 
210 
     | 
    
         
             
            - Gemfile
         
     | 
| 
       183 
211 
     | 
    
         
             
            - LICENSE.txt
         
     | 
| 
         @@ -188,9 +216,9 @@ files: 
     | 
|
| 
       188 
216 
     | 
    
         
             
            - bin/setup
         
     | 
| 
       189 
217 
     | 
    
         
             
            - bin/ssc
         
     | 
| 
       190 
218 
     | 
    
         
             
            - lib/systemd_service_check.rb
         
     | 
| 
       191 
     | 
    
         
            -
            - lib/systemd_service_check/CHANGELOG.md
         
     | 
| 
       192 
     | 
    
         
            -
            - lib/systemd_service_check/base.rb
         
     | 
| 
       193 
219 
     | 
    
         
             
            - lib/systemd_service_check/cli.rb
         
     | 
| 
      
 220 
     | 
    
         
            +
            - lib/systemd_service_check/ssh.rb
         
     | 
| 
      
 221 
     | 
    
         
            +
            - lib/systemd_service_check/utils.rb
         
     | 
| 
       194 
222 
     | 
    
         
             
            - lib/systemd_service_check/version.rb
         
     | 
| 
       195 
223 
     | 
    
         
             
            - lib/table_print-patch-pr70/column.rb
         
     | 
| 
       196 
224 
     | 
    
         
             
            - lib/table_print-patch-pr70/formatter.rb
         
     | 
| 
         @@ -208,7 +236,7 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       208 
236 
     | 
    
         
             
              requirements:
         
     | 
| 
       209 
237 
     | 
    
         
             
              - - ">="
         
     | 
| 
       210 
238 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       211 
     | 
    
         
            -
                  version:  
     | 
| 
      
 239 
     | 
    
         
            +
                  version: 2.3.0
         
     | 
| 
       212 
240 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       213 
241 
     | 
    
         
             
              requirements:
         
     | 
| 
       214 
242 
     | 
    
         
             
              - - ">="
         
     | 
| 
         @@ -219,6 +247,6 @@ rubyforge_project: 
     | 
|
| 
       219 
247 
     | 
    
         
             
            rubygems_version: 2.7.3
         
     | 
| 
       220 
248 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       221 
249 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       222 
     | 
    
         
            -
            summary: This gem provide `ssc` command to check multiple `systemd service`  
     | 
| 
       223 
     | 
    
         
            -
               
     | 
| 
      
 250 
     | 
    
         
            +
            summary: This gem provide `ssc` command to check multiple `systemd service` etc on
         
     | 
| 
      
 251 
     | 
    
         
            +
              multiple remote servers using net-ssh.
         
     | 
| 
       224 
252 
     | 
    
         
             
            test_files: []
         
     | 
| 
         @@ -1,110 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'net/ssh'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'thor'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'yaml'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'json'
         
     | 
| 
       5 
     | 
    
         
            -
            require 'pry' # forDebug
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            # SystemdServiceCheck
         
     | 
| 
       8 
     | 
    
         
            -
            module SystemdServiceCheck
         
     | 
| 
       9 
     | 
    
         
            -
              # Base
         
     | 
| 
       10 
     | 
    
         
            -
              class Base
         
     | 
| 
       11 
     | 
    
         
            -
                class InvalidOption < StandardError; end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                Server  = Struct.new(:env, :ip, :user, :options, :services, :hostname)
         
     | 
| 
       14 
     | 
    
         
            -
                Service = Struct.new(:service_name, :load_state, :active_state, :sub_state, :unit_file_state, :type)
         
     | 
| 
       15 
     | 
    
         
            -
                Result  = Struct.new(:server, :services)
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                # TODO: systemctl show -p
         
     | 
| 
       18 
     | 
    
         
            -
                STATES    = %w[LoadState ActiveState SubState UnitFileState Type].freeze
         
     | 
| 
       19 
     | 
    
         
            -
                # TODO: setting by yaml
         
     | 
| 
       20 
     | 
    
         
            -
                SHOW_GREP = /env/i
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                attr_reader :argv, :env_names, :servers, :target_env, :target_servers, :results
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                def initialize(argv, yaml)
         
     | 
| 
       25 
     | 
    
         
            -
                  @argv           = argv || []
         
     | 
| 
       26 
     | 
    
         
            -
                  @env_names      = []
         
     | 
| 
       27 
     | 
    
         
            -
                  @servers        = []
         
     | 
| 
       28 
     | 
    
         
            -
                  @target_env     = []
         
     | 
| 
       29 
     | 
    
         
            -
                  @target_servers = []
         
     | 
| 
       30 
     | 
    
         
            -
                  @results        = []
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                  raise InvalidOption if yaml.nil? || yaml.empty?
         
     | 
| 
       33 
     | 
    
         
            -
                  load_settings(yaml)
         
     | 
| 
       34 
     | 
    
         
            -
                  configure_target_servers
         
     | 
| 
       35 
     | 
    
         
            -
                  run
         
     | 
| 
       36 
     | 
    
         
            -
                rescue InvalidOption => e
         
     | 
| 
       37 
     | 
    
         
            -
                  puts "<#{e}>",
         
     | 
| 
       38 
     | 
    
         
            -
                       "  Argument yaml must not be nil or empty.",
         
     | 
| 
       39 
     | 
    
         
            -
                       "  yaml.class: [#{yaml.class}]"
         
     | 
| 
       40 
     | 
    
         
            -
                  puts "  #{e.backtrace_locations.first}"
         
     | 
| 
       41 
     | 
    
         
            -
                end
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                def run
         
     | 
| 
       44 
     | 
    
         
            -
                  @results = @target_servers.map { |server| ssh(server) }
         
     | 
| 
       45 
     | 
    
         
            -
                end
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                def to_json
         
     | 
| 
       48 
     | 
    
         
            -
                  @results.map do |result|
         
     | 
| 
       49 
     | 
    
         
            -
                    { server:   result.server.to_h,
         
     | 
| 
       50 
     | 
    
         
            -
                      services: result.services.map(&:to_h) }
         
     | 
| 
       51 
     | 
    
         
            -
                  end.to_json
         
     | 
| 
       52 
     | 
    
         
            -
                end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                private
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                def load_settings(file) # rubocop:disable Metrics/AbcSize
         
     | 
| 
       57 
     | 
    
         
            -
                  yaml = JSON.parse(YAML.load_file(File.expand_path(file)).to_json,
         
     | 
| 
       58 
     | 
    
         
            -
                                    symbolize_names: true)
         
     | 
| 
       59 
     | 
    
         
            -
                  @env_names = yaml[:servers].map { |s| s[:env] }.uniq
         
     | 
| 
       60 
     | 
    
         
            -
                  @servers   = yaml[:servers].map do |s|
         
     | 
| 
       61 
     | 
    
         
            -
                    raise InvalidOption, "ENV: #{s[:env]}" if [s[:password], s[:key]].all?(nil)
         
     | 
| 
       62 
     | 
    
         
            -
                    options = { password: s[:password], keys: [s[:key] || ""] }
         
     | 
| 
       63 
     | 
    
         
            -
                    Server.new(s[:env], s[:ip], s[:user], options, s[:services])
         
     | 
| 
       64 
     | 
    
         
            -
                  end
         
     | 
| 
       65 
     | 
    
         
            -
                end
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
                def configure_target_servers
         
     | 
| 
       68 
     | 
    
         
            -
                  configure_target_env
         
     | 
| 
       69 
     | 
    
         
            -
                  @target_servers = @servers.select { |s| @target_env.include?(s[:env]) }
         
     | 
| 
       70 
     | 
    
         
            -
                end
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                def configure_target_env
         
     | 
| 
       73 
     | 
    
         
            -
                  @target_env = @env_names & @argv
         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
                  # If there is no argument.
         
     | 
| 
       76 
     | 
    
         
            -
                  @target_env = @env_names.first if @target_env.empty? && @argv.empty?
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                  # If there is only one argument and it is `all`.
         
     | 
| 
       79 
     | 
    
         
            -
                  @target_env = @env_names if @argv.size == 1 && argv.first == 'all'
         
     | 
| 
       80 
     | 
    
         
            -
                end
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
                def ssh(server)
         
     | 
| 
       83 
     | 
    
         
            -
                  services = []
         
     | 
| 
       84 
     | 
    
         
            -
                  Net::SSH.start(server[:ip], server[:user], server[:options]) do |ssh|
         
     | 
| 
       85 
     | 
    
         
            -
                    server[:hostname] = ssh.exec!('hostname').chop
         
     | 
| 
       86 
     | 
    
         
            -
                    services = server[:services].map { |service_name| systemd(ssh, service_name) }
         
     | 
| 
       87 
     | 
    
         
            -
                    # TODO: store in Result object
         
     | 
| 
       88 
     | 
    
         
            -
                    # puts ssh.exec!("systemctl list-timers")
         
     | 
| 
       89 
     | 
    
         
            -
                  end
         
     | 
| 
       90 
     | 
    
         
            -
                  Result.new(server, services)
         
     | 
| 
       91 
     | 
    
         
            -
                end
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
                def systemd(ssh, service_name)
         
     | 
| 
       94 
     | 
    
         
            -
                  states = ssh.exec!("systemctl show #{service_name} -p #{STATES.join(",")}")
         
     | 
| 
       95 
     | 
    
         
            -
                              .split("\n")
         
     | 
| 
       96 
     | 
    
         
            -
                              .map { |v| v.split("=") }
         
     | 
| 
       97 
     | 
    
         
            -
                              .map { |v| [Thor::Util.snake_case(v[0]).to_sym, v[1]] }
         
     | 
| 
       98 
     | 
    
         
            -
                              .each_with_object({}) { |(k, v), memo| memo[k] = v }
         
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
                  Service.new(
         
     | 
| 
       101 
     | 
    
         
            -
                    service_name,
         
     | 
| 
       102 
     | 
    
         
            -
                    states[:load_state],
         
     | 
| 
       103 
     | 
    
         
            -
                    states[:active_state],
         
     | 
| 
       104 
     | 
    
         
            -
                    states[:sub_state],
         
     | 
| 
       105 
     | 
    
         
            -
                    states[:unit_file_state] || "n/a",
         
     | 
| 
       106 
     | 
    
         
            -
                    states[:type] || "n/a"
         
     | 
| 
       107 
     | 
    
         
            -
                  )
         
     | 
| 
       108 
     | 
    
         
            -
                end
         
     | 
| 
       109 
     | 
    
         
            -
              end
         
     | 
| 
       110 
     | 
    
         
            -
            end
         
     |