pogo 2.31.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +73 -0
- data/bin/pogo +22 -0
- data/data/cacert.pem +3988 -0
- data/lib/heroku.rb +22 -0
- data/lib/heroku/auth.rb +320 -0
- data/lib/heroku/cli.rb +38 -0
- data/lib/heroku/client.rb +764 -0
- data/lib/heroku/client/heroku_postgresql.rb +111 -0
- data/lib/heroku/client/pgbackups.rb +113 -0
- data/lib/heroku/client/rendezvous.rb +105 -0
- data/lib/heroku/client/ssl_endpoint.rb +25 -0
- data/lib/heroku/command.rb +273 -0
- data/lib/heroku/command/account.rb +23 -0
- data/lib/heroku/command/accounts.rb +34 -0
- data/lib/heroku/command/addons.rb +305 -0
- data/lib/heroku/command/apps.rb +311 -0
- data/lib/heroku/command/auth.rb +86 -0
- data/lib/heroku/command/base.rb +230 -0
- data/lib/heroku/command/certs.rb +148 -0
- data/lib/heroku/command/config.rb +137 -0
- data/lib/heroku/command/db.rb +218 -0
- data/lib/heroku/command/domains.rb +85 -0
- data/lib/heroku/command/drains.rb +46 -0
- data/lib/heroku/command/git.rb +65 -0
- data/lib/heroku/command/help.rb +163 -0
- data/lib/heroku/command/keys.rb +115 -0
- data/lib/heroku/command/labs.rb +161 -0
- data/lib/heroku/command/logs.rb +98 -0
- data/lib/heroku/command/maintenance.rb +61 -0
- data/lib/heroku/command/pg.rb +277 -0
- data/lib/heroku/command/pgbackups.rb +289 -0
- data/lib/heroku/command/plugins.rb +110 -0
- data/lib/heroku/command/ps.rb +232 -0
- data/lib/heroku/command/releases.rb +124 -0
- data/lib/heroku/command/run.rb +179 -0
- data/lib/heroku/command/sharing.rb +89 -0
- data/lib/heroku/command/ssl.rb +61 -0
- data/lib/heroku/command/stack.rb +62 -0
- data/lib/heroku/command/status.rb +51 -0
- data/lib/heroku/command/update.rb +47 -0
- data/lib/heroku/command/version.rb +23 -0
- data/lib/heroku/deprecated.rb +5 -0
- data/lib/heroku/deprecated/help.rb +38 -0
- data/lib/heroku/distribution.rb +9 -0
- data/lib/heroku/helpers.rb +517 -0
- data/lib/heroku/helpers/heroku_postgresql.rb +104 -0
- data/lib/heroku/plugin.rb +161 -0
- data/lib/heroku/updater.rb +158 -0
- data/lib/heroku/version.rb +3 -0
- data/lib/vendor/heroku/okjson.rb +598 -0
- data/spec/helper/legacy_help.rb +16 -0
- data/spec/heroku/auth_spec.rb +246 -0
- data/spec/heroku/client/heroku_postgresql_spec.rb +34 -0
- data/spec/heroku/client/pgbackups_spec.rb +43 -0
- data/spec/heroku/client/rendezvous_spec.rb +62 -0
- data/spec/heroku/client/ssl_endpoint_spec.rb +48 -0
- data/spec/heroku/client_spec.rb +564 -0
- data/spec/heroku/command/addons_spec.rb +585 -0
- data/spec/heroku/command/apps_spec.rb +351 -0
- data/spec/heroku/command/auth_spec.rb +38 -0
- data/spec/heroku/command/base_spec.rb +109 -0
- data/spec/heroku/command/certs_spec.rb +178 -0
- data/spec/heroku/command/config_spec.rb +144 -0
- data/spec/heroku/command/db_spec.rb +110 -0
- data/spec/heroku/command/domains_spec.rb +87 -0
- data/spec/heroku/command/drains_spec.rb +34 -0
- data/spec/heroku/command/git_spec.rb +116 -0
- data/spec/heroku/command/help_spec.rb +93 -0
- data/spec/heroku/command/keys_spec.rb +120 -0
- data/spec/heroku/command/labs_spec.rb +99 -0
- data/spec/heroku/command/logs_spec.rb +60 -0
- data/spec/heroku/command/maintenance_spec.rb +51 -0
- data/spec/heroku/command/pg_spec.rb +223 -0
- data/spec/heroku/command/pgbackups_spec.rb +280 -0
- data/spec/heroku/command/plugins_spec.rb +104 -0
- data/spec/heroku/command/ps_spec.rb +195 -0
- data/spec/heroku/command/releases_spec.rb +130 -0
- data/spec/heroku/command/run_spec.rb +86 -0
- data/spec/heroku/command/sharing_spec.rb +59 -0
- data/spec/heroku/command/ssl_spec.rb +32 -0
- data/spec/heroku/command/stack_spec.rb +46 -0
- data/spec/heroku/command/status_spec.rb +48 -0
- data/spec/heroku/command/version_spec.rb +16 -0
- data/spec/heroku/command_spec.rb +211 -0
- data/spec/heroku/helpers/heroku_postgresql_spec.rb +109 -0
- data/spec/heroku/helpers_spec.rb +48 -0
- data/spec/heroku/plugin_spec.rb +172 -0
- data/spec/heroku/updater_spec.rb +44 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +209 -0
- data/spec/support/display_message_matcher.rb +49 -0
- data/spec/support/openssl_mock_helper.rb +8 -0
- metadata +220 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
# manage app config vars
|
4
|
+
#
|
5
|
+
class Heroku::Command::Config < Heroku::Command::Base
|
6
|
+
|
7
|
+
# config
|
8
|
+
#
|
9
|
+
# display the config vars for an app
|
10
|
+
#
|
11
|
+
# -s, --shell # output config vars in shell format
|
12
|
+
#
|
13
|
+
#Examples:
|
14
|
+
#
|
15
|
+
# $ heroku config
|
16
|
+
# A: one
|
17
|
+
# B: two
|
18
|
+
#
|
19
|
+
# $ heroku config --shell
|
20
|
+
# A=one
|
21
|
+
# B=two
|
22
|
+
#
|
23
|
+
def index
|
24
|
+
validate_arguments!
|
25
|
+
|
26
|
+
vars = api.get_config_vars(app).body
|
27
|
+
if vars.empty?
|
28
|
+
display("#{app} has no config vars.")
|
29
|
+
else
|
30
|
+
vars.each {|key, value| vars[key] = value.to_s}
|
31
|
+
if options[:shell]
|
32
|
+
vars.keys.sort.each do |key|
|
33
|
+
display(%{#{key}=#{vars[key]}})
|
34
|
+
end
|
35
|
+
else
|
36
|
+
styled_header("#{app} Config Vars")
|
37
|
+
styled_hash(vars)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# config:set KEY1=VALUE1 [KEY2=VALUE2 ...]
|
43
|
+
#
|
44
|
+
# set one or more config vars
|
45
|
+
#
|
46
|
+
#Example:
|
47
|
+
#
|
48
|
+
# $ heroku config:set A=one
|
49
|
+
# Setting config vars and restarting myapp... done, v123
|
50
|
+
# A: one
|
51
|
+
#
|
52
|
+
# $ heroku config:set A=one B=two
|
53
|
+
# Setting config vars and restarting myapp... done, v123
|
54
|
+
# A: one
|
55
|
+
# B: two
|
56
|
+
#
|
57
|
+
def set
|
58
|
+
unless args.size > 0 and args.all? { |a| a.include?('=') }
|
59
|
+
error("Usage: heroku config:set KEY1=VALUE1 [KEY2=VALUE2 ...]\nMust specify KEY and VALUE to set.")
|
60
|
+
end
|
61
|
+
|
62
|
+
vars = args.inject({}) do |vars, arg|
|
63
|
+
key, value = arg.split('=', 2)
|
64
|
+
vars[key] = value
|
65
|
+
vars
|
66
|
+
end
|
67
|
+
|
68
|
+
action("Setting config vars and restarting #{app}") do
|
69
|
+
api.put_config_vars(app, vars)
|
70
|
+
|
71
|
+
@status = begin
|
72
|
+
if release = api.get_release(app, 'current').body
|
73
|
+
release['name']
|
74
|
+
end
|
75
|
+
rescue Heroku::API::Errors::RequestFailed => e
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
vars.each {|key, value| vars[key] = value.to_s}
|
80
|
+
styled_hash(vars)
|
81
|
+
end
|
82
|
+
|
83
|
+
alias_command "config:add", "config:set"
|
84
|
+
|
85
|
+
# config:get KEY
|
86
|
+
#
|
87
|
+
# display a config value for an app
|
88
|
+
#
|
89
|
+
#Examples:
|
90
|
+
#
|
91
|
+
# $ heroku config:get A
|
92
|
+
# one
|
93
|
+
#
|
94
|
+
def get
|
95
|
+
unless key = shift_argument
|
96
|
+
error("Usage: heroku config:get KEY\nMust specify KEY.")
|
97
|
+
end
|
98
|
+
validate_arguments!
|
99
|
+
|
100
|
+
vars = api.get_config_vars(app).body
|
101
|
+
key, value = vars.detect {|k,v| k == key}
|
102
|
+
display(value.to_s)
|
103
|
+
end
|
104
|
+
|
105
|
+
# config:unset KEY1 [KEY2 ...]
|
106
|
+
#
|
107
|
+
# unset one or more config vars
|
108
|
+
#
|
109
|
+
# $ heroku config:unset A
|
110
|
+
# Unsetting A and restarting myapp... done, v123
|
111
|
+
#
|
112
|
+
# $ heroku config:unset A B
|
113
|
+
# Unsetting A and restarting myapp... done, v123
|
114
|
+
# Unsetting B and restarting myapp... done, v124
|
115
|
+
#
|
116
|
+
def unset
|
117
|
+
if args.empty?
|
118
|
+
error("Usage: heroku config:unset KEY1 [KEY2 ...]\nMust specify KEY to unset.")
|
119
|
+
end
|
120
|
+
|
121
|
+
args.each do |key|
|
122
|
+
action("Unsetting #{key} and restarting #{app}") do
|
123
|
+
api.delete_config_var(app, key)
|
124
|
+
|
125
|
+
@status = begin
|
126
|
+
if release = api.get_release(app, 'current').body
|
127
|
+
release['name']
|
128
|
+
end
|
129
|
+
rescue Heroku::API::Errors::RequestFailed => e
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
alias_command "config:remove", "config:unset"
|
136
|
+
|
137
|
+
end
|
@@ -0,0 +1,218 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
module Heroku::Command
|
4
|
+
|
5
|
+
# manage the database for an app
|
6
|
+
#
|
7
|
+
class Db < Base
|
8
|
+
|
9
|
+
# db:push [DATABASE_URL]
|
10
|
+
#
|
11
|
+
# push local data up to your app
|
12
|
+
#
|
13
|
+
# DATABASE_URL should reference your local database. if not specified, it
|
14
|
+
# will be guessed from config/database.yml
|
15
|
+
#
|
16
|
+
# -c, --chunksize SIZE # specify the number of rows to send in each batch
|
17
|
+
# -d, --debug # enable debugging output
|
18
|
+
# -e, --exclude TABLES # exclude the specified tables from the push
|
19
|
+
# -f, --filter REGEX # only push certain tables
|
20
|
+
# -r, --resume FILE # resume transfer described by a .dat file
|
21
|
+
# -t, --tables TABLES # only push the specified tables
|
22
|
+
#
|
23
|
+
def push
|
24
|
+
load_taps
|
25
|
+
opts = parse_taps_opts
|
26
|
+
|
27
|
+
display("Warning: Data in the app '#{app}' will be overwritten and will not be recoverable.")
|
28
|
+
|
29
|
+
if confirm_command
|
30
|
+
taps_client(:push, opts)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# db:pull [DATABASE_URL]
|
35
|
+
#
|
36
|
+
# pull heroku data down into your local database
|
37
|
+
#
|
38
|
+
# DATABASE_URL should reference your local database. if not specified, it
|
39
|
+
# will be guessed from config/database.yml
|
40
|
+
#
|
41
|
+
# -c, --chunksize SIZE # specify the number of rows to send in each batch
|
42
|
+
# -d, --debug # enable debugging output
|
43
|
+
# -e, --exclude TABLES # exclude the specified tables from the pull
|
44
|
+
# -f, --filter REGEX # only pull certain tables
|
45
|
+
# -r, --resume FILE # resume transfer described by a .dat file
|
46
|
+
# -t, --tables TABLES # only pull the specified tables
|
47
|
+
#
|
48
|
+
def pull
|
49
|
+
load_taps
|
50
|
+
opts = parse_taps_opts
|
51
|
+
|
52
|
+
display("Warning: Data in the database '#{opts[:database_url]}' will be overwritten and will not be recoverable.")
|
53
|
+
|
54
|
+
if confirm_command
|
55
|
+
taps_client(:pull, opts)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
protected
|
60
|
+
|
61
|
+
def parse_database_yml
|
62
|
+
return "" unless File.exists?(Dir.pwd + '/config/database.yml')
|
63
|
+
require 'erb'
|
64
|
+
require 'yaml'
|
65
|
+
|
66
|
+
environment = ENV['RAILS_ENV'] || ENV['MERB_ENV'] || ENV['RACK_ENV']
|
67
|
+
environment = 'development' if environment.nil? or environment.empty?
|
68
|
+
|
69
|
+
conf = YAML.load(ERB.new(File.read(Dir.pwd + '/config/database.yml')).result)[environment]
|
70
|
+
case conf['adapter']
|
71
|
+
when 'sqlite3'
|
72
|
+
return "sqlite://#{conf['database']}"
|
73
|
+
when 'postgresql'
|
74
|
+
uri_hash = conf_to_uri_hash(conf)
|
75
|
+
uri_hash['scheme'] = 'postgres'
|
76
|
+
return uri_hash_to_url(uri_hash)
|
77
|
+
else
|
78
|
+
return uri_hash_to_url(conf_to_uri_hash(conf))
|
79
|
+
end
|
80
|
+
rescue Exception => ex
|
81
|
+
puts "Error parsing database.yml: #{ex.message}"
|
82
|
+
puts ex.backtrace
|
83
|
+
""
|
84
|
+
end
|
85
|
+
|
86
|
+
def conf_to_uri_hash(conf)
|
87
|
+
uri = {}
|
88
|
+
uri['scheme'] = conf['adapter']
|
89
|
+
uri['username'] = conf['user'] || conf['username']
|
90
|
+
uri['password'] = conf['password']
|
91
|
+
uri['host'] = conf['host'] || conf['hostname'] || '127.0.0.1'
|
92
|
+
uri['port'] = conf['port']
|
93
|
+
uri['path'] = conf['database']
|
94
|
+
|
95
|
+
conf['encoding'] = 'utf8' if conf['encoding'] == 'unicode' or conf['encoding'].nil?
|
96
|
+
uri['query'] = "encoding=#{conf['encoding']}"
|
97
|
+
|
98
|
+
uri
|
99
|
+
end
|
100
|
+
|
101
|
+
def userinfo_from_uri(uri)
|
102
|
+
username = uri['username'].to_s
|
103
|
+
password = uri['password'].to_s
|
104
|
+
return nil if username == ''
|
105
|
+
|
106
|
+
userinfo = ""
|
107
|
+
userinfo << username
|
108
|
+
userinfo << ":" << password if password.length > 0
|
109
|
+
userinfo
|
110
|
+
end
|
111
|
+
|
112
|
+
def uri_hash_to_url(uri)
|
113
|
+
host = uri['host']
|
114
|
+
host ||= '127.0.0.1' unless uri['scheme'] == 'postgres'
|
115
|
+
uri_parts = {
|
116
|
+
:scheme => uri['scheme'],
|
117
|
+
:userinfo => userinfo_from_uri(uri),
|
118
|
+
:password => uri['password'],
|
119
|
+
:host => host,
|
120
|
+
:port => uri['port'],
|
121
|
+
:path => "/%s" % uri['path'],
|
122
|
+
:query => uri['query'],
|
123
|
+
}
|
124
|
+
|
125
|
+
URI::Generic.build(uri_parts).to_s
|
126
|
+
end
|
127
|
+
|
128
|
+
def parse_taps_opts
|
129
|
+
opts = {}
|
130
|
+
opts[:default_chunksize] = options[:chunksize] || 1000
|
131
|
+
opts[:default_chunksize] = opts[:default_chunksize].to_i rescue 1000
|
132
|
+
|
133
|
+
if filter = options[:filter]
|
134
|
+
opts[:table_filter] = filter
|
135
|
+
elsif tables = options[:tables]
|
136
|
+
r_tables = tables.split(",").collect { |t| "^#{t.strip}$" }
|
137
|
+
opts[:table_filter] = "(#{r_tables.join("|")})"
|
138
|
+
end
|
139
|
+
|
140
|
+
if options[:'disable-compression']
|
141
|
+
opts[:disable_compression] = true
|
142
|
+
end
|
143
|
+
|
144
|
+
if excluded_tables = options[:exclude]
|
145
|
+
opts[:exclude_tables] = excluded_tables
|
146
|
+
end
|
147
|
+
|
148
|
+
if resume_file = options[:resume]
|
149
|
+
opts[:resume_filename] = resume_file
|
150
|
+
end
|
151
|
+
|
152
|
+
opts[:indexes_first] = !options[:'indexes-last']
|
153
|
+
|
154
|
+
opts[:database_url] = args.detect { |a| URI.parse(a).scheme } rescue nil
|
155
|
+
|
156
|
+
unless opts[:database_url]
|
157
|
+
opts[:database_url] = parse_database_yml
|
158
|
+
display "Auto-detected local database: #{opts[:database_url]}" if opts[:database_url] != ''
|
159
|
+
end
|
160
|
+
raise(CommandFailed, "Invalid database url") if opts[:database_url] == ''
|
161
|
+
|
162
|
+
if options[:debug]
|
163
|
+
require 'logger'
|
164
|
+
Taps.log.level = Logger::DEBUG
|
165
|
+
end
|
166
|
+
|
167
|
+
# setting local timezone equal to Heroku timezone allowing TAPS to
|
168
|
+
# correctly transfer datetime fields between databases
|
169
|
+
ENV['TZ'] = 'America/Los_Angeles'
|
170
|
+
opts
|
171
|
+
end
|
172
|
+
|
173
|
+
def taps_client(op, opts)
|
174
|
+
Taps::Config.verify_database_url(opts[:database_url])
|
175
|
+
if opts[:resume_filename]
|
176
|
+
Taps::Cli.new([]).clientresumexfer(op, opts)
|
177
|
+
else
|
178
|
+
info = heroku.database_session(app)
|
179
|
+
|
180
|
+
replacement_host = case
|
181
|
+
when ENV["TAPS_HOST"] then ENV["TAPS_HOST"]
|
182
|
+
when RUBY_VERSION >= '1.9' then "taps19.heroku.com"
|
183
|
+
else nil
|
184
|
+
end
|
185
|
+
|
186
|
+
if replacement_host
|
187
|
+
info["url"].gsub!("taps3.heroku.com", replacement_host)
|
188
|
+
end
|
189
|
+
|
190
|
+
opts[:remote_url] = info['url']
|
191
|
+
opts[:session_uri] = info['session']
|
192
|
+
Taps::Cli.new([]).clientxfer(op, opts)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def enforce_taps_version(version)
|
197
|
+
unless Taps.version >= version
|
198
|
+
error "Your taps gem is out of date (v#{version} or higher required)."
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def load_taps
|
203
|
+
begin
|
204
|
+
require "rubygems"
|
205
|
+
rescue LoadError
|
206
|
+
end
|
207
|
+
require 'taps/operation'
|
208
|
+
require 'taps/cli'
|
209
|
+
enforce_taps_version "0.3.23"
|
210
|
+
display "Loaded Taps v#{Taps.version}"
|
211
|
+
rescue LoadError
|
212
|
+
message = "Taps Load Error: #{$!.message}\n"
|
213
|
+
message << "You may need to install or update the taps gem to use db commands.\n"
|
214
|
+
message << "On most systems this will be:\n\nsudo gem install taps"
|
215
|
+
error message
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
module Heroku::Command
|
4
|
+
|
5
|
+
# manage custom domains
|
6
|
+
#
|
7
|
+
class Domains < Base
|
8
|
+
|
9
|
+
# domains
|
10
|
+
#
|
11
|
+
# list custom domains for an app
|
12
|
+
#
|
13
|
+
#Examples:
|
14
|
+
#
|
15
|
+
# $ heroku domains
|
16
|
+
# === Domain names for myapp
|
17
|
+
# example.com
|
18
|
+
#
|
19
|
+
def index
|
20
|
+
validate_arguments!
|
21
|
+
domains = api.get_domains(app).body
|
22
|
+
if domains.length > 0
|
23
|
+
styled_header("#{app} Domain Names")
|
24
|
+
styled_array domains.map {|domain| domain["domain"]}
|
25
|
+
else
|
26
|
+
display("#{app} has no domain names.")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# domains:add DOMAIN
|
31
|
+
#
|
32
|
+
# add a custom domain to an app
|
33
|
+
#
|
34
|
+
#Examples:
|
35
|
+
#
|
36
|
+
# $ heroku domains:add example.com
|
37
|
+
# Adding example.com to myapp... done
|
38
|
+
#
|
39
|
+
def add
|
40
|
+
unless domain = shift_argument
|
41
|
+
error("Usage: heroku domains:add DOMAIN\nMust specify DOMAIN to add.")
|
42
|
+
end
|
43
|
+
validate_arguments!
|
44
|
+
action("Adding #{domain} to #{app}") do
|
45
|
+
api.post_domain(app, domain)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# domains:remove DOMAIN
|
50
|
+
#
|
51
|
+
# remove a custom domain from an app
|
52
|
+
#
|
53
|
+
#Examples:
|
54
|
+
#
|
55
|
+
# $ heroku domains:remove example.com
|
56
|
+
# Removing example.com from myapp... done
|
57
|
+
#
|
58
|
+
def remove
|
59
|
+
unless domain = shift_argument
|
60
|
+
error("Usage: heroku domains:remove DOMAIN\nMust specify DOMAIN to remove.")
|
61
|
+
end
|
62
|
+
validate_arguments!
|
63
|
+
action("Removing #{domain} from #{app}") do
|
64
|
+
api.delete_domain(app, domain)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# domains:clear
|
69
|
+
#
|
70
|
+
# remove all custom domains from an app
|
71
|
+
#
|
72
|
+
#Examples:
|
73
|
+
#
|
74
|
+
# $ heroku domains:clear
|
75
|
+
# Removing all domain names for myapp... done
|
76
|
+
#
|
77
|
+
def clear
|
78
|
+
validate_arguments!
|
79
|
+
action("Removing all domain names from #{app}") do
|
80
|
+
api.delete_domains(app)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
module Heroku::Command
|
4
|
+
|
5
|
+
# display syslog drains for an app
|
6
|
+
#
|
7
|
+
class Drains < Base
|
8
|
+
|
9
|
+
# drains
|
10
|
+
#
|
11
|
+
# list all syslog drains
|
12
|
+
#
|
13
|
+
def index
|
14
|
+
puts heroku.list_drains(app)
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
# drains:add URL
|
19
|
+
#
|
20
|
+
# add a syslog drain
|
21
|
+
#
|
22
|
+
def add
|
23
|
+
if url = args.shift
|
24
|
+
puts heroku.add_drain(app, url)
|
25
|
+
return
|
26
|
+
else
|
27
|
+
error("Usage: heroku drains:add URL")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# drains:remove URL
|
32
|
+
#
|
33
|
+
# remove a syslog drain
|
34
|
+
#
|
35
|
+
def remove
|
36
|
+
if url = args.shift
|
37
|
+
puts heroku.remove_drain(app, url)
|
38
|
+
return
|
39
|
+
else
|
40
|
+
error("Usage: heroku drains remove URL")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|