Merged the archive server into the storage server. Still might need an upgrade script to do the transfer of files.

This commit is contained in:
paul 2007-03-01 16:10:20 +00:00
parent 5389324558
commit 4c6b2cd4d3
11 changed files with 745 additions and 123 deletions

View File

@ -126,7 +126,7 @@ EVENT_SCHEDULER_DIR = ${MODULES_DIR}/eventScheduler
SCHEDULER_CLIENT_DIR = ${MODULES_DIR}/schedulerClient
WIDGETS_DIR = ${MODULES_DIR}/widgets
ALIB_DIR = ${MODULES_DIR}/alib
ARCHIVE_SERVER_DIR = ${MODULES_DIR}/archiveServer
#ARCHIVE_SERVER_DIR = ${MODULES_DIR}/archiveServer
GETID3_DIR = ${MODULES_DIR}/getid3
HTML_UI_DIR = ${MODULES_DIR}/htmlUI
STORAGE_ADMIN_DIR = ${MODULES_DIR}/storageAdmin
@ -247,15 +247,15 @@ modules_setup: ${TMP_DIR}/modules_setup.stamp
${TMP_DIR}/modules_setup.stamp:
cd ${ALIB_DIR} && ./configure --prefix=${prefix} \
PACKAGE_VERSION=${PACKAGE_VERSION}
cd ${ARCHIVE_SERVER_DIR} && \
./configure --prefix=${prefix} \
--with-hostname=${HOSTNAME} \
--with-www-port=${WWW_PORT} \
--with-database-server=${DB_SERVER} \
--with-database=${DATABASE} \
--with-database-user=${DB_USER} \
--with-database-password=${DB_PASSWORD} \
PACKAGE_VERSION=${PACKAGE_VERSION}
# cd ${ARCHIVE_SERVER_DIR} && \
# ./configure --prefix=${prefix} \
# --with-hostname=${HOSTNAME} \
# --with-www-port=${WWW_PORT} \
# --with-database-server=${DB_SERVER} \
# --with-database=${DATABASE} \
# --with-database-user=${DB_USER} \
# --with-database-password=${DB_PASSWORD} \
# PACKAGE_VERSION=${PACKAGE_VERSION}
cd ${GETID3_DIR} && ./configure --prefix=${prefix} \
PACKAGE_VERSION=${PACKAGE_VERSION}
cd ${HTML_UI_DIR} && ./configure --prefix=${prefix} \
@ -371,7 +371,7 @@ depclean:
${MAKE} -C ${WIDGETS_DIR} depclean
${MAKE} -C ${SCHEDULER_DIR} depclean
${MAKE} -C ${GLIVESUPPORT_DIR} depclean
-${MAKE} -C ${ARCHIVE_SERVER_DIR} depclean
# -${MAKE} -C ${ARCHIVE_SERVER_DIR} depclean
-${MAKE} -C ${STORAGE_SERVER_DIR} depclean
compile: ${TMP_DIR}/compile.stamp
@ -449,7 +449,7 @@ setup_install_dirs:
install_modules:
${MAKE} -C ${ALIB_DIR} install
${MAKE} -C ${ARCHIVE_SERVER_DIR} install
# ${MAKE} -C ${ARCHIVE_SERVER_DIR} install
${MAKE} -C ${GETID3_DIR} install
${MAKE} -C ${HTML_UI_DIR} install
${MAKE} -C ${STORAGE_ADMIN_DIR} install
@ -467,5 +467,5 @@ install_modules:
install_products:
${MAKE} -C ${SCHEDULER_DIR} install
${MAKE} -C ${GLIVESUPPORT_DIR} install

View File

