blind

DB

mysql> describe blacklist;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| date   | char(32)    | YES  |     | NULL    |                |
| date_b | char(32)    | YES  |     | NULL    |                |
| number | varchar(32) | NO   |     | NULL    |                |
| name   | char(64)    | YES  |     | NULL    |                |
| event  | char(32)    | YES  |     | NULL    |                |
| data   | char(64)    | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
mysql> describe unblock;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| date   | varchar(32) | YES  |     | NULL    |                |
| date_b | varchar(32) | YES  |     | NULL    |                |
| number | char(64)    | YES  |     | NULL    |                |
| event  | char(64)    | YES  |     | NULL    |                |
| data   | char(64)    | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+

func_odbc.conf

[blacklist_exists]
dsn=asterisk
prefix=ODBC
readsql=SELECT 1 FROM blacklist WHERE number = '${SQL_ESC(${ARG1})}'
 
[blacklist_timeout]
dsn=asterisk
prefix=ODBC
readsql=SELECT date FROM blacklist WHERE number = '${SQL_ESC(${ARG1})}'
 
[blacklist_write]
dsn=asterisk
prefix=ODBC
writesql=${VALUE}
 
[blacklist_del]
dsn=asterisk
prefix=ODBC
writesql=${VALUE}

extensions.conf

[sub-blacklist]
exten => s,1,Noop(blacklist)
; Наперво, проверяем существует ли номер в черном списке. 
; 10 впереди, чтобы не было WARNING на пустую переменную, если номер не найден.
  same => n,set(exists=10${ODBC_blacklist_exists(${ARG1})})
  same => n,gotoif($[${exists} = 101]?deny:allow)
; Если существует, проверяем дату - 3218832000 вечный бан (приоритет blacklist).   
; Если дата другая, проверяем истекло ли время бана (приоритет timeout).
    same => n(deny),gotoif($[${ODBC_blacklist_timeout(${ARG1})} = 3218832000]?blacklist:timeout)
     same => n(timeout),set(timeout=$[${STRFTIME(,,%s)} - ${ODBC_blacklist_timeout(${ARG1})}])
  same => n,verbose(${timeout})
; 1209600 - 14 дней бана в секундах (14 * 3600). 
; Если время прошедшее с даты бана превышает 1209600 запись из БД удаляется
; и разрешается вызов. Иначе выполн. приоритет blasklist14 
  same => n,gotoif($[${timeout} > 1209600]?delete:blacklist14)
  same => n(delete),set(ODBC_blacklist_del()=${SQL_ESC(DELETE from blacklist WHERE number=${ARG1})})
  same => n,set(ODBC_blacklist_write()=INSERT INTO unblock (date, number, event) VALUES (${STRFTIME(,,%s)}, ${ARG1}, '${URIENCODE(14 дней)}'))
   same => n(allow),return
    same => n(blacklist),queuelog(NONE,${UNIQUEID},NONE,TRY,${CALLERID(num)}|${URIENCODE(вечный)})
  same => n,Playback(/var/lib/asterisk/sounds/audio/blocked_forever)
  same => n,hangup
    same => n(blacklist14),queuelog(NONE,${UNIQUEID},NONE,TRY,${CALLERID(num)}|${URIENCODE(14 дней)}|${ODBC_blacklist_timeout(${ARG1})})
    same => n,Playback(/var/lib/asterisk/sounds/audio/blocked_before)
  same => n,set(CHANNEL(language)=ru)
  same => n,wait(0.5)
  same => n,set(expiration=$[${ODBC_blacklist_timeout(${ARG1})} + 1209600])
;сообщает день-(d), месяц-(B) и день недели -(A) истечения периода банa.
  same => n,sayunixtime(${expiration},,dBA) 
  same => n,Playback(/var/lib/asterisk/sounds/audio/blocked_after)
  same => n,hangup
Только авторизованные участники могут оставлять комментарии.
  • blog/blind.txt
  • Последние изменения: 2018/07/31