Class: Reverie

Inherits:
Object
  • Object
show all
Defined in:
lib/reverie/version.rb,
lib/reverie/reverie.rb

Overview

Reverie version

Constant Summary collapse

DH_URI =
URI 'https://api.dreamhost.com/'
IP_URI =
URI 'http://myexternalip.com/raw'
CONF =
Configliere::DEFAULT_CONFIG_LOCATION[:user_config][:reverie]
OPENSSL_OPTIONS =
{
  use_ssl:     true,
  ssl_version: :TLSv1,
  verify_mode: OpenSSL::SSL::VERIFY_PEER
}
VERSION =
'1.0.4'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeReverie

Returns a new instance of Reverie.



43
44
45
46
47
48
49
# File 'lib/reverie/reverie.rb', line 43

def initialize
  Settings.resolve!

  init_conf
  init_log
  init_args
end

Instance Attribute Details

#argsObject

Returns the value of attribute args.



18
19
20
# File 'lib/reverie/reverie.rb', line 18

def args
  @args
end

#confObject

Returns the value of attribute conf.



18
19
20
# File 'lib/reverie/reverie.rb', line 18

def conf
  @conf
end

#logObject

Returns the value of attribute log.



18
19
20
# File 'lib/reverie/reverie.rb', line 18

def log
  @log
end

Class Method Details

.update_dnsObject



39
40
41
# File 'lib/reverie/reverie.rb', line 39

def self.update_dns
  Reverie.new.tap { |r| r.update_dns }
end

Instance Method Details

#get_ipObject



110
111
112
113
114
115
116
117
# File 'lib/reverie/reverie.rb', line 110

def get_ip
  log.debug "connecting to #{IP_URI}"
  ip = Net::HTTP.get_response(IP_URI).body.strip
  log.debug "got #{ip}"
  ip if ip =~ Resolv::IPv4::Regex
rescue Net::ReadTimeout
  log.warn :timeout, 'IP Lookup', IP_URI
end

#init_argsObject



51
52
53
54
55
56
57
# File 'lib/reverie/reverie.rb', line 51

def init_args
  @args = {
    key:    Settings[:key],
    record: Settings[:record],
    format: 'yaml'
  }
end

#init_confObject



59
60
61
62
# File 'lib/reverie/reverie.rb', line 59

def init_conf
  @conf = Settings.delete('conf') || CONF
  Settings.read conf
end

#init_logObject



64
65
66
67
68
# File 'lib/reverie/reverie.rb', line 64

def init_log
  @log = Logger.new(Settings.log || STDOUT)
  log.level = Settings.delete('debug') ? Logger::DEBUG : Logger::INFO
  Settings.delete('log') unless Settings.log
end

#replace_record(record, ip) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/reverie/reverie.rb', line 89

def replace_record(record, ip)
  return false unless record && ip

  status, res = api_call :list_records
  return false unless status == 'success'

  res.detect { |r| r['record'] == record && r['editable'] == 1 }.tap do |r|
    api_call :remove_record,
             record: record,
             type:   r['type'],
             value:  r['value'] if r
  end

  status, _ = api_call :add_record,
                       record:  record,
                       type:    'A',
                       value:   ip,
                       comment: "Reverie (#{ Time.now })"
  status == 'success'
end

#settingsObject



70
71
72
# File 'lib/reverie/reverie.rb', line 70

def settings
  Settings
end

#update_dnsObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/reverie/reverie.rb', line 74

def update_dns
  last_update = Time.now - (Settings[:updated_at] || Time.mktime(0))

  if (last_update < 900   and log.debug "too soon, updated #{last_update}s ago") ||
     ((ip = get_ip).nil?  and log.debug "get_ip failed") ||
     (ip == Settings[:ip] and log.debug "not updating #{Settings[:record]}") ||
     (!replace_record Settings[:record], ip and log.debug "replace_record failed")
    return
  end

  Settings.merge! ip: ip, updated_at: Time.now
  Settings.save! conf
  log.info "#{Settings[:record]} updated to #{ip}"
end