sheepsafe 0.1.0 → 0.2.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.
data/README.md CHANGED
@@ -5,7 +5,14 @@ http://github.com/nicksieger/sheepsafe
5
5
 
6
6
  ## Description
7
7
 
8
- Sheepsafe is a small utility to keep you safe from [FireSheep][]!
8
+ Sheepsafe is a small utility to keep you safe from [FireSheep][]!
9
+ It's a tool for mobile geeks.
10
+
11
+ We all know the cookie-stealing issue has been out there for a while,
12
+ but now with [FireSheep][], it just got way too easy. If you're like
13
+ me, I don't want to get exposed at the next gathering of techies at a
14
+ conference or even at a local coffee shop with this thing out there.
15
+ So I built Sheepsafe for myself.
9
16
 
10
17
  Sheepsafe was built to automate the task of switching your network
11
18
  configuration to use a SOCKS proxy whenever you join an untrusted
@@ -34,29 +41,21 @@ but this setup Works For Me.
34
41
 
35
42
  ## Install
36
43
 
37
- - First install the gem: `sudo gem install sheepsafe`. It's
38
- recommended to install using the system Ruby to minimize
44
+ - First install the gem:
45
+ sudo gem install sheepsafe
46
+ It's recommended to install using the system Ruby to minimize
39
47
  difficulties informing launchd about an [RVM][] or some other
40
48
  package manager.
41
49
  - After installing the gem, run `sheepsafe install` and follow the
42
50
  prompts for configuring Sheepsafe.
43
51
 
