class PickynodeBCHD

Allows you to easily add/remove/connect/disconnect nodes based on User Agent.

Constants

VERSION

Public Class Methods

new(opts = {}) click to toggle source
# File lib/pickynode_bchd.rb, line 14
def initialize(opts = {})
  @opts = opts
end

Public Instance Methods

add(filter, limit = nil) click to toggle source
# File lib/pickynode_bchd.rb, line 18
def add(filter, limit = nil)
  return unless filter

  validate_limit(limit)

  blockchair_addr_types
    .select { |_, v| v.include?(filter) }
    .each_with_index do |(k, _), i|
      break if limit == i

      run_cmd(%(bchctl addnode "#{k}" add))
    end
end
clear_cache() click to toggle source
# File lib/pickynode_bchd.rb, line 92
def clear_cache
  @addr_types = nil
  @blockchair_addr_types = nil
end
connect(filter, limit = nil) click to toggle source
# File lib/pickynode_bchd.rb, line 46
def connect(filter, limit = nil)
  return unless filter

  validate_limit(limit)

  blockchair_addr_types
    .select { |_, v| v.include?(filter) }
    .each_with_index do |(k, _), i|
      break if limit == i

      run_cmd(%(bchctl node connect "#{k}"))
    end
end
disconnect(filter, limit = nil) click to toggle source
# File lib/pickynode_bchd.rb, line 60
def disconnect(filter, limit = nil)
  return unless filter

  validate_limit(limit)

  addr_types
    .select { |_, v| v.include?(filter) }
    .each_with_index do |(k, _), i|
      break if limit == i

      run_cmd(%(bchctl node disconnect "#{k}"))
    end
end
display() click to toggle source
# File lib/pickynode_bchd.rb, line 74
def display
  ap addr_types
end
info() click to toggle source
# File lib/pickynode_bchd.rb, line 78
def info
  ap getinfo
end
remove(filter, limit = nil) click to toggle source
# File lib/pickynode_bchd.rb, line 32
def remove(filter, limit = nil)
  return unless filter

  validate_limit(limit)

  addr_types
    .select { |_, v| v.include?(filter) }
    .each_with_index do |(k, _), i|
      break if limit == i

      run_cmd(%(bchctl node remove "#{k}"))
    end
end
run() click to toggle source
# File lib/pickynode_bchd.rb, line 82
def run
  add(@opts[:add], @opts[:limit])
  connect(@opts[:connect], @opts[:limit])

  remove(@opts[:remove], @opts[:limit])
  disconnect(@opts[:disconnect], @opts[:limit])

  display_info
end

Private Instance Methods

addr_types() click to toggle source
# File lib/pickynode_bchd.rb, line 109
def addr_types
  return @addr_types if @addr_types

  nodes = getpeerinfo
  parsed_nodes = JSON.parse(nodes)
  @addr_types = parsed_nodes.map do |n|
    [n['addr'], n['subver']]
  end.to_h
rescue JSON::ParserError
  {}
end
blockchair_addr_types() click to toggle source
# File lib/pickynode_bchd.rb, line 121
def blockchair_addr_types
  return @blockchair_addr_types if @blockchair_addr_types

  parsed_nodelist = JSON.parse(blockchair_snapshot)
  @blockchair_addr_types = parsed_nodelist['data']['nodes'].transform_values do |v|
    v['version']
  end
rescue JSON::ParserError
  {}
end
blockchair_snapshot() click to toggle source
# File lib/pickynode_bchd.rb, line 132
def blockchair_snapshot
  Net::HTTP.get(URI.parse('https://api.blockchair.com/bitcoin-cash/nodes'))
end
display_info() click to toggle source
# File lib/pickynode_bchd.rb, line 99
def display_info
  info if @opts[:info]
  display if @opts.values.select { |v| v }.empty?
end
getinfo() click to toggle source
# File lib/pickynode_bchd.rb, line 136
def getinfo
  JSON.parse(`bchctl getinfo`)
rescue JSON::ParserError
  {}
end
getpeerinfo() click to toggle source
# File lib/pickynode_bchd.rb, line 142
def getpeerinfo
  `bchctl getpeerinfo`
end
run_cmd(cmd) click to toggle source
# File lib/pickynode_bchd.rb, line 104
def run_cmd(cmd)
  puts "Running #{cmd}" if @opts[:output] || @opts[:debug]
  `#{cmd}` unless @opts[:debug]
end
validate_limit(limit) click to toggle source
# File lib/pickynode_bchd.rb, line 146
def validate_limit(limit)
  return unless limit
  raise 'Limit must be greater than 0' unless limit > 0
end