IX2015のIPSec再設定スクリプト

#!/usr/local/bin/ruby

# check per min

require 'rubygems'
require 'open-uri'
require 'oauth'
require 'net/telnet'

# ip setting
src_site = "AAAA"
dst_site  = "BBBB"
dst_host = "example.com"
router_ip = "10.3.1.1"
tftp_server_ip = "10.3.2.15"
basedir = "/usr/local/adm/globalip/"
id_rsa = "/usr/local/adm/.ssh/globalip_BBBB"
#---
src_file = basedir + "ipaddress.txt"
dst_new_file = basedir + dst_site + "_ipaddress.txt"
dst_old_file = basedir + dst_site + "_ipaddress_old.txt"
send_to = "hogehogehoge@" + dst_host + ":" + basedir + src_site + "_ipaddress.txt"

# get time of day
day_msg = "*** CHANGE *** [" + Time.now.strftime( "%Y/%m/%d-%H:%M" ) + "] " + src_site + ": "

# get hostname
hostname = open( "| hostname" ).gets

# get current ip address from ix2015 by snmp
new_ipaddr = open( "| /usr/local/bin/snmpwalk -v 1 -c public " + router_ip + " ipAdEntAddr | grep -v \" 10.\" | cut -d \" \" -f 4" ).gets

# get old ip address from local file
old_ipaddr = open( src_file ).gets

  fork { exec( "scp -i " + id_rsa + " " + src_file + " " + send_to ) }
# update ddns
if ( new_ipaddr != old_ipaddr ) then
  ############################################################
  ### twit
  CONSUMER_KEY = 'XXXXXXXXXXX'
  CONSUMER_SECRET = 'XXXXXXXXXXXX'
  ACCESS_TOKEN = 'XXXXXXXXXXXXX'
  ACCESS_TOKEN_SECRET = 'XXXXXXXXXXX'

  consumer = OAuth::Consumer.new(
    CONSUMER_KEY,
    CONSUMER_SECRET,
    :site => 'http://twitter.com'
  )
  access_token = OAuth::AccessToken.new(
    consumer,
    ACCESS_TOKEN,
    ACCESS_TOKEN_SECRET
  )
  response = access_token.post(
    'http://twitter.com/statuses/update.json',
    'status'=> "@yogata " + day_msg + new_ipaddr + " by " + hostname
  )

  ############################################################
  ### log
  fp = File.open( src_file, "w" )
  fp.write( new_ipaddr )
  fp.close

  # update ipaddress file to fukuoka
  fork { exec( "scp -P 20022 -i " + id_rsa + " " + src_file + " " + send_to ) }
end

# check dst update
new_ip = open( dst_new_file ).gets.chomp
old_ip = open( dst_old_file ).gets.chomp
if ( new_ip != old_ip ) then
  # connect server
  telnet = Net::Telnet.new("Host" => router_ip )
  
  # get router name
  String routername = ""
  telnet.cmd("svintr-config").each {|c|
    if ( c.index("#") != nil && c.index("(config") == nil) then
        routername = c.sub(/^(.*)#.*/,'\1').chomp
    end
  }
  if routername == "" then
    p "can't get router name"
    return
  end
  
  # reset ipsec & upload config
  telnet.cmd("term len 0")
  telnet.cmd("show run").each {|c|
    if /ike policy ike_policy_#{dst_site} peer/ =~ c then
      telnet.cmd("no " + c)
    elsif /ipsec autokey-map ipsec_map_#{dst_site} #{src_site}_to_#{dst_site} peer/ =~ c then
      telnet.cmd("no " + c)
    end
  }
  telnet.cmd("ike policy ike_policy_#{dst_site} peer " + new_ip + " key hoge ike_proposal")
  telnet.cmd("ipsec autokey-map ipsec_map_#{dst_site} #{src_site}_to_#{dst_site} peer " + new_ip + " ipsec_proposal")
  telnet.cmd("write memory")
#  sleep 60
  telnet.cmd("tftp put startup-config " + tftp_server_ip + ":" + routername + "_" + Time.now.strftime("%Y%m%d_%H%M_config.log"))
  telnet.cmd("exit")

  # update old file
  fork { exec( "cp -f " + dst_new_file + " " + dst_old_file ) }
end