Comparison

prosodyctl @ 7923:81f3068fc30c

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Wed, 01 Mar 2017 02:38:05 +0100
parent 7686:8d6f367bed8c
parent 7922:2fd20f372cb1
child 8015:ecb110f45c92
comparison
equal deleted inserted replaced
7910:91db637be237 7923:81f3068fc30c
1 #!/usr/bin/env lua 1 #!/usr/bin/env lua
2 -- Prosody IM 2 -- Prosody IM
3 -- Copyright (C) 2008-2010 Matthew Wild 3 -- Copyright (C) 2008-2010 Matthew Wild
4 -- Copyright (C) 2008-2010 Waqas Hussain 4 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- 5 --
6 -- This project is MIT/X11 licensed. Please see the 6 -- This project is MIT/X11 licensed. Please see the
7 -- COPYING file in the source package for more information. 7 -- COPYING file in the source package for more information.
8 -- 8 --
9 9
10 -- prosodyctl - command-line controller for Prosody XMPP server 10 -- prosodyctl - command-line controller for Prosody XMPP server
63 config = require "core.configmanager" 63 config = require "core.configmanager"
64 64
65 local ENV_CONFIG; 65 local ENV_CONFIG;
66 do 66 do
67 local filenames = {}; 67 local filenames = {};
68 68
69 local filename; 69 local filename;
70 if arg[1] == "--config" and arg[2] then 70 if arg[1] == "--config" and arg[2] then
71 table.insert(filenames, arg[2]); 71 table.insert(filenames, arg[2]);
72 if CFG_CONFIGDIR then 72 if CFG_CONFIGDIR then
73 table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]); 73 table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]);
118 if custom_plugin_paths then 118 if custom_plugin_paths then
119 local path_sep = package.config:sub(3,3); 119 local path_sep = package.config:sub(3,3);
120 -- path1;path2;path3;defaultpath... 120 -- path1;path2;path3;defaultpath...
121 CFG_PLUGINDIR = table.concat(custom_plugin_paths, path_sep)..path_sep..(CFG_PLUGINDIR or "plugins"); 121 CFG_PLUGINDIR = table.concat(custom_plugin_paths, path_sep)..path_sep..(CFG_PLUGINDIR or "plugins");
122 end 122 end
123 prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR, 123 prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR,
124 plugins = CFG_PLUGINDIR or "plugins", data = data_path }; 124 plugins = CFG_PLUGINDIR or "plugins", data = data_path };
125 125
126 if prosody.installed then 126 if prosody.installed then
127 -- Change working directory to data path. 127 -- Change working directory to data path.
128 require "lfs".chdir(data_path); 128 require "lfs".chdir(data_path);
159 if not switched_user then 159 if not switched_user then
160 -- Boo! 160 -- Boo!
161 print("Warning: Couldn't switch to Prosody user/group '"..tostring(desired_user).."'/'"..tostring(desired_group).."': "..tostring(err)); 161 print("Warning: Couldn't switch to Prosody user/group '"..tostring(desired_user).."'/'"..tostring(desired_group).."': "..tostring(err));
162 end 162 end
163 end 163 end
164 164
165 -- Set our umask to protect data files 165 -- Set our umask to protect data files
166 pposix.umask(config.get("*", "umask") or "027"); 166 pposix.umask(config.get("*", "umask") or "027");
167 pposix.setenv("HOME", data_path); 167 pposix.setenv("HOME", data_path);
168 pposix.setenv("PROSODY_CONFIG", ENV_CONFIG); 168 pposix.setenv("PROSODY_CONFIG", ENV_CONFIG);
169 else 169 else
210 print(""); 210 print("");
211 os.exit(1); 211 os.exit(1);
212 end 212 end
213 213
214 214
215 local error_messages = setmetatable({ 215 local error_messages = setmetatable({
216 ["invalid-username"] = "The given username is invalid in a Jabber ID"; 216 ["invalid-username"] = "The given username is invalid in a Jabber ID";
217 ["invalid-hostname"] = "The given hostname is invalid"; 217 ["invalid-hostname"] = "The given hostname is invalid";
218 ["no-password"] = "No password was supplied"; 218 ["no-password"] = "No password was supplied";
219 ["no-such-user"] = "The given user does not exist on the server"; 219 ["no-such-user"] = "The given user does not exist on the server";
220 ["no-such-host"] = "The given hostname does not exist in the config"; 220 ["no-such-host"] = "The given hostname does not exist in the config";
239 end 239 end
240 240
241 for hostname, config in pairs(config.getconfig()) do 241 for hostname, config in pairs(config.getconfig()) do
242 hosts[hostname] = make_host(hostname); 242 hosts[hostname] = make_host(hostname);
243 end 243 end
244 244
245 local modulemanager = require "core.modulemanager" 245 local modulemanager = require "core.modulemanager"
246 246
247 local prosodyctl = require "util.prosodyctl" 247 local prosodyctl = require "util.prosodyctl"
248 local socket = require "socket" 248 local socket = require "socket"
249 ----------------------- 249 -----------------------
288 if not user and host then 288 if not user and host then
289 show_message [[Failed to understand JID, please supply the JID you want to create]] 289 show_message [[Failed to understand JID, please supply the JID you want to create]]
290 show_usage [[adduser user@host]] 290 show_usage [[adduser user@host]]
291 return 1; 291 return 1;
292 end 292 end
293 293
294 if not host then 294 if not host then
295 show_message [[Please specify a JID, including a host. e.g. alice@example.com]]; 295 show_message [[Please specify a JID, including a host. e.g. alice@example.com]];
296 return 1; 296 return 1;
297 end 297 end
298 298
299 if not hosts[host] then 299 if not hosts[host] then
300 show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host) 300 show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host)
301 show_warning("The user will not be able to log in until this is changed."); 301 show_warning("The user will not be able to log in until this is changed.");
302 hosts[host] = make_host(host); 302 hosts[host] = make_host(host);
303 end 303 end
304 304
305 if prosodyctl.user_exists{ user = user, host = host } then 305 if prosodyctl.user_exists{ user = user, host = host } then
306 show_message [[That user already exists]]; 306 show_message [[That user already exists]];
307 return 1; 307 return 1;
308 end 308 end
309 309
310 local password = read_password(); 310 local password = read_password();
311 if not password then return 1; end 311 if not password then return 1; end
312 312
313 local ok, msg = prosodyctl.adduser { user = user, host = host, password = password }; 313 local ok, msg = prosodyctl.adduser { user = user, host = host, password = password };
314 314
315 if ok then return 0; end 315 if ok then return 0; end
316 316
317 show_message(msg) 317 show_message(msg)
318 return 1; 318 return 1;
319 end 319 end
320 320
321 function commands.passwd(arg) 321 function commands.passwd(arg)
327 if not user and host then 327 if not user and host then
328 show_message [[Failed to understand JID, please supply the JID you want to set the password for]] 328 show_message [[Failed to understand JID, please supply the JID you want to set the password for]]
329 show_usage [[passwd user@host]] 329 show_usage [[passwd user@host]]
330 return 1; 330 return 1;
331 end 331 end
332 332
333 if not host then 333 if not host then
334 show_message [[Please specify a JID, including a host. e.g. alice@example.com]]; 334 show_message [[Please specify a JID, including a host. e.g. alice@example.com]];
335 return 1; 335 return 1;
336 end 336 end
337 337
338 if not hosts[host] then 338 if not hosts[host] then
339 show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host) 339 show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host)
340 show_warning("The user will not be able to log in until this is changed."); 340 show_warning("The user will not be able to log in until this is changed.");
341 hosts[host] = make_host(host); 341 hosts[host] = make_host(host);
342 end 342 end
343 343
344 if not prosodyctl.user_exists { user = user, host = host } then 344 if not prosodyctl.user_exists { user = user, host = host } then
345 show_message [[That user does not exist, use prosodyctl adduser to create a new user]] 345 show_message [[That user does not exist, use prosodyctl adduser to create a new user]]
346 return 1; 346 return 1;
347 end 347 end
348 348
349 local password = read_password(); 349 local password = read_password();
350 if not password then return 1; end 350 if not password then return 1; end
351 351
352 local ok, msg = prosodyctl.passwd { user = user, host = host, password = password }; 352 local ok, msg = prosodyctl.passwd { user = user, host = host, password = password };
353 353
354 if ok then return 0; end 354 if ok then return 0; end
355 355
356 show_message(error_messages[msg]) 356 show_message(error_messages[msg])
357 return 1; 357 return 1;
358 end 358 end
359 359
360 function commands.deluser(arg) 360 function commands.deluser(arg)
366 if not user and host then 366 if not user and host then
367 show_message [[Failed to understand JID, please supply the JID to the user account you want to delete]] 367 show_message [[Failed to understand JID, please supply the JID to the user account you want to delete]]
368 show_usage [[deluser user@host]] 368 show_usage [[deluser user@host]]
369 return 1; 369 return 1;
370 end 370 end
371 371
372 if not host then 372 if not host then
373 show_message [[Please specify a JID, including a host. e.g. alice@example.com]]; 373 show_message [[Please specify a JID, including a host. e.g. alice@example.com]];
374 return 1; 374 return 1;
375 end 375 end
376 376
377 if not hosts[host] then 377 if not hosts[host] then
378 show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host) 378 show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host)
379 hosts[host] = make_host(host); 379 hosts[host] = make_host(host);
380 end 380 end
381 381
382 if not prosodyctl.user_exists { user = user, host = host } then 382 if not prosodyctl.user_exists { user = user, host = host } then
383 show_message [[That user does not exist on this server]] 383 show_message [[That user does not exist on this server]]
384 return 1; 384 return 1;
385 end 385 end
386 386
387 local ok, msg = prosodyctl.deluser { user = user, host = host }; 387 local ok, msg = prosodyctl.deluser { user = user, host = host };
388 388
389 if ok then return 0; end 389 if ok then return 0; end
390 390
391 show_message(error_messages[msg]) 391 show_message(error_messages[msg])
392 return 1; 392 return 1;
393 end 393 end
394 394
395 function commands.start(arg) 395 function commands.start(arg)
400 local ok, ret = prosodyctl.isrunning(); 400 local ok, ret = prosodyctl.isrunning();
401 if not ok then 401 if not ok then
402 show_message(error_messages[ret]); 402 show_message(error_messages[ret]);
403 return 1; 403 return 1;
404 end 404 end
405 405
406 if ret then 406 if ret then
407 local ok, ret = prosodyctl.getpid(); 407 local ok, ret = prosodyctl.getpid();
408 if not ok then 408 if not ok then
409 show_message("Couldn't get running Prosody's PID"); 409 show_message("Couldn't get running Prosody's PID");
410 show_message(error_messages[ret]); 410 show_message(error_messages[ret]);
411 return 1; 411 return 1;
412 end 412 end
413 show_message("Prosody is already running with PID %s", ret or "(unknown)"); 413 show_message("Prosody is already running with PID %s", ret or "(unknown)");
414 return 1; 414 return 1;
415 end 415 end
416 416
417 local ok, ret = prosodyctl.start(); 417 local ok, ret = prosodyctl.start();
418 if ok then 418 if ok then
419 local daemonize = config.get("*", "daemonize"); 419 local daemonize = config.get("*", "daemonize");
420 if daemonize == nil then 420 if daemonize == nil then
421 daemonize = prosody.installed; 421 daemonize = prosody.installed;
439 end 439 end
440 return 0; 440 return 0;
441 end 441 end
442 442
443 show_message("Failed to start Prosody"); 443 show_message("Failed to start Prosody");
444 show_message(error_messages[ret]) 444 show_message(error_messages[ret])
445 return 1; 445 return 1;
446 end 446 end
447 447
448 function commands.status(arg) 448 function commands.status(arg)
449 if arg[1] == "--help" then 449 if arg[1] == "--help" then
450 show_usage([[status]], [[Reports the running status of Prosody]]); 450 show_usage([[status]], [[Reports the running status of Prosody]]);
454 local ok, ret = prosodyctl.isrunning(); 454 local ok, ret = prosodyctl.isrunning();
455 if not ok then 455 if not ok then
456 show_message(error_messages[ret]); 456 show_message(error_messages[ret]);
457 return 1; 457 return 1;
458 end 458 end
459 459
460 if ret then 460 if ret then
461 local ok, ret = prosodyctl.getpid(); 461 local ok, ret = prosodyctl.getpid();
462 if not ok then 462 if not ok then
463 show_message("Couldn't get running Prosody's PID"); 463 show_message("Couldn't get running Prosody's PID");
464 show_message(error_messages[ret]); 464 show_message(error_messages[ret]);
487 487
488 if not prosodyctl.isrunning() then 488 if not prosodyctl.isrunning() then
489 show_message("Prosody is not running"); 489 show_message("Prosody is not running");
490 return 1; 490 return 1;
491 end 491 end
492 492
493 local ok, ret = prosodyctl.stop(); 493 local ok, ret = prosodyctl.stop();
494 if ok then 494 if ok then
495 local i=1; 495 local i=1;
496 while true do 496 while true do
497 local ok, running = prosodyctl.isrunning(); 497 local ok, running = prosodyctl.isrunning();
517 function commands.restart(arg) 517 function commands.restart(arg)
518 if arg[1] == "--help" then 518 if arg[1] == "--help" then
519 show_usage([[restart]], [[Restart a running Prosody server]]); 519 show_usage([[restart]], [[Restart a running Prosody server]]);
520 return 1; 520 return 1;
521 end 521 end
522 522
523 commands.stop(arg); 523 commands.stop(arg);
524 return commands.start(arg); 524 return commands.start(arg);
525 end 525 end
526 526
527 function commands.about(arg) 527 function commands.about(arg)
528 read_version(); 528 read_version();
529 if arg[1] == "--help" then 529 if arg[1] == "--help" then
530 show_usage([[about]], [[Show information about this Prosody installation]]); 530 show_usage([[about]], [[Show information about this Prosody installation]]);
531 return 1; 531 return 1;
532 end 532 end
533 533
534 local pwd = "."; 534 local pwd = ".";
535 local lfs = require "lfs"; 535 local lfs = require "lfs";
536 local array = require "util.array"; 536 local array = require "util.array";
537 local keys = require "util.iterators".keys; 537 local keys = require "util.iterators".keys;
538 local hg = require"util.mercurial"; 538 local hg = require"util.mercurial";
539 local relpath = config.resolve_relative_path; 539 local relpath = config.resolve_relative_path;
540 540
541 print("Prosody "..(prosody.version or "(unknown version)")); 541 print("Prosody "..(prosody.version or "(unknown version)"));
542 print(""); 542 print("");
543 print("# Prosody directories"); 543 print("# Prosody directories");
544 print("Data directory: "..relpath(pwd, data_path)); 544 print("Data directory: "..relpath(pwd, data_path));
545 print("Config directory: "..relpath(pwd, CFG_CONFIGDIR or ".")); 545 print("Config directory: "..relpath(pwd, CFG_CONFIGDIR or "."));
606 606
607 if not prosodyctl.isrunning() then 607 if not prosodyctl.isrunning() then
608 show_message("Prosody is not running"); 608 show_message("Prosody is not running");
609 return 1; 609 return 1;
610 end 610 end
611 611
612 local ok, ret = prosodyctl.reload(); 612 local ok, ret = prosodyctl.reload();
613 if ok then 613 if ok then
614 614
615 show_message("Prosody log files re-opened and config file reloaded. You may need to reload modules for some changes to take effect."); 615 show_message("Prosody log files re-opened and config file reloaded. You may need to reload modules for some changes to take effect.");
616 return 0; 616 return 0;
617 end 617 end
618 618
619 show_message(error_messages[ret]); 619 show_message(error_messages[ret]);
620 return 1; 620 return 1;
621 end 621 end
622 -- ejabberdctl compatibility 622 -- ejabberdctl compatibility
623
624 local unpack = table.unpack or unpack; -- luacheck: ignore 113
623 625
624 function commands.register(arg) 626 function commands.register(arg)
625 local user, host, password = unpack(arg); 627 local user, host, password = unpack(arg);
626 if (not (user and host)) or arg[1] == "--help" then 628 if (not (user and host)) or arg[1] == "--help" then
627 if user ~= "--help" then 629 if user ~= "--help" then
639 if not password then 641 if not password then
640 show_message [[Unable to register user with no password]]; 642 show_message [[Unable to register user with no password]];
641 return 1; 643 return 1;
642 end 644 end
643 end 645 end
644 646
645 local ok, msg = prosodyctl.adduser { user = user, host = host, password = password }; 647 local ok, msg = prosodyctl.adduser { user = user, host = host, password = password };
646 648
647 if ok then return 0; end 649 if ok then return 0; end
648 650
649 show_message(error_messages[msg]) 651 show_message(error_messages[msg])
650 return 1; 652 return 1;
651 end 653 end
652 654
653 function commands.unregister(arg) 655 function commands.unregister(arg)
663 show_usage("unregister USER HOST [PASSWORD]", "Permanently remove a user account from the server"); 665 show_usage("unregister USER HOST [PASSWORD]", "Permanently remove a user account from the server");
664 return 1; 666 return 1;
665 end 667 end
666 668
667 local ok, msg = prosodyctl.deluser { user = user, host = host }; 669 local ok, msg = prosodyctl.deluser { user = user, host = host };
668 670
669 if ok then return 0; end 671 if ok then return 0; end
670 672
671 show_message(error_messages[msg]) 673 show_message(error_messages[msg])
672 return 1; 674 return 1;
673 end 675 end
674 676
675 local openssl; 677 local openssl;
1008 print(""); 1010 print("");
1009 print(" You require encryption but mod_tls is not enabled."); 1011 print(" You require encryption but mod_tls is not enabled.");
1010 print(" Connections will fail."); 1012 print(" Connections will fail.");
1011 ok = false; 1013 ok = false;
1012 end 1014 end
1013 1015
1014 print("Done.\n"); 1016 print("Done.\n");
1015 end 1017 end
1016 if not what or what == "dns" then 1018 if not what or what == "dns" then
1017 local dns = require "net.dns"; 1019 local dns = require "net.dns";
1018 local idna = require "util.encodings".idna; 1020 local idna = require "util.encodings".idna;
1019 local ip = require "util.ip"; 1021 local ip = require "util.ip";
1020 local c2s_ports = set.new(config.get("*", "c2s_ports") or {5222}); 1022 local c2s_ports = set.new(config.get("*", "c2s_ports") or {5222});
1021 local s2s_ports = set.new(config.get("*", "s2s_ports") or {5269}); 1023 local s2s_ports = set.new(config.get("*", "s2s_ports") or {5269});
1022 1024
1023 local c2s_srv_required, s2s_srv_required; 1025 local c2s_srv_required, s2s_srv_required;
1024 if not c2s_ports:contains(5222) then 1026 if not c2s_ports:contains(5222) then
1025 c2s_srv_required = true; 1027 c2s_srv_required = true;
1026 end 1028 end
1027 if not s2s_ports:contains(5269) then 1029 if not s2s_ports:contains(5269) then
1028 s2s_srv_required = true; 1030 s2s_srv_required = true;
1029 end 1031 end
1030 1032
1031 local problem_hosts = set.new(); 1033 local problem_hosts = set.new();
1032 1034
1033 local external_addresses, internal_addresses = set.new(), set.new(); 1035 local external_addresses, internal_addresses = set.new(), set.new();
1034 1036
1035 local fqdn = socket.dns.tohostname(socket.dns.gethostname()); 1037 local fqdn = socket.dns.tohostname(socket.dns.gethostname());
1036 if fqdn then 1038 if fqdn then
1037 local res = dns.lookup(idna.to_ascii(fqdn), "A"); 1039 local res = dns.lookup(idna.to_ascii(fqdn), "A");
1038 if res then 1040 if res then
1039 for _, record in ipairs(res) do 1041 for _, record in ipairs(res) do
1045 for _, record in ipairs(res) do 1047 for _, record in ipairs(res) do
1046 external_addresses:add(record.aaaa); 1048 external_addresses:add(record.aaaa);
1047 end 1049 end
1048 end 1050 end
1049 end 1051 end
1050 1052
1051 local local_addresses = require"util.net".local_addresses() or {}; 1053 local local_addresses = require"util.net".local_addresses() or {};
1052 1054
1053 for addr in it.values(local_addresses) do 1055 for addr in it.values(local_addresses) do
1054 if not ip.new_ip(addr).private then 1056 if not ip.new_ip(addr).private then
1055 external_addresses:add(addr); 1057 external_addresses:add(addr);
1056 else 1058 else
1057 internal_addresses:add(addr); 1059 internal_addresses:add(addr);
1058 end 1060 end
1059 end 1061 end
1060 1062
1061 if external_addresses:empty() then 1063 if external_addresses:empty() then
1062 print(""); 1064 print("");
1063 print(" Failed to determine the external addresses of this server. Checks may be inaccurate."); 1065 print(" Failed to determine the external addresses of this server. Checks may be inaccurate.");
1064 c2s_srv_required, s2s_srv_required = true, true; 1066 c2s_srv_required, s2s_srv_required = true, true;
1065 end 1067 end
1066 1068
1067 local v6_supported = not not socket.tcp6; 1069 local v6_supported = not not socket.tcp6;
1068 1070
1069 for jid, host_options in enabled_hosts() do 1071 for jid, host_options in enabled_hosts() do
1070 local all_targets_ok, some_targets_ok = true, false; 1072 local all_targets_ok, some_targets_ok = true, false;
1071 local node, host = jid_split(jid); 1073 local node, host = jid_split(jid);
1072 1074
1073 local is_component = not not host_options.component_module; 1075 local is_component = not not host_options.component_module;
1074 print("Checking DNS for "..(is_component and "component" or "host").." "..jid.."..."); 1076 print("Checking DNS for "..(is_component and "component" or "host").." "..jid.."...");
1075 if node then 1077 if node then
1076 print("Only the domain part ("..host..") is used in DNS.") 1078 print("Only the domain part ("..host..") is used in DNS.")
1077 end 1079 end
1111 end 1113 end
1112 end 1114 end
1113 if target_hosts:empty() then 1115 if target_hosts:empty() then
1114 target_hosts:add(host); 1116 target_hosts:add(host);
1115 end 1117 end
1116 1118
1117 if target_hosts:contains("localhost") then 1119 if target_hosts:contains("localhost") then
1118 print(" Target 'localhost' cannot be accessed from other servers"); 1120 print(" Target 'localhost' cannot be accessed from other servers");
1119 target_hosts:remove("localhost"); 1121 target_hosts:remove("localhost");
1120 end 1122 end
1121 1123
1122 local modules = set.new(it.to_array(it.values(host_options.modules_enabled or {}))) 1124 local modules = set.new(it.to_array(it.values(host_options.modules_enabled or {})))
1123 + set.new(it.to_array(it.values(config.get("*", "modules_enabled") or {}))) 1125 + set.new(it.to_array(it.values(config.get("*", "modules_enabled") or {})))
1124 + set.new({ config.get(host, "component_module") }); 1126 + set.new({ config.get(host, "component_module") });
1125 1127
1126 if modules:contains("proxy65") then 1128 if modules:contains("proxy65") then
1135 end 1137 end
1136 if #prob > 0 then 1138 if #prob > 0 then
1137 print(" File transfer proxy "..proxy65_target.." has no "..table.concat(prob, "/").." record. Create one or set 'proxy65_address' to the correct host/IP."); 1139 print(" File transfer proxy "..proxy65_target.." has no "..table.concat(prob, "/").." record. Create one or set 'proxy65_address' to the correct host/IP.");
1138 end 1140 end
1139 end 1141 end
1140 1142
1141 for host in target_hosts do 1143 for host in target_hosts do
1142 local host_ok_v4, host_ok_v6; 1144 local host_ok_v4, host_ok_v6;
1143 local res = dns.lookup(idna.to_ascii(host), "A"); 1145 local res = dns.lookup(idna.to_ascii(host), "A");
1144 if res then 1146 if res then
1145 for _, record in ipairs(res) do 1147 for _, record in ipairs(res) do
1170 print(" "..host.." AAAA record points to unknown address "..record.aaaa); 1172 print(" "..host.." AAAA record points to unknown address "..record.aaaa);
1171 all_targets_ok = false; 1173 all_targets_ok = false;
1172 end 1174 end
1173 end 1175 end
1174 end 1176 end
1175 1177
1176 local bad_protos = {} 1178 local bad_protos = {}
1177 if not host_ok_v4 then 1179 if not host_ok_v4 then
1178 table.insert(bad_protos, "IPv4"); 1180 table.insert(bad_protos, "IPv4");
1179 end 1181 end
1180 if not host_ok_v6 then 1182 if not host_ok_v6 then
1299 local ret, err = modulemanager.load("*", module_name); 1301 local ret, err = modulemanager.load("*", module_name);
1300 if not ret then 1302 if not ret then
1301 show_message("Failed to load module '"..module_name.."': "..err); 1303 show_message("Failed to load module '"..module_name.."': "..err);
1302 os.exit(1); 1304 os.exit(1);
1303 end 1305 end
1304 1306
1305 table.remove(arg, 1); 1307 table.remove(arg, 1);
1306 1308
1307 local module = modulemanager.get_module("*", module_name); 1309 local module = modulemanager.get_module("*", module_name);
1308 if not module then 1310 if not module then
1309 show_message("Failed to load module '"..module_name.."': Unknown error"); 1311 show_message("Failed to load module '"..module_name.."': Unknown error");
1310 os.exit(1); 1312 os.exit(1);
1311 end 1313 end
1312 1314
1313 if not modulemanager.module_has_method(module, "command") then 1315 if not modulemanager.module_has_method(module, "command") then
1314 show_message("Fail: mod_"..module_name.." does not support any commands"); 1316 show_message("Fail: mod_"..module_name.." does not support any commands");
1315 os.exit(1); 1317 os.exit(1);
1316 end 1318 end
1317 1319
1318 local ok, ret = modulemanager.call_module_method(module, "command", arg); 1320 local ok, ret = modulemanager.call_module_method(module, "command", arg);
1319 if ok then 1321 if ok then
1320 if type(ret) == "number" then 1322 if type(ret) == "number" then
1321 os.exit(ret); 1323 os.exit(ret);
1322 elseif type(ret) == "string" then 1324 elseif type(ret) == "string" then
1360 command{ "--help" }; 1362 command{ "--help" };
1361 print"" 1363 print""
1362 done[command_name] = true; 1364 done[command_name] = true;
1363 end 1365 end
1364 end 1366 end
1365 1367
1366 1368
1367 os.exit(0); 1369 os.exit(0);
1368 end 1370 end
1369 1371
1370 os.exit(commands[command]({ select(2, unpack(arg)) })); 1372 os.exit(commands[command]({ select(2, unpack(arg)) }));