masquito 1.1.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 10d01491a5d517a67884d816e177870592f4b9a1
4
- data.tar.gz: e9aa4089332f7948e84ee93d358e7c6dc856cff4
3
+ metadata.gz: 3bd255a71a9aef95f8d300b2e9ba3aa1930ba541
4
+ data.tar.gz: ecbec6a6cb3a3c04b20a9bf9de381067e09ca33c
5
5
  SHA512:
6
- metadata.gz: 106f4fd5b3f2741265bceb1021c8c4813d6235f956df46ce441592a513c2ca384becd690725d9d494a03b5ec45d913ef3dd7dd45aaa177f2fcf83a6113fe453a
7
- data.tar.gz: ba2ff985b9504500ea9073be2311b0dfe5169059e3663115f8f0c4ee2bac6b22f460baf95281e785a422fe5f49adb79b2053252d5a41bb3cb5910d1ff2b24b1c
6
+ metadata.gz: 6374cff380b5836a521175d216d48fa69eb1dfa640086b341278097e853c4b0afbbddd829cb6fd6b7d169400f396fdd84756db2deec6b83dbd2abb24f65a8eea
7
+ data.tar.gz: 8c2bc34be59a1b6b1df55dd4a250d8c88b8f090f912a78c567713bba7b67f9a0864c73132491f7e4c028db381a65ca81c7e311421f5eb75095259c830a032fef
data/README.md CHANGED
@@ -1,51 +1,53 @@
1
1
  # Masquito
2
2
 
3
3
  This gem is for DNS masquerading for rubists. Everyone knows `Pow`, but what
4
- I really don't like that it uses `node.js` to run ruby applications. Sometimes
4
+ I really don't like that it uses `node.js` to run Ruby applications. Sometimes
5
5
  we have to run our apps on the certain domain. Masquito allows you to do it,
6
6
  you can create dns records in the similar Pow's way by creating symbolic links
7
- to your apps or just files in `.masquito` directory.
8
-
7
+ to your apps or just empty files in `.masquito` directory.
9
8
  ## Notice:
10
9
 
