i2cssh 1.16.0 → 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: b4b5f061ea224c7e4c979cc236f765487d4aaada
4
- data.tar.gz: 56871f698c12642a72b04d22cd14c7c26fcf826a
3
+ metadata.gz: 88668f1a5e023bfe629d1ef3ce8d37a1abb86b2f
4
+ data.tar.gz: 258cebb74a3b99a50c629a83f0001ca731581362
5
5
  SHA512:
6
- metadata.gz: 944dbcad21622a1e055a079e5b973e3af011042dce697b0f70cd7d0d157ff68ed0d6eaff36c9cac7eb5dea4eddbbc582bc05b40b8e7e5e4dd5007023ca8fa52f
7
- data.tar.gz: e7558c97748e2407bf87624011b311d9f43caf99e80a47793ef778efd6cc78de9de30930aae8b7bc192d38801b5a833dcbe03f8261d5ce6e9863503f36e75c5a
6
+ metadata.gz: 96ec82ba52fc77aa1e43c5389b8ad385cad5d9cceb24f14f48568ba12a6cf80190ac636fd11a05c06b3b03c62d883fdb4e6a806261c1ce717c5f484f0e46e0ac
7
+ data.tar.gz: 71494be0c81efb397af53c4e00e7a56ad173425d8d6bba1d838cc07a1b9bcaad853fbabe19ea7ad530d6c7b4d8aea6ae22be7dec636a4a46221a12e55a40005e
@@ -4,8 +4,12 @@ i2cssh is a csshX (http://code.google.com/p/csshx/) like tool for connecting ove
4
4
  a master window for input, i2cssh uses iterm2 split panes and "Send input to all sessions" (cmd-shift-i) to send commands
5
5
  to all sessions.
6
6
 
7
- ## Installing
7
+ ## Installing
8
8
 
9
+ When using iTerm2 < 2.9, install i2cssh version 1.16.0:
10
+ $ gem install i2cssh -v 1.16.0
11
+
12
+ Otherwise, just run:
9
13
  $ gem install i2cssh
10
14
 
11
15
  ## Usage
@@ -79,7 +83,7 @@ Optional parameters can be used globally or per cluster and include:
79
83
  environment: # Send the following enviroment variables
80
84
  - LC_FOO: foo
81
85
  - LC_BAR: bar
82
-
86
+
83
87
  iterm2: true # Use iTerm2.app instead of iTerm.app (only available globally)
84
88
 
85
89
  Note: rows and columns can't be used together.
@@ -142,7 +146,7 @@ Will read nodes from a file. These will be added to any hosts specified on the c
142
146
 
143
147
  ### -c, --clusters clus1,clus2
144
148
 
145
- Connect to one or more clusters that are specified in the config
149
+ Connect to one or more clusters that are specified in the config
146
150
 
147
151
  ### -r, --rank
148
152
 
@@ -154,12 +158,12 @@ Connect to the machines a, b and c
154
158
 
155
159
  ### -t, --tab-split
156
160
 
157
- Split servers/clusters into tabs, grouping arguments.
161
+ Split servers/clusters into tabs, grouping arguments.
158
162
  Tabs are created as follows: hosts after a -m option are put in one tab, each cluster is always in its own tab, all the arguments are in one tab.
159
163
 
160
164
  ### -T, --tab-split-nogroup
161
165
 
162
- Split servers/clusters into tabs, *not* grouping arguments.
166
+ Split servers/clusters into tabs, *not* grouping arguments.
163
167
  Tabs are created as follows: hosts after a -m option are put in one tab, each cluster is always in its own tab, each argument is in its own tab.
164
168
 
165
169
  ### -s, --sleep SLEEP
@@ -172,7 +176,7 @@ Set extra ssh parameters in the form -Xk=v. For example:
172
176
 
173
177
  i2cssh -Xi=myidentity.pem
174
178
 
175
- will result in
179
+ will result in
176
180
 
177
181
  ssh -i myidentity.pem
178
182
 
@@ -191,9 +195,9 @@ will result in
191
195
 
192
196
  ## Contributing to i2cssh
193
197
 
194
- I know that i2cssh doesn't have all the functionality of csshX, but either let me know what you really need or
198
+ I know that i2cssh doesn't have all the functionality of csshX, but either let me know what you really need or
195
199
  fork, hack and create a pull request.
196
-
200
+
197
201
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
198
202
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
199
203
  * Fork the project
@@ -206,4 +210,3 @@ fork, hack and create a pull request.
206
210
 
207
211
  Copyright (c) 2011-2012 Wouter de Bie. See LICENSE.txt for
208
212
  further details.
209
-
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.16.0
1
+ 2.0.0
data/bin/i2cssh CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
3
  require 'optparse'
4
- require 'i2cssh'
4
+ require_relative '../lib/i2cssh'
5
5
  require 'yaml'
6
6
 
7
7
  @config_file = File.expand_path "~/.i2csshrc"
8
8
 
9
- @i2_options, ssh_options, @servers, @clusters, @ssh_environment, opts_from_cmdline = [], [], [], {}, [], {}
9
+ @i2_options, ssh_options, @servers, @clusters, @ssh_environment, opts_from_cmdline = [], [], [], {}, [], {}
10
10
 
11
11
  def get_hosts(c)
12
- c.each do |clus|
12
+ c.each do |clus|
13
13
 
14
- if clus =~ /(.+)@(.+)/
14
+ if clus =~ /(.+)@(.+)/
15
15
  login_from_cli = $1
16
16
  clus = $2
17
17
  end
@@ -20,7 +20,7 @@ def get_hosts(c)
20
20
  if cluster
21
21
  set_options(cluster, login_from_cli)
22
22
 
23
- if @i2_options.last[:login]
23
+ if @i2_options.last[:login]
24
24
  @servers << cluster["hosts"].map{|h| "#{@i2_options.last[:login]}@#{h}"}
25
25
  else
26
26
  @servers << cluster["hosts"]
@@ -30,18 +30,18 @@ def get_hosts(c)
30
30
  exit 1
31
31
  end
32
32
  end
33
-
33
+
34
34
  end
35
35
 
36
36
  def set_options(config_hash, login_override=nil)
37
- if config_hash["columns"] and config_hash["rows"]
37
+ if config_hash["columns"] and config_hash["rows"]
38
38
  puts "CONFIG ERROR: rows and columns can't be used at the same time"
39
39
  exit 1
40
40
  end
41
-
42
- if @i2_options.size == 0
41
+
42
+ if @i2_options.size == 0
43
43
  @i2_options << {}
44
- else
44
+ else
45
45
  # The first member includes the default options from the conf file
46
46
  @i2_options << @i2_options.first.clone
47
47
  end
@@ -49,14 +49,14 @@ def set_options(config_hash, login_override=nil)
49
49
  [:broadcast, :profile, :rank, :iterm2, :login, :columns, :rows, :sleep, :direction, :itermname].each do |p|
50
50
  @i2_options.last[p] = config_hash[p.to_s].nil? ? @i2_options.last[p] : config_hash[p.to_s]
51
51
  end
52
-
52
+
53
53
  @i2_options.last[:login] = login_override if login_override
54
54
  @i2_options.last[:direction] ||= :column
55
55
  @i2_options.last[:direction] = @i2_options.last[:direction].to_sym
56
- if config_hash["environment"]
57
- if @ssh_environment.empty?
56
+ if config_hash["environment"]
57
+ if @ssh_environment.empty?
58
58
  @ssh_environment << {}
59
- else
59
+ else
60
60
  # We have some global env so copy it
61
61
  @ssh_environment << @ssh_environment.first.clone
62
62
  end
@@ -68,11 +68,11 @@ def set_options(config_hash, login_override=nil)
68
68
 
69
69
  end
70
70
 
71
- if File.exists?(@config_file)
71
+ if File.exists?(@config_file)
72
72
  config_hash = YAML.load File.read @config_file
73
73
 
74
74
  # Read config and set defaults from config
75
- if config_hash["version"] && config_hash["version"].to_i >= 2
75
+ if config_hash["version"] && config_hash["version"].to_i >= 2
76
76
  set_options(config_hash)
77
77
  @clusters = config_hash["clusters"]
78
78
  else
@@ -88,7 +88,7 @@ end
88
88
  optparse = OptionParser.new do |opts|
89
89
  opts.banner = "Usage: #{File.basename(__FILE__)} [options] [(username@host [username@host] | username@cluster)]"
90
90
 
91
- # Check if we have a cluster.
91
+ # Check if we have a cluster.
92
92
  opts.on '-c', '--clusters clus1,clus2', Array,
93
93
  'Comma-separated list of clusters specified in ~/.i2csshrc' do |c|
94
94
  get_hosts(c)
@@ -97,7 +97,7 @@ optparse = OptionParser.new do |opts|
97
97
 
98
98
  opts.on '-m', '--machines a,b,c', Array,
99
99
  'Comma-separated list of hosts' do |h|
100
-
100
+
101
101
  # Add to servers array and get a clone of default options
102
102
  @servers << h
103
103
  @i2_options << @i2_options.first.clone
@@ -121,12 +121,12 @@ optparse = OptionParser.new do |opts|
121
121
  end
122
122
 
123
123
  opts.on '-t', '--tab-split',
124
- 'Split servers/clusters into tabs (group arguments)' do
124
+ 'Split servers/clusters into tabs (group arguments)' do
125
125
  opts_from_cmdline[:tabs] = true
126
126
  end
127
127
 
128
128
  opts.on '-T', '--tab-split-nogroup',
129
- 'Split servers/clusters into tabs (don\'t group arguments)' do
129
+ 'Split servers/clusters into tabs (don\'t group arguments)' do
130
130
  opts_from_cmdline[:tabs] = true
131
131
  opts_from_cmdline[:tabs_nogroup] = true
132
132
  end
@@ -142,7 +142,7 @@ optparse = OptionParser.new do |opts|
142
142
  opts.on '-l', '--login LOGIN',
143
143
  'SSH login name' do |u|
144
144
  opts_from_cmdline[:login] = u
145
-
145
+
146
146
  end
147
147
 
148
148
  opts.on '-e', '--environment KEY=VAL',
@@ -208,7 +208,7 @@ optparse = OptionParser.new do |opts|
208
208
  end
209
209
  opts.on "-d", '--direction DIRECTION', String,
210
210
  'Direction that new sessions are created (default: column)' do |d|
211
- unless ["row", "column"].include?(d)
211
+ unless ["row", "column"].include?(d)
212
212
  puts "ERROR: -d requires 'row' or 'column'"
213
213
  puts optparse.help
214
214
  exit 1
@@ -228,19 +228,19 @@ optparse = OptionParser.new do |opts|
228
228
  end
229
229
  optparse.parse!
230
230
 
231
- if opts_from_cmdline[:tabs]
231
+ if opts_from_cmdline[:tabs]
232
232
  puts 'Disabling broadcast for tab split mode...'
233
233
  opts_from_cmdline[:broadcast] = false
234
234
  end
235
235
 
236
236
  # One argument = one cluster
237
- if ARGV.length == 1
237
+ if ARGV.length == 1
238
238
  c = [ARGV[0]]
239
239
  get_hosts(c)
240
240
 
241
241
  # Otherwise we have a list of hosts
242
- elsif ARGV.length > 1
243
- if opts_from_cmdline[:tabs_nogroup]
242
+ elsif ARGV.length > 1
243
+ if opts_from_cmdline[:tabs_nogroup]
244
244
  ARGV.each do |serv|
245
245
  @servers << [serv]
246
246
  @i2_options << @i2_options.first.clone
@@ -249,7 +249,7 @@ elsif ARGV.length > 1
249
249
  else
250
250
  @ssh_environment << @ssh_environment.first.clone
251
251
  end
252
- end
252
+ end
253
253
  else
254
254
  @servers << ARGV
255
255
  if @i2_options.size > 1 # We added stuff in with cmdline options
@@ -268,17 +268,17 @@ if @i2_options.size > @servers.size
268
268
  @i2_options.shift
269
269
  end
270
270
 
271
- if @ssh_environment.size > @servers.size
271
+ if @ssh_environment.size > @servers.size
272
272
  @ssh_environment.shift
273
273
  end
274
274
 
275
275
 
276
- @i2_options.each do |opt|
276
+ @i2_options.each do |opt|
277
277
  opt.merge!(opts_from_cmdline)
278
278
  end
279
279
 
280
- @i2_options.each_with_index do |opt, i|
281
- if opt[:login]
280
+ @i2_options.each_with_index do |opt, i|
281
+ if opt[:login]
282
282
  @servers[i] = @servers[i].map{|h| "#{opt[:login]}@#{h.gsub(/.+@/,'')}"}
283
283
  end
284
284
  if opt[:gateway]
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "i2cssh"
8
- s.version = "1.16.0"
8
+ s.version = "2.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Wouter de Bie"]
@@ -7,23 +7,18 @@ class I2Cssh
7
7
  @servers = servers
