]> git.stg.codes - stg.git/blob - projects/sgconf/sginfo.cpp
[NY Flight] Improved XML parsing.
[stg.git] / projects / sgconf / sginfo.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.3 $
24  $Date: 2009/06/22 15:57:49 $
25  */
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <getopt.h>
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #include <netinet/in.h>
33 #include <arpa/inet.h>
34 #include <string.h>
35 #include <iconv.h>
36 #include <string>
37 #include <list>
38 #include <errno.h>
39
40 #include "stg/common.h"
41 #include "stg/netunit.h"
42 #include "request.h"
43 #include "common_sg.h"
44 #include "sg_error_codes.h"
45
46 using namespace std;
47
48 time_t stgTime;
49
50 int ParseReplyGet(void * data, list<string> * ans);
51 int ParseReplySet(void * data, list<string> * ans);
52
53 struct option long_options_get[] = {
54 {"server",      1, 0, 's'},  //Server
55 {"port",        1, 0, 'p'},  //Port
56 {"admin",       1, 0, 'a'},  //Admin
57 {"admin_pass",  1, 0, 'w'},  //passWord
58 {"user",        1, 0, 'u'},  //User
59 {"addcash",     0, 0, 'c'},  //Add Cash
60 //{"setcash",     0, 0, 'v'},  //Set Cash
61 {"credit",      0, 0, 'r'},  //cRedit
62 {"tariff",      0, 0, 't'},  //Tariff
63 {"message",     0, 0, 'm'},  //message
64 {"password",    0, 0, 'o'},  //password
65 {"down",        0, 0, 'd'},  //down
66 {"passive",     0, 0, 'i'},  //passive
67 {"u0",          0, 0, 500},  //U0
68 {"u1",          0, 0, 501},  //U1
69 {"u2",          0, 0, 502},  //U2
70 {"u3",          0, 0, 503},  //U3
71 {"u4",          0, 0, 504},  //U4
72 {"u5",          0, 0, 505},  //U5
73 {"u6",          0, 0, 506},  //U6
74 {"u7",          0, 0, 507},  //U7
75 {"u8",          0, 0, 508},  //U8
76 {"u9",          0, 0, 509},  //U9
77 {"d0",          0, 0, 600},  //D0
78 {"d1",          0, 0, 601},  //D1
79 {"d2",          0, 0, 602},  //D2
80 {"d3",          0, 0, 603},  //D3
81 {"d4",          0, 0, 604},  //D4
82 {"d5",          0, 0, 605},  //D5
83 {"d6",          0, 0, 606},  //D6
84 {"d7",          0, 0, 607},  //D7
85 {"d8",          0, 0, 608},  //D8
86 {"d9",          0, 0, 609},  //D9
87
88 {"ud0",         0, 0, 700},  //UserData0
89 {"ud1",         0, 0, 701},  //UserData1
90 {"ud2",         0, 0, 702},  //UserData2
91 {"ud3",         0, 0, 703},  //UserData3
92 {"ud4",         0, 0, 704},  //UserData4
93 {"ud5",         0, 0, 705},  //UserData5
94 {"ud6",         0, 0, 706},  //UserData6
95 {"ud7",         0, 0, 707},  //UserData7
96 {"ud8",         0, 0, 708},  //UserData8
97 {"ud9",         0, 0, 709},  //UserData9
98
99 {"prepaid",     0, 0, 'e'},  //prepaid traff
100 {"create",      0, 0, 'n'},  //create
101 {"delete",      0, 0, 'l'},  //delete
102
103 {"note",        0, 0, 'N'},  //Note
104 {"name",        0, 0, 'A'},  //nAme
105 {"address",     0, 0, 'D'},  //aDdress
106 {"email",       0, 0, 'L'},  //emaiL
107 {"phone",       0, 0, 'P'},  //phone
108 {"group",       0, 0, 'G'},  //Group
109
110 {0, 0, 0, 0}};
111
112 struct option long_options_set[] = {
113 {"server",      1, 0, 's'},  //Server
114 {"port",        1, 0, 'p'},  //Port
115 {"admin",       1, 0, 'a'},  //Admin
116 {"admin_pass",  1, 0, 'w'},  //passWord
117 {"user",        1, 0, 'u'},  //User
118 {"addcash",     1, 0, 'c'},  //Add Cash
119 {"setcash",     1, 0, 'v'},  //Set Cash
120 {"credit",      1, 0, 'r'},  //cRedit
121 {"tariff",      1, 0, 't'},  //Tariff
122 {"message",     1, 0, 'm'},  //message
123 {"password",    1, 0, 'o'},  //password
124 {"down",        1, 0, 'd'},  //down
125 {"passive",     1, 0, 'i'},  //passive
126 {"u0",          1, 0, 500},  //U0
127 {"u1",          1, 0, 501},  //U1
128 {"u2",          1, 0, 502},  //U2
129 {"u3",          1, 0, 503},  //U3
130 {"u4",          1, 0, 504},  //U4
131 {"u5",          1, 0, 505},  //U5
132 {"u6",          1, 0, 506},  //U6
133 {"u7",          1, 0, 507},  //U7
134 {"u8",          1, 0, 508},  //U8
135 {"u9",          1, 0, 509},  //U9
136 {"d0",          1, 0, 600},  //D0
137 {"d1",          1, 0, 601},  //D1
138 {"d2",          1, 0, 602},  //D2
139 {"d3",          1, 0, 603},  //D3
140 {"d4",          1, 0, 604},  //D4
141 {"d5",          1, 0, 605},  //D5
142 {"d6",          1, 0, 606},  //D6
143 {"d7",          1, 0, 607},  //D7
144 {"d8",          1, 0, 608},  //D8
145 {"d9",          1, 0, 609},  //D9
146
147 {"ud0",         1, 0, 700},  //UserData
148 {"ud1",         1, 0, 701},  //UserData1
149 {"ud2",         1, 0, 702},  //UserData2
150 {"ud3",         1, 0, 703},  //UserData3
151 {"ud4",         1, 0, 704},  //UserData4
152 {"ud5",         1, 0, 705},  //UserData5
153 {"ud6",         1, 0, 706},  //UserData6
154 {"ud7",         1, 0, 707},  //UserData7
155 {"ud8",         1, 0, 708},  //UserData8
156 {"ud9",         1, 0, 709},  //UserData9
157
158 {"prepaid",     1, 0, 'e'},  //prepaid traff
159 {"create",      1, 0, 'n'},  //create
160 {"delete",      1, 0, 'l'},  //delete
161
162 {"note",        1, 0, 'N'},  //Note
163 {"name",        1, 0, 'A'},  //nAme
164 {"address",     1, 0, 'D'},  //aDdress
165 {"email",       1, 0, 'L'},  //emaiL
166 {"phone",       1, 0, 'P'},  //phone
167 {"group",       1, 0, 'G'},  //Group
168
169 {0, 0, 0, 0}};
170
171 //-----------------------------------------------------------------------------
172 void CreateRequestGet(REQUEST * req, char * r)
173 {
174 string r1;
175 r1 = "<GetUser login=\"" + req->login.const_data() + "\"/>\n";
176 strcpy(r, r1.c_str());
177 }
178 //-----------------------------------------------------------------------------
179 double ParseCash(const char * c, string * message)
180 {
181 //-c 123.45:log message
182 double cash;
183 char * msg;
184 char * str;
185 str = new char[strlen(c) + 1];
186
187 strncpy(str, c, strlen(c));
188 str[strlen(c)] = 0;
189
190 msg = strchr(str, ':');
191
192 if (msg)
193     {
194     *message =  msg + 1;
195     str[msg - str] = 0;
196     }
197 else
198     *message = "";
199
200 if (strtodouble2(str, cash) != 0)
201     {
202     printf("Incorrect cash value %s\n", c);
203     exit(PARAMETER_PARSING_ERR_CODE);
204     }
205
206 delete[] str;
207 return cash;
208 }
209 //-----------------------------------------------------------------------------
210 double ParseCredit(const char * c)
211 {
212 double credit;
213 if (strtodouble2(c, credit) != 0)
214     {
215     printf("Incorrect credit value %s\n", c);
216     exit(PARAMETER_PARSING_ERR_CODE);
217     }
218
219 return credit;
220 }
221 //-----------------------------------------------------------------------------
222 double ParsePrepaidTraffic(const char * c)
223 {
224 double credit;
225 if (strtodouble2(c, credit) != 0)
226     {
227     printf("Incorrect prepaid traffic value %s\n", c);
228     exit(PARAMETER_PARSING_ERR_CODE);
229     }
230
231 return credit;
232 }
233 //-----------------------------------------------------------------------------
234 int64_t ParseTraff(const char * c)
235 {
236 int64_t traff;
237 if (str2x(c, traff) != 0)
238     {
239     printf("Incorrect credit value %s\n", c);
240     exit(PARAMETER_PARSING_ERR_CODE);
241     }
242
243 return traff;
244 }
245 //-----------------------------------------------------------------------------
246 bool ParseDownPassive(const char * dp)
247 {
248 if (!(dp[1] == 0 && (dp[0] == '1' || dp[0] == '0')))
249     {
250     printf("Incorrect value %s\n", dp);
251     exit(PARAMETER_PARSING_ERR_CODE);
252     }
253
254 return dp[0] - '0';
255 }
256 //-----------------------------------------------------------------------------
257 string ParseTariff(const char * t, int &chgType)
258 {
259 int l = strlen(t);
260 char * s;
261 s = new char[l];
262 char * s1, * s2;
263 string ss;
264
265 strcpy(s, t);
266
267 s1 = strtok(s, ":");
268
269 if (strlen(s1) >= TARIFF_NAME_LEN)
270     {
271     printf("Tariff name too big %s\n", s1);
272     exit(PARAMETER_PARSING_ERR_CODE);
273     }
274
275 //*tariff = s;
276
277 if (CheckLogin(s1))
278     {
279     printf("Incorrect tariff value %s\n", t);
280     exit(PARAMETER_PARSING_ERR_CODE);
281     }
282
283 s2 = strtok(NULL, ":");
284
285 chgType = -1;
286
287 if (s2 == NULL)
288     {
289     chgType = TARIFF_NOW;
290     ss = s;
291     delete[] s;
292     return ss;
293     }
294
295
296 if (strcmp(s2, "now") == 0)
297     chgType = TARIFF_NOW;
298
299 if (strcmp(s2, "delayed") == 0)
300     chgType = TARIFF_DEL;
301
302 if (strcmp(s2, "recalc") == 0)
303     chgType = TARIFF_REC;
304
305 if (chgType < 0)
306     {
307     printf("Incorrect tariff value %s\n", t);
308     exit(PARAMETER_PARSING_ERR_CODE);
309     }
310
311 ss = s;
312 delete[] s;
313 return ss;
314 }
315 //-----------------------------------------------------------------------------
316 void ParseAnyString(const char * c, string * msg)
317 {
318 iconv_t cd;
319 char * ob = new char[strlen(c) + 1];
320 char * ib = new char[strlen(c) + 1];
321
322 strcpy(ib, c);
323
324 char * outbuf = ob;
325 char * inbuf = ib;
326
327 setlocale(LC_ALL, "");
328
329 char charsetF[255];
330 strncpy(charsetF, nl_langinfo(CODESET), 255);
331
332 char * charsetT = "koi8-ru";
333
334 size_t nconv = 1;
335
336 size_t insize = strlen(ib);
337 size_t outsize = strlen(ib);
338
339 insize = strlen(c);
340
341 cd = iconv_open(charsetT, charsetF);
342 if (cd == (iconv_t) -1)
343     {
344     if (errno == EINVAL)
345         {
346         printf("Warning: iconv from %s to %s failed\n", charsetF, charsetT);
347         *msg = c;
348         return;
349         }
350     else
351         printf("error iconv_open\n");
352
353     exit(ICONV_ERR_CODE);
354     }
355
356 nconv = iconv (cd, &inbuf, &insize, &outbuf, &outsize);
357 //printf("nconv=%d outsize=%d\n", nconv, outsize);
358 if (nconv == (size_t) -1)
359     {
360     if (errno != EINVAL)
361         {
362         printf("iconv error\n");
363         exit(ICONV_ERR_CODE);
364         }
365     }
366
367 *outbuf = L'\0';
368
369 iconv_close(cd);
370 *msg = ob;
371
372 delete[] ob;
373 delete[] ib;
374 }
375 //-----------------------------------------------------------------------------
376 void CreateRequestSet(REQUEST * req, char * r)
377 {
378 const int strLen = 10024;
379 char str[strLen];
380 memset(str, 0, strLen);
381
382 r[0] = 0;
383
384 if (!req->usrMsg.res_empty())
385     {
386     int len = req->usrMsg.const_data().length() * 2 + 1;
387     char * msg = new char[len];
388     memset(msg, 0, len);
389     Encode12(msg, req->usrMsg.const_data().c_str(), req->usrMsg.const_data().length());
390
391     sprintf(str, "<Message login=\"%s\" msgver=\"1\" msgtype=\"1\" repeat=\"0\" repeatperiod=\"0\" showtime=\"0\" text=\"%s\"/>", req->login.const_data().c_str(), msg);
392     //sprintf(str, "<message login=\"%s\" priority=\"0\" text=\"%s\"/>\n", req->login, msg);
393     strcat(r, str);
394
395     delete[] msg;
396     return;
397     }
398
399 if (req->deleteUser)
400     {
401     sprintf(str, "<DelUser login=\"%s\"/>", req->login.const_data().c_str());
402     strcat(r, str);
403     //printf("%s\n", r);
404     return;
405     }
406
407 if (req->createUser)
408     {
409     sprintf(str, "<AddUser> <login value=\"%s\"/> </AddUser>", req->login.const_data().c_str());
410     strcat(r, str);
411     //printf("%s\n", r);
412     return;
413     }
414
415 strcat(r, "<SetUser>\n");
416 sprintf(str, "<login value=\"%s\"/>\n", req->login.const_data().c_str());
417 strcat(r, str);
418 if (!req->credit.res_empty())
419     {
420     sprintf(str, "<credit value=\"%f\"/>\n", req->credit.const_data());
421     strcat(r, str);
422     }
423
424 if (!req->prepaidTraff.res_empty())
425     {
426     sprintf(str, "<FreeMb value=\"%f\"/>\n", req->prepaidTraff.const_data());
427     strcat(r, str);
428     }
429
430 if (!req->cash.res_empty())
431     {
432     int len = req->message.length() * 2 + 1;
433     char * msg = new char[len];
434     memset(msg, 0, len);
435
436     Encode12(msg, req->message.c_str(), req->message.length());
437     sprintf(str, "<cash add=\"%f\" msg=\"%s\"/>\n", req->cash.const_data(), msg);
438     strcat(r, str);
439     delete[] msg;
440     }
441
442 if (!req->setCash.res_empty())
443     {
444     int len = req->message.length() * 2 + 1;
445     char * msg = new char[len];
446     memset(msg, 0, len);
447     Encode12(msg, req->message.c_str(), req->message.length());
448     sprintf(str, "<cash set=\"%f\" msg=\"%s\"/>\n", req->setCash.const_data(), msg);
449     strcat(r, str);
450     delete[] msg;
451     }
452
453 if (!req->usrPasswd.res_empty())
454     {
455     sprintf(str, "<password value=\"%s\" />\n", req->usrPasswd.const_data().c_str());
456     strcat(r, str);
457     }
458
459 if (!req->down.res_empty())
460     {
461     sprintf(str, "<down value=\"%d\" />\n", req->down.const_data());
462     strcat(r, str);
463     }
464
465 if (!req->passive.res_empty())
466     {
467     sprintf(str, "<passive value=\"%d\" />\n", req->passive.const_data());
468     strcat(r, str);
469     }
470
471 int uPresent = false;
472 int dPresent = false;
473 for (int i = 0; i < DIR_NUM; i++)
474     {
475     if (!req->u[i].res_empty())
476         {
477         if (!uPresent && !dPresent)
478             {
479             sprintf(str, "<traff ");
480             strcat(r, str);
481             uPresent = true;
482             }
483
484         stringstream ss;
485         ss << req->u[i].const_data();
486         //sprintf(str, "MU%d=\"%lld\" ", i, req->u[i].const_data());
487         sprintf(str, "MU%d=\"%s\" ", i, ss.str().c_str());
488         strcat(r, str);
489         }
490     if (!req->d[i].res_empty())
491         {
492         if (!uPresent && !dPresent)
493             {
494             sprintf(str, "<traff ");
495             strcat(r, str);
496             dPresent = true;
497             }
498
499         stringstream ss;
500         ss << req->d[i].const_data();
501         sprintf(str, "MD%d=\"%s\" ", i, ss.str().c_str());
502         strcat(r, str);
503         }
504     }
505 if (uPresent || dPresent)
506     {
507     strcat(r, "/>");
508     }
509
510 //printf("%s\n", r);
511
512 if (!req->tariff.res_empty())
513     {
514     switch (req->chgTariff)
515         {
516         case TARIFF_NOW:
517             sprintf(str, "<tariff now=\"%s\"/>\n", req->tariff.const_data().c_str());
518             strcat(r, str);
519             break;
520         case TARIFF_REC:
521             sprintf(str, "<tariff recalc=\"%s\"/>\n", req->tariff.const_data().c_str());
522             strcat(r, str);
523             break;
524         case TARIFF_DEL:
525             sprintf(str, "<tariff delayed=\"%s\"/>\n", req->tariff.const_data().c_str());
526             strcat(r, str);
527             break;
528         }
529
530     }
531
532 if (!req->note.res_empty())
533     {
534     int len = req->note.const_data().length() * 2 + 1;
535     char * note = new char[len];
536     memset(note, 0, len);
537
538     Encode12(note, req->note.const_data().c_str(), req->note.const_data().length());
539
540     sprintf(str, "<note value=\"%s\"/>", note);
541     strcat(r, str);
542     delete[] note;
543     }
544
545 if (!req->name.res_empty())
546     {
547     int len = req->note.const_data().length() * 2 + 1;
548     char * name = new char[len];
549     memset(name, 0, len);
550
551     Encode12(name, req->name.const_data().c_str(), req->name.const_data().length());
552
553     sprintf(str, "<name value=\"%s\"/>", name);
554     strcat(r, str);
555     delete[] name;
556     }
557
558 if (!req->address.res_empty())
559     {
560     int len = req->note.const_data().length() * 2 + 1;
561     char * address = new char[len];
562     memset(address, 0, len);
563
564     Encode12(address, req->address.const_data().c_str(), req->address.const_data().length());
565
566     sprintf(str, "<address value=\"%s\"/>", address);
567     strcat(r, str);
568     delete[] address;
569     }
570
571 if (!req->email.res_empty())
572     {
573     int len = req->note.const_data().length() * 2 + 1;
574     char * email = new char[len];
575     memset(email, 0, len);
576
577     Encode12(email, req->email.const_data().c_str(), req->email.const_data().length());
578
579     sprintf(str, "<email value=\"%s\"/>", email);
580     strcat(r, str);
581     delete[] email;
582     }
583
584 if (!req->phone.res_empty())
585     {
586     int len = req->note.const_data().length() * 2 + 1;
587     char * phone = new char[len];
588     memset(phone, 0, len);
589
590     Encode12(phone, req->phone.const_data().c_str(), req->phone.const_data().length());
591
592     sprintf(str, "<phone value=\"%s\"/>", phone);
593     strcat(r, str);
594     delete[] phone;
595     }
596
597 if (!req->group.res_empty())
598     {
599     int len = req->note.const_data().length() * 2 + 1;
600     char * group = new char[len];
601     memset(group, 0, len);
602
603     Encode12(group, req->group.const_data().c_str(), req->group.const_data().length());
604
605     sprintf(str, "<group value=\"%s\"/>", group);
606     strcat(r, str);
607     delete[] group;
608     }
609
610 for (int i = 0; i < USERDATA_NUM; i++)
611     {
612     if (!req->ud[i].res_empty())
613         {
614         int len = req->ud[i].const_data().length() * 2 + 1;
615         char * ud = new char[len];
616         memset(ud, 0, len);
617
618         Encode12(ud, req->ud[i].const_data().c_str(), req->ud[i].const_data().length());
619
620         sprintf(str, "<userdata%d value=\"%s\"/>", i, ud);
621         strcat(r, str);
622         delete[] ud;
623         }
624     }
625
626 strcat(r, "</SetUser>\n");
627 }
628 //-----------------------------------------------------------------------------
629 int CheckParameters(REQUEST * req)
630 {
631 int u = false;
632 int d = false;
633 int ud = false;
634 int a = !req->admLogin.res_empty()
635     && !req->admPasswd.res_empty()
636     && !req->server.res_empty()
637     && !req->port.res_empty()
638     && !req->login.res_empty();
639
640 int b = !req->cash.res_empty()
641     || !req->setCash.res_empty()
642     || !req->credit.res_empty()
643     || !req->prepaidTraff.res_empty()
644     || !req->tariff.res_empty()
645     || !req->usrMsg.res_empty()
646     || !req->usrPasswd.res_empty()
647
648     || !req->note.res_empty()
649     || !req->name.res_empty()
650     || !req->address.res_empty()
651     || !req->email.res_empty()
652     || !req->phone.res_empty()
653     || !req->group.res_empty();
654
655 for (int i = 0; i < DIR_NUM; i++)
656     {
657     if (req->u[i].res_empty())
658         {
659         u = true;
660         break;
661         }
662     }
663
664 for (int i = 0; i < DIR_NUM; i++)
665     {
666     if (req->d[i].res_empty())
667         {
668         d = true;
669         break;
670         }
671     }
672
673 for (int i = 0; i < DIR_NUM; i++)
674     {
675     if (req->ud[i].res_empty())
676         {
677         ud = true;
678         break;
679         }
680     }
681
682
683 //printf("a=%d, b=%d, u=%d, d=%d ud=%d\n", a, b, u, d, ud);
684 return a && (b || u || d || ud);
685 }
686 //-----------------------------------------------------------------------------
687 int CheckParametersGet(REQUEST * req)
688 {
689 return CheckParameters(req);
690 }
691 //-----------------------------------------------------------------------------
692 int CheckParametersSet(REQUEST * req)
693 {
694 return CheckParameters(req);
695 }
696 //-----------------------------------------------------------------------------
697 int mainGet(int argc, char **argv)
698 {
699 int c;
700 REQUEST req;
701 RESETABLE<string>   t1;
702
703 char * short_options_get = "s:p:a:w:u:crtmodieNADLPG";
704 int option_index = -1;
705
706 while (1)
707     {
708     option_index = -1;
709     c = getopt_long(argc, argv, short_options_get, long_options_get, &option_index);
710     if (c == -1)
711         break;
712
713     switch (c)
714         {
715         case 's': //server
716             req.server = optarg;
717             break;
718
719         case 'p': //port
720             req.port = ParseServerPort(optarg);
721             //req.portReq = 1;
722             break;
723
724         case 'a': //admin
725             req.admLogin = ParseAdminLogin(optarg);
726             break;
727
728         case 'w': //admin password
729             req.admPasswd = ParsePassword(optarg);
730             break;
731
732         case 'o': //change user password
733             req.usrPasswd = ParsePassword(optarg);
734             break;
735
736         case 'u': //user
737             req.login = ParseUser(optarg);
738             break;
739
740         case 'c': //get cash
741             req.cash = 1;
742             break;
743
744         case 'r': //credit
745             req.credit = 1;
746             break;
747
748         case 'd': //down
749             req.down = 1;
750             break;
751
752         case 'i': //passive
753             req.passive = 1;
754             break;
755
756         case 't': //tariff
757             req.tariff = " ";
758             break;
759
760         case 'e': //Prepaid Traffic
761             req.prepaidTraff = 1;
762             break;
763
764         case 'N': //Note
765             req.note = " ";
766             break;
767
768         case 'A': //nAme
769             req.name = " ";
770             break;
771
772         case 'D': //aDdress
773             req.address =" ";
774             break;
775
776         case 'L': //emaiL
777             req.email = " ";
778             break;
779
780         case 'P': //phone
781             req.phone = " ";
782             break;
783
784         case 'G': //Group
785             req.group = " ";
786             break;
787
788         case 500: //U
789         case 501:
790         case 502:
791         case 503:
792         case 504:
793         case 505:
794         case 506:
795         case 507:
796         case 508:
797         case 509:
798             //printf("U%d\n", c - 500);
799             req.u[c - 500] = 1;
800             break;
801
802         case 600: //D
803         case 601:
804         case 602:
805         case 603:
806         case 604:
807         case 605:
808         case 606:
809         case 607:
810         case 608:
811         case 609:
812             //printf("D%d\n", c - 600);
813             req.d[c - 600] = 1;
814             break;
815
816         case 700: //UserData
817         case 701:
818         case 702:
819         case 703:
820         case 704:
821         case 705:
822         case 706:
823         case 707:
824         case 708:
825         case 709:
826             //printf("UD%d\n", c - 700);
827             req.ud[c - 700] = " ";
828             break;
829
830         case '?':
831             //printf ("Unknown option \n");
832             break;
833
834         default:
835             printf ("?? getopt returned character code 0%o ??\n", c);
836         }
837     }
838
839 if (optind < argc)
840     {
841     printf ("non-option ARGV-elements: ");
842     while (optind < argc)
843         printf ("%s ", argv[optind++]);
844     UsageInfo();
845     exit(PARAMETER_PARSING_ERR_CODE);
846     }
847
848 if (CheckParametersGet(&req) == 0)
849     {
850     //printf("Parameter needed\n");
851     UsageInfo();
852     exit(PARAMETER_PARSING_ERR_CODE);
853     }
854
855
856 const int rLen = 20000;
857 char rstr[rLen];
858 memset(rstr, 0, rLen);
859
860 CreateRequestGet(&req, rstr);
861 Process(req.server, req.port, req.admLogin, req.admPasswd, rstr, ParseReplyGet);
862
863 return 0;
864 }
865 //-----------------------------------------------------------------------------
866 int mainSet(int argc, char **argv)
867 {
868 string str;
869
870 int c;
871 REQUEST req;
872
873 RESETABLE<string>   t1;
874
875 char * short_options_set = "s:p:a:w:u:c:r:t:m:o:d:i:e:v:nlN:A:D:L:P:G:";
876
877 while (1)
878     {
879     int option_index = -1;
880
881     c = getopt_long(argc, argv, short_options_set, long_options_set, &option_index);
882     if (c == -1)
883         break;
884
885     switch (c)
886         {
887         case 's': //server
888             req.server = optarg;
889             break;
890
891         case 'p': //port
892             req.port = ParseServerPort(optarg);
893             //req.portReq = 1;
894             break;
895
896         case 'a': //admin
897             req.admLogin = ParseAdminLogin(optarg);
898             break;
899
900         case 'w': //admin password
901             req.admPasswd = ParsePassword(optarg);
902             break;
903
904         case 'o': //change user password
905             req.usrPasswd = ParsePassword(optarg);
906             break;
907
908         case 'u': //user
909             req.login = ParseUser(optarg);
910             break;
911
912         case 'c': //add cash
913             req.cash = ParseCash(optarg, &req.message);
914             break;
915
916         case 'v': //set cash
917             req.setCash = ParseCash(optarg, &req.message);
918             break;
919
920         case 'r': //credit
921             req.credit = ParseCredit(optarg);
922             break;
923
924         case 'd': //down
925             req.down = ParseDownPassive(optarg);
926             break;
927
928         case 'i': //passive
929             req.passive = ParseDownPassive(optarg);
930             break;
931
932         case 't': //tariff
933             req.tariff = ParseTariff(optarg, req.chgTariff);
934             break;
935
936         case 'm': //message
937             //ParseMessage(optarg, &req.usrMsg);
938             req.usrMsg = optarg;
939             break;
940
941         case 'e': //Prepaid Traffic
942             req.prepaidTraff = ParsePrepaidTraffic(optarg);
943             break;
944
945         case 'n': //Create User
946             req.createUser = true;
947             break;
948
949         case 'l': //Delete User
950             req.deleteUser = true;
951             break;
952
953         case 'N': //Note
954             ParseAnyString(optarg, &str);
955             req.note = str;
956             break;
957
958         case 'A': //nAme
959             ParseAnyString(optarg, &str);
960             req.name = str;
961             break;
962
963         case 'D': //aDdress
964             ParseAnyString(optarg, &str);
965             req.address = str;
966             break;
967
968         case 'L': //emaiL
969             ParseAnyString(optarg, &str);
970             req.email = str;
971             break;
972
973         case 'P': //phone
974             ParseAnyString(optarg, &str);
975             req.phone = str;
976             break;
977
978         case 'G': //Group
979             ParseAnyString(optarg, &str);
980             req.group = str;
981             break;
982
983         case 500: //U
984         case 501:
985         case 502:
986         case 503:
987         case 504:
988         case 505:
989         case 506:
990         case 507:
991         case 508:
992         case 509:
993             //printf("U%d\n", c - 500);
994             req.u[c - 500] = ParseTraff(optarg);
995             break;
996
997         case 600: //D
998         case 601:
999         case 602:
1000         case 603:
1001         case 604:
1002         case 605:
1003         case 606:
1004         case 607:
1005         case 608:
1006         case 609:
1007             //printf("D%d\n", c - 600);
1008             req.d[c - 600] = ParseTraff(optarg);
1009             break;
1010
1011         case 700: //UserData
1012         case 701:
1013         case 702:
1014         case 703:
1015         case 704:
1016         case 705:
1017         case 706:
1018         case 707:
1019         case 708:
1020         case 709:
1021             ParseAnyString(optarg, &str);
1022             //printf("UD%d\n", c - 700);
1023             req.ud[c - 700] = str;
1024             break;
1025
1026         case '?':
1027             //printf ("Unknown option \n");
1028             break;
1029
1030         default:
1031             printf ("?? getopt returned character code 0%o ??\n", c);
1032         }
1033     }
1034
1035 if (optind < argc)
1036     {
1037     printf ("non-option ARGV-elements: ");
1038     while (optind < argc)
1039         printf ("%s ", argv[optind++]);
1040     UsageConf();
1041     exit(PARAMETER_PARSING_ERR_CODE);
1042     }
1043
1044 if (CheckParametersSet(&req) == 0)
1045     {
1046     //printf("Parameter needed\n");
1047     UsageConf();
1048     exit(PARAMETER_PARSING_ERR_CODE);
1049     }
1050
1051 const int rLen = 20000;
1052 char rstr[rLen];
1053 memset(rstr, 0, rLen);
1054
1055 CreateRequestGet(&req, rstr);
1056 Process(req.server, req.port, req.admLogin, req.admPasswd, rstr, ParseReplySet);
1057 //Process(&req);
1058
1059 return 0;
1060 }
1061 //-----------------------------------------------------------------------------
1062 int main(int argc, char **argv)
1063 {
1064 if (argc <= 2)
1065     {
1066     UsageConf();
1067     exit(PARAMETER_PARSING_ERR_CODE);
1068     }
1069
1070 if (strcmp(argv[1], "get"))
1071     {
1072     return mainGet(argc - 1, argv + 1);
1073     }
1074 else if (strcmp(argv[1], "set"))
1075     {
1076     return mainGet(argc - 1, argv + 1);
1077     }
1078 else
1079     {
1080     UsageConf();
1081     exit(PARAMETER_PARSING_ERR_CODE);
1082     }
1083 return UNKNOWN_ERR_CODE;
1084 }
1085 //-----------------------------------------------------------------------------
1086