lex-ssh 0.1.1 → 0.2.1
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/.github/workflows/ci.yml +16 -0
- data/.rubocop.yml +39 -8
- data/CHANGELOG.md +21 -0
- data/CLAUDE.md +73 -0
- data/Gemfile +6 -1
- data/README.md +76 -2
- data/Rakefile +2 -0
- data/lex-ssh.gemspec +11 -12
- data/lib/legion/extensions/ssh/client.rb +27 -0
- data/lib/legion/extensions/ssh/helpers/connection.rb +3 -1
- data/lib/legion/extensions/ssh/runners/command.rb +10 -5
- data/lib/legion/extensions/ssh/runners/state.rb +8 -5
- data/lib/legion/extensions/ssh/version.rb +3 -1
- data/lib/legion/extensions/ssh.rb +6 -0
- metadata +21 -64
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile.lock +0 -62
- data/bitbucket-pipelines.yml +0 -69
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c32f876a224526e915ee6576cc5f15ac6c9d8cf5a1baf10d98a1eafaeaf867f8
|
|
4
|
+
data.tar.gz: ec41166e39202820862faa03e98fd738de9bfb55c549620d1a5bc662d30a0099
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5644622ea45307993be446f6e4ef78b12f020154651324ed7d4f3083919b5eb4acb8ace68f046ff24c508d0e5f12d70e4f0f11047a5ae42b2b03a2955b58f2d0
|
|
7
|
+
data.tar.gz: 07a56ceb7eed940b5eb743debbadf1fa102e4b373bb1d7c25edafc841f254071d59d3230ffb4bcdf8e2db65f266a563636b051264bf429d149eb3cd0a896c2e9
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
ci:
|
|
9
|
+
uses: LegionIO/.github/.github/workflows/ci.yml@main
|
|
10
|
+
|
|
11
|
+
release:
|
|
12
|
+
needs: ci
|
|
13
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
14
|
+
uses: LegionIO/.github/.github/workflows/release.yml@main
|
|
15
|
+
secrets:
|
|
16
|
+
rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
|
data/.rubocop.yml
CHANGED
|
@@ -1,17 +1,48 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
TargetRubyVersion: 3.4
|
|
3
|
+
NewCops: enable
|
|
4
|
+
SuggestExtensions: false
|
|
5
|
+
|
|
1
6
|
Layout/LineLength:
|
|
2
|
-
Max:
|
|
7
|
+
Max: 160
|
|
8
|
+
|
|
9
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
|
10
|
+
EnforcedStyle: space
|
|
11
|
+
|
|
12
|
+
Layout/HashAlignment:
|
|
13
|
+
EnforcedHashRocketStyle: table
|
|
14
|
+
EnforcedColonStyle: table
|
|
15
|
+
|
|
3
16
|
Metrics/MethodLength:
|
|
4
|
-
Max:
|
|
17
|
+
Max: 50
|
|
18
|
+
|
|
5
19
|
Metrics/ClassLength:
|
|
6
20
|
Max: 1500
|
|
21
|
+
|
|
22
|
+
Metrics/ModuleLength:
|
|
23
|
+
Max: 1500
|
|
24
|
+
|
|
7
25
|
Metrics/BlockLength:
|
|
8
|
-
Max:
|
|
26
|
+
Max: 40
|
|
27
|
+
|
|
9
28
|
Metrics/AbcSize:
|
|
10
|
-
Max:
|
|
29
|
+
Max: 60
|
|
30
|
+
|
|
31
|
+
Metrics/CyclomaticComplexity:
|
|
32
|
+
Max: 15
|
|
33
|
+
|
|
34
|
+
Metrics/PerceivedComplexity:
|
|
35
|
+
Max: 17
|
|
36
|
+
|
|
11
37
|
Style/Documentation:
|
|
12
38
|
Enabled: false
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
39
|
+
|
|
40
|
+
Style/SymbolArray:
|
|
41
|
+
Enabled: true
|
|
42
|
+
|
|
16
43
|
Style/FrozenStringLiteralComment:
|
|
17
|
-
Enabled:
|
|
44
|
+
Enabled: true
|
|
45
|
+
EnforcedStyle: always
|
|
46
|
+
|
|
47
|
+
Naming/FileName:
|
|
48
|
+
Enabled: false
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.2.1] - 2026-03-18
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- Added `logger` gem as runtime dependency for Ruby 4.0 compatibility (removed from default gems)
|
|
7
|
+
|
|
8
|
+
## [0.2.0] - 2026-03-15
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Standalone `Client` class including all runner modules
|
|
12
|
+
- `run_multiple` alias for `run_mulitple` (typo preserved for backward compat)
|
|
13
|
+
- Runner and client specs
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- `opts.key(:timeout)` -> `opts.key?(:timeout)` in Helpers::Connection (was calling wrong Hash method)
|
|
17
|
+
|
|
18
|
+
## [0.1.1] - 2026-03-13
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Initial release
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# lex-ssh: SSH Remote Command Extension for LegionIO
|
|
2
|
+
|
|
3
|
+
**Repository Level 3 Documentation**
|
|
4
|
+
- **Parent**: `/Users/miverso2/rubymine/legion/extensions-other/CLAUDE.md`
|
|
5
|
+
- **Grandparent**: `/Users/miverso2/rubymine/legion/CLAUDE.md`
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Legion Extension that executes remote SSH commands and controls remote server state. Provides runners for running arbitrary commands on remote hosts and triggering reboot/shutdown via Net::SSH.
|
|
10
|
+
|
|
11
|
+
**Version**: 0.2.0
|
|
12
|
+
**GitHub**: https://github.com/LegionIO/lex-ssh
|
|
13
|
+
**License**: MIT
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Legion::Extensions::Ssh
|
|
19
|
+
├── Runners/
|
|
20
|
+
│ ├── Command # run, run_multiple - execute commands via SSH exec!
|
|
21
|
+
│ └── State # reboot, shutdown - system state via SSH
|
|
22
|
+
├── Helpers/
|
|
23
|
+
│ └── Connection # Net::SSH session factory (password, key_data, keys, passphrase auth)
|
|
24
|
+
└── Client # Standalone client class (includes all runners)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Key Files
|
|
28
|
+
|
|
29
|
+
| Path | Purpose |
|
|
30
|
+
|------|---------|
|
|
31
|
+
| `lib/legion/extensions/ssh.rb` | Entry point, extension registration |
|
|
32
|
+
| `lib/legion/extensions/ssh/runners/command.rb` | `run`, `run_multiple` (and `alias run_multiple run_mulitple` for typo compat) |
|
|
33
|
+
| `lib/legion/extensions/ssh/runners/state.rb` | `reboot(server:, user:, delay:)`, `shutdown(server:, user:, delay:)` |
|
|
34
|
+
| `lib/legion/extensions/ssh/helpers/connection.rb` | `session(server:, user:, **opts)` — Net::SSH.start wrapper |
|
|
35
|
+
| `lib/legion/extensions/ssh/client.rb` | Standalone `Client` class for use outside Legion framework |
|
|
36
|
+
|
|
37
|
+
## Runner Methods
|
|
38
|
+
|
|
39
|
+
**Command**
|
|
40
|
+
- `run(command:, server:, user: 'root')` — execute a single command, returns exit status + output
|
|
41
|
+
- `run_multiple(commands:, server:, user: 'root')` — execute multiple commands sequentially; also aliased as `run_mulitple` for backward compatibility
|
|
42
|
+
|
|
43
|
+
**State**
|
|
44
|
+
- `reboot(server:, user: 'root', delay: 0)` — reboot via `shutdown -r`; `delay` adds minutes
|
|
45
|
+
- `shutdown(server:, user: 'root', delay: 0)` — halt via `shutdown -h`; `delay` adds minutes
|
|
46
|
+
|
|
47
|
+
**Connection auth** (pass as task kwargs): `password:`, `key_data:`, `keys:`, `passphrase:`, `non_interactive:`, `timeout:` (default: 5s)
|
|
48
|
+
|
|
49
|
+
## Bug Fixes (v0.2.0)
|
|
50
|
+
|
|
51
|
+
- Fixed `opts.key(:timeout)` typo in `Helpers::Connection` — corrected to `opts.key?(:timeout)`. The old code always returned the key object (truthy) instead of checking presence, so `timeout` was never read from opts.
|
|
52
|
+
|
|
53
|
+
## Dependencies
|
|
54
|
+
|
|
55
|
+
| Gem | Purpose |
|
|
56
|
+
|-----|---------|
|
|
57
|
+
| `net-ssh` (>= 7.0) | SSH client |
|
|
58
|
+
| `ed25519` | Ed25519 key support |
|
|
59
|
+
| `bcrypt_pbkdf` | Bcrypt key derivation (OpenSSH private key format) |
|
|
60
|
+
|
|
61
|
+
## Development
|
|
62
|
+
|
|
63
|
+
9 specs total across `spec/legion/extensions/ssh/client_spec.rb`, `runners/command_spec.rb`, and `runners/state_spec.rb`.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
bundle install
|
|
67
|
+
bundle exec rspec
|
|
68
|
+
bundle exec rubocop
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
**Maintained By**: Matthew Iverson (@Esity)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,3 +1,77 @@
|
|
|
1
|
-
#
|
|
1
|
+
# lex-ssh
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
SSH remote command execution for [LegionIO](https://github.com/LegionIO/LegionIO). Run commands on remote servers and trigger reboot or shutdown via Net::SSH from within task chains.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
gem install lex-ssh
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or add to your Gemfile:
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
gem 'lex-ssh'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Runners
|
|
18
|
+
|
|
19
|
+
### Command
|
|
20
|
+
|
|
21
|
+
| Method | Parameters | Description |
|
|
22
|
+
|--------|-----------|-------------|
|
|
23
|
+
| `run` | `command:`, `server:`, `user:` (default: `'root'`) | Execute a single command via SSH |
|
|
24
|
+
| `run_multiple` | `commands:`, `server:`, `user:` (default: `'root'`) | Execute multiple commands sequentially |
|
|
25
|
+
|
|
26
|
+
Returns `{ success:, results:, server: }` per command.
|
|
27
|
+
|
|
28
|
+
### State
|
|
29
|
+
|
|
30
|
+
| Method | Parameters | Description |
|
|
31
|
+
|--------|-----------|-------------|
|
|
32
|
+
| `reboot` | `server:`, `user:` (default: `'root'`), `delay:` (default: `0`) | Reboot the server via `shutdown -r` |
|
|
33
|
+
| `shutdown` | `server:`, `user:` (default: `'root'`), `delay:` (default: `0`) | Halt the server via `shutdown -h` |
|
|
34
|
+
|
|
35
|
+
`delay` is the number of minutes to wait (0 = immediate).
|
|
36
|
+
|
|
37
|
+
### Authentication
|
|
38
|
+
|
|
39
|
+
Pass authentication kwargs alongside other parameters:
|
|
40
|
+
|
|
41
|
+
| Parameter | Description |
|
|
42
|
+
|-----------|-------------|
|
|
43
|
+
| `password` | Password authentication |
|
|
44
|
+
| `key_data` | Inline key data |
|
|
45
|
+
| `keys` | Array of key file paths |
|
|
46
|
+
| `passphrase` | Key passphrase |
|
|
47
|
+
| `timeout` | Connection timeout in seconds (default: 5) |
|
|
48
|
+
|
|
49
|
+
## Standalone Client
|
|
50
|
+
|
|
51
|
+
Use `Legion::Extensions::Ssh::Client` outside the full LegionIO framework.
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
require 'legion/extensions/ssh'
|
|
55
|
+
client = Legion::Extensions::Ssh::Client.new(host: 'server.example.com', user: 'deploy', keys: ['~/.ssh/id_ed25519'])
|
|
56
|
+
result = client.run(command: 'uptime')
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Requirements
|
|
60
|
+
|
|
61
|
+
- Ruby >= 3.4
|
|
62
|
+
- [LegionIO](https://github.com/LegionIO/LegionIO) framework
|
|
63
|
+
- SSH server access
|
|
64
|
+
- `net-ssh` >= 7.0
|
|
65
|
+
- `ed25519` — Ed25519 key support
|
|
66
|
+
- `bcrypt_pbkdf` — OpenSSH private key format support
|
|
67
|
+
|
|
68
|
+
## Changelog
|
|
69
|
+
|
|
70
|
+
### v0.2.0
|
|
71
|
+
|
|
72
|
+
- Added standalone `Client` class.
|
|
73
|
+
- Fixed `opts.key?(:timeout)` in `Helpers::Connection` — the previous `opts.key(:timeout)` always returned a truthy key object, so the `timeout` option was never read from task kwargs.
|
|
74
|
+
|
|
75
|
+
## License
|
|
76
|
+
|
|
77
|
+
MIT
|
data/Rakefile
CHANGED
data/lex-ssh.gemspec
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'lib/legion/extensions/ssh/version'
|
|
2
4
|
|
|
3
5
|
Gem::Specification.new do |spec|
|
|
@@ -8,27 +10,24 @@ Gem::Specification.new do |spec|
|
|
|
8
10
|
|
|
9
11
|
spec.summary = 'LEX::SSH'
|
|
10
12
|
spec.description = 'LEX::SSH'
|
|
11
|
-
spec.homepage = 'https://
|
|
13
|
+
spec.homepage = 'https://github.com/LegionIO/lex-ssh'
|
|
12
14
|
spec.license = 'MIT'
|
|
13
|
-
spec.required_ruby_version =
|
|
15
|
+
spec.required_ruby_version = '>= 3.4'
|
|
14
16
|
|
|
15
17
|
spec.metadata['homepage_uri'] = spec.homepage
|
|
16
|
-
spec.metadata['source_code_uri'] = 'https://
|
|
17
|
-
spec.metadata['documentation_uri'] = 'https://
|
|
18
|
-
spec.metadata['changelog_uri'] = 'https://
|
|
19
|
-
spec.metadata['bug_tracker_uri'] = 'https://
|
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-ssh'
|
|
19
|
+
spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-ssh'
|
|
20
|
+
spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-ssh'
|
|
21
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-ssh/issues'
|
|
22
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
20
23
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
21
24
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
22
25
|
end
|
|
23
26
|
|
|
24
27
|
spec.require_paths = ['lib']
|
|
25
28
|
|
|
26
|
-
spec.add_development_dependency 'bundler', '>= 2'
|
|
27
|
-
spec.add_development_dependency 'rake'
|
|
28
|
-
spec.add_development_dependency 'rspec'
|
|
29
|
-
spec.add_development_dependency 'rubocop'
|
|
30
|
-
|
|
31
29
|
spec.add_dependency 'bcrypt_pbkdf'
|
|
32
30
|
spec.add_dependency 'ed25519'
|
|
33
|
-
spec.add_dependency '
|
|
31
|
+
spec.add_dependency 'logger'
|
|
32
|
+
spec.add_dependency 'net-ssh', '>= 7.0'
|
|
34
33
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'helpers/connection'
|
|
4
|
+
require_relative 'runners/command'
|
|
5
|
+
require_relative 'runners/state'
|
|
6
|
+
|
|
7
|
+
module Legion
|
|
8
|
+
module Extensions
|
|
9
|
+
module Ssh
|
|
10
|
+
class Client
|
|
11
|
+
include Helpers::Connection
|
|
12
|
+
include Runners::Command
|
|
13
|
+
include Runners::State
|
|
14
|
+
|
|
15
|
+
attr_reader :opts
|
|
16
|
+
|
|
17
|
+
def initialize(server:, user: 'root', **extra)
|
|
18
|
+
@opts = { server: server, user: user, **extra }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def session(**override)
|
|
22
|
+
super(**@opts, **override)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'net/ssh'
|
|
2
4
|
|
|
3
5
|
module Legion
|
|
@@ -16,7 +18,7 @@ module Legion
|
|
|
16
18
|
end
|
|
17
19
|
hash[:non_interactive] = opts.key?(:non_interactive) ? opts[:non_interactive] : true
|
|
18
20
|
hash[:passphrase] = opts[:passphrase] if opts.key? :passphrase
|
|
19
|
-
hash[:timeout] = opts.key(:timeout) ? opts[:timeout] : 5
|
|
21
|
+
hash[:timeout] = opts.key?(:timeout) ? opts[:timeout] : 5
|
|
20
22
|
|
|
21
23
|
Net::SSH.start(server, user, **hash)
|
|
22
24
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Legion
|
|
2
4
|
module Extensions
|
|
3
5
|
module Ssh
|
|
@@ -5,14 +7,14 @@ module Legion
|
|
|
5
7
|
module Command
|
|
6
8
|
include Legion::Extensions::Ssh::Helpers::Connection
|
|
7
9
|
|
|
8
|
-
def run(command:, server:, user: 'root', **
|
|
9
|
-
session = session(server: server, user: user, **
|
|
10
|
+
def run(command:, server:, user: 'root', **)
|
|
11
|
+
session = session(server: server, user: user, **)
|
|
10
12
|
results = session.exec!(command)
|
|
11
13
|
{ success: results.exitstatus.zero?, results: results, server: server }
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
def run_mulitple(commands:, server:, user: 'root', **
|
|
15
|
-
session = session(server: server, user: user, **
|
|
16
|
+
def run_mulitple(commands:, server:, user: 'root', **)
|
|
17
|
+
session = session(server: server, user: user, **)
|
|
16
18
|
final_results = []
|
|
17
19
|
|
|
18
20
|
commands.each do |command|
|
|
@@ -22,7 +24,10 @@ module Legion
|
|
|
22
24
|
final_results
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
alias run_multiple run_mulitple
|
|
28
|
+
|
|
29
|
+
include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
|
|
30
|
+
Legion::Extensions::Helpers.const_defined?(:Lex)
|
|
26
31
|
end
|
|
27
32
|
end
|
|
28
33
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Legion
|
|
2
4
|
module Extensions
|
|
3
5
|
module Ssh
|
|
@@ -5,21 +7,22 @@ module Legion
|
|
|
5
7
|
module State
|
|
6
8
|
include Legion::Extensions::Ssh::Helpers::Connection
|
|
7
9
|
|
|
8
|
-
def reboot(server:, user: 'root', delay: 0, **
|
|
9
|
-
session = session(server: server, user: user, **
|
|
10
|
+
def reboot(server:, user: 'root', delay: 0, **)
|
|
11
|
+
session = session(server: server, user: user, **)
|
|
10
12
|
command = delay.zero? ? 'shutdown -r now' : "shutdown -r +#{delay}"
|
|
11
13
|
results = session.exec!(command)
|
|
12
14
|
{ success: results.exitstatus.zero?, results: results, server: server, delay: delay }
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
def shutdown(server:, user: 'root', delay: 0, **
|
|
16
|
-
session = session(server: server, user: user, **
|
|
17
|
+
def shutdown(server:, user: 'root', delay: 0, **)
|
|
18
|
+
session = session(server: server, user: user, **)
|
|
17
19
|
command = delay.zero? ? 'shutdown -h now' : "shutdown -h +#{delay}"
|
|
18
20
|
results = session.exec!(command)
|
|
19
21
|
{ success: results.exitstatus.zero?, results: results, server: server, delay: delay }
|
|
20
22
|
end
|
|
21
23
|
|
|
22
|
-
include Legion::Extensions::Helpers::Lex
|
|
24
|
+
include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
|
|
25
|
+
Legion::Extensions::Helpers.const_defined?(:Lex)
|
|
23
26
|
end
|
|
24
27
|
end
|
|
25
28
|
end
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'legion/extensions/ssh/version'
|
|
4
|
+
require 'legion/extensions/ssh/helpers/connection'
|
|
5
|
+
require 'legion/extensions/ssh/runners/command'
|
|
6
|
+
require 'legion/extensions/ssh/runners/state'
|
|
7
|
+
require 'legion/extensions/ssh/client'
|
|
2
8
|
|
|
3
9
|
module Legion
|
|
4
10
|
module Extensions
|
metadata
CHANGED
|
@@ -1,65 +1,22 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-ssh
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '2'
|
|
20
|
-
type: :development
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '2'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: rake
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - ">="
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '0'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: rspec
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - ">="
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - ">="
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rubocop
|
|
13
|
+
name: bcrypt_pbkdf
|
|
57
14
|
requirement: !ruby/object:Gem::Requirement
|
|
58
15
|
requirements:
|
|
59
16
|
- - ">="
|
|
60
17
|
- !ruby/object:Gem::Version
|
|
61
18
|
version: '0'
|
|
62
|
-
type: :
|
|
19
|
+
type: :runtime
|
|
63
20
|
prerelease: false
|
|
64
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
22
|
requirements:
|
|
@@ -67,7 +24,7 @@ dependencies:
|
|
|
67
24
|
- !ruby/object:Gem::Version
|
|
68
25
|
version: '0'
|
|
69
26
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
27
|
+
name: ed25519
|
|
71
28
|
requirement: !ruby/object:Gem::Requirement
|
|
72
29
|
requirements:
|
|
73
30
|
- - ">="
|
|
@@ -81,7 +38,7 @@ dependencies:
|
|
|
81
38
|
- !ruby/object:Gem::Version
|
|
82
39
|
version: '0'
|
|
83
40
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
41
|
+
name: logger
|
|
85
42
|
requirement: !ruby/object:Gem::Requirement
|
|
86
43
|
requirements:
|
|
87
44
|
- - ">="
|
|
@@ -100,14 +57,14 @@ dependencies:
|
|
|
100
57
|
requirements:
|
|
101
58
|
- - ">="
|
|
102
59
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
60
|
+
version: '7.0'
|
|
104
61
|
type: :runtime
|
|
105
62
|
prerelease: false
|
|
106
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
64
|
requirements:
|
|
108
65
|
- - ">="
|
|
109
66
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
67
|
+
version: '7.0'
|
|
111
68
|
description: LEX::SSH
|
|
112
69
|
email:
|
|
113
70
|
- matthewdiverson@gmail.com
|
|
@@ -115,32 +72,33 @@ executables: []
|
|
|
115
72
|
extensions: []
|
|
116
73
|
extra_rdoc_files: []
|
|
117
74
|
files:
|
|
75
|
+
- ".github/workflows/ci.yml"
|
|
118
76
|
- ".gitignore"
|
|
119
77
|
- ".rspec"
|
|
120
78
|
- ".rubocop.yml"
|
|
121
|
-
-
|
|
79
|
+
- CHANGELOG.md
|
|
80
|
+
- CLAUDE.md
|
|
122
81
|
- Gemfile
|
|
123
|
-
- Gemfile.lock
|
|
124
82
|
- LICENSE.txt
|
|
125
83
|
- README.md
|
|
126
84
|
- Rakefile
|
|
127
|
-
- bitbucket-pipelines.yml
|
|
128
85
|
- lex-ssh.gemspec
|
|
129
86
|
- lib/legion/extensions/ssh.rb
|
|
87
|
+
- lib/legion/extensions/ssh/client.rb
|
|
130
88
|
- lib/legion/extensions/ssh/helpers/connection.rb
|
|
131
89
|
- lib/legion/extensions/ssh/runners/command.rb
|
|
132
90
|
- lib/legion/extensions/ssh/runners/state.rb
|
|
133
91
|
- lib/legion/extensions/ssh/version.rb
|
|
134
|
-
homepage: https://
|
|
92
|
+
homepage: https://github.com/LegionIO/lex-ssh
|
|
135
93
|
licenses:
|
|
136
94
|
- MIT
|
|
137
95
|
metadata:
|
|
138
|
-
homepage_uri: https://
|
|
139
|
-
source_code_uri: https://
|
|
140
|
-
documentation_uri: https://
|
|
141
|
-
changelog_uri: https://
|
|
142
|
-
bug_tracker_uri: https://
|
|
143
|
-
|
|
96
|
+
homepage_uri: https://github.com/LegionIO/lex-ssh
|
|
97
|
+
source_code_uri: https://github.com/LegionIO/lex-ssh
|
|
98
|
+
documentation_uri: https://github.com/LegionIO/lex-ssh
|
|
99
|
+
changelog_uri: https://github.com/LegionIO/lex-ssh
|
|
100
|
+
bug_tracker_uri: https://github.com/LegionIO/lex-ssh/issues
|
|
101
|
+
rubygems_mfa_required: 'true'
|
|
144
102
|
rdoc_options: []
|
|
145
103
|
require_paths:
|
|
146
104
|
- lib
|
|
@@ -148,15 +106,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
148
106
|
requirements:
|
|
149
107
|
- - ">="
|
|
150
108
|
- !ruby/object:Gem::Version
|
|
151
|
-
version:
|
|
109
|
+
version: '3.4'
|
|
152
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
111
|
requirements:
|
|
154
112
|
- - ">="
|
|
155
113
|
- !ruby/object:Gem::Version
|
|
156
114
|
version: '0'
|
|
157
115
|
requirements: []
|
|
158
|
-
rubygems_version: 3.
|
|
159
|
-
signing_key:
|
|
116
|
+
rubygems_version: 3.6.9
|
|
160
117
|
specification_version: 4
|
|
161
118
|
summary: LEX::SSH
|
|
162
119
|
test_files: []
|
data/CODE_OF_CONDUCT.md
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Contributor Covenant Code of Conduct
|
|
2
|
-
|
|
3
|
-
## Our Pledge
|
|
4
|
-
|
|
5
|
-
In the interest of fostering an open and welcoming environment, we as
|
|
6
|
-
contributors and maintainers pledge to making participation in our project and
|
|
7
|
-
our community a harassment-free experience for everyone, regardless of age, body
|
|
8
|
-
size, disability, ethnicity, gender identity and expression, level of experience,
|
|
9
|
-
nationality, personal appearance, race, religion, or sexual identity and
|
|
10
|
-
orientation.
|
|
11
|
-
|
|
12
|
-
## Our Standards
|
|
13
|
-
|
|
14
|
-
Examples of behavior that contributes to creating a positive environment
|
|
15
|
-
include:
|
|
16
|
-
|
|
17
|
-
* Using welcoming and inclusive language
|
|
18
|
-
* Being respectful of differing viewpoints and experiences
|
|
19
|
-
* Gracefully accepting constructive criticism
|
|
20
|
-
* Focusing on what is best for the community
|
|
21
|
-
* Showing empathy towards other community members
|
|
22
|
-
|
|
23
|
-
Examples of unacceptable behavior by participants include:
|
|
24
|
-
|
|
25
|
-
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
26
|
-
advances
|
|
27
|
-
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
28
|
-
* Public or private harassment
|
|
29
|
-
* Publishing others' private information, such as a physical or electronic
|
|
30
|
-
address, without explicit permission
|
|
31
|
-
* Other conduct which could reasonably be considered inappropriate in a
|
|
32
|
-
professional setting
|
|
33
|
-
|
|
34
|
-
## Our Responsibilities
|
|
35
|
-
|
|
36
|
-
Project maintainers are responsible for clarifying the standards of acceptable
|
|
37
|
-
behavior and are expected to take appropriate and fair corrective action in
|
|
38
|
-
response to any instances of unacceptable behavior.
|
|
39
|
-
|
|
40
|
-
Project maintainers have the right and responsibility to remove, edit, or
|
|
41
|
-
reject comments, commits, code, wiki edits, issues, and other contributions
|
|
42
|
-
that are not aligned to this Code of Conduct, or to ban temporarily or
|
|
43
|
-
permanently any contributor for other behaviors that they deem inappropriate,
|
|
44
|
-
threatening, offensive, or harmful.
|
|
45
|
-
|
|
46
|
-
## Scope
|
|
47
|
-
|
|
48
|
-
This Code of Conduct applies both within project spaces and in public spaces
|
|
49
|
-
when an individual is representing the project or its community. Examples of
|
|
50
|
-
representing a project or community include using an official project e-mail
|
|
51
|
-
address, posting via an official social media account, or acting as an appointed
|
|
52
|
-
representative at an online or offline event. Representation of a project may be
|
|
53
|
-
further defined and clarified by project maintainers.
|
|
54
|
-
|
|
55
|
-
## Enforcement
|
|
56
|
-
|
|
57
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
58
|
-
reported by contacting the project team at matthewdiverson@gmail.com. All
|
|
59
|
-
complaints will be reviewed and investigated and will result in a response that
|
|
60
|
-
is deemed necessary and appropriate to the circumstances. The project team is
|
|
61
|
-
obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
62
|
-
Further details of specific enforcement policies may be posted separately.
|
|
63
|
-
|
|
64
|
-
Project maintainers who do not follow or enforce the Code of Conduct in good
|
|
65
|
-
faith may face temporary or permanent repercussions as determined by other
|
|
66
|
-
members of the project's leadership.
|
|
67
|
-
|
|
68
|
-
## Attribution
|
|
69
|
-
|
|
70
|
-
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
|
71
|
-
available at [https://contributor-covenant.org/version/1/4][version]
|
|
72
|
-
|
|
73
|
-
[homepage]: https://contributor-covenant.org
|
|
74
|
-
[version]: https://contributor-covenant.org/version/1/4/
|
data/Gemfile.lock
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
lex-ssh (0.1.1)
|
|
5
|
-
bcrypt_pbkdf
|
|
6
|
-
ed25519
|
|
7
|
-
net-ssh
|
|
8
|
-
|
|
9
|
-
GEM
|
|
10
|
-
remote: https://rubygems.org/
|
|
11
|
-
specs:
|
|
12
|
-
ast (2.4.1)
|
|
13
|
-
bcrypt_pbkdf (1.0.1)
|
|
14
|
-
diff-lcs (1.4.4)
|
|
15
|
-
ed25519 (1.2.4)
|
|
16
|
-
net-ssh (6.1.0)
|
|
17
|
-
parallel (1.19.2)
|
|
18
|
-
parser (2.7.2.0)
|
|
19
|
-
ast (~> 2.4.1)
|
|
20
|
-
rainbow (3.0.0)
|
|
21
|
-
rake (13.0.1)
|
|
22
|
-
regexp_parser (1.8.2)
|
|
23
|
-
rexml (3.2.4)
|
|
24
|
-
rspec (3.10.0)
|
|
25
|
-
rspec-core (~> 3.10.0)
|
|
26
|
-
rspec-expectations (~> 3.10.0)
|
|
27
|
-
rspec-mocks (~> 3.10.0)
|
|
28
|
-
rspec-core (3.10.0)
|
|
29
|
-
rspec-support (~> 3.10.0)
|
|
30
|
-
rspec-expectations (3.10.0)
|
|
31
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
32
|
-
rspec-support (~> 3.10.0)
|
|
33
|
-
rspec-mocks (3.10.0)
|
|
34
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
35
|
-
rspec-support (~> 3.10.0)
|
|
36
|
-
rspec-support (3.10.0)
|
|
37
|
-
rubocop (1.1.0)
|
|
38
|
-
parallel (~> 1.10)
|
|
39
|
-
parser (>= 2.7.1.5)
|
|
40
|
-
rainbow (>= 2.2.2, < 4.0)
|
|
41
|
-
regexp_parser (>= 1.8)
|
|
42
|
-
rexml
|
|
43
|
-
rubocop-ast (>= 1.0.1)
|
|
44
|
-
ruby-progressbar (~> 1.7)
|
|
45
|
-
unicode-display_width (>= 1.4.0, < 2.0)
|
|
46
|
-
rubocop-ast (1.1.0)
|
|
47
|
-
parser (>= 2.7.1.5)
|
|
48
|
-
ruby-progressbar (1.10.1)
|
|
49
|
-
unicode-display_width (1.7.0)
|
|
50
|
-
|
|
51
|
-
PLATFORMS
|
|
52
|
-
ruby
|
|
53
|
-
|
|
54
|
-
DEPENDENCIES
|
|
55
|
-
bundler (>= 2)
|
|
56
|
-
lex-ssh!
|
|
57
|
-
rake
|
|
58
|
-
rspec
|
|
59
|
-
rubocop
|
|
60
|
-
|
|
61
|
-
BUNDLED WITH
|
|
62
|
-
2.1.4
|
data/bitbucket-pipelines.yml
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
image: ruby:2.7
|
|
2
|
-
|
|
3
|
-
pipelines:
|
|
4
|
-
tags:
|
|
5
|
-
"v*":
|
|
6
|
-
- step:
|
|
7
|
-
name: Rubocop
|
|
8
|
-
caches:
|
|
9
|
-
- bundler
|
|
10
|
-
script:
|
|
11
|
-
- gem install rubocop
|
|
12
|
-
- gem update rubocop
|
|
13
|
-
- rubocop
|
|
14
|
-
- step:
|
|
15
|
-
name: RSpec
|
|
16
|
-
caches:
|
|
17
|
-
- bundler
|
|
18
|
-
script:
|
|
19
|
-
- gem install bundler
|
|
20
|
-
- gem update bundler
|
|
21
|
-
- bundle update
|
|
22
|
-
- bundle exec rspec
|
|
23
|
-
- step:
|
|
24
|
-
name: Push to RubyGems
|
|
25
|
-
deployment: RubyGems
|
|
26
|
-
script:
|
|
27
|
-
- gem install bundler gem-release rspec
|
|
28
|
-
- bundle install
|
|
29
|
-
- (umask 077 ; echo $gem_creds | base64 --decode > ~/.gem/credentials)
|
|
30
|
-
- gem release
|
|
31
|
-
artifacts:
|
|
32
|
-
- pkg/**
|
|
33
|
-
branches:
|
|
34
|
-
master:
|
|
35
|
-
- step:
|
|
36
|
-
caches:
|
|
37
|
-
- bundler
|
|
38
|
-
script:
|
|
39
|
-
- gem install rubocop
|
|
40
|
-
- gem update rubocop
|
|
41
|
-
- rubocop
|
|
42
|
-
- step:
|
|
43
|
-
caches:
|
|
44
|
-
- bundler
|
|
45
|
-
script:
|
|
46
|
-
- gem install bundler
|
|
47
|
-
- gem update bundler
|
|
48
|
-
- bundle update
|
|
49
|
-
- bundle exec rspec
|
|
50
|
-
develop:
|
|
51
|
-
- step:
|
|
52
|
-
caches:
|
|
53
|
-
- bundler
|
|
54
|
-
script:
|
|
55
|
-
- gem install rubocop
|
|
56
|
-
- gem update rubocop
|
|
57
|
-
- rubocop
|
|
58
|
-
- step:
|
|
59
|
-
caches:
|
|
60
|
-
- bundler
|
|
61
|
-
script:
|
|
62
|
-
- gem install bundler
|
|
63
|
-
- gem update bundler
|
|
64
|
-
- bundle update
|
|
65
|
-
- bundle exec rspec
|
|
66
|
-
|
|
67
|
-
definitions:
|
|
68
|
-
caches:
|
|
69
|
-
bundler: /usr/local/bundle
|