/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following functions.
- stop_updates
- error_init
- main
1 /***************************************
2 $Revision: 1.16 $
3
4 loader.c - core of the database loading.
5
6 Status: NOT REVUED, TESTED
7
8 ******************/ /******************
9 Filename : loader.c
10 Authors : Andrei Robachevsky
11 OSs Tested : Solaris 7,8
12 ******************/ /******************
13 Copyright (c) 2000,2001,2002 RIPE NCC
14
15 All Rights Reserved
16
17 Permission to use, copy, modify, and distribute this software and its
18 documentation for any purpose and without fee is hereby granted,
19 provided that the above copyright notice appear in all copies and that
20 both that copyright notice and this permission notice appear in
21 supporting documentation, and that the name of the author not be
22 used in advertising or publicity pertaining to distribution of the
23 software without specific, written prior permission.
24
25 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
27 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
28 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
29 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31 ***************************************/
32
33
34 #include "rip.h"
35
36 #include <sys/types.h>
37 #include <fcntl.h>
38 #include <signal.h>
39
40
41 void stop_updates()
/* [<][>][^][v][top][bottom][index][help] */
42 {
43 char print_buf[STR_M];
44
45 fprintf(stderr, "Updates interrupted..\n");
46 sprintf(print_buf, "%d", 0);
47 CO_set_const("UD.do_update", print_buf);
48 return;
49 }
50
51
52 void error_init(int argc, char ** argv) {
/* [<][>][^][v][top][bottom][index][help] */
53 char *slash;
54 char progname[32];
55
56 slash = strrchr(argv[0],'/');
57 strncpy(progname, (slash != NULL) ? slash+1 : argv[0], 31);
58 progname[31]=0;
59
60 /* Initialize error module but do not process ER_DEF definitions from the config */
61 ER_init(progname, 0);
62 #if 1
63 /* ripupdlog: logs all update transactions */
64 /* add one more definition */
65 {
66 char *err_msg = NULL;
67 char *buf =
68 "CREATE err_log { FORMAT SEVCHAR|FACSYMB|TEXTLONG|DATETIME SOCK 2 }"
69 "( FAC ALL SEV E- )"
70 "( FAC UD ASP 0xffffffff SEV I )"
71 ;
72
73 int parsres = ER_parse_spec(buf, &err_msg);
74
75 if( parsres != 0 ) { /* print only on failure */
76 puts(err_msg);
77 }
78
79 UT_free(err_msg);
80
81 dieif( parsres != 0 );
82 }
83 #endif
84
85 } /* error_init() */
86
87
88 /***********************************************
89 ******* MAIN **********************************
90 ***********************************************/
91
92
93 int main(int argc, char** argv) {
/* [<][>][^][v][top][bottom][index][help] */
94 int c;
95 int fd;
96 extern int optind;
97 extern char *optarg;
98 int errflg = 0;
99 int dummy_allowed;
100 int start_object;
101 int num_ok, num_failed;
102 long num_skip=0;
103 int load_pass = -1;
104 UD_stream_t ud_stream;
105 char *prop_file_name=NULL;
106 char *source_name = NULL;
107 ca_dbSource_t *source_hdl;
108 char *db_host, *db_name, *db_user, *db_passwd;
109 int db_port;
110 char *co_result;
111
112
113 struct sigaction sig;
114
115 num_ok=0; num_failed=0;
116 dummy_allowed=0;
117 load_pass =
118
119 start_object = 1;
120
121 while ((c = getopt(argc, argv, "n:M:L:p:s:?")) != EOF)
122 switch (c) {
123 case 'n':
124 num_skip=atol(optarg);
125 break;
126 case 'p':
127 prop_file_name = optarg;
128 break;
129 case 'L':
130 load_pass=atoi(optarg);
131 dummy_allowed=1;
132 break;
133 case 's':
134 source_name=optarg;
135 break;
136 case '?':
137 default :
138 errflg++;
139 break;
140 }
141
142 /* check that all parameters were specified */
143 if (prop_file_name == NULL){
144 errflg++;
145 fprintf(stderr, "configuration file is not specified (-p)\n");
146 }
147 if (load_pass == -1) {
148 errflg++;
149 fprintf(stderr, "load pass number is not specified (-L)\n");
150 }
151 if (source_name == NULL) {
152 errflg++;
153 fprintf(stderr, "source is not specified (-s)\n");
154 }
155 if (errflg) {
156 fprintf(stderr,"usage: loader -L pass# [-n num_skip] -p properties -s source file\n");
157 exit (2);
158 }
159
160
161 /* reach properly to SIGINT and SIGTERM */
162 sig.sa_handler=stop_updates;
163 sigemptyset(&sig.sa_mask);
164 sig.sa_flags=SA_RESTART;
165 sigaction(SIGINT, &sig, NULL);
166 sigaction(SIGTERM, &sig, NULL);
167
168 co_result = CO_set();
169 UT_free(co_result);
170
171 /* 3a. Populate dictionary and load config */
172 ca_init(prop_file_name);
173
174 /* 4. initalise error system */
175 error_init(argc, argv);
176
177 /* Zero the structure */
178 memset(&ud_stream, 0, sizeof(ud_stream));
179
180 /* set mode of operation: unprotected (dummy allowed), updates, standalone */
181 ud_stream.ud_mode= (B_DUMMY | B_UPDATE | B_STANDALONE );
182
183 /* get the source handle */
184 source_hdl = ca_get_SourceHandleByName(source_name);
185
186 /* if NO_NHR option was specified - this is to be done for foreign databases */
187 if(IS_NO_NHR(ca_get_srcmode(source_hdl)))ud_stream.ud_mode |= B_NO_NHR;
188
189
190 /* Connect to the database */
191 db_host = ca_get_srcdbmachine(source_hdl);
192 db_port = ca_get_srcdbport(source_hdl);
193 db_name = ca_get_srcdbname(source_hdl);
194 db_user = ca_get_srcdbuser(source_hdl);
195 db_passwd = ca_get_srcdbpassword(source_hdl);
196
197 fprintf(stderr, "D: Making SQL connection to %s@%s ...", db_name, db_host);
198
199 /* ud_stream.db_connection=SQ_get_connection2(); */
200 ud_stream.db_connection=SQ_get_connection(db_host, db_port, db_name, db_user, db_passwd);
201
202
203 if(! ud_stream.db_connection) {
204 fprintf(stderr, "D: ERROR: no SQL connection\n");
205 exit(1);
206 }
207
208 fprintf(stderr, "OK\n");
209
210
211
212 ud_stream.nrtm=NULL;
213
214 ud_stream.log.num_ok=0;
215 ud_stream.log.num_failed=0;
216
217 UT_free(db_host);
218 UT_free(db_name);
219 UT_free(db_user);
220 UT_free(db_passwd);
221
222
223 if(optind<argc) fd=open(argv[optind],O_RDONLY, 0666); else fd=0;
224
225 if (fd==-1) { fprintf(stderr, "Cannot open data stream. Exiting..\n");
226 exit(1); }
227
228
229 ud_stream.condat.sock = fd;
230 ud_stream.num_skip=num_skip;
231 ud_stream.load_pass=load_pass;
232
233 /* load the dictionary */
234 rpsl_load_dictionary(RPSL_DICT_CORE);
235
236
237
238 /* Start to process the stream */
239
240 fprintf(stderr, "starting processing stream\n");
241 num_ok=UD_process_stream(&ud_stream);
242 fprintf(stderr, "processing stream finished\n");
243 fprintf(stderr, "%d objects processed\n", num_ok);
244
245 return(0);
246
247 } /* main() */
248
249
250
251