powder 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/CHANGELOG.md +13 -2
  2. data/Readme.md +36 -10
  3. data/bin/powder +156 -19
  4. data/lib/powder/version.rb +1 -1
  5. metadata +4 -20
data/CHANGELOG.md CHANGED
@@ -1,8 +1,19 @@
1
- ### ??? ###
1
+ ### 0.1.7 ###
2
2
 
3
3
  * 1 minor change
4
+
5
+ * adds proper support for alt names
6
+ ([commit](https://github.com/Rodreegez/powder/commit/4b850b1dbb446f7d0c3a643d4cc7be99eebd417b))
7
+ * adds not_restarts command
8
+ ([commit](https://github.com/Rodreegez/powder/commit/9371ccdf822a83db7f1fded365d01bd2c613aed3))
9
+ * adds always_restart command
10
+ ([commit](https://github.com/Rodreegez/powder/commit/45bd64180930353ef6c45626ccae150091374828))
11
+ * pow down properly unloads pow processes
12
+ ([commit](https://github.com/Rodreegez/powder/commit/a6373e73c746587eb1ae23aaa1a26fe331274e6d))
13
+ * adds host/unhost for dealing with no network
14
+ ([commit](https://github.com/Rodreegez/powder/commit/547c3d1e2fbc155fea3c162a373fed017a739107))
4
15
  * Don't break config/status when pow is down
5
- ([commit](https://github.com/Rodreegez/powder/commit/c3aa98943c51079e2e8a1dc0a983efe76e2964c7)))
16
+ ([commit](https://github.com/Rodreegez/powder/commit/c3aa98943c51079e2e8a1dc0a983efe76e2964c7))
6
17
 
7
18
  ### 0.1.5 / 2011-06-30 ###
8
19
 
data/Readme.md CHANGED
@@ -9,21 +9,40 @@ powder manages [pow](http://pow.cx/)
9
9
 
10
10
  ### Linking apps in Pow ###
11
11
 
12
- $ powder
13
- => Link the current dir_name to ~/.pow/dir-name
14
- # if the dir_name has underscores in, powder changes them to hyphens
12
+ powder will attempt to read .powder, which names a default symlink for the current project
15
13
 
16
- $ powder link bacon
14
+ $ powder [-h|help]
15
+ => Display usage information
16
+ # Lists name and brief descriptions of the tasks available
17
+
18
+ $ powder link
19
+ => Link the current dir to ~/.pow/<current_directory>
20
+
21
+ $ powder link [bacon]
22
+ => Link the current dir to ~/.pow/bacon
23
+ => Create .powder, contents bacon
24
+
25
+ $ powder link [bacon] --no-create
26
+ => Link the current dir to ~/.pow/bacon
27
+
28
+ $ powder link [bacon] --force
29
+ => Remove the current pow symlink, and .powder
17
30
  => Link the current dir to ~/.pow/bacon
18
- # If the current directory doesn't look like an app that can be powed
19
- # by pow it will offer to download a basic config.ru for Rails 2
31
+ => Create .powder, contents bacon
32
+
33
+ # For both forms of link, if the current directory doesn't
34
+ # look like an app that can be powed it will offer to download
35
+ # a basic config.ru for Rails 2
20
36
 
21
- $ powder remove
22
- => Unlink current_dir
37
+ $ powder unlink
38
+ => Unlink current_dir or the symlink defined in .powder
23
39
 
24
- $ powder remove bacon
40
+ $ powder unlink bacon
25
41
  => Unlink bacon
26
42
 
43
+ $ powder cleanup
44
+ => remove all invalid symbolic links
45
+
27
46
  ### Working with Pow ###
28
47
 
29
48
  $ powder applog
@@ -45,7 +64,7 @@ powder manages [pow](http://pow.cx/)
45
64
  => Opens the pow link in a browser
46
65
  # aliased as powder -o
47
66
 
48
- $ powder open bacon
67
+ $ powder open [bacon]
49
68
  => Opens http://bacon.dev in a browser
50
69
  # if you have set up alternative top level domains in .powconfig,
51
70
  # then the first listed domain will be opened.
@@ -54,6 +73,13 @@ powder manages [pow](http://pow.cx/)
54
73
  => Restart the current app
55
74
  # aliased as powder -r
56
75
 
76
+ $ powder always_restart
77
+ => Always restart the current app
78
+ # aliased as powder -a
79
+
80
+ $ powder no_restarts
81
+ => don't do any automatic restarting of the current app
82
+
57
83
  $ powder status
58
84
  => Get Pow's current status information
59
85
 
data/bin/powder CHANGED
@@ -9,15 +9,18 @@ require 'powder/version'
9
9
  module Powder
10
10
  class CLI < Thor
11
11
  include Thor::Actions
12
- default_task :link
12
+ default_task :help
13
13
 
14
14
  map '-r' => 'restart'
15
+ map '-a' => 'always_restart'
15
16
  map '-l' => 'list'
16
17
  map '-L' => 'link'
18
+ map '-d' => 'default'
17
19
  map '-o' => 'open'
18
20
  map '-v' => 'version'
19
21
  map 'update' => 'install'
20
22
 
23
+ POWDER_CONFIG = ".powder"
21
24
  POW_PATH = "#{ENV['HOME']}/.pow"
22
25
  POW_DAEMON_PLIST_PATH="#{ENV['HOME']}/Library/LaunchAgents/cx.pow.powd.plist"
23
26
  POW_FIREWALL_PLIST_PATH = "/Library/LaunchDaemons/cx.pow.firewall.plist"
@@ -25,39 +28,77 @@ module Powder
25
28
  desc "up", "Enable pow"
26
29
  def up
27
30
  if File.exists? POW_FIREWALL_PLIST_PATH
28
- %x{sudo launchctl load /Library/LaunchDaemons/cx.pow.firewall.plist}
31
+ %x{sudo launchctl load #{POW_FIREWALL_PLIST_PATH}}
29
32
  else
30
33
  say "Pow firewall configuration missing."
31
34
  end
35
+ if File.exists? POW_DAEMON_PLIST_PATH
36
+ %x{launchctl load #{POW_DAEMON_PLIST_PATH}}
37
+ else
38
+ say "Pow daemon configuration missing."
39
+ end
32
40
  end
33
41
 
34
42
  desc "down", "Disable pow"
35
43
  def down
36
44
  if File.exists? POW_FIREWALL_PLIST_PATH
37
45
  if not %x{sudo launchctl list | grep cx.pow.firewall}.empty?
38
- %x{sudo launchctl unload /Library/LaunchDaemons/cx.pow.firewall.plist}
46
+ %x{sudo launchctl unload #{POW_FIREWALL_PLIST_PATH}}
39
47
  end
40
48
  if ports = File.open(POW_FIREWALL_PLIST_PATH).read.match(/fwd .*?,([\d]+).*?dst-port ([\d]+)/)
41
49
  http_port, dst_port = ports[1..2]
42
50
  end
43
51
  end
44
-
52
+
53
+ if File.exists? POW_DAEMON_PLIST_PATH
54
+ %x{launchctl unload #{POW_DAEMON_PLIST_PATH}}
55
+ end
56
+
45
57
  http_port ||= 20559
46
58
  dst_port ||= 80
47
-
59
+
48
60
  if rule = %x{sudo ipfw show | grep ",#{http_port} .* dst-port #{dst_port} in"}.split.first
49
61
  %x{sudo ipfw delete #{rule} && sudo sysctl -w net.inet.ip.forwarding=0}
50
62
  end
51
63
  end
52
64
 
53
65
  desc "link", "Link a pow"
66
+ method_option :force, :type => :boolean, :default => false, :alias => '-f', :desc => "remove the old configuration, overwrite .powder"
67
+ method_option :"no-config", :type => :boolean, :default => false, :alias => '-n', :desc => "do not write a .powder file"
54
68
  def link(name=nil)
69
+ return unless is_powable?
70
+ if File.symlink?(POW_PATH)
71
+ current_path = %x{pwd}.chomp
72
+ if name
73
+ write_pow_config(name)
74
+ else
75
+ name = get_pow_name
76
+ end
77
+ symlink_path = "#{POW_PATH}/#{name}"
78
+ FileUtils.rm_f(symlink_path) if options[:force]
79
+ FileUtils.ln_s(current_path, symlink_path) unless File.exists?(symlink_path)
80
+ say "Your application is now available at http://#{name}.#{domain}/"
81
+ else
82
+ say "Pow is not installed."
83
+ end
84
+ end
85
+
86
+ desc "default", "Set this app as default"
87
+ def default(name=nil)
55
88
  return unless is_powable?
56
89
  current_path = %x{pwd}.chomp
57
- name ||= current_dir_pow_name
58
- symlink_path = "#{POW_PATH}/#{name}"
59
- FileUtils.ln_s(current_path, symlink_path) unless File.exists?(symlink_path)
60
- say "Your application is now available at http://#{name}.#{domain}/"
90
+ name ||= get_pow_name
91
+ symlink_path = "#{POW_PATH}/default"
92
+ FileUtils.rm_f symlink_path if File.exists?(symlink_path)
93
+ FileUtils.ln_sf(current_path, symlink_path)
94
+ say "Your application(#{name}) is now default at http://localhost/"
95
+ end
96
+
97
+ desc "un_default", "remove current default app"
98
+ def un_default(name=nil)
99
+ name ||= get_pow_name
100
+ symlink_path = "#{POW_PATH}/default"
101
+ FileUtils.rm_f symlink_path if File.exists?(symlink_path)
61
102
  end
62
103
 
63
104
  desc "restart", "Restart current pow"
@@ -67,20 +108,54 @@ module Powder
67
108
  %x{touch tmp/restart.txt}
68
109
  end
69
110
 
111
+ desc "always_restart", "Always restart current pow"
112
+ def always_restart
113
+ return unless is_powable?
114
+ FileUtils.mkdir_p('tmp')
115
+ %x{touch tmp/always_restart.txt}
116
+ end
117
+
118
+ desc "no_restarts", "Reset this app's restart settings"
119
+ def no_restarts
120
+ return unless is_powable?
121
+ FileUtils.rm_f Dir.glob('tmp/*restart.txt')
122
+ end
123
+
70
124
  desc "list", "List current pows"
71
125
  def list
72
- Dir[POW_PATH + "/*"].map { |a| say File.basename(a) }
126
+ pows = Dir[POW_PATH + "/*"].map do |link|
127
+ realpath = File.readlink(link)
128
+ app_is_current = (realpath == Dir.pwd) ? '*' : ' '
129
+ [app_is_current, File.basename(link), realpath.gsub(ENV['HOME'], '~')]
130
+ end
131
+ print_table(pows)
73
132
  end
74
133
 
75
134
  desc "open", "Open a pow in the browser"
76
135
  def open(name=nil)
77
- %x{open http://#{name || current_dir_pow_name}.#{domain}}
136
+ %x{open http://#{name || get_pow_name}.#{domain}}
78
137
  end
79
138
 
80
- desc "remove", "Remove a pow"
81
- def remove(name=nil)
139
+ desc "unlink", "Unlink a pow app"
140
+ method_option :delete, :type => :boolean, :default => false, :alias => '-e', :desc => "delete .powder"
141
+ def unlink(name=nil)
82
142
  return unless is_powable?
83
- FileUtils.rm_f POW_PATH + '/' + (name || current_dir_pow_name)
143
+ FileUtils.rm_f POW_PATH + '/' + (name || get_pow_name)
144
+ say "Successfully removed #{(name || get_pow_name)}"
145
+ if options[:delete]
146
+ FileUtils.rm_f POWDER_CONFIG
147
+ say "Successfully removed #{POWDER_CONFIG}"
148
+ end
149
+ end
150
+
151
+ desc "remove", "An alias to Unlink (depreciated)"
152
+ alias :remove :unlink
153
+
154
+ desc "cleanup", "Clean up invalid symbolic link"
155
+ def cleanup
156
+ Dir[POW_PATH + "/*"].map { |symlink|
157
+ FileUtils.rm(symlink) unless File.exists? File.readlink(symlink)
158
+ }
84
159
  end
85
160
 
86
161
  desc "install", "Installs pow"
@@ -112,7 +187,36 @@ module Powder
112
187
  def version
113
188
  say "powder #{Powder::VERSION}"
114
189
  end
115
-
190
+
191
+ desc "host", "Updates hosts file to map pow domains to 127.0.0.1"
192
+ def host
193
+ hosts_file_path = "/etc/hosts"
194
+ pow_domain_records = Dir[POW_PATH + "/*"].map { |a| "127.0.0.1\t#{File.basename(a)}.#{domain}\t#powder" }
195
+ hosts_file = File.read("/etc/hosts").split("\n").delete_if {|row| row =~ /.+(#powder)/}
196
+ first_loopback_index = hosts_file.index {|i| i =~ /^(127.0.0.1).+/}
197
+ hosts_file = hosts_file.insert(first_loopback_index + 1, pow_domain_records)
198
+ File.open("#{ENV['HOME']}/hosts-powder", "w") do
199
+ |file| file.puts hosts_file.join("\n")
200
+ end
201
+ %x{cp #{hosts_file_path} #{ENV['HOME']}/hosts-powder.bak}
202
+ %x{sudo mv #{ENV['HOME']}/hosts-powder #{hosts_file_path}}
203
+ %x{dscacheutil -flushcache}
204
+ say "Domains added to hosts file, old host file is saved at #{ENV['HOME']}/hosts-powder.bak"
205
+ end
206
+
207
+ desc "unhost", "Removes pow domains from hostfile"
208
+ def unhost
209
+ hosts_file_path = "/etc/hosts"
210
+ hosts_file = File.read("/etc/hosts").split("\n").delete_if {|row| row =~ /.+(#powder)/}
211
+ File.open("#{ENV['HOME']}/hosts-powder", "w") do
212
+ |file| file.puts hosts_file.join("\n")
213
+ end
214
+ %x{cp #{hosts_file_path} #{ENV['HOME']}/hosts-powder.bak}
215
+ %x{sudo mv #{ENV['HOME']}/hosts-powder #{hosts_file_path}}
216
+ %x{dscacheutil -flushcache}
217
+ say "Domains removed from hosts file, old host file is saved at #{ENV['HOME']}/hosts-powder.bak"
218
+ end
219
+
116
220
  desc "config", "Shows current pow configuration"
117
221
  def config
118
222
  results = %x{curl --silent -H host:pow localhost/config.json}.gsub(':','=>')
@@ -137,15 +241,48 @@ module Powder
137
241
  end
138
242
 
139
243
  private
140
-
244
+
141
245
  def current_dir_name
142
246
  File.basename(%x{pwd}.chomp)
143
247
  end
144
248
 
249
+ def configured_pow_name
250
+ return nil unless File.exists?(POWDER_CONFIG)
251
+
252
+ File.foreach(POWDER_CONFIG) do |line|
253
+ next if line =~ /^($|#)/
254
+ return line.chomp
255
+ end
256
+
257
+ return nil
258
+ end
259
+
145
260
  def current_dir_pow_name
146
261
  current_dir_name.tr('_', '-')
147
262
  end
148
263
 
264
+ def get_pow_name
265
+ configured_pow_name || current_dir_pow_name
266
+ end
267
+
268
+ def write_pow_config(name=nil)
269
+ return if ! name || options[:"no-config"]
270
+ powder_exists = File.exists?(POWDER_CONFIG)
271
+ configured_name = get_pow_name
272
+
273
+ unlink if powder_exists && configured_name != name
274
+
275
+ if options[:force] || ! powder_exists
276
+ File.open(POWDER_CONFIG, "w") do |f|
277
+ f.puts(name)
278
+ end
279
+ say "Created powder config #{POWDER_CONFIG}"
280
+ elsif !options[:force] && powder_exists && configured_name != name
281
+ say "Cowardly refusing to overwrite #{POWDER_CONFIG}"
282
+ exit 1
283
+ end
284
+ end
285
+
149
286
  def is_powable?
150
287
  if File.exists?('config.ru') || File.exists?('public/index.html')
151
288
  true
@@ -171,12 +308,12 @@ module Powder
171
308
  end
172
309
 
173
310
  def is_rails2_app?
174
- File.exists?('config/environment.rb') &&
311
+ File.exists?('config/environment.rb') &&
175
312
  !`grep RAILS_GEM_VERSION config/environment.rb`.empty? ? 'Rails 2' : nil
176
313
  end
177
-
314
+
178
315
  def is_radiant_app?
179
- File.exists?('config/environment.rb') &&
316
+ File.exists?('config/environment.rb') &&
180
317
  !`grep Radiant::Initializer config/environment.rb`.empty? ? 'Radiant' : nil
181
318
  end
182
319
 
@@ -1,3 +1,3 @@
1
1
  module Powder
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: powder
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 6
10
- version: 0.1.6
4
+ prerelease:
5
+ version: 0.1.7
11
6
  platform: ruby
12
7
  authors:
13
8
  - Phil Nash
@@ -16,7 +11,7 @@ autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
13
 
19
- date: 2011-07-18 00:00:00 +01:00
14
+ date: 2011-11-02 00:00:00 +00:00
20
15
  default_executable:
21
16
  dependencies:
22
17
  - !ruby/object:Gem::Dependency
@@ -27,11 +22,6 @@ dependencies:
27
22
  requirements:
28
23
  - - ">="
29
24
  - !ruby/object:Gem::Version
30
- hash: 57
31
- segments:
32
- - 0
33
- - 11
34
- - 5
35
25
  version: 0.11.5
36
26
  type: :runtime
37
27
  version_requirements: *id001
@@ -69,23 +59,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
69
59
  requirements:
70
60
  - - ">="
71
61
  - !ruby/object:Gem::Version
72
- hash: 3
73
- segments:
74
- - 0
75
62
  version: "0"
76
63
  required_rubygems_version: !ruby/object:Gem::Requirement
77
64
  none: false
78
65
  requirements:
79
66
  - - ">="
80
67
  - !ruby/object:Gem::Version
81
- hash: 3
82
- segments:
83
- - 0
84
68
  version: "0"
85
69
  requirements: []
86
70
 
87
71
  rubyforge_project: powder
88
- rubygems_version: 1.3.7
72
+ rubygems_version: 1.5.2
89
73
  signing_key:
90
74
  specification_version: 3
91
75
  summary: Makes Pow even easier