8
8
  @ssh_environment = ssh_environment
9
9
 
10
- app_name = (i2_options.first[:iterm2]) ? 'iTerm2' : ((i2_options.first[:itermname]) ? i2_options.first[:itermname] : 'iTerm')
11
-
12
10
  raise Exception.new 'No servers given' if servers.empty?
13
11
 
14
12
  @sys_events = Appscript.app.by_name('System Events')
15
- @iterm = Appscript.app.by_name(app_name)
13
+ @iterm = Appscript.app.by_name("iTerm")
16
14
 
17
- @pane_menu = @sys_events.processes[app_name].menu_bars[1].menu_bar_items["Window"].menus["Window"].menu_items["Select Split Pane"].menus["Select Split Pane"]
18
- @shell_menu = @sys_events.processes[app_name].menu_bars[1].menu_bar_items["Shell"].menus["Shell"]
19
- @term = @iterm.make(:new => :terminal)
15
+ @pane_menu = @sys_events.processes["iTerm2"].menu_bars[1].menu_bar_items["Window"].menus["Window"].menu_items["Select Split Pane"].menus["Select Split Pane"]
16
+ @shell_menu = @sys_events.processes["iTerm2"].menu_bars[1].menu_bar_items["Shell"].menus["Shell"]
20
17
 
