lunchy 0.6.0 → 0.7.0

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.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/History.md +6 -0
  3. data/README.md +2 -1
  4. data/bin/lunchy +17 -8
  5. data/lib/lunchy.rb +53 -46
  6. metadata +22 -40
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fe9904b30b68e92d860ede29932192a4f8131c15
4
+ data.tar.gz: 173bd3acfad8b595e078dfa7fd5163e71595bc68
5
+ SHA512:
6
+ metadata.gz: 65ce72ab1bbe94e21883ba1bf5ba2e5924a596c10d083aa103e0840cc6a0bbedac9a0815d8c481605d329abc7d22a671db687f23e0952346c17960b653e367d2
7
+ data.tar.gz: a3c84055cce932ddb7a1530182cd639bfb0754c57c3385871798ffd97ac3da93535b268b9903c5c4bfeeca555a2e501b8cfdf93e77bc2fff25a604fddb176480
data/History.md CHANGED
@@ -1,6 +1,12 @@
1
1
  Changes
2
2
  ================
3
3
 
4
+ 0.7.0
5
+ ----
6
+
7
+ - Add 'show' command to display contents of matching plist file (jonpierce)
8
+ - Add '-l' option on 'ls' command to display absolute paths to plist files (jonpierce)
9
+
4
10
  0.6.0
5
11
  ----
6
12
 
data/README.md CHANGED
@@ -13,6 +13,7 @@ Lunchy aims to be that friendly tool by wrapping launchctl and providing a few s
13
13
  - restart [pattern]
14
14
  - status [pattern]
15
15
  - install [file]
16
+ - show [pattern]
16
17
  - edit [pattern]
17
18
 
18
19
  where pattern is just a substring that matches the agent's plist filename. If you don't use a unique pattern, Lunchy will warn you of this and give you a list of the matching items instead.
@@ -50,7 +51,7 @@ Thanks
50
51
 
51
52
  Thanks to all the individual contributors who've improved Lunchy, see credits in History.md.
52
53
 
