f87f418a388fe5e3cd5cde7d6c69c9a27bc71f48
[stg.git] / projects / sgconf / common_sg.cpp
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
19  */
20
21  /*
22  $Author: faust $
23  $Revision: 1.12 $
24  $Date: 2009/06/08 10:02:28 $
25  */
26
27 #include "stg/common.h"
28 #include "sg_error_codes.h"
29 #include "common_sg.h"
30 #include "version_sg.h"
31
32 #include <stdio.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <errno.h>
36 #include <locale.h>
37 #include <langinfo.h>
38 #include <iostream>
39 #include <iconv.h>
40
41 using namespace std;
42
43 const int usageConf = 0;
44 const int usageInfo = 1;
45
46 const int TO_KOI8 = 0;
47 const int FROM_KOI8 = 1;
48 //-----------------------------------------------------------------------------
49 struct GetUserCbData
50 {
51     void * data;
52     bool * result;
53 };
54 //-----------------------------------------------------------------------------
55 struct AuthByCbData
56 {
57     void * data;
58     bool * result;
59 };
60 //---------------------------------------------------------------------------
61 struct HelpParams
62 {
63     string setActionName;
64     string getActionName;
65     string valueName;
66     string valueParam;
67 };
68 //---------------------------------------------------------------------------
69 void Usage(int usageType)
70 {
71 printf("Sgconf version: %s\n\n", VERSION_SG);
72
73 char action[4];
74 if (usageType == usageConf)
75     strcpy(action, "set");
76 else
77     strcpy(action, "get");
78
79 printf("To add or to set cash use:\n");
80 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -c <add_cash[:log message]>\n");
81 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -v <set_cash[:log message]>\n");
82 printf("To get cash use:\n");
83 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -c\n\n");
84
85 HelpParams hp[] =
86 {
87     {"set tariff",              "get tariff",           "-t",   "<tariff:now|delayed>"},
88     {"set credit",              "get credit",           "-r",   "<credit>"},
89     {"set credit expire",       "get credit expire",    "-E",   "<credit_expire_date>"},
90     {"set password",            "get password",         "-o",   "<new_password>"},
91     {"set prepaid traffic",     "get prepaid traffic",  "-e",   "<prepaid>"},
92     {"set IP-addresses",        "get IP-addresses",     "-I",   "<*|ip_addr[,ip_addr...]>"},
93     {"set name",                "get name",             "-A",   "<name>"},
94     {"set note",                "get note",             "-N",   "<note>"},
95     {"set street address",      "get street address",   "-D",   "<address>"},
96     {"set email",               "get email",            "-L",   "<email>"},
97     {"set phone",               "get phone",            "-P",   "<phone>"},
98     {"set group",               "get group",            "-G",   "<group>"},
99     {"set/unset down",          "get down",             "-d",   "<0/1>"},
100     {"set/unset \'passive\'",   "get \'passive\'",      "-i",   "<0/1>"},
101     {"set/unset \'disableDetailStat\'",   "get \'disableDetailStat\'",      "--disable-stat",   "<0/1>"},
102     {"set/unset \'alwaysOnline\'",   "get \'alwaysOnline\'",      "--always-online",   "<0/1>"},
103 };
104
105 for (unsigned i = 0; i < sizeof(hp) / sizeof(HelpParams); i++)
106     {
107     printf("To %s use:\n", hp[i].setActionName.c_str());
108     printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> %s %s\n",
109            hp[i].valueName.c_str(), hp[i].valueParam.c_str());
110     printf("To %s use:\n", hp[i].getActionName.c_str());
111     printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> %s\n\n",
112            hp[i].valueName.c_str());
113     }
114
115 printf("To set user\'s upload traffic value use:\n");
116 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --u0 <traff> [--u1<traff> ...]\n");
117 printf("To get user\'s upload traffic value use:\n");
118 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --u0 [--u1 ...]\n\n");
119
120 printf("To set user\'s download traffic value use:\n");
121 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --d0 <traff> [--d1<traff> ...]\n");
122 printf("To get user\'s download traffic value use:\n");
123 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --d0 [--d1 ...]\n\n");
124
125 printf("To set userdata<0...9> use:\n");
126 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --ud0 <userdata> [--ud1<userdata> ...]\n");
127 printf("To get userdata<0...9> use:\n");
128 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --ud0 [--ud1 ...]\n\n");
129
130 printf("To get user's authorizers list use:\n");
131 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --authorized-by\n\n");
132
133 printf("To send message use:\n");
134 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -m <message>\n\n");
135
136 printf("To create user use:\n");
137 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -n\n\n");
138
139 printf("To delete user use:\n");
140 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -l\n\n");
141 }
142 //---------------------------------------------------------------------------
143 void UsageConf()
144 {
145 Usage(usageConf);
146 }
147 //---------------------------------------------------------------------------
148 void UsageInfo()
149 {
150 Usage(usageInfo);
151 }
152 //---------------------------------------------------------------------------
153 int CheckLogin(const char * login)
154 {
155 for (int i = 0; i < (int)strlen(login); i++)
156     {
157     if (!(( login[i] >= 'a' && login[i] <= 'z')
158         || (login[i] >= 'A' && login[i] <= 'Z')
159         || (login[i] >= '0' && login[i] <= '9')
160         ||  login[i] == '.'
161         ||  login[i] == '_'
162         ||  login[i] == '-'))
163         {
164         return 1;
165         }
166     }
167 return 0;
168 }
169 //-----------------------------------------------------------------------------
170 short int ParseServerPort(const char * p)
171 {
172 int port;
173 if (str2x(p, port) != 0)
174     {
175     printf("Incorresct server port %s\n", p);
176     exit(NETWORK_ERR_CODE);
177     }
178 return (short)port;
179 }
180 //-----------------------------------------------------------------------------
181 char * ParseAdminLogin(char * adm)
182 {
183 if (CheckLogin(adm))
184     {
185     printf("Incorresct admin login %s\n", adm);
186     exit(PARAMETER_PARSING_ERR_CODE);
187     }
188 return adm;
189 }
190 //-----------------------------------------------------------------------------
191 char * ParsePassword(char * pass)
192 {
193 if (strlen(pass) >= ADM_PASSWD_LEN)
194     {
195     printf("Password too big %s\n", pass);
196     exit(PARAMETER_PARSING_ERR_CODE);
197     }
198
199 return pass;
200 }
201 //-----------------------------------------------------------------------------
202 char * ParseUser(char * usr)
203 {
204 if (CheckLogin(usr))
205     {
206     printf("Incorresct user login %s\n", usr);
207     exit(PARAMETER_PARSING_ERR_CODE);
208     }
209 return usr;
210 }
211 //-----------------------------------------------------------------------------
212 void ConvertKOI8(const string & src, string * dst, int encType)
213 {
214 iconv_t cd;
215
216 setlocale(LC_ALL, "");
217
218 char charsetF[100];
219 char charsetT[100];
220
221 if (encType == TO_KOI8)
222     {
223     strcpy(charsetF, nl_langinfo(CODESET));
224     strcpy(charsetT, "koi8-ru");
225     }
226 else
227     {
228     strcpy(charsetT, nl_langinfo(CODESET));
229     strcpy(charsetF, "koi8-ru");
230     }
231
232 size_t nconv = 1;
233
234 cd = iconv_open(charsetT, charsetF);
235 if (cd == (iconv_t) -1)
236     {
237     if (errno != EINVAL)
238         printf("error iconv_open\n");
239     else
240         {
241         printf("Warning: iconv from %s to %s failed\n", charsetF, charsetT);
242         *dst = src;
243         return;
244         }
245
246     exit(ICONV_ERR_CODE);
247     }
248
249 char * ob = new char[src.size() * 2 + 1];
250 char * ib = new char[src.size() + 1];
251
252 strcpy(ib, src.c_str());
253
254 char * outbuf = ob;
255 char * inbuf = ib;
256
257 size_t insize = strlen(ib);
258 size_t outsize = insize * 2 + 1;
259
260 insize = src.size();
261
262 #if defined(CONST_ICONV)
263 nconv = iconv(cd, (const char **)&inbuf, &insize, &outbuf, &outsize);
264 #else
265 nconv = iconv(cd, &inbuf, &insize, &outbuf, &outsize);
266 #endif
267 //printf("charsetT=%s charsetF=%s\n", charsetT, charsetF);
268 //printf("ib=%s ob=%s\n", ib, ob);
269 //printf("nconv=%d outsize=%d\n", nconv, outsize);
270 if (nconv == (size_t) -1)
271     {
272     if (errno != EINVAL)
273         {
274         printf("iconv error\n");
275         exit(ICONV_ERR_CODE);
276         }
277     }
278
279 *outbuf = L'\0';
280
281 iconv_close(cd);
282 *dst = ob;
283
284 delete[] ob;
285 delete[] ib;
286 }
287 //-----------------------------------------------------------------------------
288 void ConvertFromKOI8(const string & src, string * dst)
289 {
290 ConvertKOI8(src, dst, FROM_KOI8);
291 }
292 //-----------------------------------------------------------------------------
293 void ConvertToKOI8(const string & src, string * dst)
294 {
295 ConvertKOI8(src, dst, TO_KOI8);
296 }
297 //-----------------------------------------------------------------------------
298 int RecvSetUserAnswer(const char * ans, void * d)
299 {
300 GetUserCbData * gucbd = static_cast<GetUserCbData*>(d);
301
302 bool * result = gucbd->result;
303
304 if (strcasecmp("Ok", ans) == 0)
305     *result = true;
306 else
307     *result = false;
308
309 return 0;
310 }
311 //-----------------------------------------------------------------------------
312 struct StringReqParams
313 {
314     string name;
315     RESETABLE<string> reqParam;
316     string * value;
317 };
318 //-----------------------------------------------------------------------------
319 void RecvUserData(USERDATA * ud, void * d)
320 {
321 GetUserCbData * gucbd = static_cast<GetUserCbData*>(d);
322
323 bool * result = gucbd->result;
324
325 REQUEST * req = (REQUEST *)gucbd->data;
326
327 if (ud->login == "")
328     {
329     *result = false;
330     return;
331     }
332
333 if (!req->cash.empty())
334     cout << "cash=" << ud->cash << endl;
335
336 if (!req->credit.empty())
337     cout << "credit=" << ud->credit << endl;
338
339 if (!req->creditExpire.empty())
340     {
341     char buf[32];
342     struct tm brokenTime;
343     time_t tt = ud->creditExpire;
344
345     brokenTime.tm_wday = 0;
346     brokenTime.tm_yday = 0;
347     brokenTime.tm_isdst = 0;
348     brokenTime.tm_hour = 0;
349     brokenTime.tm_min = 0;
350     brokenTime.tm_sec = 0;
351
352     gmtime_r(&tt, &brokenTime);
353
354     strftime(buf, 32, "%Y-%m-%d", &brokenTime);
355
356     cout << "creditExpire=" << buf << endl;
357     }
358
359 if (!req->down.empty())
360     cout << "down=" << ud->down << endl;
361
362 if (!req->passive.empty())
363     cout << "passive=" << ud->passive << endl;
364
365 if (!req->disableDetailStat.empty())
366     cout << "disableDetailStat=" << ud->disableDetailStat << endl;
367
368 if (!req->alwaysOnline.empty())
369     cout << "alwaysOnline=" << ud->alwaysOnline << endl;
370
371 if (!req->prepaidTraff.empty())
372     cout << "prepaidTraff=" << ud->prepaidTraff << endl;
373
374 for (int i = 0; i < DIR_NUM; i++)
375     {
376     if (!req->u[i].empty())
377         cout << "u" << i << "=" << ud->stat.mu[i] << endl;
378     if (!req->d[i].empty())
379         cout << "d" << i << "=" << ud->stat.md[i] << endl;
380     }
381
382 for (int i = 0; i < USERDATA_NUM; i++)
383     {
384     if (!req->ud[i].empty())
385         {
386         string str;
387         ConvertFromKOI8(ud->userData[i], &str);
388         cout << "userdata" << i << "=" << str << endl;
389         }
390     }
391
392 StringReqParams strReqParams[] =
393 {
394     {"note",     req->note,        &ud->note},
395     {"name",     req->name,        &ud->name},
396     {"address",  req->address,     &ud->address},
397     {"email",    req->email,       &ud->email},
398     {"phone",    req->phone,       &ud->phone},
399     {"group",    req->group,       &ud->group},
400     {"tariff",   req->tariff,      &ud->tariff},
401     {"password", req->usrPasswd,   &ud->password},
402     {"ip",       req->ips,         &ud->ips} // IP-address of user
403 };
404 for (unsigned i = 0; i < sizeof(strReqParams) / sizeof(StringReqParams); i++)
405     {
406     if (!strReqParams[i].reqParam.empty())
407         {
408         string str;
409         ConvertFromKOI8(*strReqParams[i].value, &str);
410         cout << strReqParams[i].name << "=" << str << endl;
411         }
412     }
413 *result = true;
414 }
415 //-----------------------------------------------------------------------------
416 void RecvAuthByData(const std::vector<std::string> & list, void * d)
417 {
418 AuthByCbData * abcbd = static_cast<AuthByCbData*>(d);
419
420 bool * result = abcbd->result;
421
422 for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it)
423     cout << *it << "\n";
424 cout << endl;
425
426 *result = true;
427 }
428 //-----------------------------------------------------------------------------
429 int ProcessSetUser(const std::string &server,
430                    int port,
431                    const std::string &admLogin,
432                    const std::string &admPasswd,
433                    const std::string &str,
434                    void * data,
435                    bool isMessage)
436 {
437 SERVCONF sc;
438
439 bool result = false;
440
441
442 sc.SetServer(server.c_str());  // õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÉÍÑ ÓÅÒ×ÅÒÁ Ó ËÏÔÏÒÇÏ ÚÁÂÉÒÁÔØ ÉÎÆÕ
443 sc.SetPort(port);           // ÁÄÍÉÎÓËÉÊ ÐÏÒÔ ÓÅÒ×ÅÒÁÐÏÒÔ
444 sc.SetAdmLogin(admLogin.c_str());    // ÷ÙÓÔÁ×ÌÑÅÍ ÌÏÇÉΠɠÐÁÒÏÌØ ÁÄÍÉÎÁ
445 sc.SetAdmPassword(admPasswd.c_str());
446
447 // TODO Good variable name :)
448 GetUserCbData gucbd;
449
450 gucbd.data = data;
451 gucbd.result = &result;
452
453 if (isMessage)
454     {
455     sc.SetSendMessageCb(RecvSetUserAnswer, &gucbd);
456     sc.MsgUser(str.c_str());
457     }
458 else
459     {
460     sc.SetChgUserCb(RecvSetUserAnswer, &gucbd);
461     sc.ChgUser(str.c_str());
462     }
463
464 if (result)
465     {
466     printf("Ok\n");
467     return 0;
468     }
469 else
470     {
471     printf("Error\n");
472     return -1;
473     }
474
475 return 0;
476 }
477 //-----------------------------------------------------------------------------
478 int ProcessGetUser(const std::string &server,
479                    int port,
480                    const std::string &admLogin,
481                    const std::string &admPasswd,
482                    const std::string &login,
483                    void * data)
484 {
485 SERVCONF sc;
486
487 bool result = false;
488
489 sc.SetServer(server.c_str());  // õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÉÍÑ ÓÅÒ×ÅÒÁ Ó ËÏÔÏÒÇÏ ÚÁÂÉÒÁÔØ ÉÎÆÕ
490 sc.SetPort(port);           // ÁÄÍÉÎÓËÉÊ ÐÏÒÔ ÓÅÒ×ÅÒÁÐÏÒÔ
491 sc.SetAdmLogin(admLogin.c_str());    // ÷ÙÓÔÁ×ÌÑÅÍ ÌÏÇÉΠɠÐÁÒÏÌØ ÁÄÍÉÎÁ
492 sc.SetAdmPassword(admPasswd.c_str());
493
494 // TODO Good variable name :)
495 GetUserCbData gucbd;
496
497 gucbd.data = data;
498 gucbd.result = &result;
499
500 sc.SetGetUserDataRecvCb(RecvUserData, &gucbd);
501 sc.GetUser(login.c_str());
502
503 if (result)
504     {
505     printf("Ok\n");
506     return 0;
507     }
508 else
509     {
510     printf("Error\n");
511     return -1;
512     }
513
514 return 0;
515 }
516 //-----------------------------------------------------------------------------
517 int ProcessAuthBy(const std::string &server,
518                   int port,
519                   const std::string &admLogin,
520                   const std::string &admPasswd,
521                   const std::string &login,
522                   void * data)
523 {
524 SERVCONF sc;
525
526 bool result = false;
527
528 sc.SetServer(server.c_str());  // õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÉÍÑ ÓÅÒ×ÅÒÁ Ó ËÏÔÏÒÇÏ ÚÁÂÉÒÁÔØ ÉÎÆÕ
529 sc.SetPort(port);           // ÁÄÍÉÎÓËÉÊ ÐÏÒÔ ÓÅÒ×ÅÒÁÐÏÒÔ
530 sc.SetAdmLogin(admLogin.c_str());    // ÷ÙÓÔÁ×ÌÑÅÍ ÌÏÇÉΠɠÐÁÒÏÌØ ÁÄÍÉÎÁ
531 sc.SetAdmPassword(admPasswd.c_str());
532
533 // TODO Good variable name :)
534 AuthByCbData abcbd;
535
536 abcbd.data = data;
537 abcbd.result = &result;
538
539 sc.SetGetUserAuthByRecvCb(RecvAuthByData, &abcbd);
540 sc.GetUserAuthBy(login.c_str());
541
542 if (result)
543     {
544     printf("Ok\n");
545     return 0;
546     }
547 else
548     {
549     printf("Error\n");
550     return -1;
551     }
552
553 return 0;
554 }
555 //-----------------------------------------------------------------------------