21
18
  @profile = i2_options.first[:profile] || "Default"
22
19
 
23
- @term.launch_(:session => "Default Session")
24
-
25
- maximize(app_name) if i2_options.first[:fullscreen]
26
-
20
+ @iterm.create_window_with_profile(@profile, :command => "/usr/bin/env bash -l")
21
+ @window = @iterm.current_window
27
22
 
28
23
  while !@servers.empty? do
29
24
  compute_geometry
@@ -35,11 +30,12 @@ class I2Cssh
35
30
  @ssh_environment.shift
36
31
 
37
32
  if !@servers.empty? && i2_options.first[:tabs] then
38
- # By default, a new session = a new tab
39
- @term.launch_(:session => "Default Session")
33
+ # @iterm.create_tab(@profile)
34
+ @window.create_tab_with_default_profile()
35
+ @session_index = 0
40
36
  end
41
37
  end
42
- @term.select(@term.sessions[1])
38
+ @window.select(@window.tabs[1])
43
39
  end
44
40
 
45
41
  private
@@ -55,13 +51,6 @@ class I2Cssh
55
51
  end
56
52
 
57
53
  def compute_geometry
58
- # Keep track of session index for multi-tab mode
59
- if @session_index then
60
- @session_index += @rows*@columns
61
- else
62
- @session_index = 0
63
- end
64
-
65
54
  # Create geometry when combining and ignore rows/columns preference
