2006-10-19 16:55:07 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @author $Author$
|
|
|
|
* @version $Revision$
|
|
|
|
*/
|
|
|
|
define('NSPACE', 'lse');
|
|
|
|
define('VERBOSE', FALSE);
|
|
|
|
#define('VERBOSE', TRUE);
|
|
|
|
|
|
|
|
header("Content-type: text/plain");
|
|
|
|
require_once 'conf.php';
|
2007-01-12 00:28:05 +01:00
|
|
|
require_once "$STORAGE_SERVER_PATH/var/conf.php";
|
2006-10-19 16:55:07 +02:00
|
|
|
require_once 'DB.php';
|
|
|
|
require_once "XML/Util.php";
|
|
|
|
require_once "XML/Beautifier.php";
|
2007-01-12 00:28:05 +01:00
|
|
|
require_once "$STORAGE_SERVER_PATH/var/BasicStor.php";
|
|
|
|
require_once "$STORAGE_SERVER_PATH/var/Prefs.php";
|
2006-10-19 16:55:07 +02:00
|
|
|
|
|
|
|
/* =========================================================== misc functions */
|
2006-12-20 03:46:29 +01:00
|
|
|
function ls_restore_processObject($el)
|
|
|
|
{
|
2006-10-19 16:55:07 +02:00
|
|
|
$res = array(
|
2006-12-20 03:46:29 +01:00
|
|
|
'name' => $el->attrs['name']->val,
|
|
|
|
'type' => $el->name,
|
2006-10-19 16:55:07 +02:00
|
|
|
);
|
2006-12-20 03:46:29 +01:00
|
|
|
switch ($res['type']) {
|
|
|
|
case 'folder':
|
|
|
|
foreach ($el->children as $i => $o) {
|
2006-10-19 16:55:07 +02:00
|
|
|
$res['children'][] = ls_restore_processObject($o);
|
|
|
|
}
|
2006-12-20 03:46:29 +01:00
|
|
|
break;
|
2006-10-19 16:55:07 +02:00
|
|
|
default:
|
|
|
|
$res['gunid'] = $el->attrs['id']->val;
|
2006-12-20 03:46:29 +01:00
|
|
|
break;
|
2006-10-19 16:55:07 +02:00
|
|
|
}
|
|
|
|
return $res;
|
|
|
|
}
|
|
|
|
|
2006-12-20 03:46:29 +01:00
|
|
|
function ls_restore_checkErr($r, $ln='')
|
|
|
|
{
|
|
|
|
if (PEAR::isError($r)) {
|
2006-10-19 16:55:07 +02:00
|
|
|
echo "ERROR $ln: ".$r->getMessage()." ".$r->getUserInfo()."\n";
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function ls_restore_restoreObject($obj, $parid, $reallyInsert=TRUE){
|
|
|
|
global $tmpdir, $bs;
|
2006-12-20 03:46:29 +01:00
|
|
|
switch ($obj['type']) {
|
|
|
|
case "folder";
|
|
|
|
if ($reallyInsert) {
|
|
|
|
if (VERBOSE) {
|
|
|
|
echo " creating folder {$obj['name']} ...\n";
|
|
|
|
}
|
|
|
|
$r = BasicStor::bsCreateFolder($parid, $obj['name']);
|
2006-10-19 16:55:07 +02:00
|
|
|
ls_restore_checkErr($r, __LINE__);
|
2006-12-20 03:46:29 +01:00
|
|
|
} else {
|
|
|
|
$r = $parid;
|
|
|
|
}
|
|
|
|
if (isset($obj['children']) && is_array($obj['children'])) {
|
|
|
|
foreach ($obj['children'] as $i => $ch) {
|
2006-10-19 16:55:07 +02:00
|
|
|
ls_restore_restoreObject($ch, $r);
|
|
|
|
}
|
|
|
|
}
|
2006-12-20 03:46:29 +01:00
|
|
|
break;
|
|
|
|
case "audioClip";
|
|
|
|
case "webstream";
|
|
|
|
case "playlist";
|
2006-10-19 16:55:07 +02:00
|
|
|
$gunid = $obj['gunid'];
|
2006-12-20 03:46:29 +01:00
|
|
|
if (is_null($gunid)) {
|
|
|
|
break;
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
$gunid3 = substr($gunid, 0, 3);
|
|
|
|
$mediaFile = "$tmpdir/stor/$gunid3/$gunid";
|
|
|
|
# echo "X1 $gunid, $gunid3, $mediaFile\n";
|
2006-12-20 03:46:29 +01:00
|
|
|
if (!file_exists($mediaFile)) {
|
|
|
|
$mediaFile = NULL;
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
$mdataFile = "$tmpdir/stor/$gunid3/$gunid.xml";
|
2006-12-20 03:46:29 +01:00
|
|
|
if (!file_exists($mdataFile)) {
|
|
|
|
$mdataFile = NULL;
|
|
|
|
}
|
|
|
|
if ($reallyInsert) {
|
|
|
|
if (VERBOSE) {
|
|
|
|
echo " creating file {$obj['name']} ...\n";
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
$r = $bs->bsPutFile($parid, $obj['name'],
|
|
|
|
$mediaFile, $mdataFile, $obj['gunid'],
|
|
|
|
strtolower($obj['type']));
|
|
|
|
ls_restore_checkErr($r, __LINE__);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* =============================================================== processing */
|
|
|
|
|
|
|
|
PEAR::setErrorHandling(PEAR_ERROR_RETURN);
|
2006-12-16 07:36:22 +01:00
|
|
|
$CC_DBC = DB::connect($CC_CONFIG['dsn'], TRUE);
|
|
|
|
$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
|
|
|
|
$bs = new BasicStor();
|
2006-11-14 20:11:09 +01:00
|
|
|
$pr = new Prefs($bs);
|
2006-10-19 16:55:07 +02:00
|
|
|
|
|
|
|
$dbxml = file_get_contents($argv[1]);
|
|
|
|
$tmpdir = $argv[2];
|
|
|
|
|
2007-01-12 00:28:05 +01:00
|
|
|
require_once("$STORAGE_SERVER_PATH/var/XmlParser.php");
|
2006-11-14 20:11:09 +01:00
|
|
|
$parser = new XmlParser($dbxml);
|
|
|
|
if ($parser->isError()) {
|
2006-10-19 16:55:07 +02:00
|
|
|
return PEAR::raiseError(
|
|
|
|
"MetaData::parse: ".$parser->getError()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$xmlTree = $parser->getTree();
|
|
|
|
|
|
|
|
|
|
|
|
/* ----------------------------------------- processing storageServer element */
|
2006-12-16 07:36:22 +01:00
|
|
|
$subjArr = FALSE;
|
|
|
|
$tree = FALSE;
|
|
|
|
foreach ($xmlTree->children as $i => $el) {
|
|
|
|
switch ($el->name) {
|
|
|
|
case "subjects":
|
|
|
|
if ($subjArr !== FALSE) {
|
|
|
|
echo "ERROR: unexpected subjects element\n";
|
2006-10-19 16:55:07 +02:00
|
|
|
}
|
2006-12-16 07:36:22 +01:00
|
|
|
$subjArr = $el->children;
|
|
|
|
break;
|
|
|
|
case "folder":
|
|
|
|
if ($tree !== FALSE) {
|
|
|
|
echo "ERROR: unexpected folder element\n";
|
2006-10-19 16:55:07 +02:00
|
|
|
}
|
|
|
|
$tree = ls_restore_processObject($el);
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
2006-10-19 16:55:07 +02:00
|
|
|
default:
|
2006-12-16 07:36:22 +01:00
|
|
|
echo "ERROR: unknown element name {$el->name}\n";
|
2006-10-19 16:55:07 +02:00
|
|
|
exit;
|
|
|
|
}
|
2006-12-16 07:36:22 +01:00
|
|
|
// echo "{$el->name}\n";
|
2006-10-19 16:55:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------- processing subjects element */
|
2006-12-16 07:36:22 +01:00
|
|
|
$subjects = array();
|
|
|
|
$groups = array();
|
|
|
|
foreach ($subjArr as $i => $el) {
|
|
|
|
switch ($el->name) {
|
|
|
|
case "group":
|
2006-10-19 16:55:07 +02:00
|
|
|
$grname = $el->attrs['name']->val;
|
|
|
|
$groups[$grname] = $el->children;
|
|
|
|
$subjects[$grname] = array(
|
|
|
|
'type' => 'group',
|
|
|
|
);
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
|
|
|
case "user":
|
2006-10-19 16:55:07 +02:00
|
|
|
$login = $el->attrs['login']->val;
|
|
|
|
$subjects[$login] = array(
|
|
|
|
'type' => 'user',
|
|
|
|
'pass' => $el->attrs['pass']->val,
|
|
|
|
# 'realname' => $el->attrs['realname']->val,
|
|
|
|
'realname' => '',
|
|
|
|
'prefs' => (isset($el->children[0]) ? $el->children[0]->children : NULL),
|
|
|
|
);
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
2006-10-19 16:55:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------------------- processing groups */
|
2006-12-16 07:36:22 +01:00
|
|
|
foreach ($groups as $grname => $group) {
|
|
|
|
foreach ($group as $i => $el) {
|
|
|
|
switch ($el->name) {
|
|
|
|
case "member":
|
2006-10-19 16:55:07 +02:00
|
|
|
$groups[$grname][$i] = $el->attrs['name']->val;
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
|
|
|
case "preferences":
|
2006-10-19 16:55:07 +02:00
|
|
|
$subjects[$grname]['prefs'] = $el->children;
|
|
|
|
unset($groups[$grname][$i]);
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
2006-10-19 16:55:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#var_dump($xmlTree);
|
|
|
|
#var_dump($subjArr);
|
|
|
|
#var_dump($groups);
|
|
|
|
#var_dump($subjects);
|
|
|
|
#var_dump($tree);
|
|
|
|
|
|
|
|
#exit;
|
|
|
|
|
|
|
|
/* ================================================================ restoring */
|
|
|
|
|
2006-12-16 07:36:22 +01:00
|
|
|
if (VERBOSE) {
|
|
|
|
echo " resetting storage ...\n";
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
$bs->resetStorage(FALSE);
|
|
|
|
$storId = $bs->storId;
|
|
|
|
|
|
|
|
/* ------------------------------------------------------- restoring subjects */
|
2006-12-16 07:36:22 +01:00
|
|
|
foreach ($subjects as $login => $subj) {
|
|
|
|
$uid0 = Subjects::GetSubjId($login);
|
2006-10-19 16:55:07 +02:00
|
|
|
ls_restore_checkErr($uid0);
|
2006-12-16 07:36:22 +01:00
|
|
|
switch ($subj['type']) {
|
|
|
|
case "user":
|
|
|
|
if ($login=='root') {
|
2006-10-19 16:55:07 +02:00
|
|
|
$r = $bs->passwd($login, NULL, $subj['pass'], TRUE);
|
|
|
|
ls_restore_checkErr($r, __LINE__);
|
|
|
|
$uid = $uid0;
|
2006-12-16 07:36:22 +01:00
|
|
|
} else {
|
|
|
|
if (!is_null($uid0)) {
|
2006-10-19 16:55:07 +02:00
|
|
|
$r = $bs->removeSubj($login);
|
|
|
|
ls_restore_checkErr($r, __LINE__);
|
|
|
|
}
|
2006-12-16 07:36:22 +01:00
|
|
|
if (VERBOSE) {
|
|
|
|
echo " adding user $login ...\n";
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
$uid = $bs->addSubj($login, $subj['pass'], $subj['realname'], TRUE);
|
|
|
|
ls_restore_checkErr($uid, __LINE__);
|
|
|
|
}
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
|
|
|
case "group":
|
|
|
|
if (!is_null($uid0)) {
|
2006-10-19 16:55:07 +02:00
|
|
|
$r = $bs->removeSubj($login);
|
2006-12-16 07:36:22 +01:00
|
|
|
if (PEAR::isError($r)) {
|
|
|
|
$uid = $uid0;
|
|
|
|
break;
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
//ls_restore_checkErr($r, __LINE__);
|
|
|
|
}
|
2006-12-16 07:36:22 +01:00
|
|
|
if (VERBOSE) {
|
|
|
|
echo " adding group $login ...\n";
|
|
|
|
}
|
2006-10-19 16:55:07 +02:00
|
|
|
$uid = $bs->addSubj($login, NULL);
|
|
|
|
ls_restore_checkErr($uid, __LINE__);
|
2006-12-16 07:36:22 +01:00
|
|
|
// var_export($uid); echo " ";
|
|
|
|
break;
|
|
|
|
} // switch
|
|
|
|
|
|
|
|
// echo "$login/$uid :\n";
|
|
|
|
if (isset($subj['prefs'])) {
|
|
|
|
// var_dump($subj['prefs']); exit;
|
|
|
|
foreach ($subj['prefs'] as $i => $el) {
|
|
|
|
switch ($el->name) {
|
|
|
|
case "pref":
|
2006-10-19 16:55:07 +02:00
|
|
|
$prefkey = $el->attrs['name']->val;
|
|
|
|
$prefval = $el->attrs['val']->val;
|
2006-12-16 07:36:22 +01:00
|
|
|
// echo" PREF($prefkey)=$prefval\n";
|
2006-10-19 16:55:07 +02:00
|
|
|
$res = $pr->insert($uid, $prefkey, $prefval);
|
|
|
|
ls_restore_checkErr($res, __LINE__);
|
2006-12-16 07:36:22 +01:00
|
|
|
break;
|
2006-10-19 16:55:07 +02:00
|
|
|
default:
|
|
|
|
var_dump($el);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------- restoring groups */
|
|
|
|
#var_dump($groups);
|
2006-12-16 07:36:22 +01:00
|
|
|
foreach ($groups as $grname => $group) {
|
|
|
|
foreach ($group as $i => $login) {
|
|
|
|
if (VERBOSE) {
|
|
|
|
echo " adding subject $login to group $grname ...\n";
|
|
|
|
}
|
|
|
|
$r = Subjects::AddSubjectToGroup($login, $grname);
|
2006-10-19 16:55:07 +02:00
|
|
|
ls_restore_checkErr($r, __LINE__);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------------------- restoring objects */
|
|
|
|
ls_restore_restoreObject($tree, $storId, FALSE);
|
|
|
|
|
|
|
|
?>
|