53
- Lunchy was written as part of my project time at [Carbon Five](http://carbonfive.com). [We're hiring](http://carbonfive.com/view/page.basic/jobs) if you love working on Ruby and open source.
54
+ Lunchy was written as part of my project time at [Carbon Five](http://carbonfive.com). [They're hiring](http://carbonfive.com/view/page.basic/jobs) if you love working on Ruby and open source.
54
55
 
55
56
 
56
57
  About
data/bin/lunchy CHANGED
@@ -4,11 +4,12 @@ $LOAD_PATH << File.dirname(__FILE__) + "/../lib" if $0 == __FILE__
4
4
  require 'optparse'
5
5
  require 'lunchy'
6
6
 
7
- CONFIG = { :verbose => false, :write => false }
8
- OPERATIONS = %w(start stop restart ls list status install edit)
7
+ CONFIG = {}
8
+ OPERATIONS = %w(start stop restart ls list status install show edit)
9
9
 
10
10
  option_parser = OptionParser.new do |opts|
11
- opts.banner = "Lunchy #{Lunchy::VERSION}, the friendly launchctl wrapper\nUsage: #{__FILE__} [#{OPERATIONS.join('|')}] [options]"
11
+ opts.banner = "Lunchy #{Lunchy::VERSION}, the friendly launchctl wrapper\n" \
12
+ "Usage: #{File.basename(__FILE__)} [#{OPERATIONS.join('|')}] [options]"
12
13
 
13
14
  opts.on("-F", "--force", "Force start (disabled) agents") do |verbose|
14
15
  CONFIG[:force] = true
@@ -22,27 +23,35 @@ option_parser = OptionParser.new do |opts|
22
23
  CONFIG[:write] = true
23
24
  end
24
25
 
26
+ opts.on("-l", "--long", "Display absolute paths when listing agents") do
27
+ CONFIG[:long] = true
28
+ end
29
+
25
30
  opts.separator <<-EOS
26
31
 
27
32
  Supported commands:
28
33
 
29
- ls [pattern] Show the list of installed agents, with optional [pattern] filter
30
- list [pattern] Alias for 'ls'
34
+ ls [-l] [pattern] Show the list of installed agents, with optional [pattern] filter
35
+ list [-l] [pattern] Alias for 'ls'
31
36
  start [-wF] [pattern] Start the first agent matching [pattern]
32
37
  stop [-w] [pattern] Stop the first agent matching [pattern]
33
38
  restart [pattern] Stop and start the first agent matching [pattern]
34
39
  status [pattern] Show the PID and label for all agents, with optional [pattern] filter
35
- install [file] Installs [file] to ~/Library/LaunchAgents or /Library/LaunchAgents (whichever it finds first)
36
- edit [pattern] Opens the launchctl daemon file in the default editor (EDITOR environment variable)
40
+ install [file] Install [file] to ~/Library/LaunchAgents or /Library/LaunchAgents (whichever it finds first)
41
+ show [pattern] Show the contents of the launchctl daemon file
42
+ edit [pattern] Open the launchctl daemon file in the default editor (EDITOR environment variable)
37
43
 
38
44
  -w will persist the start/stop command so the agent will load on startup or never load, respectively.
45
+ -l will display absolute paths of the launchctl daemon files when showing list of installed agents.
39
46
 
40
47
  Example:
41
48
  lunchy ls
49
+ lunchy ls -l nginx
42
50
  lunchy start -w redis
43
51
  lunchy stop mongo
44
52
  lunchy status mysql
45
53
  lunchy install /usr/local/Cellar/redis/2.2.2/io.redis.redis-server.plist
54
+ lunchy show redis
46
55
  lunchy edit mongo
47
56
 
48
57
  Note: if you run lunchy as root, you can manage daemons in /Library/LaunchDaemons also.
@@ -64,4 +73,4 @@ if OPERATIONS.include?(op)
64
73
  end
65
74
  else
66
75
  puts option_parser.help
67
- end
76
+ end
data/lib/lunchy.rb CHANGED
@@ -1,35 +1,23 @@
1
1
  require 'fileutils'
2
2
 
3
3
  class Lunchy
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.0'
5
5
 
6
6
  def start(params)
7
7
  raise ArgumentError, "start [-wF] [name]" if params.empty?
8
- name = params[0]
9
- files = plists.select {|k,v| k =~ /#{name}/i }
10
- files = Hash[files] if files.is_a?(Array) # ruby 1.8
11
- if files.size > 1
12
- return puts "Multiple daemons found matching '#{name}'. You need to be more specific. Matches found are:\n" + files.keys.join("\n")
13
- elsif files.size == 0
14
- return puts "No daemon found matching '#{name}'" if !name
15
- else
16
- execute("launchctl load #{CONFIG[:force] ? '-F ' : ''}#{CONFIG[:write] ? '-w ' : ''}#{files.values.first.inspect}")
17
- puts "started #{files.keys.first}"
8
+
9
+ with_match params[0] do |name, path|
10
+ execute("launchctl load #{force}#{write}#{path.inspect}")
11
+ puts "started #{name}"
18
12
  end
19
13
  end
20
14
 
21
15
  def stop(params)
22
16
  raise ArgumentError, "stop [-w] [name]" if params.empty?
23
- name = params[0]
24
- files = plists.select {|k,v| k =~ /#{name}/i }
25
- files = Hash[files] if files.is_a?(Array) # ruby 1.8
26
- if files.size > 1
27
- return puts "Multiple daemons found matching '#{name}'. You need to be more specific. Matches found are:\n" + files.keys.join("\n")
28
- elsif files.size == 0
29
- return puts "No daemon found matching '#{name}'" if !name
30
- else
31
- execute("launchctl unload #{CONFIG[:write] ? '-w ' : ''}#{files.values.first.inspect}")
32
- puts "stopped #{files.keys.first}"
17
+
18
+ with_match params[0] do |name, path|
19
+ execute("launchctl unload #{write}#{path.inspect}")
20
+ puts "stopped #{name}"
33
21
  end
34
22
  end
35
23
 
@@ -41,10 +29,12 @@ class Lunchy
41
29
  def status(params)
42
30
  pattern = params[0]
43
31
  cmd = "launchctl list"
44
- if !verbose?
32
+
33
+ unless verbose?
45
34
  agents = plists.keys.map { |k| "-e \"#{k}\"" }.join(" ")
46
35
  cmd << " | grep -i #{agents}"
47
36
  end
37
+
48
38
  cmd.gsub!('.','\.')
49
39
  cmd << " | grep -i \"#{pattern}\"" if pattern
50
40
  execute(cmd)
@@ -53,7 +43,11 @@ class Lunchy
53
43
  def ls(params)
54
44
  agents = plists.keys
55
45
  agents = agents.grep(/#{params[0]}/) if !params.empty?
56
- puts agents.sort.join("\n")
46
+ if long
47
+ puts agents.map { |agent| plists[agent] }.sort.join("\n")
48
+ else
49
+ puts agents.sort.join("\n")
50
+ end
57
51
  end
58
52
  alias_method :list, :ls
59
53
 
@@ -68,27 +62,54 @@ class Lunchy
68
62
  end
69
63
  end
70
64
 
65
+ def show(params)
66
+ raise ArgumentError, "show [name]" if params.empty?
67
+
68
+ with_match params[0] do |_, path|
69
+ puts IO.read(path)
70
+ end
71
+ end
72
+
71
73
  def edit(params)
72
74
  raise ArgumentError, "edit [name]" if params.empty?
73
- name = params[0]
74
- files = plists.select {|k,v| k =~ /#{name}/i }
75
- files = Hash[files] if files.is_a?(Array) # ruby 1.8
76
- if files.size > 1
77
- return puts "Multiple daemons found matching '#{name}'. You need to be more specific. Matches found are:\n" + files.keys.join("\n")
78
- elsif files.size == 0
79
- return puts "No daemon found matching '#{name}'" if !name
80
- else
75
+
76
+ with_match params[0] do |_, path|
81
77
  editor = ENV['EDITOR']
82
78
  if editor.nil?
83
79
  raise 'EDITOR environment variable is not set'
84
80
  else
85
- execute("#{editor} #{files.values.first.inspect} > `tty`")
81
+ execute("#{editor} #{path.inspect} > `tty`")
86
82
  end
87
83
  end
88
84
  end
89
85
 
90
86
  private
91
87
 
88
+ def force
89
+ CONFIG[:force] and '-F '
90
+ end
91
+
92
+ def write
93
+ CONFIG[:write] and '-w '
94
+ end
95
+
96
+ def long
97
+ CONFIG[:long]
98
+ end
99
+
100
+ def with_match name
101
+ files = plists.select {|k,_| k =~ /#{name}/i }
102
+ files = Hash[files] if files.is_a?(Array) # ruby 1.8
103
+
104
+ if files.size > 1
105
+ puts "Multiple daemons found matching '#{name}'. You need to be more specific. Matches found are:\n#{files.keys.join("\n")}"
106
+ elsif files.empty?
107
+ puts "No daemon found matching '#{name}'" unless name
108
+ else
109
+ yield(*files.to_a.first)
110
+ end
111
+ end
112
+
92
113
  def execute(cmd)
93
114
  puts "Executing: #{cmd}" if verbose?
94
115
  emitted = `#{cmd}`
@@ -117,20 +138,6 @@ class Lunchy
117
138
  Process.euid == 0
118
139
  end
119
140
 
120
- # def daemons
121
- # @daemons ||= begin
122
- # content = `launchctl list | grep -v -i "^-\\|anonymous"`
123
- # daemons = []
124
- # content.each_line do |x|
125
- # data = x.split(' ')
126
- # daemons << {
127
- # :pid => data[0].to_i,
128
- # :name => data[2]
129
- # }
130
- # end
131
- # end
132
- # end
133
-
134
141
  def verbose?
135
142
  CONFIG[:verbose]
136
143
  end
metadata CHANGED
@@ -1,68 +1,50 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: lunchy
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 6
8
- - 0
9
- version: 0.6.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Mike Perham
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2012-01-25 00:00:00 -08:00
18
- default_executable:
11
+ date: 2013-07-22 00:00:00.000000000 Z
19
12
  dependencies: []
20
-
21
13
  description: Friendly wrapper around launchctl
22
- email:
14
+ email:
23
15
  - mperham@gmail.com
24
- executables:
16
+ executables:
25
17
  - lunchy
26
18
  extensions: []
27
-
28
19
  extra_rdoc_files: []
29
-
30
- files:
20
+ files:
31
21
  - History.md
32
22
  - LICENSE
33
23
  - README.md
34
24
  - bin/lunchy
35
25
  - lib/lunchy.rb
36
26
  - lunchy.gemspec
37
- has_rdoc: true
38
27
  homepage: http://github.com/mperham/lunchy
39
28
  licenses: []
40
-
29
+ metadata: {}
41
30
  post_install_message:
42
31
  rdoc_options: []
43
-
44
- require_paths:
32
+ require_paths:
45
33
  - lib
46
- required_ruby_version: !ruby/object:Gem::Requirement
47
- requirements:
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- segments:
51
- - 0
52
- version: "0"
53
- required_rubygems_version: !ruby/object:Gem::Requirement
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 0
59
- version: "0"
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
60
44
  requirements: []
61
-
62
45
  rubyforge_project:
63
- rubygems_version: 1.3.6
46
+ rubygems_version: 2.0.2
64
47
  signing_key:
65
- specification_version: 3
48
+ specification_version: 4
66
49
  summary: Friendly wrapper around launchctl
67
50
  test_files: []
68
-