<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https:///index.php?action=history&amp;feed=atom&amp;title=COA_new_version</id>
	<title>COA new version - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=COA_new_version"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:22:36Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv: /* Ситуации, требующие две очереди */</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2023-07-11T07:43:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ситуации, требующие две очереди&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Описание===&lt;br /&gt;
COA это модуль ядра, который периодически просматривает данные абонентов (параметры авторизации, доступ, баланс и т.д) и в случае их изменения отправляет команды на оборудование. Например, при изменении тарифа, не сбрасывая сессию, он может послать команду на изменение скорости. Либо при уходе баланса в минус послать команду блокировки.&lt;br /&gt;
&lt;br /&gt;
Используется совместно с Radius и устраняет его недостаток - когда данные соединения (ip, скорости, сервисы) устанавливаются только в момент подключения.&lt;br /&gt;
&lt;br /&gt;
===Настройка===&lt;br /&gt;
&lt;br /&gt;
Конфиг /usr/local/nodeny/modules/coa/create.cfg.coa.cfg.pm.&lt;br /&gt;
&lt;br /&gt;
Здесь вы можете увидеть, что coa отсылаются стандартной утилитой radclient (из пакета freeradius). Вы должны убедиться в правильности пути к этой утилите в параметре $radclient - на Linux и FreeBSD пути различаются.&lt;br /&gt;
&lt;br /&gt;
Также в $radclient прописаны ключи, некоторые из которых вы можете подтюнить:&lt;br /&gt;
* t - сколько секунд ждем coa-ответа от устройства, после чего посылаем повторный пакет. Этот параметр зависит от того насколько долго идет пакет от сервера с модулем COA до самого дальнего BRAS. И обратно. Естественно, необходимо накинуть время на обработку пакетов BRAS и разные непредвиденные ситуации. Большой таймаут тоже не следует делать ибо этим вы уменьшаете время реакции, т.е. управление будет запаздывать. Тем не менее, в первую очередь важна надежность, поэтому важен баланс, но с гарантированным запасом.&lt;br /&gt;
* r - сколько попыток слать пакет. Если 2, то после первой неудачной посылается еще один. COA использует протокол UDP, поэтому могут быть ситуации, когда пакет потеряется. Две попытки нормальный вариант.&lt;br /&gt;
* p - максимальное одновременное количество coa-пакетов. Когда примерно в одно время изменяются данных большого количества абонентов, например, списание за услуги с последующей блокировкой, на BRAS идет большое количество coa-пакетов. Если их отправлять последовательно, то это может занять большое количество времени. Поэтому пакеты посылаются параллельно в несколько потоков. Какое количество установить - зависит от производительности ваших BRAS...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для разных ситуаций, в coa могут посылаться разные пакеты:&lt;br /&gt;
* В '''$coa_connect__state_on''' атрибуты, которые посылаются когда подключен абонент, которому разрешен доступ в интернет&lt;br /&gt;
* В '''$coa_connect__no_money''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет по причине минусового баланса&lt;br /&gt;
* В '''$coa_connect__state_off''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет либо не подключен тариф доступа в интернет&lt;br /&gt;
* В '''$coa_disconnect''' атрибуты, которые посылаются когда абонент отключается (перестает быть авторизованным)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Если в определенной ситуации вы не хотите отсылать пакет, просто закомментируйте данную переменную&lt;br /&gt;
* Если вы закомментируете $coa_connect__no_money, то в случае недостачи финансов будет использоваться $coa_connect__state_off&lt;br /&gt;
* Скорее всего вам не понадобится $coa_disconnect&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В переменных могут использоваться два набора атрибутов, с ключами 1  и 2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$coa_connect__state_on = {&lt;br /&gt;
    1 =&amp;gt; [&lt;br /&gt;
            атрибуты, которые посылаются в первую очередь&lt;br /&gt;
    ],&lt;br /&gt;
    2 =&amp;gt; [&lt;br /&gt;
            атрибуты, которые посылаются во вторую очередь&lt;br /&gt;
    ]&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зачем нужны очереди? Для некоторых ситуаций, которых у вас может и не быть (тогда используйте только либо ключ 1 либо 2).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
====Ситуации, требующие две очереди====&lt;br /&gt;
&lt;br /&gt;
Например, мы управляем скоростью с помощью сервисов:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERX-Service-Activate:1=&amp;quot;svc-global-ipoe(1000000,1000000)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если возникнет необходимость изменить сервис, то мы сначала его деактивируем, а потом устанавливаем иной. Либо этот же, но с другими параметрами. В этом случае, мы посылаем такой пакет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acct-Session-Id=12345,&lt;br /&gt;
ERX-Service-Deactivate=&amp;quot;svc-global-ipoe&amp;quot;,&lt;br /&gt;
ERX-Service-Activate:1=&amp;quot;svc-global-ipoe(1000000,1000000)&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако, здесь есть проблема: если сервис svc-global-ipoe не был установлен, то будет ошибка и пакет будет проигнорирован, т.е. ERX-Service-Activate:1=&amp;quot;svc-global-ipoe(1000000,1000000)&amp;quot; не выполнится.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Эту проблему можно было бы решить с помощью запоминания была ли установлена эта услуга ранее (что ненадежно и сложно) либо опроса BRAS (что медленно, а при большом количестве абонентов очень медленно). Поэтому, рекомендуется вариант: сначала удаляем все возможные сервисы, а потом устанавливаем тот, что нужен.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Таким образом, чтобы гарантированно выполнился ERX-Service-Activate:1=&amp;quot;svc-global-ipoe(1000000,1000000)&amp;quot;, необходимо чтобы ERX-Service-Deactivate=&amp;quot;svc-global-ipoe&amp;quot; был прислан в отдельном пакете. Однако, мы должны учитывать теоретическую ситуацию когда пакеты могут прийти в ином порядке - когда ранее посланный пакет может прийти после позже посланного.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Для этого используются 2 очереди. Все пакеты на отключения посылаются в очереди 1. Причем они посылаются параллельно. Это пакеты не обязательно для одного ip. Их может быть много, если в данную секунду изменились данные многих абонентов. Например, пошлет 100 пакетов в 20 потоков. И только когда на все 100 будут получены ответы (ну или выйдет таймаут) произойдет отправка пакетов из очереди 2, таким же параллельным образом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Формат пакетов==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$coa_connect__state_on = {&lt;br /&gt;
    1 =&amp;gt; [&lt;br /&gt;
            'Acct-Session-Id={{auth_ses}}, ERX-Service-Activate:1=&amp;quot;pppoe_local({{speed_in1_mb}}m,{{speed_out1_mb}}m)&amp;quot;'&lt;br /&gt;
    ]&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двойных фигурных скобках можно указать данные конкретного абонента, например:&lt;br /&gt;
&lt;br /&gt;
* ip - ip адрес&lt;br /&gt;
* auth_ses - имя сессии&lt;br /&gt;
* speed_in1 - входящая скорость в битах&lt;br /&gt;
* speed_in1_kb - входящая скорость в килобитах&lt;br /&gt;
* speed_in1_mb -  входящая скорость в мегабитах&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Если в параметрах авторизации будет параметр nas''' - coa пакет будет послан на сервер, ip которого берется из nas. В противном случае пакет будет послан на ip, указанный в конфиге:&lt;br /&gt;
&lt;br /&gt;
[[Файл:nas_in_auth_properties.png]]&lt;br /&gt;
&lt;br /&gt;
===Запуск===&lt;br /&gt;
&lt;br /&gt;
С выводом в консоль:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perl noserver.pl -v -g=coa.cfg.pm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скорее всего, вам понадобится ипользовать ключ '''-i''' для того, чтобы отправлялись пакеты $coa_connect__state_off и $coa_connect__no_money&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>