Перейти до

Модуль 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"; # пароль

$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:

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

Потому что

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

 

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

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

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

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

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

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

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

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

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

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

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

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

Вхід

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

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...