kanrisuru 0.1.0 → 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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -0
  3. data/.rubocop.yml +47 -0
  4. data/.rubocop_todo.yml +0 -0
  5. data/CHANGELOG.md +0 -0
  6. data/Gemfile +2 -5
  7. data/LICENSE.txt +1 -1
  8. data/README.md +143 -7
  9. data/Rakefile +5 -3
  10. data/bin/console +4 -3
  11. data/kanrisuru.gemspec +21 -12
  12. data/lib/kanrisuru.rb +41 -2
  13. data/lib/kanrisuru/command.rb +99 -0
  14. data/lib/kanrisuru/core.rb +53 -0
  15. data/lib/kanrisuru/core/archive.rb +154 -0
  16. data/lib/kanrisuru/core/disk.rb +302 -0
  17. data/lib/kanrisuru/core/file.rb +332 -0
  18. data/lib/kanrisuru/core/find.rb +108 -0
  19. data/lib/kanrisuru/core/group.rb +97 -0
  20. data/lib/kanrisuru/core/ip.rb +1032 -0
  21. data/lib/kanrisuru/core/mount.rb +138 -0
  22. data/lib/kanrisuru/core/path.rb +140 -0
  23. data/lib/kanrisuru/core/socket.rb +168 -0
  24. data/lib/kanrisuru/core/stat.rb +104 -0
  25. data/lib/kanrisuru/core/stream.rb +121 -0
  26. data/lib/kanrisuru/core/system.rb +348 -0
  27. data/lib/kanrisuru/core/transfer.rb +203 -0
  28. data/lib/kanrisuru/core/user.rb +198 -0
  29. data/lib/kanrisuru/logger.rb +8 -0
  30. data/lib/kanrisuru/mode.rb +277 -0
  31. data/lib/kanrisuru/os_package.rb +235 -0
  32. data/lib/kanrisuru/remote.rb +10 -0
  33. data/lib/kanrisuru/remote/cluster.rb +95 -0
  34. data/lib/kanrisuru/remote/cpu.rb +68 -0
  35. data/lib/kanrisuru/remote/env.rb +33 -0
  36. data/lib/kanrisuru/remote/file.rb +354 -0
  37. data/lib/kanrisuru/remote/fstab.rb +412 -0
  38. data/lib/kanrisuru/remote/host.rb +191 -0
  39. data/lib/kanrisuru/remote/memory.rb +19 -0
  40. data/lib/kanrisuru/remote/os.rb +87 -0
  41. data/lib/kanrisuru/result.rb +78 -0
  42. data/lib/kanrisuru/template.rb +32 -0
  43. data/lib/kanrisuru/util.rb +40 -0
  44. data/lib/kanrisuru/util/bits.rb +203 -0
  45. data/lib/kanrisuru/util/fs_mount_opts.rb +655 -0
  46. data/lib/kanrisuru/util/os_family.rb +213 -0
  47. data/lib/kanrisuru/util/signal.rb +161 -0
  48. data/lib/kanrisuru/version.rb +3 -1
  49. data/spec/functional/core/archive_spec.rb +228 -0
  50. data/spec/functional/core/disk_spec.rb +80 -0
  51. data/spec/functional/core/file_spec.rb +341 -0
  52. data/spec/functional/core/find_spec.rb +52 -0
  53. data/spec/functional/core/group_spec.rb +65 -0
  54. data/spec/functional/core/ip_spec.rb +71 -0
  55. data/spec/functional/core/path_spec.rb +93 -0
  56. data/spec/functional/core/socket_spec.rb +31 -0
  57. data/spec/functional/core/stat_spec.rb +98 -0
  58. data/spec/functional/core/stream_spec.rb +99 -0
  59. data/spec/functional/core/system_spec.rb +96 -0
  60. data/spec/functional/core/transfer_spec.rb +108 -0
  61. data/spec/functional/core/user_spec.rb +76 -0
  62. data/spec/functional/os_package_spec.rb +75 -0
  63. data/spec/functional/remote/cluster_spec.rb +45 -0
  64. data/spec/functional/remote/cpu_spec.rb +41 -0
  65. data/spec/functional/remote/env_spec.rb +36 -0
  66. data/spec/functional/remote/fstab_spec.rb +76 -0
  67. data/spec/functional/remote/host_spec.rb +68 -0
  68. data/spec/functional/remote/memory_spec.rb +29 -0
  69. data/spec/functional/remote/os_spec.rb +63 -0
  70. data/spec/functional/remote/remote_file_spec.rb +180 -0
  71. data/spec/helper/test_hosts.rb +68 -0
  72. data/spec/hosts.json +92 -0
  73. data/spec/spec_helper.rb +11 -3
  74. data/spec/unit/fstab_spec.rb +22 -0
  75. data/spec/unit/kanrisuru_spec.rb +9 -0
  76. data/spec/unit/mode_spec.rb +183 -0
  77. data/spec/unit/template_spec.rb +13 -0
  78. data/spec/unit/util_spec.rb +177 -0
  79. data/spec/zz_reboot_spec.rb +46 -0
  80. metadata +136 -13
  81. data/spec/kanrisuru_spec.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3335e4395bf0958e9ba7c7d87e7283ece7658e032a73172a55edb53862206673