44
- ### Setting up the "Untrusted" location
45
-
46
- One manual step that you need to do during installation is to create
47
- an "Untrusted" location for Sheepsafe to configure and use when you're
48
- on an untrusted network. Sheepsafe will prompt you to do these steps
49
- during installation.
50
-
51
- ![Edit locations...](http://github.com/nicksieger/sheepsafe/raw/master/doc/edit-locations.jpg)
52
-
53
- ![Add Untrusted and Apply...](http://github.com/nicksieger/sheepsafe/raw/master/doc/add-untrusted-apply.jpg)
54
-
55
52
  ## Growl
56
53
 
57
54
  If you wish to receive Growl notifications when Sheepsafe is switching
58
55
  your location, be sure to install the `growlnotify` utility from the
59
- "Extras" folder in the Growl .dmg.
56
+ "Extras" folder in the Growl .dmg. Then install the `growl` gem:
57
+
58
+ sudo gem install growl
60
59
 
61
60
  ## Post-install
62
61
 
@@ -68,6 +67,12 @@ settings for making connections, where applicable.
68
67
  - Run `sheepsafe uninstall` to unregister the Launchd task and remove
69
68
  Sheepsafe vestiges from your system.
70
69
 
70
+ ## Give back
71
+
72
+ I'll gladly accept [pull requests][pr] and [bug reports][issues].
73
+
71
74
  [FireSheep]: http://codebutler.com/firesheep
72
75
  [RVM]: http://rvm.beginrescueend.com/
73
76
  [polo]: http://www.symonds.id.au/marcopolo/
77
+ [pr]: http://github.com/nicksieger/sheepsafe/pulls
78
+ [issues]: http://github.com/nicksieger/sheepsafe/issues
data/bin/sheepsafe CHANGED
@@ -8,9 +8,13 @@ rescue LoadError
8
8
  require 'sheepsafe'
9
9
  end
10
10
 
11
- if ARGV.length == 1 && ARGV.first =~ /^(un)?install$/
11
+ if ARGV.length == 1
12
12
  installer = Sheepsafe::Installer.new
13
- ARGV.first == 'install' ? installer.run : installer.uninstall
13
+ if installer.respond_to?(ARGV.first)
14
+ installer.send(ARGV.first)
15
+ else
16
+ abort "unknown command #{ARGV.first}. Try 'install', 'update', or 'uninstall'."
17
+ end
14
18
  else
15
19
  # Allow network changes to sink in for a couple more seconds
16
20
  sleep 2
@@ -8,9 +8,9 @@ module Sheepsafe
8
8
  ARRAY_ATTRS = %w(trusted_names)
9
9
 
10
10
  def self.load_config
11
- File.open(FILE) {|f| YAML.load(f) }
12
- rescue
13
- raise "Unable to read ~/sheepsafe.yml; please run sheepsafe-install"
11
+ YAML.load_file(FILE)
12
+ rescue Errno::ENOENT
13
+ raise "Unable to read ~/.sheepsafe.yml; please run sheepsafe-install"
14
14
  end
15
15
 
16
16
  attr_reader :config
@@ -30,7 +30,7 @@ module Sheepsafe
30
30
  end
31
31
 
32
32
  def write
33
- File.open(FILE, "w") {|f| f << YAML.dump(@config) }
33
+ File.open(FILE, "w") {|f| f << YAML.dump(config) }
34
34
  end
35
35
  end
36
36
  end
@@ -1,18 +1,21 @@
1
1
  require 'daemons'
2
2
  require 'logger'
3
- require 'growl'
3
+ begin
4
+ require 'growl'
5
+ rescue LoadError
6
+ end
4
7
 
5
8
  module Sheepsafe
6
9
  class Controller
7
10
  LOG_FILE = Sheepsafe::Config::FILE.sub(/\.yml/, '.log')
8
11
 
9
- def initialize(config = nil, status = nil, logger = nil)
10
- @config = config || Sheepsafe::Config.new
11
- @status = status || Sheepsafe::Status.new(@config)
12
- @logger = logger || begin
13
- STDOUT.reopen(File.open(LOG_FILE, (File::WRONLY | File::APPEND)))
14
- Logger.new(STDOUT)
15
- end
12
+ def initialize(config = nil, network = nil, logger = nil)
13
+ @config = config || Sheepsafe::Config.new
14
+ @network = network || Sheepsafe::Network.new(@config)
15
+ @logger = logger || begin
16
+ STDOUT.reopen(File.open(LOG_FILE, (File::WRONLY | File::APPEND)))
17
+ Logger.new(STDOUT)
18
+ end
16
19
  end
17
20
 
18
21
  def run
@@ -28,7 +31,7 @@ module Sheepsafe
28
31
  bring_socks_proxy 'up'
29
32
  system "scselect #{@config.untrusted_location}"
30
33
  end
31
- @config.last_network = @status.current_network
34
+ @config.last_network = @network
32
35
  @config.write
33
36
  end
34
37
  else
@@ -38,19 +41,19 @@ module Sheepsafe
38
41
  end
39
42
 
40
43
  def network_up?
41
- @status.network_up?
44
+ @network.up?
42
45
  end
43
46
 
44
47
  def network_changed?
45
- @status.current_network != @config.last_network
48
+ @network.ssid != @config.last_network.ssid || @network.bssid != @config.last_network.bssid
46
49
  end
47
50
 
48
51
  def switch_to_trusted?
49
- @status.current_network.trusted?
52
+ @network.trusted?
50
53
  end
51
54
 
52
55
  def switch_to_untrusted?
53
- !@status.current_network.trusted?
56
+ !@network.trusted?
54
57
  end
55
58
 
56
59
  def bring_socks_proxy(direction)
@@ -65,21 +68,17 @@ module Sheepsafe
65
68
  end
66
69
 
67
70
  def notify_ok(msg)
68
- check_growl_installed
69
- Growl.notify_ok(msg)
71
+ when_growl_available { Growl.notify_ok(msg) }
70
72
  log(msg)
71
73
  end
72
74
 
73
75
  def notify_warning(msg)
74
- check_growl_installed
75
- Growl.notify_warning(msg)
76
+ when_growl_available { Growl.notify_warning(msg) }
76
77
  log(msg)
77
78
  end
78
79
 
79
- def check_growl_installed
80
- unless Growl.installed?
81
- log("WARNING: Growl not installed (probably couldn't find growlnotify in PATH: #{ENV['PATH']})")
82
- end
80
+ def when_growl_available(&block)
81
+ block.call if defined?(Growl)
83
82
  end
84
83
 
85
84
  def log(msg)
@@ -2,21 +2,20 @@ module Sheepsafe
2
2
  class Installer
3
3
  PLIST_FILE = File.expand_path("~/Library/LaunchAgents/sheepsafe.plist")
4
4
 
5
- attr_reader :config, :status, :controller
5
+ attr_reader :config, :network, :controller
6
6
 
7
- def initialize
7
+ def initialize(config = nil, network = nil, controller = nil)
8
8
  require 'highline/import'
9
- @config = File.readable?(Sheepsafe::Config::FILE) ? Sheepsafe::Config.new : Sheepsafe::Config.new({})
10
- @status = Sheepsafe::Status.new(@config)
11
- @controller = Sheepsafe::Controller.new @config, @status, Logger.new(Sheepsafe::Controller::LOG_FILE)
12
- update_config_with_status
9
+ @config = config || (File.readable?(Sheepsafe::Config::FILE) ? Sheepsafe::Config.new : Sheepsafe::Config.new({}))
10
+ @network = network || Sheepsafe::Network.new(@config)
11
+ @controller = controller || Sheepsafe::Controller.new(@config, @network, Logger.new(Sheepsafe::Controller::LOG_FILE))
12
+ update_config_with_network
13
13
  end
14
14
 
15
- def run
15
+ def install
16
16
  intro_message
17
17
  config_prompts
18
- manual_network_location_prompt
19
- setup_untrusted_location
18
+ setup_network_location
20
19
  write_config
21
20
  write_launchd_plist
22
21
  register_launchd_task
@@ -53,20 +52,19 @@ MSG
53
52
  q.default = config.trusted_location
54
53
  end
55
54
 
56
- config.trusted_names = ask "Next, one or more network names (blank line to stop, RET for #{@names.inspect}) >\n" do |q|
57
- q.gather = ""
58
- end
59
- config.trusted_names = @names if config.trusted_names.empty?
55
+ config.trusted_names = ask "Next, one or more trusted network names/SSIDs (comma-separated) >\n" do |q|
56
+ q.default = @names.join(',')
57
+ end.split(",").map(&:strip)
60
58
  end
61
59
 
62
- def manual_network_location_prompt
63
- say "Next, I need you to create and switch to the \"Untrusted\" location in Network preferences."
64
- system "open /System/Library/PreferencePanes/Network.prefPane"
65
- ask "Press ENTER when done."
66
- end
60
+ def setup_network_location
61
+ if `networksetup -listlocations` !~ /Untrusted/m &&
62
+ agree("Next, I'll create and switch to the \"Untrusted\" location in Network Preferences. OK\? (yes/no)\n")
63
+ system "networksetup -createlocation Untrusted populate"
64
+ end
67
65
 
68
- def setup_untrusted_location
69
66
  if agree "Next, I'll set up the SOCKS proxy in the \"Untrusted\" location for you. OK\? (yes/no)\n"
67
+ system "networksetup -switchtolocation Untrusted"
70
68
  system "networksetup -setsocksfirewallproxy AirPort localhost #{config.socks_port}"
71
69
  end
72
70
  end
@@ -134,12 +132,18 @@ PLIST
134
132
  say "Uninstall finished."
135
133
  end
136
134
 
135
+ def update
136
+ system "launchctl unload #{PLIST_FILE}"
137
+ write_launchd_plist
138
+ register_launchd_task
139
+ end
140
+
137
141
  private
138
- def update_config_with_status
142
+ def update_config_with_network
139
143
  unless config.trusted_location
140
- config.trusted_location = status.current_location
144
+ config.trusted_location = network.current_location
141
145
  end
142
- @names = [status.current_network.current_ssid, status.current_network.current_bssid]
146
+ @names = [network.ssid, network.bssid]
143
147
  end
144
148
 
145
149
  def sheepsafe_bin_path
@@ -1,24 +1,26 @@
1
1
  module Sheepsafe
2
2
  class Network
3
+ attr_reader :current_location
4
+
3
5
  def initialize(config = nil)
6
+ @current_location = `networksetup -getcurrentlocation`.chomp
4
7
  @data = YAML.load(`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I`.gsub(/^\s*([^:]+)/, '"\1"'))
5
8
  @config = config || Sheepsafe::Config.new({})
6
9
  end
7
10
 
8
11
  def trusted?
9
- @config.trusted_names.include?(current_ssid) ||
10
- @config.trusted_names.include?(current_bssid)
12
+ @config.trusted_names.include?(ssid) || @config.trusted_names.include?(bssid)
11
13
  end
12
14
 
13
15
  def up?
14
16
  @data['AirPort'] != false
15
17
  end
16
18
 
17
- def current_ssid
19
+ def ssid
18
20
  @data['SSID']
19
21
  end
20
22
 
21
- def current_bssid
23
+ def bssid
22
24
  @data['BSSID']
23
25
  end
24
26
  end
data/lib/sheepsafe.rb CHANGED
@@ -1,9 +1,8 @@
1
1
  module Sheepsafe
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
4
4
 
5
5
  require 'sheepsafe/config'
6
6
  require 'sheepsafe/controller'
7
7
  require 'sheepsafe/installer'
8
8
  require 'sheepsafe/network'
9
- require 'sheepsafe/status'
data/sheepsafe.gemspec CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'sheepsafe'
5
- s.version = '0.1.0'
6
- s.date = '2010-10-26'
5
+ s.version = '0.2.0'
6
+ s.date = '2010-10-27'
7
7
 
8
8
  s.rubyforge_project = %q{caldersphere}
9
9
 
@@ -28,6 +28,9 @@ Welcome to Sheepsafe!
28
28
  If this is your first time using Sheepsafe, you probably want to set it up.
29
29
 
30
30
  To do that, run \`sheepsafe install\' now.
31
+
32
+ If you\'re updating to a new version of Sheepsafe and want to keep your
33
+ current configuration, run \`sheepsafe update\'.
31
34
  ===========================================================================
32
35
  ]
33
36
 
@@ -38,14 +41,11 @@ To do that, run \`sheepsafe install\' now.
38
41
  README.md
39
42
  Rakefile
40
43
  bin/sheepsafe
41
- doc/add-untrusted-apply.jpg
42
- doc/edit-locations.jpg
43
44
  lib/sheepsafe.rb
44
45
  lib/sheepsafe/config.rb
45
46
  lib/sheepsafe/controller.rb
46
47
  lib/sheepsafe/installer.rb
47
48
  lib/sheepsafe/network.rb
48
- lib/sheepsafe/status.rb
49
49
  sheepsafe.gemspec
50
50
  spec/sheepsafe_spec.rb
51
51
  ]
@@ -53,7 +53,6 @@ To do that, run \`sheepsafe install\' now.
53
53
 
54
54
  s.test_files = s.files.select { |path| path =~ /^spec\/.*spec.*\.rb/ }
55
55
 
56
- s.add_dependency(%q<growl>, ["~> 1.0"])
57
56
  s.add_dependency(%q<highline>, ["~> 1.6"])
58
57
  s.add_dependency(%q<daemons>, ["~> 1.1"])
59
58
  s.add_development_dependency(%q<rspec>, ["~> 2.0"])
@@ -3,48 +3,46 @@ require 'sheepsafe'
3
3
 
4
4
  describe Sheepsafe::Controller do
5
5
  let(:config) do
6
- mock("config", :trusted_location => "trusted_location", :untrusted_location => "untrusted_location",
6
+ double("config", :trusted_location => "trusted_location", :untrusted_location => "untrusted_location",
7
7
  :last_network= => nil, :write => nil)
8
8
  end
9
9
 
10
- let (:status) do
11
- mock("status", :current_network => "current_network", :network_up? => true)
10
+ let (:network) do
11
+ double("network", :up? => true, :ssid => "current", :bssid => "current_bssid")
12
12
  end
13
13
 
14
14
  let(:controller) do
15
15
  # Stub out logging
16
- Sheepsafe::Controller.new(config, status, mock("logger", :info => nil)).tap do |c|
17
- c.stub!(:notify_ok)
18
- c.stub!(:notify_warning)
16
+ Sheepsafe::Controller.new(config, network, double("logger", :info => nil)).tap do |c|
17
+ c.stub(:notify_ok)
18
+ c.stub(:notify_warning)
19
19
  end
20
20
  end
21
21
 
22
22
  context "#network_changed?" do
23
23
  it "is when the current_network is different than the last_network" do
24
- config.should_receive(:last_network).and_return "last_network"
25
- status.should_receive(:current_network).and_return "current_network"
24
+ config.should_receive(:last_network).and_return double("network", :ssid => "last", :bssid => nil)
26
25
  controller.network_changed?.should be_true
27
26
  end
28
27
  end
29
28
 
30
29
  context "#switch_to_trusted?" do
31
30
  it "is when the current network is trusted" do
32
- status.stub_chain(:current_network, :trusted?).and_return true
31
+ network.stub :trusted? => true
33
32
  controller.switch_to_trusted?.should be_true
34
33
  end
35
34
  end
36
35
 
37
36
  context "#switch_to_untrusted?" do
38
37
  it "is when the current network is trusted" do
39
- status.stub_chain(:current_network, :trusted?).and_return false
38
+ network.stub :trusted? => false
40
39
  controller.switch_to_untrusted?.should be_true
41
40
  end
42
41
  end
43
42
 
44
43
  context "network didn't change" do
45
44
  before :each do
46
- config.should_receive(:last_network).and_return "last_network"
47
- status.should_receive(:current_network).and_return "last_network"
45
+ config.stub :last_network => network
48
46
  end
49
47
 
50
48
  it "does nothing" do
@@ -55,7 +53,7 @@ describe Sheepsafe::Controller do
55
53
 
56
54
  context "network is down" do
57
55
  it "does nothing" do
58
- status.should_receive(:network_up?).and_return false
56
+ network.should_receive(:up?).and_return false
59
57
  config.should_not_receive(:write)
60
58
  controller.run
61
59
  end
@@ -63,14 +61,12 @@ describe Sheepsafe::Controller do
63
61
 
64
62
  context "network changed" do
65
63
  before :each do
66
- controller.stub!(:network_changed?).and_return true
67
- controller.stub!(:switch_to_trusted?).and_return false
68
- controller.stub!(:switch_to_untrusted?).and_return false
64
+ controller.stub(:network_changed? => true, :switch_to_trusted? => false,
65
+ :switch_to_untrusted? => false)
69
66
  end
70
67
 
71
68
  it "writes the last network to the configuration" do
72
- status.should_receive(:current_network).and_return "current_network"
73
- config.should_receive(:last_network=).with("current_network").ordered
69
+ config.should_receive(:last_network=).ordered
74
70
  config.should_receive(:write).ordered
75
71
  controller.run
76
72
  end
@@ -95,25 +91,18 @@ describe Sheepsafe::Controller do
95
91
  end
96
92
  end
97
93
 
98
- describe Sheepsafe::Status do
99
- let(:status) { Sheepsafe::Status.new }
100
-
101
- its(:current_location) { should_not be_nil }
102
- its(:current_network) { should_not be_nil }
103
- end
104
-
105
94
  describe Sheepsafe::Network do
106
95
  let(:current_network) { Sheepsafe::Network.new }
107
96
 
108
97
  context "with trusted SSID" do
109
- let(:config) { Sheepsafe::Config.new({"trusted_names" => [current_network.current_ssid]}) }
98
+ let(:config) { Sheepsafe::Config.new({"trusted_names" => [current_network.ssid]}) }
110
99
  subject { Sheepsafe::Network.new(config) }
111
100
 
112
101
  it { should be_trusted }
113
102
  end
114
103
 
115
104
  context "with trusted BSSID" do
116
- let(:config) { Sheepsafe::Config.new({"trusted_names" => [current_network.current_bssid]}) }
105
+ let(:config) { Sheepsafe::Config.new({"trusted_names" => [current_network.bssid]}) }
117
106
  subject { Sheepsafe::Network.new(config) }
118
107
 
119
108
  it { should be_trusted }
@@ -125,3 +114,43 @@ describe Sheepsafe::Network do
125
114
  it { should_not be_trusted }
126
115
  end
127
116
  end
117
+
118
+ describe Sheepsafe::Installer do
119
+ let(:config) { double("config").as_null_object }
120
+ let(:network) { double("network", :up? => true, :ssid => "current", :bssid => "current_bssid") }
121
+ let(:controller) { double "controller" }
122
+ let (:installer) do
123
+ @messages = []
124
+ @commands = []
125
+ Sheepsafe::Installer.new(config, network, controller).tap do |ins|
126
+ ins.stub(:say).and_return do |msg|
127
+ @messages << msg
128
+ end
129
+ ins.stub(:ask).and_return do |msg,*rest|
130
+ @messages << msg
131
+ ""
132
+ end
133
+ ins.stub(:agree).and_return do |msg|
134
+ @messages << msg
135
+ true
136
+ end
137
+ ins.stub(:system).and_return do |cmd|
138
+ @commands << cmd
139
+ nil
140
+ end
141
+ end
142
+ end
143
+
144
+ before :each do
145
+ $?.stub :success? => true
146
+ end
147
+
148
+ it "asks questions, runs commands, writes the config to disk and runs the controller" do
149
+ config.should_receive(:write)
150
+ controller.should_receive(:run)
151
+ installer.should_receive(:write_launchd_plist) # don't want to actually touch plist file
152
+ installer.install
153
+ @messages.should_not be_empty
154
+ @commands.should_not be_empty
155
+ end
156
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sheepsafe
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nick Sieger
@@ -15,28 +15,13 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-26 00:00:00 -05:00
18
+ date: 2010-10-27 00:00:00 -05:00
19
19
  default_executable: sheepsafe
20
20
  dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: growl
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 15
30
- segments:
31
- - 1
32
- - 0
33
- version: "1.0"
34
- type: :runtime
35
- version_requirements: *id001
36
21
  - !ruby/object:Gem::Dependency
37
22
  name: highline
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ requirement: &id001 !ruby/object:Gem::Requirement
40
25
  none: false
41
26
  requirements:
42
27
  - - ~>
@@ -47,11 +32,11 @@ dependencies:
47
32
  - 6
48
33
  version: "1.6"
49
34
  type: :runtime
50
- version_requirements: *id002
35
+ version_requirements: *id001
51
36
  - !ruby/object:Gem::Dependency
52
37
  name: daemons
53
38
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &id002 !ruby/object:Gem::Requirement
55
40
  none: false
56
41
  requirements:
57
42
  - - ~>
@@ -62,11 +47,11 @@ dependencies:
62
47
  - 1
63
48
  version: "1.1"
64
49
  type: :runtime
65
- version_requirements: *id003
50
+ version_requirements: *id002
66
51
  - !ruby/object:Gem::Dependency
67
52
  name: rspec
68
53
  prerelease: false
69
- requirement: &id004 !ruby/object:Gem::Requirement
54
+ requirement: &id003 !ruby/object:Gem::Requirement
70
55
  none: false
71
56
  requirements:
72
57
  - - ~>
@@ -77,7 +62,7 @@ dependencies:
77
62
  - 0
78
63
  version: "2.0"
79
64
  type: :development
80
- version_requirements: *id004
65
+ version_requirements: *id003
81
66
  description: Automatically toggle network locations and start a SOCKS proxy on untrusted networks. Mac OS X only.
82
67
  email: nick@nicksieger.com
83
68
  executables:
@@ -93,14 +78,11 @@ files:
93
78
  - README.md
94
79
  - Rakefile
95
80
  - bin/sheepsafe
96
- - doc/add-untrusted-apply.jpg
97
- - doc/edit-locations.jpg
98
81
  - lib/sheepsafe.rb
99
82
  - lib/sheepsafe/config.rb
100
83
  - lib/sheepsafe/controller.rb
101
84
  - lib/sheepsafe/installer.rb
102
85
  - lib/sheepsafe/network.rb
103
- - lib/sheepsafe/status.rb
104
86
  - sheepsafe.gemspec
105
87
  - spec/sheepsafe_spec.rb
106
88
  has_rdoc: true
@@ -112,7 +94,9 @@ post_install_message: "\n\
112
94
  Welcome to Sheepsafe!\n\n\
113
95
  =8P <=== (That's a sheep emoji.)\n\n\
114
96
  If this is your first time using Sheepsafe, you probably want to set it up.\n\n\
115
- To do that, run `sheepsafe install' now.\n\
97
+ To do that, run `sheepsafe install' now.\n\n\
98
+ If you're updating to a new version of Sheepsafe and want to keep your\n\
99
+ current configuration, run `sheepsafe update'.\n\
116
100
  ===========================================================================\n "
117
101
  rdoc_options:
118
102
  - --charset=UTF-8
Binary file
Binary file
@@ -1,14 +0,0 @@
1
- module Sheepsafe
2
- class Status
3
- attr_reader :current_location, :current_network
4
-
5
- def initialize(config = nil)
6
- @current_location = `networksetup -getcurrentlocation`.chomp
7
- @current_network = Network.new config
8
- end
9
-
10
- def network_up?
11
- @current_network.up?
12
- end
13
- end
14
- end