11
- Masquito doesn't run rack applications. It just masquerads dns records to your
12
- local IP. Check our another gem
13
- [https://github.com/route/pump](https://github.com/route/pump) out for full
14
- replacement of Pow.
10
+ Symbolic links were used by Pow in order to refer your application that will be
11
+ run automatically, since Masquito doesn't run applications and does just DNS
12
+ masquerading it's simplier to create just empty files. Check out another gem
13
+ [https://github.com/route/pump](https://github.com/route/pump) for full Pow's
14
+ replacement.
15
15
 
16
16
  ## Installation
17
17
 
18
18
  First of all, uninstall Pow if you have it installed.
19
- I suppose you're on rbenv(we will add rvm support as soon as we can).
19
+ I suppose you're on rbenv (honestly I haven't checked rvm support).
20
20
 
21
21
  Install gem:
22
22
 
23
23
  $ gem install masquito
24
+ $ rbenv rehash
24
25
 
25
- Run these commands:
26
+ Run this:
26
27
 
27
- $ masquito daemon install
28
- $ sudo masquito resolver install
28
+ $ sudo masquito install
29
29
 
30
- The first one installs masquito dns server as a daemon in your system which will
31
- be started at each boot. This daemon will respond on dns queries from your
32
- system. The second one registers dns resolver (`man 5 resolver` for more info)
33
- for `.dev` domain. You have to run it with sudo because we must write config to
34
- `/etc/resolver` path.
30
+ This command installs masquito server as a daemon that your system will start
31
+ every boot. This daemon will respond on DNS queries from your system and monitor
32
+ `~/.masquito` directory for newly created domains.
35
33
 
36
34
  ## Usage
37
35
 
38
36
  Once you have installed masquito you can add domains to ~/.masquito
39
37
 
40
38
  $ cd ~/.masquito
41
- $ touch example
39
+ $ touch yoursite.com
40
+
41
+ It will create for you `yoursite.com` domain with the wild card for all
42
+ subdomains and you can already ping and use it for the development.
42
43
 
43
- It will create for you example.dev domain and you can already ping and use it.
44
+ $ ping yoursite.com
45
+ PING yoursite.com (127.0.0.1): 56 data bytes
46
+ 64 bytes from 127.0.0.1: icmp_seq=0 ttl=53 time=1 ms
44
47
 
45
- ## Contributing
48
+ $ ping host.sub.yoursite.com
49
+ PING host.sub.yoursite.com (127.0.0.1): 56 data bytes
50
+ 64 bytes from 127.0.0.1: icmp_seq=0 ttl=53 time=1 ms
46
51
 
47
- 1. Fork it
48
- 2. Create your feature branch (`git checkout -b my-new-feature`)
49
- 3. Commit your changes (`git commit -am 'Added some feature'`)
50
- 4. Push to the branch (`git push origin my-new-feature`)
51
- 5. Create new Pull Request
52
+ Run your favorite application server manually, open up your browser and fill in
53
+ address with port, that's all.
@@ -1,25 +1,26 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $:.unshift(lib) unless $:.include?(lib)
5
+
4
6
  require 'masquito'
5
7
 
6
8
  abort 'Works only on Mac OS X' if RUBY_PLATFORM !~ /darwin/
7
9
 
8
10
  command = ARGV[0]
9
- subcommand = ARGV[1]
10
11
  filename = File.basename(__FILE__)
12
+ options = %w(install remove version)
11
13
 
12
14
  case command
13
15
  when 'start'
14
- Masquito::DNS.new
15
- when /daemon|resolver/
16
- options = %w(install uninstall)
17
- unless options.include?(subcommand)
18
- abort "Usage: #{filename} #{command} #{options.join(' | ')}"
19
- end
20
- Masquito::Install.send("#{command}_#{subcommand}")
16
+ daemon = Masquito::Daemon.new
17
+ daemon.start
18
+ when /install|remove/
19
+ abort "Run: sudo #{filename} #{command}" unless Process.euid == 0
20
+ installer = Masquito::Installer.new
21
+ installer.send(command)
21
22
  when 'version'
22
23
  puts Masquito::VERSION
23
24
  else
24
- puts "Usage: #{filename} #{%w(daemon resolver version).join(' | ')}"
25
+ puts "Usage: #{filename} #{options.join(' | ')}"
25
26
  end
@@ -6,11 +6,15 @@
6
6
  <string>com.evrone.masquito</string>
7
7
  <key>ProgramArguments</key>
8
8
  <array>
9
- <string>sh</string>
10
- <string>-i</string>
11
- <string>-c</string>
12
- <string>$SHELL --login -c "<%= masquito_bin %> start"</string>
9
+ <string><%= RbConfig.ruby %></string>
10
+ <string><%= ::Masquito::BIN %></string>
11
+ <string>start</string>
13
12
  </array>
13
+ <key>EnvironmentVariables</key>
14
+ <dict>
15
+ <key>CONFIG_PATH</key>
16
+ <string><%= ::Masquito::CONFIG_PATH %></string>
17
+ </dict>
14
18
  <key>KeepAlive</key>
15
19
  <true/>
16
20
  <key>RunAtLoad</key>
@@ -1,2 +1,3 @@
1
+ # Masquito magic comment
1
2
  nameserver 127.0.0.1
2
- port <%= Masquito::DNS::PORT %>
3
+ port <%= Masquito::Daemon::PORT %>
@@ -1,8 +1,19 @@
1
+ require 'erb'
2
+ require 'fileutils'
3
+ require 'tempfile'
4
+ require 'pathname'
5
+
1
6
  module Masquito
2
- CONFIG_PATH = File.join(ENV['HOME'], '.masquito')
7
+ # When user installs Masquito we use his home path, but when it's launched as
8
+ # daemon with superuser rights there's no home directory at all. That's why
9
+ # we set environment variable and rely on it.
10
+ CONFIG_PATH = ENV['CONFIG_PATH'] || File.join(ENV['HOME'], '.masquito')
11
+ GEM_PATH = File.expand_path('../../', __FILE__)
12
+ BIN = File.join(GEM_PATH, 'bin', 'masquito')
3
13
 
4
- autoload :DNS, 'masquito/dns'
5
- autoload :Settings, 'masquito/settings'
6
- autoload :Install, 'masquito/install'
7
- autoload :VERSION, 'masquito/version'
14
+ autoload :Daemon, 'masquito/daemon'
15
+ autoload :Settings, 'masquito/settings'
16
+ autoload :Resolver, 'masquito/resolver'
17
+ autoload :Installer, 'masquito/installer'
18
+ autoload :VERSION, 'masquito/version'
8
19
  end
@@ -2,7 +2,7 @@ require 'socket'
2
2
  require 'resolv'
3
3
 
4
4
  module Masquito
5
- class DNS
5
+ class Daemon
6
6
  ADDRESS = '127.0.0.1'
7
7
  PORT = 53532
8
8
 
@@ -12,27 +12,49 @@ module Masquito
12
12
  }
