PageRenderTime 41ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/sites/all/modules/mediamosa/modules/integrity_check/mediamosa_integrity_check.php

https://github.com/www-madcap-nl/mediamosa
PHP | 303 lines | 214 code | 33 blank | 56 comment | 29 complexity | c36b6c2a2d4541b1586a53f3cc959640 MD5 | raw file
  1. <?php
  2. // $Id$
  3. /**
  4. * MediaMosa is Open Source Software to build a Full Featured, Webservice
  5. * Oriented Media Management and Distribution platform (http://mediamosa.org)
  6. *
  7. * Copyright (C) 2011 SURFnet BV (http://www.surfnet.nl) and Kennisnet
  8. * (http://www.kennisnet.nl)
  9. *
  10. * MediaMosa is based on the open source Drupal platform and
  11. * was originally developed by Madcap BV (http://www.madcap.nl)
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License version 2 as
  15. * published by the Free Software Foundation.
  16. * This program is distributed in the hope that it will be useful, but
  17. * WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, you can find it at:
  23. * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  24. */
  25. /**
  26. * @file
  27. * Integrity check PHP file
  28. */
  29. // Basic values.
  30. $_SERVER['HTTP_HOST'] = 'localhost';
  31. $_SERVER['REMOTE_ADDR'] = '';
  32. $_SERVER['REQUEST_METHOD'] = '';
  33. $_SERVER['SERVER_SOFTWARE'] = '';
  34. // get a working Drupal environment
  35. function find_drupal() {
  36. while (($path = getcwd()) !== '/') {
  37. if (file_exists('index.php') && is_dir('includes')) {
  38. break;
  39. }
  40. chdir('..');
  41. }
  42. return $path;
  43. }
  44. // Get Drupal.
  45. define('DRUPAL_ROOT', find_drupal());
  46. chdir(DRUPAL_ROOT);
  47. include_once './includes/bootstrap.inc';
  48. drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
  49. // 2 hour time limit (exclusive queries).
  50. set_time_limit(7200);
  51. // Error reporting.
  52. error_reporting(E_ALL);
  53. // Check media record.
  54. function check_media_records() {
  55. $result = mediamosa_db::db_query('
  56. SELECT #mediafile_id, #created, #changed, #app_id, #owner_id
  57. FROM {#mediafile}
  58. WHERE #is_still = :is_still_false', array(
  59. '#mediafile' => mediamosa_asset_mediafile_db::TABLE_NAME,
  60. '#mediafile_id' => mediamosa_asset_mediafile_db::ID,
  61. '#created' => mediamosa_asset_mediafile_db::CREATED,
  62. '#changed' => mediamosa_asset_mediafile_db::CHANGED,
  63. '#app_id' => mediamosa_asset_mediafile_db::APP_ID,
  64. '#owner_id' => mediamosa_asset_mediafile_db::OWNER_ID,
  65. '#is_still' => mediamosa_asset_mediafile_db::IS_STILL,
  66. ':is_still_false' => mediamosa_asset_mediafile_db::IS_STILL_FALSE,
  67. ));
  68. foreach ($result as $mediafile) {
  69. // Check if file exists.
  70. if (!file_exists(mediamosa_configuration_storage::mediafile_id_filename_get($mediafile['mediafile_id']))) {
  71. $mediafile_id = $mediafile['mediafile_id'];
  72. $filesize = mediamosa_asset_mediafile_metadata::get_mediafile_metadata_int($mediafile_id, mediamosa_asset_mediafile_metadata::FILESIZE);
  73. $mime_type = mediamosa_asset_mediafile_metadata::get_mediafile_metadata_char($mediafile_id, mediamosa_asset_mediafile_metadata::MIME_TYPE);
  74. mediamosa_db::db_query('
  75. INSERT INTO {#mediamosa_integrity_check}
  76. (#type, #object_id, #app_id, #owner_id, #created, #changed, #details) VALUES
  77. (:missing_mediafile, :object_id, :app_id, :owner_id, :created, :changed, :details)', array(
  78. '#mediamosa_integrity_check' => mediamosa_integrity_check_db::TABLE_NAME,
  79. '#type' => mediamosa_integrity_check_db::TYPE,
  80. '#object_id' => mediamosa_integrity_check_db::OBJECT_ID,
  81. '#app_id' => mediamosa_integrity_check_db::APP_ID,
  82. '#owner_id' => mediamosa_integrity_check_db::OWNER_ID,
  83. '#created' => mediamosa_integrity_check_db::CREATED,
  84. '#changed' => mediamosa_integrity_check_db::CHANGED,
  85. '#details' => mediamosa_integrity_check_db::DETAILS,
  86. ':missing_mediafile' => mediamosa_integrity_check_db::TYPE_MISSING_MEDIAFILE,
  87. ':object_id' => $mediafile['mediafile_id'],
  88. ':app_id' => $mediafile['app_id'],
  89. ':owner_id' => $mediafile['owner_id'],
  90. ':created' => $mediafile['created'],
  91. ':changed' => $mediafile['changed'],
  92. ':details' => (!$filesize || $filesize == '') ? 'Never succesfully analysed...' : 'Mime-type: ' . $mime_type,
  93. ));
  94. }
  95. // Sleep 0.01 seconds *100.000 mediafiles= 17 minuten.
  96. usleep(10000);
  97. }
  98. }
  99. // Check media files.
  100. function check_media_files() {
  101. // Base folder.
  102. $dir = mediamosa_configuration_storage::get_data_location();
  103. $dh = opendir($dir);
  104. $missing_db_mediafiles = array();
  105. while (($folder = readdir($dh)) !== FALSE) {
  106. // Is it '.' or '..'?
  107. if (!is_dir($dir . DIRECTORY_SEPARATOR . $folder) || strpos($folder, '..') === 0 || strpos($folder, '.') === 0 || drupal_strlen($folder) > 1) {
  108. continue;
  109. }
  110. // Open the sub directory.
  111. $fh = opendir($dir . DIRECTORY_SEPARATOR . $folder);
  112. while (($file = readdir($fh)) !== FALSE) {
  113. // Is it '.' or '..'?
  114. if (strpos($file, '.') === 0 || strpos($file, '..') === 0) {
  115. continue;
  116. }
  117. // Check the file in the db.
  118. $result = mediamosa_db::db_query('
  119. SELECT COUNT(*)
  120. FROM {#mediafile}
  121. where #mediafile_id = :mediafile_id', array(
  122. '#mediafile' => mediamosa_asset_mediafile_db::TABLE_NAME,
  123. '#mediafile_id' => mediamosa_asset_mediafile_db::ID,
  124. ':mediafile_id' => $file,
  125. ));
  126. if ($result->fetchField() == 0) {
  127. // Collect the data.
  128. $file_path = $dir . DIRECTORY_SEPARATOR . $folder . DIRECTORY_SEPARATOR . $file;
  129. $finfo = stat($file_path);
  130. $more_info = exec('ls -sla ' . $file_path);
  131. // Make error message.
  132. mediamosa_db::db_query('
  133. INSERT INTO {#mediamosa_integrity_check}
  134. (#type, #object_id, #size, #mtime, #ctime, #details, #created) VALUES
  135. (:missing_mediarecord, :object_id, :size, :mtime, :ctime, :details, UTC_TIMESTAMP())', array(
  136. '#mediamosa_integrity_check' => mediamosa_integrity_check_db::TABLE_NAME,
  137. '#type' => mediamosa_integrity_check_db::TYPE,
  138. '#object_id' => mediamosa_integrity_check_db::OBJECT_ID,
  139. '#size' => mediamosa_integrity_check_db::SIZE,
  140. '#mtime' => mediamosa_integrity_check_db::MTIME,
  141. '#ctime' => mediamosa_integrity_check_db::CTIME,
  142. '#details' => mediamosa_integrity_check_db::DETAILS,
  143. '#created' => mediamosa_integrity_check_db::CREATED,
  144. ':missing_mediarecord' => mediamosa_integrity_check_db::TYPE_MISSING_MEDIARECORD,
  145. ':object_id' => $file,
  146. ':size' => $finfo['size'],
  147. ':mtime' => $finfo['mtime'],
  148. ':ctime' => $finfo['ctime'],
  149. ':details' => $more_info,
  150. ));
  151. }
  152. }
  153. closedir($fh);
  154. }
  155. closedir($dh);
  156. }
  157. function check_still_records() {
  158. $result = mediamosa_db::db_query("
  159. SELECT #mediafile_id, #created, #changed, #app_id, #owner_id
  160. FROM {#mediafile}
  161. WHERE #is_still = :is_still_true", array(
  162. '#mediafile' => mediamosa_asset_mediafile_db::TABLE_NAME,
  163. '#mediafile_id' => mediamosa_asset_mediafile_db::ID,
  164. '#created' => mediamosa_asset_mediafile_db::CREATED,
  165. '#changed' => mediamosa_asset_mediafile_db::CHANGED,
  166. '#app_id' => mediamosa_asset_mediafile_db::APP_ID,
  167. '#owner_id' => mediamosa_asset_mediafile_db::OWNER_ID,
  168. '#is_still' => mediamosa_asset_mediafile_db::IS_STILL,
  169. ':is_still_true' => mediamosa_asset_mediafile_db::IS_STILL_TRUE,
  170. ));
  171. foreach ($result as $still) {
  172. // Check if file exists.
  173. if (!file_exists(mediamosa_configuration_storage::still_filename_get($still['mediafile_id']))) {
  174. $mediafile_id = $still['mediafile_id'];
  175. $filesize = mediamosa_asset_mediafile_metadata::get_mediafile_metadata_int($mediafile_id, mediamosa_asset_mediafile_metadata::FILESIZE);
  176. $mime_type = mediamosa_asset_mediafile_metadata::get_mediafile_metadata_char($mediafile_id, mediamosa_asset_mediafile_metadata::MIME_TYPE);
  177. mediamosa_db::db_query('
  178. INSERT INTO {#mediamosa_integrity_check}
  179. (#type, #object_id, #app_id, #owner_id, #created, #changed, #details) VALUES
  180. (:missing_mediafile, :object_id, :app_id, :owner_id, :created, :changed, :details)', array(
  181. '#mediamosa_integrity_check' => mediamosa_integrity_check_db::TABLE_NAME,
  182. '#type' => mediamosa_integrity_check_db::TYPE,
  183. '#object_id' => mediamosa_integrity_check_db::OBJECT_ID,
  184. '#app_id' => mediamosa_integrity_check_db::APP_ID,
  185. '#owner_id' => mediamosa_integrity_check_db::OWNER_ID,
  186. '#created' => mediamosa_integrity_check_db::CREATED,
  187. '#changed' => mediamosa_integrity_check_db::CHANGED,
  188. '#details' => mediamosa_integrity_check_db::DETAILS,
  189. ':missing_mediafile' => mediamosa_integrity_check_db::TYPE_MISSING_STILLFILE,
  190. ':object_id' => $still['mediafile_id'],
  191. ':app_id' => $still['app_id'],
  192. ':owner_id' => $still['owner_id'],
  193. ':created' => $still['created'],
  194. ':changed' => $still['changed'],
  195. ':details' => (!$filesize || $filesize == '') ? 'Never succesfully analysed...' : 'Mime-type: ' . $mime_type,
  196. ));
  197. }
  198. // Sleep 0.01 seconds *100.000 mediafiles= 17 minuten.
  199. usleep(10000);
  200. }
  201. }
  202. function check_still_files() {
  203. // Base folder.
  204. $dir = mediamosa_configuration_storage::get_still_location();
  205. $dh = opendir($dir);
  206. while (($folder = readdir($dh)) !== FALSE) {
  207. // Is it '.' or '..'?
  208. if (!is_dir($dir . DIRECTORY_SEPARATOR . $folder) || strpos($folder, '..') === 0 || strpos($folder, '.') === 0 || drupal_strlen($folder) > 1) {
  209. continue;
  210. }
  211. // Open the sub directory.
  212. $fh = opendir($dir . DIRECTORY_SEPARATOR . $folder);
  213. while (($file = readdir($fh)) !== FALSE) {
  214. // Is it '.' or '..'?
  215. if (strpos($file, '.') === 0 || strpos($file, '..') === 0) {
  216. continue;
  217. }
  218. // Check the file in the db.
  219. $result = mediamosa_db::db_query('
  220. SELECT COUNT(*)
  221. FROM {#mediafile}
  222. where #mediafile_id = :mediafile_id', array(
  223. '#mediafile' => mediamosa_asset_mediafile_db::TABLE_NAME,
  224. '#mediafile_id' => mediamosa_asset_mediafile_db::ID,
  225. ':mediafile_id' => $file,
  226. ));
  227. if ($result->fetchField() == 0) {
  228. // Collect the data.
  229. $file_path = $dir . DIRECTORY_SEPARATOR . $folder . DIRECTORY_SEPARATOR . $file;
  230. $finfo = stat($file_path);
  231. $more_info = exec('ls -sla ' . $file_path);
  232. // Make error message.
  233. mediamosa_db::db_query('
  234. INSERT INTO {#mediamosa_integrity_check}
  235. (#type, #object_id, #size, #mtime, #ctime, #details, #created) VALUES
  236. (:missing_mediarecord, :object_id, :size, :mtime, :ctime, :details, UTC_TIMESTAMP())', array(
  237. '#mediamosa_integrity_check' => mediamosa_integrity_check_db::TABLE_NAME,
  238. '#type' => mediamosa_integrity_check_db::TYPE,
  239. '#object_id' => mediamosa_integrity_check_db::OBJECT_ID,
  240. '#size' => mediamosa_integrity_check_db::SIZE,
  241. '#mtime' => mediamosa_integrity_check_db::MTIME,
  242. '#ctime' => mediamosa_integrity_check_db::CTIME,
  243. '#details' => mediamosa_integrity_check_db::DETAILS,
  244. '#created' => mediamosa_integrity_check_db::CREATED,
  245. ':missing_mediarecord' => mediamosa_integrity_check_db::TYPE_MISSING_STILLRECORD,
  246. ':object_id' => $file,
  247. ':size' => $finfo['size'],
  248. ':mtime' => $finfo['mtime'],
  249. ':ctime' => $finfo['ctime'],
  250. ':details' => $more_info,
  251. ));
  252. }
  253. }
  254. closedir($fh);
  255. }
  256. closedir($dh);
  257. }
  258. // Start.
  259. watchdog('integrity_check', 'running...');
  260. variable_set('mediamosa_integrity_run_date_start', date('c'));
  261. // Empty log table.
  262. db_truncate('mediamosa_integrity_check');
  263. // Run checks.
  264. check_media_records();
  265. check_media_files();
  266. check_still_records();
  267. check_still_files();
  268. // End.
  269. variable_set('mediamosa_integrity_run_date_end', date('c'));
  270. watchdog('integrity_check', 'ended...');