Merge pull request #232 from int2001/selfupdate

Selfupdate
This commit is contained in:
Joerg (DJ7NT)
2024-03-24 09:52:14 +01:00
committed by GitHub
3 changed files with 161 additions and 144 deletions

1
.gitignore vendored
View File

@@ -2,6 +2,7 @@
/application/config/config.php
/application/logs/*.php
/application/cache/*
/uploads
/uploads/*.adi
/uploads/*.ADI
/uploads/*.tq8

View File

@@ -2,176 +2,188 @@
class Debug extends CI_Controller
{
function __construct()
{
parent::__construct();
function __construct() {
parent::__construct();
$this->load->model('user_model');
if (!$this->user_model->authorize(2)) {
$this->session->set_flashdata('notice', 'You\'re not allowed to do that!');
redirect('dashboard');
}
$this->load->model('user_model');
if (!$this->user_model->authorize(2)) {
$this->session->set_flashdata('notice', 'You\'re not allowed to do that!');
redirect('dashboard');
}
$this->load->library('Permissions');
}
$this->load->library('Permissions');
}
/* User Facing Links to Backup URLs */
public function index()
{
$this->load->helper('file');
/* User Facing Links to Backup URLs */
public function index() {
$this->load->helper('file');
$this->load->model('MigrationVersion');
$this->load->model('Logbook_model');
$this->load->model('Stations');
$this->load->model('MigrationVersion');
$this->load->model('Logbook_model');
$this->load->model('Stations');
$footerData = [];
$footerData['scripts'] = ['assets/js/sections/debug.js'];
$footerData = [];
$footerData['scripts'] = ['assets/js/sections/debug.js'];
$data['stations'] = $this->Stations->all();
$data['stations'] = $this->Stations->all();
$data['qsos_with_no_station_id'] = $this->Logbook_model->check_for_station_id();
if ($data['qsos_with_no_station_id']) {
$data['calls_wo_sid'] = $this->Logbook_model->calls_without_station_id();
}
$data['qsos_with_no_station_id'] = $this->Logbook_model->check_for_station_id();
if ($data['qsos_with_no_station_id']) {
$data['calls_wo_sid'] = $this->Logbook_model->calls_without_station_id();
}
$data['migration_version'] = $this->MigrationVersion->getMigrationVersion();
$data['migration_version'] = $this->MigrationVersion->getMigrationVersion();
// Test writing to backup folder
$backup_folder = $this->permissions->is_really_writable('backup');
$data['backup_folder'] = $backup_folder;
// Test writing to backup folder
$backup_folder = $this->permissions->is_really_writable('backup');
$data['backup_folder'] = $backup_folder;
// Test writing to updates folder
$updates_folder = $this->permissions->is_really_writable('updates');
$data['updates_folder'] = $updates_folder;
// 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;
// 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;
// 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;
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;
}
// run the status check and return the array to the view
$userdata_status = $this->check_userdata_status($userdata_folder);
$data['userdata_status'] = $userdata_status;
}
$data['page_title'] = "Debug";
$data['page_title'] = "Debug";
$this->load->view('interface_assets/header', $data);
$this->load->view('debug/index');
$this->load->view('interface_assets/footer', $footerData);
}
$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();
function check_userdata_status($userdata_folder) {
$this->load->model('debug_model');
// Check if the folder is writable
if ($userdata_folder === true) {
$status = array();
// 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');
// Check if the folder is writable
if ($userdata_folder === true) {
$flag_file = $this->debug_model->check_migrated_flag();
// 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');
if ($qsl_dir && $eqsl_dir) {
$flag_file = $this->debug_model->check_migrated_flag();
// 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';
});
if ($qsl_dir && $eqsl_dir) {
// 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';
});
// 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';
});
// Set the status info
if (!empty($qsl_files_filtered) || !empty($eqsl_files_filtered)) {
if (!$flag_file) {
$status['btn_class'] = '';
$status['btn_text'] = 'Migrate data now';
} else {
$status['btn_class'] = '';
$status['btn_text'] = 'Migration already done. Run again?';
}
} else {
$status['btn_class'] = 'disabled';
$status['btn_text'] = 'No data to migrate';
}
} else {
$status['btn_class'] = 'disabled';
$status['btn_text'] = 'No migration possible';
}
} else {
// If the folder is not writable, we don't need to continue
$status['btn_class'] = 'disabled';
$status['btn_text'] = 'No migration possible';
}
// 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';
});
return $status;
}
// Set the status info
if (!empty($qsl_files_filtered) || !empty($eqsl_files_filtered)) {
if (!$flag_file) {
$status['btn_class'] = '';
$status['btn_text'] = 'Migrate data now';
} else {
$status['btn_class'] = '';
$status['btn_text'] = 'Migration already done. Run again?';
}
} else {
$status['btn_class'] = 'disabled';
$status['btn_text'] = 'No data to migrate';
}
} else {
$status['btn_class'] = 'disabled';
$status['btn_text'] = 'No migration possible';
}
} else {
// If the folder is not writable, we don't need to continue
$status['btn_class'] = 'disabled';
$status['btn_text'] = 'No migration possible';
}
public function reassign()
{
$this->load->model('Logbook_model');
$this->load->model('Stations');
return $status;
}
$call = xss_clean(($this->input->post('call')));
$qsoids = xss_clean(($this->input->post('qsoids')));
$station_profile_id = xss_clean(($this->input->post('station_id')));
public function reassign() {
$this->load->model('Logbook_model');
$this->load->model('Stations');
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;
}
$call = xss_clean(($this->input->post('call')));
$qsoids = xss_clean(($this->input->post('qsoids')));
$station_profile_id = xss_clean(($this->input->post('station_id')));
header('Content-Type: application/json');
echo json_encode(array('status' => $status));
return;
}
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;
}
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();
header('Content-Type: application/json');
echo json_encode(array('status' => $status));
return;
}
if ($migrate == true) {
$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".');
redirect('debug');
} else {
$this->session->set_flashdata('error', 'File Migration failed. Please check the Error Log.');
redirect('debug');
}
}
}
public function selfupdate() {
if (file_exists('.git')) {
try {
$st=exec('touch '.realpath(APPPATH.'../').'/.maintenance');
$st=exec('git stash push --include-untracked');
$st=exec('git fetch');
$st=exec('git pull');
$st=exec('git stash pop');
$st=exec('rm '.realpath(APPPATH.'../').'/.maintenance');
} catch (\Throwable $th) {
log_message("Error","Error at selfupdating");
}
}
redirect('debug');
}
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) {
$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".');
redirect('debug');
} else {
$this->session->set_flashdata('error', 'File Migration failed. Please check the Error Log.');
redirect('debug');
}
}
}
}