13
13
  @@ttl = 10800 # 3 hours
14
14
 
15
- def initialize(addr = ADDRESS, port = PORT, settings = Settings.new)
16
- puts "Starting Masquito on #{addr}:#{port}"
17
- @settings = settings
15
+ def initialize(config_path = CONFIG_PATH, addr = ADDRESS, port = PORT)
16
+ @addr, @port = addr, port
17
+ @settings = Settings.new(config_path)
18
+ @resolver = Resolver.new(config_path)
19
+ at_exit { stop }
20
+ end
21
+
22
+ def start
23
+ start_resolver
24
+ start_dns_server
25
+ end
26
+
27
+ def start_resolver
28
+ @resolver_thread = Thread.new { @resolver.start }
29
+ end
30
+
31
+ def start_dns_server
32
+ puts "Starting Masquito on #{@addr}:#{@port}"
18
33
 
19
34
  # Bind port to receive requests
20
- socket = UDPSocket.new
21
- socket.bind(addr, port)
35
+ @socket = UDPSocket.new
36
+ @socket.bind(@addr, @port)
22
37
 
23
38
  loop do
24
39
  # Receive and parse query
25
- data, sender_addrinfo = socket.recvfrom(512)
40
+ data, sender_addrinfo = @socket.recvfrom(512)
26
41
 
27
42
  Thread.new(data, sender_addrinfo) do |data, sender_addrinfo|
28
43
  sender_port, sender_ip = sender_addrinfo[1], sender_addrinfo[2]
29
44
  query = Resolv::DNS::Message.decode(data)
30
45
  answer = setup_answer(query)
31
- socket.send(answer.encode, 0, sender_ip, sender_port) # Send the response
46
+ @socket.send(answer.encode, 0, sender_ip, sender_port) # Send the response
32
47
  end
33
48
  end
34
49
  end
35
50
 
51
+ def stop
52
+ @resolver_thread && (@resolver_thread.join(0.5) || @resolver_thread.kill)
53
+ @resolver.remove_configs
54
+ end
55
+
56
+ private
57
+
36
58
  # Setup answer
37
59
  def setup_answer(query)
38
60
  # Standard fields
