LEDE PtokaX 0.5.0.1-1 [DCBEELINEKZ VERSION]
Хаб для роутера под прошивкой LEDE
МОИ НЕЗНАЧИТЕЛЬНЫЕ ИЗМЕНЕНИЯ В ИСХОДНИКЕ
- Выкл LAN_IN_COMMAND_HUB_REPLACED_IT_WITH_YOUR_REAL_IP -3950
- Удалил проверку с плохим $Support -2620
alex82 ... Удалили бессмысленную опцию "Отключать клиенты, отправляющие $Supports с ошибками", поскольку "ошибками" считается только лишний пробел в конце команды.
- Заменил stdinc.h от mod11 alex82 + изменил текст 0.5.0.1 rafa -95
- HubCommands.cpp изменил Version: DCBEELINEKZ -4637
PtokaX-nix.cpp -59
- Добавил ValidateDenideArrival -3559-3587
LuaScriptManager.h VALIDATE_DENIDE_ARRIVAL, -61
LuaScriptManager.cpp 0x400000, -755 (+) и "ValidateDenideArrival" -778
- serviceLoop.cpp Местами поменял SIGSCRTMR в+)
alex82 ... Переместили сюда обработку таймеров, и тем самым повысили точность срабатывания в 2 раза -90
Сидел и долго думал как мне решить проблему с никами которые виснут, просил всяких умных с ЧСВ разрабов и линуксонанистов с 3х форумах, которые мне никак не хотели отвечать, даже тупо дать подсказку где смотреть, где в коде эти функции выкл и вкл....
Не зря говорят что программисты малость епнутые, в этом я сам убедился что они точно такиеДолго сидел думая где может быть этот демон и примерно на угад просто наткнулся, чисто логическим мышлением и надеюсь я туда попал ))
Выкладываю тут:
Ваш клиент посылает неверный IP .... в параметрах команды, сервер заменил его на Ваш настоящий IP ...... !
Выкл (false) LAN_IN_COMMAND_HUB_REPLACED_IT_WITH_YOUR_REAL_IP в DcCommands.cppКод://-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void clsDcCommands::SendIPFixedMsg(User * pUser, char * sBadIP, char * sRealIP) { if((pUser->ui32BoolBits & User::BIT_WARNED_WRONG_IP) == User::BIT_WARNED_WRONG_IP) { return; } int imsgLen = sprintf(clsServerManager::sGlobalBuffer, "<%s> %s %s %s %s !|", clsSettingManager::mPtr->sPreTexts[clsSettingManager::SETPRETXT_HUB_SEC], clsLanguageManager::mPtr->sTexts[LAN_YOUR_CLIENT_SEND_INCORRECT_IP], sBadIP, clsLanguageManager::mPtr->sTexts[LAN_IN_COMMAND_HUB_REPLACED_IT_WITH_YOUR_REAL_IP], sRealIP); if(CheckSprintf(imsgLen, clsServerManager::szGlobalBufferSize, "SendIncorrectIPMsg1") == false) { pUser->SendCharDelayed(clsServerManager::sGlobalBuffer, imsgLen); } pUser->ui32BoolBits |= User::BIT_WARNED_WRONG_IP; } //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Если юзер повторно подключается с одним ником и IP тоже одинаковый, то предыдущая копия удаляется из хаба.
VALIDATE_DENIDE_ARRIVAL
DcCommands.cpp ValidateDenideArrival - Добавил код ниже
LuaScriptManager.h VALIDATE_DENIDE_ARRIVAL - Добавил
LuaScriptManager.cpp 0x400000 "ValidateDenideArrival" - ДобавилКод:if(Reg == NULL) { // alex82 ... добавили ValidateDenideArrival clsScriptManager::mPtr->Arrival(curUser, Nick, szNickLen, clsScriptManager::VALIDATE_DENIDE_ARRIVAL); int imsgLen = sprintf(msg, "$ValidateDenide %s|", Nick); if(CheckSprintf(imsgLen, 1024, "clsDcCommands::ValidateUserNick14") == true) { curUser->SendChar(msg, imsgLen); } if(strcmp(OtherUser->sIP, curUser->sIP) != 0 || strcmp(OtherUser->sNick, curUser->sNick) != 0) { imsgLen = sprintf(msg, "[SYS] Nick taken [%s (%s)] %s (%s) - user closed.", OtherUser->sNick, OtherUser->sIP, curUser->sNick, curUser->sIP); if(CheckSprintf(imsgLen, 1024, "clsDcCommands::ValidateUserNick15") == true) { clsUdpDebug::mPtr->Broadcast(msg, imsgLen); } } curUser->Close(); return false; } else { // PPK ... addition for registered users, kill your own ghost >:-] curUser->ui8State = User::STATE_VERSION_OR_MYPASS; curUser->ui32BoolBits |= User::BIT_WAITING_FOR_PASS; curUser->AddPrcsdCmd(PrcsdUsrCmd::GETPASS, NULL, 0, NULL); return true; } } } } if(Reg == NULL) {ValidateDenideArrival(tUser, sNick)
Вызывается тогда, когда на хаб пытается войти юзер, ник которого уже занят другим юзером. А именно - перед отправкой юзеру команды $ValidateDenide.
Юзеры, как правило, сидят на многих хабах, и далеко не всегда они устанавливают для каждого из них отдельный ник. В результате, при слиянии крупных хабов получается очень много "клонов" - юзеров, пытающихся войти на хаб несколько раз под одним ником. При этом хаб, как и полагается, пускает одного из них, а всех остальных посылает подальше. Однако, терять драгоценных юзеров (за которых, между прочим, нынче платят деньги) не есть хорошо. Вместо этого можно отследить их, и пренаправить на другой хаб. Именно для этих целей в свое время и была добавлена данная функция.
В отличии от других событий Lua, ValidateDenideArrival получает в качестве второго аргумента не команду целиком, а лишь ник юзера. При этом в таблице юзера ник отсутствует.
Тестовый скрипт
Код:function ValidateDenideArrival(user, nick) print("Validate denide:",nick) endClone Redirect 1.00
© 2012 alex82Скрипт предназначен для перенаправления юзеров, упорно пытающихсявойти на хаб
несколько раз под одним ником. Используется при слиянии крупных хабов.Алгоритм работы следующий: При первой попытке входа клона, запоминаем время
сего знаменательного события, а затем, при каждой последующей попытке, смотрим,
прошло ли с момента первой попытки входа iTime минут. Если да, перенаправляем
юзера. Сделано это для того, чтобы избежать перенаправления тех юзеров, что
отвалились от хаба из-за проблем с сетью, и теперь не могут войти по той причине,
что их ник по-прежнему висит в списке юзеров. Если в промежутке между iTime и
iDelTime юзер не предпринял ни одной попытки входа, то предполагаем, что юзер
таки заметил неладное и сменил ник (или его просто заебало ломиться в закрытую
дверь ) , и удаляем его из списка ожидающих перенаправления.СкриптКод:-- НАСТРОЙКИ iTime = 20 -- Таймаут перенаправления, минут iDelTime = 30 -- Таймаут удаления юзера из списка, минут sRedirAddr = "dchub://10.18.50.50:50" -- Адрес перенаправления sLog = Core.GetPtokaXPath().."Log/clone_redirect.log" --################################################################################### tClone = {} function OnStartup() TmrMan.AddTimer(60000,"MainTimer") end function ValidateDenideArrival(user,nick) if tClone[nick] then if tClone[nick]+iTime*60 < os.time() then Core.SendToUser(user,"$ForceMove "..sRedirAddr) tClone[nick] = nil Report("Юзер "..nick.." был перенаправлен на резервный хаб, поскольку на хабе уже есть юзер с таким ником") end else tClone[nick] = os.time() Report("Юзер "..nick.." был добавлен в список ожидающих перенаправления") end end function UserConnected(user) if tClone[user.sNick] then tClone[user.sNick] = nil Report("Юзер "..user.sNick.." был удален из списка дублирующихся юзеров, поскольку успешно вошел на хаб.") end end OpConnected = UserConnected RegConnected = UserConnected function MainTimer() for i,v in pairs(tClone) do if v+iDelTime*60 < os.time() then tClone[i] = nil Report("Юзер "..i.." был удален из списка дублирующихся юзеров, поскольку прекратил попытки входа.") end end end function Report(msg) local f = io.open(sLog,"a") if f then f:write(os.date("[%Y-%m-%d %H:%M:%S] "),msg,"\n") f:close() end endhttp://mydc.ru/topic5423.html?p=44997#entry44997
PortCheck и Clone Killer http://mydc.ru/topic4674.html?hl=Clone+Redirect
Подробно в моих исходниках: https://github.com/dcbeelinekz2/PtokaX_LEDE_OpenWrt
Готовый пакет ptokax_0.5.0.1-1_rafa_mips_24kc.ipk можно скачать там же.
Облако: https://cloud.mail.ru/public/Gh45/1AF9Cyoei
Продолжение темы установки PtokaX в роутер: Установка хаба PtokaX в роутер под прошивкой OpenWrt и LEDE