0001-implement-an-init-method-for-the-nebula-daemon.patch
include/Nebula.h | ||
---|---|---|
303 | 303 |
return "3.9.0"; |
304 | 304 |
} |
305 | 305 | |
306 |
void init(); |
|
306 | 307 |
void start(); |
307 | 308 | |
308 | 309 |
void get_configuration_attribute( |
share/pkgs/openSUSE/systemd/onedsetup | ||
---|---|---|
79 | 79 |
fi |
80 | 80 | |
81 | 81 |
# Start the one daemon |
82 |
$ONED -f 2>&1 &
|
|
82 |
$ONED -i 2>&1 &
|
|
83 | 83 |
STARTED=$? |
84 | 84 |
CURPID=$! |
85 | 85 | |
... | ... | |
88 | 88 |
exit 1 |
89 | 89 |
fi |
90 | 90 | |
91 |
# Give oned a chance to do it's thing...
|
|
92 |
sleep 2
|
|
91 |
# Give oned a chance to do it's thing and exit
|
|
92 |
sleep 5
|
|
93 | 93 | |
94 |
# OK we're all done here
|
|
94 |
# Just in case the process gets stuck, kill it
|
|
95 | 95 |
kill -TERM $CURPID > /dev/null 2>&1 |
96 | 96 | |
97 | 97 |
counter=0 |
... | ... | |
105 | 105 |
done |
106 | 106 | |
107 | 107 |
# If the lock file is left over remove it |
108 |
rm -f /var/lol/one/one |
|
108 |
rm -f /var/lock/one/one |
src/nebula/Nebula.cc | ||
---|---|---|
24 | 24 |
#include <stdexcept> |
25 | 25 |
#include <libxml/parser.h> |
26 | 26 | |
27 |
#include <errno.h> |
|
27 | 28 |
#include <signal.h> |
28 | 29 |
#include <unistd.h> |
29 | 30 |
#include <fcntl.h> |
... | ... | |
116 | 117 | |
117 | 118 |
int SystemDB::check_db_version() |
118 | 119 |
{ |
119 |
int rc; |
|
120 | 120 |
ostringstream oss; |
121 | 121 | |
122 | 122 |
string loaded_db_version = ""; |
... | ... | |
133 | 133 |
oss.str(""); |
134 | 134 |
unset_callback(); |
135 | 135 | |
136 |
if( loaded_db_version == "" ) |
|
137 |
{ |
|
138 |
// Table user_pool is present for all OpenNebula versions, and it |
|
139 |
// always contains at least the oneadmin user. |
|
140 |
oss << "SELECT MAX(oid) FROM user_pool"; |
|
141 |
rc = db->exec(oss); |
|
142 | ||
143 |
oss.str(""); |
|
144 | ||
145 |
if( rc != 0 ) // Database needs bootstrap |
|
146 |
{ |
|
147 |
return -2; |
|
148 |
} |
|
149 |
} |
|
150 | ||
151 | 136 |
if( Nebula::db_version() != loaded_db_version ) |
152 | 137 |
{ |
153 | 138 |
oss << "Database version mismatch. " |
... | ... | |
265 | 250 |
return 0; |
266 | 251 |
} |
267 | 252 | |
268 |
/* -------------------------------------------------------------------------- */ |
|
269 |
/* -------------------------------------------------------------------------- */ |
|
270 | ||
271 |
void Nebula::start() |
|
253 |
/* ------------------------------------------------------------------------- */ |
|
254 |
/* ------------------------------------------------------------------------- */ |
|
255 |
void Nebula::init() |
|
272 | 256 |
{ |
273 |
int rc; |
|
274 |
int fd; |
|
275 |
sigset_t mask; |
|
276 |
int signal; |
|
277 |
char hn[80]; |
|
278 |
string scripts_remote_dir; |
|
279 | ||
280 |
if ( gethostname(hn,79) != 0 ) |
|
281 |
{ |
|
282 |
throw runtime_error("Error getting hostname"); |
|
283 |
} |
|
284 | ||
285 |
hostname = hn; |
|
286 | ||
257 |
int rc; |
|
258 |
string scripts_remote_dir; |
|
287 | 259 |
// ----------------------------------------------------------- |
288 | 260 |
// Configuration |
289 | 261 |
// ----------------------------------------------------------- |
... | ... | |
298 | 270 |
} |
299 | 271 | |
300 | 272 |
string config_fname = var_location + "config"; |
301 |
ofstream config_file(config_fname.c_str(), ios_base::trunc & ios_base::out);
|
|
273 |
ofstream config_file(config_fname.c_str(),ios_base::trunc & ios_base::out); |
|
302 | 274 | |
303 | 275 |
if (config_file.fail() == false) |
304 | 276 |
{ |
... | ... | |
308 | 280 | |
309 | 281 |
nebula_configuration->get("SCRIPTS_REMOTE_DIR", scripts_remote_dir); |
310 | 282 |
hook_location = scripts_remote_dir + "/hooks/"; |
311 | ||
283 |
|
|
312 | 284 |
// ----------------------------------------------------------- |
313 | 285 |
// Log system |
314 | 286 |
// ----------------------------------------------------------- |
... | ... | |
363 | 335 |
int rc; |
364 | 336 | |
365 | 337 |
bool db_is_sqlite = true; |
338 |
bool bootstrap_db = false; |
|
366 | 339 | |
367 | 340 |
string server = "localhost"; |
368 | 341 |
string port_str; |
... | ... | |
424 | 397 | |
425 | 398 |
if ( db_is_sqlite ) |
426 | 399 |
{ |
427 |
string db_name = var_location + "one.db"; |
|
428 | ||
400 |
db_name = var_location + "one.db"; |
|
401 |
rc = access(db_name.c_str(), R_OK|W_OK|F_OK); |
|
402 |
if (rc == -1) |
|
403 |
{ |
|
404 |
if (errno == ENOENT) |
|
405 |
{ |
|
406 |
bootstrap_db = true; |
|
407 |
} |
|
408 |
else |
|
409 |
{ |
|
410 |
throw runtime_error("Could not acces one.db file"); |
|
411 |
} |
|
412 |
} |
|
429 | 413 |
db = new SqliteDB(db_name); |
430 | 414 |
} |
431 | 415 |
else |
... | ... | |
433 | 417 |
ostringstream oss; |
434 | 418 | |
435 | 419 |
db = new MySqlDB(server,port,user,passwd,db_name); |
436 | ||
437 |
oss << "CREATE DATABASE IF NOT EXISTS " << db_name;
|
|
420 |
|
|
421 |
oss << "USE " << db_name;
|
|
438 | 422 |
rc = db->exec(oss); |
423 |
if ( rc == 1044 ) { |
|
439 | 424 | |
440 |
if ( rc != 0 ) |
|
441 |
{ |
|
442 |
throw runtime_error("Could not create database."); |
|
443 |
} |
|
425 |
oss.str(""); |
|
426 |
oss << "CREATE DATABASE " << db_name; |
|
427 |
rc = db->exec(oss); |
|
444 | 428 | |
445 |
oss.str(""); |
|
446 |
oss << "USE " << db_name; |
|
447 |
rc = db->exec(oss); |
|
448 |
if ( rc != 0 ) |
|
429 |
if ( rc == 0 ) |
|
430 |
{ |
|
431 |
bootstrap_db = true; |
|
432 |
} |
|
433 |
else if ( rc == 1044 ) |
|
434 |
{ |
|
435 |
throw runtime_error("Could not create database."); |
|
436 |
} |
|
437 |
} |
|
438 |
else |
|
449 | 439 |
{ |
450 | 440 |
throw runtime_error("Could not open database."); |
451 | 441 |
} |
452 | 442 |
} |
453 | 443 | |
454 |
// ---------------------------------------------------------------------
|
|
444 |
// -------------------------------------------------------------------- |
|
455 | 445 |
// Prepare the SystemDB and check versions |
456 |
// --------------------------------------------------------------------- |
|
457 | ||
458 |
NebulaLog::log("ONE",Log::INFO,"Checking database version."); |
|
446 |
// -------------------------------------------------------------------- |
|
459 | 447 | |
460 | 448 |
system_db = new SystemDB(db); |
461 | 449 | |
462 |
rc = system_db->check_db_version(); |
|
463 | ||
464 |
if( rc == -1 ) |
|
465 |
{ |
|
466 |
throw runtime_error("Database version mismatch."); |
|
467 |
} |
|
468 | ||
469 |
if( rc == -2 ) |
|
470 |
{ |
|
450 |
if (bootstrap_db) { |
|
471 | 451 |
rc = 0; |
472 | ||
473 |
NebulaLog::log("ONE",Log::INFO,"Bootstrapping OpenNebula database.");
|
|
452 |
NebulaLog::log("ONE",Log::INFO, |
|
453 |
"Bootstrapping OpenNebula database.");
|
|
474 | 454 | |
475 | 455 |
rc += VirtualMachinePool::bootstrap(db); |
476 | 456 |
rc += HostPool::bootstrap(db); |
... | ... | |
497 | 477 |
if ( rc != 0 ) |
498 | 478 |
{ |
499 | 479 |
throw runtime_error("Error bootstrapping database."); |
500 |
} |
|
480 |
} |
|
481 |
} |
|
482 | ||
483 |
NebulaLog::log("ONE",Log::INFO,"Checking database version."); |
|
484 |
rc = system_db->check_db_version(); |
|
485 | ||
486 |
if( rc == -1 ) |
|
487 |
{ |
|
488 |
throw runtime_error("Database version mismatch."); |
|
501 | 489 |
} |
502 | 490 |
} |
503 | 491 |
catch (exception&) |
504 | 492 |
{ |
505 | 493 |
throw; |
506 | 494 |
} |
495 |
} |
|
496 | ||
497 |
/* -------------------------------------------------------------------------- */ |
|
498 |
/* -------------------------------------------------------------------------- */ |
|
499 | ||
500 |
void Nebula::start() |
|
501 |
{ |
|
502 |
int rc; |
|
503 |
int fd; |
|
504 |
sigset_t mask; |
|
505 |
int signal; |
|
506 |
char hn[80]; |
|
507 | ||
508 |
if ( gethostname(hn,79) != 0 ) |
|
509 |
{ |
|
510 |
throw runtime_error("Error getting hostname"); |
|
511 |
} |
|
512 | ||
513 |
hostname = hn; |
|
514 | ||
515 |
Nebula::init(); |
|
507 | 516 | |
508 | 517 |
try |
509 | 518 |
{ |
src/nebula/oned.cc | ||
---|---|---|
32 | 32 |
"SYNOPSIS\n" |
33 | 33 |
" Starts the OpenNebula daemon\n\n" |
34 | 34 |
"OPTIONS\n" |
35 |
"\t-h\tprints this help.\n" |
|
36 | 35 |
"\t-v\tprints OpenNebula version and license\n" |
37 |
"\t-f\tforeground, do not fork the oned daemon\n"; |
|
36 |
"\t-h\tprints this help.\n" |
|
37 |
"\t-f\tforeground, do not fork the oned daemon\n" |
|
38 |
"\t-i\tinitialize the dabase and exit.\n"; |
|
39 | ||
38 | 40 | |
39 | 41 |
static const char * susage = |
40 | 42 |
"usage: oned [-h] [-v] [-f]\n"; |
41 | 43 | |
42 |
/* -------------------------------------------------------------------------- */
|
|
43 |
/* -------------------------------------------------------------------------- */
|
|
44 |
/* ------------------------------------------------------------------------- */ |
|
45 |
/* ------------------------------------------------------------------------- */ |
|
44 | 46 | |
45 | 47 |
static void print_license() |
46 | 48 |
{ |
47 | 49 |
cout<< "Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org)\n\n" |
48 |
<< Nebula::version() << " is distributed and licensed for use under the"
|
|
49 |
<< " terms of the\nApache License, Version 2.0 " |
|
50 |
<< Nebula::version() << " is distributed and licensed for use under " |
|
51 |
<< "the terms of the\nApache License, Version 2.0 "
|
|
50 | 52 |
<< "(http://www.apache.org/licenses/LICENSE-2.0).\n"; |
51 | 53 |
} |
52 | 54 | |
53 |
/* -------------------------------------------------------------------------- */ |
|
54 |
/* -------------------------------------------------------------------------- */ |
|
55 |
/* ------------------------------------------------------------------------- */ |
|
56 |
/* ------------------------------------------------------------------------- */ |
|
57 | ||
58 |
static void oned_init() |
|
59 |
{ |
|
60 |
try |
|
61 |
{ |
|
62 |
Nebula& nd = Nebula::instance(); |
|
63 |
nd.init(); |
|
64 |
} |
|
65 |
catch (exception &e) |
|
66 |
{ |
|
67 |
cerr << e.what() << endl; |
|
68 |
|
|
69 |
return; |
|
70 |
} |
|
71 |
} |
|
72 | ||
73 |
/* ------------------------------------------------------------------------- */ |
|
74 |
/* ------------------------------------------------------------------------- */ |
|
55 | 75 | |
56 | 76 |
static void oned_main() |
57 | 77 |
{ |
... | ... | |
68 | 88 |
} |
69 | 89 |
} |
70 | 90 |
|
71 |
/* -------------------------------------------------------------------------- */
|
|
72 |
/* -------------------------------------------------------------------------- */
|
|
91 |
/* ------------------------------------------------------------------------- */ |
|
92 |
/* ------------------------------------------------------------------------- */ |
|
73 | 93 |
|
74 | 94 |
int main(int argc, char **argv) |
75 | 95 |
{ |
... | ... | |
81 | 101 |
string wd; |
82 | 102 |
int rc; |
83 | 103 |
|
84 |
while((opt = getopt(argc,argv,"vhf")) != -1) |
|
104 |
while((opt = getopt(argc,argv,"vhif")) != -1)
|
|
85 | 105 |
switch(opt) |
86 | 106 |
{ |
87 | 107 |
case 'v': |
... | ... | |
92 | 112 |
cout << usage; |
93 | 113 |
exit(0); |
94 | 114 |
break; |
115 |
case 'i': |
|
116 |
oned_init(); |
|
117 |
exit(0); |
|
118 |
break; |
|
95 | 119 |
case 'f': |
96 | 120 |
foreground = true; |
97 | 121 |
break; |
src/sql/MySqlDB.cc | ||
---|---|---|
113 | 113 | |
114 | 114 |
unlock(); |
115 | 115 | |
116 |
return -1;
|
|
116 |
return err_num;
|
|
117 | 117 |
} |
118 | 118 | |
119 | 119 | |
... | ... | |
141 | 141 | |
142 | 142 |
unlock(); |
143 | 143 | |
144 |
return -1;
|
|
144 |
return err_num;
|
|
145 | 145 |
} |
146 | 146 | |
147 | 147 |
// Fetch the names of the fields |
148 |
- |