66
55
  if @servers.size > 1 && !@i2_options.first[:tabs]
67
56
  count = 0
@@ -95,26 +84,18 @@ class I2Cssh
95
84
  up = @pane_menu.menu_items["Select Pane Above"]
96
85
  down = @pane_menu.menu_items["Select Pane Below"]
97
86
 
98
-
99
- begin
100
- split_vert = @shell_menu.menu_items["Split Vertically"]
101
- split_hori = @shell_menu.menu_items["Split Horizontally"]
102
- split_vert.get
103
- split_hori.get
104
- rescue
105
- split_vert = @shell_menu.menu_items["Split Vertically with Current Profile"]
106
- split_hori = @shell_menu.menu_items["Split Horizontally with Current Profile"]
107
- end
87
+ split_vert = lambda { @window.current_session.split_vertically_with_same_profile }
88
+ split_hori = lambda { @window.current_session.split_horizontally_with_same_profile }
108
89
 
109
90
  splitmap = {
110
- :column => {0 => split_vert, 1 => left, 2 => split_hori, 3=> right, :x => @columns, :y => @rows},
91
+ :column => {0 => split_vert, 1 => left, 2 => split_hori, 3=> right, :x => @columns, :y => @rows},
111
92
  :row => {0 => split_hori, 1=> up, 2 => split_vert, 3=> down, :x => @rows, :y => @columns}
112
93
  }
