koresp hardlink PROJEKTY/ID..../_PISMA/{HL:pismo.pdf} * TODO: PROJEKTY/ID..../_PISMA/ permy tylko read/listing * TODO: hardlink druki: mkdir DRUKI/ID.{DESC}/_PROJEKT/{proj_folder}/{HL:pliki z proj bez podkatalogów} * TODO: DRUKI/ID.{DESC}/_PROJEKT/{proj_folder} permy tylko read/listing * -- TODO: DRUKI/ID.{DESC}/ - permy z bazy danych A_ADM_COMPANY, A_CLASSIFIED * * * DONE: Trigger po update/insert Koresp po aktualizacji permów plików projektu * * 5. Sync custom tables * TEST 2014-10-27: # php /Users/plabudda/rsync-dev/SE/bash_sync_perms.php biuro.biall-net.pl SyncPermsCustomTables * 5.1 Table list in CRM_CONFIG(key=_SYNC_TABLE_FILE_PERMS__TablesList) * table must be defined in .cnf--folders-{domain}.ini.php as section [{tblName}_COLUMN] * table must have fields: ID, L_APPOITMENT_USER, A_ADM_COMPANY, A_CLASSIFIED @see generateTasksNewRecords */ ini_set('max_execution_time', 300); ini_set('memory_limit', '512M'); define('DS', DIRECTORY_SEPARATOR); define('APP_PATH_ROOT', dirname(__FILE__)); define('APP_PATH_WWW', dirname(__FILE__)); define('APP_PATH_CONFIG', APP_PATH_ROOT . DS . 'config'); // set ini to log errors into error log file ini_set('display_startup_errors', '0'); ini_set('log_errors', '1'); ini_set('error_log', '/var/log/apache2/error_log');// TODO: php.ini ? date_default_timezone_set('Europe/Warsaw');// PHP 5 >= 5.1.0 required by date functions require_once APP_PATH_ROOT . DS . 'se-lib' . DS . 'Lib.php'; Lib::loadClass('V'); Lib::loadClass('Config'); Lib::loadClass('DB'); Lib::loadClass('User'); Lib::loadClass('FoldersConfig'); Lib::loadClass('FileUploader'); if (isset($_SERVER["argv"][1])) { $_SERVER['SERVER_NAME'] = $_SERVER["argv"][1]; } else if (empty($_SERVER["argv"]) && V::get('task', '', $_GET) == 'info') { $info = array(); $info['max_execution_time'] = ini_get('max_execution_time'); $info['memory_limit'] = ini_get('memory_limit'); echo'
info (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($info);echo'';
ini_set('max_execution_time', 300);
ini_set('memory_limit', '512M');
$info = array();
$info['max_execution_time'] = ini_get('max_execution_time');
$info['memory_limit'] = ini_get('memory_limit');
echo'info (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($info);echo'';
// $requirePermsExt = SyncPerms::getRequiredPermsExtByRecord((object)[
// 'L_APPOITMENT_USER' => "plabudda",
// 'A_ADM_COMPANY' => "",
// 'A_CLASSIFIED' => "",
// 'PARENT_L_APPOITMENT_USER' => "a.binder",
// ]);
// DBG::nicePrint($requirePermsExt, '$requirePermsExt - public for workgroup');
// $requirePermsExt = SyncPerms::getRequiredPermsExtByRecord((object)[
// 'L_APPOITMENT_USER' => "plabudda",
// 'A_ADM_COMPANY' => "2948-programista",
// 'A_CLASSIFIED' => "2948-programista",
// 'PARENT_L_APPOITMENT_USER' => "a.binder",
// ]);
// DBG::nicePrint($requirePermsExt, '$requirePermsExt - only 2948-programista read,write');
// $requirePermsExt = SyncPerms::getRequiredPermsExtByRecord((object)[
// 'L_APPOITMENT_USER' => "plabudda",
// 'A_ADM_COMPANY' => "",
// 'A_CLASSIFIED' => "2948-programista",
// 'PARENT_L_APPOITMENT_USER' => "a.binder",
// ]);
// DBG::nicePrint($requirePermsExt, '$requirePermsExt - 2948-programista read');
// $requirePermsExt = SyncPerms::getRequiredPermsExtByRecord((object)[
// 'L_APPOITMENT_USER' => "plabudda",
// 'A_ADM_COMPANY' => "2948-programista",
// 'A_CLASSIFIED' => "",
// 'PARENT_L_APPOITMENT_USER' => "a.binder",
// ]);
// DBG::nicePrint($requirePermsExt, '$requirePermsExt - 2948-programista write');
//
// $vFile = (object)[
// 'path' => 'test-file-1.txt',
// 'isDir' => false,
// 'permsExt' => [],
// ];
// $permReadDir = "list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit";
// $permWriteDir = "add_file,add_subdirectory,delete_child,writeattr,writeextattr,writesecurity,chown";
// $permReadFile = "read,execute,readattr,readextattr,readsecurity";
// $permWriteFile = "write,append,writeattr,writeextattr,writesecurity,chown";
//
// $recordPath = "/Library/Server/Web/Data/Sites/Default/PLIKI/TEST_PERMS/90";
// $filePath = "{$recordPath}/{$vFile->path}";
//
// $cmdList = SyncPerms::fixFilePerms($vFile, $requirePermsExt, $recordPath);
// DBG::nicePrint($cmdList, '$cmdList - 2948-programista write');
//
// V::exec("ls -le '{$filePath}'", $out, $ret);
// DBG::nicePrint($out, "\$out - ret({$ret})");
//
// V::exec("echo \"" . implode("\n", [
// "user:_www allow read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown",
// "group:27_BIALL-NET allow read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown",
// ]) . "\" | chmod -E '{$filePath}'", $out, $ret);
// DBG::nicePrint($out, "\$out - ret({$ret})");
//
// V::exec("ls -le '{$filePath}'", $out, $ret);
// DBG::nicePrint($out, "\$out - test 1, ret({$ret})");
//
// $aclPermsOut = implode("\n", [
// "user:_www allow read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown",
// "group:27_BIALL-NET allow read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown",
// ]);
// $aclPermsOut = implode("\n", [
// "user:_www allow read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown",
// "group:27_BIALL-NET allow read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown",
// "user:plabudda allow read,write",
// ]);
// V::exec("cd '{$recordPath}'; find . -type f | while read -r file; do echo \"fix file perms: \$file\"; echo \"{$aclPermsOut}\" | chmod -E \"\${file}\"; done", $out, $ret);
// DBG::nicePrint($out, "\$out - ret({$ret})");
//
// V::exec("ls -le '{$filePath}'", $out, $ret);
// DBG::nicePrint($out, "\$out - test 2, ret({$ret})");
//
// $testPermsFile = "{$recordPath}/perms-90.txt";
// DBG::nicePrint(explode("\n", file_get_contents($testPermsFile)), "testPermsFile - before add line");
// $lineToAdd = "user:plabudda allow read,write";
// V::exec("cat '{$testPermsFile}' | grep '{$lineToAdd}' || echo \"{$lineToAdd}\" >> '{$testPermsFile}'", $out, $ret);
// DBG::nicePrint($out, "\$out - add line, ret({$ret})");
// DBG::nicePrint(explode("\n", file_get_contents($testPermsFile)), "testPermsFile - after add line");
//
// { // TODO: add to instalator / install check / ?Status
// $lineToAdd = "_www ALL = NOPASWD: '" . APP_PATH_ROOT . "/SE/index-cli.php'";
// $destFile = "/etc/sudoers";
// V::exec("cat '{$destFile}' | grep '{$lineToAdd}' || echo \"{$lineToAdd}\" >> '{$destFile}'", $out, $ret);
// // TODO: check if sudo index-cli.php can exec("sudo ...")
// }
}
else if (empty($_SERVER["argv"]) && V::get('task', '', $_GET) == 'users') {
SyncPerms::run(null, null, 'users', null);
}
else if (empty($_SERVER["argv"]) && V::get('task', '', $_GET) == 'usersAll') {
SyncPerms::run(null, null, 'usersAll', null);
}
else if (empty($_SERVER["argv"]) && V::get('task', '', $_GET) == 'task') {
SyncPerms::run(null, null, 'nextTask', null);
}
else if (empty($_SERVER["argv"]) && V::get('task', '', $_GET) == 'newFiles') {
SyncPerms::run(null, null, 'newFiles', null);
}
else if (empty($_SERVER["argv"]) && V::get('task', '', $_GET) == 'testParse') {
$cmd = " ls -Rlea . ";
exec("cd '/Library/Server/Web/Data/Sites/Default/PLIKI/PROJEKTY/1657.Rekrutacja_z_dnia_2012-06_25_na_stanowisko_Przedstawiciel_Handlowy/1/'; {$cmd} ", $filesWithPerms);
//$line = "-rwxrwx---+ 1 _www workgroup 212367 Feb 25 2013 {file_name}";
echo'$filesWithPerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($filesWithPerms);echo'';
$filesWithPermsTree = array();
$lastName = '';
$folderParent = '';
foreach ($filesWithPerms as $line) {
if (substr($line, 0, 1) == '-' || substr($line, 0, 1) == 'd') {// file name
$fileParts = array();
$filePartsArr = explode(' ', $line);
$lastInd = 0;
foreach ($filePartsArr as $vPart) {
if ($lastInd > 7) {// file name
$fileParts[8] = ($lastInd > 8)? "{$fileParts[8]} {$vPart}" : $vPart;
$lastInd++;
}
else if (!empty($vPart) || $vPart === '0') {
$fileParts[] = $vPart;
$lastInd++;
}
}
if (end($fileParts) == '..' || (end($fileParts) == '.' && $folderParent)) {
$lastName = '..';
continue;
}
$file = new stdClass();
if (!isset($fileParts[8])) {
echo'Error parse file name (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('line'=>$line, 'fileParts'=>$fileParts));echo'';
//continue;
} else {
// fix file name from bad chars
// [8] => CV_Kowalski Mariusz`.pdf
// "-$Model Bialnet .xlsm" in /Users/plabudda/se-dev-pl/SE/bash_sync_perms.php on line 1518
// [11-Oct-2013 21:00:28 UTC] PHP Notice: Error-cmd: chmod -a# 3 "/Library/Server/Web/Data/Sites/Default/PLIKI/PROJEKTY/500.2009-12-01.INNE.DOFINANSOWANIE_PROJEKT_KOLBUDY/2013-02-26_harmonogram_EDORADCA_Aktualny/-$harmonogram 01.2013.xlsx" in /Users/plabudda/se-dev-pl/SE/bash_sync_perms.php on line 1518
// [11-Oct-2013 21:00:27 UTC] PHP Notice: Error-cmd: chmod -a# 3 "/Library/Server/Web/Data/Sites/Default/PLIKI/PROJEKTY/500.2009-12-01.INNE.DOFINANSOWANIE_PROJEKT_KOLBUDY/2012-04-19_oferta_gpon_sprint_po_poprawkach/-$Wycena GPON 2012 Biall-Net_spr v1.xlsx" in /Users/plabudda/se-dev-pl/SE/bash_sync_perms.php on line 1518
// [11-Oct-2013 20:56:25 UTC] PHP Notice: Error-cmd: chmod +a "user:prejsi allow write,append,writeattr,writeextattr,writesecurity,chown,read,execute,readattr,readextattr,readsecurity" "/Library/Server/Web/Data/Sites/Default/PLIKI/PROJEKTY/1695.Projekt_glowny_dzialu_rozwoju_biznesu_oraz_dystrybucji_informacji/HANDLOWY/HANDLOWY_2012/OTOMIN/-$Otomin.xlsx" in /Users/plabudda/se-dev-pl/SE/bash_sync_perms.php on line 1517
//$fileParts[8] = str_replace('\\', '\\\\', $fileParts[8]);
//$fileParts[8] = str_replace(array('`', '$'), array('\`', '\$'), $fileParts[8]);
}
echo'line/$fileParts/$filePartsArr (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($line, $fileParts, $filePartsArr));echo'';
$file->name = end($fileParts);
$file->path = array();
if ($folderParent) $file->path[] = $folderParent;
$file->path[] = end($fileParts);
$file->path = implode('/', $file->path);
//$file->owner = $fileParts[2];
//$file->group = $fileParts[3];
//$file->perms = $fileParts[0];
$file->isDir = (substr($line, 0, 1) == 'd');
$file->permsExt = array();
$filesWithPermsTree[$file->name] = $file;
$lastName = $file;
}
else if (substr($line, 0, 1) == ' ') {// extended perm line
if ($lastName == '..') {
continue;
}
$filesWithPermsTree[$file->name]->permsExt[] = trim($line);
}
else if (substr($line, 0, 2) == './' && substr($line, -1) == ':') {// folder
$folderParent = substr($line, 2, -1);
}
else if (substr($line, 0, 5) == 'total') {
continue;
}
else if (empty($line)) {
$folderParent = '';
continue;
}
}
echo'$filesWithPermsTree (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($filesWithPermsTree);echo'';
}
else if (empty($_SERVER["argv"]) && V::get('DBG', '', $_GET, 'int') > 0) {
SyncPerms::run(null, null);
}
else {
die("\n The second argument should be server domain - e.g. biuro.kike.pl \n");
}
if (!empty($_SERVER["argv"][0]) && !empty($_SERVER["argv"][1])) {
$arg2 = (!empty($_SERVER["argv"][2]))? $_SERVER["argv"][2] : null;
$arg3 = (!empty($_SERVER["argv"][3]))? $_SERVER["argv"][3] : null;
SyncPerms::run($_SERVER["argv"][0], $_SERVER["argv"][1], $arg2, $arg3);
}
class SyncPerms {
public static function run($script_name, $domain, $arg2 = null, $arg3 = null) {
if ($arg2 == 'addToLaunchctl') self::task__addToLaunchctl($domain);
else if ($arg2 == 'newFiles') self::task__newFiles();
else if ($arg2 == 'nextTask') self::task__nextTask();
else if ($arg2 == 'testErrorLog') self::task__testErrorLog();
else if ($arg2 == 'users') self::usersAction();
else if ($arg2 == 'usersAll') self::usersAllAction();
else if ($arg2 == 'SyncPermsCustomTables') self::task__SyncPermsCustomTables();
else if ($arg2 == 'sendNotify') self::sendNotify();
else self::task__default();
}
public static function task__addToLaunchctl($domain) {
$plistFile = "/Library/LaunchDaemons/pl.biallnet.sync_perms.{$domain}.php.plist";
system("echo \"
nextTask';} self::installTable(); if(V::get('DBG', '', $_GET, 'int') > 0){echo'
installTable DONE';} self::generateTasksNewRecords(); if(V::get('DBG', '', $_GET, 'int') > 0){echo'
generateTasksNewRecords DONE';} self::generateTasksUpdated(); if(V::get('DBG', '', $_GET, 'int') > 0){echo'
generateTasksUpdated DONE';} $limit = V::get('_limit', 1, $_GET, 'int'); for ($i = 0; $i < $limit; $i++) { $time->cur = time(); if ($time->cur - $time->start > 60 * 5) { if(V::get('DBG', '', $_GET, 'int') > 0){echo'
Force-break time('.($time->cur - $time->start).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';echo'';}
break;
}
$task = self::nextTaskAction();
if (!$task) break;
}
}
public static function task__testErrorLog() {
echo "display_errors: " . ini_get("display_errors") . "\n";
echo "display_startup_errors: " . ini_get("display_startup_errors") . "\n";
echo "log_errors: " . ini_get("log_errors") . "\n";
echo "error_reporting: " . ini_get("error_reporting") . "\n";
echo "error_log: " . ini_get("error_log") . "\n";
trigger_error("Notice: Test Error Log", E_USER_NOTICE);
}
public static function task__SyncPermsCustomTables() {
$DBG_TIME = true;
$dbgTime = new stdClass();
$dbgTime->startTime = microtime(true);
$dbgTime->lastTime = $dbgTime->startTime;
$customSync = new SyncPermsCustomTables();
// TODO: $customSync->run();
$customSync->fetchConfig();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-fetchConfig (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$customSync->installTable();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-installTable (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$rowId = (int)$arg3;
if ($rowId > 0) {
$customSync->executeTask('DEALS_TABLE', $rowId);// TODO: DEALS_TABLE ?
}
else {
$customSync->generateTasksNewRecords();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-generateTasksNewRecords (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$customSync->generateTasksUpdated();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-generateTasksUpdated (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$customSync->newFilesAction();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-newFilesAction (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$limit = 1000;
for ($i = 0; $i < $limit; $i++) {
$loopTasksFired = 0;
foreach ($customSync->_tbls as $tblName => $tblConf) {
$task = $customSync->nextTaskAction($tblName);
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-nextTaskAction (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
if (!$task) {
// TODO: rm $tblName from config to prevent searching for task in next loops
unset($customSync->_tbls[$tblName]);
continue;
}
$loopTasksFired++;
}
if (!$loopTasksFired) {
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-nextTaskAction (loop:{$i}) (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
break;
}
$i += $loopTasksFired;
}
}
$dbgTime->endTime = microtime(true);
trigger_error("Notice: sync end OK (time:" . number_format($dbgTime->endTime - $dbgTime->startTime, 6) . "s) !", E_USER_NOTICE);
}
public static function task__default() {
$DBG_TIME = false;
$DBG_MEMORY = false;
$dbgTime = new stdClass();
$dbgTime->start = time();
$dbgTime->startTime = microtime(true);
$dbgTime->lastTime = $dbgTime->startTime;
self::installTable();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-installTable (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
self::generateTasksNewRecords();
if($DBG_MEMORY)trigger_error("DBG:mem usage after-generateTasksNewRecords " . memory_get_usage(true) . ".", E_USER_NOTICE);
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-generateTasksNewRecords (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
self::generateTasksUpdated();
if($DBG_MEMORY)trigger_error("DBG:mem usage after-generateTasksUpdated " . memory_get_usage(true) . ".", E_USER_NOTICE);
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-generateTasksUpdated (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$dbgTime->cur = time();
if ($dbgTime->cur - $dbgTime->start > 60 * 5) {
trigger_error("Error: time end after-init " . ($dbgTime->cur - $dbgTime->start) . " !", E_USER_NOTICE);
return;
}
self::newFilesAction();
if($DBG_MEMORY)trigger_error("DBG:mem usage after-newFilesAction " . memory_get_usage(true) . ".", E_USER_NOTICE);
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-newFilesAction (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
$limit = 100;
for ($i = 0; $i < $limit; $i++) {
$dbgTime->cur = time();
if ($dbgTime->cur - $dbgTime->start > 60 * 5) {
trigger_error("Error: time end after-nextTaskAction(loop:{$i}) " . ($dbgTime->cur - $dbgTime->start) . " !", E_USER_NOTICE);
return;
}
$task = self::nextTaskAction();
if($DBG_MEMORY)trigger_error("DBG:mem usage after-nextTaskAction (loop:{$i}) " . memory_get_usage(true) . ".", E_USER_NOTICE);
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time after-nextTaskAction (loop:{$i}) (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
if (!$task) {
$dbgTime->cur = time();
break;
}
}
$customSync = new SyncPermsCustomTables();
$customSync->run();
$dbgTime->cur = time();
$dbgTime->endTime = microtime(true);
trigger_error("Notice: sync end OK (time:" . number_format($dbgTime->endTime - $dbgTime->startTime, 6) . "s) !", E_USER_NOTICE);
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
trigger_error("DBG:time sync end OK (time:" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s)", E_USER_NOTICE);
$dbgTime->lastTime = $dbgTime->curTime;
}
self::sendNotify();
Lib::loadClass('Router');
echo "DBG: UrlAction_WmsGenerate->doGenerate() START...\n";
Router::getRoute('UrlAction_WmsGenerate')->doGenerate();
echo "DBG: UrlAction_WmsGenerate->doGenerate() END\n";
echo "DBG: UrlAction_BiAuditGenerate->doGenerate() START...\n";
Router::getRoute('UrlAction_BiAuditGenerate')->doGenerate(); //musze przetestowac raport!
echo "DBG: UrlAction_BiAuditGenerate->doGenerate() END\n";
}
public static function sendNotify() {
Lib::loadClass('Router');
$cronTaskName = 'sendNotify';
$keyToken = 'bach_sync_perms';
$token = Router::getRoute('Cron')->generateCliAuthToken($keyToken, $cronTaskName, 300 * 10);
echo "DBG: token = '{$token}'" . "\n";
$string = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token);
echo "DBG: string -----------------------\n{$string}\nEOF string---------------------------------\n";
}
public static function installTable() {
$sql = "
CREATE TABLE IF NOT EXISTS `_SYNC_FILE_PERMS` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ID_PROJECT` int(11) NOT NULL,
`L_APPOITMENT_USER` varchar(64) DEFAULT '',
`A_ADM_COMPANY` varchar(64) NOT NULL DEFAULT '',
`A_CLASSIFIED` varchar(64) NOT NULL DEFAULT '',
`PARENT_L_APPOITMENT_USER` varchar(64) NOT NULL DEFAULT '',
`A_LAST_SYNC` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`A_SYNCHRONIZED` tinyint(4) NOT NULL DEFAULT '0',
`A_SYNC_RESULT` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`ID`),
UNIQUE KEY `ID_PROJECT` (`ID_PROJECT`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 ;
";
DB::getPDO()->execSql($sql);
try {
$sql = " DROP TRIGGER IF EXISTS `KORESP_change_ID_PROJECT`; ";
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
// TODO: SKIP - BUG after upgrade mysql - @see https://dev.mysql.com/doc/refman/5.5/en/upgrading-from-previous-series.html
}
try {
$sql = "
CREATE DEFINER=`root`@`localhost` TRIGGER `KORESP_change_ID_PROJECT` AFTER UPDATE ON `IN7_DZIENNIK_KORESP`
FOR EACH ROW BEGIN
IF (NEW.`ID_PROJECT` != OLD.`ID_PROJECT` and NEW.`ID_PROJECT` > 0) or OLD.`M_DIST_FILES`!=NEW.`M_DIST_FILES` THEN
update `_SYNC_FILE_PERMS` as s set
s.`A_SYNCHRONIZED`=0
where
s.`ID_PROJECT`=NEW.`ID_PROJECT`
or s.`ID_PROJECT`=OLD.`ID_PROJECT`;
END IF;
END
";
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
try {
$sql = " DROP TRIGGER IF EXISTS `KORESP_add_ID_PROJECT`; ";
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
// TODO: SKIP - BUG after upgrade mysql - @see https://dev.mysql.com/doc/refman/5.5/en/upgrading-from-previous-series.html
}
try {
$sql = "
CREATE DEFINER=`root`@`localhost` TRIGGER `KORESP_add_ID_PROJECT` AFTER INSERT ON `IN7_DZIENNIK_KORESP`
FOR EACH ROW BEGIN
IF NEW.`ID_PROJECT` > 0 THEN
update `_SYNC_FILE_PERMS` as s set
s.`A_SYNCHRONIZED`=0
where
s.`ID_PROJECT`=NEW.`ID_PROJECT`;
END IF;
END
";
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
}
public static function newFilesAction() {
$task = self::getTaskNewFiles();
$taskResult = self::fixLastModifiedFiles($task);
self::saveTask(-1);
}
public static function nextTaskAction() {
$task = self::getTask();
if (!$task) return false;
self::executeTask($task);
/*
if (isset($task->A_SYNC_RESULT->total)
&& isset($task->A_SYNC_RESULT->lastDone)
&& $task->A_SYNC_RESULT->lastDone < $task->A_SYNC_RESULT->total
) {
self::saveTask($task->ID_PROJECT, 0, $task->A_SYNC_RESULT);
} else {
self::saveTask($task->ID_PROJECT);
}
*/
self::saveTask($task->ID_PROJECT);
return $task;
}
public static function generateTasksUpdated() {
$sqlTest = "
select p.ID, p.`L_APPOITMENT_USER`, p.`A_ADM_COMPANY`, p.`A_CLASSIFIED`, s. *
from `_SYNC_FILE_PERMS` as s, `IN7_MK_BAZA_DYSTRYBUCJI` as p, `IN7_MK_BAZA_DYSTRYBUCJI` as pp
where
s.`ID_PROJECT`=p.`ID` and pp.`ID`=p.`P_ID`
and (
s.`L_APPOITMENT_USER`!=p.`L_APPOITMENT_USER`
or s.`A_ADM_COMPANY`!=p.`A_ADM_COMPANY`
or s.`A_CLASSIFIED`!=p.`A_CLASSIFIED`
or s.`PARENT_L_APPOITMENT_USER`!=pp.`L_APPOITMENT_USER`
)
";
$sql = "update `_SYNC_FILE_PERMS` as s, `IN7_MK_BAZA_DYSTRYBUCJI` as p, `IN7_MK_BAZA_DYSTRYBUCJI` as pp
set
s.`L_APPOITMENT_USER`=p.`L_APPOITMENT_USER`
, s.`A_ADM_COMPANY`=p.`A_ADM_COMPANY`
, s.`A_CLASSIFIED`=p.`A_CLASSIFIED`
, s.`PARENT_L_APPOITMENT_USER`=pp.`L_APPOITMENT_USER`
, s.`A_SYNCHRONIZED`=0
where
s.`ID_PROJECT`=p.`ID` and pp.`ID`=p.`P_ID`
and (
s.`L_APPOITMENT_USER`!=p.`L_APPOITMENT_USER`
or s.`A_ADM_COMPANY`!=p.`A_ADM_COMPANY`
or s.`A_CLASSIFIED`!=p.`A_CLASSIFIED`
or s.`PARENT_L_APPOITMENT_USER`!=pp.`L_APPOITMENT_USER`
)
";
try {
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
}
public static function generateTasksNewRecords() {
$sql = "insert ignore into `_SYNC_FILE_PERMS` (`ID_PROJECT`, `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`, `PARENT_L_APPOITMENT_USER`)
values (-1, '', '', '', '');
";
try {
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
$sql = "insert ignore into `_SYNC_FILE_PERMS` (`ID_PROJECT`, `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`, `PARENT_L_APPOITMENT_USER`)
select p.`ID`, p.`L_APPOITMENT_USER`, p.`A_ADM_COMPANY`, p.`A_CLASSIFIED`, pp.`L_APPOITMENT_USER`
from `IN7_MK_BAZA_DYSTRYBUCJI` as p
left join `IN7_MK_BAZA_DYSTRYBUCJI` as pp on (pp.`ID`=p.`P_ID`)
where p.`A_STATUS`!='DELETED'
";
try {
DB::getPDO()->execSql($sql);
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
}
/**
* Znajdź najstarszy aktualizowany projekt.
*/
public static function getTask() {
$sqlWhereProjID = " s.`A_SYNCHRONIZED`=0 ";
if (($projID = V::get('PROJ_ID', '', $_GET, 'int')) > 0) {
$sqlWhereProjID = " s.`ID_PROJECT`='{$projID}' ";
}
$sql = "
select s.*
, p.`L_APPOITMENT_USER` as p__L_APPOITMENT_USER
, p.`A_ADM_COMPANY` as p__A_ADM_COMPANY
, p.`A_CLASSIFIED` as p__A_CLASSIFIED
, pp.`L_APPOITMENT_USER` as p__PARENT_L_APPOITMENT_USER
, p.`M_DIST_DESC` as p__M_DIST_DESC
, p.`M_DISTRIBUTOR` as p__M_DISTRIBUTOR
, p.`CRM_LISTA_ZASOBOW_ID` as p__CRM_LISTA_ZASOBOW_ID
from `_SYNC_FILE_PERMS` as s
left join `IN7_MK_BAZA_DYSTRYBUCJI` as p on(p.`ID`=s.`ID_PROJECT`)
left join `IN7_MK_BAZA_DYSTRYBUCJI` as pp on(pp.`ID`=p.`P_ID`)
where {$sqlWhereProjID}
order by s.`A_LAST_SYNC` asc, s.`ID` asc
limit 1
";
try {
$task = DB::getPDO()->fetchFirst($sql);
if ($task) {
$task['A_SYNC_RESULT'] = (!$task['A_SYNC_RESULT'])? new stdClass() : json_decode($task['A_SYNC_RESULT']);
return (object)$task;
}
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
return null;
}
public static function getTaskNewerUsers() {
$sql = "
select s.*
from `_SYNC_FILE_PERMS` as s
where s.`ID_PROJECT`=-2
";
try {
$task = DB::getPDO()->fetchFirst($sql);
if ($task) {
return (object)$task;
}
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
return (object)[
'ID_PROJECT' => -2,
'A_SYNC_RESULT' => new stdClass(),
'A_LAST_SYNC' => '', // date("Y-m-d H:i", mktime(date("H"), date("i") - 10, date("s"), date("n"), date("j"), date("Y"))),
];
}
public static function getTaskNewFiles() {
$sql = "
select s.*
from `_SYNC_FILE_PERMS` as s
where s.`ID_PROJECT`=-1
";
try {
$task = DB::getPDO()->fetchFirst($sql);
if ($task) {
return (object)$task;
}
} catch (Exception $e) {
echo "DB ERR L." . __LINE__ . ": " . $e->getMessage() . "\n";
trigger_error("DB ERR L." . __LINE__ . ": " . $e->getMessage(), E_USER_WARNING);
}
return (object)[
'ID_PROJECT' => -1,
'A_SYNC_RESULT' => new stdClass(),
'A_LAST_SYNC' => date("Y-m-d H:i", mktime(date("H"), date("i") - 10, date("s"), date("n"), date("j"), date("Y"))),
];
}
public static function saveTask($idProject, $taskDone = 1, $result = null) {
$sqlResult = ($result)
? " , s.`A_SYNC_RESULT` = " . DB::getPDO()->quote( json_encode($result) )
: '';
$sql = "
update `_SYNC_FILE_PERMS` as s
set
s.`A_LAST_SYNC` = NOW()
, s.`A_SYNCHRONIZED` = {$taskDone}
{$sqlResult}
where s.`ID_PROJECT` = {$idProject}
";
DB::getPDO()->execSql($sql);
}
public static function executeTask(&$task) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'executeTask (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($task);echo'';}
$confTblName = 'IN7_MK_BAZA_DYSTRYBUCJI_COLUMN';
$PROJ_mount_point = FoldersConfig::get($confTblName, 'mount_point');
$project = new stdClass();
$project->ID = $task->ID_PROJECT;
$project->L_APPOITMENT_USER = $task->p__L_APPOITMENT_USER;
$project->A_ADM_COMPANY = $task->p__A_ADM_COMPANY;
$project->A_CLASSIFIED = $task->p__A_CLASSIFIED;
$project->PARENT_L_APPOITMENT_USER = $task->p__PARENT_L_APPOITMENT_USER;
$project->M_DIST_DESC = $task->p__M_DIST_DESC;
$project->M_DISTRIBUTOR = $task->p__M_DISTRIBUTOR;
$project->CRM_LISTA_ZASOBOW_ID = $task->p__CRM_LISTA_ZASOBOW_ID;
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, $project);
$errMsg = '';
if (!$uploader->setConfig($folderConf, $errMsg)) {
trigger_error("Error: folders config!", E_USER_NOTICE);
die("Error: folders config!");
}
$uploader->findFolder();
$mainFolder = $uploader->getDestFolder();
if(V::get('DBG', '', $_GET, 'int') > 2){echo'generated folderName('.$project->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';var_dump($uploader);echo'';}
if (!$mainFolder) {
$mainFolder = $uploader->generateFolderName();
$mainFolderPath = rtrim($PROJ_mount_point, '/') . '/' . $mainFolder;
if(V::get('DBG', '', $_GET, 'int') > 2){echo'generated folderName('.$project->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($mainFolder, $mainFolderPath));echo'';}
mkdir($mainFolderPath, 0770, true);
@chmod($mainFolderPath, 0770);
if (!file_exists($mainFolderPath)) {
trigger_error("Error: Nie udało się utworzyć folderu! ({$mainFolder})", E_USER_NOTICE);
return false;
}
$requirePermsExt = self::getRequiredPermsExtByRecord($project);
$file = new stdClass();
$file->name = '.';
$file->path = '.';
//$file->owner = '';
//$file->group = '';
//$file->perms = '';
$file->isDir = true;
$file->permsExt = array();
$cmdList = self::fixFilePerms($file, $requirePermsExt, "{$PROJ_mount_point}/{$mainFolder}", $project);
if(V::get('DBG', '', $_GET, 'int') > 0){echo'cmdList-P('.$project->ID.') fixFilePerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
}
else {
$cmdList = self::fixProject($project, $mainFolder, $PROJ_mount_point, $task);
if(V::get('DBG', '', $_GET, 'int') > 0){echo'cmdList-P('.$project->ID.') fixProject (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
$mainFolderPath = rtrim($PROJ_mount_point, '/') . '/' . $mainFolder;
$folderPismaPath = "{$mainFolderPath}/_PISMA";
// if folder _PISMA not exists then create
$cmdList[] = "if [ ! -d '{$folderPismaPath}' ] ; then mkdir '{$folderPismaPath}'; chmod 0770 '{$folderPismaPath}'; fi;";
$cmdKorepList = self::fixProjectKoresp($project, $folderPismaPath);
if (!empty($cmdKorepList)) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'cmdList-P('.$project->ID.') fixProjectKoresp (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdKorepList);echo'';}
foreach ($cmdKorepList as $vCmd) {
$cmdList[] = $vCmd;
}
}
}
if (!empty($cmdList)) {
foreach ($cmdList as $vCmd) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Exec-cmdList-P('.$project->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($vCmd);echo'';}
exec($vCmd, $out, $outValue);
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Done-cmdList-P('.$project->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($outValue, $out));echo'';}
if ($outValue != 0) {
trigger_error("Error-cmd: {$vCmd}", E_USER_NOTICE);
}
}
}
if(V::get('DBG', '', $_GET, 'int') > 0){echo'';print_r("executeTask finished OK");echo'';}
}
public static function getActiveLoginList() {
static $activeLoginList;
if (!is_array($activeLoginList)) {
$activeLoginList = DB::getPDO()->fetchValuesList("
select u.`ADM_ACCOUNT`
from `ADMIN_USERS` as u
where u.`A_STATUS` = 'NORMAL'
");
}
return $activeLoginList;
}
public static function isActiveUser($login) {
$activeLoginList = self::getActiveLoginList();
return in_array($login, $activeLoginList);
}
public static function getRequiredPermsExtByRecord($project) {
// TODO: need to check if user is correct in field L_APPOITMENT_USER
$requirePermsExt = array();
if (!$project->L_APPOITMENT_USER && !$project->A_ADM_COMPANY) {// no owner, no write group
// TODO: group PODMIOT
$requirePermsExt["group:workgroup"] = array('write', 'read');
}
else {
if ($project->L_APPOITMENT_USER) {
if (self::isActiveUser($project->L_APPOITMENT_USER)) {
$requirePermsExt["user:{$project->L_APPOITMENT_USER}"] = array('write', 'read');
} else {
// TODO: trigger error $project->L_APPOITMENT_USER is not active user!
}
}
if (!empty($project->A_ADM_COMPANY) && $project->A_ADM_COMPANY == $project->A_CLASSIFIED) {
$requirePermsExt["group:{$project->A_ADM_COMPANY}"] = array('read', 'write');
}
else if (empty($project->A_ADM_COMPANY) && empty($project->A_CLASSIFIED)) {
$requirePermsExt["group:workgroup"] = array('write', 'read');
}
else {
if ($project->A_ADM_COMPANY) {
$requirePermsExt["group:{$project->A_ADM_COMPANY}"] = array('write');
}
if ($project->A_CLASSIFIED) {
$requirePermsExt["group:{$project->A_CLASSIFIED}"] = array('read');
}
}
}
// add parent owner
if (!empty($project->PARENT_L_APPOITMENT_USER) && $project->PARENT_L_APPOITMENT_USER != $project->L_APPOITMENT_USER) {
if (self::isActiveUser($project->PARENT_L_APPOITMENT_USER)) {
$requirePermsExt["user:{$project->PARENT_L_APPOITMENT_USER}"] = array('write', 'read');
} else {
// TODO: trigger error $project->PARENT_L_APPOITMENT_USER is not active user!
}
}
// add user:_www perms read, write
$requirePermsExt["user:_www"] = array('write', 'read');
return $requirePermsExt;
}
/**
* Used for files added/modified by samba/afp.
*
* @return TODO: object to store in task->A_SYNC_RESULT
*/
public static function fixLastModifiedFiles($task) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'fixLastModifiedFiles (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("fixLastModifiedFiles");echo'';}
$PROJ_mount_point = FoldersConfig::get('IN7_MK_BAZA_DYSTRYBUCJI_COLUMN', 'mount_point');
$PISMA_mount_point = FoldersConfig::get('IN7_DZIENNIK_KORESP_COLUMN', 'mount_point');
$foundProjectFiles = array();
if(V::get('DBG', '', $_GET, 'int') > 0){echo'$lastRunDate (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($task->A_LAST_SYNC);echo'';}
//exec("cd {$PROJ_mount_point}; find . -newermt '{$task->A_LAST_SYNC}' ", $foundPaths);
exec("cd {$PROJ_mount_point}; find . -newermt '{$task->A_LAST_SYNC}' -type f -exec ls -le '{}' \;", $filesWithPerms);// TODO: head -{$lastTotal + 10000}| tail
if (!empty($filesWithPerms)) {
$filesWithPermsTree = array();
$lastName = '';
foreach ($filesWithPerms as $line) {
if (substr($line, 0, 1) == '-') {// file name
$fileParts = array();
$filePartsArr = explode(' ', $line);
$lastInd = 0;
foreach ($filePartsArr as $vPart) {
if ($lastInd > 7) {// file name
$fileParts[8] = ($lastInd > 8)? "{$fileParts[8]} {$vPart}" : $vPart;
$lastInd++;
}
else if (!empty($vPart) || $vPart === '0') {
$fileParts[] = $vPart;
$lastInd++;
}
}
$file = new stdClass();
if (!isset($fileParts[8])) {
echo'Error parse file name (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('line'=>$line, 'fileParts'=>$fileParts));echo'';
//continue;
}
$file->name = end($fileParts);
$file->path = end($fileParts);
//$file->owner = $fileParts[2];
//$file->group = $fileParts[3];
//$file->perms = $fileParts[0];
$file->isDir = (substr($line, 0, 1) == 'd');
$file->permsExt = array();
$filesWithPermsTree[$file->name] = $file;
$lastName = $file->name;
}
else if (substr($line, 0, 1) == ' ') {// extended perm line
if ($lastName == '..') {
continue;
}
$filesWithPermsTree[$file->name]->permsExt[] = trim($line);
}
else {// parse error
$lastName = '..';
}
}
foreach ($filesWithPermsTree as $vFile) {
$vFile->path = ltrim($vFile->path, './');
$vFile->path = explode('/', $vFile->path);
$vFile->projectFolder = array_shift($vFile->path);
$vFile->path = implode('/', $vFile->path);
$projId = explode('.', $vFile->projectFolder);
$projId = reset($projId);
if (is_numeric($projId) && $projId > 0) {
$foundProjectFiles[$projId][] = $vFile;
}
}
}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'filesWithPerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$PROJ_mount_point}\n";print_r($filesWithPerms);echo'';}
if(V::get('DBG', '', $_GET, 'int') > 0){echo'foundProjectFiles (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$PROJ_mount_point}\n";print_r($foundProjectFiles);echo'';}
if (!empty($foundProjectFiles)) {
$sql = "
select p.`ID`
, p.`L_APPOITMENT_USER`
, p.`A_ADM_COMPANY`
, p.`A_CLASSIFIED`
, pp.`L_APPOITMENT_USER` as PARENT_L_APPOITMENT_USER
from IN7_MK_BAZA_DYSTRYBUCJI as p
left join IN7_MK_BAZA_DYSTRYBUCJI as pp on (pp.ID=p.P_ID)
where p.`ID` in (" . implode(',', array_keys($foundProjectFiles)) . ")
";
$rows = DB::getPDO()->fetchAll($sql);
foreach ($rows as $row) {
$r = (object)$row;
$requirePermsExt = self::getRequiredPermsExtByRecord($r);
foreach ($foundProjectFiles[$r->ID] as $vFile) {
$cmdList = self::fixFilePerms($vFile, $requirePermsExt, "{$PROJ_mount_point}/{$vFile->projectFolder}", $r);
if (!empty($cmdList)) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'$cmdList P('.$r->ID.') total('.count($cmdList).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
foreach ($cmdList as $vCmd) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Exec-cmdList-P('.$project->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($vCmd);echo'';}
exec($vCmd, $out, $outValue);
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Done-cmdList-P('.$project->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($outValue, $out));echo'';}
if ($outValue != 0) {
trigger_error("Error-cmd: {$vCmd}", E_USER_NOTICE);
}
}
} else {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'$cmdList is empty P('.$r->ID.') total('.count($cmdList).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("empty");echo'';}
}
}
}
}
}
public static function fixProjectKoresp($project, $folderPismaPath) {
$PISMA_mount_point = FoldersConfig::get('IN7_DZIENNIK_KORESP_COLUMN', 'mount_point');
$PISMA_mount_point = rtrim($PISMA_mount_point, '/');
// $PISMA_mount_point / {TYP_KORESP} / {ID} . *
$sql = "
select k.`ID`
, k.`K_TYP_KORESP`
from `IN7_DZIENNIK_KORESP` as k
where k.`ID_PROJECT`={$project->ID}
order by k.`ID` DESC
limit 100
";
$pismaList = array_map(function ($row) {
return $row['K_TYP_KORESP']; // TODO: K_TYP_KORESP not used
}, DB::getPDO()->fetchAllByKey($sql, 'ID'));
// $PISMA_mount_point / {TYP_KORESP} / {ID} . *
if (empty($pismaList)) {
return false;
}
$lsCmd = array();
$lsCmd[] = "0.*/";// if only one folder then it doesnt show folder name, only files
foreach ($pismaList as $kID => $vTyp) {
$lsCmd[] = "{$kID}.*/";
}
if (empty($lsCmd)) {
return false;
}
$lsCmd = 'ls -le ' . implode($lsCmd, ' ') . ' 2>>/dev/null ';
if(V::get('DBG', '', $_GET, 'int') > 0){echo'Koreps lsCmd (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($lsCmd);echo'';}
exec("cd {$PISMA_mount_point}; {$lsCmd} ", $filesWithPerms);
$filesWithPermsTree = array();
if (!empty($filesWithPerms)) {
$lastName = '';
$folderParent = '';
foreach ($filesWithPerms as $line) {
if (substr($line, 0, 1) == '-') {// file name
$fileParts = array();
$filePartsArr = explode(' ', $line);
$lastInd = 0;
foreach ($filePartsArr as $vPart) {
if ($lastInd > 7) {// file name
$fileParts[8] = ($lastInd > 8)? "{$fileParts[8]} {$vPart}" : $vPart;
$lastInd++;
}
else if (!empty($vPart) || $vPart === '0') {
$fileParts[] = $vPart;
$lastInd++;
}
}
$file = new stdClass();
if (!isset($fileParts[8])) {
echo'Error parse file name (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('line'=>$line, 'fileParts'=>$fileParts));echo'';
//continue;
}
$file->name = end($fileParts);
$file->path = array();
if ($folderParent) $file->path[] = $folderParent;
$file->path[] = end($fileParts);
$file->path = implode('/', $file->path);
//$file->owner = $fileParts[2];
//$file->group = $fileParts[3];
//$file->perms = $fileParts[0];
$file->isDir = (substr($line, 0, 1) == 'd');
$file->permsExt = array();
$filesWithPermsTree[$file->name] = $file;
$lastName = $file->name;
}
else if (substr($line, 0, 1) == ' ') {// extended perm line
if ($lastName == '..') {
continue;
}
$filesWithPermsTree[$file->name]->permsExt[] = trim($line);
}
else if (substr($line, -1) == ':') {// folder
$folderParent = trim(substr($line, 0, -1), '/');
}
else if (substr($line, 0, 5) == 'total') {
continue;
}
else if (empty($line)) {
$folderParent = '';
continue;
}
else {// parse error
$lastName = '..';
}
}
}
if(V::get('DBG', '', $_GET, 'int') > 2){echo'filesWithPerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$PISMA_mount_point}\n";print_r($filesWithPerms);echo'';}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'filesWithPermsTree (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$PISMA_mount_point}\n";print_r($filesWithPermsTree);echo'';}
$cmdList = array();
$requirePermsExt = self::getRequiredPermsExtByRecord($project);
foreach ($filesWithPermsTree as $kFileName => $vFile) {
$cmdFile = self::fixFilePerms($vFile, $requirePermsExt, "{$PISMA_mount_point}", $project);
if (!empty($cmdFile)) {
foreach ($cmdFile as $vCmd) {
$cmdList[] = $vCmd;
}
}
// if folder _PISMA not exists then create
$fname = explode('/', $vFile->path);
$fname = end($fname);
$cmdList []= "if [ ! -f '{$folderPismaPath}/{$fname}' ] ; then ln '{$PISMA_mount_point}/{$vFile->path}' '{$folderPismaPath}'/; fi; ";
}
return $cmdList;
}
/*
* Not used.
*/
public static function preloadFixProject(&$task, $mainFolder, $PROJ_mount_point) {
if ($task->ID_PROJECT == 1695) {// TODO: biall-net - 8853 pliki w katalog - stary HANDLOWY
if (isset($task->A_SYNC_RESULT->total)) {
exec("cd '{$PROJ_mount_point}/{$mainFolder}' && find . -type f | wc -l ", $filesTotal);
if (!empty($filesTotal)) {
$filesTotal = reset($filesTotal);
$filesTotal = intval(trim($filesTotal));
$task->A_SYNC_RESULT->total = $filesTotal;
self::saveTask($task->ID_PROJECT, 0, $task->A_SYNC_RESULT);
}
}
}
}
public static function fixProject($r, $mainFolder, $PROJ_mount_point, &$task) {
$time = time();
if ($r->ID == 1695) {// TODO: biall-net - 8853 pliki w katalog - stary HANDLOWY
if(V::get('DBG', '', $_GET, 'int') > 0){echo'TODO: pomin - za dużo plików ('.$r->ID.'/'.$mainFolder.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($r);echo'';}
//return false;
}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'r('.$r->ID.'/'.$mainFolder.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($r);echo'';}
$requirePermsExt = self::getRequiredPermsExtByRecord($r);
$filesWithPerms = array();
$cmd = " ls -Rlea . ";
if (false) {//$r->ID == 1695) {// TODO: biall-net - 8853 pliki w katalog - stary HANDLOWY
if (isset($task->A_SYNC_RESULT->total)) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'A_SYNC_RESULT (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("A_SYNC_RESULT[total]={$task->A_SYNC_RESULT->total}");echo'';}
if ($task->A_SYNC_RESULT->total > 1000) {
$lastDone = V::get('lastDone', 0, $task->A_SYNC_RESULT, 'int');
if ($lastDone > 0) {
$task->A_SYNC_RESULT->lastDone = $lastDone + 1000;
$cmd = " find . -type f | head -" . ($lastDone + 1000) . " | tail -1000 | xargs ls -le ";
} else {
$task->A_SYNC_RESULT->lastDone = 1000;
$cmd = " find . -type f | head -1000 | xargs ls -le ";
}
}
}
}
if(V::get('DBG', '', $_GET, 'int') > 0){echo'cmd (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("cd '{$PROJ_mount_point}/{$mainFolder}' && {$cmd} ");echo'';}
exec("cd '{$PROJ_mount_point}/{$mainFolder}' && {$cmd} ", $filesWithPerms);
if(V::get('DBG', '', $_GET, 'int') > 2){echo'$filesWithPerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($filesWithPerms);echo'';}
$filesWithPermsTree = array();
$lastName = '';
$folderParent = '';
foreach ($filesWithPerms as $line) {
if (substr($line, 0, 1) == '-' || substr($line, 0, 1) == 'd') {// file name
$fileParts = array();
$filePartsArr = explode(' ', $line);
$lastInd = 0;
foreach ($filePartsArr as $vPart) {
if ($lastInd > 7) {// file name
$fileParts[8] = ($lastInd > 8)? "{$fileParts[8]} {$vPart}" : $vPart;
$lastInd++;
}
else if (!empty($vPart) || $vPart === '0') {
$fileParts[] = $vPart;
$lastInd++;
}
}
if (end($fileParts) == '..' || (end($fileParts) == '.' && $folderParent)) {
$lastName = '..';
continue;
}
$file = new stdClass();
if (!isset($fileParts[8])) {
echo'Error parse file name (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('line'=>$line, 'fileParts'=>$fileParts));echo'';
//continue;
}
$file->name = end($fileParts);
$file->path = array();
if ($folderParent) $file->path[] = $folderParent;
$file->path[] = end($fileParts);
$file->path = implode('/', $file->path);
//$file->owner = $fileParts[2];
//$file->group = $fileParts[3];
//$file->perms = $fileParts[0];
$file->isDir = (substr($line, 0, 1) == 'd');
$file->permsExt = array();
$filesWithPermsTree[$file->name] = $file;
$lastName = $file;
}
else if (substr($line, 0, 1) == ' ') {// extended perm line
if ($lastName == '..') {
continue;
}
$filesWithPermsTree[$file->name]->permsExt[] = trim($line);
}
else if (substr($line, 0, 2) == './' && substr($line, -1) == ':') {// folder
$folderParent = substr($line, 2, -1);
}
else if (substr($line, 0, 5) == 'total') {
continue;
}
else if (empty($line)) {
$folderParent = '';
continue;
}
}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'$filesWithPermsTree (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($filesWithPermsTree);echo'';}
// check perms
/*
files:
W read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown
W read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity
R read, execute, readattr, readextattr, readsecurity
dir:
W list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown,file_inherit,directory_inherit
W list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity, file_inherit,directory_inherit
R list, search, readattr, readextattr, readsecurity, file_inherit,directory_inherit
*/
$cmdList = array();
foreach ($filesWithPermsTree as $kFileName => $vFile) {
if (false) {
// TODO: $kFileName == '_PISMA' - readonly
// TODO: $vFile->path => _PISMA/...
}
else {
$cmdFile = self::fixFilePerms($vFile, $requirePermsExt, "{$PROJ_mount_point}/{$mainFolder}", $r);
if (!empty($cmdFile)) {
foreach ($cmdFile as $vCmd) {
$cmdList[] = $vCmd;
}
}
}
}
return $cmdList;
}
public static function fixFilePerms($vFile, $requirePermsExt, $mainPath, $r) {
//trigger_error("fixFilePerms: " . json_encode($vFile), E_USER_NOTICE);
$cmdList = array();
$vReqPermsExt = array();
foreach ($requirePermsExt as $kPermObj => $vPerms) {
$vReqPermsExt[$kPermObj] = array();
foreach ($vPerms as $vPerm) {
if ($vFile->isDir) {
if ($vPerm == 'read') {
$vReqPermsExt[$kPermObj]['list'] = 0;
$vReqPermsExt[$kPermObj]['search'] = 0;
$vReqPermsExt[$kPermObj]['readattr'] = 0;
$vReqPermsExt[$kPermObj]['readextattr'] = 0;
$vReqPermsExt[$kPermObj]['readsecurity'] = 0;
$vReqPermsExt[$kPermObj]['file_inherit'] = 0;
$vReqPermsExt[$kPermObj]['directory_inherit'] = 0;
}
else if ($vPerm == 'write') {
$vReqPermsExt[$kPermObj]['add_file'] = 0;
$vReqPermsExt[$kPermObj]['add_subdirectory'] = 0;
$vReqPermsExt[$kPermObj]['delete_child'] = 0;
$vReqPermsExt[$kPermObj]['writeattr'] = 0;
$vReqPermsExt[$kPermObj]['writeextattr'] = 0;
$vReqPermsExt[$kPermObj]['writesecurity'] = 0;
$vReqPermsExt[$kPermObj]['chown'] = 0;
}
}
else {
if ($vPerm == 'read') {
$vReqPermsExt[$kPermObj]['read'] = 0;
$vReqPermsExt[$kPermObj]['execute'] = 0;
$vReqPermsExt[$kPermObj]['readattr'] = 0;
$vReqPermsExt[$kPermObj]['readextattr'] = 0;
$vReqPermsExt[$kPermObj]['readsecurity'] = 0;
}
else if ($vPerm == 'write') {
$vReqPermsExt[$kPermObj]['write'] = 0;
$vReqPermsExt[$kPermObj]['append'] = 0;
$vReqPermsExt[$kPermObj]['writeattr'] = 0;
$vReqPermsExt[$kPermObj]['writeextattr'] = 0;
$vReqPermsExt[$kPermObj]['writesecurity'] = 0;
$vReqPermsExt[$kPermObj]['chown'] = 0;
}
}
}
}
$permsToRemove = array();
foreach ($vFile->permsExt as $vPermExtLine) {
$vPermExtArr = explode(' ', $vPermExtLine);
$vPermExt = new stdClass();
$vPermExt->nr = trim($vPermExtArr[0], ' :');
$vPermExt->permObj = $vPermExtArr[1];
$vPermExt->perms = '';
if (count($vPermExtArr) == 4) {
$vPermExt->perms = explode(',', $vPermExtArr[3]);
}
else if (count($vPermExtArr) == 5 && $vPermExtArr[2] == 'inherited') {
$vPermExt->perms = explode(',', $vPermExtArr[4]);
}
else {
echo "Error: Perm Ext Line format! ({$vPermExtLine})";
continue;
}
$permFound = false;
foreach ($vReqPermsExt as $kPermObj => $vPerms) {
if (false !== strpos($vPermExtLine, $kPermObj)) {
foreach ($vPerms as $kPerm => $vPermChecked) {
if (in_array($kPerm, $vPermExt->perms)) {
$vReqPermsExt[$kPermObj][$kPerm] = 1;
$permFound = true;
}
}
}
}
if (!$permFound) {
$permsToRemove[] = $vPermExt->nr;
}
//echo'$vReqPermsExt('.$vFile->name.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($vReqPermsExt);echo'';
}
if (!empty($permsToRemove)) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'TO-rm('.$r->ID.'): $permsToRemove('.$vFile->name.') isDir('.$vFile->isDir.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('permsToRemove'=>$permsToRemove, 'vFile->permsExt'=>$vFile->permsExt, 'r'=>$r));echo'';}
$permsToRemove = array_reverse($permsToRemove);
foreach ($permsToRemove as $vPermInd) {
$cmdList []= "chmod -a# {$vPermInd} '{$mainPath}/{$vFile->path}' ";
}
}
$permsToAdd = array();
foreach ($vReqPermsExt as $kPermObj => $vPerms) {
foreach ($vPerms as $kPerm => $vPermChecked) {
if (!$vPermChecked) {
$permsToAdd[$kPermObj][$kPerm] = 1;
}
}
}
if (!empty($permsToAdd)) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'TO-add('.$r->ID.'): $permsToAdd('.$vFile->name.') isDir('.$vFile->isDir.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('permsToAdd'=>$permsToAdd, 'vFile->permsExt'=>$vFile->permsExt, 'r'=>$r));echo'';}
foreach ($permsToAdd as $kPermObj => $vPerms) {
$cmdList []= "chmod +a \"{$kPermObj} allow " . implode(',', array_keys($vPerms)) . "\" '{$mainPath}/{$vFile->path}' ";
}
}
return $cmdList;
}
/**
* @returns array - last modified project ids.
*/
public static function fixLastModifiedByFiles() {// TODO: RMME
if(V::get('DBG', '', $_GET, 'int') > 0){echo'fixLastModifiedByFiles (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("fixLastModifiedByFiles");echo'';}
/*
* $ man find:
-newer file
True if the current file has a more recent last modification time than file.
-newerXY file
True if the current file has a more recent last access time (X=a), inode creation time (X=B), change time (X=c),
or modification time (X=m) than the last access time (Y=a), inode creation time (Y=B), change time (Y=c), or mod-
ification time (Y=m) of file. In addition, if Y=t, then file is instead interpreted as a direct date specifica-
tion of the form understood by cvs(1). Note that -newermm is equivalent to -newer.
*
* $ man chmod:
-i Removes the 'inherited' bit from all entries in the named file(s) ACLs.
*
* chmod -a "admin allow write" file1 # remove line
* chmod -a# 1 file1 # remove line at position 1
*
* chmod +a nie zmienia modify date: find . -newermt '2013-10-07 ...'
*/
// find /Library/Server/Web/Data/Sites/Default/PLIKI/PROJEKTY -newermt '2013-10-07 16:20'
$PROJ_mount_point = FoldersConfig::get('IN7_MK_BAZA_DYSTRYBUCJI_COLUMN', 'mount_point');
$PISMA_mount_point = FoldersConfig::get('IN7_DZIENNIK_KORESP_COLUMN', 'mount_point');
$foundProjectIds = array();
$lastRunDate = self::getLastRunDate();
exec("cd {$PROJ_mount_point}; find . -newermt '{$lastRunDate}' ", $foundPaths);
if (!empty($foundPaths)) {
foreach ($foundPaths as $path) {
$path = ltrim($path, './');
$folder = explode('/', $path);
$folder = reset($folder);
$projId = explode('.', $folder);
$projId = reset($projId);
if (is_numeric($projId)) {
$foundProjectIds[$projId] = $folder;
}
}
}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'foundPaths (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$PROJ_mount_point}\n";print_r($foundPaths);echo'';}
if(V::get('DBG', '', $_GET, 'int') > 0){echo'foundProjectIds (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$PROJ_mount_point}\n";print_r($foundProjectIds);echo'';}
if (!empty($foundProjectIds)) {
$sql = "
select p.`ID`
, p.`L_APPOITMENT_USER`
, p.`A_ADM_COMPANY`
, p.`A_CLASSIFIED`
, pp.`L_APPOITMENT_USER` as PARENT_L_APPOITMENT_USER
from IN7_MK_BAZA_DYSTRYBUCJI as p
left join IN7_MK_BAZA_DYSTRYBUCJI as pp on (pp.ID=p.P_ID)
where p.`ID` in (" . implode(',', array_keys($foundProjectIds)) . ")
";
$rows = DB::getPDO()->fetchAll($sql);
foreach ($rows as $row) {
$r = (object)$row;
$mainFolder = $foundProjectIds[$r->ID];
$cmdList = self::fixProject($r, $mainFolder, $PROJ_mount_point);
if (!empty($cmdList)) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'$cmdList P('.$r->ID.') total('.count($cmdList).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
} else {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'$cmdList P('.$r->ID.') total('.count($cmdList).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
}
}
}
return array_keys($foundProjectIds);
}
public static function fixLastModifiedByDB($fixedProjIds) {// TODO: RMME
if(V::get('DBG', '', $_GET, 'int') > 0){echo'fixLastModifiedByDB (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("fixLastModifiedByDB");echo'';}
$sqlWhereAdd = '';
if (!empty($fixedProjIds)) {
$sqlWhereAdd = " and p.`ID` not in (" . implode(',', $fixedProjIds) . ") ";
}
$lastRunDate = self::getLastRunDate();
$sql = "
select p.`ID`
, p.`L_APPOITMENT_USER`
, p.`A_ADM_COMPANY`
, p.`A_CLASSIFIED`
, pp.`L_APPOITMENT_USER` as PARENT_L_APPOITMENT_USER
from IN7_MK_BAZA_DYSTRYBUCJI as p
left join IN7_MK_BAZA_DYSTRYBUCJI as pp on (pp.ID=p.P_ID)
where
( p.`A_RECORD_UPDATE_DATE`>'{$lastRunDate}'
or p.`A_RECORD_CREATE_DATE`>'{$lastRunDate}'
)
{$sqlWhereAdd}
";
if(V::get('DBG', '', $_GET, 'int') > 0){echo'sql (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'';}
$projectList = array_map(function ($row) {
return (object)$row;
}, DB::getPDO()->fetchAllByKey($sql, 'ID'));
if(V::get('DBG', '', $_GET, 'int') > 1){echo'projectList (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($projectList);echo'';}
}
public static function getLastRunDate() {// TODO: RMME
if (($argFromDate = V::get('_fromDate', '', $_GET)) != '') {
// Format: 2013-10-07 23:46
if (strlen($argFromDate) == 16
&& substr($argFromDate, 4, 1) == '-'
&& substr($argFromDate, 7, 1) == '-'
&& substr($argFromDate, 10, 1) == '-'
&& substr($argFromDate, 13, 1) == ':'
&& is_numeric(str_replace(array('-', ':'), '', $argFromDate))
) {
$lastRunDate = mktime(substr($argFromDate, 11, 2), substr($argFromDate, 14, 2), 0, substr($argFromDate, 5, 2), substr($argFromDate, 8, 2), substr($argFromDate, 0, 4));
$lastRunDate = date("Y-m-d H:i", $lastRunDate);
}
}
if (!$lastRunDate) {
$lastRunDate = mktime(date("H") - 1, date("i"), date("s"), date("n"), date("j"), date("Y"));
$lastRunDate = date("Y-m-d H:i", $lastRunDate);
}
//$lastRunDate = '2013-09-01 01:00';
echo'lastRunDate (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($lastRunDate);echo'';
return $lastRunDate;
}
public static function usersAction() {
$task = self::getTaskNewerUsers();
$users = self::getUsersNewerThen($task->A_LAST_SYNC);
echo'$users (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($users);echo'';
self::saveTask(-2);
}
public static function usersAllAction() {
/*
* DBU - DB User LDU - LDAP User
* DBG - DB Group LDG - LDAP Group
*
* DBU - ADMIN_USERS
* DBG - CRM_LISTA_ZASOBOW where TYPE in('STANOWISKO','PODMIOT','DZIAL')// TODO: GRUPA_PROJEKTOWA - ldap nested group?
*
* 1. fetch DB Users
* ? only active users (A_STATUS == 'NORMAL')
* 2. fetch LDAP Users
*
* DBU.ADM_ACCOUNT == LDU.uid
* DBG.A_LDAP_GID == LDG.gidNumber
*
* TODO: $group createLdapGroup()
*
*/
Lib::loadClass('UsersHelper');
$users = self::getUsersAll();
echo'users count('.count($users).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($users);echo'';
$allLdapUsers = UsersHelper::getLDAPUsersAll();
$ldapUsers = array();
foreach ($allLdapUsers as $vLdapUser) {
$ldapUsers[$vLdapUser->uid] = $vLdapUser;
}
unset($allLdapUsers);
echo'ldapUsers count('.count($ldapUsers).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($ldapUsers);echo'';
foreach ($users as $kLogin => $vUser) {
if ($vUser->A_STATUS == 'NORMAL') {
if (array_key_exists($vUser->ADM_ACCOUNT, $ldapUsers)) {
echo 'fixLastModifiedFiles (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("fixLastModifiedFiles");echo'';}
$confTblName = "{$task->TBL_NAME}_COLUMN";
$TBL_mount_point = FoldersConfig::get($confTblName, 'mount_point');
$record = null;
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, $record);
if (!$uploader->setConfig($folderConf, $errMsg)) {
trigger_error("Error: folders config!", E_USER_NOTICE);
die("Error: folders config!");
}
$hasRecordOwnFolder = $uploader->hasRecordOwnFolder();
$foundTblFiles = array();
if(V::get('DBG', '', $_GET, 'int') > 0){echo'$lastRunDate (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($task->A_LAST_SYNC);echo'';}
//exec("cd {$TBL_mount_point}; find . -newermt '{$task->A_LAST_SYNC}' ", $foundPaths);
$filesWithPerms = array();
$cmd = "cd {$TBL_mount_point}; find . -newermt '{$task->A_LAST_SYNC}' -type f -exec ls -le '{}' \;";
exec($cmd, $filesWithPerms);// TODO: head -{$lastTotal + 10000}| tail
if (!empty($filesWithPerms)) {
$filesWithPermsTree = array();
$lastName = '';
foreach ($filesWithPerms as $line) {
if (substr($line, 0, 1) == '-') {// file name
$fileParts = array();
$filePartsArr = explode(' ', $line);
$lastInd = 0;
foreach ($filePartsArr as $vPart) {
if ($lastInd > 7) {// file name
$fileParts[8] = ($lastInd > 8)? "{$fileParts[8]} {$vPart}" : $vPart;
$lastInd++;
}
else if (!empty($vPart) || $vPart === '0') {
$fileParts[] = $vPart;
$lastInd++;
}
}
$file = new stdClass();
if (!isset($fileParts[8])) {
echo'Error parse file name (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('line'=>$line, 'fileParts'=>$fileParts));echo'';
//continue;
}
$file->name = end($fileParts);
$file->path = end($fileParts);
//$file->owner = $fileParts[2];
//$file->group = $fileParts[3];
//$file->perms = $fileParts[0];
$file->isDir = (substr($line, 0, 1) == 'd');
$file->permsExt = array();
$filesWithPermsTree[$file->name] = $file;
$lastName = $file->name;
}
else if (substr($line, 0, 1) == ' ') {// extended perm line
if ($lastName == '..') {
continue;
}
$filesWithPermsTree[$file->name]->permsExt[] = trim($line);
}
else {// parse error
$lastName = '..';
}
}
foreach ($filesWithPermsTree as $vFile) {
$vFile->path = ltrim($vFile->path, './');
$vFile->path = explode('/', $vFile->path);
$vFile->recordFolder = array_shift($vFile->path);// $vFile->projectFolder -> recordFolder
$vFile->path = implode('/', $vFile->path);
// TODO: _getTableIdFromFolderName($task->TBL_NAME, $vFile->recordFolder);
$tblId = 0;
if ($hasRecordOwnFolder) {
$tblId = explode('.', $vFile->recordFolder);
$tblId = reset($tblId);
}
else {
$tblId = explode('.', $vFile->path);
$tblId = reset($tblId);
}
if (is_numeric($tblId) && $tblId > 0) {
$foundTblFiles[$tblId][] = $vFile;
}
}
}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'filesWithPerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$TBL_mount_point}\n";print_r($filesWithPerms);echo'';}
if(V::get('DBG', '', $_GET, 'int') > 0){echo'foundTblFiles (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): '."path: {$TBL_mount_point}\n";print_r($foundTblFiles);echo'';}
if (!empty($foundTblFiles)) {
$rowsIds = array_keys($foundTblFiles);
$sql = "
select t.`ID`
, t.`L_APPOITMENT_USER`
, t.`A_ADM_COMPANY`
, t.`A_CLASSIFIED`
-- , pt.`L_APPOITMENT_USER` as PARENT_L_APPOITMENT_USER
from `{$task->TBL_NAME}` as t
-- left join `{$task->TBL_NAME}` as pt on (pt.ID=t.P_ID)
where t.`ID` in (" . implode(',', $rowsIds) . ")
";
$rows = DB::getPDO()->fetchAll($sql);
foreach ($rows as $row) {
$r = (object)$row;
$requirePermsExt = $this->_getRequiredPermsExtByRecord($r);
foreach ($foundTblFiles[$r->ID] as $vFile) {
$cmdList = $this->_fixFilePerms($vFile, $requirePermsExt, "{$TBL_mount_point}/{$vFile->recordFolder}", $r);
if (!empty($cmdList)) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'$cmdList P('.$r->ID.') total('.count($cmdList).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
foreach ($cmdList as $vCmd) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Exec-cmdList-P('.$r->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($vCmd);echo'';}
exec($vCmd, $out, $outValue);
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Done-cmdList-P('.$r->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($outValue, $out));echo'';}
if ($outValue != 0) {
trigger_error("Error-cmd: {$vCmd}", E_USER_NOTICE);
}
}
} else {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'$cmdList is empty P('.$r->ID.') total('.count($cmdList).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("empty");echo'';}
}
}
}
}
}
public function _getRequiredPermsExtByRecord($record) {
// TODO: need to check if user is correct in field L_APPOITMENT_USER
$requirePermsExt = array();
if (!$record->L_APPOITMENT_USER && !$record->A_ADM_COMPANY) {// no owner, no write group
// TODO: group PODMIOT
$requirePermsExt["group:workgroup"] = array('write', 'read');
}
else {
if ($record->L_APPOITMENT_USER) {
if ($this->_isActiveUser($record->L_APPOITMENT_USER)) {
$requirePermsExt["user:{$record->L_APPOITMENT_USER}"] = array('write', 'read');
} else {
// TODO: trigger error $record->L_APPOITMENT_USER is not active user!
}
}
if (!empty($record->A_ADM_COMPANY) && $record->A_ADM_COMPANY == $record->A_CLASSIFIED) {
$requirePermsExt["group:{$record->A_ADM_COMPANY}"] = array('read', 'write');
}
else if (empty($record->A_ADM_COMPANY) && empty($record->A_CLASSIFIED)) {
$requirePermsExt["group:workgroup"] = array('write', 'read');
}
else {
if ($record->A_ADM_COMPANY) {
$requirePermsExt["group:{$record->A_ADM_COMPANY}"] = array('write');
}
if ($record->A_CLASSIFIED) {
$requirePermsExt["group:{$record->A_CLASSIFIED}"] = array('read');
}
}
}
// add parent owner
if (!empty($record->PARENT_L_APPOITMENT_USER) && $record->PARENT_L_APPOITMENT_USER != $record->L_APPOITMENT_USER) {
if ($this->_isActiveUser($record->PARENT_L_APPOITMENT_USER)) {
$requirePermsExt["user:{$record->PARENT_L_APPOITMENT_USER}"] = array('write', 'read');
} else {
// TODO: trigger error $record->PARENT_L_APPOITMENT_USER is not active user!
}
}
// add user:_www perms read, write
$requirePermsExt["user:_www"] = array('write', 'read');
return $requirePermsExt;
}
private function _fixFilePerms($vFile, $requirePermsExt, $mainPath, $r) {
//trigger_error("fixFilePerms: " . json_encode($vFile), E_USER_NOTICE);
$cmdList = array();
$vReqPermsExt = array();
foreach ($requirePermsExt as $kPermObj => $vPerms) {
$vReqPermsExt[$kPermObj] = array();
foreach ($vPerms as $vPerm) {
if ($vFile->isDir) {
if ($vPerm == 'read') {
$vReqPermsExt[$kPermObj]['list'] = 0;
$vReqPermsExt[$kPermObj]['search'] = 0;
$vReqPermsExt[$kPermObj]['readattr'] = 0;
$vReqPermsExt[$kPermObj]['readextattr'] = 0;
$vReqPermsExt[$kPermObj]['readsecurity'] = 0;
$vReqPermsExt[$kPermObj]['file_inherit'] = 0;
$vReqPermsExt[$kPermObj]['directory_inherit'] = 0;
}
else if ($vPerm == 'write') {
$vReqPermsExt[$kPermObj]['add_file'] = 0;
$vReqPermsExt[$kPermObj]['add_subdirectory'] = 0;
$vReqPermsExt[$kPermObj]['delete_child'] = 0;
$vReqPermsExt[$kPermObj]['writeattr'] = 0;
$vReqPermsExt[$kPermObj]['writeextattr'] = 0;
$vReqPermsExt[$kPermObj]['writesecurity'] = 0;
$vReqPermsExt[$kPermObj]['chown'] = 0;
}
}
else {
if ($vPerm == 'read') {
$vReqPermsExt[$kPermObj]['read'] = 0;
$vReqPermsExt[$kPermObj]['execute'] = 0;
$vReqPermsExt[$kPermObj]['readattr'] = 0;
$vReqPermsExt[$kPermObj]['readextattr'] = 0;
$vReqPermsExt[$kPermObj]['readsecurity'] = 0;
}
else if ($vPerm == 'write') {
$vReqPermsExt[$kPermObj]['write'] = 0;
$vReqPermsExt[$kPermObj]['append'] = 0;
$vReqPermsExt[$kPermObj]['writeattr'] = 0;
$vReqPermsExt[$kPermObj]['writeextattr'] = 0;
$vReqPermsExt[$kPermObj]['writesecurity'] = 0;
$vReqPermsExt[$kPermObj]['chown'] = 0;
}
}
}
}
$permsToRemove = array();
foreach ($vFile->permsExt as $vPermExtLine) {
$vPermExtArr = explode(' ', $vPermExtLine);
$vPermExt = new stdClass();
$vPermExt->nr = trim($vPermExtArr[0], ' :');
$vPermExt->permObj = $vPermExtArr[1];
$vPermExt->perms = '';
if (count($vPermExtArr) == 4) {
$vPermExt->perms = explode(',', $vPermExtArr[3]);
}
else if (count($vPermExtArr) == 5 && $vPermExtArr[2] == 'inherited') {
$vPermExt->perms = explode(',', $vPermExtArr[4]);
}
else {
echo "Error: Perm Ext Line format! ({$vPermExtLine})";
continue;
}
$permFound = false;
foreach ($vReqPermsExt as $kPermObj => $vPerms) {
if (false !== strpos($vPermExtLine, $kPermObj)) {
foreach ($vPerms as $kPerm => $vPermChecked) {
if (in_array($kPerm, $vPermExt->perms)) {
$vReqPermsExt[$kPermObj][$kPerm] = 1;
$permFound = true;
}
}
}
}
if (!$permFound) {
$permsToRemove[] = $vPermExt->nr;
}
//echo'$vReqPermsExt('.$vFile->name.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($vReqPermsExt);echo'';
}
if (!empty($permsToRemove)) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'TO-rm('.$r->ID.'): $permsToRemove('.$vFile->name.') isDir('.$vFile->isDir.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('permsToRemove'=>$permsToRemove, 'vFile->permsExt'=>$vFile->permsExt, 'r'=>$r));echo'';}
$permsToRemove = array_reverse($permsToRemove);
foreach ($permsToRemove as $vPermInd) {
$cmdList []= "chmod -a# {$vPermInd} '{$mainPath}/{$vFile->path}' ";
}
}
$permsToAdd = array();
foreach ($vReqPermsExt as $kPermObj => $vPerms) {
foreach ($vPerms as $kPerm => $vPermChecked) {
if (!$vPermChecked) {
$permsToAdd[$kPermObj][$kPerm] = 1;
}
}
}
if (!empty($permsToAdd)) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'TO-add('.$r->ID.'): $permsToAdd('.$vFile->name.') isDir('.$vFile->isDir.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('permsToAdd'=>$permsToAdd, 'vFile->permsExt'=>$vFile->permsExt, 'r'=>$r));echo'';}
foreach ($permsToAdd as $kPermObj => $vPerms) {
$cmdList []= "chmod +a \"{$kPermObj} allow " . implode(',', array_keys($vPerms)) . "\" '{$mainPath}/{$vFile->path}' ";
}
}
return $cmdList;
}
private function _isActiveUser($usrLogin) {
$activeLoginList = $this->_fetchActiveLoginList();
return in_array($usrLogin, $activeLoginList);
}
public function _fetchActiveLoginList() {
if (!is_array($this->_activeLoginList)) {
$this->_activeLoginList = array();
$sql = "
select u.`ADM_ACCOUNT`
from `ADMIN_USERS` as u
where u.`A_STATUS` = 'NORMAL'
";
$this->_activeLoginList = DB::getPDO()->fetchValuesList($sql);
}
return $this->_activeLoginList;
}
private function _saveTask($tblName, $tblId, $taskDone = 1, $result = null) {
$sqlResult = ($result)
? " , s.`A_SYNC_RESULT` = " . DB::getPDO()->quote( json_encode($result) )
: '';
$sql = "
update `{$this->_syncTblName}` as s
set
s.`A_LAST_SYNC`=NOW()
, s.`A_SYNCHRONIZED`={$taskDone}
{$sqlResult}
where s.`TBL_ID`={$tblId} and s.`TBL_NAME`='{$tblName}'
";
DB::getPDO()->execSql($sql);
}
public function executeTask($tblName, $tblId) {
if (!$this->_tbls) return;
$task = $this->_getTask($tblName, $tblId);
if (!$task) return;
$this->_executeTask($task);
$this->_saveTask($task->TBL_NAME, $task->TBL_ID);
return $task;
}
public function nextTaskAction($tblName) {
if (!$this->_tbls) return;
$task = $this->_getTask($tblName);
if (!$task) return;
$this->_executeTask($task);
/*
if (isset($task->A_SYNC_RESULT->total)
&& isset($task->A_SYNC_RESULT->lastDone)
&& $task->A_SYNC_RESULT->lastDone < $task->A_SYNC_RESULT->total
) {
$this->_saveTask($task->TBL_NAME, $task->TBL_ID, 0, $task->A_SYNC_RESULT);
} else {
$this->_saveTask($task->TBL_NAME, $task->TBL_ID);
}
*/
$this->_saveTask($task->TBL_NAME, $task->TBL_ID);
return $task;
}
private function _getTask($tblName, $tblId = null) {
$task = null;
$recordFieldList = $this->_getRecordFieldList($tblName);
$recordFieldList[] = 'L_APPOITMENT_USER';
$recordFieldList[] = 'A_ADM_COMPANY';
$recordFieldList[] = 'A_CLASSIFIED';
$sqlRecordFields = array();
foreach ($recordFieldList as $fldName) {
$sqlRecordFields[] = "t.`{$fldName}` as t__{$fldName}";
}
$sqlRecordFields = implode(',', $sqlRecordFields);
$sqlTblId = "and s.`TBL_ID`!=-1";
if ($tblId > 0) $sqlTblId = "and s.`TBL_ID`='{$tblId}'";
$sql = "
select s.*
, {$sqlRecordFields}
-- , pt.`L_APPOITMENT_USER` as p__PARENT_L_APPOITMENT_USER
from `{$this->_syncTblName}` as s
left join `{$tblName}` as t on(t.`ID`=s.`TBL_ID`)
-- left join `{$tblName}` as pt on(pt.`ID`=t.`P_ID`)
where
s.`TBL_NAME`='{$tblName}'
{$sqlTblId}
and s.`A_SYNCHRONIZED`=0
and s.`A_POMIN_SYNC`=0
order by s.`A_LAST_SYNC` asc, s.`ID` asc
limit 1
";
$row = DB::getPDO()->fetchFirst($sql);
if ($row) {
$r = (object)$row;
$r->A_SYNC_RESULT = (!$r->A_SYNC_RESULT)? new stdClass() : json_decode($r->A_SYNC_RESULT);
$task = $r;
$task->record = new stdClass();
foreach ($recordFieldList as $fldName) {
$aliasFldName = "t__{$fldName}";
$task->record->{$fldName} = $task->{$aliasFldName};
unset($task->{$aliasFldName});
}
}
return $task;
}
private function _getRecordFieldList($tblName) {
if (empty($this->_tbls[$tblName])) return;
$conf = $this->_tbls[$tblName];
$fldNames = array();
$fldName = V::get("LOOKAT_FOLDER_VARNAME", '', $conf);
$fldName = trim($fldName);
if (!empty($fldName)) $fldNames[$fldName] = true;
for ($i = 1; $i < 5; $i++) {
$fldName = V::get("LOOKAT_FOLDER_VARNAME{$i}", '', $conf);
$fldName = trim($fldName);
if (!empty($fldName)) $fldNames[$fldName] = true;
$fldName = V::get("DEST_FOLDER_VARNAME{$i}", '', $conf);
$fldName = trim($fldName);
if (!empty($fldName)) $fldNames[$fldName] = true;
}
if (!in_array('ID', $fldNames)) {
$fldNames['ID'] = true;
}
return array_keys($fldNames);
}
private function _executeTask($task) {
if(V::get('DBG', '', $_GET, 'int') > 0){echo'executeTask (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($task);echo'';}
$DBG_TIME = false;
$dbgTime = new stdClass();
$dbgTime->startTime = microtime(true);
$dbgTime->lastTime = $dbgTime->startTime;
$confTblName = "{$task->TBL_NAME}_COLUMN";
$TBL_mount_point = FoldersConfig::get($confTblName, 'mount_point');
$record = $task->record;
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, $record);
$errMsg = '';
if (!$uploader->setConfig($folderConf, $errMsg)) {
trigger_error("Error: folders config!", E_USER_NOTICE);
die("Error: folders config!");
}
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):" . __LINE__ . ":_executeTask({$task->TBL_NAME}/{$task->TBL_ID}]: after-FileUploader->setConfig" . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
$uploader->findFolder();
$mainFolder = $uploader->getDestFolder();
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):" . __LINE__ . ":_executeTask({$task->TBL_NAME}/{$task->TBL_ID}]:time after-FileUploader->getDestFolder" . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
if(V::get('DBG', '', $_GET, 'int') > 2){echo'generated folderName('.$record->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';var_dump($uploader);echo'';}
if (!$mainFolder) {
$mainFolder = $uploader->generateFolderName();
$mainFolderPath = rtrim($TBL_mount_point, '/') . '/' . $mainFolder;
if(V::get('DBG', '', $_GET, 'int') > 2){echo'generated folderName('.$record->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($mainFolder, $mainFolderPath));echo'';}
@mkdir($mainFolderPath, 0770, true);
@chmod($mainFolderPath, 0770);
if (!file_exists($mainFolderPath)) {
trigger_error("Error: Nie udało się utworzyć folderu! ({$mainFolder})", E_USER_NOTICE);
return false;
}
$requirePermsExt = $this->_getRequiredPermsExtByRecord($record);
$file = new stdClass();
$file->name = '.';
$file->path = '.';
//$file->owner = '';
//$file->group = '';
//$file->perms = '';
$file->isDir = true;
$file->permsExt = array();
$cmdList = $this->_fixFilePerms($file, $requirePermsExt, "{$TBL_mount_point}/{$mainFolder}", $record);
if(V::get('DBG', '', $_GET, 'int') > 0){echo'cmdList-P('.$record->ID.') fixFilePerms (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($cmdList);echo'';}
}
else {
$cmdList = $this->_fixRecord($record, $uploader, $mainFolder, $TBL_mount_point, $task);
}
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):" . __LINE__ . ":_executeTask({$task->TBL_NAME}/{$task->TBL_ID}]: after-generate cmdList - mainFolder(" . (($mainFolder)? 1 : 0) . ")" . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
if (!empty($cmdList)) {
foreach ($cmdList as $vCmd) {
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Exec-cmdList-P('.$record->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($vCmd);echo'';}
exec($vCmd, $out, $outValue);
if(V::get('DBG', '', $_GET, 'int') > 1){echo'Done-cmdList-P('.$record->ID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($outValue, $out));echo'';}
if ($outValue != 0) {
trigger_error("Error-cmd: {$vCmd}", E_USER_NOTICE);
}
}
}
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):" . __LINE__ . ":_executeTask({$task->TBL_NAME}/{$task->TBL_ID}]: after-executed cmdList " . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
if(V::get('DBG', '', $_GET, 'int') > 0){echo'';print_r("executeTask finished OK");echo'';}
}
public function _fixRecord($r, $uploader, $mainFolder, $TBL_mount_point, &$task) {
$requirePermsExt = $this->_getRequiredPermsExtByRecord($r);
$DBG_TIME = false;
$dbgTime = new stdClass();
$dbgTime->startTime = microtime(true);
$dbgTime->lastTime = $dbgTime->startTime;
$filesWithPerms = array();
if ($uploader->hasRecordOwnFolder()) {
$cmd = " ls -Rlea . ";
$cmd = "cd '{$TBL_mount_point}/{$mainFolder}' && {$cmd} ";
exec($cmd, $filesWithPerms);
}
else {
$lookGlob = $uploader->getFileSearchRegex();
$cmd = " ls -Rlea {$lookGlob} ";
$cmd = "cd '{$TBL_mount_point}/{$mainFolder}' && {$cmd} ";
exec($cmd, $filesWithPerms);
}
//echo "\n-----------------------\n";
//echo "filesWithPerms: ";print_r($filesWithPerms);echo "\n";
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):_fixRecord: cd '{$TBL_mount_point}/{$mainFolder}' && {$cmd} " . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
$filesWithPermsTree = array();
$lastName = '';
$folderParent = '';
foreach ($filesWithPerms as $line) {
if (substr($line, 0, 1) == '-' || substr($line, 0, 1) == 'd') {// file name
$fileParts = array();
$filePartsArr = explode(' ', $line);
$lastInd = 0;
foreach ($filePartsArr as $vPart) {
if ($lastInd > 7) {// file name
$fileParts[8] = ($lastInd > 8)? "{$fileParts[8]} {$vPart}" : $vPart;
$lastInd++;
}
else if (!empty($vPart) || $vPart === '0') {
$fileParts[] = $vPart;
$lastInd++;
}
}
if (end($fileParts) == '..' || (end($fileParts) == '.' && $folderParent)) {
$lastName = '..';
continue;
}
$file = new stdClass();
if (!isset($fileParts[8])) {
echo'Error parse file name (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array('line'=>$line, 'fileParts'=>$fileParts));echo'';
//continue;
}
$file->name = end($fileParts);
$file->path = array();
if ($folderParent) $file->path[] = $folderParent;
$file->path[] = end($fileParts);
$file->path = implode('/', $file->path);
//$file->owner = $fileParts[2];
//$file->group = $fileParts[3];
//$file->perms = $fileParts[0];
$file->isDir = (substr($line, 0, 1) == 'd');
$file->permsExt = array();
$filesWithPermsTree[$file->name] = $file;
$lastName = $file;
}
else if (substr($line, 0, 1) == ' ') {// extended perm line
if ($lastName == '..') {
continue;
}
$filesWithPermsTree[$file->name]->permsExt[] = trim($line);
}
else if (substr($line, 0, 2) == './' && substr($line, -1) == ':') {// folder
$folderParent = substr($line, 2, -1);
}
else if (substr($line, 0, 5) == 'total') {
continue;
}
else if (empty($line)) {
$folderParent = '';
continue;
}
}
//echo "filesWithPermsTree: ";print_r($filesWithPermsTree);echo "\n";
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):_fixRecord: parse cmd output" . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
if(V::get('DBG', '', $_GET, 'int') > 1){echo'$filesWithPermsTree (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($filesWithPermsTree);echo'';}
// check perms
/*
files:
W read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown
W read,write,execute,append,readattr,writeattr,readextattr,writeextattr,readsecurity
R read, execute, readattr, readextattr, readsecurity
dir:
W list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown,file_inherit,directory_inherit
W list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity, file_inherit,directory_inherit
R list, search, readattr, readextattr, readsecurity, file_inherit,directory_inherit
*/
$cmdList = array();
foreach ($filesWithPermsTree as $kFileName => $vFile) {
if (false) {
// TODO: $kFileName == '_PISMA' - readonly
// TODO: $vFile->path => _PISMA/...
}
else {
$cmdFile = $this->_fixFilePerms($vFile, $requirePermsExt, "{$TBL_mount_point}/{$mainFolder}", $r);
if (!empty($cmdFile)) {
foreach ($cmdFile as $vCmd) {
$cmdList[] = $vCmd;
}
}
}
}
//echo "cmdList: ";print_r($cmdList);echo "\n";
//echo "\n-----------------------\n";
if ($DBG_TIME) {
$dbgTime->curTime = microtime(true);
echo "DBG:(" . number_format($dbgTime->curTime - $dbgTime->lastTime, 6) . "s):_fixRecord: end" . "\n";
$dbgTime->lastTime = $dbgTime->curTime;
}
return $cmdList;
}
}
?>