4
- data.tar.gz: 8dfc10850fb4d2fe5ccb6fe81257ba389c1ccf1258831ed7823be78d8d882e9a
3
+ metadata.gz: c85c69fa5f91368ab9857bfd7124a05516f3e3e6d224d2bd889a2334d93fe67f
4
+ data.tar.gz: 43ead0d9b608199c14ee204c1f9dfc3910342138a8db211a2b7e62d3e6bad372
5
5
  SHA512:
6
- metadata.gz: caec7570e9df6bd5b74b66fe9e500cc3bb9cfb899a844d1a81898ac9348159586eca95e12dd2b42ae4df314b0c4f7a7514bba53e38c068c655b8077f9ff64117
7
- data.tar.gz: cfbff1a21bd775a09d84d8817ae12782967cab7eca9d105df8d4c8ff1a5bc210ddee9c13c2f25026722163e0a1675a0fac3a02902497dcc65d275720ed2e0e70
6
+ metadata.gz: c95fa98ff75efa98e2faaea0656500f063b39721ba2535e3027581b1844571621b5d3ee9ad11787439d74dfedb80aee053ff8f32a7733c902a7535870921d7da
7
+ data.tar.gz: 2ec71eec8b97ee92122d295bb5d736c9b44991cd134c4dce7c0b29e9e84462cb54997ece06d3ea5c8ca384d5221d4a9f4136223c60391888217f326f212343c1
data/.gitignore CHANGED
@@ -9,3 +9,20 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ .Gemfile
13
+ .byebug_history
14
+ .ruby-version
15
+
16
+ *.gem
17
+ coverage/*
18
+ Gemfile.lock
19
+ *~
20
+ .bundle
21
+ .rvmrc
22
+ log/*
23
+ measurement/*
24
+ pkg/*
25
+ .DS_Store
26
+ .env
27
+ spec/dummy/tmp/*
28
+ spec/dummy/log/*.log
data/.rubocop.yml ADDED
@@ -0,0 +1,47 @@
1
+ require: rubocop-rspec
2
+
3
+ AllCops:
4
+ NewCops: enable
5
+ SuggestExtensions: false
6
+
7
+ Style/Documentation:
8
+ Enabled: false
9
+
10
+ Metrics/AbcSize:
11
+ Enabled: false
12
+
13
+ Metrics/CyclomaticComplexity:
14
+ Enabled: false
15
+
16
+ Metrics/PerceivedComplexity:
17
+ Enabled: false
18
+
19
+ Metrics/MethodLength:
20
+ Enabled: false
21
+
22
+ Metrics/ClassLength:
23
+ Enabled: false
24
+
25
+ Metrics/ModuleLength:
26
+ Enabled: false
27
+
28
+ Metrics/BlockLength:
29
+ Enabled: false
30
+
31
+ Lint/ConstantDefinitionInBlock:
32
+ Enabled: false
33
+
34
+ RSpec/FilePath:
35
+ SpecSuffixOnly: true
36
+
37
+ RSpec/ExampleLength:
38
+ Enabled: false
39
+
40
+ RSpec/MultipleExpectations:
41
+ Enabled: false
42
+
43
+ RSpec/BeforeAfterAll:
44
+ Enabled: false
45
+
46
+ RSpec/LeakyConstantDeclaration:
47
+ Enabled: false
data/.rubocop_todo.yml ADDED
File without changes
data/CHANGELOG.md ADDED
File without changes
data/Gemfile CHANGED
@@ -1,7 +1,4 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- # Specify your gem's dependencies in kanrisuru.gemspec
3
+ source 'https://rubygems.org'
4
4
  gemspec
5
-
6
- gem "rake", "~> 12.0"
7
- gem "rspec", "~> 3.0"
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2020 Avamia, LLC
3
+ Copyright (c) 2020-2021 Avamia, LLC
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,8 +1,16 @@
1
+ [![Latest version](https://img.shields.io/gem/v/kanrisuru?style=flat-square)](https://rubygems.org/gems/kanrisuru) 
2
+ [![Latest version](https://img.shields.io/github/license/avamia/kanrisuru)](https://github.com/avamia/kanrisuru/blob/main/LICENSE.txt) 
3
+ ![GitHub repo size](https://img.shields.io/github/repo-size/avamia/kanrisuru) 
4
+
1
5
  # Kanrisuru
2
6
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/kanrisuru`. To experiment with that code, run `bin/console` for an interactive prompt.
7
+ Kanrisuru (manage) helps you remotely control infrastructure using Ruby. This is done over SSH. I'm working on building up some basic functionality to help quickly provision, deploy and manage a single host or cluster of hosts.
8
+
9
+ The idea behind this project is not to replace the numerous other projects to manage your infrastrucutre, however, I've found there usually meant to be a standalone project that have their own ecosystem. With Kanrisuru, you essentailly plug the library directly into your ruby project.
4
10
 
5
- TODO: Delete this and the text above, and describe your gem
11
+ At this point, Kanrisuru doesn't use a DSL, or offer idempotency, and while that may be added later on, the goal with this project is to expose helpful ways of managing your remote infrastructure with plain ruby in a procedural manner. The realization I had was when trying to deal with other open source projects, you either had to deal with a different language than ruby, use agents on remote hosts, or deal with a complex library that is meant to act in a declarative manner.
12
+
13
+ If you want to dynamically interact with a host, eg: If you need to dynamically scale your infrastructure by continually monitoring specific stats from a centralized system, Kanrisuru can help you accomplish this.
6
14
 
7
15
  ## Installation
8
16
 
@@ -22,18 +30,146 @@ Or install it yourself as:
22
30
 
23
31
  ## Usage
24
32
 
25
- TODO: Write usage instructions here
33
+ Run basic commands you would have access to while running on a remote host or on a cluster of hosts.
34
+
35
+ ### Host
36
+ ```ruby
37
+ host = Kanrisuru::Remote::Host.new(host: 'host', username: 'ubuntu', keys: ['~/.ssh/id_rsa'])
38
+ result = host.whoami
39
+ result.to_s # => 'ubuntu'
40
+
41
+ result = host.pwd
42
+ result.path # => /home/ubuntu
43
+ ```
44
+
45
+ ### Cluster
46
+ ```ruby
47
+ cluster = Kanrisuru::Remote::Cluster.new([{
48
+ host: 'host1', username: 'ubuntu', keys: ['~/.ssh/id_rsa']
49
+ }, {
50
+ host: 'host2', username: 'alice', keys: ['~/.ssh/id_rsa']
51
+ })
52
+
53
+ cluster.whoami # => {host: 'host1', result: 'ubuntu'}, {host: 'host2', result: 'alice'}
54
+ cluster.pwd # => {host: 'host1', result: '/home/ubuntu'}, {host: 'host2', result: '/home/alice'}
55
+
56
+ cluster.each do |host|
57
+ host.pwd.path # => /home/ubuntu
58
+ end
59
+ ```
60
+
61
+ ### Host or Cluster with underlying command
62
+ ```ruby
63
+ host = Kanrisuru::Remote::Host.new(host: 'host1', username: 'ubuntu', keys: ['~/.ssh/id_rsa'])
64
+
65
+ command = Kanrisuru::Command.new('uname')
66
+ host.execute(command)
67
+
68
+ command.success? #=> true
69
+ command.to_s #=> Linux
70
+
71
+ cluster = Kanrisuru::Remote::Cluster.new([host, {host: 'host2', username: 'alice', keys: ['~/.ssh/id_rsa']}])
72
+
73
+ cluster.execute('uname') #=> {host: 'host1', result: 'Linux'}, {host: 'host2', result: 'Linux'}
74
+ ```
75
+
76
+ ## Methods and Testing
77
+
78
+ | Description | Ruby | Shell | Module | Man | Debian | Ubuntu | Fedora | Centos | RHEL | openSUSE | SLES |
79
+ |---------------------------------------|------------------|--------------------|--------|--------------------------------------|--------|--------|--------|--------|------|----------|------|
80
+ | **System** | | | | | | | | | | | |
81
+ | Get CPU Info | cpu_info | lscpu | core | https://linux.die.net/man/1/lscpu | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
82
+ | Get Load Average | load_average | cat /proc/load_avg | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
83
+ | Get RAM Available | free | cat /proc/meminfo | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
84
+ | Get list of processes | ps | ps | core | https://linux.die.net/man/1/ps | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
85
+ | Get Env vars | load_env | env | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
86
+ | Kill process | kill | kill | core | https://linux.die.net/man/1/kill | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
87
+ | Get uptime of system | uptime | cat /proc/uptime | core | https://linux.die.net/man/1/uptime | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
88
+ | Get who's logged in | w | w | core | https://linux.die.net/man/1/w | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
89
+ | Reboot machine | reboot | shutdown | core | https://linux.die.net/man/8/reboot | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
90
+ | Poweroff machine | poweroff | shutdown | core | https://linux.die.net/man/8/shutdown | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
91
+ | **Disk** | | | | | | | | | | | |
92
+ | Get Disk Space | df | df | core | https://linux.die.net/man/1/df | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
93
+ | Get Disk Usage | du | du | core | https://linux.die.net/man/1/du | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
94
+ | List block devices | lsblk | lsblk | core | https://linux.die.net/man/8/lsblk | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
95
+ | Get block device attributes | blkid | blikd | core | https://linux.die.net/man/8/blkid | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
96
+ | **Mount** | | | | | | | | | | | |
97
+ | Mount a filesystem | mount | mount | core | https://linux.die.net/man/8/mount | | | | | | | |
98
+ | Unmount a filesystem | umount | umount | core | https://linux.die.net/man/8/umount | | | | | | | |
99
+ | **Group** | | | | | | | | | | | |
100
+ | Get Group Id | get_gid | getent group | core | https://linux.die.net/man/1/getent | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
101
+ | Get Group | get_group | grep /etc/group | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
102
+ | Create Group | create_group | groupadd | core | https://linux.die.net/man/8/groupadd | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
103
+ | Update Group | update_group | groupmod | core | https://linux.die.net/man/8/groupmod | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
104
+ | Delete Group | delete_group | groupdel | core | https://linux.die.net/man/8/groupdel | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
105
+ | **User** | | | | | | | | | | | |
106
+ | Get User Id | get_uid | id -u | core | https://linux.die.net/man/1/id | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
107
+ | Get User | get_user | id | core | https://linux.die.net/man/1/id | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
108
+ | Create User | create_user | useradd | core | https://linux.die.net/man/8/useradd | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
109
+ | Update User | update_user | usermod | core | https://linux.die.net/man/8/usermod | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
110
+ | Delete User | delete_user | userdel | core | https://linux.die.net/man/8/userdel | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
111
+ | **Path** | | | | | | | | | | | |
112
+ | List files and directories | ls | ls | core | https://linux.die.net/man/1/ls | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
113
+ | Get Current Dir | pwd | pwd | core | https://linux.die.net/man/1/pwd | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
114
+ | Get Current User | whoami | whoami | core | https://linux.die.net/man/1/whoami | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
115
+ | Get Full Path of Shell Command | which | which | core | https://linux.die.net/man/1/which | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
116
+ | Real Path | realpath | realpath | core | https://linux.die.net/man/1/realpath | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
117
+ | Read link | readlink | readlink | core | https://linux.die.net/man/1/readlink | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
118
+ | Change Dir | cd | cd | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
119
+ | **File** | | | | | | | | | | | |
120
+ | "Find file, dir, special file device" | find | find | core | https://linux.die.net/man/1/find | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
121
+ | Stat file info | stat | stat | core | https://linux.die.net/man/1/stat | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
122
+ | Change Permission of file / folder | chmod | chmod | core | https://linux.die.net/man/1/chmod | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
123
+ | Change Ownership of file / folder | chown | chown | core | https://linux.die.net/man/1/chown | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
124
+ | Hard Link File | ln | ln | core | https://linux.die.net/man/1/ln | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
125
+ | Soft Link File / Dir | ln_s | ln | core | https://linux.die.net/man/1/ln | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
126
+ | Create Directory | mkdir | mkdir | core | https://linux.die.net/man/1/mkdir | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
127
+ | Remove file / directory | rm | rm | core | https://linux.die.net/man/1/rm | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
128
+ | Remove Directory | rmdir | rm | core | https://linux.die.net/man/1/rm | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
129
+ | Touch File | touch | touch | core | https://linux.die.net/man/1/touch | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
130
+ | Copy file / directory | cp | cp | core | https://linux.die.net/man/1/cp | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
131
+ | Move file / directory | mv | mv | core | https://linux.die.net/man/1/mv | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
132
+ | "Get file line, word, and char count" | wc | wc | core | https://linux.die.net/man/1/wc | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
133
+ | **Stream** | | | | | | | | | | | |
134
+ | Get content from beginning of file | head | head | core | https://linux.die.net/man/1/head | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
135
+ | Get content from end of file | tail | tail | core | https://linux.die.net/man/1/tail | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
136
+ | Read a chunk from a file by lines | reach_file_chunk | tail and head | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
137
+ | Echo to stdout or to file | echo | echo | core | https://linux.die.net/man/1/echo | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
138
+ | Get all content from a file | cat | cat | core | https://linux.die.net/man/1/cat | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
139
+ | Sed | sed | sed | core | https://linux.die.net/man/1/sed | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
140
+ | **Archive** | | | | | | | | | | | |
141
+ | Tar Files | tar | tar | core | https://linux.die.net/man/1/tar | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
142
+ | **Network** | | | | | | | | | | | |
143
+ | Manage network devices | ip | ip | core | https://linux.die.net/man/8/ip | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
144
+ | Get Socket Details | ss | ss | core | https://linux.die.net/man/8/ss | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
145
+ | **Transfer** | | | | | | | | | | | |
146
+ | Upload to remote server | upload | scp | core | https://linux.die.net/man/1/scp | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
147
+ | Download from remote server | download | scp | core | https://linux.die.net/man/1/scp | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
148
+ | Wget | wget | wget | core | https://linux.die.net/man/1/wget | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
26
149
 
27
150
  ## Development
28
151
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
152
+ After checking out the repo, run `bin/setup` to install dependencies.
153
+
154
+
155
+ To test kanrisuru across various linux distros, update your local `/etc/hosts` file to create an alias to the local virtual machine with that distro type. You can also set the host alias to the localhost machine.
156
+
157
+ To select which hosts to run rspec across, prepend the command line or export the variable while running rspec.
158
+
159
+ ```bash
160
+ HOSTS=ubuntu,debian,centos rspec
161
+ ```
162
+
163
+ This will run tests on the ubuntu, debian and centos instances.
164
+
165
+
166
+ Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
167
 
31
168
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
169
 
33
170
  ## Contributing
34
171
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/avamia-dm/kanrisuru. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/avamia-dm/kanrisuru/blob/master/CODE_OF_CONDUCT.md).
36
-
172
+ Bug reports and pull requests are welcome on GitHub at https://github.com/avamia/kanrisuru. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/avamia/kanrisuru/blob/master/CODE_OF_CONDUCT.md).
37
173
 
38
174
  ## License
39
175
 
@@ -41,4 +177,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
41
177
 
42
178
  ## Code of Conduct
43
179
 
44
- Everyone interacting in the Kanrisuru project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/avamia-dm/kanrisuru/blob/master/CODE_OF_CONDUCT.md).
180
+ Everyone interacting in the Kanrisuru project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/avamia/kanrisuru/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/console CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "kanrisuru"
4
+ require 'bundler/setup'
5
+ require 'kanrisuru'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "kanrisuru"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start(__FILE__)
data/kanrisuru.gemspec CHANGED
@@ -1,23 +1,32 @@
1
- require File.expand_path('../lib/kanrisuru/version', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('lib/kanrisuru/version', __dir__)
2
4
 
3
5
  Gem::Specification.new do |gem|
4
- gem.name = "kanrisuru"
6
+ gem.name = 'kanrisuru'
5
7
  gem.version = Kanrisuru::VERSION
6
- gem.authors = ["Ryan Mammina"]
7
- gem.email = ["ryan@avamia.com"]
8
- gem.license = "MIT"
8
+ gem.author = 'Ryan Mammina'
9
+ gem.email = 'ryan@avamia.com'
10
+ gem.license = 'MIT'
11
+ gem.summary = 'Manage remote servers with ruby.'
12
+ gem.homepage = 'https://github.com/avamia/kanrisuru'
13
+
14
+ gem.required_ruby_version = '>= 2.5.0'
15
+ gem.required_rubygems_version = '>= 1.8.11'
9
16
 
10
- gem.summary = "Manage remote servers with ruby and ssh."
11
- gem.description = "Manage remote servers with ruby and ssh."
17
+ gem.add_development_dependency 'rspec'
18
+ gem.add_development_dependency 'rubocop'
19
+ gem.add_development_dependency 'rubocop-rspec'
20
+ gem.add_development_dependency 'simplecov'
12
21
 
13
- gem.homepage = "https://github.com/avamia-dm/kanrisuru"
14
-
22
+ gem.add_runtime_dependency 'net-ping'
15
23
  gem.add_runtime_dependency 'net-scp'
16
- gem.add_runtime_dependency 'net-sftp'
17
24
  gem.add_runtime_dependency 'net-ssh'
18
25
 
19
26
  gem.files = `git ls-files`.split("\n")
20
- gem.require_paths = ["lib"]
27
+ gem.require_paths = ['lib']
21
28
 
22
- gem.rubyforge_project = 'nowarning'
29
+ gem.metadata = {
30
+ 'source_code_uri' => 'https://github.com/avamia/kanrisuru/'
31
+ }
23
32
  end
data/lib/kanrisuru.rb CHANGED
@@ -1,6 +1,45 @@
1
- require "kanrisuru/version"
1
+ # frozen_string_literal: true
2
+
3
+ #--
4
+ # Copyright (c) 2020-2021 Avamia, LLC
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #++
25
+
26
+ require_relative 'kanrisuru/version'
27
+ require_relative 'kanrisuru/logger'
28
+ require_relative 'kanrisuru/util'
29
+ require_relative 'kanrisuru/mode'
30
+ require_relative 'kanrisuru/os_package'
31
+ require_relative 'kanrisuru/command'
32
+ require_relative 'kanrisuru/remote'
33
+ require_relative 'kanrisuru/result'
34
+ require_relative 'kanrisuru/core'
35
+ require_relative 'kanrisuru/template'
2
36
 
3
37
  module Kanrisuru
38
+ def self.logger
39
+ @logger ||= Kanrisuru::Logger.new($stdout, formatter: proc { |severity, _datetime, _progname, msg|
40
+ "#{severity}: #{msg}\n"
41
+ })
42
+ end
43
+
4
44
  class Error < StandardError; end
5
- # Your code goes here...
6
45
  end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kanrisuru
4
+ class Command
5
+ attr_reader :exit_status, :raw_result, :program
6
+ attr_writer :remote_user, :remote_shell, :remote_path, :remote_env
7
+
8
+ def initialize(command)
9
+ @raw_command = command
10
+ @raw_result = []
11
+ end
12
+
13
+ def success?
14
+ @exit_status&.zero?
15
+ end
16
+
17
+ def failure?
18
+ !success?
19
+ end
20
+
21
+ def to_i
22
+ to_a.join.to_i
23
+ end
24
+
25
+ def to_s
26
+ to_a.join(' ')
27
+ end
28
+
29
+ def to_json(*_args)
30
+ JSON.parse(to_s)
31
+ end
32
+
33
+ def to_a
34
+ string = @raw_result.join
35
+ string.lines.map(&:strip)
36
+ end
37
+
38
+ def prepared_command
39
+ if !@remote_user.nil? && !@remote_shell.nil?
40
+ evaluate = ''
41
+ evaluate += if Kanrisuru::Util.present?(@remote_path)
42
+ "cd #{@remote_path} && #{@raw_command}"
43
+ else
44
+ @raw_command.to_s
45
+ end
46
+
47
+ env = @remote_env && !@remote_env.empty? ? "#{@remote_env} " : ''
48
+
49
+ "#{env}sudo -u #{@remote_user} #{@remote_shell} -c -l \"#{evaluate}\""
50
+ else
51
+ @raw_command
52
+ end
53
+ end
54
+
55
+ def raw_command
56
+ @raw_command.to_s
57
+ end
58
+
59
+ def handle_status(status)
60
+ @exit_status = status
61
+ end
62
+
63
+ def handle_data(data)
64
+ @raw_result.push(data)
65
+ end
66
+
67
+ def handle_signal(signal)
68
+ @signal = signal
69
+ end
70
+
71
+ def +(other)
72
+ append_value(other)
73
+ end
74
+
75
+ def <<(value)
76
+ append_value(value)
77
+ end
78
+
79
+ def |(other)
80
+ pipe(other)
81
+ end
82
+
83
+ def pipe(value)
84
+ append_value("| #{value}")
85
+ end
86
+
87
+ def append_value(value)
88
+ @raw_command = "#{@raw_command} #{value}"
89
+ end
90
+
91
+ def append_arg(arg, string)
92
+ @raw_command = Kanrisuru::Util.present?(string) ? "#{@raw_command} #{arg} #{string}" : @raw_command
93
+ end
94
+
95
+ def append_flag(arg, boolean = 'true')
96
+ @raw_command = Kanrisuru::Util.present?(boolean) ? "#{@raw_command} #{arg}" : @raw_command
97
+ end
98
+ end
99
+ end