@ -132,25 +132,25 @@ REPLACE_SED_STRING="s/ls_lib_dir/${USR_LIB_DIR_S}/; \
all:
doc:
${DOXYGEN} ${DOXYGEN_CONFIG}
# ${DOXYGEN} ${DOXYGEN_CONFIG}
clean: db_clean
${RMDIR} ${STOR_DIR}
${RMDIR} ${ACCESS_DIR}
${RMDIR} ${TRANS_DIR}
# ${RMDIR} ${STOR_DIR}
# ${RMDIR} ${ACCESS_DIR}
# ${RMDIR} ${TRANS_DIR}
docclean:
${RMDIR} ${DOXYGEN_DIR}/html
# ${RMDIR} ${DOXYGEN_DIR}/html
depclean: clean
dist:
${TAR_C} ${MODULE_NAME}${DATE}${DIST_EXT} *
# ${TAR_C} ${MODULE_NAME}${DATE}${DIST_EXT} *
distclean: clean docclean
testonly: ${TEST_RUNNER}
${TEST_RUNNER}
# ${TEST_RUNNER}
check: all
#testonly
@ -158,39 +158,39 @@ check: all
recheck: clean check
install:
${MKDIR} ${DEST_DIR}
${MKDIR} ${DEST_DIR}/access
${MKDIR} ${DEST_DIR}/install
${MKDIR} ${DEST_DIR}/stor
${MKDIR} ${DEST_DIR}/stor/buffer
${MKDIR} ${DEST_DIR}/trans
${MKDIR} ${DEST_DIR}/xmlrpc
${CP} ${VAR_DIR}/*.{php,template} ${DEST_DIR}
${CP} ${VAR_DIR}/install/*.php ${DEST_DIR}/install
${CP} ${VAR_DIR}/xmlrpc/*.php ${DEST_DIR}/xmlrpc
${CAT} ${VAR_DIR}/conf.php.template | ${SED} -e ${REPLACE_SED_STRING} \
> ${DEST_DIR}/conf.php
# ${MKDIR} ${DEST_DIR}
# ${MKDIR} ${DEST_DIR}/access
# ${MKDIR} ${DEST_DIR}/install
# ${MKDIR} ${DEST_DIR}/stor
# ${MKDIR} ${DEST_DIR}/stor/buffer
# ${MKDIR} ${DEST_DIR}/trans
# ${MKDIR} ${DEST_DIR}/xmlrpc
# ${CP} ${VAR_DIR}/*.{php,template} ${DEST_DIR}
# ${CP} ${VAR_DIR}/install/*.php ${DEST_DIR}/install
# ${CP} ${VAR_DIR}/xmlrpc/*.php ${DEST_DIR}/xmlrpc
# ${CAT} ${VAR_DIR}/conf.php.template | ${SED} -e ${REPLACE_SED_STRING} \
# > ${DEST_DIR}/conf.php
#-------------------------------------------------------------------------------
# Specific targets
#-------------------------------------------------------------------------------
storage: dir_setup db_init
dir_setup: ${DOXYGEN_DIR}
bin/setupDirs.sh ${STOR_DIR} ${ACCESS_DIR} ${TRANS_DIR} ${BUFF_DIR}
# bin/setupDirs.sh ${STOR_DIR} ${ACCESS_DIR} ${TRANS_DIR} ${BUFF_DIR}
db_init:
-cd var/install && php -q install.php
# -cd var/install && php -q install.php
db_clean:
-cd var/install && php -q uninstall.php
# -cd var/install && php -q uninstall.php
${TMP_DIR}:
${MKDIR} ${TMP_DIR}
# ${MKDIR} ${TMP_DIR}
${DOXYGEN_DIR}:
${MKDIR} ${DOXYGEN_DIR}
# ${MKDIR} ${DOXYGEN_DIR}
${TEST_RUNNER}:

View File

@ -1406,5 +1406,384 @@ class LocStor extends BasicStor {
return CAMPCASTER_VERSION;
}
/**
* Open upload transport (from station to hub)
*
* @param string $sessid
* session id
* @param string $chsum
* checksum
* @return array
* hasharray with:
* url string: writable URL
* token string: PUT token
*/
function uploadOpen($sessid, $chsum)
{
$owner = Alib::GetSessUserId($sessid);
if (PEAR::isError($owner)) {
return $owner;
}
$res = $this->bsOpenPut($chsum, NULL, $owner);
if (PEAR::isError($res)) {
return $res;
}
return array('url'=>$res['url'], 'token'=>$res['token']);
}
/**
* Close upload transport
*
* @param string $token
* transport token
* @param string $trtype
* transport type
* @param array $pars
* transport parameters
* @return mixed
*/
function uploadClose($token, $trtype, $pars=array())
{
$res = $this->bsClosePut($token);
if (PEAR::isError($res)) {
return $res;
}
extract($res); // fname, owner
switch ($trtype) {
case "audioclip":
$mdtoken = $pars['mdpdtoken'];
$res = $this->bsClosePut($mdtoken);
if (PEAR::isError($res)) {
return $res;
}
$mdfname = $res['fname'];
if ($gunid == '') {
$gunid = NULL;
}
$parid = $this->_getHomeDirId($owner);
if (PEAR::isError($parid)) {
return $parid;
}
$values = array(
"filename" => $pars['name'],
"filepath" => $fname,
"metadata" => $mdfname,
"gunid" => $pars['gunid'],
"filetype" => "audioclip"
);
$storedFile = $this->bsPutFile($parid, $values);
if (PEAR::isError($storedFile)) {
return $storedFile;
}
$res = $storedFile->getId();
@unlink($fname);
@unlink($mdfname);
break;
case "playlist":
if ($gunid == '') {
$gunid = NULL;
}
$parid = $this->_getHomeDirId($owner);
if (PEAR::isError($parid)) {
return $parid;
}
$values = array(
"filename" => $pars['name'],
"metadata" => $fname,
"gunid" => $pars['gunid'],
"filetype" => "playlist"
);
$storedFile = $this->bsPutFile($parid, $values);
if (PEAR::isError($storedFile)) {
return $storedFile;
}
$res = $storedFile->getId();
@unlink($fname);
break;
case "playlistPkg":
$chsum = md5_file($fname);
// importPlaylistOpen:
$res = $this->bsOpenPut($chsum, NULL, $owner);
if (PEAR::isError($res)) {
return $res;
}
$dest = $res['fname'];
$token = $res['token'];
copy($fname, $dest);
$r = $this->importPlaylistClose($token);
if (PEAR::isError($r)) {
return $r;
}
@unlink($fname);
return $r;
break;
case "searchjob":
$crits = file_get_contents($fname);
$criteria = unserialize($crits);
@unlink($fname);
$results = $this->localSearch($criteria);
if (PEAR::isError($results)) {
return $results;
}
$realfile = tempnam($this->accessDir, 'searchjob_');
@chmod($realfile, 0660);
$len = file_put_contents($realfile, serialize($results));
$acc = BasicStor::bsAccess($realfile, '', NULL, 'download');
if (PEAR::isError($acc)) {
return $acc;
}
$url = BasicStor::GetUrlPart()."access/".basename($acc['fname']);
$chsum = md5_file($realfile);
$size = filesize($realfile);
$res = array(
'url'=>$url, 'token'=>$acc['token'],
'chsum'=>$chsum, 'size'=>$size,
'filename'=>$filename
);
return $res;
break;
case "metadata":
break;
default:
}
return $res;
}
/**
* Open download transport
*
* @param string $sessid
* session id
* @param string $trtype
* transport type
* @param array $pars
* transport parameters
* @return hasharray with:
* url string: writable URL
* token string: PUT token
*/
function downloadOpen($sessid, $trtype, $pars=array())
{
global $CC_CONFIG;
switch ($trtype) {
case "unknown":
case "audioclip":
case "metadata":
case "playlist":
case "playlistPkg":
if (!isset($pars['gunid'])) {
return PEAR::raiseError("Archive::downloadOpen: gunid not set");
}
break;
}
$gunid = $pars['gunid'];
// resolve trtype by object type:
if ( ($trtype == 'unknown') || ($trtype == 'playlistPkg') ) {
$trtype2 = BasicStor::GetType($gunid);
if (PEAR::isError($trtype2)) {
return $trtype2;
}
// required with content:
$trtype = ( ($trtype2 == 'playlist') && ($trtype == 'playlistPkg') ?
'playlistPkg' : $trtype2);
//return PEAR::raiseError("Archive::downloadOpen: TT=$trtype TT2=$trtype2 G=$gunid");
}
switch ($trtype) {
case "audioclip":
$res = $this->downloadRawAudioDataOpen($sessid, $gunid);
break;
case "metadata":
$res = $this->downloadMetadataOpen($sessid, $gunid);
break;
case "playlist":
$res = $this->accessPlaylist($sessid, $gunid);
break;
case "playlistPkg":
$res = $this->bsExportPlaylistOpen($gunid);
if (PEAR::isError($res)) {
return $res;
}
$tmpn = tempnam($CC_CONFIG['transDir'], 'plExport_');
$plfpath = "$tmpn.lspl";
copy($res['fname'], $plfpath);
$res = $this->bsExportPlaylistClose($res['token']);
if (PEAR::isError($res)) {
return $res;
}
$fname = "transported_playlist.lspl";
$id = BasicStor::IdFromGunid($gunid);
$acc = BasicStor::bsAccess($plfpath, 'lspl', NULL, 'download');
if (PEAR::isError($acc)) {
return $acc;
}
$url = BasicStor::GetUrlPart()."access/".basename($acc['fname']);
$chsum = md5_file($plfpath);
$size = filesize($plfpath);
$res = array(
'url'=>$url, 'token'=>$acc['token'],
'chsum'=>$chsum, 'size'=>$size,
'filename'=>$fname
);
break;
case "searchjob":
$res = $pars;
break;
case "file":
$res = array();
break;
default:
return PEAR::raiseError("Archive::downloadOpen: NotImpl ($trtype)");
}
if (PEAR::isError($res)) {
return $res;
}
switch ($trtype) {
case "audioclip":
case "metadata":
case "playlist":
case "playlistPkg":
$title = $this->bsGetTitle(NULL, $gunid);
break;
case "searchjob":
$title = 'searchjob';
break;
case "file":
$title = 'regular file';
break;
default:
}
$res['title'] = $title;
$res['trtype'] = $trtype;
return $res;
}
/**
* Close download transport
*
* @param string $token
* transport token
* @param string $trtype
* transport type
* @return array
* hasharray with:
* url string: writable URL
* token string: PUT token
*/
function downloadClose($token, $trtype)
{
switch ($trtype) {
case "audioclip":
$res = $this->downloadRawAudioDataClose($token);
if (PEAR::isError($res)) {
return $res;
}
return $res;
case "metadata":
$res = $this->downloadMetadataClose($token);
return $res;
case "playlist":
$res = $this->releasePlaylist(NULL/*$sessid*/, $token);
return $res;
case "playlistPkg":
$res = BasicStor::bsRelease($token, 'download');
if (PEAR::isError($res)) {
return $res;
}
$realFname = $r['realFname'];
@unlink($realFname);
if (preg_match("|(plExport_[^\.]+)\.lspl$|", $realFname, $va)) {
list(,$tmpn) = $va;
$tmpn = $CC_CONFIG['transDir']."/$tmpn";
if (file_exists($tmpn)) {
@unlink($tmpn);
}
}
return $res;
case "searchjob":
$res = BasicStor::bsRelease($token, 'download');
return $res;
case "file":
return array();
default:
return PEAR::raiseError("Archive::downloadClose: NotImpl ($trtype)");
}
}
/**
* Prepare hub initiated transport
*
* @param string $target
* hostname of transport target
* @param string $trtype
* transport type
* @param string $direction
* 'up' | 'down'
* @param array $pars
* transport parameters
* @return mixed
*/
function prepareHubInitiatedTransfer(
$target, $trtype='file', $direction='up',$pars=array())
{
$tr = new Transport($this);
$trec = TransportRecord::create($tr, $trtype, $direction,
array_merge($pars, array('target'=>$target)));
if (PEAR::isError($trec)) {
return $trec;
}
return TRUE;
}
/**
* List hub initiated transports
*
* @param string $target
* hostname of transport target
* @param string $direction
* 'up' | 'down'
* @param string $trtok
* transport token
* @return mixed
*/
function listHubInitiatedTransfers(
$target=NULL, $direction=NULL, $trtok=NULL)
{
$tr = new Transport($this);
$res = $tr->getTransports($direction, $target, $trtok);
return $res;
}
/**
* Set state of hub initiated transport
*
* @param string $target
* hostname of transport target
* @param string $trtok
* transport token
* @param string $state
* transport state
* @return TransportRecord|PEAR_Error
*/
function setHubInitiatedTransfer($target, $trtok, $state)
{
$tr = new Transport($this);
$trec = TransportRecord::recall($tr, $trtok);
if (PEAR::isError($trec)) {
return $trec;
}
$r = $trec->setState($state);
if (PEAR::isError($r)) {
return $r;
}
return $trec;
}
} // class LocStor
?>

