2024-02-26 17:42:46 +01:00
< ? php if ( ! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );
2021-04-05 11:31:41 +01:00
2024-02-26 17:42:46 +01:00
class Debug extends CI_Controller
{
2024-03-22 15:50:54 +00:00
function __construct () {
parent :: __construct ();
$this -> load -> model ( 'user_model' );
if ( ! $this -> user_model -> authorize ( 2 )) {
2024-08-16 10:08:44 +02:00
$this -> session -> set_flashdata ( 'error' , __ ( " You're not allowed to do that! " ));
2024-03-22 15:50:54 +00:00
redirect ( 'dashboard' );
}
$this -> load -> library ( 'Permissions' );
}
/* User Facing Links to Backup URLs */
public function index () {
$this -> load -> helper ( 'file' );
$this -> load -> model ( 'Logbook_model' );
2024-04-23 13:34:30 +02:00
$this -> load -> model ( 'Debug_model' );
2024-03-22 15:50:54 +00:00
$this -> load -> model ( 'Stations' );
2024-04-26 17:43:58 +02:00
$this -> load -> model ( 'cron_model' );
2024-09-12 13:23:01 +02:00
$this -> load -> model ( 'Update_model' );
2024-03-22 15:50:54 +00:00
$footerData = [];
$footerData [ 'scripts' ] = [ 'assets/js/sections/debug.js' ];
2025-01-01 09:57:48 +01:00
// Get Custom Date format
if ( $this -> session -> userdata ( 'user_date_format' )) {
$custom_date_format = $this -> session -> userdata ( 'user_date_format' );
} else {
$custom_date_format = $this -> config -> item ( 'qso_date_format' );
}
$data [ 'system_time' ] = date ( $custom_date_format . " H:i:s " , time ());
2024-09-12 16:30:21 +02:00
$data [ 'running_version' ] = $this -> optionslib -> get_option ( 'version' );
$data [ 'latest_release' ] = $this -> optionslib -> get_option ( 'latest_release' );
2024-09-12 16:09:12 +02:00
2024-09-12 16:13:01 +02:00
$data [ 'newer_version_available' ] = false ;
2024-09-12 17:55:36 +02:00
if ( ! $this -> config -> item ( 'disable_version_check' ) ? ? false ) {
2024-09-12 16:28:35 +02:00
$this -> Update_model -> update_check ( true );
2024-09-12 16:13:01 +02:00
if ( $data [ 'latest_release' ] && version_compare ( $data [ 'latest_release' ], $data [ 'running_version' ], '>' )) {
$data [ 'newer_version_available' ] = true ;
}
2024-09-12 13:23:01 +02:00
}
2024-03-22 15:50:54 +00:00
$data [ 'stations' ] = $this -> Stations -> all ();
2024-04-23 13:34:30 +02:00
$data [ 'qso_total' ] = $this -> Debug_model -> count_all_qso ();
2024-09-16 00:57:27 +02:00
$data [ 'users_total' ] = $this -> Debug_model -> count_users ();
2024-06-07 02:35:59 +02:00
$data [ 'available_languages' ] = $this -> config -> item ( 'languages' );
2024-03-22 15:50:54 +00:00
$data [ 'qsos_with_no_station_id' ] = $this -> Logbook_model -> check_for_station_id ();
if ( $data [ 'qsos_with_no_station_id' ]) {
2024-04-23 13:39:15 +02:00
$data [ 'calls_wo_sid' ] = $this -> Debug_model -> calls_without_station_id ();
2024-03-22 15:50:54 +00:00
}
2024-08-01 17:01:46 +02:00
// get mig version from database
2024-04-23 13:34:30 +02:00
$data [ 'migration_version' ] = $this -> Debug_model -> getMigrationVersion ();
2024-03-22 15:50:54 +00:00
2024-08-01 17:01:46 +02:00
// get mig version from config file
$this -> load -> config ( 'migration' );
$data [ 'migration_config' ] = $this -> config -> item ( 'migration_version' );
2024-08-06 11:02:55 +02:00
$data [ 'migration_lockfile' ] = $this -> config -> item ( 'migration_lockfile' );
$data [ 'miglock_lifetime' ] = $this -> config -> item ( 'migration_lf_maxage' );
2024-08-01 17:01:46 +02:00
// compare mig versions
2024-08-06 11:02:55 +02:00
if ( $data [ 'migration_version' ] != $data [ 'migration_config' ] && file_exists ( $data [ 'migration_lockfile' ])) {
2024-08-01 17:01:46 +02:00
$data [ 'migration_is_uptodate' ] = false ;
} else {
$data [ 'migration_is_uptodate' ] = true ;
}
2024-03-22 15:50:54 +00:00
// Test writing to backup folder
$backup_folder = $this -> permissions -> is_really_writable ( 'backup' );
$data [ 'backup_folder' ] = $backup_folder ;
2024-07-10 17:35:48 +02:00
// Test writing to cache folder
$cache_folder = $this -> permissions -> is_really_writable ( 'application/cache' );
$data [ 'cache_folder' ] = $cache_folder ;
2024-03-22 15:50:54 +00:00
// Test writing to updates folder
$updates_folder = $this -> permissions -> is_really_writable ( 'updates' );
$data [ 'updates_folder' ] = $updates_folder ;
// Test writing to uploads folder
$uploads_folder = $this -> permissions -> is_really_writable ( 'uploads' );
$data [ 'uploads_folder' ] = $uploads_folder ;
// Check if userdata config is enabled
$userdata_enabled = $this -> config -> item ( 'userdata' );
$data [ 'userdata_enabled' ] = $userdata_enabled ;
if ( isset ( $userdata_enabled )) {
// Test writing to userdata folder if option is enabled
$userdata_folder = $this -> permissions -> is_really_writable ( 'userdata' );
$data [ 'userdata_folder' ] = $userdata_folder ;
// run the status check and return the array to the view
$userdata_status = $this -> check_userdata_status ( $userdata_folder );
$data [ 'userdata_status' ] = $userdata_status ;
}
2024-04-26 17:43:58 +02:00
$data [ 'dxcc_update' ] = $this -> cron_model -> cron ( 'update_dxcc' ) -> row ();
$data [ 'dok_update' ] = $this -> cron_model -> cron ( 'update_update_dok' ) -> row ();
$data [ 'lotw_user_update' ] = $this -> cron_model -> cron ( 'update_lotw_users' ) -> row ();
$data [ 'pota_update' ] = $this -> cron_model -> cron ( 'update_update_pota' ) -> row ();
$data [ 'scp_update' ] = $this -> cron_model -> cron ( 'update_update_clublog_scp' ) -> row ();
$data [ 'sota_update' ] = $this -> cron_model -> cron ( 'update_update_sota' ) -> row ();
$data [ 'wwff_update' ] = $this -> cron_model -> cron ( 'update_update_wwff' ) -> row ();
2024-12-07 20:04:28 +01:00
$data [ 'tle_update' ] = $this -> cron_model -> cron ( 'update_update_tle' ) -> row ();
2024-04-26 17:43:58 +02:00
2024-06-08 11:01:59 +02:00
$data [ 'page_title' ] = __ ( " Debug " );
2024-03-22 15:50:54 +00:00
$this -> load -> view ( 'interface_assets/header' , $data );
$this -> load -> view ( 'debug/index' );
$this -> load -> view ( 'interface_assets/footer' , $footerData );
}
function check_userdata_status ( $userdata_folder ) {
$this -> load -> model ( 'debug_model' );
$status = array ();
// Check if the folder is writable
if ( $userdata_folder === true ) {
// Check if the qsl and eqsl folders are accessible and if there is any data the user could migrate
$qsl_dir = $this -> permissions -> is_really_writable ( 'assets/qslcard' );
$eqsl_dir = $this -> permissions -> is_really_writable ( 'images/eqsl_card_images' );
$flag_file = $this -> debug_model -> check_migrated_flag ();
if ( $qsl_dir && $eqsl_dir ) {
// Check for content of the qsl card folder other than *.html files
$qsl_files = glob ( 'assets/qslcard/*' );
$qsl_files_filtered = array_filter ( $qsl_files , function ( $file ) {
return ! is_dir ( $file ) && pathinfo ( $file , PATHINFO_EXTENSION ) !== 'html' ;
});
// Check for content of the eqsl card folder other than *.html files
$eqsl_files = glob ( 'images/eqsl_card_images/*' );
$eqsl_files_filtered = array_filter ( $eqsl_files , function ( $file ) {
return ! is_dir ( $file ) && pathinfo ( $file , PATHINFO_EXTENSION ) !== 'html' ;
});
// Set the status info
if ( ! empty ( $qsl_files_filtered ) || ! empty ( $eqsl_files_filtered )) {
if ( ! $flag_file ) {
$status [ 'btn_class' ] = '' ;
2024-07-11 17:50:55 +02:00
$status [ 'btn_text' ] = __ ( " Migrate data now " );
2024-03-22 15:50:54 +00:00
} else {
$status [ 'btn_class' ] = '' ;
2024-07-11 17:50:55 +02:00
$status [ 'btn_text' ] = __ ( " Migration already done. Run again? " );
2024-03-22 15:50:54 +00:00
}
} else {
$status [ 'btn_class' ] = 'disabled' ;
2024-07-11 17:50:55 +02:00
$status [ 'btn_text' ] = __ ( " No data to migrate " );
2024-03-22 15:50:54 +00:00
}
} else {
$status [ 'btn_class' ] = 'disabled' ;
2024-07-11 17:50:55 +02:00
$status [ 'btn_text' ] = __ ( " No migration possible " );
2024-03-22 15:50:54 +00:00
}
} else {
// If the folder is not writable, we don't need to continue
$status [ 'btn_class' ] = 'disabled' ;
2024-07-11 17:50:55 +02:00
$status [ 'btn_text' ] = __ ( " No migration possible " );
2024-03-22 15:50:54 +00:00
}
return $status ;
}
public function reassign () {
$this -> load -> model ( 'Logbook_model' );
$this -> load -> model ( 'Stations' );
$call = xss_clean (( $this -> input -> post ( 'call' )));
$qsoids = xss_clean (( $this -> input -> post ( 'qsoids' )));
$station_profile_id = xss_clean (( $this -> input -> post ( 'station_id' )));
log_message ( 'debug' , 'station_profile_id:' , $station_profile_id );
// Check if target-station-id exists
$allowed = false ;
$status = false ;
$stations = $this -> Stations -> all ();
foreach ( $stations -> result () as $station ) {
if ( $station -> station_id == $station_profile_id ) {
$allowed = true ;
}
}
if ( $allowed ) {
$status = $this -> Logbook_model -> update_station_ids ( $station_profile_id , $call , $qsoids );
} else {
$status = false ;
}
header ( 'Content-Type: application/json' );
echo json_encode ( array ( 'status' => $status ));
return ;
}
2024-04-23 13:34:30 +02:00
public function selfupdate () {
2024-07-14 19:56:33 +02:00
$stashfile = realpath ( APPPATH . '../' ) . '/.updater' ;
$maintenancefile = realpath ( APPPATH . '../' ) . '/.maintenance' ;
2024-07-30 21:15:16 +02:00
if ( function_usable ( 'exec' )) {
if ( file_exists ( '.git' )) {
try {
// enter maintenance mode
exec ( 'touch ' . $maintenancefile );
log_message ( 'debug' , 'Updater: Entered Maintenance mode by creating .maintenance file' );
// we need atleast one file which gets stashed. this file should NOT be in .gitignore
exec ( 'touch ' . $stashfile );
log_message ( 'debug' , 'Updater: Created stashfile' );
// stash everything else
exec ( 'git stash push --include-untracked' );
log_message ( 'debug' , 'Updater: Stash everything' );
// perform the pull
exec ( 'git fetch' );
exec ( 'git pull' );
log_message ( 'debug' , 'Updater: git fetch and git pull' );
// we can now pop all other changes
exec ( 'git stash pop' );
log_message ( 'debug' , 'Updater: Pop stashed changes' );
// Show success message
$this -> session -> set_flashdata ( 'success' , __ ( " Wavelog was updated successfully! " ));
2024-12-07 20:04:28 +01:00
2024-07-30 21:15:16 +02:00
} catch ( \Throwable $th ) {
log_message ( " Error " , " Error at selfupdating " );
}
2024-03-22 15:50:54 +00:00
}
2024-07-30 21:15:16 +02:00
// delete the stash file
if ( file_exists ( $stashfile )) {
exec ( 'rm ' . $stashfile );
log_message ( 'debug' , 'Updater: Delete stashfile' );
}
// exit maintenance mode
if ( file_exists ( $maintenancefile )) {
exec ( 'rm ' . $maintenancefile );
log_message ( 'debug' , 'Updater: Delete .maintenance file to exit Maintenance Mode' );
}
} else {
log_message ( 'error' , 'function exec() not available. Debug Controller selfupdate()' );
$this -> session -> set_flashdata ( 'error' , __ ( " Selfupdate() not available. Check the Error Log. " ));
2024-07-14 19:56:33 +02:00
}
2024-03-22 15:50:54 +00:00
redirect ( 'debug' );
}
2024-03-25 06:06:02 +00:00
public function wavelog_fetch () {
$a_versions = [];
2024-07-30 21:15:16 +02:00
if ( function_usable ( 'exec' )) {
try {
$st = exec ( 'git fetch' ); // Fetch latest things from Repo. ONLY Fetch. Doesn't hurt since it isn't a pull!
$versions [ 'branch' ] = trim ( exec ( 'git rev-parse --abbrev-ref HEAD' )); // Get ONLY Name of the Branch we're on
$versions [ 'latest_commit_hash' ] = substr ( trim ( exec ( 'git log --pretty="%H" -n1 origin' . '/' . $versions [ 'branch' ])), 0 , 8 ); // fetch latest commit-hash from repo
} catch ( Exception $e ) {
$versions [ 'latest_commit_hash' ] = '' ;
$versions [ 'branch' ] = '' ;
}
} else {
log_message ( 'error' , 'wavelog_fetch() not available. Function exec() not usable.' );
2024-03-25 06:06:02 +00:00
}
header ( 'Content-Type: application/json' );
echo json_encode ( $versions );
}
2024-03-24 15:22:25 +01:00
public function wavelog_version () {
2024-07-30 21:15:16 +02:00
if ( function_usable ( 'exec' )) {
$commit_hash = substr ( trim ( exec ( 'git log --pretty="%H" -n1 HEAD' )), 0 , 8 ); // Get latest LOCAL Hash
} else {
log_message ( 'error' , 'wavelog_version() not available. Function exec() not usable.' );
}
2024-03-24 16:53:09 +01:00
header ( 'Content-Type: application/json' );
2024-03-25 06:06:02 +00:00
echo json_encode ( $commit_hash );
2024-03-24 15:22:25 +01:00
}
2024-03-22 15:50:54 +00:00
public function migrate_userdata () {
// Check if users logged in
$this -> load -> model ( 'user_model' );
if ( $this -> user_model -> validate_session () == 0 ) {
// user is not logged in
redirect ( 'user/login' );
} else {
$this -> load -> model ( 'debug_model' );
$migrate = $this -> debug_model -> migrate_userdata ();
if ( $migrate == true ) {
2024-07-11 17:50:55 +02:00
$this -> session -> set_flashdata ( 'success' , __ ( " File Migration was successfull, but please check also manually. If everything seems right you can delete the folders 'assets/qslcard' and 'images/eqsl_card_images'. " ));
2024-03-22 15:50:54 +00:00
redirect ( 'debug' );
} else {
2024-07-11 17:50:55 +02:00
$this -> session -> set_flashdata ( 'error' , __ ( " File Migration failed. Please check the Error Log. " ));
2024-03-22 15:50:54 +00:00
redirect ( 'debug' );
}
}
}
2023-11-11 09:35:27 +01:00
}