class TunnelBlick::Tunnel

Attributes

tunnel[RW]

Public Class Methods

new() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 10
def initialize
  @tunnel = Appscript.app('Tunnelblick.app')
  TunnelBlick.conn_sleep = 3.5 if TunnelBlick.conn_sleep.nil?
  shortlist_configs
end

Public Instance Methods

change_ip(allow_bare = false) click to toggle source
# File lib/tunnel_blick/ip_methods.rb, line 34
def change_ip (allow_bare = false)
  start_ip = TunnelBlick.my_ip

  if connected?
    disconnect
    sleep(3)

    if allow_bare
      return TunnelBlick.my_ip
    end
  end

  new_ip = start_ip.dup
  until new_ip != start_ip
    disconnect
    new_ip = connect_cycle
  end
  new_ip
end
change_ip_unique(reset = false) click to toggle source
# File lib/tunnel_blick/ip_methods.rb, line 54
def change_ip_unique (reset = false)

  TunnelBlick.set_unique_attempts(6) if TunnelBlick.uniq_tries.nil?
  @checked_ips = [] if @checked_ips.nil? || reset
  my_ip = change_ip
  counter = 1

  while @checked_ips.include?(my_ip) && counter < TunnelBlick.uniq_tries
    my_ip = change_ip
    counter += 1
  end
  @checked_ips << my_ip

  if counter == TunnelBlick.uniq_tries
    sputs "unique ip change failed after #{counter} tries"
    false
  else
    my_ip
  end

end
connect(num = nil, logging = true) click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 47
def connect (num = nil, logging = true)

  if num.nil?
    target = @shortlist.sample
  else
    target = @shortlist[num]
  end

  TunnelBlick.ip_db.disconnect
  Sequel::Model.db.disconnect
  print '*'

  tunnel.connect(target)
  until connected?
    sleep(1)
    print '.'
  end
  puts '$'
  sleep(TunnelBlick.conn_sleep)

  details = get_config_info(target)
  TunnelBlick.details = details
  my_ip = TunnelBlick.my_ip

  if logging

    info = details.dup
    info.public_ip = my_ip

    test_okay = false
    until test_okay
      sleep(3)
      conn1_okay = TunnelBlick.ip_db.test_connection
      sleep(1)
      conn2_okay = Sequel::Model.db.test_connection
      print '.'
      test_okay = conn1_okay && conn2_okay
    end
    puts '$'
    # Sequel::Model.db = TunnelBlick.ip_db
    TunnelBlick.try_log_info(info)
  end

  my_ip
end
connect_cycle(reset = false) click to toggle source
# File lib/tunnel_blick/ip_methods.rb, line 17
def connect_cycle (reset = false)

  last_num = @shortlist.size - 1

  if reset
    @cycle_num = 0
  else
    @cycle_num += 1
  end

  if @cycle_num > last_num
    @cycle_num = 0
  end
  disconnect if connected?
  connect(@cycle_num)
end
connect_same() click to toggle source
# File lib/tunnel_blick/ip_methods.rb, line 8
def connect_same

  if @cycle_num == -1
    @cycle_num = 0
  end

  connect(@cycle_num)
end
connected?() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 36
def connected?; vpn_states.include?('CONNECTED') end
current_config() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 38
def current_config
  if connected?
    position = vpn_states.index('CONNECTED')
    vpn_configs[position]
  else
    nil
  end
end
disconnect() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 93
def disconnect; tunnel.disconnect_all if connected? end
get_config_info(config) click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 16
def get_config_info (config)
  match_provider(config).parse_config(config)
end
match_provider(config_name) click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 95
def match_provider (config_name)

  case config_name
    when /\Amy_expressvpn.+/
      TunnelBlick::ExpressVPN
    else
      raise ArgumentError('VPN provider not recognized.')
  end

end
shortlist_configs() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 20
def shortlist_configs
  if TunnelBlick.countries.nil?
    @shortlist = vpn_configs
  else
    @shortlist = vpn_configs.select { |config|
      details = get_config_info(config)
      TunnelBlick.countries.include?(details.country)
    }
  end
  @cycle_num = -1
end
vpn_configs() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 34
def vpn_configs; tunnel.configurations.name.get end
vpn_states() click to toggle source
# File lib/tunnel_blick/tunnel.rb, line 32
def vpn_states; tunnel.configurations.state.get end