Перейти к содержимому
Local
Storoge

Модуль Mysql и скрипты на перле.

Рекомендованные сообщения

Имеется необходимость каждый месяц автоматически пополнять разрешенный размер трафика пользователям, так как вручную вбивать каждый раз 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"; # пароль

[email protected][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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Потому что

Stargazer

не зачитывает

данные из базы

во время работы.

Только при старте!

Используй КК в скриптах вместо прямого доступа к базе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
А что такое КК? :huh:=)

КК - Консольный Конфигуратор - sgconfig

Идет в составе Stargazer

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пытаюсь его собрать

 

У меня уже 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

 

Предложения????

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ln -s /usr/loca/include/expat.h /usr/include/expat.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В буквах не ошибся? В /usr/include/ должен появиться симлинк на expat.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А покажи файлик servconf.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
#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 */

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А еще вывод ls -l /usr/include | grep expat плиз

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ls -l /usr/include | grep expat
lrwxr-xr-x   1 root  wheel     25 Jul 10 18:07 expat.h -> /usr/loca/include/expat.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прям не знаю что тебе сказать...

Мистика!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ага, вот и ответ

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Имеется необходимость каждый месяц автоматически пополнять разрешенный размер трафика пользователям, так как вручную вбивать каждый раз 250 чисел не хочется.

Все уже придумано за вас. Используйте в тарифе предоплаченный траффик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×