diff options
Diffstat (limited to 'util/dcp')
-rwxr-xr-x | util/dcp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/util/dcp b/util/dcp new file mode 100755 index 000000000..2817ad4f1 --- /dev/null +++ b/util/dcp @@ -0,0 +1,143 @@ +#!/usr/bin/env php +<?php + +// file import to DAV utility + +if(!file_exists('include/cli_startup.php')) { + echo 'Run dcp from the top level Hubzilla web directory, as util/dcp <args>' . PHP_EOL; + exit(1); +} + +require_once('include/cli_startup.php'); +require_once('include/attach.php'); + +cli_startup(); + + +if($argc <= 3) { + echo "Usage: " . $argv[0] . ' src dstdir' . "\n"; + echo 'Always run from the toplevel web directory.' . "\n"; + echo 'destination should begin with store/$nickname/desired/path or $nickname/desired/path' . "\n"; + echo 'Example: util/dcp /etc/motd store/joe/etc' . "\n"; + exit; +} + + $recursive = false; + $dstfile = $argv[$argc - 1]; + + if(strpos($dstfile,'store/') === 0) + $dstfile = substr($dstfile,6); + + $nick = substr($dstfile,0,strpos($dstfile,'/')); + + $dstfile = substr($dstfile,strlen($nick)+1); + + $channel = channelx_by_nick($nick); + if(! $channel) + return; + + for($x = 1; $x < ($argc - 1); $x ++) { + if(($argv[$x] === '-r') || ($argv[$x] === '-R')) { + $recursive = true; + break; + } + } + + + $isadir = false; + + if(($recursive) || ($argc > 3)) + $isadir = true; + + + $r = q("select * from attach where display_path = '%s' and uid = %d limit 1", + dbesc($dstfile), + intval($channel['channel_id']) + ); + + if($r && $r[0]['is_dir']) { + $isadir = true; + $basepath = $dstfile; + $folder = $r[0]['hash']; + } + else { + $pathname = (($isadir) ? $dstfile : dirname($dstfile)); + $arr = [ + 'pathname' => $pathname, + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'], + ]; + + $folder = ''; + if($pathname && $isadir) { + $x = attach_mkdirp($channel,$channel['channel_hash'],$arr); + if($x['success']) + $folder = $x['data']['hash']; + } + } + + for($x = 1; $x < ($argc - 1); $x ++) { + if(($argv[$x] === '-r') || ($argv[$x] === '-R')) { + continue; + } + + if(is_dir($argv[$x])) { + if($recursive) { + dcp_recurse($channel,$argv[$x],$basepath,$folder); + } + else { + continue; + } + } + else { + $dstname = (($isadir) ? '' : basename($dstfile)); + $cmd = [ 'Importfile', $channel['channel_id'], $argv[$x], $folder, $dstname ]; + \Zotlabs\Daemon\Master::Summon($cmd); + } + } + + + function dcp_recurse($channel,$src,$basepath,$folder) { + $dir = opendir($src); + if($dir) { + while(($entry = readdir($dir)) !== false) { + if($entry === '.' || $entry === '..') + continue; + + $dstfile = $basepath . '/' . $entry; + if(is_dir($src . '/' . $entry)) { + $r = q("select * from attach where display_path = '%s' and uid = %d limit 1", + dbesc($dstfile), + intval($channel['channel_id']) + ); + + if($r && $r[0]['is_dir']) { + $folder = $r[0]['hash']; + } + else { + + $arr = [ + 'pathname' => $dstfile, + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'], + ]; + + $folder = ''; + $x = attach_mkdirp($channel,$channel['channel_hash'],$arr); + if($x['success']) + $folder = $x['data']['hash']; + } + dcp_recurse($channel,$src . '/' . $entry,$dstfile,$folder); + } + else { + $cmd = [ 'Importfile', $channel['channel_id'], $src . '/' . $entry, $folder ]; + \Zotlabs\Daemon\Master::Summon($cmd); + } + } + closedir($dir); + } + } |