245 lines
7.6 KiB
PHP
245 lines
7.6 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @author $Author$
|
||
|
* @version $Revision$
|
||
|
*/
|
||
|
define('NSPACE', 'lse');
|
||
|
define('VERBOSE', FALSE);
|
||
|
#define('VERBOSE', TRUE);
|
||
|
|
||
|
header("Content-type: text/plain");
|
||
|
require_once 'conf.php';
|
||
|
require_once "$storageServerPath/var/conf.php";
|
||
|
require_once 'DB.php';
|
||
|
require_once "XML/Util.php";
|
||
|
require_once "XML/Beautifier.php";
|
||
|
require_once "$storageServerPath/var/BasicStor.php";
|
||
|
require_once "$storageServerPath/var/Prefs.php";
|
||
|
|
||
|
/* =========================================================== misc functions */
|
||
|
function ls_restore_processObject($el){
|
||
|
$res = array(
|
||
|
'name' => $el->attrs['name']->val,
|
||
|
'type' => $el->name,
|
||
|
);
|
||
|
switch($res['type']){
|
||
|
case'folder':
|
||
|
foreach($el->children as $i=>$o){
|
||
|
$res['children'][] = ls_restore_processObject($o);
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
$res['gunid'] = $el->attrs['id']->val;
|
||
|
break;
|
||
|
}
|
||
|
return $res;
|
||
|
}
|
||
|
|
||
|
function ls_restore_checkErr($r, $ln=''){
|
||
|
if(PEAR::isError($r)){
|
||
|
echo "ERROR $ln: ".$r->getMessage()." ".$r->getUserInfo()."\n";
|
||
|
exit;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ls_restore_restoreObject($obj, $parid, $reallyInsert=TRUE){
|
||
|
global $tmpdir, $bs;
|
||
|
switch($obj['type']){
|
||
|
case"folder";
|
||
|
if($reallyInsert){
|
||
|
if(VERBOSE) echo " creating folder {$obj['name']} ...\n";
|
||
|
$r = $bs->bsCreateFolder($parid, $obj['name']);
|
||
|
ls_restore_checkErr($r, __LINE__);
|
||
|
}else $r=$parid;
|
||
|
if(isset($obj['children']) && is_array($obj['children'])){
|
||
|
foreach($obj['children'] as $i=>$ch){
|
||
|
ls_restore_restoreObject($ch, $r);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case"audioClip";
|
||
|
case"webstream";
|
||
|
case"playlist";
|
||
|
$gunid = $obj['gunid'];
|
||
|
if(is_null($gunid)) break;
|
||
|
$gunid3 = substr($gunid, 0, 3);
|
||
|
$mediaFile = "$tmpdir/stor/$gunid3/$gunid";
|
||
|
# echo "X1 $gunid, $gunid3, $mediaFile\n";
|
||
|
if(!file_exists($mediaFile)) $mediaFile = NULL;
|
||
|
$mdataFile = "$tmpdir/stor/$gunid3/$gunid.xml";
|
||
|
if(!file_exists($mdataFile)) $mdataFile = NULL;
|
||
|
if($reallyInsert){
|
||
|
if(VERBOSE) echo " creating file {$obj['name']} ...\n";
|
||
|
$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);
|
||
|
$dbc = DB::connect($config['dsn'], TRUE);
|
||
|
$dbc->setFetchMode(DB_FETCHMODE_ASSOC);
|
||
|
$bs = &new BasicStor($dbc, $config);
|
||
|
$pr =& new Prefs($bs);
|
||
|
|
||
|
$dbxml = file_get_contents($argv[1]);
|
||
|
$tmpdir = $argv[2];
|
||
|
|
||
|
require_once"$storageServerPath/var/XmlParser.php";
|
||
|
$parser =& new XmlParser($dbxml);
|
||
|
if($parser->isError()){
|
||
|
return PEAR::raiseError(
|
||
|
"MetaData::parse: ".$parser->getError()
|
||
|
);
|
||
|
}
|
||
|
$xmlTree = $parser->getTree();
|
||
|
|
||
|
|
||
|
/* ----------------------------------------- processing storageServer element */
|
||
|
$subjArr = FALSE;
|
||
|
$tree = FALSE;
|
||
|
foreach($xmlTree->children as $i=>$el){
|
||
|
switch($el->name){
|
||
|
case"subjects":
|
||
|
if($subjArr !== FALSE){
|
||
|
echo"ERROR: unexpected subjects element\n";
|
||
|
}
|
||
|
$subjArr=$el->children;
|
||
|
break;
|
||
|
case"folder":
|
||
|
if($tree !== FALSE){
|
||
|
echo"ERROR: unexpected folder element\n";
|
||
|
}
|
||
|
$tree = ls_restore_processObject($el);
|
||
|
break;
|
||
|
default:
|
||
|
echo"ERROR: unknown element name {$el->name}\n";
|
||
|
exit;
|
||
|
}
|
||
|
# echo "{$el->name}\n";
|
||
|
}
|
||
|
|
||
|
/* ---------------------------------------------- processing subjects element */
|
||
|
$subjects = array();
|
||
|
$groups = array();
|
||
|
foreach($subjArr as $i=>$el){
|
||
|
switch($el->name){
|
||
|
case"group":
|
||
|
$grname = $el->attrs['name']->val;
|
||
|
$groups[$grname] = $el->children;
|
||
|
$subjects[$grname] = array(
|
||
|
'type' => 'group',
|
||
|
);
|
||
|
break;
|
||
|
case"user":
|
||
|
$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),
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* -------------------------------------------------------- processing groups */
|
||
|
foreach($groups as $grname=>$group){
|
||
|
foreach($group as $i=>$el){
|
||
|
switch($el->name){
|
||
|
case"member":
|
||
|
$groups[$grname][$i] = $el->attrs['name']->val;
|
||
|
break;
|
||
|
case"preferences":
|
||
|
$subjects[$grname]['prefs'] = $el->children;
|
||
|
unset($groups[$grname][$i]);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#var_dump($xmlTree);
|
||
|
#var_dump($subjArr);
|
||
|
#var_dump($groups);
|
||
|
#var_dump($subjects);
|
||
|
#var_dump($tree);
|
||
|
|
||
|
#exit;
|
||
|
|
||
|
/* ================================================================ restoring */
|
||
|
|
||
|
if(VERBOSE) echo " resetting storage ...\n";
|
||
|
$bs->resetStorage(FALSE);
|
||
|
$storId = $bs->storId;
|
||
|
|
||
|
/* ------------------------------------------------------- restoring subjects */
|
||
|
foreach($subjects as $login=>$subj){
|
||
|
$uid0 = $bs->getSubjId($login);
|
||
|
ls_restore_checkErr($uid0);
|
||
|
switch($subj['type']){
|
||
|
case"user":
|
||
|
if($login=='root'){
|
||
|
$r = $bs->passwd($login, NULL, $subj['pass'], TRUE);
|
||
|
ls_restore_checkErr($r, __LINE__);
|
||
|
$uid = $uid0;
|
||
|
}else{
|
||
|
if(!is_null($uid0)){
|
||
|
$r = $bs->removeSubj($login);
|
||
|
ls_restore_checkErr($r, __LINE__);
|
||
|
}
|
||
|
if(VERBOSE) echo " adding user $login ...\n";
|
||
|
$uid = $bs->addSubj($login, $subj['pass'], $subj['realname'], TRUE);
|
||
|
ls_restore_checkErr($uid, __LINE__);
|
||
|
}
|
||
|
break;
|
||
|
case"group":
|
||
|
if(!is_null($uid0)){
|
||
|
$r = $bs->removeSubj($login);
|
||
|
if(PEAR::isError($r)){ $uid = $uid0; break; }
|
||
|
//ls_restore_checkErr($r, __LINE__);
|
||
|
}
|
||
|
if(VERBOSE) echo " adding group $login ...\n";
|
||
|
$uid = $bs->addSubj($login, NULL);
|
||
|
ls_restore_checkErr($uid, __LINE__);
|
||
|
# var_export($uid); echo " ";
|
||
|
break;
|
||
|
}
|
||
|
# echo "$login/$uid :\n";
|
||
|
if(isset($subj['prefs'])){
|
||
|
# var_dump($subj['prefs']); exit;
|
||
|
foreach($subj['prefs'] as $i=>$el){
|
||
|
switch($el->name){
|
||
|
case"pref":
|
||
|
$prefkey = $el->attrs['name']->val;
|
||
|
$prefval = $el->attrs['val']->val;
|
||
|
# echo" PREF($prefkey)=$prefval\n";
|
||
|
$res = $pr->insert($uid, $prefkey, $prefval);
|
||
|
ls_restore_checkErr($res, __LINE__);
|
||
|
break;
|
||
|
default:
|
||
|
var_dump($el);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* --------------------------------------------------------- restoring groups */
|
||
|
#var_dump($groups);
|
||
|
foreach($groups as $grname=>$group){
|
||
|
foreach($group as $i=>$login){
|
||
|
if(VERBOSE) echo " adding subject $login to group $grname ...\n";
|
||
|
$r = $bs->addSubj2Gr($login, $grname);
|
||
|
ls_restore_checkErr($r, __LINE__);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* -------------------------------------------------------- restoring objects */
|
||
|
ls_restore_restoreObject($tree, $storId, FALSE);
|
||
|
|
||
|
?>
|