Stranix
МаглыТип контенту
Профили
Форум
Календарь
Все, що було написано Stranix
-
Модификация консольного конфигуратора
тема ответил в Stranix пользователя Stranix в Розробка Stargazer
А со строковыми параметрами не так все просто. Для их кодирования применяется функция void Encode12(char * dst, const char * src, int srcLen) { char c1, c2; int i; for (i = 0; i <= srcLen; i++) { c1 = src[i] & 0x0f; c2 = (src[i] & 0xf0) >> 4; c1 += 'a'; c2 += 'a'; dst[i*2] = c1; dst[i*2 + 1] = c2; } dst[i*2] = 0; Вот ёё то и придется повторить в скрипте, чтобы иметь возможность отсылать серверу строковые параметры. А суть ее заключается в том что каждый байт кодируется в 2 буквы от 'a' до 'p' А для создания юзера, похоже, надо просто указать все параметры и заключить их в теги <AddUser> </AddUser> -
Модификация консольного конфигуратора
тема ответил в Stranix пользователя Stranix в Розробка Stargazer
Про заморозку, немного непонятно как ее перевели... Вероятно: <SetUser> <login value="test"/> <passive value="1"/> </SetUser> А вообще хорошо бы на практике проверить все параметры, отрабатывают ли. Смотрю я их в файле parser.cpp в исходниках сервера. -
Нужно было реализовать перенос неистраченного бесплатного траффика на следующий месяц, а возможности установить freemb в КК не было... Поэтому решил немного модифицировать КК для того чтобы можно было менять скриптами любые параметры пользователя без перезагрузки сервера. Изменения заключаются в том, что выкинут код, формирующий запрос к серверу (его проще сформировать в скрипте) и запрос читается из файлика, кодируется и отсылается серверу. Изменился только файл main.cpp : #include <stdio.h> /* for printf */ #include <stdlib.h> /* for exit */ #include <getopt.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include "common.h" #include "netunit.h" #define FN_LEN 512 #define REQ_STR_LEN 300 char fileName[FN_LEN]; char * ParseServerAddress(char * a); short int ParseServerPort(const char * p); char * ParseAdminLogin(char * adm); char * ParseAdminPassword(char * pass); char * ParseUser(char * usr); int CheckLogin(const char * login); int Process(REQUEST * r); int CheckParameters(REQUEST * req); void ParseReply(const char * ans); void Usage(); void Encode12(char * dst, const char * src, int srcLen); struct option long_options[] = { {"server", 1, 0, 's'}, //Server {"port", 1, 0, 'p'}, //Port {"admin", 1, 0, 'a'}, //Admin {"admin_pass", 1, 0, 'w'}, //passWord {"file", 1, 0, 'f'}, //File {0, 0, 0, 0}}; int main (int argc, char **argv) { int c; int digit_optind = 0; REQUEST req; memset(&req, 0, sizeof(req)); while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; c = getopt_long(argc, argv, "s:p:a:w:f:", long_options, &option_index); if (c == -1) break; switch © { case 's': //server strcpy(req.server, ParseServerAddress(optarg)); req.serverReq = 1; break; case 'p': //port req.port = ParseServerPort(optarg); req.portReq = 1; break; case 'a': //admin strcpy(req.admLogin, ParseAdminLogin(optarg)); req.admLoginReq = 1; break; case 'w': //admon password strcpy(req.admPasswd, ParseAdminPassword(optarg)); req.admPasswdReq = 1; break; case 'f': //file strcpy(fileName,optarg); break; case '?': //printf ("Unknown option \n"); break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); exit(PARAMETER_PARSING_ERR_CODE); } if (CheckParameters(&req) == 0) { //printf("Parameter needed\n"); Usage(); exit(PARAMETER_PARSING_ERR_CODE); } Process(&req); return 0; } //----------------------------------------------------------------------------- char * ParseServerAddress(char * a) { /*long int addr = inet_addr(a); if(INADDR_NONE == addr) { printf("Incorrect server address %s\n", a); exit(NETWORK_ERR_CODE); }*/ if (strlen(a) >= SERVER_NAME_LEN) { printf("Server name too long %s\n", a); exit(PARAMETER_PARSING_ERR_CODE); } return a; } //----------------------------------------------------------------------------- short int ParseServerPort(const char * p) { int port; if (strtoi2(p, port) != 0) { printf("Incorresct server port %s\n", p); exit(NETWORK_ERR_CODE); } return (short)port; } //----------------------------------------------------------------------------- char * ParseAdminLogin(char * adm) { if (CheckLogin(adm)) { printf("Incorresct admin login %s\n", adm); exit(PARAMETER_PARSING_ERR_CODE); } return adm; } //----------------------------------------------------------------------------- char * ParseAdminPassword(char * pass) { if (strlen(pass) >= ADM_PASSWD_LEN) { printf("Password too big %s\n", pass); exit(PARAMETER_PARSING_ERR_CODE); } return pass; } //----------------------------------------------------------------------------- int CheckLogin(const char * login) { for (int i = 0; i < strlen(login); i++) { if (!(( login[i] >= 'a' && login[i] <= 'z') || (login[i] >= 'A' && login[i] <= 'Z') || (login[i] >= '0' && login[i] <= '9') || login[i] == '_')) { return 1; } } return 0; } //----------------------------------------------------------------------------- void FileRequest(char * r) { char str[1024]; FILE *f; r[0] = 0; f = NULL; f = fopen(fileName, "rt"); if (!f) { printf("Can't open request file\n"); exit(PARAMETER_PARSING_ERR_CODE); } char ts[REQ_STR_LEN]; while (fgets(ts, REQ_STR_LEN, f)) { strncat(r, ts, REQ_STR_LEN);} fclose(f); } int Process(REQUEST * r) { char str[2048]; NETTRANSACT nt; nt.SetServer(r->server); nt.SetServerPort(r->port); nt.SetLogin(r->admLogin); nt.SetPassword(r->admPasswd); nt.SetRxCallback(ParseReply); FileRequest(str); if (nt.Connect()) { printf("Connect failed.\n"); exit(NETWORK_ERR_CODE); } if (nt.Transact(str)) { printf("Login or password failed.\n"); exit(LOGIN_OR_PASS_ERR_CODE); } nt.Disconnect(); printf("Ok\n"); return 0; } //----------------------------------------------------------------------------- int CheckParameters(REQUEST * req) { int a = req->admLoginReq && req->admPasswdReq && req->serverReq && req->portReq; return a; } //----------------------------------------------------------------------------- void Usage() { printf("Use:\n"); printf("sgconf -s <server> -p <port> -a <admin> -w <admin_pass> -f <request_file>\n"); } Теперь для того чтобы, например установить счет пользователя, достаточно создать файл <SetUser> <login value="test"/> <cash set="10.0"/> </SetUser> и передать его в качесте параметра конфигуратору
-
В данном случае iptables смотреть бесполезно, т.к. локальный процесс получает один пакет, а посылает совершенно другой. Их связка возможна только внутри этого процесса, и если он этого не делает, то внешний пакет уже не персонализировать (т.е. ни одному юзеру не припишешь). А решение здесь возможно такое: перед ALL 192.168.58.250 NULL добавить строку TCP 192.168.58.250:5222 DIR0 где DIR0 - направление инета
-
Stargazer 2.016.7.6 от 12.05.05. Пишем сюда
тема ответил в Mugger пользователя Stranix в Розробка Stargazer
В режиме libipq stg все отлично считает с точностью до байта даже на слабых машинах. Скорость машины в этом случае сказывается на скорость транзитных соединений. Например пень 166 у меня больше 16 килобайт в сек на пропускал При этом загрузка проца хоть и показывала 30%, но реально его сильно не хватало. После апгрейда стало пропускать полностью. А насчет возможного неудаления правил файрвола: очень жаль что все скрипты форкаются и выполняются параллельно. Я вот дописал еще событие OnStat которое выполняется для каждого пользователя сразу после сброса на диск его детельной статистики за час, а в нем выполняется импорт этих данных в MySQL. Так MySQL, да и вся машина, просто укладывается секунд на 10 от одновременных 400 выполнений скрипта этого события. -
Максимальное количество онлайн-пользователей
тема ответил в Stranix пользователя Stranix в Питання по Stargazer
Ну здесь следует предположить что скоротси хватает. А вообще у меня на мир 2 Мб/с, на Алькар 8Мб/с Да и каналов несколько, можно юзеров по ним раскидать. Просто тут грядет обединение 2-х биллинговых серверов, на каждом из которых stargazer. В сумме будет под 1000 юзеров. Поэтому надо знать заранее, справится ли он. Железо потянет, вопрос в софте. -
Меня интересует у кого какой был замечен максимум пользователей в онлайне одновременно, и при этом бы все отлично работало. У меня сейчас всего заведено 400 пользователей, в среднем в онлайне 40, работает отлично.
-
Решение проблемы с исполнением скриптов
тема ответил в egor2fsys пользователя Stranix в Розробка Stargazer
А что этот патч патчит? Визуальное сравнение того что было и того что в пачте различий не обнаружило. Если я что-то пропустил, тникте, плиз. А вообще там явно не хватает еще одной проверки. я еще от себя добавил такую проверку (с 302-строки): if (dup2(fd, STDERR_FILENO) == -1) { exit(1); } -
Stargazer 2.016.7.6 от 12.05.05. Пишем сюда
тема ответил в Mugger пользователя Stranix в Розробка Stargazer
Глюк с недовыполнением скриптов тоже был замечен. То вообще не выполнялись, то только первая строчка... в конце концов заметил, что не выполняется если комнда что-то выводит на консоль. Например, что такого правила в iptables уже нету. После того, как стал вывод всех команд отправлять в /dev/null, стало все нормально отрабатывать. -
Я давно использую Stargazer в режиме использования libipq, и при попытках реализации VPN, мне не хватало всего лишь одной возможности: Указать пользователю в поле интерфейс нечто типа all, чтобы независимо от имени виртуального интерфейса, адрес обсчитывался. Т.к. постоянные адреса задать пользователям не проблема, а к пакеты к старгейзеру попадут в любом случае, т.к. используется таргет QUEUE. Таким образом, очень хотелось бы добавить одно специальное значение в поле имен интерфейсов. P.S. Глюк с двойным траффиком, если роутер провайдера находится в том же сегмента что и сервер со старгейзером тоже остался Может кто занимался этой проблемой и знает что и где надо поправить в исходниках?
-
Вот именно! :argh: Пришлось ставить syslog-ng и отправлять все логи старгазера, которые предназначались /var/log/messages в /dev/null
-
Den_LocalNet: инет у нас 1мбит, а с алькара и все 8 мбит, но вот только когда сидят по 30 чел в онлайне (а так обычно и бывает), то реальной скорости больше 40 килобайт/сек не видел. А количество аккаунтов влияет на объем занятой памяти, и когда как в моем случае ее страшно не хватает (обычно свободно около 1 мб) тоже приводит к тормозам. Вот на днях поставим памяти 256 метров, посмотрим, насколько изменится ситуация.
-
А вот у меня 150-й AMD, 92 мозгов, но аж 260 юзеров - и работает! Но хоть по топу стг и жрет около 20% но все равно притормозы уже явные.. пора апгрйедить. А до сих пор хоть и тормозило, но считало правильно в режиме libipq
-
Проблемы, возникающие при использовании libipq
тема ответил в Stranix пользователя Stranix в Питання по Stargazer
Хм... интересная получается ситуация... Что, никто не использует Stagazer2 в режиме libipq??? На данный момент это вроде единственный способ считать клинтов, подключенных по VPN. -
Помогите пожалуйста! Уже даже и не знаю что делать, наверное, откатываться на предыдущие настройки без libipq. Проблема в том, что если следующий шлюз, через который поступает интернет находится в той же подсети, что и клиенты, то stg считает траффик вдвойне! То есть в таблице nat в цепочке POSTROUTING все пакеты проходят через правило -j SNAT --to-source <адрес шлюза на который подается интернет с роутера провайдера(он тоже в нашей сети)> шлюз по умолчанию, соответственно, на роутер провайдера. Открывается инет - добавлением правил с -j QUEUE в FORWARD. Я точно проверил, что в тот момент -j QUEUE есть только в цепочке FORWARD (в сторону к клиенту, и от него). Причем, когда используется канал с инетом с другого интерфейса, то все считается правильно. Подскажите плиз в чем бок: в моих настройках? в файрволе? в stg? Как я понял, в этом случае, stg считает только то, что ему послал iptables по -j QUEUE. И меня вообще удивляет, почему в этом случае пакеты 2 раза проходят FORWARD??? :-0 Какие есть соображения по этому поводу?
-
Stargazer 2. Ver from 19.01.2005. Баги
тема ответил в nefilim пользователя Stranix в Розробка Stargazer
:vah: Хочу еще раз обратить внимание, что сервер, собранный с нестандартным числом направлений, работает отлично. А вот авторизатор из RC2, после этого не в состоянии получить правильно данные статистики от сервера, хотя когда-то, помнится, было сообщение, что число направлений авторизатор получает от сервера, и в нем это жестко не зашито. А как показывает практика, очень даже зашито, происходит нестыковка протоколов статистики, в результате на экран выдается полный бред. Я абсолютно не хотел ругаться по этому поводу, а просто обратил внимание на несоответствие написанной документации коду программы. -
Stargazer 2. Ver from 19.01.2005. Баги
тема ответил в nefilim пользователя Stranix в Розробка Stargazer
Мда... билд то новый, а вот баги старые остались... Видели бы вы что происходит с авторизатором , если собрать сервер с меньшим числом направлений, чем по умолчанию. Конкретно для этой версии я собрал сервер с 6-ю направлениями (т.к. больше мне пока не надо, а конфиги править не пришлось бы). После этого запускаю сервер....он без проблем запустился. При попытке подключиться виндовским авторизатором, он начинает бесконечно генерировать окошки с ошибкой до тех пор, пока что-то там ему не переполнит и он вообще не закроется. При этом он умудряется успеть авторизироваться. Из-под линуха же авторизатор в веб-морде рисует страшные числа, но тоже подключается. Короче в конце концов решил что легче написать скрипт, добавляющий всем пользователям данные по новым напрвлениям, и сидеть с 10-ю направлениями. Просто очень хочется чтобы в следующие версии данная бага больше не кочевала.
