Конвертер привязок услуг 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)