113
94
  splitconfig = splitmap[@i2_options.first[:direction]]
114
95
 
115
96
  first = true
116
97
  2.upto splitconfig[:x] do
117
- splitconfig[0].click
98
+ splitconfig[0].call
118
99
  end
119
100
  2.upto splitconfig[:y] do
120
101
  1.upto splitconfig[:x] do
@@ -122,7 +103,7 @@ class I2Cssh
122
103
  first = false
123
104
  end
124
105
  splitconfig[:x].times do |x|
125
- splitconfig[2].click
106
+ splitconfig[2].call
126
107
  splitconfig[3].click
127
108
  end
128
109
  end
@@ -138,8 +119,10 @@ class I2Cssh
138
119
  old_size = 0
139
120
 
140
121
  1.upto(@rows*@columns) do |i|
141
- @term.sessions[@session_index + i].write :text => "/usr/bin/env bash -l"
142
-
122
+ tab = @window.current_tab
123
+ session = tab.sessions[i]
124
+ session.write :text => "/usr/bin/env bash -l"
125
+
143
126
  # Without the tab flag, combine all servers and clusters into one window
144
127
  if !@servers.empty? && (i - old_size) > @servers.first.size && !@i2_options.first[:tabs]
145
128
  old_size = @servers.first.size
@@ -164,18 +147,19 @@ class I2Cssh
164
147
 
165
148
  if !@ssh_environment.empty? && !@ssh_environment.first.empty? then
166
149
  send_env = "-o SendEnv=#{@ssh_environment.first.keys.join(",")}"
167
- @term.sessions[@session_index + i].write :text => "#{@ssh_environment.first.map{|k,v| "export #{k}=#{v}"}.join('; ')}"
150
+ session.write :text => "#{@ssh_environment.first.map{|k,v| "export #{k}=#{v}"}.join('; ')}"
168
151
  end
169
152
  if @i2_options.first[:sleep] then
170
153
  sleep @i2_options.first[:sleep] * i
171
154
  end
172
- @term.sessions[@session_index + i].write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\" && #{@ssh_prefix} #{send_env} #{server} ; exit"
155
+
156
+ session.write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\" && #{@ssh_prefix} #{send_env} #{server}"
173
157
  else
174
-
175
- @term.sessions[@session_index + i].write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\""
158
+
159
+ session.write :text => "unset HISTFILE && echo -e \"\\033]50;SetProfile=#{@profile}\\a\""
176
160
  sleep 0.3
177
- @term.sessions[@session_index + i].foreground_color.set "red"
178
- @term.sessions[@session_index + i].write :text => "stty -isig -icanon -echo && echo -e '#{"\n"*100}UNUSED' && cat > /dev/null"
161
+ session.foreground_color.set ([65535,0,0])
162
+ session.write :text => "stty -isig -icanon -echo && echo -e '#{"\n"*100}UNUSED' && cat > /dev/null"
179
163
  end
180
164
  end
181
165
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i2cssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter de Bie