function get_modules()
{
    global $adb, $log;
    $log->debug("Entering customer portal Function get_modules");
    // Check if information is available in cache?
    $modules = Vtiger_Soap_CustomerPortal::lookupAllowedModules();
    if ($modules === false) {
        $modules = array();
        $query = $adb->pquery("SELECT vtiger_customerportal_tabs.* FROM vtiger_customerportal_tabs\n\t\t\tINNER JOIN vtiger_tab ON vtiger_tab.tabid = vtiger_customerportal_tabs.tabid\n\t\t\tWHERE vtiger_tab.presence = 0 AND vtiger_customerportal_tabs.visible = 1", array());
        $norows = $adb->num_rows($query);
        if ($norows) {
            while ($resultrow = $adb->fetch_array($query)) {
                $modules[(int) $resultrow['sequence']] = getTabModuleName($resultrow['tabid']);
            }
            ksort($modules);
            // Order via SQL might cost us, so handling it ourselves in this case
        }
        Vtiger_Soap_CustomerPortal::updateAllowedModules($modules);
    }
    $log->debug("Exiting customerportal function get_modules");
    return $modules;
}