X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Fupdate-gosa;h=186947d5afd344da366bd9848bf60c923afd40c9;hb=9d96c80900bc2d8f751662ae4272b419ec612fa0;hp=c8cb4aa6e3bd4f3efe8ed086af8e94c207cd8253;hpb=31c26ade631e08909f849e8a0caccd895f1053c8;p=gosa.git diff --git a/gosa-core/update-gosa b/gosa-core/update-gosa index c8cb4aa6e..186947d5a 100755 --- a/gosa-core/update-gosa +++ b/gosa-core/update-gosa @@ -9,24 +9,38 @@ function print_usage() { ?> 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. +Usage: update-gosa install 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 remove plugin Remove the plugin named "plugin" from + the current configuration. - update-gosa list-plugins Lists installed plugins + update-gosa lists Lists installed plugins - update-gosa rescan-i18n Rebuilds the translations + update-gosa rescan-i18n Rebuilds the translations - update-gosa rescan-classes Rebuilds the class list + update-gosa rescan-classes Rebuilds the class list - update-gosa Shortcut for rescan-classes and rescan-i18n + update-gosa Shortcut for rescan-classes and rescan-i18n isDir() && !preg_match('/^\./', $dir->__toString())){ $file= $dir->getPathName()."/plugin.dsc"; - if (!parse_ini($file)){ + if (parse_ini($file) == ""){ echo "! Warning: plugin ".$dir->getPathName()." is missing declarations\n"; } } @@ -215,7 +233,7 @@ function load_plugins() function list_plugins() { - global $description; + global $description, $versions; $count= 0; /* Load plugin list */ @@ -224,10 +242,11 @@ function list_plugins() /* Show plugins */ foreach ($description as $name => $dsc){ if ($count == 0){ - echo "Plugin\t\t| Description\n"; - echo "------------------------------------------------------------------------\n"; + echo "Plugin\t\t|Version |Description\n"; + echo "----------------------------------------------------------------------------\n"; } - echo "* $name\t\t| ".$dsc."\n"; + $ver= $versions[$name]; + echo "$name\t\t|$ver\t |$dsc\n"; $count++; } @@ -244,7 +263,7 @@ function list_plugins() function install_plugin($file) { - global $description, $provides, $depends; + global $description, $provides, $depends, $conflicts; /* Load plugin list */ load_plugins(); @@ -271,22 +290,38 @@ function install_plugin($file) /* Check if dependencies are fullfilled */ foreach ($depends as $dep){ - if (!in_array($dep, $provides)){ + $found= false; + foreach ($provides as $provide => $dummy){ + if ($dep == $provide){ + $found= true; + break; + } + } + if (!$found){ echo "! Error: plugin depends on '$dep', but this is not installed\n\n"; exit (3); } } + /* Check for conflicts */ + foreach ($conflicts as $conf){ + if (!in_array($conf, $provides)){ + echo "! Warning: plugin conflicts with '$conf'\n\n"; + } + } + /* 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"; + if (!$handle= fopen(PLUGSTATE_DIR."/$name/plugin.lst", 'w')) { + echo "Cannot open file '$filename' - aborted\n"; exit (1); } + echo "Installing plugin '$name'...\n"; + /* Copy and fill plugin.lst */ $path= dirname($file); $dir= new RecursiveDirectoryIterator($path); @@ -294,8 +329,14 @@ function install_plugin($file) foreach ( $all as $entry ){ $source= $path."/".substr($entry->getPathName(), strlen($path) + 1); + /* Skip description - it belongs to the state dir */ + if (preg_match('/\/plugin.dsc$/', $source)){ + copy ($source, PLUGSTATE_DIR."/$name/plugin.dsc"); + continue; + } + /* Skip well known directories */ - if (preg_match('/^\./', $source) || preg_match('/\/\.svn\//', $source)) { + if (preg_match('/^\.+$/', $source) || preg_match('/\/\.svn\//', $source)) { continue; } @@ -303,28 +344,29 @@ function install_plugin($file) if (preg_match("%^.*locale/%", $source)){ $dest= GOSA_HOME."/locale/plugin/$name/".preg_replace("%^.*locale/%", "", $source); } else { - $dest= GOSA_HOME."/plugins/".$source; + $dest= GOSA_HOME."/plugins/".substr($entry->getPathName(), strlen($path) + 1); } /* Destination exists in case of directories? */ if ($entry->isDir()){ if (!is_dir($dest)){ mkdir($dest, 0755, TRUE); - fwrite ($handle, "$dest"); + fwrite ($handle, "$dest\n"); } } else { if (!is_dir(dirname($dest))){ mkdir(dirname($dest), 0755, TRUE); - fwrite ($handle, "$dest"); + fwrite ($handle, dirname($dest)."\n"); } } /* Copy files */ if ($entry->isFile()){ copy ($source, $dest); - fwrite ($handle, "$dest"); } + /* Note what we did... */ + fwrite ($handle, "$dest\n"); } fclose($handle); @@ -338,8 +380,66 @@ function install_plugin($file) } +function remove_plugin($name) +{ + global $description, $depends; + + /* Load plugin list */ + load_plugins(); + + /* Present? */ + if (!isset($description[$name])){ + echo "! Error: cannot find a plugin named '$name'\n\n"; + exit (1); + } + + /* Depends? */ + foreach ($depends as $sname => $pl_depends){ + if (in_array($name, $pl_depends)){ + echo "! Error: plugin '$sname' depends on '$name' - cannot remove it\n\n"; + exit (1); + } + } + + /* Load information */ + if (!file_exists(PLUGSTATE_DIR."/$name/plugin.lst")){ + echo "! Error: cannot remove plugin '$name' - no install history found\n\n"; + exit (1); + } + + echo "Removing plugin '$name'...\n"; + $contents= file(PLUGSTATE_DIR."/$name/plugin.lst"); + $cnv= array(); + foreach($contents as $line){ + $entry= chop($line); + $cnv[strlen($entry).":$entry"]= $entry; + } + krsort($cnv); + + /* Remove files first */ + clearstatcache(); + foreach ($cnv as $entry){ + if (is_dir($entry)){ + rmdir($entry); + continue; + } + if (file_exists($entry)){ + unlink($entry); + } + } + + /* Remove state directory for plugin */ + rmdirRecursive(PLUGSTATE_DIR."/$name"); + + /* Update caches */ + rescan_classes(); + rescan_i18n(); +} + + + /* Fill global values */ -$description= $provides= $depends= array(); +$description= $provides= $depends= $versions= $conflicts= array(); /* Action specified? */ if ($argc < 2){ @@ -349,19 +449,24 @@ if ($argc < 2){ } switch ($argv[1]){ - case 'install-plugin': + case 'install': if (isset($argv[2])){ install_plugin($argv[2]); } else { - echo "Usage: update-gosa install-plugin dsc-file\n\n"; + echo "Usage: update-gosa install dsc-file\n\n"; exit (1); } break; - case 'list-plugins': + case 'list': list_plugins(); break; - case 'remove-plugin': - echo "remove\n"; + case 'remove': + if (isset($argv[2])){ + remove_plugin($argv[2]); + } else { + echo "Usage: update-gosa remove plugin-name\n\n"; + exit (1); + } break; case 'rescan-i18n': rescan_i18n();