Конвертер привязок услуг dialup в привязки ipn

Материал из BiTel WiKi

Версия от 07:13, 6 августа 2010; Cromeshnic (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Ниже приводится ruby-скрипт для автоматического создания привязок в модуле ipn по конфигу модуля pppoe

На вход скрипту подаются строки конфигурации модуля dialup вида:

netflow.service.link.9=1 IN 10.0.0.0-10.0.0.32
netflow.service.link.10=2 OUT 10.0.0.0-10.0.0.32

В теле скрипта указываются:

  • доступ к базе данных
  • пароль, логин в клиенте и урл сервера биллинга
  • id изменяемого плана привязок ("План по умолчанию" имеет id=0)
  • mid модуля ipn
  • начальная позиция привязок ipn
  • шаг позиций
  • дата, с которой открывать новые привязки (старые закрываются датой на день меньше)
  • массив соответствия услуг модуля dial-up -> ipn

Запуск скрипта:

$cat dialup-conf.txt | ruby <имя скрипта>.rb

Код скрипта:

require 'rubygems'
require 'mysql'
require 'uri'
require 'cgi'
require 'date'
require 'net/http'
require 'rexml/document'
require 'iconv'
include REXML
 
 
class Helper
        def self.get_uri(uri_str)
           response = Net::HTTP.get_response(URI.parse(uri_str))
           case response
           when Net::HTTPSuccess
                 response
           when Net::HTTPRedirection
                 fetch(response['location'], limit-1)
           else
                 response.error!
           end
           return response.body.to_s
        end
 
 
        def self.exec_bgb(uri, ignore=nil)
	   user="admin"
	   pswd="admin"
 
           s = get_uri("http://127.0.0.1:8080/bgbilling/executer?user=#{user}&pswd=#{pswd}&#{uri}")
           ret = REXML::Document.new(s)
           return ret if ignore
           if ret.root.attributes['status'] != 'ok'
                 STDERR.puts "WARN: -- #{uri}"
                 STDERR.puts Iconv.new('utf-8','cp1251').iconv(ret.to_s)
           end
           return ret
        end
 
	# Converts an IP string to integer
	def self.ip2int(ip)
		return 0 unless ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
		v = ip.split('.').collect { |i| i.to_i }
		return (v[0] << 24) | (v[1] << 16) | (v[2] << 8 ) | (v[3]);
        end
 
end
 
con = Mysql.new('localhost', 'bill', 'bgbilling', 'bgbilling')
con.query("set names utf8")
 
#Экземпляр модуля ipn
mid=1
#Глобальный план привязок, который мы будем менять 
plan_id=123
#Дата, которой будем открывать новые привязки
date = Date.civil(2010,8,1)
#Позиция, с которой начинаем
counter=50
#Шаг для позиций
inc=2
#Массив соответствий услуг dialup -> ipn
sids = Array.new
sids[7]=77
sids[8]=78
sids[9]=22
sids[10]=23
 
####	Закрываем все открытые привязки предыдущей датой
rs = con.query("select id, direct, sid, pos, diff_serv, iface, port1, port2, source, addr1, addr2, comment ,DATE_FORMAT(date1,'%d.%m.%Y') date1 from ipn_service_#{mid} where date2 is null and plan_id=#{plan_id}")
rs.each_hash do |h|
	id = h["id"];
	direct = h["direct"]
	sid = h["sid"]
	pos = h["pos"]
	diff_serv = h["diff_serv"]
	iface = h["iface"]
	port1 = h["port1"]
	port2 = h["port2"]
	source = h["source"]
	addr1 = h["addr1"]
	addr2 = h["addr2"]
	comment = Iconv.new('cp1251','utf-8').iconv(h["comment"])
	date1 = h["date1"]
 
 
	Helper.exec_bgb("id=#{id}&module=ipn&plan=#{plan_id}&data=direct%3D#{direct}%2Csid%3D#{sid}%2Cpos%3D#{pos}%2CdiffServ%3D#{diff_serv}%2Ciface%3D#{iface}%2Cport2%3D#{port2}%2Cport1%3D#{port1}%2Csource%3D#{source}%2Caddr1%3D#{addr1}%2Caddr2%3D#{addr2}%2Cdate2%3D#{(date-1).day}.#{(date-1).mon}.#{(date-1).year}%2Ccomment%3D#{URI.escape(comment)}%2Cdate1%3D#{date1}&action=UpdateServiceLink&mid=#{mid}&")
 
end
 
####	Парсим входной конфиг и создаем новые привязки
while str=$stdin.gets
	next if str[0..0]=="#"
	if (/netflow\.service\.link\.\d+\s?=(\d+) (\w+) (\d+\.\d+\.\d+\.\d+)(-\d+\.\d+\.\d+\.\d+)?/ =~ str)!=nil
		id="new"
		direct=($2=="IN"? "2":"1")
		sid=sids[$1.to_i]
		pos=counter
		diff_serv=""
		iface=-1
		port1=0
		port2=65535
		source=0
		addr1=$3
		addr2=($4==nil ? addr1 : $4[1..-1])
		comment = $2+" "+addr1+($4==nil ? "" : $4)
		date1=date.day.to_s+"."+date.mon.to_s+"."+date.year.to_s
 
		Helper.exec_bgb("id=#{id}&module=ipn&plan=#{plan_id}&data=direct%3D#{direct}%2Csid%3D#{sid}%2Cpos%3D#{pos}%2CdiffServ%3D#{diff_serv}%2Ciface%3D#{iface}%2Cport2%3D#{port2}%2Cport1%3D#{port1}%2Csource%3D#{source}%2Caddr1%3D#{Helper.ip2int(addr1)}%2Caddr2%3D#{Helper.ip2int(addr2)}%2Cdate2%3D%2Ccomment%3D#{URI.escape(comment)}%2Cdate1%3D#{date1}&action=UpdateServiceLink&mid=#{mid}&")
		counter+=inc
	else
		print str
	end
 
end

--Cromeshnic 07:13, 6 августа 2010 (UTC)

Личные инструменты