1 | /*************************************** 2 | $Revision: 1.5 $ 3 | 4 | Wrapper for NRTM client 5 | 6 | Status: NOT REVUED, NOT TESTED 7 | 8 | Author(s): Andrei Robachevsky 9 | 10 | ******************/ /****************** 11 | Modification History: 12 | andrei (17/01/2000) Created. 13 | ******************/ /****************** 14 | Copyright (c) 2000 RIPE NCC 15 | 16 | All Rights Reserved 17 | 18 | Permission to use, copy, modify, and distribute this software and its 19 | documentation for any purpose and without fee is hereby granted, 20 | provided that the above copyright notice appear in all copies and that 21 | both that copyright notice and this permission notice appear in 22 | supporting documentation, and that the name of the author not be 23 | used in advertising or publicity pertaining to distribution of the 24 | software without specific, written prior permission. 25 | 26 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 27 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 28 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 29 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 30 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 31 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 32 | ***************************************/ 33 | #include <sys/types.h> 34 | #include <fcntl.h> 35 | #include <signal.h> 36 | #include "ud.h" 37 | #include "ud_int.h" 38 | #include "constants.h" 39 | 40 | 41 | 42 | int get_current_serial() 43 | { 44 | int fd; 45 | char buff[64]; 46 | const char *filename; 47 | 48 | filename=CO_get_nrtm_cserialfile(); 49 | fd=open(filename, O_RDONLY, (mode_t)0); 50 | if (fd < 0) { fprintf(stderr, "cannot open %s\n", filename); return(-1); } 51 | read(fd, buff, sizeof(buff)); 52 | close(fd); 53 | return(atoi(buff)); 54 | } 55 | 56 | int set_current_serial(int current_serial) 57 | { 58 | FILE *file; 59 | const char *filename; 60 | 61 | filename=CO_get_nrtm_cserialfile(); 62 | file=fopen(filename, "w+"); 63 | if (file==NULL) { fprintf(stderr, "cannot open %s\n", filename); return(-1); } 64 | fprintf(file,"%d\n", current_serial); 65 | fflush(file); 66 | fclose(file); 67 | return(0); 68 | } 69 | 70 | 71 | /************************************* 72 | * 73 | * 74 | **************************************/ 75 | 76 | void UD_do_nrtm() 77 | { 78 | UD_stream_t ud_stream; 79 | struct _nrtm *nrtm=calloc(1, sizeof(struct _nrtm)); 80 | //int dummy_allowed; 81 | int delay; 82 | int do_nrtm=1; 83 | FILE *file, *logfile; 84 | int num_ok; 85 | int upto_last; 86 | 87 | 88 | /* get mode of operation: protected/unprotected (dummy) */ 89 | ud_stream.ud_mode=CO_get_update_mode(); 90 | 91 | fprintf(stderr, "Mode of operation:\n"); 92 | if(IS_DUMMY_ALLOWED(ud_stream.ud_mode))fprintf(stderr, "* dummy allowed\n"); 93 | else fprintf(stderr, "* dummy not allowed\n"); 94 | if(IS_UPDATE(ud_stream.ud_mode))fprintf(stderr, "* DBupdate\n"); 95 | else fprintf(stderr, "* NRTM\n"); 96 | if(IS_STANDALONE(ud_stream.ud_mode))fprintf(stderr, "* running standalone\n"); 97 | else fprintf(stderr, "* running as a server\n"); 98 | 99 | /* get mirror server */ 100 | nrtm->server=CO_get_nrtm_host(); 101 | 102 | /* get mirror port */ 103 | nrtm->port = SK_atoport(CO_get_nrtm_port(), "tcp"); 104 | printf("XXX nrtm_port=%d\n", nrtm->port); 105 | if(nrtm->port == -1) { 106 | printf("Invalid service/port: %d\n", nrtm->port); 107 | exit(-1); 108 | } 109 | 110 | /* get mirror version */ 111 | nrtm->version=CO_get_nrtm_version(); 112 | 113 | /* get database */ 114 | ud_stream.db_name=CO_get_database(); 115 | 116 | /* get database host*/ 117 | ud_stream.db_host=CO_get_host(); 118 | 119 | /* get database port*/ 120 | ud_stream.db_port=CO_get_database_port(); 121 | 122 | /* get database user*/ 123 | ud_stream.db_user=CO_get_user(); 124 | 125 | /* get database password*/ 126 | ud_stream.db_pswd=CO_get_password(); 127 | 128 | /* get error log facility */ 129 | ud_stream.log=CO_get_nrtm_logfile(); 130 | 131 | // ud_stream.dummy_allowed=dummy_allowed; 132 | ud_stream.num_skip=0; 133 | ud_stream.load_pass=0; 134 | ud_stream.nrtm=nrtm; 135 | 136 | upto_last=0; // let's start gradually if the backlog is > SBUNCH (1000) serials 137 | 138 | /*+++ main cycle +++*/ 139 | 140 | while(do_nrtm=CO_get_do_nrtm()) { 141 | 142 | /* get current serial */ 143 | nrtm->current_serial=get_current_serial(); 144 | if(nrtm->current_serial == -1) { 145 | printf("Error obtaining current serial: %d\n", nrtm->current_serial); 146 | exit(-1); 147 | } 148 | 149 | fprintf(stderr, "current_serial:\t%d\n", nrtm->current_serial); 150 | fprintf(stderr, "conecting to server...\n"); 151 | printf("current_serial:\t%d\n", nrtm->current_serial); 152 | printf("conecting to server...\n"); 153 | 154 | file = get_NRTM_stream(nrtm, upto_last); 155 | fprintf(stderr, "OK\n"); 156 | printf("OK\n"); 157 | 158 | 159 | if (file==NULL) { 160 | fprintf(stderr, "Cannot open data stream. Trying...\n"); 161 | sleep(100); 162 | continue; 163 | } 164 | 165 | 166 | ud_stream.stream=file; 167 | 168 | fprintf(stderr, "starting processing stream\n"); 169 | 170 | num_ok=UD_process_stream(&ud_stream); 171 | 172 | 173 | fprintf(stderr, "processing stream finished\n"); 174 | if(num_ok<0) exit(1); 175 | 176 | /* Now we can process serials in normal way */ 177 | if(num_ok==0) upto_last=1; 178 | 179 | set_current_serial(nrtm->current_serial+num_ok); 180 | logfile = fopen(ud_stream.log, "a+"); 181 | fprintf(logfile, "forwarded to serial:\t%d\n", nrtm->current_serial+num_ok); 182 | fclose(logfile); 183 | fprintf(stderr, "forwarded to serial:\t%d\n", nrtm->current_serial+num_ok); 184 | printf("Objects received: %d\n-----------\n", num_ok); 185 | 186 | /* get delay */ 187 | delay=CO_get_nrtm_delay(); 188 | 189 | if (do_nrtm) sleep(delay); 190 | } 191 | 192 | if(nrtm) free(nrtm); 193 | 194 | fprintf(stderr, "NRTM stopped\n"); 195 | 196 | } /* UD_do_nrtm() */ 197 | 198 | 199 | 200 | /************************************* 201 | * 202 | * 203 | **************************************/ 204 | 205 | void UD_do_updates(void *arg) 206 | { 207 | int listening_socket = (int)arg; 208 | int connected_socket; 209 | UD_stream_t ud_stream; 210 | int dummy_allowed; 211 | int delay; 212 | int do_update=1; 213 | FILE *file, *file_ack, *logfile; 214 | int num_ok; 215 | 216 | 217 | /* get mode of operation: protected/unprotected (dummy) */ 218 | ud_stream.ud_mode=CO_get_update_mode(); 219 | 220 | fprintf(stderr, "Mode of operation:\n"); 221 | if(IS_DUMMY_ALLOWED(ud_stream.ud_mode))fprintf(stderr, "* dummy allowed\n"); 222 | else fprintf(stderr, "* dummy not allowed\n"); 223 | if(IS_UPDATE(ud_stream.ud_mode))fprintf(stderr, "* DBupdate\n"); 224 | else fprintf(stderr, "* NRTM\n"); 225 | if(IS_STANDALONE(ud_stream.ud_mode))fprintf(stderr, "* running standalone\n"); 226 | else fprintf(stderr, "* running as a server\n"); 227 | 228 | 229 | /* get database */ 230 | ud_stream.db_name=CO_get_database(); 231 | 232 | /* get database host*/ 233 | ud_stream.db_host=CO_get_host(); 234 | 235 | /* get database port*/ 236 | ud_stream.db_port=CO_get_database_port(); 237 | 238 | /* get database user*/ 239 | ud_stream.db_user=CO_get_user(); 240 | 241 | /* get database password*/ 242 | ud_stream.db_pswd=CO_get_password(); 243 | 244 | /* get error log facility */ 245 | ud_stream.log=CO_get_nrtm_logfile(); 246 | 247 | 248 | ud_stream.num_skip=0; 249 | ud_stream.load_pass=0; 250 | ud_stream.nrtm=NULL; 251 | 252 | /*+++ main cycle +++*/ 253 | 254 | while(do_update=CO_get_do_update()) { 255 | 256 | /* accept connection */ 257 | connected_socket = SK_accept_connection(listening_socket); 258 | file=fdopen(connected_socket, "r"); 259 | file_ack=fdopen(connected_socket, "w"); 260 | 261 | fprintf(stderr, "Connection accepted...\n"); 262 | 263 | if (file==NULL) { fprintf(stderr, "Cannot open data stream. Exiting..\n"); 264 | exit(-1); } 265 | 266 | 267 | ud_stream.stream=file; 268 | 269 | fprintf(stderr, "starting processing object\n"); 270 | 271 | num_ok=UD_process_stream(&ud_stream); 272 | 273 | fprintf(stderr, "processing object finished\n"); 274 | 275 | if(num_ok==1) fprintf(file_ack, "%%ERROR 0\n"); 276 | else { 277 | num_ok=(-1)*num_ok; 278 | fprintf(file_ack, "%%ERROR %d\n",num_ok); 279 | fprintf(file_ack, "Transaction had the following problems:\n"); 280 | if(num_ok & ERROR_U_MEM) fprintf(file_ack, "Memory allocation error\n"); 281 | // if(num_ok & ERROR_U_DBS) fprintf(file_ack, "Database (SQL) error\n"); 282 | // if(num_ok & ERROR_U_OBJ) fprintf(file_ack, "Object (RF) error\n"); 283 | // if(num_ok & ERROR_U_AUT) fprintf(file_ack, "Object authentication error\n"); 284 | if(num_ok & ERROR_U_BADOP) fprintf(file_ack, "Bad operation\n"); 285 | if(num_ok & ERROR_U_COP) fprintf(file_ack, "Conflicting operation\n"); 286 | if(num_ok & ERROR_U_NSUP) fprintf(file_ack, "Object of this type is not supported\n"); 287 | if(num_ok & ERROR_U_BUG) fprintf(file_ack, "Software bug - report to <ripe-dbm@ripe.net>\n"); 288 | if(ud_stream.error_script)fprintf(file_ack, "%s\n", ud_stream.error_script); 289 | } 290 | 291 | if(ud_stream.error_script) free(ud_stream.error_script); 292 | fclose(file_ack); 293 | 294 | } /* while do_update */ 295 | 296 | 297 | fprintf(stderr, "server stopped\n"); 298 | 299 | } /* UD_do_update() */ 300 | 301 | 302 | 303 |