PageRenderTime 53ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/backwpup/inc/class-page-logs.php

https://bitbucket.org/cesarmedrano/cesarmedrano
PHP | 374 lines | 262 code | 50 blank | 62 comment | 54 complexity | be031c70efac982c71fe349425fb17ad MD5 | raw file
  1. <?php
  2. /**
  3. * Class for BackWPup logs display page
  4. */
  5. class BackWPup_Page_Logs extends WP_List_Table {
  6. private static $listtable = NULL;
  7. /**
  8. *
  9. */
  10. function __construct() {
  11. parent::__construct( array(
  12. 'plural' => 'logs',
  13. 'singular' => 'log',
  14. 'ajax' => TRUE
  15. ) );
  16. }
  17. /**
  18. * @return bool
  19. */
  20. function ajax_user_can() {
  21. return current_user_can( 'backwpup_logs' );
  22. }
  23. /**
  24. *
  25. */
  26. function prepare_items() {
  27. $per_page = $this->get_items_per_page( 'backwpuplogs_per_page' );
  28. if ( empty( $per_page ) || $per_page < 1 )
  29. $per_page = 20;
  30. //load logs
  31. $logfiles = array();
  32. if ( $dir = @opendir( BackWPup_Option::get( 'cfg', 'logfolder' ) ) ) {
  33. while ( ( $file = readdir( $dir ) ) !== FALSE ) {
  34. if ( is_file( BackWPup_Option::get( 'cfg', 'logfolder' ) . '/' . $file ) && strstr( $file, 'backwpup_log_' ) && ( strstr( $file, '.html' ) || strstr( $file, '.html.gz' ) ) )
  35. $logfiles[ ] = $file;
  36. }
  37. closedir( $dir );
  38. }
  39. //ordering
  40. $order = isset( $_GET[ 'order' ] ) ? $_GET[ 'order' ] : 'desc';
  41. $orderby = isset( $_GET[ 'orderby' ] ) ? $_GET[ 'orderby' ] : 'log';
  42. if ( $orderby == 'log' ) {
  43. if ( $order == 'asc' )
  44. sort( $logfiles );
  45. else
  46. rsort( $logfiles );
  47. }
  48. //by page
  49. $start = intval( ( $this->get_pagenum() - 1 ) * $per_page );
  50. $end = $start + $per_page;
  51. if ( $end > count( $logfiles ) )
  52. $end = count( $logfiles );
  53. $this->items = array();
  54. for ( $i = $start; $i < $end; $i ++ ) {
  55. $this->items[ ] = $logfiles[ $i ];
  56. }
  57. $this->set_pagination_args( array(
  58. 'total_items' => count( $logfiles ),
  59. 'per_page' => $per_page,
  60. 'orderby' => $orderby,
  61. 'order' => $order
  62. ) );
  63. }
  64. /**
  65. * @return array
  66. */
  67. function get_sortable_columns() {
  68. return array(
  69. 'log' => array( 'log', FALSE ),
  70. );
  71. }
  72. /**
  73. *
  74. */
  75. function no_items() {
  76. _e( 'No Logs.', 'backwpup' );
  77. }
  78. /**
  79. * @return array
  80. */
  81. function get_bulk_actions() {
  82. if ( ! $this->has_items() )
  83. return array ();
  84. $actions = array();
  85. $actions[ 'delete' ] = __( 'Delete', 'backwpup' );
  86. return $actions;
  87. }
  88. /**
  89. * @return array
  90. */
  91. function get_columns() {
  92. $posts_columns = array();
  93. $posts_columns[ 'cb' ] = '<input type="checkbox" />';
  94. $posts_columns[ 'id' ] = __( 'Job', 'backwpup' );
  95. $posts_columns[ 'type' ] = __( 'Type', 'backwpup' );
  96. $posts_columns[ 'log' ] = __( 'Backup/Log Date/Time', 'backwpup' );
  97. $posts_columns[ 'status' ] = __( 'Status', 'backwpup' );
  98. $posts_columns[ 'size' ] = __( 'Size', 'backwpup' );
  99. $posts_columns[ 'runtime' ] = __( 'Runtime', 'backwpup' );
  100. return $posts_columns;
  101. }
  102. /**
  103. *
  104. */
  105. function display_rows() {
  106. $style = '';
  107. foreach ( $this->items as $logfile ) {
  108. $style = ( ' class="alternate"' === $style ) ? '' : ' class="alternate"';
  109. $logdata = BackWPup_Job::read_logheader( BackWPup_Option::get( 'cfg', 'logfolder' ) . $logfile );
  110. echo PHP_EOL . "\t", $this->single_row( BackWPup_Option::get( 'cfg', 'logfolder' ) . $logfile, $logdata, $style );
  111. }
  112. }
  113. /**
  114. * @param $logfile
  115. * @param $logdata
  116. * @param string $style
  117. *
  118. * @return string
  119. */
  120. function single_row( $logfile, $logdata, $style = '' ) {
  121. list( $columns, $hidden, $sortable ) = $this->get_column_info();
  122. $r = "<tr id='" . basename( $logfile ) . "'$style>";
  123. $job_types = BackWPup::get_job_types();
  124. foreach ( $columns as $column_name => $column_display_name ) {
  125. $class = "class=\"$column_name column-$column_name\"";
  126. $style = '';
  127. if ( in_array( $column_name, $hidden ) )
  128. $style = ' style="display:none;"';
  129. $attributes = "$class$style";
  130. switch ( $column_name ) {
  131. case 'cb':
  132. $r .= '<th scope="row" class="check-column"><input type="checkbox" name="logfiles[]" value="' . esc_attr( basename( $logfile ) ) . '" /></th>';
  133. break;
  134. case 'id':
  135. $r .= "<td $attributes>" . $logdata[ 'jobid' ] . "</td>";
  136. break;
  137. case 'type':
  138. $r .= "<td $attributes>";
  139. if ( $types = explode( '+', $logdata[ 'type' ] ) ) {
  140. foreach ( $types as $type ) {
  141. if ( isset( $job_types[ $type ] ) ) {
  142. $r .= $job_types[ $type ]->info[ 'name' ] . '<br />';
  143. }
  144. else {
  145. $r .= $type . '<br />';
  146. }
  147. }
  148. }
  149. $r .= "</td>";
  150. break;
  151. case 'log':
  152. $r .= "<td $attributes><strong><a class=\"thickbox\" href=\"" . admin_url( 'admin-ajax.php' ) . '?&action=backwpup_view_log&logfile=' . basename( $logfile ) .'&_ajax_nonce=' . wp_create_nonce( 'view-logs' ) . "&height=440&width=630&TB_iframe=true\" title=\"" . basename( $logfile ) . "\">" . sprintf( __( '%1$s at %2$s', 'backwpup' ), date_i18n( get_option( 'date_format' ) , $logdata[ 'logtime' ], TRUE ), date_i18n( get_option( 'time_format' ), $logdata[ 'logtime' ], TRUE ) ) . ": <i>" . $logdata[ 'name' ] . "</i></a></strong>";
  153. $actions = array();
  154. $actions[ 'view' ] = '<a class="thickbox" href="' . admin_url( 'admin-ajax.php' ) . '?&action=backwpup_view_log&logfile=' . basename( $logfile ) .'&_ajax_nonce=' . wp_create_nonce( 'view-logs' ) . '&height=440&width=630&TB_iframe=true" title="' . basename( $logfile ) . '">' . __( 'View', 'backwpup' ) . '</a>';
  155. if ( current_user_can( 'backwpup_logs_delete' ) )
  156. $actions[ 'delete' ] = "<a class=\"submitdelete\" href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpuplogs&action=delete&paged=' . $this->get_pagenum() . '&logfiles[]=' . basename( $logfile ), 'bulk-logs' ) . "\" onclick=\"return showNotice.warn();\">" . __( 'Delete', 'backwpup' ) . "</a>";
  157. $actions[ 'download' ] = "<a href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpuplogs&action=download&file=' . $logfile, 'download-backup_' . basename( $logfile ) ) . "\">" . __( 'Download', 'backwpup' ) . "</a>";
  158. $r .= $this->row_actions( $actions );
  159. $r .= "</td>";
  160. break;
  161. case 'status':
  162. $r .= "<td $attributes>";
  163. if ( $logdata[ 'errors' ] > 0 )
  164. $r .= str_replace( '%d', $logdata[ 'errors' ], '<span style="color:red;font-weight:bold;">' . _n( "1 ERROR", "%d ERRORS", $logdata[ 'errors' ], 'backwpup' ) . '</span><br />' );
  165. if ( $logdata[ 'warnings' ] > 0 )
  166. $r .= str_replace( '%d', $logdata[ 'warnings' ], '<span style="color:#e66f00;font-weight:bold;">' . _n( "1 WARNING", "%d WARNINGS", $logdata[ 'warnings' ], 'backwpup' ) . '</span><br />' );
  167. if ( $logdata[ 'errors' ] == 0 && $logdata[ 'warnings' ] == 0 )
  168. $r .= '<span style="color:green;font-weight:bold;">' . __( 'O.K.', 'backwpup' ) . '</span>';
  169. $r .= "</td>";
  170. break;
  171. case 'size':
  172. $r .= "<td $attributes>";
  173. if ( ! empty( $logdata[ 'backupfilesize' ] ) ) {
  174. $r .= size_format( $logdata[ 'backupfilesize' ], 2 );
  175. }
  176. else {
  177. $r .= __( 'Log only', 'backwpup' );
  178. }
  179. $r .= "</td>";
  180. break;
  181. case 'runtime':
  182. $r .= "<td $attributes>";
  183. $r .= $logdata[ 'runtime' ] . ' ' . __( 'seconds', 'backwpup' );
  184. $r .= "</td>";
  185. break;
  186. }
  187. }
  188. $r .= '</tr>';
  189. return $r;
  190. }
  191. /**
  192. *
  193. */
  194. public static function load() {
  195. //Create Table
  196. self::$listtable = new BackWPup_Page_Logs;
  197. switch ( self::$listtable->current_action() ) {
  198. case 'delete':
  199. if ( ! current_user_can( 'backwpup_logs_delete' ) )
  200. break;
  201. if ( is_array( $_GET[ 'logfiles' ] ) ) {
  202. check_admin_referer( 'bulk-logs' );
  203. $num = 0;
  204. foreach ( $_GET[ 'logfiles' ] as $logfile ) {
  205. if ( is_file( BackWPup_Option::get( 'cfg', 'logfolder' ) . $logfile ) )
  206. unlink( BackWPup_Option::get( 'cfg', 'logfolder' ) . $logfile );
  207. $num ++;
  208. }
  209. }
  210. break;
  211. case 'download': //Download Log
  212. if ( ! current_user_can( 'backwpup_logs' ) )
  213. break;
  214. check_admin_referer( 'download-backup_' . basename( trim( $_GET[ 'file' ] ) ) );
  215. if ( is_file( trim( $_GET[ 'file' ] ) ) ) {
  216. header( "Pragma: public" );
  217. header( "Expires: 0" );
  218. header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  219. header( "Content-Type: application/force-download" );
  220. header( "Content-Type: application/octet-stream" );
  221. header( "Content-Type: application/download" );
  222. header( "Content-Disposition: attachment; filename=" . basename( trim( $_GET[ 'file' ] ) ) . ";" );
  223. header( "Content-Transfer-Encoding: binary" );
  224. header( "Content-Length: " . filesize( trim( $_GET[ 'file' ] ) ) );
  225. @readfile( trim( $_GET[ 'file' ] ) );
  226. die();
  227. }
  228. else {
  229. header( 'HTTP/1.0 404 Not Found' );
  230. die();
  231. }
  232. break;
  233. }
  234. //Save per page
  235. if ( isset( $_POST[ 'screen-options-apply' ] ) && isset( $_POST[ 'wp_screen_options' ][ 'option' ] ) && isset( $_POST[ 'wp_screen_options' ][ 'value' ] ) && $_POST[ 'wp_screen_options' ][ 'option' ] == 'backwpuplogs_per_page' ) {
  236. check_admin_referer( 'screen-options-nonce', 'screenoptionnonce' );
  237. global $current_user;
  238. if ( $_POST[ 'wp_screen_options' ][ 'value' ] > 0 && $_POST[ 'wp_screen_options' ][ 'value' ] < 1000 ) {
  239. update_user_option( $current_user->ID, 'backwpuplogs_per_page', (int)$_POST[ 'wp_screen_options' ][ 'value' ] );
  240. wp_redirect( remove_query_arg( array( 'pagenum', 'apage', 'paged' ), wp_get_referer() ) );
  241. exit;
  242. }
  243. }
  244. add_screen_option( 'per_page', array(
  245. 'label' => __( 'Logs', 'backwpup' ),
  246. 'default' => 20,
  247. 'option' => 'backwpuplogs_per_page'
  248. ) );
  249. self::$listtable->prepare_items();
  250. }
  251. /**
  252. *
  253. * Output css
  254. *
  255. * @return void
  256. */
  257. public static function admin_print_styles() {
  258. wp_enqueue_style('backwpupgeneral');
  259. ?>
  260. <style type="text/css" media="screen">
  261. .column-id {
  262. width: 5%;
  263. text-align: center;
  264. }
  265. .column-runtime, .column-status, .column-size {
  266. width: 8%;
  267. }
  268. .column-type {
  269. width: 15%;
  270. }
  271. </style>
  272. <?php
  273. }
  274. /**
  275. *
  276. * Output js
  277. *
  278. * @return void
  279. */
  280. public static function admin_print_scripts() {
  281. wp_enqueue_script( 'backwpupgeneral' );
  282. }
  283. /**
  284. * Display the page content
  285. */
  286. public static function page() {
  287. ?>
  288. <div class="wrap">
  289. <?php screen_icon(); ?>
  290. <h2><?php echo esc_html( sprintf( __( '%s Logs', 'backwpup' ), BackWPup::get_plugin_data( 'name' ) ) ); ?></h2>
  291. <?php BackWPup_Admin::display_messages(); ?>
  292. <form id="posts-filter" action="" method="get">
  293. <input type="hidden" name="page" value="backwpuplogs" />
  294. <?php self::$listtable->display(); ?>
  295. <div id="ajax-response"></div>
  296. </form>
  297. </div>
  298. <?php
  299. }
  300. /**
  301. * For displaying log files with ajax
  302. */
  303. public static function ajax_view_log() {
  304. if ( ! current_user_can( 'backwpup_logs' ) )
  305. die( -1 );
  306. check_ajax_referer( 'view-logs' );
  307. $log_file = BackWPup_Option::get( 'cfg', 'logfolder' ) . $_GET[ 'logfile' ];
  308. if ( ! is_file( $log_file ) && ! is_file( $log_file . '.gz' ) && ! is_file( $log_file . '.bz2' ) )
  309. die( -1 );
  310. //change file end if not html helps if log file compression is on
  311. if ( ! is_file( $log_file ) && is_file( $log_file . '.gz' ) )
  312. $log_file = $log_file . '.gz';
  313. if ( ! is_file( $log_file ) && is_file( $log_file . '.bz2' ) )
  314. $log_file = $log_file . '.bz2';
  315. //output file
  316. if ( '.gz' == substr( $log_file, -3 ) )
  317. echo file_get_contents( 'compress.zlib://' .$log_file, FALSE );
  318. elseif ( '.bz2' == substr( $log_file, -4 ) )
  319. echo file_get_contents( 'compress.bzip2://' . $log_file, FALSE );
  320. else
  321. echo file_get_contents( $log_file, FALSE );
  322. die();
  323. }
  324. }