appli 0.0.1 → 0.0.3
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.
- data/lib/appli/command.rb +31 -33
- data/lib/appli.rb +28 -16
- data/lib/commands/mysql.rb +50 -0
- data/lib/commands/system.rb +16 -4
- metadata +3 -2
data/lib/appli/command.rb
CHANGED
@@ -5,6 +5,10 @@ module Appli
|
|
5
5
|
(class << self;self end).send :define_method, :command, &block
|
6
6
|
end
|
7
7
|
|
8
|
+
def debug?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
8
12
|
def call(options, *args)
|
9
13
|
@options = options
|
10
14
|
arity = method(:command).arity
|
@@ -14,14 +18,10 @@ module Appli
|
|
14
18
|
puts "An error occured while excuting your command...\n#{e.message}"
|
15
19
|
end
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
rescue LoadError
|
22
|
-
puts "Hirb is not installed. Install hirb using '[sudo] gem install hirb' to get cool ASCII tables"
|
23
|
-
Process.exit(1)
|
24
|
-
end
|
21
|
+
private
|
22
|
+
|
23
|
+
def host
|
24
|
+
application['host']
|
25
25
|
end
|
26
26
|
|
27
27
|
def application
|
@@ -36,28 +36,15 @@ module Appli
|
|
36
36
|
@options || Hash.new
|
37
37
|
end
|
38
38
|
|
39
|
-
def execute_commands(array)
|
40
|
-
for command in array
|
41
|
-
puts "\e[44;33m" + command + "\e[0m"
|
42
|
-
exit_code = 0
|
43
|
-
IO.popen(command) do |f|
|
44
|
-
output = f.read
|
45
|
-
exit_code = Process.waitpid2(f.pid)[1]
|
46
|
-
end
|
47
|
-
if exit_code != 0
|
48
|
-
$stderr.puts "An error occured running: #{command}"
|
49
|
-
Process.exit(1)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
39
|
def git_config_variable(name)
|
55
|
-
if
|
56
|
-
|
40
|
+
@config_variables = Hash.new if @config_variables.nil?
|
41
|
+
if @config_variables[name]
|
42
|
+
@config_variables[name]
|
57
43
|
else
|
58
|
-
r = `git config
|
44
|
+
r = `git config appli.#{name.to_s}`.chomp
|
45
|
+
puts "Getting configuration variable: appli.#{name.to_s} (was: '#{r}')" if debug?
|
46
|
+
@config_variables[name] = (r.empty? ? nil : r)
|
59
47
|
end
|
60
|
-
r.empty? ? nil : r
|
61
48
|
end
|
62
49
|
|
63
50
|
def api_request(url, username, password, data = nil)
|
@@ -78,10 +65,14 @@ module Appli
|
|
78
65
|
res.use_ssl = true
|
79
66
|
res.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
80
67
|
end
|
68
|
+
puts "Requesting '#{url}' on as #{data ? 'POST' : 'GET'}" if debug?
|
81
69
|
res = res.request(req, data)
|
82
70
|
case res
|
83
71
|
when Net::HTTPSuccess
|
84
72
|
return res.body
|
73
|
+
when Net::HTTPNotFound
|
74
|
+
puts "Resource not found"
|
75
|
+
Process.exit(1)
|
85
76
|
when Net::HTTPServiceUnavailable
|
86
77
|
puts "The API is currently unavailable. Please check your codebase account has been enabled for API access."
|
87
78
|
Process.exit(1)
|
@@ -113,14 +104,21 @@ module Appli
|
|
113
104
|
def domain
|
114
105
|
git_config_variable(:domain) || 'applihq.com'
|
115
106
|
end
|
116
|
-
|
117
|
-
def get_from_ssh(command)
|
118
|
-
`ssh -p #{application['ssh_port']} app@mercury.uk.applihq.com \"#{command}\"`
|
119
|
-
end
|
120
|
-
|
107
|
+
|
121
108
|
def ssh(command, filter = //)
|
122
|
-
puts
|
109
|
+
puts remote_exec(command).gsub(filter, '')
|
123
110
|
end
|
124
111
|
|
112
|
+
def remote_exec(command)
|
113
|
+
command = "ssh -p #{application['ssh_port']} app@#{host['name']} \"#{command}\""
|
114
|
+
puts "Executing: #{command}" if debug?
|
115
|
+
`#{command}`
|
116
|
+
end
|
117
|
+
|
118
|
+
def error(command, exit_code = 1)
|
119
|
+
$stderr.puts command
|
120
|
+
Process.exit(exit_code)
|
121
|
+
end
|
122
|
+
|
125
123
|
end
|
126
124
|
end
|
data/lib/appli.rb
CHANGED
@@ -14,36 +14,36 @@ module Appli
|
|
14
14
|
class NotConfiguredError < StandardError; end
|
15
15
|
class MustBeInRepositoryError < StandardError; end
|
16
16
|
|
17
|
-
VERSION = "
|
17
|
+
VERSION = "0.0.3"
|
18
18
|
|
19
19
|
def run(command, args = [])
|
20
20
|
load_commands
|
21
21
|
command = 'help' if command.nil?
|
22
|
-
application = nil
|
23
|
-
commands_array = @global_commands
|
24
22
|
|
25
23
|
if @global_commands[command]
|
26
|
-
|
24
|
+
run_command(command, :global, args)
|
27
25
|
elsif @application_commands[args.first]
|
28
|
-
|
29
|
-
command = args.shift
|
30
|
-
commands_array = @application_commands
|
31
|
-
elsif !command.empty?
|
32
|
-
puts "usage: appli #{command} {command}\n\n"
|
33
|
-
command = 'help'
|
26
|
+
run_command(args.shift, :app, ([command] + args))
|
34
27
|
else
|
35
|
-
puts "
|
28
|
+
puts "usage: appli [command]"
|
29
|
+
puts "Command not found. Check 'appli help' for full information."
|
36
30
|
Process.exit(1)
|
37
31
|
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def run_command(command, type, args = [])
|
35
|
+
array = (type == :global ? @global_commands : @application_commands)
|
36
|
+
|
37
|
+
options = parse_options(args)
|
38
|
+
options.merge!({:application => args.shift}) if type == :app
|
38
39
|
|
39
|
-
|
40
|
-
if args.size < commands_array[command][:required_args].to_i
|
40
|
+
if args.size < array[command][:required_args].to_i
|
41
41
|
puts "error: #{commands_array[command][:usage]}"
|
42
42
|
puts "See 'cb help #{command}' for usage."
|
43
43
|
Process.exit(1)
|
44
44
|
end
|
45
|
-
|
46
|
-
|
45
|
+
|
46
|
+
array[command][:block].call(options, *args)
|
47
47
|
end
|
48
48
|
|
49
49
|
def command(command, options = {}, &block)
|
@@ -74,6 +74,10 @@ module Appli
|
|
74
74
|
@application_commands
|
75
75
|
end
|
76
76
|
|
77
|
+
def commands
|
78
|
+
global_commands.merge(application_commands)
|
79
|
+
end
|
80
|
+
|
77
81
|
def desc(value)
|
78
82
|
@next_description = Array.new if @next_description.nil?
|
79
83
|
@next_description << value
|
@@ -88,6 +92,11 @@ module Appli
|
|
88
92
|
@next_flags[key] = value
|
89
93
|
end
|
90
94
|
|
95
|
+
def alias(a, b)
|
96
|
+
@aliases = Hash.new if @aliases.nil?
|
97
|
+
@aliases[a] = b
|
98
|
+
end
|
99
|
+
|
91
100
|
def load_commands
|
92
101
|
Dir[File.join(File.dirname(__FILE__), 'commands', '*.rb')].each do |path|
|
93
102
|
Appli.module_eval File.read(path), path
|
@@ -139,7 +148,7 @@ Appli.command "help", :global => true do |command|
|
|
139
148
|
puts "For more information see http://www.applihq.com/gem"
|
140
149
|
puts "See 'appli help [command]' for usage information."
|
141
150
|
else
|
142
|
-
if c = Appli.
|
151
|
+
if c = Appli.commands[command]
|
143
152
|
puts c[:description]
|
144
153
|
if c[:usage]
|
145
154
|
puts
|
@@ -164,3 +173,6 @@ Appli.usage "cb version"
|
|
164
173
|
Appli.command "version", :global => true do
|
165
174
|
puts "Appli Gem Version #{Appli::VERSION}"
|
166
175
|
end
|
176
|
+
|
177
|
+
Appli.alias '-v', 'version'
|
178
|
+
Appli.alias '-s', 'ssh'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
desc 'Create a MySQL console connection for your first database'
|
2
|
+
usage "appli [application] mysql"
|
3
|
+
command "db:console" do
|
4
|
+
database = get("applications/#{@options[:application]}/databases").first
|
5
|
+
if database
|
6
|
+
database = database['database']
|
7
|
+
puts "Connecting to database '#{database['name']}' on '#{database['host']['name']}'"
|
8
|
+
exec("ssh -t -p #{application['ssh_port']} app@#{host['name']} mysql -u #{database['username']} -p#{database['password']} -h #{database['host']['name']} #{database['name']}")
|
9
|
+
else
|
10
|
+
error("No database was not found for this application.")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Import a named MySQL file'
|
15
|
+
usage "appli [application] db:import {database number} {path to import mysql dump}"
|
16
|
+
command "db:import" do |number, path|
|
17
|
+
error("Import file not found at '#{path}'") unless File.exist?(path)
|
18
|
+
database = get("applications/#{@options[:application]}/databases/#{number}")
|
19
|
+
if database
|
20
|
+
database = database['database']
|
21
|
+
puts "Uploading MySQL export to server..."
|
22
|
+
remote_exec("rm -f ~/.appli_import.sql")
|
23
|
+
system("scp -P #{application['ssh_port']} #{path} app@#{host['name']}:~/.appli_import.sql")
|
24
|
+
puts "Importing database into '#{database['name']}' on '#{database['host']['name']}'..."
|
25
|
+
remote_exec("mysql -u #{database['username']} -p#{database['password']} -h #{database['host']['name']} #{database['name']} < ~/.appli_import.sql")
|
26
|
+
else
|
27
|
+
error "No database was found with number '#{number}'"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'List all databases on this application'
|
32
|
+
usage "appli [application] db"
|
33
|
+
command "db" do
|
34
|
+
puts '-' * 85
|
35
|
+
print 'Name'.ljust(15)
|
36
|
+
print 'Username'.ljust(15)
|
37
|
+
print 'Password'.ljust(15)
|
38
|
+
print 'Host'.ljust(30)
|
39
|
+
puts
|
40
|
+
puts '-' * 85
|
41
|
+
|
42
|
+
for database in get("applications/#{@options[:application]}/databases")
|
43
|
+
database = database['database']
|
44
|
+
print database['name'].ljust(15)
|
45
|
+
print database['username'].ljust(15)
|
46
|
+
print database['password'].ljust(15)
|
47
|
+
print database['host']['name'].ljust(30)
|
48
|
+
puts
|
49
|
+
end
|
50
|
+
end
|
data/lib/commands/system.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
desc "Display system memory usage"
|
2
2
|
usage "appli mem:system"
|
3
3
|
command "mem:system" do
|
4
|
-
puts
|
4
|
+
puts remote_exec("free -m").split("\n")[0,2].join("\n")
|
5
5
|
end
|
6
6
|
|
7
7
|
desc 'Display passenger memory statistics'
|
@@ -13,7 +13,7 @@ end
|
|
13
13
|
desc 'Display your current disk space usage'
|
14
14
|
usage "appli diskusage"
|
15
15
|
command "diskusage" do
|
16
|
-
output =
|
16
|
+
output = remote_exec("df -h").split("\n")[1]
|
17
17
|
output = output.split(/\s+/)
|
18
18
|
fs, size, usage, available, usage_percent, mountpoint = output
|
19
19
|
puts "You are using #{usage} (including system files)."
|
@@ -32,9 +32,21 @@ command "settings", :global => true do
|
|
32
32
|
puts "Domain..........: #{git_config_variable(:domain) || 'unknown'}"
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
35
|
desc 'SSH to the named server'
|
37
36
|
usage "appli [application] ssh"
|
38
37
|
command "ssh" do
|
39
|
-
exec "ssh -p #{application['ssh_port']} app
|
38
|
+
exec "ssh -p #{application['ssh_port']} app@#{host['name']}"
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'Create a MySQL console connection for your first database'
|
42
|
+
usage "appli [application] mysql"
|
43
|
+
command "mysql" do
|
44
|
+
database = get("applications/#{@options[:application]}/databases").first
|
45
|
+
if database
|
46
|
+
database = database['database']
|
47
|
+
puts "Connecting to database '#{database['name']}' on '#{database['host']['name']}'"
|
48
|
+
exec("ssh -t -p #{application['ssh_port']} app@#{host['name']} mysql -u #{database['username']} -p#{database['password']} -h #{database['host']['name']} #{database['name']}")
|
49
|
+
else
|
50
|
+
error("No database was not found for this application.")
|
51
|
+
end
|
40
52
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Cooke
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-15 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- lib/appli/command.rb
|
36
36
|
- lib/appli.rb
|
37
37
|
- lib/commands/gems.rb
|
38
|
+
- lib/commands/mysql.rb
|
38
39
|
- lib/commands/system.rb
|
39
40
|
has_rdoc: true
|
40
41
|
homepage: http://www.atechmedia.com
|