', 'file_put_contents_ex('.$filename.') could not write file'); return; } if (flock($fp, LOCK_EX)) { ftruncate($fp, 0); rewind($fp); fwrite($fp, $data); } else { Log::text('', 'file_put_contents_ex('.$filename.') could not acquire lock'); } fclose($fp); } static function delete_file($file_name) { unlink($file_name); } static function read_file($file_name) { $fsz = filesize($file_name); if($fsz == 0) return(''); $fp = fopen($file_name, "rb+"); if(!$fp) return(''); if (flock($fp, LOCK_SH)) { $content = fread($fp, $fsz); flock($fp, LOCK_UN); } else { Log::text('', 'read_file('.$file_name.') could not acquire lock'); } fclose($fp); return($content); } static function write_data($class, $bucket, $type, $data) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); if(!file_exists($storage_path)) @mkdir($storage_path, 0774, true); $fn = $storage_path.'/'.$type.'.json'; self::write_file($fn, json_encode($data)); } static function read_data($class, $bucket, $type) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); $fn = $storage_path.'/'.$type.'.json'; return(json_decode(self::read_file($fn), true)); } static function delete_data($class, $bucket, $type) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); return(self::delete_file($storage_path.'/'.$type.'.json')); } static function get_data_filename($class, $bucket, $type) { return(first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket).'/'.$type.'.json'); } static function list_bucket($class, $bucket) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); foreach(explode(chr(10), trim(shell_exec('ls -1 '.escapeshellarg($storage_path)))) as $name) { if(substr($name, 0, 1) != '_' && trim($name) != '') $items[] = $name; } return($items); } static function search_bucket($class, $bucket, $q) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); foreach(explode(chr(10), trim(shell_exec('grep -irlF '.escapeshellarg($q).' '.escapeshellarg($storage_path)))) as $l) { $name = substr($l, strlen($storage_path)+1, -5); if(substr($name, 0, 1) != '_' && trim($name) != '') $items[] = $name; } return($items); } static function delete_bucket($class, $bucket) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); if(stristr($storage_path, '*') !== false) return; if(stristr($storage_path, '?') !== false) return; $result = trim(shell_exec('rm -r '.escapeshellarg($storage_path).' 2>&1')); return($result); } static function write_log($class, $bucket, $type, $data) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); if(!file_exists($storage_path)) @mkdir($storage_path, 0774, true); WriteToFile($storage_path.'/'.$type.'.log', json_encode($data).chr(10)); } static function read_log($class, $bucket, $type, $line_count = 8, $offset = false) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); return(get_json_tail($storage_path.'/'.$type.'.log', $line_count, $offset)); } static function line_count($class, $bucket, $type) { $storage_path = first($GLOBALS['config']['filebase']['path'], 'data/').$class.'/'.self::make_bucket_path($bucket); return(intval(trim(shell_exec('wc -l '.escapeshellarg($storage_path.'/'.$type.'.log'))))); } static function get_json_tail($from_file, $line_count = 8, $offset = false) { if($offset > 0) { $lines = trim(shell_exec( 'tail -n '.escapeshellarg($offset+$line_count).' '.escapeshellarg($from_file).' | head -n '.escapeshellarg($line_count))); } else { $lines = trim(shell_exec( 'tail -n '.escapeshellarg($line_count).' '.escapeshellarg($from_file))); } return(json_lines($lines)); } static function get_tail($from_file, $line_count = 8, $offset = false) { $line_count = intval($line_count); if($offset > 0) { $lines = trim(shell_exec( 'tail -n '.escapeshellarg($offset+$line_count).' '.escapeshellarg($from_file).' | head -n '.escapeshellarg($line_count))); } else { $lines = trim(shell_exec( 'tail -n '.escapeshellarg($line_count).' '.escapeshellarg($from_file))); } return(explode(chr(10), $lines)); } static function get_all_lines($from_file) { return(explode(chr(10), trim(file_get_contents($from_file)))); } static function truncate_log($from_file, $lines = 128) { $lines = intval($lines); $tmp = tempnam(sys_get_temp_dir(), 'trunc_'); shell_exec('tail -n '.$lines.' '.escapeshellarg($from_file).' > '.escapeshellarg($tmp).' && cp '.escapeshellarg($tmp).' '.escapeshellarg($from_file)); @unlink($tmp); return true; } static function json_lines($lines) { if($lines == '') { return(array()); } else { $result = array(); foreach(explode(chr(10), $lines) as $line) $result[] = json_decode($line, true); return($result); } } }