class Console

Tmux integration

Public Class Methods

attach(session:, window: nil, pane: nil) click to toggle source
# File lib/opsconsole/console.rb, line 69
def self.attach(session:, window: nil, pane: nil)
  select_pane(session: session,
              window: window,
              pane: pane)
  attach_session(session: session,
                 window: window,
                 pane: pane)
end
attach_session(session:, window: nil, pane: nil) click to toggle source
# File lib/opsconsole/console.rb, line 4
def self.attach_session(session:, window: nil, pane: nil)
  sh(%W[attach -t =#{session}:#{window}.#{pane}])
end
create(session:, window:, user:, hosts:, commands:, synchronize:) click to toggle source
# File lib/opsconsole/console.rb, line 93
def self.create(session:, window:, user:, hosts:, commands:, synchronize:)
  return if present?(target: "=#{session}:#{window}.1")

  if present?(target: "=#{session}:")
    create_window(session: session,
                  window: window)
  else
    create_session(session: session,
                   window: window)
  end

  create_panes(session: session,
               window: window,
               user: user,
               hosts: hosts,
               commands: commands)

  set_window_option(session: session,
                    window: window,
                    option: 'synchronize-panes',
                    value: synchronize ? 'on' : 'off')
end
create_panes(session:, window:, user:, hosts:, commands:) click to toggle source
# File lib/opsconsole/console.rb, line 116
def self.create_panes(session:, window:, user:, hosts:, commands:)
  hosts.size.downto(2) do |h|
    width = 100 / h
    split_window(session: session,
                 window: window,
                 pane: 1,
                 direction: 'h',
                 size: width)
  end

  hosts.size.downto(1) do |h|
    host = hosts[h - 1]
    ssh = "ssh -tt -o ConnectTimeout=2 #{user}@#{host}"
    commands = [ssh] if commands.empty?
    commands.size.downto(1) do |c|
      command = "#{ssh} '#{commands[c - 1]}'"
      split_window(session: session,
                   window: window,
                   pane: h,
                   direction: 'v',
                   size: 100 / c,
                   command: command)
    end
    kill_pane(session: session,
              window: window,
              pane: h)
  end

  select_pane(session: session,
              window: window,
              pane: 1)
end
create_session(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 149
def self.create_session(session:, window:)
  new_session(session: session,
              window: window)
  set_option(session: session,
             option: 'base-index',
             value: 1)
  set_option(session: session,
             option: 'pane-border-status',
             value: 'top')
  set_option(session: session,
             option: 'pane-border-format',
             value: '#{pane_index}')
  set_option(session: session,
             option: 'status-left-length',
             value: session.size + 4)
  set_option(session: session,
             option: 'status-right',
             value: ['#{session_name}',
                     '#{window_name}',
                     '#{pane_index}'].join(':'))
  set_window_option(session: session,
                    window: window,
                    option: 'pane-base-index',
                    value: 1)
end
create_window(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 175
def self.create_window(session:, window:)
  new_window(session: session,
             window: window)
  set_window_option(session: session,
                    window: window,
                    option: 'pane-base-index',
                    value: 1)
end
destroy(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 78
def self.destroy(session:, window:)
  if session.nil?
    STDERR.puts 'can not find session'
  elsif window.nil?
    kill_session(session: session)
  else
    kill_window(session: session,
                window: window)
  end
end
kill_pane(session:, window:, pane:) click to toggle source
# File lib/opsconsole/console.rb, line 16
def self.kill_pane(session:, window:, pane:)
  sh(%W[killp -t =#{session}:#{window}.#{pane}])
end
kill_session(session:) click to toggle source
# File lib/opsconsole/console.rb, line 12
def self.kill_session(session:)
  sh(%W[kill-session -t =#{session}:])
end
kill_window(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 20
def self.kill_window(session:, window:)
  sh(%W[killw -t =#{session}:#{window}.])
end
list() click to toggle source
# File lib/opsconsole/console.rb, line 89
def self.list
  list_panes
end
list_panes() click to toggle source
# File lib/opsconsole/console.rb, line 24
def self.list_panes
  fmt = ['#{session_name}',
         '#{window_name}',
         '#{window_active}',
         '#{pane_index}',
         '#{pane_active}'].join(' ')
  sh(%W[lsp -a -F #{fmt}])
end
new_session(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 33
def self.new_session(session:, window:)
  sh(%W[new -d -s #{session} -n #{window}])
end
new_window(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 37
def self.new_window(session:, window:)
  sh(%W[neww -t #{session} -n #{window}])
end
present?(target:) click to toggle source
# File lib/opsconsole/console.rb, line 41
def self.present?(target:)
  sh(%W[has -t #{target}].push(err: File::NULL))
end
select_pane(session:, window:, pane:) click to toggle source
# File lib/opsconsole/console.rb, line 61
def self.select_pane(session:, window:, pane:)
  sh(%W[selectp -t =#{session}:#{window}.#{pane}])
end
select_window(session:, window:) click to toggle source
# File lib/opsconsole/console.rb, line 65
def self.select_window(session:, window:)
  sh(%W[selectw -t =#{session}:#{window}.])
end
set_option(session:, option:, value:) click to toggle source
# File lib/opsconsole/console.rb, line 45
def self.set_option(session:, option:, value:)
  sh(%W[set -t =#{session}: #{option} #{value}])
end
set_window_option(session:, window:, option:, value:) click to toggle source
# File lib/opsconsole/console.rb, line 49
def self.set_window_option(session:, window:, option:, value:)
  sh(%W[setw -t =#{session}:#{window}. #{option} #{value}])
end
sh(args) click to toggle source
# File lib/opsconsole/console.rb, line 8
def self.sh(args)
  system('tmux', '-L', 'opsconsole', *args)
end
split_window(session:, window:, pane:, direction:, size:, command: nil) click to toggle source
# File lib/opsconsole/console.rb, line 53
def self.split_window(session:, window:, pane:, direction:, size:, command: nil)
  if command.nil?
    sh(%W[splitw -t =#{session}:#{window}.#{pane} -#{direction} -p #{size}])
  else
    sh(%W[splitw -t =#{session}:#{window}.#{pane} -#{direction} -p #{size} #{command}])
  end
end