View File

@@ -204,7 +204,7 @@
</table>
</div>
</div>
<?php if (file_exists('.git')) { ?>
<?php if (file_exists(realpath(APPPATH.'../').'/.git')) { ?>
<?php
//Below is a failsafe where git commands fail
try {
@@ -217,7 +217,7 @@
$commitDate = trim(exec('git log --pretty="%ci" -n1 HEAD'));
$line = trim(exec('git log -n 1 --pretty=%D HEAD'));
$pieces = explode(', ', $line);
$lastFetch = trim(exec('stat -c %Y .git/FETCH_HEAD'));
$lastFetch = trim(exec('stat -c %Y '.realpath(APPPATH.'../').'/.git/FETCH_HEAD'));
//Below is a failsafe for systems without the stat command
try {
$dt = new DateTime("@$lastFetch");
@@ -289,6 +289,10 @@
<?php echo ($dt == null ? '' : $dt->format(\DateTime::RFC850)); ?>
</td>
</tr>
<tr>
<td>Update Wavelog</td>
<td><a class="btn btn-sm btn-primary" href="debug/selfupdate" onClick='this.classList.add("disabled");'>Update</a></td>
</tr>
</table>
</table>
</div>
@@ -456,4 +460,4 @@
</div>
</div>
</div>
</div>