Revision 6eedd356 tools/ganeti-listrunner
b/tools/ganeti-listrunner | ||
---|---|---|
346 | 346 |
|
347 | 347 |
|
348 | 348 |
def HostWorker(logdir, username, password, use_agent, hostname, |
349 |
executable, command, filelist): |
|
349 |
executable, exec_args, command, filelist):
|
|
350 | 350 |
"""Per-host worker. |
351 | 351 |
|
352 | 352 |
This function does not return - it's the main code of the childs, |
... | ... | |
359 | 359 |
@param use_agent: whether we should instead use an agent |
360 | 360 |
@param hostname: the hostname to connect to |
361 | 361 |
@param executable: the executable to upload, if not None |
362 |
@param exec_args: Additional arguments for executable |
|
362 | 363 |
@param command: the command to run |
363 | 364 |
@param filelist: auxiliary files to upload |
364 | 365 |
|
... | ... | |
375 | 376 |
print " %s: uploading files" % hostname |
376 | 377 |
upload_dir = UploadFiles(connection, executable, |
377 | 378 |
filelist, logfile) |
378 |
command = "cd %s && ./%s" % (upload_dir, os.path.basename(executable)) |
|
379 |
command = ("cd %s && ./%s %s" % |
|
380 |
(upload_dir, os.path.basename(executable), exec_args)) |
|
379 | 381 |
print " %s: executing remote command" % hostname |
380 | 382 |
cmd_result = RunRemoteCommand(connection, command, logfile) |
381 | 383 |
if cmd_result is True: |
... | ... | |
411 | 413 |
|
412 | 414 |
|
413 | 415 |
def LaunchWorker(child_pids, logdir, username, password, use_agent, hostname, |
414 |
executable, command, filelist): |
|
416 |
executable, exec_args, command, filelist):
|
|
415 | 417 |
"""Launch the per-host worker. |
416 | 418 |
|
417 | 419 |
Arguments are the same as for HostWorker, except for child_pids, |
... | ... | |
425 | 427 |
child_pids[pid] = hostname |
426 | 428 |
else: |
427 | 429 |
HostWorker(logdir, username, password, use_agent, hostname, |
428 |
executable, command, filelist) |
|
430 |
executable, exec_args, command, filelist)
|
|
429 | 431 |
|
430 | 432 |
|
431 | 433 |
def ParseOptions(): |
... | ... | |
452 | 454 |
help="comma-separated list of hosts or single hostname",) |
453 | 455 |
parser.add_option("-a", dest="auxfiles", action="append", default=[], |
454 | 456 |
help="optional auxiliary file to upload" |
455 |
" (can be given multiple times", |
|
457 |
" (can be given multiple times)",
|
|
456 | 458 |
metavar="FILE") |
457 | 459 |
parser.add_option("-c", dest="command", default=None, |
458 | 460 |
help="shell command to run on remote host(s)") |
... | ... | |
466 | 468 |
" using an agent)") |
467 | 469 |
parser.add_option("-A", dest="use_agent", default=False, action="store_true", |
468 | 470 |
help="instead of password, use keys from an SSH agent") |
471 |
parser.add_option("--args", dest="exec_args", default=None, |
|
472 |
help="Arguments to be passed to executable (-x)") |
|
469 | 473 |
|
470 | 474 |
opts, args = parser.parse_args() |
471 | 475 |
|
... | ... | |
473 | 477 |
parser.error("Options -x and -c conflict with each other") |
474 | 478 |
if not (opts.executable or opts.command): |
475 | 479 |
parser.error("One of -x and -c must be given") |
480 |
if opts.command and opts.exec_args: |
|
481 |
parser.error("Can't specify arguments when using custom command") |
|
476 | 482 |
if not opts.logdir: |
477 | 483 |
parser.error("Option -l is required") |
478 | 484 |
if opts.hostfile and opts.hostlist: |
... | ... | |
483 | 489 |
parser.error("This program doesn't take any arguments, passed in: %s" % |
484 | 490 |
", ".join(args)) |
485 | 491 |
|
486 |
return (opts.logdir, opts.executable, opts.hostfile, opts.hostlist, |
|
492 |
return (opts.logdir, opts.executable, opts.exec_args, |
|
493 |
opts.hostfile, opts.hostlist, |
|
487 | 494 |
opts.command, opts.use_agent, opts.auxfiles, opts.username, |
488 | 495 |
opts.password, opts.batch_size) |
489 | 496 |
|
490 | 497 |
|
491 | 498 |
def main(): |
492 | 499 |
"""main.""" |
493 |
(logdir, executable, hostfile, hostlist, |
|
500 |
(logdir, executable, exec_args, hostfile, hostlist,
|
|
494 | 501 |
command, use_agent, auxfiles, username, |
495 | 502 |
password, batch_size) = ParseOptions() |
496 | 503 |
|
... | ... | |
535 | 542 |
child_pids = {} |
536 | 543 |
for hostname in batch: |
537 | 544 |
LaunchWorker(child_pids, logdir, username, password, use_agent, hostname, |
538 |
executable, command, filelist) |
|
545 |
executable, exec_args, command, filelist)
|
|
539 | 546 |
|
540 | 547 |
while child_pids: |
541 | 548 |
pid, status = os.wait() |
... | ... | |
547 | 554 |
failures += 1 |
548 | 555 |
if hosts: |
549 | 556 |
LaunchWorker(child_pids, logdir, username, password, use_agent, |
550 |
hosts.pop(0), executable, command, filelist) |
|
557 |
hosts.pop(0), executable, exec_args, command, filelist)
|
|
551 | 558 |
|
552 | 559 |
|
553 | 560 |
print "All done, %s successful and %s failed hosts" % (successes, failures) |
Also available in: Unified diff