vps_cli 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +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
@@ -0,0 +1,137 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module VpsCli
|
4
|
+
OMZ_DIR = File.join(Dir.home, '.oh-my-zsh')
|
5
|
+
OMZ_PLUGINS = File.join(OMZ_DIR, 'custom', 'plugins')
|
6
|
+
# Installes the required packages
|
7
|
+
class Install
|
8
|
+
def self.full
|
9
|
+
unless OS.linux?
|
10
|
+
puts 'You are not running on linux. No packages installed.'
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
all_install
|
16
|
+
rescue RuntimeError => exception
|
17
|
+
VpsCli.errors << exception
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.all_install
|
22
|
+
prep
|
23
|
+
packages
|
24
|
+
other_tools
|
25
|
+
neovim_pip
|
26
|
+
omz_full_install
|
27
|
+
Setup.full
|
28
|
+
install_tmux_plugin_manager_and_plugins
|
29
|
+
plug_install_vim_neovim
|
30
|
+
install_gems
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.prep
|
34
|
+
Rake.sh('sudo apt-get update')
|
35
|
+
Rake.sh('sudo apt-get upgrade -y')
|
36
|
+
Rake.sh('sudo apt-get dist-upgrade -y')
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.packages
|
40
|
+
Packages::UBUNTU.each do |item|
|
41
|
+
Rake.sh("sudo apt-get install -y #{item}")
|
42
|
+
|
43
|
+
puts 'Successfully completed apt-get install on all packages.'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.other_tools
|
48
|
+
# update npm, there are some issues with ubuntu 18.10 removing npm
|
49
|
+
# and then being unable to update it
|
50
|
+
# for some reason npm and ubuntu dont play well
|
51
|
+
Rake.sh('sudo apt-get install nodejs -y')
|
52
|
+
Rake.sh('sudo apt-get install npm -y')
|
53
|
+
Rake.sh('sudo npm install -g npm')
|
54
|
+
|
55
|
+
# add heroku
|
56
|
+
Rake.sh('sudo snap install heroku --classic')
|
57
|
+
# add tmux plugin manager
|
58
|
+
tmp_plugins = File.join(Dir.home, '.tmux', 'plugins', 'tpm')
|
59
|
+
unless Dir.exist?(tmp_plugins)
|
60
|
+
Rake.mkdir_p(tmp_plugins)
|
61
|
+
Rake.sh('git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm')
|
62
|
+
end
|
63
|
+
# add ngrok
|
64
|
+
Rake.sh('sudo npm install --unsafe-perm -g ngrok')
|
65
|
+
|
66
|
+
# add docker
|
67
|
+
username = Dir.home.split('/')[2]
|
68
|
+
begin
|
69
|
+
Rake.sh('groupadd docker')
|
70
|
+
Rake.sh("usermod -aG docker #{username}")
|
71
|
+
rescue RuntimeError
|
72
|
+
puts 'docker group already exists.'
|
73
|
+
puts 'moving on...'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.neovim_pip
|
78
|
+
Rake.sh('sudo -H pip2 install neovim --system')
|
79
|
+
Rake.sh('sudo -H pip3 install neovim --system')
|
80
|
+
Rake.sh(%(yes "\n" | sudo npm install -g neovim))
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.omz_full_install
|
84
|
+
install_oh_my_zsh
|
85
|
+
install_syntax_highlighting
|
86
|
+
install_autosuggestions
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.install_oh_my_zsh
|
90
|
+
return if Dir.exist?(OMZ_DIR)
|
91
|
+
|
92
|
+
Rake.sh('git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh')
|
93
|
+
Rake.sh(%(sudo usermod --shell /bin/zsh "$USER"))
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.install_autosuggestions
|
97
|
+
auto = File.join(OMZ_PLUGINS, 'zsh-autosuggestions')
|
98
|
+
return if File.exist?(auto)
|
99
|
+
|
100
|
+
Rake.sh("git clone https://github.com/zsh-users/zsh-autosuggestions #{auto}")
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.install_syntax_highlighting
|
104
|
+
syntax = File.join(OMZ_PLUGINS, 'zsh-syntax-highlighting')
|
105
|
+
return if File.exist?(syntax)
|
106
|
+
|
107
|
+
Rake.sh("git clone https://github.com/zsh-users/zsh-syntax-highlighting.git #{syntax}")
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.plug_install_vim_neovim
|
111
|
+
Rake.sh(%(vim +'PlugInstall --sync' +qa))
|
112
|
+
Rake.sh(%(vim +'PlugUpdate --sync' +qa))
|
113
|
+
Rake.sh(%(nvim +'PlugInstall --sync' +qa))
|
114
|
+
Rake.sh(%(nvim +'PlugUpdate --sync' +qa))
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.install_tmux_plugin_manager_and_plugins
|
118
|
+
install_path = File.join(Dir.home, '.tmux', 'plugins', 'tpm')
|
119
|
+
unless File.exist?(install_path)
|
120
|
+
Rake.mkdir_p(install_path)
|
121
|
+
Rake.sh("git clone https://github.com/tmux-plugins/tpm #{instal_path}")
|
122
|
+
end
|
123
|
+
# start a server but don't attach to it
|
124
|
+
Rake.sh('tmux start-server')
|
125
|
+
# create a new session but don't attach to it either
|
126
|
+
Rake.sh('tmux new-session -d')
|
127
|
+
# install the plugins
|
128
|
+
Rake.sh('~/.tmux/plugins/tpm/scripts/install_plugins.sh')
|
129
|
+
# killing the server is not required, I guess
|
130
|
+
Rake.sh('tmux kill-server')
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.install_gems
|
134
|
+
Packages::GEMS.each { |g| Rake.sh("gem install #{g}") }
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module VpsCli
|
4
|
+
class Packages
|
5
|
+
LANGUAGES = %w[python3 python3-pip python-dev
|
6
|
+
python3-dev python-pip python3-neovim
|
7
|
+
nodejs golang ruby ruby-dev].freeze
|
8
|
+
|
9
|
+
TOOLS = %w[curl tmux git vim zsh sqlite3 ctags rdoc libsqlite3-dev
|
10
|
+
openssh-client openssh-server dconf-cli gnome-terminal
|
11
|
+
postgresql pry rubygems fail2ban node-gyp
|
12
|
+
libcurl4-openssl-dev libxml2-dev].freeze
|
13
|
+
|
14
|
+
ADDED_REPOS = %w[neovim asciinema docker mosh yarn].freeze
|
15
|
+
|
16
|
+
GEMS = %w[colorls neovim rake pry
|
17
|
+
rubocop gem-ctags rails yard
|
18
|
+
thor bundler].freeze
|
19
|
+
|
20
|
+
UBUNTU = LANGUAGES.dup.concat(TOOLS).concat(ADDED_REPOS)
|
21
|
+
end
|
22
|
+
end
|
data/lib/vps_cli/pull.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'vps_cli/helpers/file_helper'
|
5
|
+
|
6
|
+
module VpsCli
|
7
|
+
# Pull changes from local dir into config dir
|
8
|
+
# to be able to push changes up to the config dir
|
9
|
+
class Pull
|
10
|
+
# Base pull method
|
11
|
+
# @param config [VpsCli::Configuration] The configuration to use
|
12
|
+
# @see VpsCli::Configuration
|
13
|
+
def self.all(config = VpsCli.configuration)
|
14
|
+
# pulls dotfiles into specified directory
|
15
|
+
dotfiles(config)
|
16
|
+
|
17
|
+
# pulls from config.local_sshd_config
|
18
|
+
sshd_config(config)
|
19
|
+
|
20
|
+
# pulls via dconf
|
21
|
+
gnome_terminal_settings(config)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# Pulls dotfiles from config.local into your
|
26
|
+
# specified config.dotfiles location
|
27
|
+
def self.dotfiles(config = VpsCli.configuration)
|
28
|
+
|
29
|
+
common_dotfiles(config.dotfiles,
|
30
|
+
config.local_dir) do |remote_file, local_file|
|
31
|
+
copy_file_or_dir(local_file, remote_file)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Puts you at the point of a directory where the
|
36
|
+
# local file and dotfile are the same allowing you to
|
37
|
+
# copy them
|
38
|
+
def self.common_dotfiles(dotfiles_dir, local_dir)
|
39
|
+
Dir.each_child(dotfiles_dir) do |remote_file|
|
40
|
+
Dir.each_child(local_dir) do |local_file|
|
41
|
+
next unless local_file == ".#{remote_file}"
|
42
|
+
|
43
|
+
remote_file = File.join(dotfiles_dir, remote_file)
|
44
|
+
local_file = File.join(local_dir, local_file)
|
45
|
+
yield(remote_file, local_file)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Differentiates between files and dirs to appropriately copy them
|
51
|
+
# Uses Rake.cp_r for directories, uses Rake.cp for simple files
|
52
|
+
# @param orig_file [File, Dir] File or Dir you're copying from
|
53
|
+
# @param new_file [File, Dir] File or Dir you're copying to
|
54
|
+
# @param verbose [Boolean]
|
55
|
+
def self.copy_file_or_dir(orig_file, new_file)
|
56
|
+
if File.directory?(orig_file) && File.directory?(new_file)
|
57
|
+
# Rake.cp_r(orig_file, new_file)
|
58
|
+
Dir.each_child(orig_file) do |o_file|
|
59
|
+
Dir.each_child(new_file) do |n_file|
|
60
|
+
next unless o_file == n_file
|
61
|
+
|
62
|
+
|
63
|
+
o_file = File.join(File.expand_path(orig_file), o_file)
|
64
|
+
n_file = File.expand_path(new_file)
|
65
|
+
|
66
|
+
Rake.cp_r(o_file, n_file)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
else
|
70
|
+
Rake.cp(orig_file, new_file)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Pulls sshd_config from config.local_sshd_config into config.misc_files
|
75
|
+
def self.sshd_config(config = Configuration.new)
|
76
|
+
local = config.local_sshd_config
|
77
|
+
remote = config.misc_files
|
78
|
+
|
79
|
+
copy_file_or_dir(local, remote)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Pulls the local config of gnome into the given config.misc_files
|
83
|
+
def self.gnome_terminal_settings(config = VpsCli.configuration)
|
84
|
+
# This is where dconf stores gnome terminal
|
85
|
+
gnome_dconf = '/org/gnome/terminal/'
|
86
|
+
remote_settings = File.join(config.misc_files,
|
87
|
+
'gnome_terminal_settings')
|
88
|
+
|
89
|
+
orig_remote_contents = File.read(remote_settings)
|
90
|
+
|
91
|
+
Rake.sh("dconf dump #{gnome_dconf} > #{remote_settings}")
|
92
|
+
rescue RuntimeError => error
|
93
|
+
VpsCli.errors << error
|
94
|
+
# if dconf errors, it will erase the config file contents
|
95
|
+
# So this protects against that
|
96
|
+
reset_to_original(remote_settings, orig_remote_contents)
|
97
|
+
else
|
98
|
+
puts "Successfully dumped Gnome into #{remote_settings}" if config.verbose
|
99
|
+
end
|
100
|
+
|
101
|
+
# Method intended for dealing with the way dconf will automatically
|
102
|
+
# rewrite a file and make it empty
|
103
|
+
# @param remote_settings [File] File located in your repo
|
104
|
+
# @param orig_remote_contents [String] The String to be written to
|
105
|
+
# remote settings
|
106
|
+
def self.reset_to_original(remote_settings, orig_remote_contents)
|
107
|
+
File.write(remote_settings, orig_remote_contents)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module VpsCli
|
4
|
+
# Various setup to include ufw firewalls, adding repos, adding fonts etc
|
5
|
+
class Setup
|
6
|
+
# checks if the user has sudo privileges via uid
|
7
|
+
def self.privileged_user?
|
8
|
+
Process.uid.zero?
|
9
|
+
end
|
10
|
+
|
11
|
+
# checks if a user is root
|
12
|
+
def self.root?
|
13
|
+
privileged_user? && Dir.home == '/root'
|
14
|
+
end
|
15
|
+
|
16
|
+
# Runs the full setup process
|
17
|
+
# @see #ufw_setup
|
18
|
+
# @see #add_dejavu_sans_mono_font
|
19
|
+
# @see #add_repos this method is deprecated due to all packages being added
|
20
|
+
# to latest ubuntu 18.04+
|
21
|
+
def self.full
|
22
|
+
# this is here for compatibility purposes, no longer runs anything
|
23
|
+
add_repos
|
24
|
+
add_dejavu_sans_mono_font
|
25
|
+
|
26
|
+
ufw_setup
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Sets up ufw for you to be able to have certain firewalls in place
|
31
|
+
# Must be run after installing ufw
|
32
|
+
# via sudo apt install ufw
|
33
|
+
def self.ufw_setup
|
34
|
+
Rake.sh('sudo ufw default deny incoming')
|
35
|
+
Rake.sh('sudo ufw default allow outgoing')
|
36
|
+
# allows ssh & mosh connections
|
37
|
+
Rake.sh('sudo ufw allow 60000:61000/tcp')
|
38
|
+
|
39
|
+
# Typical ssh port
|
40
|
+
Rake.sh('sudo ufw allow 22')
|
41
|
+
|
42
|
+
Rake.sh('yes | sudo ufw enable')
|
43
|
+
Rake.sh('yes | sudo systemctl restart sshd')
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.add_dejavu_sans_mono_font
|
47
|
+
Rake.sh('mkdir -p ~/.local/share/fonts')
|
48
|
+
Rake.sh(%(cd ~/.local/share/fonts && curl -fLo "DejaVu Sans Mono for Powerline Nerd Font Complete.otf" https://github.com/ryanoasis/nerd-fonts/raw/master/patched-fonts/DejaVuSansMono/Regular/complete/DejaVu%20Sans%20Mono%20Nerd%20Font%20Complete%20Mono.ttf))
|
49
|
+
end
|
50
|
+
##
|
51
|
+
# Adds repos to the package manager to be tracked
|
52
|
+
# Adds the following repos:
|
53
|
+
# docker, yarn
|
54
|
+
# This method used to add neovim, asciinema, and mosh as well
|
55
|
+
# But they are all part of the base ubuntu 18.10 release
|
56
|
+
def self.add_repos
|
57
|
+
## Now part of cosmic release for Ubuntu 18.10
|
58
|
+
# add_yarn_repo
|
59
|
+
# add_docker_repo
|
60
|
+
# add_neovim_repo
|
61
|
+
# add_mosh_repo
|
62
|
+
# add_asciinema_repo
|
63
|
+
end
|
64
|
+
|
65
|
+
# @deprecated Now part of the standard packaging of Ubuntu 18.04+
|
66
|
+
def self.add_docker_repo
|
67
|
+
# Instructions straight from https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository
|
68
|
+
# Docker repo
|
69
|
+
Rake.sh('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -')
|
70
|
+
Rake.sh('sudo apt-key fingerprint 0EBFCD88')
|
71
|
+
Rake.sh(%{yes "\n" | sudo add-apt-repository -y \
|
72
|
+
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
|
73
|
+
$(lsb_release -cs) \
|
74
|
+
stable"})
|
75
|
+
end
|
76
|
+
|
77
|
+
# @deprecated Now part of the standard packaging of Ubuntu 18.04+
|
78
|
+
def self.add_yarn_repo
|
79
|
+
# yarn repo
|
80
|
+
Rake.sh(%( curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -))
|
81
|
+
Rake.sh(%(echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list))
|
82
|
+
Rake.sh('sudo apt update')
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
# @deprecated Now part of the standard packaging of Ubuntu 18.04+
|
87
|
+
def self.add_neovim_repo
|
88
|
+
# add neovim
|
89
|
+
Rake.sh('sudo add-apt-repository ppa:neovim-ppa/stable')
|
90
|
+
end
|
91
|
+
|
92
|
+
# @deprecated Now part of the standard packaging of Ubuntu 18.04+
|
93
|
+
def self.add_mosh_repo
|
94
|
+
# mosh repo
|
95
|
+
Rake.sh(%(yes "\n" | sudo add-apt-repository ppa:keithw/mosh))
|
96
|
+
end
|
97
|
+
|
98
|
+
# @deprecated Now part of the standard packaging of Ubuntu 18.04+
|
99
|
+
def self.add_asciinema_repo
|
100
|
+
# asciinema repo for recording the terminal
|
101
|
+
Rake.sh('sudo apt-add-repository -y ppa:zanchey/asciinema')
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
data/lib/vps_cli.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'vps_cli/configuration'
|
4
|
+
require 'vps_cli/access'
|
5
|
+
require 'vps_cli/helpers/access_helper'
|
6
|
+
require 'vps_cli/cli'
|
7
|
+
require 'vps_cli/copy'
|
8
|
+
require 'vps_cli/helpers/file_helper'
|
9
|
+
require 'vps_cli/install'
|
10
|
+
require 'vps_cli/packages'
|
11
|
+
require 'vps_cli/pull'
|
12
|
+
require 'vps_cli/setup'
|
13
|
+
require 'vps_cli/version'
|
14
|
+
require 'vps_cli/helpers/github_http'
|
15
|
+
|
16
|
+
# Used for setting up a ubuntu environment
|
17
|
+
module VpsCli
|
18
|
+
# @!group Top Level Constants
|
19
|
+
|
20
|
+
# Project's Root Directory
|
21
|
+
ROOT = File.expand_path(File.expand_path('../', __dir__))
|
22
|
+
|
23
|
+
# Projects config_files directory
|
24
|
+
FILES_DIR = File.join(ROOT, 'config_files')
|
25
|
+
|
26
|
+
# Projects Dotfiles directory
|
27
|
+
DOTFILES_DIR = File.join(FILES_DIR, 'dotfiles')
|
28
|
+
|
29
|
+
# Miscellaneous files like sshd_config
|
30
|
+
MISC_FILES_DIR = File.join(FILES_DIR, 'misc_files')
|
31
|
+
|
32
|
+
# Directory of backup files
|
33
|
+
BACKUP_FILES_DIR = File.join(Dir.home, 'backup_files')
|
34
|
+
|
35
|
+
# @!endgroup
|
36
|
+
|
37
|
+
# all following methods will be module wide
|
38
|
+
class << self
|
39
|
+
# Used for loggings errors
|
40
|
+
# same as self.errors && self.errors=(errors)
|
41
|
+
# VpsCli.errors now accessible module wide
|
42
|
+
attr_accessor :errors
|
43
|
+
|
44
|
+
# Allows the user to be able to set global configurations
|
45
|
+
# @example
|
46
|
+
# VpsCli.configure do |config|
|
47
|
+
# config.local_dir = Dir.home
|
48
|
+
# config.backup_dir = File.join(Dir.home, 'backup_files')
|
49
|
+
# config.verbose = true
|
50
|
+
# end
|
51
|
+
# This will set the local dir to the value of $HOME
|
52
|
+
# The local dir is where files are copied to
|
53
|
+
attr_writer :configuration
|
54
|
+
|
55
|
+
# Base set of options, will set the defaults for the various options
|
56
|
+
# Take a hash due to people being able to set their own directories
|
57
|
+
# @param [Hash] Takes the hash to modify
|
58
|
+
# @return [Hash] Returns the options hash with the various options
|
59
|
+
# Possible options:
|
60
|
+
# :backup_dir
|
61
|
+
# :local_dir
|
62
|
+
# :dotfiles_dir
|
63
|
+
# :misc_files_dir
|
64
|
+
# :local_sshd_config
|
65
|
+
# :verbose
|
66
|
+
# :testing
|
67
|
+
# def create_options(opts = {})
|
68
|
+
# opts[:backup_dir] ||= BACKUP_FILES_DIR
|
69
|
+
# opts[:local_dir] ||= Dir.home
|
70
|
+
# opts[:dotfiles_dir] ||= DOTFILES_DIR
|
71
|
+
# opts[:misc_files_dir] ||= MISC_FILES_DIR
|
72
|
+
# opts[:local_sshd_config] ||= '/etc/ssh/sshd_config'
|
73
|
+
|
74
|
+
# opts[:verbose] = false if opts[:verbose].nil?
|
75
|
+
# opts[:interactive] = true if opts[:interactive].nil?
|
76
|
+
|
77
|
+
# opts
|
78
|
+
# end
|
79
|
+
|
80
|
+
def full_install(options = {})
|
81
|
+
VpsCli::Setup.full
|
82
|
+
VpsCli::Install.full
|
83
|
+
VpsCli::Access.provide_credentials(options)
|
84
|
+
VpsCli::Copy.all(options)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Creates an empty array of errors to push to
|
89
|
+
@errors ||= []
|
90
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
2
|
+
Version: GnuPG v1
|
3
|
+
|
4
|
+
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
|
33
|
+
=zqxY
|
34
|
+
-----END PGP PRIVATE KEY BLOCK-----
|
35
|
+
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
36
|
+
|
37
|
+
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
|
91
|
+
m4uvvRXNPuUA
|
92
|
+
=Gco8
|
93
|
+
-----END PGP PRIVATE KEY BLOCK-----
|
94
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
95
|
+
|
96
|
+
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
|
123
|
+
ZLzz
|
124
|
+
=xTqz
|
125
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
@@ -0,0 +1,19 @@
|
|
1
|
+
gitthub:
|
2
|
+
username: username
|
3
|
+
email: email@example.com
|
4
|
+
api_token: super_secret_token
|
5
|
+
|
6
|
+
heroku_unencrypted:
|
7
|
+
- The values of heroku can be obtained from $HOME/.netrc
|
8
|
+
- If you have logged in via the following commands before
|
9
|
+
- heroku login or heroku login --interactive
|
10
|
+
|
11
|
+
heroku:
|
12
|
+
api:
|
13
|
+
machine: machine api.heroku.com
|
14
|
+
login: login random_username
|
15
|
+
password: password blahblahblah
|
16
|
+
git:
|
17
|
+
machine: machine git.heroku.com
|
18
|
+
login: login random_username
|
19
|
+
password: password more_random_stuff
|
data/vps_cli.gemspec
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'vps_cli/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'vps_cli'
|
9
|
+
spec.version = VpsCli::VERSION
|
10
|
+
spec.authors = ['paramagicdev']
|
11
|
+
spec.email = ['konnor5456@gmail.com']
|
12
|
+
|
13
|
+
spec.summary = 'A gem created to facilitate setup of a new dev server'
|
14
|
+
spec.homepage = 'https://github.com/ParamagicDev/vps_cli'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org/"
|
21
|
+
|
22
|
+
spec.metadata['homepage_uri'] = 'https://github.com/ParamagicDev/vps_cli'
|
23
|
+
spec.metadata['source_code_uri'] = 'https://github.com/ParamagicDev/vps_cli'
|
24
|
+
spec.metadata['changelog_uri'] = 'https://github.com/ParamagicDev/vps_cli'
|
25
|
+
else
|
26
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
27
|
+
'public gem pushes.'
|
28
|
+
end
|
29
|
+
|
30
|
+
# Specify which files should be added to the gem when it is released.
|
31
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
32
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
33
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
34
|
+
end
|
35
|
+
spec.bindir = 'exe'
|
36
|
+
spec.executables = ['vps-cli']
|
37
|
+
spec.require_paths = ['lib']
|
38
|
+
|
39
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
40
|
+
spec.add_development_dependency 'guard', '~> 2.15'
|
41
|
+
spec.add_development_dependency 'guard-minitest', '~> 2.4'
|
42
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
43
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
44
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
45
|
+
spec.add_runtime_dependency 'thor', '~> 0.20'
|
46
|
+
end
|