0.4.7.2
This commit is contained in:
155
Yuba.php
155
Yuba.php
@@ -1,17 +1,13 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
|
|
||||||
date_default_timezone_set("America/Los_Angeles");
|
date_default_timezone_set("America/Los_Angeles");
|
||||||
$time_start = microtime(true);
|
$time_start = microtime(true);
|
||||||
|
|
||||||
// Yuba
|
// Yuba
|
||||||
// //
|
// //
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
$version = "0.4.6";
|
$version = "0.4.7.2";
|
||||||
|
|
||||||
// Stat each file before and after reading (will fail on ctime unless volume is RO)
|
|
||||||
if (in_array("-paranoid", $argv)) { $wopt_paranoid = 1; } else { $wopt_paranoid = 0; }
|
|
||||||
|
|
||||||
// Treat these directories as files
|
// Treat these directories as files
|
||||||
$wopt_bundles = array( "app",
|
$wopt_bundles = array( "app",
|
||||||
@@ -45,10 +41,6 @@ $wopt_ignore = array( ".DS_Store",
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (in_array("-hash", $argv)) { $wopt_hash = 1; } else { $wopt_hash = 0; }
|
if (in_array("-hash", $argv)) { $wopt_hash = 1; } else { $wopt_hash = 0; }
|
||||||
//$wopt_hash_limit = ""; // don't hash large files nyi
|
|
||||||
//$wopt_mediainfo = 1; // not yet implemented
|
|
||||||
//$wopt_exiftool = 1; // not yet implemented
|
|
||||||
//$wopt_thumb = 1; // not yet implemented
|
|
||||||
|
|
||||||
$wopt_thumb_size = "256";
|
$wopt_thumb_size = "256";
|
||||||
$wopt_thumb_factor = $wopt_thumb_size/128;
|
$wopt_thumb_factor = $wopt_thumb_size/128;
|
||||||
@@ -61,13 +53,6 @@ $bin_exiftool = "/opt/local/bin/exiftool";
|
|||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
|
||||||
function debugStat() {
|
|
||||||
global $shellpath;
|
|
||||||
echo "\n\n";
|
|
||||||
echo $shellpath." - ".chop(@shell_exec("stat -x ".$shellpath." | tail -n1"));
|
|
||||||
echo "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
function stringPrint($string) {
|
function stringPrint($string) {
|
||||||
echo $string.@str_repeat(" ", (10-strlen($string)));
|
echo $string.@str_repeat(" ", (10-strlen($string)));
|
||||||
}
|
}
|
||||||
@@ -174,6 +159,8 @@ if (isset($argv[2]) && is_dir($argv[2])) {
|
|||||||
$dbprefix = ".";
|
$dbprefix = ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_writable($zpath)) { $wopt_paranoid = 1; } else { $wopt_paranoid = 0; }
|
||||||
|
|
||||||
// File checks
|
// File checks
|
||||||
|
|
||||||
$stamp = date("Y-m-d_H-i-s", time());
|
$stamp = date("Y-m-d_H-i-s", time());
|
||||||
@@ -251,14 +238,11 @@ $sysvers = shell_exec("sw_vers 2>&1");
|
|||||||
$dbo = new PDO("sqlite:".$dbfile);
|
$dbo = new PDO("sqlite:".$dbfile);
|
||||||
$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
|
||||||
// test: try to set values for better performance
|
$dbo->query("PRAGMA page_size = 4096");
|
||||||
//$dbo->query("PRAGMA page_size = 4096");
|
$dbo->query("PRAGMA cache_size = 10000");
|
||||||
//$dbo->query("PRAGMA cache_size = 10000");
|
$dbo->query("PRAGMA locking_mode = EXCLUSIVE");
|
||||||
//$dbo->query("PRAGMA locking_mode = EXCLUSIVE");
|
$dbo->query("PRAGMA synchronous = NORMAL");
|
||||||
//$dbo->query("PRAGMA synchronous = NORMAL");
|
$dbo->query("PRAGMA journal_mode = WAL");
|
||||||
//$dbo->query("PRAGMA journal_mode = WAL");
|
|
||||||
//$dbo->query("PRAGMA cache_size = 5000");
|
|
||||||
// end test
|
|
||||||
|
|
||||||
$dbo->exec("CREATE TABLE files (
|
$dbo->exec("CREATE TABLE files (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
@@ -269,6 +253,7 @@ $dbo->exec("CREATE TABLE files (
|
|||||||
Extension TEXT,
|
Extension TEXT,
|
||||||
Type TEXT,
|
Type TEXT,
|
||||||
items INTEGER,
|
items INTEGER,
|
||||||
|
newest INTEGER,
|
||||||
stat TEXT,
|
stat TEXT,
|
||||||
LinkTarget TEXT,
|
LinkTarget TEXT,
|
||||||
RealPath TEXT,
|
RealPath TEXT,
|
||||||
@@ -435,6 +420,8 @@ if (posix_getuid()) {
|
|||||||
|
|
||||||
echo bashcolor("You are not root. Checking file readability: ", "red");
|
echo bashcolor("You are not root. Checking file readability: ", "red");
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
$oops = 0;
|
$oops = 0;
|
||||||
foreach ($files as $splFileInfo) {
|
foreach ($files as $splFileInfo) {
|
||||||
$path = $splFileInfo->getRealPath();
|
$path = $splFileInfo->getRealPath();
|
||||||
@@ -460,9 +447,19 @@ if (posix_getuid()) {
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
echo bashcolor("Running as root. Some QuickLook plugins may not be available.", "red");
|
echo bashcolor("Running as root. Some QuickLook plugins may not be available.", "red");
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$fixatimes = 0;
|
||||||
|
if ($wopt_paranoid) {
|
||||||
|
|
||||||
|
echo bashcolor("\nFilesystem is writable. You can choose:\n(c) Preserve ctimes (default)\n(a) Preserve atimes\n", "purple");
|
||||||
|
$line = trim(fgets(fopen("php://stdin","r"))) ?: "c";
|
||||||
|
if ($line == "a") { $fixatimes = 1; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Filetypes for special handling
|
// Filetypes for special handling
|
||||||
|
|
||||||
$m_files = array( "mkv",
|
$m_files = array( "mkv",
|
||||||
@@ -581,28 +578,26 @@ foreach ($files as $splFileInfo) {
|
|||||||
$extension = $splFileInfo->getExtension();
|
$extension = $splFileInfo->getExtension();
|
||||||
$shellpath = escapeshellarg($pathname);
|
$shellpath = escapeshellarg($pathname);
|
||||||
|
|
||||||
debugStat();
|
echo bashcolor("\n".$pathname."\n","blue");
|
||||||
|
|
||||||
if (!$type) { echo "\nBREAK: can't determine type of ".$pathname; die; }
|
if (!$type) { echo "\nBREAK: can't determine type of ".$pathname; die; }
|
||||||
|
|
||||||
if ($type != "link") {
|
if ($type != "link") {
|
||||||
$stat = chop(@shell_exec("stat -x ".$shellpath." 2>&1"));
|
$stat = chop(@shell_exec("stat -x ".$shellpath." 2>&1"));
|
||||||
if ($wopt_paranoid && !$atime) { echo "\nBREAK: Cannot determine atime of ".$pathname; die; }
|
|
||||||
} else {
|
} else {
|
||||||
$stat = null;
|
$stat = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($type == "dir" || $type == "bundle" ) {
|
if ($type != "link" && $wopt_paranoid) {
|
||||||
$items = chop(@shell_exec("find ".$shellpath." \( ! -regex '.*/\..*' \) | wc -l 2>&1"))-1;
|
$pre_access = null;
|
||||||
} else {
|
$pre_modify = null;
|
||||||
$items = null;
|
$pre_change = null;
|
||||||
}
|
foreach (explode("\n", $stat) as $line) {
|
||||||
|
$check = substr($line, 0, 6);
|
||||||
$echolabel = basename($pathname);
|
if ($check == "Access") { $pre_access = $line; }
|
||||||
echo $echolabel.": ";
|
if ($check == "Modify") { $pre_modify = $line; }
|
||||||
$pad = 80;
|
if ($check == "Change") { $pre_change = $line; }
|
||||||
if (strlen($echolabel) < $pad) {
|
}
|
||||||
echo str_repeat(" ",($pad-strlen($echolabel)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine ID of parent dir by querying database
|
// Determine ID of parent dir by querying database
|
||||||
@@ -610,14 +605,12 @@ foreach ($files as $splFileInfo) {
|
|||||||
$parent = $dbo->query("SELECT id FROM files WHERE (Pathname='".str_replace("'", "''", $path)."')")->fetch()['id'];
|
$parent = $dbo->query("SELECT id FROM files WHERE (Pathname='".str_replace("'", "''", $path)."')")->fetch()['id'];
|
||||||
stringPrint("parent");
|
stringPrint("parent");
|
||||||
|
|
||||||
debugStat();
|
|
||||||
|
|
||||||
// Gather file attributes
|
// Gather file attributes
|
||||||
|
|
||||||
$stmt = $dbo->prepare("INSERT INTO files VALUES (:id, :parent, :Pathname, :Path, :Filename, :Extension, :Type, :items, :stat, :LinkTarget, :RealPath, :Inode, :Size, :Perms, :Owner, :ATime, :MTime, :CTime, :gfi_type, :gfi_attr, :gfi_created, :hash, :tinfo)");
|
$stmt = $dbo->prepare("INSERT INTO files VALUES (:id, :parent, :Pathname, :Path, :Filename, :Extension, :Type, :items, :newest, :stat, :LinkTarget, :RealPath, :Inode, :Size, :Perms, :Owner, :ATime, :MTime, :CTime, :gfi_type, :gfi_attr, :gfi_created, :hash, :tinfo)");
|
||||||
|
|
||||||
if ($type == "dir") {
|
if ($type == "dir") {
|
||||||
$size = shell_exec("du -ks ".$shellpath)*1024;
|
$size = trim(shell_exec("du -ks ".$shellpath." | cut -f1"))*1024;
|
||||||
} elseif ($type == "file" || $type == "bundle") {
|
} elseif ($type == "file" || $type == "bundle") {
|
||||||
$size = $splFileInfo->getSize();
|
$size = $splFileInfo->getSize();
|
||||||
} else {
|
} else {
|
||||||
@@ -632,7 +625,26 @@ foreach ($files as $splFileInfo) {
|
|||||||
$stmt->BindValue(":parent",0);
|
$stmt->BindValue(":parent",0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stringPrint("items");
|
||||||
|
|
||||||
|
if ($type == "dir" || $type == "bundle" ) {
|
||||||
|
$items = chop(@shell_exec("find ".$shellpath." \( ! -regex '.*/\..*' \) | wc -l 2>&1"))-1;
|
||||||
|
} else {
|
||||||
|
$items = null;
|
||||||
|
}
|
||||||
|
|
||||||
$stmt->BindValue(":items",@$items);
|
$stmt->BindValue(":items",@$items);
|
||||||
|
|
||||||
|
stringPrint("newest");
|
||||||
|
|
||||||
|
if ($type == "dir") {
|
||||||
|
$newest = filemtime(chop(shell_exec("find ".$shellpath." -type f -not -path '*/\.*' -print0 | xargs -0 stat -f \"%m %N\" | sort -rn | head -1 | cut -f2- -d\" \"")));
|
||||||
|
} else {
|
||||||
|
$newest = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$stmt->BindValue(":newest",@$newest);
|
||||||
|
|
||||||
$stmt->BindValue(":stat",@$stat);
|
$stmt->BindValue(":stat",@$stat);
|
||||||
|
|
||||||
$stmt->BindValue(":Pathname",$pathname);
|
$stmt->BindValue(":Pathname",$pathname);
|
||||||
@@ -657,9 +669,7 @@ foreach ($files as $splFileInfo) {
|
|||||||
$stmt->BindValue(":MTime",$splFileInfo->getMTime());
|
$stmt->BindValue(":MTime",$splFileInfo->getMTime());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debugStat();
|
|
||||||
|
|
||||||
stringPrint("attr");
|
stringPrint("attr");
|
||||||
|
|
||||||
$gfiparts = explode("\n", chop(shell_exec($bin_gfi." -P ".$shellpath." 2>&1")));
|
$gfiparts = explode("\n", chop(shell_exec($bin_gfi." -P ".$shellpath." 2>&1")));
|
||||||
@@ -696,7 +706,7 @@ foreach ($files as $splFileInfo) {
|
|||||||
$zprefix = "qlmanage";
|
$zprefix = "qlmanage";
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
$zprefix = "qlmanage";
|
$zprefix = "sudo qlmanage"; // prevent hang
|
||||||
@exec($zprefix." -t -f ".$wopt_thumb_factor." -o ".$wopt_tmpdir." ".$shellpath." 2>&1");
|
@exec($zprefix." -t -f ".$wopt_thumb_factor." -o ".$wopt_tmpdir." ".$shellpath." 2>&1");
|
||||||
stringPrint("thumb");
|
stringPrint("thumb");
|
||||||
if ($size && !file_exists($thumb) && (in_array($extension, $m_files) || in_array($extension, $e_files))) {
|
if ($size && !file_exists($thumb) && (in_array($extension, $m_files) || in_array($extension, $e_files))) {
|
||||||
@@ -708,9 +718,7 @@ foreach ($files as $splFileInfo) {
|
|||||||
if (file_exists($thumb) && filesize($thumb)) {
|
if (file_exists($thumb) && filesize($thumb)) {
|
||||||
$stmt->BindValue(":tinfo",serialize(getimagesize($thumb)));
|
$stmt->BindValue(":tinfo",serialize(getimagesize($thumb)));
|
||||||
}
|
}
|
||||||
|
|
||||||
debugStat();
|
|
||||||
|
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
stringPrint("->files");
|
stringPrint("->files");
|
||||||
|
|
||||||
@@ -749,7 +757,7 @@ foreach ($files as $splFileInfo) {
|
|||||||
$stmt = $dbo->prepare("INSERT INTO metadata VALUES (:id, :duration, :mediainfo, :exiftool)");
|
$stmt = $dbo->prepare("INSERT INTO metadata VALUES (:id, :duration, :mediainfo, :exiftool)");
|
||||||
|
|
||||||
if ($type != "dir" && in_array($extension, $m_files)) {
|
if ($type != "dir" && in_array($extension, $m_files)) {
|
||||||
$minfo = parseMediaInfo(shell_exec($bin_mediainfo." --Output=XML ".$shellpath." 2>&1"));
|
$minfo = parseMediaInfo(shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1"));
|
||||||
if ($minfo['file']['general']['duration'][0]) {
|
if ($minfo['file']['general']['duration'][0]) {
|
||||||
$stmt->BindValue(":duration",$minfo['file']['general']['duration'][0]);
|
$stmt->BindValue(":duration",$minfo['file']['general']['duration'][0]);
|
||||||
} else {
|
} else {
|
||||||
@@ -774,9 +782,7 @@ foreach ($files as $splFileInfo) {
|
|||||||
stringPrint("->meta");
|
stringPrint("->meta");
|
||||||
|
|
||||||
// Gather thumbnail
|
// Gather thumbnail
|
||||||
|
|
||||||
debugStat();
|
|
||||||
|
|
||||||
$stmt = $dbo->prepare("INSERT INTO thumbs VALUES (:id, :thumb)");
|
$stmt = $dbo->prepare("INSERT INTO thumbs VALUES (:id, :thumb)");
|
||||||
if (file_exists($thumb) && filesize($thumb)) {
|
if (file_exists($thumb) && filesize($thumb)) {
|
||||||
$stmt->BindValue(":thumb",file_get_contents($thumb));
|
$stmt->BindValue(":thumb",file_get_contents($thumb));
|
||||||
@@ -788,25 +794,48 @@ foreach ($files as $splFileInfo) {
|
|||||||
|
|
||||||
// Set fileatime back to original value
|
// Set fileatime back to original value
|
||||||
|
|
||||||
//if ($type != "link" && is_writable($pathname)) {
|
if ($type != "link" && is_writable($pathname) && $fixatimes) {
|
||||||
// @exec("touch -at `date -r ".$atime." +%Y%m%d%H%M.%S` ".$shellpath." 2>&1");
|
@exec("touch -at `date -r ".$atime." +%Y%m%d%H%M.%S` ".$shellpath." 2>&1");
|
||||||
// stringPrint("touch");
|
stringPrint("touch");
|
||||||
// }
|
}
|
||||||
|
|
||||||
echo "\n";
|
echo "\n";
|
||||||
|
|
||||||
// Double check stat for file against pre-run value
|
// Double check stat for file against pre-run value
|
||||||
|
|
||||||
echo bashcolor(str_replace(array("\n"," "),array(" ",""),$stat)."\n","blue");
|
if ($type != "link" && $wopt_paranoid) {
|
||||||
|
|
||||||
if ($wopt_paranoid && $type != "link") {
|
|
||||||
$restat = chop(@shell_exec("stat -x ".$shellpath." 2>&1"));
|
$restat = chop(@shell_exec("stat -x ".$shellpath." 2>&1"));
|
||||||
echo bashcolor(str_replace(array("\n"," "),array(" ",""),$restat)."\n","green");
|
$post_access = null;
|
||||||
if ($stat != $restat) { echo "\nBREAK: stat changed on ".$pathname; die; }
|
$post_modify = null;
|
||||||
|
$post_change = null;
|
||||||
|
|
||||||
|
foreach (explode("\n", $restat) as $line) {
|
||||||
|
$check = substr($line, 0, 6);
|
||||||
|
if ($check == "Access") { $post_access = $line; }
|
||||||
|
if ($check == "Modify") { $post_modify = $line; }
|
||||||
|
if ($check == "Change") { $post_change = $line; }
|
||||||
|
}
|
||||||
|
|
||||||
|
$message = array();
|
||||||
|
if ($pre_access != $post_access) {
|
||||||
|
$message[] = "ATIME CHANGED";
|
||||||
|
}
|
||||||
|
if ($pre_modify != $post_modify) {
|
||||||
|
$message[] = "MTIME CHANGED";
|
||||||
|
}
|
||||||
|
if ($pre_change != $post_change) {
|
||||||
|
$message[] = "CTIME CHANGED";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($message)) { echo bashcolor(str_repeat(" ",99).implode(" ~ ", $message), "purple"); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo "\n\n\n";
|
||||||
|
|
||||||
// Footer
|
// Footer
|
||||||
|
|
||||||
$seconds = floor($time = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]);
|
$seconds = floor($time = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]);
|
||||||
|
|||||||
Reference in New Issue
Block a user