#!/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); if(strpos($dstfile,'/')) $nick = substr($dstfile,0,strpos($dstfile,'/')); $dstfile = substr($dstfile,strlen($nick)+1); } else { $nick = $dstfile; $dstfile = ''; } $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; } } $rootdir = ((strlen(trim($dstfile,'/'))) ? false : true); $isadir = false; if(($recursive) || ($argc > 3)) $isadir = true; if($rootdir) { $folder = ''; } else { $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); } }