vps_cli 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +62 -0
- data/LICENSE.txt +21 -0
- data/README.md +72 -0
- data/Rakefile +20 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/vps-cli +6 -0
- data/example_credentials.yaml +39 -0
- data/exe/vps-cli +6 -0
- data/lib/vps_cli/access.rb +176 -0
- data/lib/vps_cli/cli.rb +99 -0
- data/lib/vps_cli/configuration.rb +78 -0
- data/lib/vps_cli/configurations/default_configuration.rb +44 -0
- data/lib/vps_cli/configurations/testing_configuration.rb +25 -0
- data/lib/vps_cli/copy.rb +146 -0
- data/lib/vps_cli/helpers/access_helper.rb +132 -0
- data/lib/vps_cli/helpers/file_helper.rb +146 -0
- data/lib/vps_cli/helpers/github_http.rb +107 -0
- data/lib/vps_cli/install.rb +137 -0
- data/lib/vps_cli/packages.rb +22 -0
- data/lib/vps_cli/pull.rb +110 -0
- data/lib/vps_cli/setup.rb +105 -0
- data/lib/vps_cli/version.rb +3 -0
- data/lib/vps_cli.rb +90 -0
- data/sops_testing_key.asc +125 -0
- data/unencrypted_example_credentials.yaml +19 -0
- data/vps_cli.gemspec +46 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a0e19909989845fd3c3a95b31f5f025d8f47369c17a0ad1f9b7b8d8ba79d1b37
|
4
|
+
data.tar.gz: f889b50b324d113cd785dae1e9c5c3768ab12984fce81796d362a398dd9abf34
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ed9fc281ebb3054329678be63293a8c21486dac410579d51605851fbb5dc071d984f15e9548355983aa87cb69efc4d0984cfa2848b27db1307ba50d5d87866c0
|
7
|
+
data.tar.gz: 37746dfe75d5275ad634e534742d4e3459ba80fb794a285d6be330dfacdfc84df12add713f9768822ca5f65536878e6ea69c1d9bbc0e101a821e4571b2cea179
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vps_cli (0.1.4)
|
5
|
+
thor (~> 0.20)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
coderay (1.1.2)
|
11
|
+
ffi (1.10.0)
|
12
|
+
formatador (0.2.5)
|
13
|
+
guard (2.15.0)
|
14
|
+
formatador (>= 0.2.4)
|
15
|
+
listen (>= 2.7, < 4.0)
|
16
|
+
lumberjack (>= 1.0.12, < 2.0)
|
17
|
+
nenv (~> 0.1)
|
18
|
+
notiffany (~> 0.0)
|
19
|
+
pry (>= 0.9.12)
|
20
|
+
shellany (~> 0.0)
|
21
|
+
thor (>= 0.18.1)
|
22
|
+
guard-compat (1.2.1)
|
23
|
+
guard-minitest (2.4.6)
|
24
|
+
guard-compat (~> 1.2)
|
25
|
+
minitest (>= 3.0)
|
26
|
+
listen (3.1.5)
|
27
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
28
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
29
|
+
ruby_dep (~> 1.2)
|
30
|
+
lumberjack (1.0.13)
|
31
|
+
method_source (0.9.2)
|
32
|
+
minitest (5.11.3)
|
33
|
+
nenv (0.3.0)
|
34
|
+
notiffany (0.1.1)
|
35
|
+
nenv (~> 0.1)
|
36
|
+
shellany (~> 0.0)
|
37
|
+
pry (0.12.2)
|
38
|
+
coderay (~> 1.1.0)
|
39
|
+
method_source (~> 0.9.0)
|
40
|
+
rake (10.5.0)
|
41
|
+
rb-fsevent (0.10.3)
|
42
|
+
rb-inotify (0.10.0)
|
43
|
+
ffi (~> 1.0)
|
44
|
+
ruby_dep (1.5.0)
|
45
|
+
shellany (0.0.1)
|
46
|
+
thor (0.20.3)
|
47
|
+
yard (0.9.19)
|
48
|
+
|
49
|
+
PLATFORMS
|
50
|
+
ruby
|
51
|
+
|
52
|
+
DEPENDENCIES
|
53
|
+
bundler (~> 2.0)
|
54
|
+
guard (~> 2.15)
|
55
|
+
guard-minitest (~> 2.4)
|
56
|
+
minitest (~> 5.0)
|
57
|
+
rake (~> 10.0)
|
58
|
+
vps_cli!
|
59
|
+
yard (~> 0.9)
|
60
|
+
|
61
|
+
BUNDLED WITH
|
62
|
+
2.0.1
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2019 paramagicdev
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# VpsCli
|
2
|
+
|
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/vps_cli`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
This gem is currently unfinished and purely for my own personal use.
|
6
|
+
This project of pulling and pushing dotfiles as well as performing installations
|
7
|
+
etc has taken many iterations and this is its 3rd iteration
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'vps_cli', git: 'https://github.com/ParamagicDev/vps_cli'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install vps_cli
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
This is a personal gem intended to help keep dotfiles the and packages
|
28
|
+
the same across installations
|
29
|
+
|
30
|
+
General usage is as follows:
|
31
|
+
|
32
|
+
```bash
|
33
|
+
vps-cli init
|
34
|
+
```
|
35
|
+
|
36
|
+
This will create a .vps_cli file in your home folder.
|
37
|
+
|
38
|
+
You should check out the contents of this file because this will provide
|
39
|
+
the defaults used for configuration
|
40
|
+
|
41
|
+
This opens up further commands like:
|
42
|
+
|
43
|
+
```bash
|
44
|
+
vps-cli pull
|
45
|
+
# pulls in all the dotfiles to your specified dotfiles and misc_files
|
46
|
+
|
47
|
+
vps-cli copy
|
48
|
+
# copies all the dotfiles and misc files to your specified local_dir
|
49
|
+
|
50
|
+
vps-cli git_pull
|
51
|
+
# pulls in changes to your config_files directory
|
52
|
+
|
53
|
+
vps-cli git_push
|
54
|
+
# pushes changes in your config_files directory
|
55
|
+
|
56
|
+
vps-cli
|
57
|
+
# will list all available commands
|
58
|
+
```
|
59
|
+
|
60
|
+
## Development
|
61
|
+
|
62
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
63
|
+
|
64
|
+
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).
|
65
|
+
|
66
|
+
## Contributing
|
67
|
+
|
68
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/vps_cli.
|
69
|
+
|
70
|
+
## License
|
71
|
+
|
72
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
Rake::TestTask.new(:test_task) do |t|
|
7
|
+
t.libs << 'test'
|
8
|
+
t.libs << 'lib'
|
9
|
+
t.test_files = FileList['test/**/*_test.rb']
|
10
|
+
end
|
11
|
+
|
12
|
+
task :import_pgp_key do
|
13
|
+
puts "Importing sops_testing_keys.asc...\n\n"
|
14
|
+
sh('gpg -q --import sops_testing_key.asc')
|
15
|
+
puts ""
|
16
|
+
end
|
17
|
+
|
18
|
+
task test: %i[import_pgp_key test_task]
|
19
|
+
|
20
|
+
task default: :test
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "vps_cli"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/bin/vps-cli
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
github:
|
2
|
+
username: ENC[AES256_GCM,data:QWu5q5V41jA=,iv:mSGsgJqA8umM3Iov5jEmdtlCoqi1G2HZqkAtyvMnra4=,tag:YdgUYCnGkQaN7L7P1bb5BA==,type:str]
|
3
|
+
email: ENC[AES256_GCM,data:D56889RUJ6PyZXWXYtZceAM=,iv:pq0NGFRlTBurjL+PNJNgAgTqMOLLHzWKH9XYi76Tjd0=,tag:qin+BiG5jo8ifcdfw8BIoQ==,type:str]
|
4
|
+
api_token: ENC[AES256_GCM,data:fM3gSjIWDxq/PJ6wB9N0DmiA,iv:cFKlhPc41wa9EXXdcoyjR6F3kKHqBGnT5G7r8sZBrG8=,tag:SleMk4xyZEa5EhAxu6i/qQ==,type:str]
|
5
|
+
heroku_unencrypted:
|
6
|
+
- The values of heroku can be obtained from $HOME/.netrc
|
7
|
+
- If you have logged in via the following commands before
|
8
|
+
- heroku login or heroku login --interactive
|
9
|
+
heroku:
|
10
|
+
api:
|
11
|
+
machine: ENC[AES256_GCM,data:5YPhnneMN0Tz8dOmgQW5IIXqwYrrxA==,iv:lc98tNybmTwn8wvTi2zLBUkiUFQvv5cfX6QQFq3GDgA=,tag:xv/kvlO3n46fyX63/94mkg==,type:str]
|
12
|
+
login: ENC[AES256_GCM,data:uD352OlvbHBAdSWdYPoyFQN2Cbvn,iv:JoR8WUjMdeTfgwOoXCFv/hOJjZE17xwez8bWoeenUj0=,tag:Tj8zqaNVVxjSecDO4wdY7A==,type:str]
|
13
|
+
password: ENC[AES256_GCM,data:gnt+Ku6RhluVhVMlOTXYUQhDLv8x,iv:BchO+5RYoM6yNPJ5jWr6Dcb3nOykH3gUlenuBWy0Niw=,tag:0CFEVfcLIvzE6U3mWcQn/w==,type:str]
|
14
|
+
git:
|
15
|
+
machine: ENC[AES256_GCM,data:VUmZZfRYBzf5VTavYYzBUVuO5sB9/g==,iv:JZ/GMiNryOvBYmNBsSXFyc3+Y/Z3TlJHuVFkvmr+BIA=,tag:+XbC5wVlAhk38+H0xCMM2Q==,type:str]
|
16
|
+
login: ENC[AES256_GCM,data:qbomNJOdE42zEyqQvLRqyitC4kOh,iv:HkcpOWED3ygKsJ1N5//Lhj/DI59MW4QCIOTuXuz7xMk=,tag:rCKVGETjVNdvdq4makkGFg==,type:str]
|
17
|
+
password: ENC[AES256_GCM,data:jjif+u2jccL1LY6zvMnPJ6eokTtjbCAhTns=,iv:2HFpvGoa9kghMnrnUWa2gkZXT7Nzrbk6Cq1c2Ac2tRo=,tag:ZouL+57G/mL4HFCoNI8uSA==,type:str]
|
18
|
+
sops:
|
19
|
+
kms: []
|
20
|
+
gcp_kms: []
|
21
|
+
azure_kv: []
|
22
|
+
lastmodified: '2019-04-04T08:15:58Z'
|
23
|
+
mac: ENC[AES256_GCM,data:+SOfo1TYp88Kv7HODrSUkkja7iR0TIdiI+BxQERax5Iw+wrYhrkpcauESvPktWzNAFSNLCLF39JjkN3MsGsq5UcCzv8PoYCXRlbJDagxiH1UWdIniQAaYS96GBqE195QSm8rZbWzRO1TKckMrvBZ8RrYaH889NtqzWt9TDUoCjw=,iv:zvPGaOyrFtXm0x0VaLvOlMZOAGA2JmRuaktfB3vxFus=,tag:sJUU5aSS8ATVf2pGstQ8Ng==,type:str]
|
24
|
+
pgp:
|
25
|
+
- created_at: '2019-04-04T08:10:01Z'
|
26
|
+
enc: |-
|
27
|
+
-----BEGIN PGP MESSAGE-----
|
28
|
+
|
29
|
+
wYwDEEVDpnzXnMABBACHm3C+7xuMCAgWTim8tCwWY/RyNjk3NsOiJSj9XQ1VuI7/
|
30
|
+
3RKOY++j3MR6vHb2LdHsUDHr3+WyKq+uJqX6D600v4ghu/8tDoV03ozqtmucFcW4
|
31
|
+
YIv/iS4xlaGRjAMzjvGZpOGdoT68QZd61GIca4JwqShWg9sN/GCAvhKw/Q1RA9Lg
|
32
|
+
AeT0ZQDWQ+jhNLYLEf4SOCwN4V9i4G7g8OFFgeAh4hC19QLg0OWlgkIUlR8Vhl2T
|
33
|
+
qfIyGtIwAPneQviEqvcZ+ySRGaZ3SeCO5CHU4/p7vzfb/RqNEyBT1/Li9QPiy+Gm
|
34
|
+
oQA=
|
35
|
+
=AE0i
|
36
|
+
-----END PGP MESSAGE-----
|
37
|
+
fp: 1022470DE3F0BC54BC6AB62DE05550BC07FB1A0A
|
38
|
+
unencrypted_suffix: _unencrypted
|
39
|
+
version: 3.2.0
|
data/exe/vps-cli
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @see https://ruby-doc.org/stdlib-2.6.0.preview2/libdoc/open3/rdoc/Open3.html
|
4
|
+
require 'open3'
|
5
|
+
require 'json'
|
6
|
+
require 'vps_cli/helpers/access_helper'
|
7
|
+
require 'vps_cli/helpers/github_http'
|
8
|
+
|
9
|
+
module VpsCli
|
10
|
+
# Used for various things related to logins, ssh keys, etc
|
11
|
+
class Access
|
12
|
+
extend AccessHelper
|
13
|
+
# logs into various things either via a .yaml file or via cmd line
|
14
|
+
# Accepts a Configuration object or a hash
|
15
|
+
# @see https://github.com/mozilla/sops
|
16
|
+
# @see VpsCli::Access#decrypt
|
17
|
+
# @see https://github.com/settings/tokens
|
18
|
+
# I prefer to use authentication tokens versus sending
|
19
|
+
# regular access info
|
20
|
+
# @return void
|
21
|
+
|
22
|
+
# fixing to accept a configuration
|
23
|
+
def self.provide_credentials(config = VpsCli.configuration)
|
24
|
+
if File.exist?(config.credentials)
|
25
|
+
file_login(yaml_file: config.credentials, netrc_file: config.netrc)
|
26
|
+
else
|
27
|
+
command_line_login
|
28
|
+
end
|
29
|
+
|
30
|
+
# originally accepts an opts arguemnt
|
31
|
+
generate_ssh_key
|
32
|
+
post_github_ssh_key(config)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Provides all login credentials via a SOPS encrypted yaml file
|
36
|
+
# @param yaml_file [File] File formatted in yaml and encrypted with SOPS
|
37
|
+
# @param netrc_file [File] ($HOME/.netrc) Location of the .netrc for heroku
|
38
|
+
# @return void
|
39
|
+
def self.file_login(yaml_file:, netrc_file: nil)
|
40
|
+
netrc_file ||= File.join(Dir.home, '.netrc')
|
41
|
+
git_file_login(yaml_file: yaml_file)
|
42
|
+
heroku_file_login(yaml_file: yaml_file, netrc_file: netrc_file)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Logs in via the command line if no yaml_file given
|
46
|
+
def self.command_line_login
|
47
|
+
set_git_config
|
48
|
+
heroku_login
|
49
|
+
end
|
50
|
+
|
51
|
+
# Sets the .gitconfig file
|
52
|
+
# @param username [String] Username to set in .gitconfig
|
53
|
+
# @param email [String] email to use for .gitconfig
|
54
|
+
# @return void
|
55
|
+
def self.set_git_config(username = nil, email = nil)
|
56
|
+
puts 'Please enter your git username:'
|
57
|
+
username ||= $stdin.gets.chomp
|
58
|
+
Rake.sh("git config --global user.name #{username}")
|
59
|
+
|
60
|
+
puts 'Please enter your email:'
|
61
|
+
email ||= $stdin.gets.chomp
|
62
|
+
Rake.sh("git config --global user.email #{email}")
|
63
|
+
|
64
|
+
puts "Git config complete.\n"
|
65
|
+
rescue RuntimeError => error
|
66
|
+
msg = 'Something went wrong. Make sure to set your .gitconfig manually'
|
67
|
+
|
68
|
+
VpsCli.errors << error.exception("#{error}\n\n#{msg}")
|
69
|
+
end
|
70
|
+
|
71
|
+
# Command line heroku login
|
72
|
+
# @return void
|
73
|
+
def self.heroku_login
|
74
|
+
puts 'Please login to heroku:'
|
75
|
+
Rake.sh('heroku login --interactive')
|
76
|
+
rescue RuntimeError => error
|
77
|
+
message = "\nUnable not login to heroku. To login, type: 'heroku login'"
|
78
|
+
VpsCli.errors << error.exception("#{error}\n\n#{message}")
|
79
|
+
end
|
80
|
+
|
81
|
+
# Logs into git by setting it in your .gitconfig file
|
82
|
+
# @param yaml_file [File] Sets your git login via the values in your
|
83
|
+
# yaml_file
|
84
|
+
# @return nil
|
85
|
+
def self.git_file_login(yaml_file:)
|
86
|
+
username_key = dig_for_path(:github, :username)
|
87
|
+
email_key = dig_for_path(:github, :email)
|
88
|
+
|
89
|
+
username = decrypt(yaml_file: yaml_file, path: username_key)
|
90
|
+
email = decrypt(yaml_file: yaml_file, path: email_key)
|
91
|
+
|
92
|
+
set_git_config(username, email)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Logs into heroku if given an encrypted yaml_file
|
96
|
+
# @param yaml_file [File] The yaml file to be decrypted
|
97
|
+
# @param netrc_file [File] The netrc file to write to
|
98
|
+
# @return void
|
99
|
+
def self.heroku_file_login(yaml_file:, netrc_file: nil)
|
100
|
+
netrc_file ||= File.join(Dir.home, '.netrc')
|
101
|
+
|
102
|
+
api_string = heroku_api_string(yaml_file: yaml_file)
|
103
|
+
git_string = heroku_git_string(yaml_file: yaml_file)
|
104
|
+
|
105
|
+
netrc_string = api_string + "\n" + git_string
|
106
|
+
|
107
|
+
write_to_netrc(netrc_file: netrc_file, string: netrc_string)
|
108
|
+
end
|
109
|
+
|
110
|
+
# Generates an ssh key with the given values for opts
|
111
|
+
# this has not been extensively tested by myself so proceed with caution
|
112
|
+
# @param opts [Hash] Options hash
|
113
|
+
# @option opts [String] :type ('rsa') What kind of encryption
|
114
|
+
# You want for your ssh key
|
115
|
+
# @option opts [Fixnum] :bits (4096) Strength of encryption
|
116
|
+
# @option opts [String] :email (#get_email) The email comment
|
117
|
+
# to add to the end of the ssh key
|
118
|
+
# @option opts [String, File] :output_file (~/.ssh/id_rsa)
|
119
|
+
# Where you want the key to be saved
|
120
|
+
# @option opts [Boolean] :create_password (nil)
|
121
|
+
# if true, prompt to create a password
|
122
|
+
def self.generate_ssh_key
|
123
|
+
o_file = File.join(Dir.home, '.ssh', 'id_rsa')
|
124
|
+
|
125
|
+
return puts 'ssh key already exists' if File.exist?(o_file)
|
126
|
+
|
127
|
+
type = 'rsa'
|
128
|
+
bits = 4096
|
129
|
+
email = get_email
|
130
|
+
|
131
|
+
no_pass = ' -P ""' unless opts[:create_password]
|
132
|
+
|
133
|
+
# if opts[:create_password] is false, make a blank password
|
134
|
+
# if its true, go through ssh-keygen
|
135
|
+
# this will also autoprompt overwrite as well
|
136
|
+
cmd = "ssh-keygen -t #{type} -b #{bits} -C #{email} -f #{o_file}#{no_pass}"
|
137
|
+
Rake.sh(cmd)
|
138
|
+
end
|
139
|
+
|
140
|
+
# the wrapper around the GithubHTTP class to be able to send the ssh key
|
141
|
+
# @param opts [Hash] Options parameter meant for cli usage
|
142
|
+
# @option opts [String] :uri (URI('https://api.github.com/user/keys'))
|
143
|
+
# url of the api youd like to hit
|
144
|
+
# @option opts [File] :yaml_file (nil) the file to decrypt values with.
|
145
|
+
#
|
146
|
+
def self.post_github_ssh_key(config = VpsCli.configuration)
|
147
|
+
uri = URI('https://api.github.com/user/keys')
|
148
|
+
|
149
|
+
api_token = proc do |yaml, path|
|
150
|
+
decrypt(yaml_file: yaml, path: path)
|
151
|
+
end
|
152
|
+
|
153
|
+
api_path = dig_for_path(:github, :api_token)
|
154
|
+
|
155
|
+
token = api_token.call(config.credentials, api_path)
|
156
|
+
ssh_file = File.join(Dir.home, '.ssh', 'id_rsa.pub')
|
157
|
+
title = get_title
|
158
|
+
|
159
|
+
github = GithubHTTP.new(uri: uri, token: token,
|
160
|
+
ssh_file: ssh_file, title: title)
|
161
|
+
github.push_ssh_key
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.get_email
|
165
|
+
puts "\n"
|
166
|
+
puts 'please enter an email for your ssh key:'
|
167
|
+
$stdin.gets.chomp
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.get_title
|
171
|
+
puts "\n"
|
172
|
+
puts 'please enter a title for your ssh key'
|
173
|
+
$stdin.gets.chomp
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
data/lib/vps_cli/cli.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
module VpsCli
|
7
|
+
# The CLI component of this library
|
8
|
+
# Integrates Thor
|
9
|
+
# @see http://whatisthor.com/
|
10
|
+
class Cli < Thor
|
11
|
+
# this is available as a flag for all methods
|
12
|
+
class_option :config, aliases: :c, default: File.join(Dir.home, '.vps_cli')
|
13
|
+
|
14
|
+
desc 'fresh_install', 'accepts no arguments, my own personal command'
|
15
|
+
def fresh_install
|
16
|
+
VpsCli.load_configuration(options[:config])
|
17
|
+
Copy.all
|
18
|
+
Install.all_install
|
19
|
+
|
20
|
+
Access.provide_credentials
|
21
|
+
|
22
|
+
VpsCli.errors.each { |error| puts error.message }
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
desc 'init [-c (File)]', 'Creates a default vps_cli configuration file in the home directory'
|
27
|
+
def init(file = options[:config])
|
28
|
+
VpsCli.create_configuration(file)
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'install_gems', 'runs gem install on all gems in packages.rb'
|
32
|
+
def install_gems
|
33
|
+
Packages::GEMS.each do |g|
|
34
|
+
Rake.sh("gem install #{g}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'copy [OPTIONS]', 'Copies files from <vps_cli/config_files>'
|
39
|
+
def copy
|
40
|
+
VpsCli.load_configuration(options[:config])
|
41
|
+
Copy.all
|
42
|
+
end
|
43
|
+
|
44
|
+
desc 'pull [OPTIONS]', 'Pulls files into your vps_cli repo'
|
45
|
+
options %i[dotfiles_dir misc_files_dir]
|
46
|
+
def pull
|
47
|
+
VpsCli.load_configuration(options[:config])
|
48
|
+
Pull.all
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'install [OPTIONS]', 'installs based on the flag provided'
|
52
|
+
def install
|
53
|
+
msg = puts 'Only VpsCli::Install#all_install has been implemented'
|
54
|
+
return msg unless options[:all]
|
55
|
+
|
56
|
+
Install.all_install
|
57
|
+
|
58
|
+
return if VpsCli.errors.empty?
|
59
|
+
|
60
|
+
VpsCli.errors.each do |error|
|
61
|
+
if error.responds_to?(:message)
|
62
|
+
puts error.message
|
63
|
+
else
|
64
|
+
puts error
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
desc 'git_pull', 'Automatically pulls in changes in your config_files repo'
|
70
|
+
def git_pull
|
71
|
+
swap_dir { Rake.sh('git pull') }
|
72
|
+
end
|
73
|
+
|
74
|
+
desc 'git_push [message]', 'Automatically pushes changes of your config_files'
|
75
|
+
def git_push(message = nil)
|
76
|
+
|
77
|
+
message ||= "auto push files"
|
78
|
+
|
79
|
+
swap_dir do
|
80
|
+
Rake.sh('git add -A')
|
81
|
+
Rake.sh("git commit -m \"#{message}\"")
|
82
|
+
Rake.sh('git push')
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
desc 'git_status', 'provides the status of your config_files'
|
87
|
+
def git_status
|
88
|
+
swap_dir { Rake.sh('git status') }
|
89
|
+
end
|
90
|
+
|
91
|
+
no_commands do
|
92
|
+
def swap_dir
|
93
|
+
VpsCli.load_configuration(options[:config])
|
94
|
+
Rake.cd(VpsCli.configuration.config_files)
|
95
|
+
yield
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module VpsCli
|
4
|
+
# Used for keeping a consistent config across the entire project
|
5
|
+
class Configuration
|
6
|
+
# local files
|
7
|
+
attr_accessor :local_dir, :backup_dir, :local_sshd_config
|
8
|
+
attr_accessor :sshd_backup
|
9
|
+
|
10
|
+
# configuration files to be used
|
11
|
+
attr_accessor :config_files, :misc_files, :dotfiles
|
12
|
+
attr_accessor :credentials, :netrc
|
13
|
+
|
14
|
+
# used for displaying info
|
15
|
+
attr_accessor :verbose, :interactive, :testing
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
# Values for items to be copied to
|
19
|
+
@local_dir = Dir.home
|
20
|
+
@backup_dir = File.join(Dir.home, 'backup_files')
|
21
|
+
@local_sshd_config = File.join(Dir.home, '.ssh', 'sshd_config')
|
22
|
+
@sshd_backup = File.join(@backup_dir, 'sshd_config.orig')
|
23
|
+
|
24
|
+
# values for items to be copied from
|
25
|
+
# set to nil so that someone must set a path
|
26
|
+
@config_files = nil
|
27
|
+
@dotfiles = nil
|
28
|
+
@misc_files = nil
|
29
|
+
|
30
|
+
# Location of your SOPS encrypted yaml file
|
31
|
+
@credentials = nil
|
32
|
+
@netrc = nil
|
33
|
+
|
34
|
+
# used for displaying info
|
35
|
+
@verbose = false
|
36
|
+
@interactive = true
|
37
|
+
@testing = false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.configure
|
42
|
+
@configuration ||= Configuration.new
|
43
|
+
yield(configuration)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.configuration
|
47
|
+
@configuration ||= Configuration.new
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.reset_configuration
|
51
|
+
@configuration = Configuration.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.load_test_configuration
|
55
|
+
test_config = File.join(File.expand_path(__dir__), 'configurations', 'testing_configuration.rb')
|
56
|
+
load_configuration(test_config)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.load_configuration(file = File.join(Dir.home, '.vps_cli'))
|
60
|
+
msg = 'Unable to location a configuration file. The default location is'
|
61
|
+
msg += '$HOME/.vps_cli'
|
62
|
+
msg += "\nTo create a standard default config, run 'vps-cli init'"
|
63
|
+
|
64
|
+
raise Exception, msg unless File.exist?(file)
|
65
|
+
|
66
|
+
load file
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.create_configuration(file = File.join(Dir.home, '.vps_cli'))
|
70
|
+
msg = "Creating a default configuration files @ $HOME/.vps_cli"
|
71
|
+
msg += "\nPlease modify any values that are nil"
|
72
|
+
|
73
|
+
puts msg
|
74
|
+
default_config = File.join(File.expand_path(__dir__), 'configurations', 'default_configuration.rb')
|
75
|
+
|
76
|
+
Rake.cp(default_config, file)
|
77
|
+
end
|
78
|
+
end
|