strongspace 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -41,7 +41,14 @@ module Strongspace::Command
41
41
 
42
42
  group 'SSH Keys' do |group|
43
43
  group.command 'keys', 'show your user\'s public keys'
44
- group.command 'keys:add [<path to keyfile>]', 'add a public key'
44
+
45
+ if not RUBY_PLATFORM =~ /mswin32|mingw32/
46
+ group.command 'keys:add [<path to keyfile>]', 'Add an public key or generate a new SSH keypair and add'
47
+ group.command 'keys:generate', 'Generate a new SSH keypair'
48
+ else
49
+ group.command 'keys:add [<path to keyfile>]', 'Add an public key'
50
+ end
51
+
45
52
  group.command 'keys:remove <id> ', 'remove a key by id'
46
53
  group.command 'keys:clear', 'remove all keys'
47
54
  end
@@ -14,6 +14,12 @@ module Strongspace::Command
14
14
  end
15
15
  alias :index :list
16
16
 
17
+ def generate
18
+ `ssh-keygen`
19
+ return ($? == 0)
20
+ end
21
+
22
+
17
23
  def add
18
24
  keyfile = args.first || find_key
19
25
  key = File.read(keyfile)
@@ -39,7 +45,21 @@ module Strongspace::Command
39
45
  keyfile = "#{home_directory}/.ssh/id_#{key_type}.pub"
40
46
  return keyfile if File.exists? keyfile
41
47
  end
42
- raise CommandFailed, "No ssh public key found in #{home_directory}/.ssh/id_[rd]sa.pub. You may want to specify the full path to the keyfile."
48
+
49
+
50
+ display "No ssh public key found in #{home_directory}/.ssh/id_[rd]sa.pub"
51
+ if not running_on_windows?
52
+ display " Generate a new key? [yes/no]: ", false
53
+ answer = ask("no")
54
+ if answer.downcase == "yes" or answer.downcase == "y"
55
+ r = Strongspace::Command.run_internal("keys:generate", nil)
56
+ if r
57
+ return find_key
58
+ end
59
+ end
60
+ end
61
+
62
+ raise CommandFailed, "No ssh public key available"
43
63
  end
44
64
 
45
65
  def format_key_for_display(key)
@@ -1,5 +1,10 @@
1
1
  module Strongspace
2
2
  module Helpers
3
+
4
+ def command_name
5
+ self.class.name.split("::").last
6
+ end
7
+
3
8
  def home_directory
4
9
  running_on_windows? ? ENV['USERPROFILE'] : ENV['HOME']
5
10
  end
@@ -24,6 +29,72 @@ module Strongspace
24
29
  "#{home_directory}/.strongspace/bin"
25
30
  end
26
31
 
32
+ def launchd_agents_folder
33
+ "#{home_directory}/Library/LaunchAgents"
34
+ end
35
+
36
+ def pid_file_path(name)
37
+ "#{pids_folder}/#{name}"
38
+ end
39
+
40
+ def pid_from_pid_file(name)
41
+ if File.exist?(pid_file_path(name))
42
+
43
+ f = File.open(pid_file_path(name))
44
+ existing_pid = Integer(f.gets)
45
+ f.close
46
+
47
+ return existing_pid
48
+ end
49
+
50
+ return nil
51
+ end
52
+
53
+ def process_running?(name)
54
+ existing_pid = pid_from_pid_file(name)
55
+
56
+ if not existing_pid
57
+ return false
58
+ end
59
+
60
+ begin
61
+ # This process is running
62
+ Process.kill(0, existing_pid)
63
+ return true
64
+ rescue Errno::EPERM
65
+ error "No longer have permissions to check this PID"
66
+ rescue Errno::ESRCH
67
+ # Cleanup orphaned pid file and continue on as normal
68
+ File.unlink(pid_file_path(name))
69
+ rescue
70
+ error "Unable to determine status for #{existing_pid} : #{$!}"
71
+ end
72
+
73
+ return false
74
+ end
75
+
76
+ def create_pid_file(name, pid)
77
+
78
+ if process_running?(name)
79
+ return nil
80
+ end
81
+
82
+ if not File.exist?(pids_folder)
83
+ FileUtils.mkdir_p(pids_folder)
84
+ end
85
+
86
+ file = File.new(pid_file_path(name), "w")
87
+ file.puts "#{pid}"
88
+ file.close
89
+
90
+ return true
91
+ end
92
+
93
+ def delete_pid_file(name)
94
+ if File.exist?(pid_file_path(name))
95
+ File.unlink(pid_file_path(name))
96
+ end
97
+ end
27
98
 
28
99
  def display(msg, newline=true)
29
100
  if newline
@@ -82,7 +153,7 @@ module Strongspace
82
153
 
83
154
  def ask(default=nil)
84
155
  r = gets.strip
85
- if not r or r.length
156
+ if r.blank?
86
157
  return default
87
158
  else
88
159
  return r
@@ -95,6 +166,34 @@ module Strongspace
95
166
  end
96
167
  end
97
168
 
169
+ unless Object.method_defined?(:blank?)
170
+ class Object
171
+ def blank?
172
+ respond_to?(:empty?) ? empty? : !self
173
+ end
174
+ end
175
+ end
176
+
177
+ unless String.method_defined?(:starts_with?)
178
+ class String
179
+ def starts_with?(str)
180
+ str = str.to_str
181
+ head = self[0, str.length]
182
+ head == str
183
+ end
184
+ end
185
+ end
186
+
187
+ unless String.method_defined?(:ends_with?)
188
+ class String
189
+ def ends_with?(str)
190
+ str = str.to_str
191
+ tail = self[-str.length, str.length]
192
+ tail == str
193
+ end
194
+ end
195
+ end
196
+
98
197
  unless String.method_defined?(:shellescape)
99
198
  class String
100
199
  def shellescape
@@ -109,4 +208,12 @@ unless String.method_defined?(:camelize)
109
208
  self.split(/[^a-z0-9]/i).map{|w| w.capitalize}.join
110
209
  end
111
210
  end
211
+ end
212
+
213
+ unless String.method_defined?(:underscore)
214
+ class String
215
+ def underscore
216
+ self.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
217
+ end
218
+ end
112
219
  end
@@ -1,3 +1,3 @@
1
1
  module Strongspace
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strongspace
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
9
+ - 9
10
+ version: 0.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Strongspace
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-12 00:00:00 -05:00
18
+ date: 2010-12-16 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency