bin/i2cssh in i2cssh-1.3.4 vs bin/i2cssh in i2cssh-1.4.0

- old
+ new

@@ -1,23 +1,91 @@ #!/usr/bin/ruby require 'rubygems' require 'optparse' require 'i2cssh' +require 'yaml' +require 'pp' +config_file = File.expand_path "~/.i2csshrc" -i2_options, ssh_options, servers = {}, [], [] +i2_options, ssh_options, servers, clusters, login_from_cli = {}, [], [], {}, false +if File.exists?(config_file) + config_hash = YAML.load File.read config_file + + # Read config and set defaults from config + if config_hash["version"] && config_hash["version"].to_i >= 2 then + clusters = config_hash["clusters"] + + # Options from the config file + i2_options[:iterm2] = config_hash["iterm2"] + i2_options[:login_override] = config_hash["login"] + i2_options[:broadcast] = config_hash["broadcast"] + + else + # Convert version 1 format to version 2 + clusters = config_hash["clusters"].inject({}){|m, c| m[c[0]] = {"hosts" => c[1]}; m} + end + +end + optparse = OptionParser.new do |opts| opts.banner = "Usage: #{File.basename(__FILE__)} [options]" + # Check if we have a cluster. + opts.on '-c', '--cluster CLUSTERNAME', + 'Name of the cluster specified in ~/.i2csshrc' do |c| + + if c =~ /(.+)@(.+)/ then + login_from_cli = $1 + c = $2 + end + + cluster = clusters[c] + + if clusters + cluster_hosts = cluster["hosts"] + + i2_options[:login_override] = cluster["login"] || i2_options[:login_override] + i2_options[:login_override] = login_from_cli if login_from_cli + i2_options[:broadcast] = cluster["broadcast"] || i2_options[:broadcast] + + servers += cluster_hosts + else + puts "ERROR: unknown cluster #{c}" + puts optparse.help + exit 1 + end + end + + opts.on '-m', '--machines a,b,c', Array, + 'Comma-separated list of hosts' do |h| + h.each do |host| + if host =~ /(.+)@(.+)/ then + i2_options[:login_override] = $1 + host = $2 + end + servers << host + end + end + + # Hosts + opts.on '-f', '--file FILE', + 'Cluster file (one hostname per line)' do |f| + servers += File.read(f).split "\n" + end + + # Command line options override config file + # SSH options opts.on '-A', '--forward-agent', 'Enable SSH agent forwarding' do ssh_options << '-A' end opts.on '-l', '--login LOGIN', 'SSH login name' do |u| - ssh_options << "-l #{u}" + i2_options[:login_override] = u + end # iTerm2 options opts.on '-F', '--fullscreen', 'Make the window fullscreen' do @@ -39,43 +107,29 @@ end opts.on '-b', '--broadcast', 'Start with broadcast input (DANGEROUS!)' do i2_options[:broadcast] = true end + opts.on '-nb', '--nobroadcast', + 'Disable broadcast' do + i2_options[:broadcast] = false + end opts.on '-p', '--profile PROFILE', 'Name of the iTerm2 profile (default: Default)' do |p| i2_options[:profile] = p puts p end opts.on "-2", '--iterm2', 'Use iTerm2 instead of iTerm' do i2_options[:iterm2] = true end - # Hosts - opts.on '-f', '--file FILE', - 'Cluster file (one hostname per line)' do |f| - servers += File.read(f).split "\n" - end - opts.on '-c', '--cluster CLUSTERNAME', - 'Name of the cluster specified in ~/.i2csshrc' do |c| - require 'yaml' - config_hash = YAML.load File.read File.expand_path '~/.i2csshrc' - cluster = config_hash["clusters"][c] - if cluster - servers += cluster - else - puts "ERROR: unknown cluster #{c}" - puts optparse.help - exit 1 - end - end - opts.on '-m', '--machines a,b,c', Array, - 'Comma-separated list of hosts' do |h| - servers += h - end end optparse.parse! + +if i2_options[:login_override] then + ssh_options << "-l #{i2_options[:login_override]}" +end if servers.empty? puts "ERROR: no servers given" puts optparse.help exit