Comparison

util/prosodyctl/check.lua @ 13717:4f173a44370b 13.0

prosodyctl: check features: check for mod_muc_mam on MUC components
author Matthew Wild <mwild1@gmail.com>
date Sun, 16 Feb 2025 13:17:00 +0000
parent 13710:f7de36fed53c
child 13722:8bf5d07e3796
comparison
equal deleted inserted replaced
13715:edd006093533 13717:4f173a44370b
1484 local common_subdomains = { 1484 local common_subdomains = {
1485 http_file_share = "share"; 1485 http_file_share = "share";
1486 muc = "groups"; 1486 muc = "groups";
1487 }; 1487 };
1488 1488
1489 local recommended_component_modules = {
1490 muc = { "muc_mam" };
1491 };
1492
1489 local function print_feature_status(feature, host) 1493 local function print_feature_status(feature, host)
1490 if quiet then return; end 1494 if quiet then return; end
1491 print("", feature.ok and "OK" or "(!)", feature.name); 1495 print("", feature.ok and "OK" or "(!)", feature.name);
1492 if not feature.ok then 1496 if not feature.ok then
1493 if feature.lacking_modules then 1497 if feature.lacking_modules then
1499 end 1503 end
1500 if feature.lacking_components then 1504 if feature.lacking_components then
1501 table.sort(feature.lacking_components); 1505 table.sort(feature.lacking_components);
1502 for _, component_module in ipairs(feature.lacking_components) do 1506 for _, component_module in ipairs(feature.lacking_components) do
1503 local subdomain = common_subdomains[component_module]; 1507 local subdomain = common_subdomains[component_module];
1508 local recommended_mods = recommended_component_modules[component_module];
1504 if subdomain then 1509 if subdomain then
1505 print("", "", "Suggested component:"); 1510 print("", "", "Suggested component:");
1506 print(""); 1511 print("");
1512 print("", "", "", ("-- Documentation: https://prosody.im/doc/modules/mod_%s"):format(component_module));
1507 print("", "", "", ("Component %q %q"):format(subdomain.."."..host, component_module)); 1513 print("", "", "", ("Component %q %q"):format(subdomain.."."..host, component_module));
1508 print("", "", "", ("-- Documentation: https://prosody.im/doc/modules/mod_%s"):format(component_module)); 1514 if recommended_mods then
1515 print("", "", "", " modules_enabled = {");
1516 table.sort(recommended_mods);
1517 for _, mod in ipairs(recommended_mods) do
1518 print("", "", "", (" %q;"):format(mod));
1519 end
1520 print("", "", "", " }");
1521 end
1509 else 1522 else
1510 print("", "", ("Suggested component: %s"):format(component_module)); 1523 print("", "", ("Suggested component: %s"):format(component_module));
1511 end 1524 end
1512 end 1525 end
1513 print(""); 1526 print("");
1514 print("", "", "If you have already configured any these components, they may not be"); 1527 print("", "", "If you have already configured any these components, they may not be");
1515 print("", "", "linked correctly to "..host..". For more info see https://prosody.im/doc/components"); 1528 print("", "", "linked correctly to "..host..". For more info see https://prosody.im/doc/components");
1529 end
1530 if feature.lacking_component_modules then
1531 table.sort(feature.lacking_component_modules, function (a, b)
1532 return a.host < b.host;
1533 end);
1534 for _, problem in ipairs(feature.lacking_component_modules) do
1535 local hostapi = api(problem.host);
1536 local current_modules_enabled = hostapi:get_option_array("modules_enabled", {});
1537 print("", "", ("Component %q is missing the following modules: %s"):format(problem.host, table.concat(problem.missing_mods)));
1538 print("");
1539 print("","", "Add the missing modules to your modules_enabled under the Component, like this:");
1540 print("");
1541 print("");
1542 print("", "", "", ("-- Documentation: https://prosody.im/doc/modules/mod_%s"):format(problem.component_module));
1543 print("", "", "", ("Component %q %q"):format(problem.host, problem.component_module));
1544 print("", "", "", (" modules_enabled = {"));
1545 for _, mod in ipairs(current_modules_enabled) do
1546 print("", "", "", (" %q;"):format(mod));
1547 end
1548 for _, mod in ipairs(problem.missing_mods) do
1549 print("", "", "", (" %q; -- Add this!"):format(mod));
1550 end
1551 print("", "", "", (" }"));
1552 end
1516 end 1553 end
1517 end 1554 end
1518 print(""); 1555 print("");
1519 end 1556 end
1520 1557
1570 end 1607 end
1571 1608
1572 local function check_component(suggested, alternate, ...) 1609 local function check_component(suggested, alternate, ...)
1573 local found; 1610 local found;
1574 for _, component_module in ipairs({ suggested, alternate, ... }) do 1611 for _, component_module in ipairs({ suggested, alternate, ... }) do
1575 found = #host_components[component_module] > 0; 1612 found = host_components[component_module][1];
1576 if found then break; end 1613 if found then
1614 local enabled_component_modules = api(found):get_option_inherited_set("modules_enabled");
1615 local recommended_mods = recommended_component_modules[component_module];
1616 local missing_mods = {};
1617 for _, mod in ipairs(recommended_mods) do
1618 if not enabled_component_modules:contains(mod) then
1619 table.insert(missing_mods, mod);
1620 end
1621 end
1622 if #missing_mods > 0 then
1623 if not current_feature.lacking_component_modules then
1624 current_feature.lacking_component_modules = {};
1625 end
1626 table.insert(current_feature.lacking_component_modules, {
1627 host = found;
1628 component_module = component_module;
1629 missing_mods = missing_mods;
1630 });
1631 end
1632 end
1577 end 1633 end
1578 if not found then 1634 if not found then
1579 current_feature.lacking_components = current_feature.lacking_components or {}; 1635 current_feature.lacking_components = current_feature.lacking_components or {};
1580 table.insert(current_feature.lacking_components, suggested); 1636 table.insert(current_feature.lacking_components, suggested);
1581 end 1637 end
1662 end 1718 end
1663 1719
1664 for _, feature in ipairs(features) do 1720 for _, feature in ipairs(features) do
1665 current_feature = feature; 1721 current_feature = feature;
1666 feature.check(); 1722 feature.check();
1667 feature.ok = not feature.lacking_modules and not feature.lacking_components; 1723 feature.ok = (
1724 not feature.lacking_modules and
1725 not feature.lacking_components and
1726 not feature.lacking_component_modules
1727 );
1668 -- For improved presentation, we group the (ok) and (not ok) features 1728 -- For improved presentation, we group the (ok) and (not ok) features
1669 if feature.ok then 1729 if feature.ok then
1670 print_feature_status(feature, host); 1730 print_feature_status(feature, host);
1671 end 1731 end
1672 end 1732 end