diff --git a/livesupport/modules/storageAdmin/bin/backup.sh b/livesupport/modules/storageAdmin/bin/backup.sh new file mode 100755 index 000000000..e5f882b04 --- /dev/null +++ b/livesupport/modules/storageAdmin/bin/backup.sh @@ -0,0 +1,118 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the LiveSupport project. +# http://livesupport.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# LiveSupport is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LiveSupport is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LiveSupport; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: tomas $ +# Version : $Revision: 1.1 $ +# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/storageAdmin/bin/backup.sh,v $ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script creates the tar archiv with backup of LS data +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- + +reldir=`dirname $0`/.. +basedir=`cd $reldir/var; pwd` +phpdir=`cd $reldir/var; pwd` +mkdir -p $reldir/tmp +tmpmaindir=`cd $reldir/tmp; pwd` +dbxml="db.xml" +datestr=`date '+%Y%m%d%H%M%S'` +tarfile0="xmls.tar" +tarfile="storage$datestr.tar" + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "This script creates the tgz archiv with backup of LS data."; + echo "parameters:"; + echo ""; + echo " -d, --destination Destination directory [default:$tmpmaindir]."; + echo " -h, --help Print this message and exit."; + echo ""; +} + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o hd: -l help,destinantion: -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -h|--help) + printUsage; + exit 0;; + -d|--destinantion) + destdir=$2 + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$destdir" == "x" ]; then + destdir=$tmpmaindir +fi +destdir=`cd $destdir; pwd` + +#------------------------------------------------------------------------------- +# Do backup +#------------------------------------------------------------------------------- + +tmpdir=`mktemp -dp $tmpmaindir` + +echo "Backuping to $destdir/$tarfile :" +echo "Dumping database ..." +cd $phpdir +php -q backup.php > $tmpdir/$dbxml +echo "Packaging stored files ..." +cd $phpdir +storpath=`php -q getStorPath.php` +cd $storpath/.. +find stor -name "*.xml" -print | tar cf $tmpdir/$tarfile0 -T - +find stor ! -name "*.xml" -a -type f -print | tar cf $tmpdir/$tarfile -T - +cd $tmpdir +tar rf $tarfile0 $dbxml --remove-files +echo "Compressing XML part ..." +bzip2 $tarfile0 +tar rf $tarfile $tarfile0.bz2 --remove-files +mv $tarfile "$destdir" +rm -rf $tmpdir + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "done" diff --git a/livesupport/modules/storageAdmin/bin/restore.sh b/livesupport/modules/storageAdmin/bin/restore.sh new file mode 100755 index 000000000..0d91c32e3 --- /dev/null +++ b/livesupport/modules/storageAdmin/bin/restore.sh @@ -0,0 +1,115 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (c) 2004 Media Development Loan Fund +# +# This file is part of the LiveSupport project. +# http://livesupport.campware.org/ +# To report bugs, send an e-mail to bugs@campware.org +# +# LiveSupport is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LiveSupport is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LiveSupport; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Author : $Author: tomas $ +# Version : $Revision: 1.1 $ +# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/storageAdmin/bin/restore.sh,v $ +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +# This script restores LS data previously backuped by backup.sh +# +# To get usage help, try the -h option +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- +# Determine directories, files +#------------------------------------------------------------------------------- + +reldir=`dirname $0`/.. +basedir=`cd $reldir/var; pwd` +phpdir=`cd $reldir/var; pwd` +mkdir -p $reldir/tmp +tmpmaindir=`cd $reldir/tmp; pwd` +dbxml="db.xml" +#datestr=`date '+%Y%m%d%H%M%S'` +tarfile0="xmls.tar" +#tarfile="storage$datestr.tar" + +#------------------------------------------------------------------------------- +# Print the usage information for this script. +#------------------------------------------------------------------------------- +printUsage() +{ + echo "This script restores LS data previously backuped by backup.sh."; + echo "parameters:"; + echo ""; + echo " -f, --file File with backuped data, required."; + echo " -h, --help Print this message and exit."; + echo ""; +} + +#------------------------------------------------------------------------------- +# Process command line parameters +#------------------------------------------------------------------------------- +CMD=${0##*/} + +opts=$(getopt -o hf: -l help,file -n $CMD -- "$@") || exit 1 +eval set -- "$opts" +while true; do + case "$1" in + -h|--help) + printUsage; + exit 0;; + -f|--file) + tarfile=$2 + shift; shift;; + --) + shift; + break;; + *) + echo "Unrecognized option $1."; + printUsage; + exit 1; + esac +done + +if [ "x$tarfile" == "x" ]; then + echo "Required parameter file not specified."; + printUsage; + exit 1; +fi + +tfdir=`dirname $tarfile` +tfdir=`cd $tfdir; pwd` +tfbname=`basename $tarfile` +tarfile="$tfdir/$tfbname" + +#------------------------------------------------------------------------------- +# Do restore +#------------------------------------------------------------------------------- + +tmpdir=`mktemp -dp $tmpmaindir` + +echo "Restoring database from $tarfile ..." +cd $tmpdir +tar xf $tarfile +tar xjf $tarfile0.bz2 +rm -f $tarfile0.bz2 +cd $phpdir +php -q restore.php $tmpdir/$dbxml $tmpdir +rm -rf $tmpdir + +#------------------------------------------------------------------------------- +# Say goodbye +#------------------------------------------------------------------------------- +echo "done" diff --git a/livesupport/modules/storageAdmin/var/backup.php b/livesupport/modules/storageAdmin/var/backup.php new file mode 100644 index 000000000..e0c99b0d3 --- /dev/null +++ b/livesupport/modules/storageAdmin/var/backup.php @@ -0,0 +1,184 @@ +setFetchMode(DB_FETCHMODE_ASSOC); +$bs = &new BasicStor($dbc, $config); + +$stid = $bs->storId; +#var_dump($stid); exit; +#$farr = $bs->bsListFolder($stid); var_dump($farr); exit; + +function admDumpFolder(&$bs, $fid, $ind=''){ + $name = $bs->getObjName($fid); + if(PEAR::isError($name)){ echo $name->getMessage(); exit; } + $type = $bs->getObjType($fid); + if(PEAR::isError($type)){ echo $type->getMessage(); exit; } + $gunid = $bs->_gunidFromId($fid); + if(PEAR::isError($gunid)){ echo $gunid->getMessage(); exit; } + $pars = array(); + if($gunid){ $pars['id']="$gunid"; } + $pars['name']="$name"; + switch($type){ + case"Folder": + $farr = $bs->bsListFolder($fid); + if(PEAR::isError($farr)){ echo $farr->getMessage(); exit; } + $res = ''; + foreach($farr as $i =>$folder){ + $fid2 = $folder['id']; + $res .= admDumpFolder($bs, $fid2, "$ind "); + } + if(!$res){ + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'folder', + 'attributes'=> $pars, + )); + }else{ + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'folder', + 'attributes'=> $pars, + 'content' => $res, + ), FALSE); + } + break; + case"audioclip": + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'audioClip', + 'attributes'=> $pars, + )); + break; + case"webstream": + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'webstream', + 'attributes'=> $pars, + )); + break; + case"playlist": + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'playlist', + 'attributes'=> $pars, + )); + break; + default: + return ""; + } + +} +function admDumpGroup(&$bs, $gid, $ind=''){ + $name = $bs->getSubjName($gid); + if(PEAR::isError($name)){ echo $name->getMessage(); exit; } + $isGr = $bs->isGroup($gid); + if(PEAR::isError($isGr)){ echo $isGr->getMessage(); exit; } + $pars = array('name'=>"$name"); + if(!$isGr){ + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'member', + 'attributes'=> $pars, + )); + } + $garr = $bs->listGroup($gid); + if(PEAR::isError($farr)){ echo $farr->getMessage(); exit; } + $res = ''; + foreach($garr as $i =>$member){ + $fid2 = $member['id']; + $res .= admDumpGroup($bs, $fid2, "$ind "); + } + if(!$res){ + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'group', + 'attributes'=> $pars, + )); + }else{ + return XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'group', + 'attributes'=> $pars, + 'content' => $res, + ), FALSE); + } + +} +function admDumpSubjects(&$bs, $ind=''){ + $res =''; + $subjs = $bs->getSubjects('id, login, pass, type'); + foreach($subjs as $i =>$member){ + switch($member['type']){ + case"U": + $pars = array('login'=>"{$member['login']}", 'pass'=>"{$member['pass']}"); + $res .= XML_Util::createTagFromArray(array( + #'namespace' => 'ls', + 'localPart' => 'user', + 'attributes'=> $pars, + )); + break; + case"G": + $res .= admDumpGroup($bs, $member['id'], "$ind "); + break; + } + } + return "$ind\n$res$ind\n"; +} + +$subjects = admDumpSubjects($bs, ' '); +$tree = admDumpFolder($bs, $stid, ' '); + +$res = XML_Util::getXMLDeclaration("1.0", "UTF-8")."\n"; +$node = XML_Util::createTagFromArray(array( + 'namespace' => NSPACE, + 'localPart' => 'storageServer', + 'content' => "$subjects$tree", +), FALSE); +$res .= $node; + +$fmt = new XML_Beautifier(); +$res = $fmt->formatString($res); + +#var_export($res); +#var_dump($res); +echo "$res"; + +?> \ No newline at end of file diff --git a/livesupport/modules/storageAdmin/var/getStorPath.php b/livesupport/modules/storageAdmin/var/getStorPath.php new file mode 100644 index 000000000..39128b5ab --- /dev/null +++ b/livesupport/modules/storageAdmin/var/getStorPath.php @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/livesupport/modules/storageAdmin/var/restore.php b/livesupport/modules/storageAdmin/var/restore.php new file mode 100644 index 000000000..cdd2467e0 --- /dev/null +++ b/livesupport/modules/storageAdmin/var/restore.php @@ -0,0 +1,226 @@ + $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){ + $r = $bs->bsCreateFolder($parid, $obj['name']); + ls_restore_checkErr($r, __LINE__); + }else $r=$parid; + if(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']; + $gunid3 = substr($gunid, 0, 3); + $mediaFile = "$tmpdir/stor/$gunid3/$gunid"; + if(!file_exists($mediaFile)) $mediaFile = NULL; + $mdataFile = "$tmpdir/stor/$gunid3/$gunid.xml"; + if(!file_exists($mdataFile)) $mdataFile = NULL; + if($reallyInsert){ + $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); + +$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": + $groups[$el->attrs['name']->val] = $el->children; + $subjects[$el->attrs['name']->val] = array( + 'type' => 'group', + ); + break; + case"user": + $subjects[$el->attrs['login']->val] = array( + 'type' => 'user', + 'pass' => $el->attrs['pass']->val, +# 'realname' => $el->attrs['realname']->val, + 'realname' => '', + ); + break; + } +} + +/* -------------------------------------------------------- processing groups */ +foreach($groups as $grname=>$group){ + foreach($group as $i=>$el){ + $groups[$grname][$i] = $el->attrs['name']->val; + } +} + +#var_dump($xmlTree); +#var_dump($subjArr); +#var_dump($groups); +#var_dump($subjects); +#var_dump($tree); + +#exit; + +/* ================================================================ restoring */ + +$bs->resetStorage(FALSE); +$storId = $bs->storId; + +/* ------------------------------------------------------- restoring subjects */ +foreach($subjects as $login=>$subj){ + $uid = $bs->getSubjId($login); + ls_restore_checkErr($uid); + switch($subj['type']){ + case"user": + if($login=='root'){ + $r = $bs->passwd($login, NULL, $subj['pass'], TRUE); + ls_restore_checkErr($r, __LINE__); + }else{ + if(!is_null($uid)){ + $r = $bs->removeSubj($login); + ls_restore_checkErr($r, __LINE__); + } + $bs->addSubj($login, $subj['pass'], $subj['realname'], TRUE); + ls_restore_checkErr($r, __LINE__); + } + break; + case"group": + if(!is_null($uid)){ + $r = $bs->removeSubj($login); + if(PEAR::isError($r)) break; + //ls_restore_checkErr($r, __LINE__); + } + $r = $bs->addSubj($login, NULL); + ls_restore_checkErr($r, __LINE__); + break; + } +} + +/* --------------------------------------------------------- restoring groups */ +foreach($groups as $grname=>$group){ + foreach($group as $i=>$login){ + $r = $bs->addSubj2Gr($login, $grname); + ls_restore_checkErr($r, __LINE__); + } +} + +/* -------------------------------------------------------- restoring objects */ +ls_restore_restoreObject($tree, $storId, FALSE); + +?> \ No newline at end of file