View File

@ -491,7 +491,7 @@ class Transport
$res = file_get_contents($row['localfile']);
$results = unserialize($res);
if ($andClose) {
$ret = $this->xmlrpcCall('archive.downloadClose',
$ret = $this->xmlrpcCall('locstor.downloadClose',
array(
'token' => $row['pdtoken'] ,
'trtype' => $row['trtype'] ,
@ -590,7 +590,7 @@ class Transport
*/
function getHubInitiatedTransfers()
{
$ret = $this->xmlrpcCall('archive.listHubInitiatedTransfers',
$ret = $this->xmlrpcCall('locstor.listHubInitiatedTransfers',
array('target' => HOSTNAME));
if (PEAR::isError($ret)) {
return $ret;
@ -616,7 +616,7 @@ class Transport
*/
function startHubInitiatedTransfer($uid, $rtrtok)
{
$ret = $this->xmlrpcCall('archive.listHubInitiatedTransfers',
$ret = $this->xmlrpcCall('locstor.listHubInitiatedTransfers',
array(
'target' => HOSTNAME,
'trtok' => $rtrtok,
@ -690,7 +690,7 @@ class Transport
"Transport::startHubInitiatedTransfer: ???"
);
}
$ret = $this->xmlrpcCall('archive.setHubInitiatedTransfer',
$ret = $this->xmlrpcCall('locstor.setHubInitiatedTransfer',
array(
'target' => HOSTNAME,
'trtok' => $rtrtok,
@ -716,7 +716,7 @@ class Transport
function loginToArchive()
{
global $CC_CONFIG;
$res = $this->xmlrpcCall('archive.login',
$res = $this->xmlrpcCall('locstor.login',
array(
'login' => $CC_CONFIG['archiveAccountLogin'],
'pass' => $CC_CONFIG['archiveAccountPass']
@ -738,7 +738,7 @@ class Transport
*/
function logoutFromArchive($sessid)
{
$res = $this->xmlrpcCall('archive.logout',
$res = $this->xmlrpcCall('locstor.logout',
array('sessid'=>$sessid));
return $res;
}
@ -962,7 +962,7 @@ class Transport
if (PEAR::isError($trec)) {
return $trec;
}
$ret = $this->xmlrpcCall('archive.uploadOpen',
$ret = $this->xmlrpcCall('locstor.uploadOpen',
array(
'sessid' => $asessid ,
'chsum' => $row['expectedsum'],
@ -997,7 +997,7 @@ class Transport
if (PEAR::isError($trec)) {
return $trec;
}
$ret = $this->xmlrpcCall('archive.downloadOpen',
$ret = $this->xmlrpcCall('locstor.downloadOpen',
array(
'sessid'=> $asessid,
'trtype'=> $row['trtype'],
@ -1137,7 +1137,7 @@ class Transport
}
} else {
// wrong md5 at finish - TODO: start again
// $this->xmlrpcCall('archive.uploadReset', array());
// $this->xmlrpcCall('locstor.uploadReset', array());
$trec->fail('file uploaded with bad md5');
return PEAR::raiseError("Transport::cronUploadWaiting:".
" file uploaded with bad md5 ".
@ -1282,7 +1282,7 @@ class Transport
} else {
$mdpdtoken = NULL;
}
$ret = $this->xmlrpcCall('archive.uploadClose',
$ret = $this->xmlrpcCall('locstor.uploadClose',
array(
'token' => $row['pdtoken'] ,
'trtype' => $row['trtype'],
@ -1402,7 +1402,7 @@ class Transport
return $storedFile;
}
$res = $storedFile->getId();
$ret = $this->xmlrpcCall('archive.downloadClose',
$ret = $this->xmlrpcCall('locstor.downloadClose',
array(
'token' => $mdtrec->row['pdtoken'] ,
'trtype' => 'metadata' ,
@ -1436,7 +1436,7 @@ class Transport
return TRUE; // don't close - getSearchResults should close it
break;
}
$ret = $this->xmlrpcCall('archive.downloadClose',
$ret = $this->xmlrpcCall('locstor.downloadClose',
array(
'token' => $row['pdtoken'] ,
'trtype' => $row['trtype'] ,
@ -1485,7 +1485,7 @@ class Transport
return PEAR::raiseError("DEBUG: NotImpl ".var_export($row,TRUE));
}
if (!is_null($rtrtok = $trec->row['rtrtok'])) {
$ret = $this->xmlrpcCall('archive.setHubInitiatedTransfer',
$ret = $this->xmlrpcCall('locstor.setHubInitiatedTransfer',
array(
'target' => HOSTNAME,
'trtok' => $rtrtok,
@ -1616,7 +1616,7 @@ class Transport
*/
function uploadCheck($pdtoken)
{
$ret = $this->xmlrpcCall('archive.uploadCheck',
$ret = $this->xmlrpcCall('locstor.uploadCheck',
array('token'=>$pdtoken));
return $ret;
}
@ -1630,7 +1630,7 @@ class Transport
*/
function pingToArchive()
{
$res = $this->xmlrpcCall('archive.ping',
$res = $this->xmlrpcCall('locstor.ping',
array('par'=>'ping_'.date('H:i:s')));
return $res;
}

View File

@ -70,7 +70,7 @@ class TransportRecord
* default parameters (optional, internal use)
* @return TransportRecord
*/
function create(&$tr, $trtype, $direction='up', $defaults=array())
public static function create(&$tr, $trtype, $direction='up', $defaults=array())
{
global $CC_DBC, $CC_CONFIG;
$trec = new TransportRecord($tr);

View File

@ -69,8 +69,8 @@ $CC_CONFIG = array(
'storageUrlPort' => 80,
/* ================================================ archive configuration */
'archiveUrlPath' => '/campcasterArchiveServer',
'archiveXMLRPC' => 'xmlrpc/xrArchive.php',
'archiveUrlPath' => '/campcasterStorageServer',
'archiveXMLRPC' => 'xmlrpc/xrLocStor.php',
'archiveUrlHost' => 'localhost',
'archiveUrlPort' => 80,
'archiveAccountLogin' => 'root',

View File

@ -70,8 +70,8 @@ $CC_CONFIG = array(
'storageUrlPort' => ls_php_port,
/* ================================================ archive configuration */
'archiveUrlPath' => 'ls_archiveUrlPath',
'archiveXMLRPC' => 'xmlrpc/xrArchive.php',
'archiveUrlPath' => 'ls_storageUrlPath',
'archiveXMLRPC' => 'xmlrpc/xrLocStor.php',
'archiveUrlHost' => 'ls_php_host',
'archiveUrlPort' => ls_php_port,
'archiveAccountLogin' => 'root',

View File

@ -43,8 +43,8 @@ $CC_CONFIG = array(
'storageUrlPort' => ls_php_port,
/* ================================================ archive configuration */
'archiveUrlPath' => 'ls_archiveUrlPath',
'archiveXMLRPC' => 'xmlrpc/xrArchive.php',
'archiveUrlPath' => 'ls_storageUrlPath',
'archiveXMLRPC' => 'xmlrpc/xrLocStor.php',
'archiveUrlHost' => 'ls_php_host',
'archiveUrlPort' => ls_php_port,
'archiveAccountLogin' => 'root',

View File

@ -0,0 +1,37 @@
<?php
/**
* @author Paul Baranowski <paul@paulbaranowski.org>
* @version $Revision: 2834 $
* @package Campcaster
* @subpackage StorageServer
* @copyright 2006 MDLF, Inc.
* @license http://www.gnu.org/licenses/gpl.txt
* @link http://www.campware.org
*
*/
// Do not allow remote execution
$arr = array_diff_assoc($_SERVER, $_ENV);
if (isset($arr["DOCUMENT_ROOT"]) && ($arr["DOCUMENT_ROOT"] != "") ) {
header("HTTP/1.1 400");
header("Content-type: text/plain; charset=UTF-8");
echo "400 Not executable\r\n";
exit(1);
}
echo "*********************************************\n";
echo "* StorageServer Upgrade from 1.2.X to 1.3.0 *\n";
echo "*********************************************\n";
require_once(dirname(__FILE__).'/../../conf.php');
require_once(dirname(__FILE__)."/../installInit.php");
campcaster_db_connect();
require_once(dirname(__FILE__)."/../../StoredFile.php");
// Move audio clips from the archive to the local storage
echo "*******************************************\n";
echo "* StorageServer Upgrade to 1.3.0 Complete *\n";
echo "*******************************************\n";
?>

View File

@ -3596,6 +3596,204 @@ class XR_LocStor extends LocStor {
)));
}
/**
* Simple ping method - return strtouppered string
*
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_ping($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = date("Ymd-H:i:s")." Network hub answer: {$r['par']}";
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_uploadOpen($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = $this->uploadOpen($r['sessid'], $r['chsum']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_uploadOpen: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* Check state of file upload
*
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_uploadCheck($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = $this->uploadCheck($r['token']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_uploadCheck: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_uploadClose($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = $this->uploadClose($r['token'], $r['trtype'], $r['pars']);
if (PEAR::isError($res)) {
$code = 803;
// Special case for duplicate file - give back
// different error code so we can display nice user message.
if ($res->getCode() == GBERR_GUNID) {
$code = 888;
}
return new XML_RPC_Response(0, $code,
"xr_uploadClose: ".$res->getMessage().
" ".$res->getUserInfo()
);
}
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_downloadOpen($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = $this->downloadOpen($r['sessid'], $r['trtype'], $r['pars']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_downloadOpen: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_downloadClose($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = $this->downloadClose($r['token'], $r['trtype']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_downloadClose: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_prepareHubInitiatedTransfer($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
foreach (array('trtype'=>NULL, 'direction'=>'up', 'pars'=>array()) as $k => $dv) {
if (!isset($r[$k])) {
$r[$k] = $dv;
}
}
$res = $this->prepareHubInitiatedTransfer(
$r['target'], $r['trtype'], $r['direction'], $r['pars']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_prepareHubInitiatedTransfer: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_listHubInitiatedTransfers($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
foreach (array('target'=>NULL, 'direction'=>NULL, 'trtok'=>NULL) as $k=>$dv) {
if (!isset($r[$k])) {
$r[$k] = $dv;
}
}
$res = $this->listHubInitiatedTransfers(
$r['target'], $r['direction'], $r['trtok']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_listHubInitiatedTransfers: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/**
* @param XML_RPC_Message $input
* @return XML_RPC_Response
*/
function xr_setHubInitiatedTransfer($input)
{
list($ok, $r) = XR_LocStor::xr_getParams($input);
if (!$ok) {
return $r;
}
$res = $this->setHubInitiatedTransfer(
$r['target'], $r['trtok'], $r['state']);
if (PEAR::isError($res))
return new XML_RPC_Response(0, 803,
"xr_setHubInitiatedTransfer: ".$res->getMessage().
" ".$res->getUserInfo()
);
return new XML_RPC_Response(XML_RPC_encode($res));
}
/* ==================================================== "private" methods */
/**
* Check and convert struct of parameters

View File

@ -64,97 +64,105 @@ $CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
$locStor = new XR_LocStor();
$methods = array(
'test' => 'Tests toupper and checks sessid, params: '.
'teststring, sessid.',
'getVersion' => 'Dummy function for connection testing.',
'authenticate' => 'Checks authentication.',
'login' => 'Login to storage.',
'logout' => 'Logout from storage.',
'existsAudioClip' => 'Checks if an Audio clip with the specified '.
'id is stored in local storage.',
'storeAudioClipOpen' => 'Open channel to store a new audio clip '.
'or replace an existing one.',
'storeAudioClipClose' => 'Close channel to store a new audio clip'.
' or replace an existing one.',
'test' => 'Tests toupper and checks sessid, params: teststring, sessid.',
'getVersion' => 'Dummy function for connection testing.',
'authenticate' => 'Checks authentication.',
'login' => 'Login to storage.',
'logout' => 'Logout from storage.',
'existsAudioClip' => 'Checks if an Audio clip with the specified '.
'id is stored in local storage.',
'storeAudioClipOpen' => 'Open channel to store a new audio clip '.
'or replace an existing one.',
'storeAudioClipClose' => 'Close channel to store a new audio clip'.
' or replace an existing one.',
'downloadRawAudioDataOpen'=> 'Create and return downloadable URL'.
'for audio file',
'for audio file',
'downloadRawAudioDataClose'=>'Discard downloadable URL for audio file',
'downloadMetadataOpen' => 'Create and return downloadable URL'.
'for metadata',
'downloadMetadataClose' => 'Discard downloadable URL for metadata',
'openPut' => 'openPut',
'closePut' => 'closePut',
'deleteAudioClip' => 'Delete an existing Audio clip.',
'downloadMetadataOpen' => 'Create and return downloadable URL'.
'for metadata',
'downloadMetadataClose' => 'Discard downloadable URL for metadata',
'openPut' => 'openPut',
'closePut' => 'closePut',
'deleteAudioClip' => 'Delete an existing Audio clip.',
'updateAudioClipMetadata' => 'Update the metadata of an Audio clip '.
'stored in Local storage.',
'searchMetadata' => 'Search through the metadata of stored '.
'searchMetadata' => 'Search through the metadata of stored '.
'files, return all matching clip ids.',
'browseCategory' =>'Return values of specified metadata category.',
'accessRawAudioData' => 'Get access to raw audio data.',
'releaseRawAudioData' => 'Release access to raw audio data.',
'getAudioClip' => 'Return the contents of an Audio clip.',
'resetStorage' => 'Reset storageServer for debugging.',
'storeWebstream' => 'Store audio stream identified by URL',
'browseCategory' =>'Return values of specified metadata category.',
'accessRawAudioData' => 'Get access to raw audio data.',
'releaseRawAudioData' => 'Release access to raw audio data.',
'getAudioClip' => 'Return the contents of an Audio clip.',
'resetStorage' => 'Reset storageServer for debugging.',
'storeWebstream' => 'Store audio stream identified by URL',
'createPlaylist' => 'Create a new Playlist metafile.',
'editPlaylist' => 'Open a Playlist metafile for editing.',
'savePlaylist' => 'Save a Playlist metafile.',
'revertEditedPlaylist' => 'RollBack playlist changes to the locked state.',
'deletePlaylist' => 'Delete a Playlist metafile.',
'accessPlaylist' => 'Open readable URL to a Playlist metafile.',
'releasePlaylist' => 'Release readable URL from accessPlaylist.',
'existsPlaylist' => 'Check whether a Playlist exists.',
'playlistIsAvailable' => 'Check whether a Playlist is available '.
'for editing.',
'exportPlaylistOpen' => 'Create a tarfile with playlist export.',
'exportPlaylistClose' => 'Close playlist export.',
'importPlaylistOpen' => 'Open writable handle for playlist import.',
'importPlaylistClose' => 'Close import-handle and import playlist.',
'createPlaylist' => 'Create a new Playlist metafile.',
'editPlaylist' => 'Open a Playlist metafile for editing.',
'savePlaylist' => 'Save a Playlist metafile.',
'revertEditedPlaylist' => 'RollBack playlist changes to the locked state.',
'deletePlaylist' => 'Delete a Playlist metafile.',
'accessPlaylist' => 'Open readable URL to a Playlist metafile.',
'releasePlaylist' => 'Release readable URL from accessPlaylist.',
'existsPlaylist' => 'Check whether a Playlist exists.',
'playlistIsAvailable' => 'Check whether a Playlist is available '.
'for editing.',
'exportPlaylistOpen' => 'Create a tarfile with playlist export.',
'exportPlaylistClose' => 'Close playlist export.',
'importPlaylistOpen' => 'Open writable handle for playlist import.',
'importPlaylistClose' => 'Close import-handle and import playlist.',
'renderPlaylistToFileOpen' => 'Render playlist to ogg file (open handle)',
'renderPlaylistToFileOpen' => 'Render playlist to ogg file (open handle)',
'renderPlaylistToFileCheck' => 'Render playlist to ogg file (check results)',
'renderPlaylistToFileClose' => 'Render playlist to ogg file (close handle)',
'renderPlaylistToStorageOpen' => 'Render playlist to storage media clip (open handle)',
'renderPlaylistToStorageCheck' => 'Render playlist to storage media clip (check results)',
'renderPlaylistToStorageOpen' => 'Render playlist to storage media clip (open handle)',
'renderPlaylistToStorageCheck' => 'Render playlist to storage media clip (check results)',
'renderPlaylistToRSSOpen' => 'Render playlist to RSS file (open handle)',
'renderPlaylistToRSSCheck' => 'Render playlist to RSS file (check results)',
'renderPlaylistToRSSClose' => 'Render playlist to RSS file (close handle)',
'renderPlaylistToRSSOpen' => 'Render playlist to RSS file (open handle)',
'renderPlaylistToRSSCheck' => 'Render playlist to RSS file (check results)',
'renderPlaylistToRSSClose' => 'Render playlist to RSS file (close handle)',
'createBackupOpen' => 'Create backup of storage (open handle)',
'createBackupOpen' => 'Create backup of storage (open handle)',
'createBackupCheck' => 'Create backup of storage (check results)',
'createBackupClose' => 'Create backup of storage (close handle)',
'restoreBackupOpen' => 'Restore a backup file (open handle)',
'restoreBackupOpen' => 'Restore a backup file (open handle)',
'restoreBackupClosePut' => 'Restore a backup file (close PUT handle)',
'restoreBackupCheck' => 'Restore a backup file (check results)',
'restoreBackupClose' => 'Restore a backup file (close handle)',
'loadPref' => 'Load user preference value.',
'savePref' => 'Save user preference value.',
'delPref' => 'Delete user preference record.',
'loadGroupPref' => 'Read group preference record.',
'saveGroupPref' => 'Delete user preference record.',
'loadPref' => 'Load user preference value.',
'savePref' => 'Save user preference value.',
'delPref' => 'Delete user preference record.',
'loadGroupPref' => 'Read group preference record.',
'saveGroupPref' => 'Delete user preference record.',
'getTransportInfo' => 'Common "check" method and info getter for transports',
'turnOnOffTransports' => 'Turn transports on/off, optionaly return current state',
'doTransportAction' => 'Pause, resume or cancel transport',
'uploadFile2Hub' => 'Open async file transfer from local storageServer to network hub',
'getHubInitiatedTransfers' => 'Get list of prepared transfers initiated by hub',
'getTransportInfo' => 'Common "check" method and info getter for transports',
'turnOnOffTransports' => 'Turn transports on/off, optionaly return current state',
'doTransportAction' => 'Pause, resume or cancel transport',
'uploadFile2Hub' => 'Open async file transfer from local storageServer to network hub',
'getHubInitiatedTransfers' => 'Get list of prepared transfers initiated by hub',
'startHubInitiatedTransfer' => 'Start of download initiated by hub',
'upload2Hub' => 'Start upload of audioclip or playlist from local storageServer to hub',
'downloadFromHub' => 'Start download of audioclip or playlist from hub to local storageServer',
'globalSearch' => 'Start search job on network hub',
'getSearchResults' => 'Get results from search job on network hub',
'upload2Hub' => 'Start upload of audioclip or playlist from local storageServer to hub',
'downloadFromHub' => 'Start download of audioclip or playlist from hub to local storageServer',
'globalSearch' => 'Start search job on network hub',
'getSearchResults' => 'Get results from search job on network hub',
'uploadOpen' => 'Open file-layer upload',
'uploadCheck' => 'Check the checksum of uploaded file',
'uploadClose' => 'Close file-layer upload',
'downloadOpen' => 'Open file-layer download',
// 'downloadCheck' => 'Check the checksum of downloaded file',
'downloadClose' => 'Close file-layer download',
'prepareHubInitiatedTransfer' => 'Prepare hub initiated transfer',
'listHubInitiatedTransfers' => 'List hub initiated transfers',
'setHubInitiatedTransfer' => 'Set state of hub initiated transfers',
'ping' => 'Echo request',
);
$defs = array();
foreach ($methods as $method => $description) {
$defs["locstor.$method"] = array(
"function" => array(&$locStor, "xr_$method"),
# "function" => "\$GLOBALS['locStor']->xr_$method",
"signature" => array(
array($GLOBALS['XML_RPC_Struct'], $GLOBALS['XML_RPC_Struct'])
),