#!/usr/bin/php5 update-gosa - class cache updated and plugin manager for GOsa Usage: update-gosa install-plugin dsc Install the plugin using the dsc information placed in the plugin source directory. update-gosa remove-plugin plugin Remove the plugin named "plugin" from the current configuration. update-gosa list-plugins Lists installed plugins update-gosa rescan-i18n Rebuilds the translations update-gosa rescan-classes Rebuilds the class list update-gosa Shortcut for rescan-classes and rescan-i18n $value){ fwrite ($handle, " \"$key\" => \"$value\",\n"); } fwrite ($handle, " );\n"); fclose($handle); } function rescan_i18n() { echo "Updating internationalization...\n"; $languages= array(); $size= strlen(LOCALE_DIR); /* Get all available messages.po files, sort them for languages */ $dir= new RecursiveDirectoryIterator(LOCALE_DIR); $all= new RecursiveIteratorIterator($dir); foreach ( $all as $element ){ if ($element->isFile() && preg_match('/\/LC_MESSAGES\/messages.po$/', $element->getPathname())){ $lang= preg_replace('/^.*\/([^\/]+)\/LC_MESSAGES\/.*$/', '\1', $element); if (!isset($languages[$lang])){ $languages[$lang]= array(); } $languages[$lang][]= substr($element->getPathName(), $size+1); } } /* For each language, merge the target .mo to the compiled directory. */ foreach ($languages as $language => $po_files){ if (!is_dir(LOCALE_DIR."/compiled/${language}/LC_MESSAGES")){ if (!mkdir (LOCALE_DIR."/compiled/${language}/LC_MESSAGES", 0755, TRUE)){ echo "Failed to create '".LOCALE_DIR."/compiled/${language}/LC_MESSAGES'- aborted"; exit (3); } } /* Cat all these po files into one single file */ system ("(cd ".LOCALE_DIR." && msgcat ".implode(" ", $po_files)." > compiled/${language}/LC_MESSAGES/messages.po)", $val); if ($val != 0){ echo "Merging of message files failed - aborted"; exit (4); } system ("(cd ".LOCALE_DIR."/compiled/${language}/LC_MESSAGES && msgfmt -o messages.mo messages.po && rm messages.po)", $val); if ($val != 0){ echo "Compiling of message files failed - aborted"; exit (5); } } } function parse_ini($file) { global $description, $provides, $depends; $res= ""; if (file_exists($file)){ $tmp= parse_ini_file($file, TRUE); if (isset($tmp['gosa-plugin'])){ $plugin= &$tmp['gosa-plugin']; if (isset($plugin['name'])&& isset($plugin['description']) && isset($plugin['provides'])){ $res= $plugin['name']; $provides[$res]= $plugin[$res]; $description[$res]= $plugin['description']; if (isset($plugin['depends'])){ $depends[$res]= explode(',', preg_replace('/\s+/', '', $plugin['depends'])); } } } } return $res; } function dependency_check() { global $description, $provides, $depends; foreach ($depends as $name => $pl_depends){ foreach ($pl_depends as $pl){ if (!in_array($pl, $provides)){ echo "! Error: plugin '$name' depends on '$pl' which is not provided by any plugin\n\n"; exit (1); } } } } function load_plugins() { if (!is_dir(PLUGSTATE_DIR)){ if (!mkdir (PLUGSTATE_DIR, 0755, TRUE)){ echo "Cannot create plugstate dir '".PLUGSTATE_DIR."' - aborted\n"; exit (2); } } $dir= new DirectoryIterator(PLUGSTATE_DIR); foreach ($dir as $entry){ if ($dir->isDir() && !preg_match('/^\./', $dir->__toString())){ $file= $dir->getPathName()."/plugin.dsc"; if (!parse_ini($file)){ echo "! Warning: plugin ".$dir->getPathName()." is missing declarations\n"; } } } } function list_plugins() { global $description; $count= 0; /* Load plugin list */ load_plugins(); /* Show plugins */ foreach ($description as $name => $dsc){ if ($count == 0){ echo "Plugin\t\t| Description\n"; echo "------------------------------------------------------------------------\n"; } echo "* $name\t\t| ".$dsc."\n"; $count++; } /* Yell about non existing plugins... */ if ($count == 0){ echo "No plugins found...\n\n"; } else { # Check for dependencies dependency_check(); echo "\n"; } } function install_plugin($file) { global $description, $provides, $depends; /* Load plugin list */ load_plugins(); /* Load .dsc file */ if (file_exists($file)){ $tmp= parse_ini_file($file, TRUE); if (isset($tmp['gosa-plugin'])){ $plugin= &$tmp['gosa-plugin']; if (isset($plugin['name'])&& isset($plugin['description'])){ $name= $plugin['name']; $description= $plugin['description']; $depends= array(); if (isset($plugin['depends'])){ $depends= explode(',', preg_replace('/\s+/', '', $plugin['depends'])); } /* Already installed? */ if (isset($provides[$name])){ echo "! Error: plugin already installed\n\n"; exit (3); } /* Check if dependencies are fullfilled */ foreach ($depends as $dep){ if (!in_array($dep, $provides)){ echo "! Error: plugin depends on '$dep', but this is not installed\n\n"; exit (3); } } /* Create plugstate directory and touch plugin.lst */ if (!mkdir (PLUGSTATE_DIR."/$name", 0755, TRUE)){ echo "Failed to create '".PLUGSTATE_DIR."/$name - aborted"; exit (3); } if (!$handle= fopen(PLUGSTATE_DIR."/$name/plugin.lst", 'w')) { echo "Cannot open file '$filename' - aborted\n"; exit (1); } /* Copy and fill plugin.lst */ $path= dirname($file); $dir= new RecursiveDirectoryIterator($path); $all= new RecursiveIteratorIterator($dir); foreach ( $all as $entry ){ $source= $path."/".substr($entry->getPathName(), strlen($path) + 1); /* Skip well known directories */ if (preg_match('/^\./', $source) || preg_match('/\/\.svn\//', $source)) { continue; } /* Calculate destination */ if (preg_match("%^.*locale/%", $source)){ $dest= GOSA_HOME."/locale/plugin/$name/".preg_replace("%^.*locale/%", "", $source); } else { $dest= GOSA_HOME."/plugins/".$source; } /* Destination exists in case of directories? */ if ($entry->isDir()){ if (!is_dir($dest)){ mkdir($dest, 0755, TRUE); fwrite ($handle, "$dest"); } } else { if (!is_dir(dirname($dest))){ mkdir(dirname($dest), 0755, TRUE); fwrite ($handle, "$dest"); } } /* Copy files */ if ($entry->isFile()){ copy ($source, $dest); fwrite ($handle, "$dest"); } } fclose($handle); } } } /* Update caches */ rescan_classes(); rescan_i18n(); } /* Fill global values */ $description= $provides= $depends= array(); /* Action specified? */ if ($argc < 2){ rescan_classes(); rescan_i18n(); exit (0); } switch ($argv[1]){ case 'install-plugin': if (isset($argv[2])){ install_plugin($argv[2]); } else { echo "Usage: update-gosa install-plugin dsc-file\n\n"; exit (1); } break; case 'list-plugins': list_plugins(); break; case 'remove-plugin': echo "remove\n"; break; case 'rescan-i18n': rescan_i18n(); break; case 'rescan-classes': rescan_classes(); break; default: echo "Error: Supplied command not known\n\n"; print_usage(); break; } ?>