31 #include <libxml/parser.h>
37 #include <mysql/mysql.h>
43 #include "libhsmdns.h"
53 fprintf(stderr,
"%s [-h] [-v] [-c <alternate-configuration>]\n",
argv0);
74 #define CHECKSQLITE(EX) do { dblayer_sqlite3.message = NULL; if((dblayer_sqlite3.status = (EX)) != SQLITE_OK) { fprintf(stderr, "%s: sql error: %s (%d)\n%s:%d: %s\n",argv0,(dblayer_sqlite3.message?dblayer_sqlite3.message:dblayer_sqlite3.sqlite3_errmsg(dblayer_sqlite3.handle)),dblayer_sqlite3.status,__FILE__,__LINE__,#EX); if(dblayer_sqlite3.message) dblayer_sqlite3.sqlite3_free(dblayer_sqlite3.message); } } while(0)
76 struct dblayer_sqlite3_struct {
81 int (*sqlite3_prepare_v2)(sqlite3 *,
const char *, int , sqlite3_stmt **,
const char **);
82 int (*sqlite3_reset)(sqlite3_stmt *pStmt);
83 int (*sqlite3_bind_int)(sqlite3_stmt*, int, int);
84 int (*sqlite3_finalize)(sqlite3_stmt *pStmt);
85 int (*sqlite3_open)(
const char *filename, sqlite3 **ppDb);
86 int (*sqlite3_exec)(sqlite3*,
const char *sql, int (*callback)(
void*, int,
char**,
char**),
void *,
char **errmsg);
87 int (*sqlite3_step)(sqlite3_stmt*);
88 int (*sqlite3_close)(sqlite3*);
89 const char* (*sqlite3_errmsg)(sqlite3*);
90 int (*sqlite3_free)(
void*);
92 struct dblayer_sqlite3_struct dblayer_sqlite3;
95 dblayer_sqlite3_initialize(
void)
101 handle = dlopen(SQLITE3_SONAME, RTLD_NOW);
102 if ((error = dlerror()) != NULL) {
103 printf(
"Failed to load sqlite3 library. dlerror(): %s\n", error);
107 dblayer_sqlite3.sqlite3_prepare_v2 = (int(*)(sqlite3*,
const char*, int, sqlite3_stmt**,
const char **))
functioncast(dlsym(handle,
"sqlite3_prepare_v2"));
108 dblayer_sqlite3.sqlite3_reset = (int(*)(sqlite3_stmt*))
functioncast(dlsym(handle,
"sqlite3_reset"));
109 dblayer_sqlite3.sqlite3_bind_int = (int(*)(sqlite3_stmt*, int, int))
functioncast(dlsym(handle,
"sqlite3_bind_int"));
110 dblayer_sqlite3.sqlite3_finalize = (int(*)(sqlite3_stmt*))
functioncast(dlsym(handle,
"sqlite3_finalize"));
111 dblayer_sqlite3.sqlite3_open = (int(*)(
const char*, sqlite3**))
functioncast(dlsym(handle,
"sqlite3_open"));
112 dblayer_sqlite3.sqlite3_exec = (int(*)(sqlite3*,
const char*, int(*)(
void*, int,
char**,
char**),
void*,
char **))
functioncast(dlsym(handle,
"sqlite3_exec"));
113 dblayer_sqlite3.sqlite3_step = (int(*)(sqlite3_stmt*))
functioncast(dlsym(handle,
"sqlite3_step"));
114 dblayer_sqlite3.sqlite3_close = (int(*)(sqlite3*))
functioncast(dlsym(handle,
"sqlite3_close"));
115 dblayer_sqlite3.sqlite3_errmsg = (
const char*(*)(sqlite3*))
functioncast(dlsym(handle,
"sqlite3_errmsg"));
116 dblayer_sqlite3.sqlite3_free = (int(*)(
void*))
functioncast(dlsym(handle,
"sqlite3_free"));
118 if (!dblayer_sqlite3.sqlite3_open) {
119 printf(
"Failed to load sqlite3 library.\n");
125 dblayer_sqlite3_close(
void)
127 dblayer_sqlite3.sqlite3_close(dblayer_sqlite3.handle);
130 struct callbackoperation {
131 int (*compute)(
char **argv,
int* id, uint16_t *keytag);
132 sqlite3_stmt* updateStmt;
136 callback(
void *cargo,
int argc,
char **argv,
char **names)
141 struct callbackoperation* operation = (
struct callbackoperation*) cargo;
143 operation->compute(argv, &
id, &keytag);
145 CHECKSQLITE(dblayer_sqlite3.sqlite3_reset(operation->updateStmt));
146 CHECKSQLITE(dblayer_sqlite3.sqlite3_bind_int(operation->updateStmt, 1, keytag));
147 CHECKSQLITE(dblayer_sqlite3.sqlite3_bind_int(operation->updateStmt, 2,
id));
149 switch ((status = dblayer_sqlite3.sqlite3_step(operation->updateStmt))) {
160 fprintf(stderr,
"%s: sql error: %s\n",
argv0, dblayer_sqlite3.sqlite3_errmsg(dblayer_sqlite3.handle));
163 }
while(status == SQLITE_BUSY);
170 struct callbackoperation operation;
171 const char* queryEnd;
172 operation.compute = compute;
173 CHECKSQLITE(dblayer_sqlite3.sqlite3_prepare_v2(dblayer_sqlite3.handle,
updateQueryStr, strlen(
updateQueryStr)+1, &operation.updateStmt, &queryEnd));
174 CHECKSQLITE(dblayer_sqlite3.sqlite3_exec(dblayer_sqlite3.handle,
listQueryStr, callback, &operation, &dblayer_sqlite3.message));
175 CHECKSQLITE(dblayer_sqlite3.sqlite3_finalize(operation.updateStmt));
176 dblayer_sqlite3.sqlite3_close(dblayer_sqlite3.handle);
180 dblayer_sqlite3_open(
const char *datastore) {
181 CHECKSQLITE(dblayer_sqlite3.sqlite3_open(datastore, &dblayer_sqlite3.handle));
192 struct dblayer_mysql_struct {
195 extern struct dblayer_mysql_struct dblayer_mysql;
196 struct dblayer_mysql_struct dblayer_mysql;
200 dblayer_mysql_initialize(
void) {
201 if (mysql_library_init(0, NULL, NULL)) {
202 fprintf(stderr,
"could not initialize MySQL library\n");
208 dblayer_mysql_close(
void)
210 if (dblayer_mysql.handle) {
211 mysql_close(dblayer_mysql.handle);
212 dblayer_mysql.handle = NULL;
222 MYSQL_STMT *updateStmt;
225 updateStmt = mysql_stmt_init(dblayer_mysql.handle);
228 res = mysql_store_result(dblayer_mysql.handle);
230 fprintf(stderr,
"Failed to update db. Is it set correctly in conf.xml?\n");
233 mysql_num_fields(res);
234 while ((row = mysql_fetch_row(res))) {
235 compute(row, &
id, &keytag);
236 memset(bind, 0,
sizeof (bind));
237 bind[0].buffer = &keytag;
238 bind[0].buffer_length =
sizeof(keytag);
239 bind[0].buffer_type = MYSQL_TYPE_SHORT;
240 bind[0].is_unsigned = 1;
241 bind[1].buffer = &id;
242 bind[1].buffer_length =
sizeof(id);
243 bind[1].buffer_type = MYSQL_TYPE_LONG;
244 mysql_stmt_bind_param(updateStmt, bind);
245 mysql_stmt_execute(updateStmt);
246 mysql_stmt_affected_rows(updateStmt);
248 mysql_free_result(res);
249 mysql_stmt_close(updateStmt);
253 dblayer_mysql_open(
const char* host,
const char* user,
const char* pass,
254 const char *rsrc,
unsigned int port,
const char *unix_socket)
256 dblayer_mysql.handle = mysql_init(NULL);
257 if (!mysql_real_connect(dblayer_mysql.handle, host, user, pass, rsrc, port, NULL, 0)) {
258 fprintf(stderr,
"Failed to connect to database: Error: %s\n",
259 mysql_error(dblayer_mysql.handle));
272 dblayer_initialize(
void)
275 dblayer_sqlite3_initialize();
278 dblayer_mysql_initialize();
283 dblayer_close(
void) {
288 dblayer_finalize(
void) {
302 const char*
listQueryStr =
"select keyData.id,keyData.algorithm,keyData.role,keyData.keytag,hsmKey.locator from keyData join hsmKey on keyData.hsmKeyId = hsmKey.id";
305 static int keytagcount;
308 compute(
char **argv,
int*
id, uint16_t* keytag)
315 algorithm = atoi(argv[1]);
317 *keytag = atoi(argv[3]);
319 hsm_keytag(locator, algorithm, sep, keytag);
331 int options_index = 0;
332 const char* cfgfile = ODS_SE_CFGFILE;
333 static struct option long_options[] = {
334 {
"config", required_argument, 0,
'c'},
335 {
"help", no_argument, 0,
'h'},
336 {
"verbose", no_argument, 0,
'v'},
343 while ((c=getopt_long(argc, argv,
"c:hv", long_options, &options_index)) != -1) {
366 ods_log_init(
"ods-migrate", 0, NULL,
verbosity);
375 printf(
"Reading config file '%s'..\n", cfgfile);
380 fprintf(stderr,
"Configuration error.\n");
384 printf(
"Connecting to HSM..\n");
386 if (status != HSM_OK) {
387 char* errorstr = hsm_get_error(NULL);
388 if (errorstr != NULL) {
389 fprintf(stderr,
"%s", errorstr);
392 fprintf(stderr,
"error opening libhsm (errno %i)\n", status);
396 dblayer_initialize();
398 printf(
"Connecting to database..\n");
404 fprintf(stderr,
"Database SQLite3 not available during compile-time.\n");
412 fprintf(stderr,
"Database MySQL not available during compile-time.\n");
418 fprintf(stderr,
"No database defined, possible mismatch build\n");
419 fprintf(stderr,
"and configuration for SQLite3 or MySQL.\n");
424 printf(
"Computing keytags, this could take a while.\n");
426 printf(
"Added keytags for %d keys.\n", keytagcount);
428 printf(
"Finishing..\n");
engineconfig_type * engine_config(const char *cfgfile, int cmdline_verbosity, engineconfig_type *oldcfg)
void engine_config_cleanup(engineconfig_type *config)
ods_status engine_config_check(engineconfig_type *config)
@ ENFORCER_DATABASE_TYPE_MYSQL
@ ENFORCER_DATABASE_TYPE_SQLITE
@ ENFORCER_DATABASE_TYPE_NONE
#define KEY_DATA_ROLE_SEP(role)
int main(int argc, char *argv[])
const char * updateQueryStr
functioncast_t functioncast(void *generic)
hsm_repository_t * parse_conf_repositories(const char *cfgfile)
void(* functioncast_t)(void)
struct dblayer_struct dblayer
const char * listQueryStr
void(* foreach)(const char *listQueryStr, const char *updateQueryStr, int(*compute)(char **, int *, uint16_t *))
engineconfig_database_type_t db_type