Имеем файл примерно следующего вида:
Цитата
Fri Apr 5 17:47:20 2013 us=121823 Client/46.53.195.37:3761 SENT CONTROL [Client]: 'PUSH_REPLY,ping 10,ping-restart 120,ifconfig 192.168.251.21 255.255.255.0' (status=1)
Fri Apr 5 17:53:15 2013 us=508263 Client/37.55.37.171:10013 SENT CONTROL [Client]: 'PUSH_REPLY,ping 10,ping-restart 120,ifconfig 192.168.251.22 255.255.255.0' (status=1)
Fri Apr 5 17:56:54 2013 us=543803 Client/95.111.208.249:1194 SENT CONTROL [Client]: 'PUSH_REPLY,ping 10,ping-restart 120,ifconfig 192.168.251.21 255.255.255.0' (status=1)
Это лог openvpn сервера. При подключении клиентов каждому выдается внутренний айпишник вида 192.168.251.xxx
Требуется узнать внешний ip адрес клиента, зная внутренний. То есть 192.168.251.21 мы знаем, а 95.111.208.249 вывести на канал. Пишу следующий скрипт:
Код
bind pub - !ip par
proc par {nick uhost hand chan text} {
set text [lindex [split $text] 0]
set file "/etc/openvpn/openvpn.log"
set rfile [read [open $file r]]
set rez [lindex [regexp -all -inline -- "Client\/(.*?):1194 SENT CONTROL.*?PUSH_REPLY,ping 10,ping-restart 120,ifconfig $text 255.255.255.0" $rfile] end]
putserv "PRIVMSG $chan :$rez"
}
Перепробовал различные маски - не работает. И вывести необходимо только последнее совпадение, так как за день один и тот же клиент может подключиться несколько раз. Это мы делаем с помощью lindex ... end