]> git.stg.codes - stg.git/blob - projects/sgconf/common_sg.cpp
Add proper header to use netinet/ip.h on *bsd systems
[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
28 #include <stdio.h>
29 #include <string.h>
30 #include <stdlib.h>
31 #include <errno.h>
32 #include <locale.h>
33 #include <langinfo.h>
34 #include <iostream>
35 #include <iconv.h>
36
37 #include "stg/common.h"
38 #include "sg_error_codes.h"
39 #include "common_sg.h"
40 #include "version_sg.h"
41
42 using namespace std;
43
44 const int usageConf = 0;
45 const int usageInfo = 1;
46
47 const int TO_KOI8 = 0;
48 const int FROM_KOI8 = 1;
49 //-----------------------------------------------------------------------------
50 struct GetUserCbData
51 {
52     void * data;
53     bool * result;
54 };
55 //---------------------------------------------------------------------------
56 struct HelpParams
57 {
58     string setActionName;
59     string getActionName;
60     string valueName;
61     string valueParam;
62 };
63 //---------------------------------------------------------------------------
64 void Usage(int usageType)
65 {
66 printf("Sgconf version: %s\n\n", VERSION_SG);
67
68 char action[4];
69 if (usageType == usageConf)
70     strcpy(action, "set");
71 else
72     strcpy(action, "get");
73
74 printf("To add or to set cash use:\n");
75 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -c <add_cash[:log message]>\n");
76 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -v <set_cash[:log message]>\n");
77 printf("To get cash use:\n");
78 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -c\n\n");
79
80 HelpParams hp[] =
81 {
82     {"set tariff",              "get tariff",           "-t",   "<tariff:now|delayed>"},
83     {"set credit",              "get credit",           "-r",   "<credit>"},
84     {"set credit expire",       "get credit expire",    "-E",   "<credit_expire_date>"},
85     {"set password",            "get password",         "-o",   "<new_password>"},
86     {"set prepaid traffic",     "get prepaid traffic",  "-e",   "<prepaid>"},
87     {"set IP-addresses",        "get IP-addresses",     "-I",   "<*|ip_addr[,ip_addr...]>"},
88     {"set name",                "get name",             "-A",   "<name>"},
89     {"set note",                "get note",             "-N",   "<note>"},
90     {"set street address",      "get street address",   "-D",   "<address>"},
91     {"set email",               "get email",            "-L",   "<email>"},
92     {"set phone",               "get phone",            "-P",   "<phone>"},
93     {"set group",               "get group",            "-G",   "<group>"},
94     {"set/unset down",          "get down",             "-d",   "<0/1>"},
95     {"set/unset \'passive\'",   "get \'passive\'",      "-i",   "<0/1>"},
96     {"set/unset \'disableDetailStat\'",   "get \'disableDetailStat\'",      "--disable-stat",   "<0/1>"},
97     {"set/unset \'alwaysOnline\'",   "get \'alwaysOnline\'",      "--always-online",   "<0/1>"},
98 };
99
100 for (unsigned i = 0; i < sizeof(hp) / sizeof(HelpParams); i++)
101     {
102     printf("To %s use:\n", hp[i].setActionName.c_str());
103     printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> %s %s\n",
104            hp[i].valueName.c_str(), hp[i].valueParam.c_str());
105     printf("To %s use:\n", hp[i].getActionName.c_str());
106     printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> %s\n\n",
107            hp[i].valueName.c_str());
108     }
109
110 printf("To set user\'s upload traffic value use:\n");
111 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --u0 <traff> [--u1<traff> ...]\n");
112 printf("To get user\'s upload traffic value use:\n");
113 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --u0 [--u1 ...]\n\n");
114
115 printf("To set user\'s download traffic value use:\n");
116 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --d0 <traff> [--d1<traff> ...]\n");
117 printf("To get user\'s download traffic value use:\n");
118 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --d0 [--d1 ...]\n\n");
119
120 printf("To set userdata<0...9> use:\n");
121 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --ud0 <userdata> [--ud1<userdata> ...]\n");
122 printf("To get userdata<0...9> use:\n");
123 printf("sgconf get -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> --ud0 [--ud1 ...]\n\n");
124
125 printf("To send message use:\n");
126 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -m <message>\n\n");
127
128 printf("To create user use:\n");
129 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -n\n\n");
130
131 printf("To delete user use:\n");
132 printf("sgconf set -s <server> -p <port> -a <admin> -w <admin_pass> -u <user> -l\n\n");
133 }
134 //---------------------------------------------------------------------------
135 void UsageConf()
136 {
137 Usage(usageConf);
138 }
139 //---------------------------------------------------------------------------
140 void UsageInfo()
141 {
142 Usage(usageInfo);
143 }
144 //---------------------------------------------------------------------------
145 int CheckLogin(const char * login)
146 {
147 for (int i = 0; i < (int)strlen(login); i++)
148     {
149     if (!(( login[i] >= 'a' && login[i] <= 'z')
150         || (login[i] >= 'A' && login[i] <= 'Z')
151         || (login[i] >= '0' && login[i] <= '9')
152         ||  login[i] == '_'
153         ||  login[i] == '-'))
154         {
155         return 1;
156         }
157     }
158 return 0;
159 }
160 //-----------------------------------------------------------------------------
161 short int ParseServerPort(const char * p)
162 {
163 int port;
164 if (str2x(p, port) != 0)
165     {
166     printf("Incorresct server port %s\n", p);
167     exit(NETWORK_ERR_CODE);
168     }
169 return (short)port;
170 }
171 //-----------------------------------------------------------------------------
172 char * ParseAdminLogin(char * adm)
173 {
174 if (CheckLogin(adm))
175     {
176     printf("Incorresct admin login %s\n", adm);
177     exit(PARAMETER_PARSING_ERR_CODE);
178     }
179 return adm;
180 }
181 //-----------------------------------------------------------------------------
182 char * ParsePassword(char * pass)
183 {
184 if (strlen(pass) >= ADM_PASSWD_LEN)
185     {
186     printf("Password too big %s\n", pass);
187     exit(PARAMETER_PARSING_ERR_CODE);
188     }
189
190 return pass;
191 }
192 //-----------------------------------------------------------------------------
193 char * ParseUser(char * usr)
194 {
195 if (CheckLogin(usr))
196     {
197     printf("Incorresct user login %s\n", usr);
198     exit(PARAMETER_PARSING_ERR_CODE);
199     }
200 return usr;
201 }
202 //-----------------------------------------------------------------------------
203 void ConvertKOI8(const string & src, string * dst, int encType)
204 {
205 iconv_t cd;
206 char * ob = new char[src.size() * 2 + 1];
207 char * ib = new char[src.size() + 1];
208
209 strcpy(ib, src.c_str());
210
211 char * outbuf = ob;
212 char * inbuf = ib;
213
214 setlocale(LC_ALL, "");
215
216 char charsetF[100];
217 char charsetT[100];
218
219 if (encType == TO_KOI8)
220     {
221     strcpy(charsetF, nl_langinfo(CODESET));
222     strcpy(charsetT, "koi8-ru");
223     }
224 else
225     {
226     strcpy(charsetT, nl_langinfo(CODESET));
227     strcpy(charsetF, "koi8-ru");
228     }
229
230 size_t nconv = 1;
231
232 size_t insize = strlen(ib);
233 size_t outsize = insize * 2 + 1;
234
235 insize = src.size();
236
237 cd = iconv_open(charsetT, charsetF);
238 if (cd == (iconv_t) -1)
239     {
240     if (errno != EINVAL)
241         printf("error iconv_open\n");
242     else
243         {
244         printf("Warning: iconv from %s to %s failed\n", charsetF, charsetT);
245         *dst = src;
246         return;
247         }
248
249     exit(ICONV_ERR_CODE);
250     }
251
252 #if defined(FREE_BSD) || defined(FREE_BSD5)
253 nconv = iconv(cd, (const char **)&inbuf, &insize, &outbuf, &outsize);
254 #else
255 nconv = iconv(cd, &inbuf, &insize, &outbuf, &outsize);
256 #endif
257 //printf("charsetT=%s charsetF=%s\n", charsetT, charsetF);
258 //printf("ib=%s ob=%s\n", ib, ob);
259 //printf("nconv=%d outsize=%d\n", nconv, outsize);
260 if (nconv == (size_t) -1)
261     {
262     if (errno != EINVAL)
263         {
264         printf("iconv error\n");
265         exit(ICONV_ERR_CODE);
266         }
267     }
268
269 *outbuf = L'\0';
270
271 iconv_close(cd);
272 *dst = ob;
273
274 delete[] ob;
275 delete[] ib;
276 }
277 //-----------------------------------------------------------------------------
278 void ConvertFromKOI8(const string & src, string * dst)
279 {
280 ConvertKOI8(src, dst, FROM_KOI8);
281 }
282 //-----------------------------------------------------------------------------
283 void ConvertToKOI8(const string & src, string * dst)
284 {
285 ConvertKOI8(src, dst, TO_KOI8);
286 }
287 //-----------------------------------------------------------------------------
288 int RecvSetUserAnswer(const char * ans, void * d)
289 {
290 GetUserCbData * gucbd;
291 gucbd = (GetUserCbData *)d;
292
293 bool * result = gucbd->result;
294
295 //REQUEST * req = (REQUEST *)gucbd->data;
296
297 //printf("ans=%s\n", ans);
298 if (strcasecmp("Ok", ans) == 0)
299     *result = true;
300 else
301     *result = false;
302
303 return 0;
304 }
305 //-----------------------------------------------------------------------------
306 struct StringReqParams
307 {
308     string name;
309     RESETABLE<string> reqParam;
310     string * value;
311 };
312 //-----------------------------------------------------------------------------
313 void RecvUserData(USERDATA * ud, void * d)
314 {
315 GetUserCbData * gucbd;
316 gucbd = (GetUserCbData *)d;
317
318 bool * result = gucbd->result;
319
320 REQUEST * req = (REQUEST *)gucbd->data;
321
322 if (ud->login == "")
323     {
324     *result = false;
325     return;
326     }
327
328 if (!req->cash.res_empty())
329     cout << "cash=" << ud->cash << endl;
330
331 if (!req->credit.res_empty())
332     cout << "credit=" << ud->credit << endl;
333
334 if (!req->creditExpire.res_empty())
335     {
336     char buf[32];
337     struct tm brokenTime;
338     time_t tt = ud->creditExpire;
339
340     brokenTime.tm_wday = 0;
341     brokenTime.tm_yday = 0;
342     brokenTime.tm_isdst = 0;
343     brokenTime.tm_hour = 0;
344     brokenTime.tm_min = 0;
345     brokenTime.tm_sec = 0;
346
347     gmtime_r(&tt, &brokenTime);
348
349     strftime(buf, 32, "%Y-%m-%d", &brokenTime);
350
351     cout << "creditExpire=" << buf << endl;
352     }
353
354 if (!req->down.res_empty())
355     cout << "down=" << ud->down << endl;
356
357 if (!req->passive.res_empty())
358     cout << "passive=" << ud->passive << endl;
359
360 if (!req->disableDetailStat.res_empty())
361     cout << "disableDetailStat=" << ud->disableDetailStat << endl;
362
363 if (!req->alwaysOnline.res_empty())
364     cout << "alwaysOnline=" << ud->alwaysOnline << endl;
365
366 if (!req->prepaidTraff.res_empty())
367     cout << "prepaidTraff=" << ud->prepaidTraff << endl;
368
369 for (int i = 0; i < DIR_NUM; i++)
370     {
371     if (!req->u[i].res_empty())
372         cout << "u" << i << "=" << ud->stat.mu[i] << endl;
373     if (!req->d[i].res_empty())
374         cout << "d" << i << "=" << ud->stat.md[i] << endl;
375     }
376
377 for (int i = 0; i < USERDATA_NUM; i++)
378     {
379     if (!req->ud[i].res_empty())
380         {
381         string str;
382         ConvertFromKOI8(ud->userData[i], &str);
383         cout << "userdata" << i << "=" << str << endl;
384         }
385     }
386
387 StringReqParams strReqParams[] =
388 {
389     {"note",     req->note,        &ud->note},
390     {"name",     req->name,        &ud->name},
391     {"address",  req->address,     &ud->address},
392     {"email",    req->email,       &ud->email},
393     {"phone",    req->phone,       &ud->phone},
394     {"group",    req->group,       &ud->group},
395     {"tariff",   req->tariff,      &ud->tariff},
396     {"password", req->usrPasswd,   &ud->password},
397     {"ip",       req->ips,         &ud->ips}    // IP-address of user
398 };
399 for (unsigned i = 0; i < sizeof(strReqParams) / sizeof(StringReqParams); i++)
400     {
401     if (!strReqParams[i].reqParam.res_empty())
402         {
403         string str;
404         ConvertFromKOI8(*strReqParams[i].value, &str);
405         cout << strReqParams[i].name << "=" << str << endl;
406         }
407     }
408 *result = true;
409 }
410 //-----------------------------------------------------------------------------
411 int ProcessSetUser(const std::string &server,
412                    int port,
413                    const std::string &admLogin,
414                    const std::string &admPasswd,
415                    const std::string &str,
416                    void * data,
417                    bool isMessage)
418 {
419 SERVCONF sc;
420
421 bool result = false;
422
423
424 sc.SetServer(server.c_str());  // õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÉÍÑ ÓÅÒ×ÅÒÁ Ó ËÏÔÏÒÇÏ ÚÁÂÉÒÁÔØ ÉÎÆÕ
425 sc.SetPort(port);           // ÁÄÍÉÎÓËÉÊ ÐÏÒÔ ÓÅÒ×ÅÒÁÐÏÒÔ
426 sc.SetAdmLogin(admLogin.c_str());    // ÷ÙÓÔÁ×ÌÑÅÍ ÌÏÇÉΠɠÐÁÒÏÌØ ÁÄÍÉÎÁ
427 sc.SetAdmPassword(admPasswd.c_str());
428
429 // TODO Good variable name :)
430 GetUserCbData gucbd;
431
432 gucbd.data = data;
433 gucbd.result = &result;
434
435 if (isMessage)
436     {
437     sc.SetSendMessageCb(RecvSetUserAnswer, &gucbd);
438     sc.MsgUser(str.c_str());
439     }
440 else
441     {
442     sc.SetChgUserCb(RecvSetUserAnswer, &gucbd);
443     sc.ChgUser(str.c_str());
444     }
445
446 if (result)
447     {
448     printf("Ok\n");
449     return 0;
450     }
451 else
452     {
453     printf("Error\n");
454     return -1;
455     }
456
457 return 0;
458 }
459 //-----------------------------------------------------------------------------
460 int ProcessGetUser(const std::string &server,
461                    int port,
462                    const std::string &admLogin,
463                    const std::string &admPasswd,
464                    const std::string &login,
465                    void * data)
466 {
467 SERVCONF sc;
468
469 bool result = false;
470
471 sc.SetServer(server.c_str());  // õÓÔÁÎÁ×ÌÉ×ÁÅÍ ÉÍÑ ÓÅÒ×ÅÒÁ Ó ËÏÔÏÒÇÏ ÚÁÂÉÒÁÔØ ÉÎÆÕ
472 sc.SetPort(port);           // ÁÄÍÉÎÓËÉÊ ÐÏÒÔ ÓÅÒ×ÅÒÁÐÏÒÔ
473 sc.SetAdmLogin(admLogin.c_str());    // ÷ÙÓÔÁ×ÌÑÅÍ ÌÏÇÉΠɠÐÁÒÏÌØ ÁÄÍÉÎÁ
474 sc.SetAdmPassword(admPasswd.c_str());
475
476 // TODO Good variable name :)
477 GetUserCbData gucbd;
478
479 gucbd.data = data;
480 gucbd.result = &result;
481
482 sc.SetGetUserDataRecvCb(RecvUserData, &gucbd);
483 sc.GetUser(login.c_str());
484
485 if (result)
486     {
487     printf("Ok\n");
488     return 0;
489     }
490 else
491     {
492     printf("Error\n");
493     return -1;
494     }
495
496 return 0;
497 }
498 //-----------------------------------------------------------------------------