@@ -0,0 +1,73 @@
1
+ require 'lunchy'
2
+
3
+ # Lunchy doesn't have uninstall method and also installs all plists to
4
+ # LaunchAgents. We can send a PR on spare time.
5
+ class Lunchy
6
+ CONFIG = { :verbose => false, :write => nil }
7
+
8
+ def install(params)
9
+ raise ArgumentError, "install [file]" if params.empty?
10
+ filename = params[0]
11
+ %w(/Library/LaunchDaemons).each do |dir|
12
+ if File.exist?(File.expand_path(dir))
13
+ FileUtils.cp filename, File.join(File.expand_path(dir), File.basename(filename))
14
+ return puts "#{filename} installed to #{dir}"
15
+ end
16
+ end
17
+ end
18
+
19
+ def uninstall(params)
20
+ raise ArgumentError, "uninstall [file]" if params.empty?
21
+ filename = params[0]
22
+ %w(/Library/LaunchDaemons).each do |dir|
23
+ if File.exist?(File.expand_path(dir))
24
+ FileUtils.rm_rf(File.join(File.expand_path(dir), File.basename(filename)))
25
+ return puts "#{filename} removed from #{dir}"
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module Masquito
32
+ class Installer
33
+ SERVICE_NAME = 'com.evrone.masquito'
34
+ SERVICE_PLIST = "#{SERVICE_NAME}.plist"
35
+ SERVICE_TEMPLATE_PATH = File.join(GEM_PATH, 'config', "#{SERVICE_PLIST}.erb")
36
+
37
+ def initialize
38
+ @lunchy = Lunchy.new
39
+ end
40
+
41
+ def install
42
+ switch_privileges {
43
+ FileUtils.mkdir_p(CONFIG_PATH)
44
+ }
45
+
46
+ plist = ERB.new File.read(SERVICE_TEMPLATE_PATH)
47
+ template = plist.result(binding)
48
+
49
+ filename = File.join(Dir.tmpdir, SERVICE_PLIST)
50
+ File.open(filename, 'w') { |f| f.write(template) }
51
+ @lunchy.install([filename])
52
+ @lunchy.start([SERVICE_NAME])
53
+ File.unlink(filename)
54
+
55
+ puts "Daemon was successfully installed."
56
+ end
57
+
58
+ def remove
59
+ @lunchy.stop([SERVICE_NAME])
60
+ @lunchy.uninstall([SERVICE_PLIST])
61
+ puts "You can remove #{CONFIG_PATH} if you don't need these settings"
62
+ end
63
+
64
+ private
65
+
66
+ def switch_privileges(&block)
67
+ uid, Process.uid = Process.uid, ENV['SUDO_UID'].to_i
68
+ Process::UID.switch(&block)
69
+ ensure
70
+ Process.uid = uid
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,42 @@
1
+ require 'rb-fsevent'
2
+
3
+ module Masquito
4
+ class Resolver
5
+ RESOLVER_TEMPLATE_PATH = File.join(GEM_PATH, 'config', 'masquito.erb')
6
+ RESOLVERS_PATH = Pathname.new('/etc/resolver')
7
+
8
+ def initialize(config_path)
9
+ @config_path = config_path
10
+ end
11
+
12
+ def start
13
+ reset
14
+ fsevent = FSEvent.new
15
+ fsevent.watch(@config_path) { reset }
16
+ fsevent.run
17
+ end
18
+
19
+ def reset
20
+ remove_configs
21
+ copy_configs
22
+ end
23
+
24
+ def copy_configs
25
+ resolver = ERB.new File.read(RESOLVER_TEMPLATE_PATH)
26
+ template = resolver.result(binding)
27
+ Masquito::Settings.new(CONFIG_PATH).domains.each do |domain|
28
+ File.open(RESOLVERS_PATH.join(domain.to_s), 'w') { |f| f.write(template) }
29
+ end
30
+ end
31
+
32
+ def remove_configs
33
+ Dir.foreach(RESOLVERS_PATH) do |name|
34
+ next if name == '.' or name == '..'
35
+ path = RESOLVERS_PATH.join(name)
36
+ if File.new(path).readline == %Q(# Masquito magic comment\n)
37
+ FileUtils.rm_rf(path)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -3,7 +3,7 @@ require 'pathname'
3
3
 
4
4
  module Masquito
5
5
  class Settings
6
- def initialize(config_path = CONFIG_PATH)
6
+ def initialize(config_path)
7
7
  @pattern = File.join(config_path, '*')
8
8
  end
9
9
 
@@ -1,3 +1,3 @@
1
1
  module Masquito
2
- VERSION = '1.1.1'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -1,5 +1,6 @@
1
1
  lib = File.expand_path('../lib', __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
2
+ $:.unshift(lib) unless $:.include?(lib)
3
+
3
4
  require 'masquito/version'
4
5
 
5
6
  Gem::Specification.new do |gem|
@@ -7,8 +8,8 @@ Gem::Specification.new do |gem|
7
8
  gem.version = Masquito::VERSION
8
9
  gem.authors = ['Dmitry Vorotilin', 'Kir Shatrov']
9
10
  gem.email = ['d.vorotilin@gmail.com', 'kirs@evrone.ru']
10
- gem.description = 'Masquito is a dns masquerading server for rubists'
11
- gem.summary = 'It masquerades your dns records'
11
+ gem.description = 'Masquito is a DNS masquerading server for rubists and their applications'
12
+ gem.summary = 'Masquerades DNS records'
12
13
  gem.homepage = 'https://github.com/evrone/masquito'
13
14
 
14
15
  gem.files = `git ls-files`.split($\)
@@ -17,6 +18,7 @@ Gem::Specification.new do |gem|
17
18
  gem.require_paths = ['lib']
18
19
 
19
20
  gem.add_runtime_dependency 'lunchy'
21
+ gem.add_runtime_dependency 'rb-fsevent'
20
22
 
21
23
  gem.add_development_dependency 'rake'
22
24
  end
@@ -4,20 +4,20 @@ require 'test_helper'
4
4
 
5
5
  require 'masquito'
6
6
 
7
- class TestMasquitoDNS < Test::Unit::TestCase
7
+ class TestMasquitoDaemon < Test::Unit::TestCase
8
8
  TEMP_DIR = File.join(Dir.pwd, 'test/tmp')
9
9
 
10
10
  def setup
11
11
  FileUtils.mkdir_p(TEMP_DIR)
12
12
 
13
13
  file = File.new(File.join(TEMP_DIR, 'file'), 'w')
14
- ['link', 'symlink.dev', 'symlink.domain'].each do |name|
14
+ ['symlink.dev', 'symlink.domain'].each do |name|
15
15
  symlink = File.join(TEMP_DIR, name)
16
16
  FileUtils.ln_s(file.path, symlink)
17
17
  end
18
18
 
19
19
  @thread = Thread.new do
20
- Masquito::DNS.new('127.0.0.1', '51234', Masquito::Settings.new(TEMP_DIR))
20
+ Masquito::Daemon.new(TEMP_DIR, '127.0.0.1', '51234').start_dns_server
21
21
  end
22
22
  end
23
23
 
@@ -34,8 +34,6 @@ class TestMasquitoDNS < Test::Unit::TestCase
34
34
 
35
35
  response = Resolv::IPv4.create('127.0.0.1')
36
36
  Resolv::DNS.open(:nameserver => ['127.0.0.1']) do |dns|
37
- assert_equal response, dns.getaddress('link.dev.')
38
- assert_equal response, dns.getaddress('sym.sym.link.dev.')
39
37
  assert_equal response, dns.getaddress('symlink.dev.')
40
38
  assert_equal response, dns.getaddress('www.symlink.dev.')
41
39
  assert_equal response, dns.getaddress('symlink.domain.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: masquito
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Vorotilin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-25 00:00:00.000000000 Z
12
+ date: 2013-11-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: lunchy
@@ -25,6 +25,20 @@ dependencies:
25
25
  - - '>='
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rb-fsevent
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: rake
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +53,7 @@ dependencies:
39
53
  - - '>='
40
54
  - !ruby/object:Gem::Version
41
55
  version: '0'
42
- description: Masquito is a dns masquerading server for rubists
56
+ description: Masquito is a DNS masquerading server for rubists and their applications
43
57
  email:
44
58
  - d.vorotilin@gmail.com
45
59
  - kirs@evrone.ru
@@ -57,12 +71,13 @@ files:
57
71
  - config/com.evrone.masquito.plist.erb
58
72
  - config/masquito.erb
59
73
  - lib/masquito.rb
60
- - lib/masquito/dns.rb
61
- - lib/masquito/install.rb
74
+ - lib/masquito/daemon.rb
75
+ - lib/masquito/installer.rb
76
+ - lib/masquito/resolver.rb
62
77
  - lib/masquito/settings.rb
63
78
  - lib/masquito/version.rb
64
79
  - masquito.gemspec
65
- - test/dns_test.rb
80
+ - test/daemon_test.rb
66
81
  - test/settings_test.rb
67
82
  - test/test_helper.rb
68
83
  homepage: https://github.com/evrone/masquito
@@ -87,9 +102,9 @@ rubyforge_project:
87
102
  rubygems_version: 2.0.3
88
103
  signing_key:
89
104
  specification_version: 4
90
- summary: It masquerades your dns records
105
+ summary: Masquerades DNS records
91
106
  test_files:
92
- - test/dns_test.rb
107
+ - test/daemon_test.rb
93
108
  - test/settings_test.rb
94
109
  - test/test_helper.rb
95
110
  has_rdoc:
@@ -1,97 +0,0 @@
1
- require 'erb'
2
- require 'fileutils'
3
- require 'lunchy'
4
- require 'tempfile'
5
- require 'pathname'
6
-
7
- module Masquito
8
- GEM_PATH = File.expand_path('../../../', __FILE__)
9
- TEMPLATE_PLIST_PATH = File.join(GEM_PATH, 'config', 'com.evrone.masquito.plist.erb')
10
- PLIST_NAME = File.basename(TEMPLATE_PLIST_PATH, '.erb')
11
- SERVICE_NAME = File.basename(PLIST_NAME, '.plist')
12
-
13
- RESOLVER_TEMPLATE_PATH = File.join(GEM_PATH, 'config', 'masquito.erb')
14
- RESOLVERS_PATH = Pathname.new('/etc/resolver')
15
-
16
- module Install
17
- class << self
18
- def daemon_install
19
- abort_if_superuser
20
- FileUtils.mkdir_p(CONFIG_PATH)
21
-
22
- plist = ERB.new(File.read(TEMPLATE_PLIST_PATH))
23
- masquito_bin = File.join(GEM_PATH, 'bin', 'masquito')
24
- template = plist.result(binding)
25
-
26
- filename = File.join(Dir.tmpdir, PLIST_NAME)
27
- File.open(filename, 'w') { |f| f.write(template) }
28
- lunchy.install([filename])
29
- lunchy.start([SERVICE_NAME])
30
- File.unlink(filename)
31
-
32
- puts 'Daemon was successfully installed.'
33
- puts 'Run: sudo masquito resolver install'
34
- end
35
-
36
- def daemon_uninstall
37
- abort_if_superuser
38
- lunchy.stop([SERVICE_NAME])
39
- lunchy.uninstall([PLIST_NAME])
40
- puts "You can remove #{CONFIG_PATH} if you don't need these settings"
41
- end
42
-
43
- def resolver_install
44
- abort_unless_superuser
45
- resolver = ERB.new(File.read(RESOLVER_TEMPLATE_PATH))
46
- template = resolver.result(binding)
47
- Masquito::Settings.new.domains.each do |domain|
48
- File.open(RESOLVERS_PATH.join(domain.to_s), 'w') { |f| f.write(template) }
49
- end
50
- end
51
-
52
- def resolver_uninstall
53
- abort_unless_superuser
54
- Masquito::Settings.new.domains.each do |domain|
55
- FileUtils.rm_rf(RESOLVERS_PATH.join(domain.to_s))
56
- end
57
- end
58
-
59
- private
60
-
61
- def lunchy
62
- @lunchy ||= Lunchy.new
63
- end
64
-
65
- def abort_unless_superuser
66
- unless superuser?
67
- abort 'We need superuser privileges, run this command with sudo'
68
- end
69
- end
70
-
71
- def abort_if_superuser
72
- if superuser?
73
- abort 'No need superuser privileges, run this command without sudo'
74
- end
75
- end
76
-
77
- def superuser?
78
- [Process.uid, Process.euid] == [0, 0]
79
- end
80
- end
81
- end
82
- end
83
-
84
- class Lunchy
85
- CONFIG = { :verbose => false, :write => nil }
86
-
87
- def uninstall(params)
88
- raise ArgumentError, "uninstall [file]" if params.empty?
89
- filename = params[0]
90
- %w(~/Library/LaunchAgents /Library/LaunchAgents).each do |dir|
91
- if File.exist?(File.expand_path(dir))
92
- FileUtils.rm_rf(File.join(File.expand_path(dir), File.basename(filename)))
93
- return puts "#{filename} uninstalled from #{dir}"
94
- end
95
- end
96
- end
97
- end