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
Только авторизованные участники могут оставлять комментарии.