Storoge 0 Опубликовано: 2008-07-08 12:52:50 Share Опубликовано: 2008-07-08 12:52:50 Имеется необходимость каждый месяц автоматически пополнять разрешенный размер трафика пользователям, так как вручную вбивать каждый раз 250 чисел не хочется. На FreeBSD 7.0 запущен Stargazer с модулем MySQL. Для этой цели решил задействовать поле Userdata0(+поменял его тип на double), куда должен записываться нужный месячный трафик. Соответственно, каждый месяц полю Cash присваивается значение из Userdata0 и все должно быть Ok. Решил скрипты сделать на перле (это мой первый опыт с перлом, поэтому не ругайтесь сильно =) ) Скрипт OnUserAdd: #!/usr/bin/perl -w use DBI; #use struct; $dsn="DBI:mysql:stg_database:localhost"; # наименование источника данных $user_name="root"; # имя пользователя $password="xxxxxxxxx"; # пароль $LOGIN=@ARGV[0]; # подключение к базе данных $dbh = DBI->connect ($dsn, $user_name, $password, { RaiseError => 0, PrintError => 0})or die "Невозможно подключиться к серверу: $DBI::err ($DBI: : е г г s t $sth = $dbh->prepare (qq{UPDATE users SET Userdata0=Cash WHERE login='$LOGIN'}) or bail_out("Невозможно создать запрос"); $sth->execute(); $sth->finish() or bail_out("Невозможно завершить выполнение запроса"); $dbh->disconnect(); exit(0); Приблизительно также работает OnChange. Начал проверять работу. Попробовал действовать в обратном направлении: присваивать значения из Userdata0 в Cash. В консоли mysql показывает, что значение меняется, а в конфигураторе ни чего не меняется, то же значение!!!!! Начал присваивать значения полю Cash из консоли: mysql> use stg_database; Database changed mysql> select cash from users where login='test'; +------+ | cash | +------+ | 12 | +------+ 1 row in set (0.00 sec) mysql> update users set cash=23 where login='test'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select cash from users where login='test'; +------+ | cash | +------+ | 23 | +------+ 1 row in set (0.00 sec) mysql> flush table users; Query OK, 0 rows affected (0.01 sec) mysql> select cash from users where login='test'; +------+ | cash | +------+ | 12 | +------+ 1 row in set (0.00 sec) Ситуация такая же. Вроде бы новое значение присваивается, но стоит выйти из консоли и зайти снова или запустить flash tables, прежнее значение возвращается. А в конфигураторе не меняется вообще ничего. Пробовал перезагружать Stargazer после замены значений, ничего не меняется.. Захожу под рутом с GRANT ALL. То есть вручную поменять значения полей в базе я не могу, заблокированы что ли таблицы эти. Мои знания о MySQL невелики, поэтому не сочтите вопрос глупым, поскольку для меня он важен. В принципе, меня больше волнует вопрос автоматического добавления денег на счет, если кто знает, как это сделать, пишите, пожалуйста. Буду рад любым комментариям. :vah: Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-08 12:59:39 Share Опубліковано: 2008-07-08 12:59:39 Потому что Stargazer не зачитывает данные из базы во время работы. Только при старте! Используй КК в скриптах вместо прямого доступа к базе. Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-08 14:01:27 Автор Share Опубліковано: 2008-07-08 14:01:27 А что такое КК? =) Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-08 14:42:25 Share Опубліковано: 2008-07-08 14:42:25 А что такое КК? =) КК - Консольный Конфигуратор - sgconfig Идет в составе Stargazer Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-10 12:14:24 Автор Share Опубліковано: 2008-07-10 12:14:24 Пытаюсь его собрать У меня уже FreeBSD 8, подправил build if [ "$sys" = "FreeBSD" ] then case $release in 4) OS=bsd;; 5) OS=bsd5;; 6) OS=bsd5;; *) OS=bsd5;; Подправил Makefile ifeq ($(OS),bsd5) LIBS += -lexpat \ -lpthread \ -lc endif Запускаю build и в конце такая ошибка: gmake[2]: Entering directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' gmake[2]: Leaving directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' gmake[2]: Entering directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' g++ -O2 -Wall -fPIC -I /home/yprozorov/stg-2.404.9.7/projects/sgconf/../../include -I ./ -DFREE_BSD5 -c netunit.cpp g++ -O2 -Wall -fPIC -I /home/yprozorov/stg-2.404.9.7/projects/sgconf/../../include -I ./ -DFREE_BSD5 -c parser.cpp In file included from parser.cpp:12: servconf.h:6:19: error: expat.h: No such file or directory In file included from parser.cpp:12: servconf.h:256: error: 'XML_Parser' does not name a type gmake[2]: *** [parser.o] Error 1 gmake[2]: Leaving directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' gmake[1]: *** [srvconf.lib] Error 2 gmake[1]: Leaving directory `/home/yprozorov/stg-2.404.9.7/stglibs' gmake: *** [libs] Error 2 locate expat.h /usr/local/include/expat.h /usr/local/include/python2.5/pyexpat.h /usr/src/contrib/expat/lib/expat.h Предложения???? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-10 12:17:05 Share Опубліковано: 2008-07-10 12:17:05 ln -s /usr/loca/include/expat.h /usr/include/expat.h Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-10 14:19:48 Автор Share Опубліковано: 2008-07-10 14:19:48 Ничего не поменялось. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-10 14:26:40 Share Опубліковано: 2008-07-10 14:26:40 В буквах не ошибся? В /usr/include/ должен появиться симлинк на expat.h Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-11 14:02:43 Автор Share Опубліковано: 2008-07-11 14:02:43 locate expat.h /usr/include/expat.h /usr/local/include/expat.h /usr/local/include/python2.5/pyexpat.h /usr/src/contrib/expat/lib/expat.h gmake[2]: Entering directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' gmake[2]: Leaving directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' gmake[2]: Entering directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' g++ -O2 -Wall -fPIC -I /home/yprozorov/stg-2.404.9.7/projects/sgconf/../../include -I ./ -DFREE_BSD5 -c netunit.cpp g++ -O2 -Wall -fPIC -I /home/yprozorov/stg-2.404.9.7/projects/sgconf/../../include -I ./ -DFREE_BSD5 -c parser.cpp In file included from parser.cpp:12: servconf.h:6:19: error: expat.h: No such file or directory In file included from parser.cpp:12: servconf.h:256: error: 'XML_Parser' does not name a type gmake[2]: *** [parser.o] Error 1 gmake[2]: Leaving directory `/home/yprozorov/stg-2.404.9.7/stglibs/srvconf.lib' gmake[1]: *** [srvconf.lib] Error 2 gmake[1]: Leaving directory `/home/yprozorov/stg-2.404.9.7/stglibs' gmake: *** [libs] Error 2 Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-11 14:18:37 Share Опубліковано: 2008-07-11 14:18:37 А покажи файлик servconf.h Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-11 14:53:15 Автор Share Опубліковано: 2008-07-11 14:53:15 #ifndef SERVCONF_H #define SERVCONF_H #include "os_int.h" #include <expat.h> #include <list> #include <string> #include "netunit.h" #include "stg_const.h" void Start(void *data, const char *el, const char **attr); void End(void *data, const char *el); #define MAX_ERR_STR_LEN (64) #define IP_STRING_LEN (255) //#define TARIFF_NAME_LEN (255) //#define IFACE_LEN (255) //#define GROUP_LEN (255) //#define NOTE_LEN (255) //#define EMAIL_LEN (255) #define UNAME_LEN (256) #define SERV_VER_LEN (64) #define DIRNAME_LEN (16) //----------------------------------------------------------------------------- struct STAT { long long su[DIR_NUM]; long long sd[DIR_NUM]; long long mu[DIR_NUM]; long long md[DIR_NUM]; double freeMb; }; //----------------------------------------------------------------------------- struct SERVERINFO { char version[sERV_VER_LEN]; int tariffNum; int tariffType; int usersNum; char uname[uNAME_LEN]; int dirNum; char dirName[DIR_NUM][DIRNAME_LEN]; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- struct USERDATA { char login[LOGIN_LEN]; char password[PASSWD_LEN]; double cash; double credit; int down; int passive; int connected; int alwaysOnline; uint32_t ip; char ips[iP_STRING_LEN]; char tariff[TARIFF_NAME_LEN]; char iface[iFACE_LEN]; char group[GROUP_LEN]; char note[NOTE_LEN]; char email[email_LEN]; STAT stat; struct USERDATA * next; }; //----------------------------------------------------------------------------- typedef void(*RecvUserDataCb_t)(USERDATA * ud, void * data); typedef void(*RecvServerInfoDataCb_t)(SERVERINFO * si, void * data); typedef int(*RecvChgUserCb_t)(const char * asnwer, void * data); typedef int(*RecvCheckUserCb_t)(const char * answer, void * data); typedef int(*RecvSendMessageCb_t)(const char * answer, void * data); //----------------------------------------------------------------------------- struct ADMINDATA { char login[ADM_LOGIN_LEN]; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class PARSER { public: PARSER(); virtual ~PARSER(){}; virtual int ParseStart(const char *el, const char **attr) = 0; virtual void ParseEnd(const char *el) = 0; void Reset(); //virtual bool GetError() = 0; //virtual void SetUserDataRecvCb(RecvUserDataCb_t) = 0; protected: //RecvUserDataCb_t RecvUserDataCb; private: }; //----------------------------------------------------------------------------- class PARSER_CHG_USER: public PARSER { public: PARSER_CHG_USER(); int ParseStart(const char *el, const char **attr); void ParseEnd(const char *el); void Reset(); void ParseAnswer(const char *el, const char **attr); void SetChgUserRecvCb(RecvChgUserCb_t, void * data); private: RecvChgUserCb_t RecvChgUserCb; void * chgUserCbData; int depth; bool error; }; //----------------------------------------------------------------------------- class PARSER_CHECK_USER: public PARSER { public: PARSER_CHECK_USER(); int ParseStart(const char *el, const char **attr); void ParseEnd(const char *el); void Reset(); void ParseAnswer(const char *el, const char **attr); void SetCheckUserRecvCb(RecvCheckUserCb_t, void * data); private: RecvCheckUserCb_t RecvCheckUserCb; void * checkUserCbData; int depth; bool error; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class PARSER_GET_USERS: public PARSER { public: PARSER_GET_USERS(); int ParseStart(const char *el, const char **attr); void ParseEnd(const char *el); void Reset(); void ParseUsers(const char *el, const char **attr); void ParseUser(const char *el, const char **attr); void ParseUserParams(const char *el, const char **attr); void ParseUserLoadStat(const char * el, const char ** attr); //bool GetError(); void SetUserDataRecvCb(RecvUserDataCb_t, void * data); private: RecvUserDataCb_t RecvUserDataCb; void * userDataCb; USERDATA user; int depth; bool error; }; //----------------------------------------------------------------------------- class PARSER_GET_USER: public PARSER { public: PARSER_GET_USER(); int ParseStart(const char *el, const char **attr); void ParseEnd(const char *el); void Reset(); void ParseUsers(const char *el, const char **attr); void ParseUser(const char *el, const char **attr); void ParseUserParams(const char *el, const char **attr); void ParseUserLoadStat(const char * el, const char ** attr); void SetUserDataRecvCb(RecvUserDataCb_t, void * data); private: RecvUserDataCb_t RecvUserDataCb; void * userDataCb; USERDATA user; int depth; bool error; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class PARSER_GET_SERVER_INFO: public PARSER { public: PARSER_GET_SERVER_INFO(); int ParseStart(const char *el, const char **attr); void ParseEnd(const char *el); void Reset(); void ParseServerInfo(const char *el, const char **attr); bool GetError(); void SetServerInfoRecvCb(RecvServerInfoDataCb_t, void * data); private: void ParseUname(const char ** attr); void ParseServerVersion(const char ** attr); void ParseUsersNum(const char ** attr); void ParseTariffsNum(const char ** attr); void ParseTariffType(const char ** attr); void ParseDirNum(const char **attr); void ParseDirName(const char **attr, int d); RecvServerInfoDataCb_t RecvServerInfoDataCb; void * serverInfoDataCb; USERDATA user; int depth; bool error; SERVERINFO serverInfo; }; //----------------------------------------------------------------------------- class PARSER_SEND_MESSAGE: public PARSER { public: PARSER_SEND_MESSAGE(); int ParseStart(const char *el, const char **attr); void ParseEnd(const char *el); void Reset(); void ParseAnswer(const char *el, const char **attr); void SetSendMessageRecvCb(RecvSendMessageCb_t, void * data); private: RecvSendMessageCb_t RecvSendMessageCb; void * sendMessageCbData; int depth; bool error; }; //----------------------------------------------------------------------------- class SERVCONF { public: SERVCONF(); void SetServer(const char * server); void SetPort(uint16_t port); void SetAdmLogin(const char * login); void SetAdmPassword(const char * password); void SetUserDataRecvCb(RecvUserDataCb_t, void * data); void SetServerInfoRecvCb(RecvServerInfoDataCb_t, void * data); void SetChgUserCb(RecvChgUserCb_t, void * data); void SetCheckUserCb(RecvCheckUserCb_t, void * data); void SetGetUserDataRecvCb(RecvUserDataCb_t, void * data); void SetSendMessageCb(RecvSendMessageCb_t, void * data); int GetUsers(); int GetUser(const char * login); int ChgUser(const char * request); int SendMessage(const char * login, const char * message, int prio); int GetServerInfo(); int CheckUser(const char * login, const char * password); char * GetStrError(); int GetError(); int Start(const char *el, const char **attr); void End(const char *el); private: PARSER * currParser; PARSER_GET_USERS parserGetUsers; PARSER_GET_USER parserGetUser; PARSER_GET_SERVER_INFO parserServerInfo; PARSER_CHG_USER parserChgUser; PARSER_CHECK_USER parserCheckUser; PARSER_SEND_MESSAGE parserSendMessage; NETTRANSACT nt; int parseDepth; USERDATA ud; char errorMsg[MAX_ERR_STR_LEN]; int error; XML_Parser parser; RecvUserDataCb_t RecvUserDataCb; RecvUserDataCb_t RecvGetUserDataCb; RecvServerInfoDataCb_t RecvServerInfoDataCb; RecvChgUserCb_t RecvChgUserCb; RecvCheckUserCb_t RecvCheckUserCb; RecvSendMessageCb_t RecvSendMessageCb; void * getUserDataDataCb; void * getUsersDataDataCb; void * getServerInfoDataCb; void * chgUserDataCb; void * checkUserDataCb; void * sendMessageDataCb; friend int AnsRecv(void * data, std::list<std::string> * list); }; //----------------------------------------------------------------------------- #endif /* _SERVCONF_H_ */ /* EOF */ Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-12 09:01:40 Share Опубліковано: 2008-07-12 09:01:40 А еще вывод ls -l /usr/include | grep expat плиз Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-14 09:58:10 Автор Share Опубліковано: 2008-07-14 09:58:10 ls -l /usr/include | grep expat lrwxr-xr-x 1 root wheel 25 Jul 10 18:07 expat.h -> /usr/loca/include/expat.h Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-14 10:03:51 Share Опубліковано: 2008-07-14 10:03:51 Прям не знаю что тебе сказать... Мистика! Ссылка на сообщение Поделиться на других сайтах
Storoge 0 Опубліковано: 2008-07-14 12:09:17 Автор Share Опубліковано: 2008-07-14 12:09:17 А почему у меня loca вместо local? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-07-14 12:12:47 Share Опубліковано: 2008-07-14 12:12:47 Ага, вот и ответ Ссылка на сообщение Поделиться на других сайтах
borndead 0 Опубліковано: 2009-01-08 13:03:48 Share Опубліковано: 2009-01-08 13:03:48 Имеется необходимость каждый месяц автоматически пополнять разрешенный размер трафика пользователям, так как вручную вбивать каждый раз 250 чисел не хочется. Все уже придумано за вас. Используйте в тарифе предоплаченный траффик. Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас