Перейти до

STG2+mysql


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

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

Думаю все уже видели в STG2 такую интересную возможность как подробная статистика по трафику. Формат ее представления чем-то похож на результат работы цисковой команды show ip accounting. В течение заданного интервала времени, собирается детальная статистика, и пишется в файл. Это уже что-то, но все же не хватает некоторой гибкости и удобства, которую дает БД. Именно поэтому я немного дописал STG2, и теперь у меня подробная статистика пишется в mysql базу, а к ней уже я буду на днях лепить веб-морду.

Если кому-нить нужен будет результат моей работы - пишите в приват, я поделюсь =)

Дык вот, возникает вопрос, как лучше хранить все в базе? Какую структуру вы предложите?

Сейчас у меня есть таблица со следующими полями: datetime, login, ipstr, dir, down, up, cash, это дата+время записи, логин пользователя, IP по которому прошел траф, направление, принято байт, отправлено байт, общая стоимость этого трафика, соответсвенно. Но это не оптимальное решение, а так, то что пришло в сразу в голову. Я сейчас пойду спать, а вы пока предлагайте оптимальную структуру базы =)

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

Hash

Это здорово что написал такую вещь, а как реализовано. Правил исходники, есть ли возможность выбора куда писать логи - в файл или базу. Поделись созданным.

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

Это здорово что написал такую вещь, а как реализовано?

Добавил функцию USER::WriteMysqlStat, написав ее на основе USER::WriteInetStat.

 

Есть ли возможность выбора куда писать логи - в файл или базу.

Да, она есть. Можно писать как в базу, так и в файл одновременно. Вот кусок кода из main.cpp, который пишет статистику после отключения пользователя.

USER * u;
for (int i = 0; i < users->GetUserNum(); i++)
 {
       u = users->GetUser(i);
 if (u ->GetConnected())
 	{
 	u->Disconnect(LOGEVENT_DISCONNECT);
 	}
       u->WriteStat();
       u->WriteInetStat();
       u->WriteMysqlStat();             //Функция добавленая мной
}

Аналогично, можно добавить запись статистики в базу по таймауту, который определяется в конфиге, так как код там похожий. Как видите, есть выбор какую статистику писать, в файл, базу, или вообще оба варианта, как у меня.

 

Поделись созданным.

Ок, я на выходных прикручу форму, через которую можно будет смотреть отчеты, простейшие для начала, и тогда выложу. Заодно, доработаю обработку ошибок, которые могут возникнуть при записи в базу.

Ссылка на сообщение
Поделиться на других сайтах
если не сложно скинь всё это добро автору - пусть тоже подумает над этим :(

Автор уже высказывался когда-то о ненужности, по его мнению, складирования логов в mysql из за большей нагрузки на сервер стг в момент работы с базой.

Я сделаю дополнительную опцию в конфиге, чтобы можно было более удобно рулить логгированием, для тех, кому это нужно.

Ссылка на сообщение
Поделиться на других сайтах
  • 2 weeks later...
Ждёмс....

Ой, я забыл совсем =)

ЗАвтра с работы выложу.

 

А юзера в это время спрашивают "А где это я просидел 0,00023559546 центов"

В смысле?

Ссылка на сообщение
Поделиться на других сайтах
DeadOff имел ввиду, что теперь у него будут доказательства ввиде логов в базе по хостам :)

Дык это и так хранится, только в текстовых файлах, а их парсить несколько неудобно. =)

Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

Кстати, какую статистику вы хотели бы видеть? Нужны ли графики загрузки, как в UTM?

Да, и кстати, кто-нить может намалевать более-менее пристойный десигн, если я добавлю поболее функциональности в статистике?

Відредаговано Hash
Ссылка на сообщение
Поделиться на других сайтах
Hash С дизигном помогу. Свисти какого плана рисовать.

Ок, я пока придумаю, какую функциональность я хочу вложить в него, а потом скажу че рисовать. Думаю нужно что-нить похожее на веб-морду УТМ. Просто и понятно.

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

да да да

веб морды как раз не хватает....

а ваще спишитешь с автором - я думаю что вы друг другу будете взаимополезны :D

 

 

вобще конечно если может автор не откажется и если не откажетесь вы то сразу ваши изменения включать в его инсталяхи :)

 

потому как когда разрознено все делается это плёхо :)

 

пойди потом собери все патчи к исходникам

Ссылка на сообщение
Поделиться на других сайтах
а ваще спишитешь с автором - я думаю что вы друг другу будете взаимополезны

Да, я тоже об этом думал. Потому как есть идея, к примеру, которая позволит писать плагины к стг, без перекомпиляции сервера.

Ссылка на сообщение
Поделиться на других сайтах
Да, я тоже об этом думал. Потому как есть идея, к примеру, которая позволит писать плагины к стг, без перекомпиляции сервера.

 

Вот это действительно полезная фича! Так что с автором свяжись по-любому, я думаю он будет только за.

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

Hash

интересно может вышлешь мне свою работу? :) меня просто заинтересовало это. И кстати если есть возможно то по асе давай свяжемся у меня куча вопросов есть к тебе. :)

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

сделаны патчи для связи мискуля и СТГ

патчи для последней версии СТГ от 03.08

за реализацию идеи говорим спасибо Hash

за адаптацию патчей для текущей версии спасибо говорим TruthSeeker

 

база для записи туда статистики создается так:

 

CREATE TABLE `traff` (

`datetime` datetime NOT NULL default '0000-00-00 00:00:00',

`login` varchar(100) NOT NULL default '',

`ipstr` varchar(15) NOT NULL default '',

`dir` smallint(1) NOT NULL default '0',

`down` int(10) NOT NULL default '0',

`up` int(10) NOT NULL default '0',

`cash` float(10,4) NOT NULL default '0.0000'

) TYPE=MyISAM;

 

в конф файл необходимо добавить следующие параметры:

 

dbLogin - логин к БД

dbPassword - пароль к БД

dbName имя БД

dbHost ХОСТ

useMysql yes или no

ignoreErrors yes или no

 

СТГ с данным патчем собирается и под линукс и под фряху ...

 

вот собственно патч:

 

Only in stg2-2004.08.03-03.02.59: admin.o
Only in stg2-2004.08.03-03.02.59: admins.o
Only in stg2-2004.08.03-03.02.59: bsp.o
Binary files stg2-2004.08.03-03.02.59/common.o and stg2-2004.08.03-mysql/common.o differ
Binary files stg2-2004.08.03-03.02.59/conffiles.o and stg2-2004.08.03-mysql/conffiles.o differ
Only in stg2-2004.08.03-03.02.59: configproto.o
Only in stg2-2004.08.03-03.02.59: des.o
Only in stg2-2004.08.03-03.02.59: list.o
Binary files stg2-2004.08.03-03.02.59/main.o and stg2-2004.08.03-mysql/main.o differ
diff -rbp stg2-2004.08.03-03.02.59/make.bsd stg2-2004.08.03-mysql/make.bsd
*** stg2-2004.08.03-03.02.59/make.bsd   Tue Aug  3 12:09:35 2004
--- stg2-2004.08.03-mysql/make.bsd      Thu Aug  5 12:42:57 2004
*************** CC=g++
*** 6,11 ****
--- 6,12 ----
 
 flags=-Wall -gstabs+
 defines=-DFREEBSD -DTARIFF$(t)
+ mysql=-I/usr/include/mysql -L/usr/lib/mysql
 
 bsd:  stargazer
 
*************** sendcl.o admin.o admins.o rsconf.o list.
*** 14,20 ****
 freebsd/cap.o parser.o parser_admin.o parser_tariff.o
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o users.o recivecl.o \
 -pthread /usr/lib/libc_r.so des.o sendcl.o admin.o admins.o rsconf.o list.o configproto.o bsp.o
traffcounter.o freebsd/cap.o \
! /usr/local/lib/libexpat.so parser.o parser_admin.o parser_tariff.o
 
 main.o:                                       main.cpp                        main.h
       $(CC) -c $(flags) $(defines) -o main.o                          main.cpp
--- 15,21 ----
 freebsd/cap.o parser.o parser_admin.o parser_tariff.o
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o users.o recivecl.o \
 -pthread /usr/lib/libc_r.so des.o sendcl.o admin.o admins.o rsconf.o list.o configproto.o bsp.o
traffcounter.o freebsd/cap.o \
! /usr/local/lib/libexpat.so parser.o parser_admin.o parser_tariff.o /usr/lib/mysql/libmysqlclient.so
 
 main.o:                                       main.cpp                        main.h
       $(CC) -c $(flags) $(defines) -o main.o                          main.cpp
*************** settings.o:                             settings.cpp                    settings.h
*** 38,44 ****
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) -o user.o                          user.cpp
 
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
--- 39,45 ----
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) $(mysql) -o        user.o                          user.cpp
 
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
diff -rbp stg2-2004.08.03-03.02.59/make.linux stg2-2004.08.03-mysql/make.linux
*** stg2-2004.08.03-03.02.59/make.linux Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/make.linux    Thu Aug  5 12:09:55 2004
*************** t=2
*** 6,11 ****
--- 6,12 ----
 
 flags=-Wall -gstabs+
 defines=-Dlinux -DTARIFF$(t)
+ mysql=-I/usr/include/mysql -L/usr/lib/mysql
 
 linux:        stargazer
 
*************** linux/cap.cpp parser.o parser_admin.o pa
*** 15,21 ****
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o \
       users.o recivecl.o /lib/libpthread.so.0 des.o sendcl.o admin.o admins.o rsconf.o list.o \
       configproto.o bsp.o traffcounter.o linux/cap.cpp parser.o parser_admin.o \
!       parser_tariff.o /usr/lib/libexpat.a
 
 
 main.o:                                       main.cpp                        main.h
--- 16,22 ----
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o \
       users.o recivecl.o /lib/libpthread.so.0 des.o sendcl.o admin.o admins.o rsconf.o list.o \
       configproto.o bsp.o traffcounter.o linux/cap.cpp parser.o parser_admin.o \
!       parser_tariff.o /usr/lib/libexpat.a /usr/lib/mysql/libmysqlclient.so
 
 
 main.o:                                       main.cpp                        main.h
*************** settings.o:                             settings.cpp                    settings.h
*** 40,47 ****
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) -o user.o                          user.cpp
! 
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
 
--- 41,47 ----
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) $(mysql) -o        user.o          user.cpp
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
 
Only in stg2-2004.08.03-03.02.59: parser.o
Only in stg2-2004.08.03-03.02.59: parser_admin.o
Only in stg2-2004.08.03-03.02.59: parser_tariff.o
Only in stg2-2004.08.03-03.02.59: recivecl.o
Only in stg2-2004.08.03-03.02.59: rsconf.o
Only in stg2-2004.08.03-03.02.59: sendcl.o
diff -rbp stg2-2004.08.03-03.02.59/settings.cpp stg2-2004.08.03-mysql/settings.cpp
*** stg2-2004.08.03-03.02.59/settings.cpp       Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/settings.cpp  Thu Aug  5 12:44:54 2004
*************** CONFPARAM params[]={
*** 118,123 ****
--- 118,129 ----
     {"DirName3",          "",         1,              0},     //21
 
     {"SpreadFee",         "",         0,              0},     //22
+     {"dbLogin",             "",         0,              0},     //23
+     {"dbPassword",          "",         0,              0},     //24
+     {"dbName",              "",         0,              0},     //25
+     {"dbHost",              "",         0,              0},     //26
+     {"useMysql",            "",         0,              0},     //27
+     {"ignoreErrors",        "",         0,              0}      //28
       };
 
 
*************** if (f)
*** 368,373 ****
--- 374,427 ----
                             WriteServLog("пЫЙВЛБ Ч ЖБКМЕ ЛПОЖЙЗХТБГЙЙ! %s уФТПЛБ %d", str, lineNum);
                                                       exit(1);
 
+                       case 23: //dbLogin
+                                                   strncpy(dbLogin, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 24: //dbPassword
+                                                   strncpy(dbPassword, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 25: //dbName
+                                                   strncpy(dbName, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 26: //dbHost
+                                                   strncpy(dbHost, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 27: //useMysql
+                                                 if (0 == strcasecmp(p2, "yes"))
+                                                 {
+                                                     params[i].read = 1;
+                                                     useMysql = 1;
+                                                     break;
+                                                 }
+                                                 if (0 == strcasecmp(p2, "no"))
+                                                 {
+                                                     params[i].read = 1;
+                                                     useMysql = 0;
+                                                     break;
+                                                 }
+                                                 useMysql = 0;
+                                                 break;
+ 
+                       case 28: //ignoreErrors
+                                                         if (0 == strcasecmp(p2, "yes"))
+                                                         {
+                                                             params[i].read = 1;
+                                                             ignoreErrors = 1;
+                                                             break;
+                                                         }
+                                                         if (0 == strcasecmp(p2, "no"))
+                                                         {
+                                                             params[i].read = 1;
+                                                             ignoreErrors = 0;
+                                                             break;
+                                                         }
+                                                         ignoreErrors = 1;
+                                                         break;
+ 
                                               default:
                             break;
                                               }
*************** int SETTINGS::Reload ()
*** 426,429 ****
 return ReadSettings();
 }
 //-----------------------------------------------------------------------------
- 
--- 480,482 ----
diff -rbp stg2-2004.08.03-03.02.59/settings.h stg2-2004.08.03-mysql/settings.h
*** stg2-2004.08.03-03.02.59/settings.h Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/settings.h    Thu Aug  5 12:07:29 2004
*************** public:
*** 88,93 ****
--- 88,99 ----
     unsigned userPort;  // рПТФ РП ЛПФПТПНХ РТПЙУИПДЙФ РПДЛМАЮЕОЙЕ ЛМЙЕОФБ
     char      iface[MAX_DEV][DEV_NAME_LEN];   //FreeBSD only
     int     devNum;
+     char dbLogin[100];  //мПЗЙО ДМС РПДЛМАЮЕОЙС Л Mysql
+     char dbPassword[100]; //Mysql password
+     char dbName[100];    //йНС mysql ВБЪЩ
+     char dbHost[100];   //Mysql иПУФ
+     int useMysql;       //пРТЕДЕМСЕФ ОХЦОП МЙ РЙУБФШ ЮФП-МЙВП Ч ВБЪХ ЙМЙ ОЕФ
+     int ignoreErrors;   //пУФБОБЧМЙЧБФШ МЙ УЕТЧЕТ УФЗ, РТЙ ЧПЪОЙЛОПЧЕОЙЙ ПЫЙВЛЙ ЪБРЙУЙ Ч ВБЪХ
 };
 //-----------------------------------------------------------------------------
 #endif
Binary files stg2-2004.08.03-03.02.59/settings.o and stg2-2004.08.03-mysql/settings.o differ
Binary files stg2-2004.08.03-03.02.59/tariff.o and stg2-2004.08.03-mysql/tariff.o differ
Only in stg2-2004.08.03-03.02.59: traffcounter.o
diff -rbp stg2-2004.08.03-03.02.59/user.cpp stg2-2004.08.03-mysql/user.cpp
*** stg2-2004.08.03-03.02.59/user.cpp   Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/user.cpp      Thu Aug  5 12:23:32 2004
***************
*** 55,60 ****
--- 55,62 ----
 #include "msgbuf.h"
 #include "configproto.h"
 
+ #include "mysql.h"
+ 
 extern SETTINGS * settings;
 extern USERS * users;
 extern ADMINS * admins;
*************** const PRIV * priv = admin->GetPriv();
*** 653,658 ****
--- 655,667 ----
 
 double dc = c - cash;
 
+ char sql_query[255];
+ MYSQL mysql;
+ tm * lt;
+ time_t t;
+ 
+ 
+ 
 if (log)
       {
     if (priv->userStat || priv->userCash)
*************** if (log)
*** 661,666 ****
--- 670,703 ----
                      admin->GetLogin(), login, cash, c, msg);
         WriteLog("Admin \'%s\': йЪНЕОЕОЙЕ ДЕОЕЗ. вЩМП %.3f, УФБМП %.3f. %s", 
                  admin->GetLogin(), cash, c, msg);
+  
+        if (settings->useMysql) 
+       {
+               mysql_init(&mysql);
+               if (!mysql_real_connect(&mysql, settings->dbHost, settings->dbLogin, settings->dbPassword,
settings->dbName,0,NULL,0))
+               {
+                       WriteServLog("оЕЧПЪНПЦОП РПДЛМАЮЙФУС Л ВБЪЕ: пЫЙВЛБ: %s\n", mysql_error(&mysql));     
+                       if (!settings->ignoreErrors)
+                               _exit(1);
+               }
+ 
+               t = time(NULL);
+               lt = localtime(&t);
+                 
+               snprintf(sql_query, 255, "INSERT INTO logs (datetime, name, ip, what, client, money, status)
VALUES (\"%d-%d-%d %d:%d:%d\",
+                       \"%s\", \"%s\", \"%s\", \"%s\", %10.4f, \"%s\"\n)", lt->tm_year+1900, lt->tm_mon,
lt->tm_mday, lt->tm_hour, lt->tm_min, 
+                               lt->tm_sec, admin->GetLogin(), login, msg, login, c, "оЕ ПРМБЮЕОП");
+               if (mysql_query(&mysql, sql_query))
+               {
+                       WriteServLog("пЫЙВЛБ: %s\n", mysql_error(&mysql));
+                       if (!settings->ignoreErrors)
+                       _exit(1);
+               }
+       
+               mysql_close(&mysql);
+       }       
+ 
+ 
         lastCash = dc;
         lastTimeCash = time(NULL);
 
*************** void USER::AddCash(double c, char * msg,
*** 697,702 ****
--- 734,745 ----
 ADMIN *admin = confProto->GetCurrAdmin();
 const PRIV * priv = admin->GetPriv();
 
+ char sql_query[255];
+ MYSQL mysql;
+ tm * lt;
+ time_t t;
+ 
+ 
 if (log)
       {
     if (priv->userStat || priv->userCash)
*************** if (log)
*** 705,710 ****
--- 748,782 ----
                  admin->GetLogin(), login, c > 0?"+":"", c, cash, cash + c, msg);
         WriteLog("Admin \'%s\': йЪНЕОЕОЙЕ ДЕОЕЗ: %s%.3f. вЩМП %.3f, УФБМП %.3f. %s", 
                  admin->GetLogin(), c > 0?"+":"", c, cash, cash + c, msg);
+ 
+        if (settings->useMysql) 
+       {
+               mysql_init(&mysql);
+               if (!mysql_real_connect(&mysql, settings->dbHost, settings->dbLogin, settings->dbPassword,
settings->dbName,0,NULL,0))
+               {
+                       WriteServLog("оЕЧПЪНПЦОП РПДЛМАЮЙФУС Л ВБЪЕ: пЫЙВЛБ: %s\n", mysql_error(&mysql));     
+                       if (!settings->ignoreErrors)
+                               exit(1);
+               }
+ 
+               t = time(NULL);
+               lt = localtime(&t);
+                 
+               snprintf(sql_query, 255, "INSERT INTO logs (datetime, name, ip, what, client, money, status)
VALUES (\"%d-%d-%d %d:%d:%d\",
+                       \"%s\", \"%s\", \"%s\", \"%s\", %10.4f, \"%s\"\n)", lt->tm_year+1900, lt->tm_mon,
lt->tm_mday, lt->tm_hour, lt->tm_min, 
+                               lt->tm_sec, admin->GetLogin(), login, msg, login, c, "оЕ ПРМБЮЕОП");
+               if (mysql_query(&mysql, sql_query))
+               {
+                       WriteServLog("пЫЙВЛБ: %s\n", mysql_error(&mysql));
+                       if (settings->ignoreErrors)
+                       exit(1);
+               }
+       
+               mysql_close(&mysql);
+       }       
+ 
+ 
+ 
         lastCash = c;
         lastTimeCash = time(NULL);
 
Only in stg2-2004.08.03-03.02.59: user.o
Only in stg2-2004.08.03-03.02.59: users.o

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

я не силён в програмировании. Кто нибудь может поподробнее описать как пачить? Как использовать эту груду кода?

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

берешь распаковываешь исх. коды сервера от 03 августа

потом делаешь файлик с тем что япривел выше и как нить его называешь, например mysql.patch

после этого пишешь в консоли

patch -p1 < mysql.patch

 

если все классно то не должно быть слов failed

после этого все собираешь как обычно

Ссылка на сообщение
Поделиться на других сайтах
за реализацию идеи говорим спасибо Hash

Это не полноценная реализация. Я отошел от идеи хранить все в базе. Это просто попытка показать, что всетаки нетяжело прикрутить stg+mysql. Реально кода, который выполняет саму запись в базу тут строк 5-7.

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

Да, наверное нужно описать действия патча.

В конфиге добавляются несколько параметров.

dbLogin - логин к mysql

dbPassword - пароль к mysql

dbName - имя базы в mysql

dbHost - хост, если база на одной машине с стг, то можно установить значение в "localhost"

useMysql = значения "yes" или "no". Определяет, включить ли логгинг в базу.

ignoreErrors = значения "yes" или "no". Определяет, нужно ли останавливать сервер стг, при возникновении ошибки записи базу.

В итоге заполняется таблица, структуру которой описали выше. Таблица должна называтся traff. Но это можно поменять в исходниках.

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

Думаю, не будет лишним скопировать сюда мой ответ из другого топика по теме stg+mysql, дабы все что с этим связано было в одном месте.

Как посоветуете реализовать функцию.

При срабатываении файла OnChange чтоб сбрасывались данне в MySQL БД ?

Для примера написал скрипт на Perl+DBI:

структура таблицы:

CREATE TABLE `changes` (
 `datetime` datetime default NULL,
 `login` varchar(255) NOT NULL default '',
 `parametr` varchar(255) NOT NULL default '',
 `old_value` varchar(255) NOT NULL default '',
 `new_value` varchar(255) NOT NULL default ''
) TYPE=MyISAM;

 

код OnChange:

#!/usr/bin/perl
use DBI;

$user = "username";   
$password = "mypassword";   
$database = "database";  

$login = $ARGV[0];
$parametr = $ARGV[1];
$old_value = $ARGV[2];
$new_value = $ARGV[3];

$dbh = DBI->connect("DBI:mysql:$database", $user, $password);
$sth = $dbh->prepare("INSERT INTO changes (datetime, login, parametr, old_value, new_value)
                        VALUES ( NOW(), \"$login\", \"$parametr\", \"$old_value\", \"$new_value\")");
$sth->execute;
$dbh->disconnect;

Коментарии, думаю не нужны, ибо код прост. Кому нужно, тот с легкостью модифицирует его.

 

вариант OnChange на bash:

#!/bin/bash

db_user="login"
db_pass="pass"
db_name="database"

datetime=`date "+ %Y-%m-%d %H:%M:%S"`

login=$1
parametr=$2
old_value=$3
new_value=$4

mysql -u $db_user --password=$db_pass -s -e "use $db_name; insert into changes (datetime, login, parametr, old_value, new_value) values (\"$datetime\", \"$login\", \"$parametr\", \"$old_value\", \"$new_value\");"

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

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

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

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

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

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

Вхід

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

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

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

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