Working on the uninstaller

master
Mike Koch 7 years ago
parent 60ac53fe94
commit 7aa7526a17
No known key found for this signature in database
GPG Key ID: 9BA5D7F8391455ED

@ -31,7 +31,7 @@ hesk_dbConnect();
</div>
<div class="panel panel-success" id="all-good" style="display: none">
<div class="panel-heading">
<h4>Success</h4>
<h4>w00t!</h4>
</div>
<div class="panel-body text-center">
<i class="fa fa-check-circle fa-4x" style="color: green"></i><br>
@ -40,7 +40,7 @@ hesk_dbConnect();
</div>
<div class="panel panel-danger" id="not-good" style="display: none">
<div class="panel-heading">
<h4>Failure</h4>
<h4>RIP</h4>
</div>
<div class="panel-body text-center">
<i class="fa fa-times-circle fa-4x" style="color: red"></i><br>
@ -65,145 +65,147 @@ hesk_dbConnect();
output_header_row('1.0.0 - 1.3.x');
$all_good = run_table_check('statuses');
$all_good = $all_good & run_column_check('statuses', 'ID');
$all_good = $all_good & run_column_check('statuses', 'TextColor');
$all_good = $all_good & run_column_check('statuses', 'IsNewTicketStatus');
$all_good = $all_good & run_column_check('statuses', 'IsClosed');
$all_good = $all_good & run_column_check('statuses', 'IsClosedByClient');
$all_good = $all_good & run_column_check('statuses', 'IsCustomerReplyStatus');
$all_good = $all_good & run_column_check('statuses', 'IsStaffClosedOption');
$all_good = $all_good & run_column_check('statuses', 'IsStaffReopenedStatus');
$all_good = $all_good & run_column_check('statuses', 'IsDefaultStaffReplyStatus');
$all_good = $all_good & run_column_check('statuses', 'LockedTicketStatus');
$all_good = $all_good & run_column_check('statuses', 'IsAutocloseOption');
$all_good = $all_good & run_column_check('statuses', 'Closable');
$all_good &= run_column_check('statuses', 'ID');
$all_good &= run_column_check('statuses', 'TextColor');
$all_good &= run_column_check('statuses', 'IsNewTicketStatus');
$all_good &= run_column_check('statuses', 'IsClosed');
$all_good &= run_column_check('statuses', 'IsClosedByClient');
$all_good &= run_column_check('statuses', 'IsCustomerReplyStatus');
$all_good &= run_column_check('statuses', 'IsStaffClosedOption');
$all_good &= run_column_check('statuses', 'IsStaffReopenedStatus');
$all_good &= run_column_check('statuses', 'IsDefaultStaffReplyStatus');
$all_good &= run_column_check('statuses', 'LockedTicketStatus');
output_header_row('1.5.0');
$all_good = $all_good & run_column_check('users', 'active');
$all_good = $all_good & run_column_check('users', 'notify_note_unassigned');
$all_good &= run_column_check('users', 'active');
$all_good &= run_column_check('users', 'notify_note_unassigned');
output_header_row('1.6.0');
$all_good = $all_good & run_table_check('settings');
$all_good &= run_table_check('settings');
output_header_row('1.7.0');
$all_good = $all_good & run_table_check('verified_emails');
$all_good = $all_good & run_table_check('pending_verification_emails');
$all_good = $all_good & run_table_check('stage_tickets');
$all_good &= run_table_check('verified_emails');
$all_good &= run_table_check('pending_verification_emails');
$all_good &= run_table_check('stage_tickets');
output_header_row('2.2.0');
$all_good &= run_column_check('statuses', 'IsAutocloseOption');
$all_good &= run_column_check('statuses', 'Closable');
output_header_row('2.3.0');
$all_good = $all_good & run_column_check('service_messages', 'icon');
$all_good = $all_good & run_column_check('statuses', 'Key');
$all_good = $all_good & run_column_check('tickets', 'latitude');
$all_good = $all_good & run_column_check('tickets', 'longitude');
$all_good = $all_good & run_column_check('stage_tickets', 'latitude');
$all_good = $all_good & run_column_check('stage_tickets', 'longitude');
$all_good = $all_good & run_column_check('categories', 'manager');
$all_good = $all_good & run_column_check('users', 'permission_template');
$all_good = $all_good & run_table_check('permission_templates');
$all_good = $all_good & run_column_check('permission_templates', 'id');
$all_good = $all_good & run_column_check('permission_templates', 'name');
$all_good = $all_good & run_column_check('permission_templates', 'heskprivileges');
$all_good = $all_good & run_column_check('permission_templates', 'categories');
$all_good &= run_column_check('service_messages', 'icon');
$all_good &= run_column_check('statuses', 'Key');
$all_good &= run_column_check('tickets', 'latitude');
$all_good &= run_column_check('tickets', 'longitude');
$all_good &= run_column_check('stage_tickets', 'latitude');
$all_good &= run_column_check('stage_tickets', 'longitude');
$all_good &= run_column_check('categories', 'manager');
$all_good &= run_column_check('users', 'permission_template');
$all_good &= run_table_check('permission_templates');
$all_good &= run_column_check('permission_templates', 'id');
$all_good &= run_column_check('permission_templates', 'name');
$all_good &= run_column_check('permission_templates', 'heskprivileges');
$all_good &= run_column_check('permission_templates', 'categories');
output_header_row('2.4.0');
$all_good = $all_good & run_table_check('quick_help_sections');
$all_good = $all_good & run_column_check('quick_help_sections', 'id');
$all_good = $all_good & run_column_check('quick_help_sections', 'location');
$all_good = $all_good & run_column_check('quick_help_sections', 'show');
$all_good = $all_good & run_table_check('text_to_status_xref');
$all_good = $all_good & run_column_check('text_to_status_xref', 'id');
$all_good = $all_good & run_column_check('text_to_status_xref', 'language');
$all_good = $all_good & run_column_check('text_to_status_xref', 'text');
$all_good = $all_good & run_column_check('text_to_status_xref', 'status_id');
$all_good = $all_good & run_column_check('statuses', 'sort');
$all_good = $all_good & run_column_check('attachments', 'download_count');
$all_good = $all_good & run_column_check('kb_attachments', 'download_count');
$all_good = $all_good & run_column_check('tickets', 'html');
$all_good = $all_good & run_column_check('stage_tickets', 'html');
$all_good = $all_good & run_column_check('replies', 'html');
$all_good &= run_table_check('quick_help_sections');
$all_good &= run_column_check('quick_help_sections', 'id');
$all_good &= run_column_check('quick_help_sections', 'location');
$all_good &= run_column_check('quick_help_sections', 'show');
$all_good &= run_table_check('text_to_status_xref');
$all_good &= run_column_check('text_to_status_xref', 'id');
$all_good &= run_column_check('text_to_status_xref', 'language');
$all_good &= run_column_check('text_to_status_xref', 'text');
$all_good &= run_column_check('text_to_status_xref', 'status_id');
$all_good &= run_column_check('statuses', 'sort');
$all_good &= run_column_check('attachments', 'download_count');
$all_good &= run_column_check('kb_attachments', 'download_count');
$all_good &= run_column_check('tickets', 'html');
$all_good &= run_column_check('stage_tickets', 'html');
$all_good &= run_column_check('replies', 'html');
output_header_row('2.5.0');
$all_good = $all_good & run_column_check('tickets', 'user_agent');
$all_good = $all_good & run_column_check('tickets', 'screen_resolution_width');
$all_good = $all_good & run_column_check('tickets', 'screen_resolution_height');
$all_good = $all_good & run_column_check('stage_tickets', 'user_agent');
$all_good = $all_good & run_column_check('stage_tickets', 'screen_resolution_width');
$all_good = $all_good & run_column_check('stage_tickets', 'screen_resolution_height');
$all_good &= run_column_check('tickets', 'user_agent');
$all_good &= run_column_check('tickets', 'screen_resolution_width');
$all_good &= run_column_check('tickets', 'screen_resolution_height');
$all_good &= run_column_check('stage_tickets', 'user_agent');
$all_good &= run_column_check('stage_tickets', 'screen_resolution_width');
$all_good &= run_column_check('stage_tickets', 'screen_resolution_height');
output_header_row('2.6.0');
$all_good = $all_good & run_table_check('logging');
$all_good = $all_good & run_column_check('logging', 'id');
$all_good = $all_good & run_column_check('logging', 'username');
$all_good = $all_good & run_column_check('logging', 'message');
$all_good = $all_good & run_column_check('logging', 'severity');
$all_good = $all_good & run_column_check('logging', 'location');
$all_good = $all_good & run_column_check('logging', 'timestamp');
$all_good = $all_good & run_table_check('user_api_tokens');
$all_good = $all_good & run_column_check('user_api_tokens', 'id');
$all_good = $all_good & run_column_check('user_api_tokens', 'user_id');
$all_good = $all_good & run_column_check('user_api_tokens', 'token');
$all_good = $all_good & run_table_check('temp_attachment');
$all_good = $all_good & run_column_check('temp_attachment', 'id');
$all_good = $all_good & run_column_check('temp_attachment', 'file_name');
$all_good = $all_good & run_column_check('temp_attachment', 'saved_name');
$all_good = $all_good & run_column_check('temp_attachment', 'size');
$all_good = $all_good & run_column_check('temp_attachment', 'type');
$all_good = $all_good & run_column_check('temp_attachment', 'date_uploaded');
$all_good = $all_good & run_table_check('calendar_event');
$all_good = $all_good & run_column_check('calendar_event', 'id');
$all_good = $all_good & run_column_check('calendar_event', 'start');
$all_good = $all_good & run_column_check('calendar_event', 'end');
$all_good = $all_good & run_column_check('calendar_event', 'all_day');
$all_good = $all_good & run_column_check('calendar_event', 'name');
$all_good = $all_good & run_column_check('calendar_event', 'location');
$all_good = $all_good & run_column_check('calendar_event', 'comments');
$all_good = $all_good & run_column_check('calendar_event', 'category');
$all_good = $all_good & run_table_check('calendar_event_reminder');
$all_good = $all_good & run_column_check('calendar_event_reminder', 'id');
$all_good = $all_good & run_column_check('calendar_event_reminder', 'user_id');
$all_good = $all_good & run_column_check('calendar_event_reminder', 'event_id');
$all_good = $all_good & run_column_check('calendar_event_reminder', 'amount');
$all_good = $all_good & run_column_check('calendar_event_reminder', 'unit');
$all_good = $all_good & run_column_check('calendar_event_reminder', 'email_sent');
$all_good = $all_good & run_column_check('tickets', 'due_date');
$all_good = $all_good & run_column_check('tickets', 'overdue_email_sent');
$all_good = $all_good & run_column_check('categories', 'usage');
$all_good = $all_good & run_column_check('users', 'notify_overdue_unassigned');
$all_good = $all_good & run_column_check('users', 'default_calendar_view');
$all_good &= run_table_check('logging');
$all_good &= run_column_check('logging', 'id');
$all_good &= run_column_check('logging', 'username');
$all_good &= run_column_check('logging', 'message');
$all_good &= run_column_check('logging', 'severity');
$all_good &= run_column_check('logging', 'location');
$all_good &= run_column_check('logging', 'timestamp');
$all_good &= run_table_check('user_api_tokens');
$all_good &= run_column_check('user_api_tokens', 'id');
$all_good &= run_column_check('user_api_tokens', 'user_id');
$all_good &= run_column_check('user_api_tokens', 'token');
$all_good &= run_table_check('temp_attachment');
$all_good &= run_column_check('temp_attachment', 'id');
$all_good &= run_column_check('temp_attachment', 'file_name');
$all_good &= run_column_check('temp_attachment', 'saved_name');
$all_good &= run_column_check('temp_attachment', 'size');
$all_good &= run_column_check('temp_attachment', 'type');
$all_good &= run_column_check('temp_attachment', 'date_uploaded');
$all_good &= run_table_check('calendar_event');
$all_good &= run_column_check('calendar_event', 'id');
$all_good &= run_column_check('calendar_event', 'start');
$all_good &= run_column_check('calendar_event', 'end');
$all_good &= run_column_check('calendar_event', 'all_day');
$all_good &= run_column_check('calendar_event', 'name');
$all_good &= run_column_check('calendar_event', 'location');
$all_good &= run_column_check('calendar_event', 'comments');
$all_good &= run_column_check('calendar_event', 'category');
$all_good &= run_table_check('calendar_event_reminder');
$all_good &= run_column_check('calendar_event_reminder', 'id');
$all_good &= run_column_check('calendar_event_reminder', 'user_id');
$all_good &= run_column_check('calendar_event_reminder', 'event_id');
$all_good &= run_column_check('calendar_event_reminder', 'amount');
$all_good &= run_column_check('calendar_event_reminder', 'unit');
$all_good &= run_column_check('calendar_event_reminder', 'email_sent');
$all_good &= run_column_check('tickets', 'due_date');
$all_good &= run_column_check('tickets', 'overdue_email_sent');
$all_good &= run_column_check('categories', 'usage');
$all_good &= run_column_check('users', 'notify_overdue_unassigned');
$all_good &= run_column_check('users', 'default_calendar_view');
output_header_row('2.6.2');
$all_good = $all_good & run_column_check('stage_tickets', 'due_date');
$all_good = $all_good & run_column_check('stage_tickets', 'overdue_email_sent');
$all_good &= run_column_check('stage_tickets', 'due_date');
$all_good &= run_column_check('stage_tickets', 'overdue_email_sent');
output_header_row('3.1.0');
$all_good = $all_good & run_column_check('categories', 'background_color');
$all_good = $all_good & run_column_check('categories', 'foreground_color');
$all_good = $all_good & run_column_check('categories', 'display_border_outline');
$all_good = $all_good & run_column_check('logging', 'stack_trace');
$all_good = $all_good & run_table_check('custom_nav_element');
$all_good = $all_good & run_column_check('custom_nav_element', 'id');
$all_good = $all_good & run_column_check('custom_nav_element', 'image_url');
$all_good = $all_good & run_column_check('custom_nav_element', 'font_icon');
$all_good = $all_good & run_column_check('custom_nav_element', 'place');
$all_good = $all_good & run_column_check('custom_nav_element', 'url');
$all_good = $all_good & run_column_check('custom_nav_element', 'sort');
$all_good = $all_good & run_table_check('custom_nav_element_to_text');
$all_good = $all_good & run_column_check('custom_nav_element_to_text', 'id');
$all_good = $all_good & run_column_check('custom_nav_element_to_text', 'nav_element_id');
$all_good = $all_good & run_column_check('custom_nav_element_to_text', 'language');
$all_good = $all_good & run_column_check('custom_nav_element_to_text', 'text');
$all_good = $all_good & run_column_check('custom_nav_element_to_text', 'subtext');
$all_good = $all_good & run_setting_check('admin_navbar_background');
$all_good = $all_good & run_setting_check('admin_navbar_background_hover');
$all_good = $all_good & run_setting_check('admin_navbar_text');
$all_good = $all_good & run_setting_check('admin_navbar_text_hover');
$all_good = $all_good & run_setting_check('admin_navbar_brand_background');
$all_good = $all_good & run_setting_check('admin_navbar_brand_background_hover');
$all_good = $all_good & run_setting_check('admin_navbar_brand_text');
$all_good = $all_good & run_setting_check('admin_navbar_brand_text_hover');
$all_good = $all_good & run_setting_check('admin_sidebar_background');
$all_good = $all_good & run_setting_check('admin_sidebar_background_hover');
$all_good = $all_good & run_setting_check('admin_sidebar_text');
$all_good = $all_good & run_setting_check('admin_sidebar_text_hover');
$all_good = $all_good & run_setting_check('admin_sidebar_font_weight');
$all_good = $all_good & run_setting_check('admin_sidebar_header_background');
$all_good = $all_good & run_setting_check('admin_sidebar_header_text');
$all_good &= run_column_check('categories', 'background_color');
$all_good &= run_column_check('categories', 'foreground_color');
$all_good &= run_column_check('categories', 'display_border_outline');
$all_good &= run_column_check('logging', 'stack_trace');
$all_good &= run_table_check('custom_nav_element');
$all_good &= run_column_check('custom_nav_element', 'id');
$all_good &= run_column_check('custom_nav_element', 'image_url');
$all_good &= run_column_check('custom_nav_element', 'font_icon');
$all_good &= run_column_check('custom_nav_element', 'place');
$all_good &= run_column_check('custom_nav_element', 'url');
$all_good &= run_column_check('custom_nav_element', 'sort');
$all_good &= run_table_check('custom_nav_element_to_text');
$all_good &= run_column_check('custom_nav_element_to_text', 'id');
$all_good &= run_column_check('custom_nav_element_to_text', 'nav_element_id');
$all_good &= run_column_check('custom_nav_element_to_text', 'language');
$all_good &= run_column_check('custom_nav_element_to_text', 'text');
$all_good &= run_column_check('custom_nav_element_to_text', 'subtext');
$all_good &= run_setting_check('admin_navbar_background');
$all_good &= run_setting_check('admin_navbar_background_hover');
$all_good &= run_setting_check('admin_navbar_text');
$all_good &= run_setting_check('admin_navbar_text_hover');
$all_good &= run_setting_check('admin_navbar_brand_background');
$all_good &= run_setting_check('admin_navbar_brand_background_hover');
$all_good &= run_setting_check('admin_navbar_brand_text');
$all_good &= run_setting_check('admin_navbar_brand_text_hover');
$all_good &= run_setting_check('admin_sidebar_background');
$all_good &= run_setting_check('admin_sidebar_background_hover');
$all_good &= run_setting_check('admin_sidebar_text');
$all_good &= run_setting_check('admin_sidebar_text_hover');
$all_good &= run_setting_check('admin_sidebar_font_weight');
$all_good &= run_setting_check('admin_sidebar_header_background');
$all_good &= run_setting_check('admin_sidebar_header_text');
output_header_row('3.2.0');
$all_good &= run_table_check('audit_trail');
$all_good &= run_table_check('audit_trail_to_replacement_values');
$all_good &= run_column_check('categories', 'mfh_description');
$all_good &= run_column_check('custom_fields', 'mfh_description');
$all_good &= run_setting_check('migrationNumber');
if ($all_good) {
echo "<script>$('#all-good').show()</script>";

@ -0,0 +1,157 @@
var steps = [
{
name: 'intro',
text: 'Uninstall',
callback: undefined
},
{
name: 'db-confirm',
text: 'Confirm the information below',
callback: undefined
},
{
name: 'uninstall',
text: 'Uninstalling...',
showBack: false,
showNext: false,
callback: uninstall
},
{
name: 'complete',
text: 'Uninstall Process Complete',
showBack: false,
callback: undefined
}
];
$(document).ready(function() {
var currentStep = 0;
$('#next-button').click(function() {
goToStep(++currentStep);
});
$('#back-button').click(function() {
goToStep(--currentStep);
});
});
function goToStep(step) {
$('[data-step]').hide();
$('[data-step="' + steps[step].name + '"]').show();
if (step === 0) {
$('#tools-button').show();
$('#back-button').hide();
} else {
$('#tools-button').hide();
$('#back-button').show();
}
if (step === steps.length - 1) {
$('#next-button').hide();
} else {
$('#next-button').show();
}
// Back/Next button overrides
if (steps[step].showBack !== undefined && !steps[step].showBack) {
$('#back-button').hide();
}
if (steps[step].showNext !== undefined && !steps[step].showNext) {
console.log('hiding this');
$('#next-button').hide();
}
$('#header-text').text(steps[step].text);
if (steps[step].callback !== undefined) {
steps[step].callback();
}
}
function uninstall() {
var startingMigrationNumber = parseInt($('input[name="starting-migration-number"]').val());
var heskPath = $('p#hesk-path').text();
$.ajax({
url: heskPath + 'install/ajax/get-migration-ajax.php',
method: 'GET',
success: function(data) {
data = JSON.parse(data);
$('[data-step="install-or-update"] > #spinner').hide();
$('[data-step="install-or-update"] > .progress').show();
// Recursive call that will increment by 1 each time
executeMigration(startingMigrationNumber, 1, 'down');
}
})
}
function executeMigration(migrationNumber, latestMigrationNumber, direction) {
var heskPath = $('p#hesk-path').text();
$.ajax({
url: heskPath + 'install/ajax/process-migration.php',
method: 'POST',
data: JSON.stringify({
migrationNumber: migrationNumber,
direction: direction
}),
success: function(data) {
console.log('migrationNumber: ' + migrationNumber);
console.log('latestMigrationNumber: ' + latestMigrationNumber);
console.info('---');
if (migrationNumber === latestMigrationNumber || (migrationNumber === 1 && direction === 'down')) {
updateProgressBar(migrationNumber, latestMigrationNumber, direction === 'down', true);
console.log('%c Success! ', 'color: white; background-color: green; font-size: 2em');
} else {
updateProgressBar(migrationNumber, latestMigrationNumber, false, false);
var newMigrationNumber = direction === 'up' ? migrationNumber + 1 : migrationNumber - 1;
executeMigration(newMigrationNumber, latestMigrationNumber, direction);
}
},
error: function(response) {
try {
message = JSON.parse(response);
} catch (e) {
message = response.responseText;
}
$errorBlock = $('#error-block');
$errorBlock.html($errorBlock.html() + "<br><br>An error occurred! (Error Code: " + migrationNumber + ")<br>" + message).show();
updateProgressBar(migrationNumber, latestMigrationNumber, true, false);
if (direction === 'up') {
// Revert!
executeMigration(migrationNumber - 1, latestMigrationNumber, 'down');
} else {
console.error("I even failed to roll back. Yikes! :'(");
}
console.error(message);
}
})
}
function updateProgressBar(migrationNumber, latestMigrationNumber, isError, isFinished) {
var $progressBar = $('#progress-bar');
if (isError === true) {
$progressBar.find('.progress-bar').removeClass('progress-bar-success')
.addClass('progress-bar-danger');
if (isFinished) {
var $errorBlock = $('#error-block');
$errorBlock.html($errorBlock.html() + '<br><br>Successfully reverted database to before uninstalling.');
}
} else {
var percentage = Math.round(migrationNumber / latestMigrationNumber * 100);
$progressBar.find('.progress-bar').css('width', percentage + '%');
}
if (isFinished && !isError) {
goToStep(steps.length - 1);
}
}

@ -1,102 +0,0 @@
function getTasks() {
return ['status-change', 'drop-columns'];
}
function processUninstallation() {
var tasks = getTasks();
//-- Change status column to default HESK values
tasks.forEach(function (task) {
startUninstallation(task);
executeUninstallation(task);
});
}
function startUninstallation(task) {
$('#spinner-' + task)
.removeClass('fa-exclamation-triangle')
.addClass('fa-spinner')
.addClass('fa-pulse');
changeRowTo('row', task, 'info');
changeTextTo('span', task, 'In Progress');
}
function changeTextTo(prefix, task, text) {
$('#' + prefix + '-' + task).text(text);
}
function changeRowTo(prefix, task, clazz) {
//-- Remove all classes
$('#' + prefix + '-' + task)
.removeClass('info')
.removeClass('warning')
.removeClass('danger')
.removeClass('success');
//-- Re-add the requested class
$('#' + prefix + '-' + task).addClass(clazz);
}
function executeUninstallation(task) {
appendToInstallConsole('<tr><td><span class="label label-info">INFO</span></td><td>Starting task code: ' + task + '</td></tr>');
$.ajax({
type: 'POST',
url: 'ajax/uninstall-database-ajax.php',
data: {task: task},
success: function (data) {
markUninstallAsSuccess(task);
checkForCompletion();
},
error: function (data) {
if (data.status == 400) {
appendToInstallConsole('<tr><td><span class="label label-danger">ERROR</span></td><td>The task <code>' + task + '</code> was not recognized. Check the value submitted and try again.</td></tr>');
} else {
appendToInstallConsole('<tr><td><span class="label label-danger">ERROR</span></td><td>' + data.responseText + '</td></tr>');
}
markUninstallAsFailure(task);
}
});
}
function checkForCompletion() {
// If all rows have a .success row, installation is finished
var numberOfTasks = getTasks().length;
var numberOfCompletions = $('tr.success').length;
if (numberOfTasks == numberOfCompletions) {
uninstallationFinished();
}
}
function uninstallationFinished() {
appendToInstallConsole('<tr><td><span class="label label-success">SUCCESS</span></td><td>Uninstallation complete</td></tr>');
var output = '<div class="panel-body">' +
'<div class="col-md-12 text-center">' +
'<i class="fa fa-check-circle fa-4x" style="color: #008000"></i><br><br>' +
'<h4>Awesome! The automated portion of uninstalling Mods for HESK has completed. ' +
'Please follow <a href="http://mods-for-hesk.mkochcs.com/uninstall-instructions.php" target="_blank">these instructions</a> ' +
'on the Mods for HESK website to finish uninstallation.</h4>' +
'</div>' +
'</div>';
$('#uninstall-information').html(output);
}
function markUninstallAsSuccess(task) {
removeSpinner(task);
$('#spinner-' + task).addClass('fa-check-circle');
changeTextTo('span', task, 'Completed Successfully');
changeRowTo('row', task, 'success');
appendToInstallConsole('<tr><td><span class="label label-success">SUCCESS</span></td><td>Uninstall for task code: <code>' + task + '</code> complete</td></tr>');
}
function markUninstallAsFailure(task) {
removeSpinner(task);
$('#spinner-' + task).addClass('fa-times-circle');
changeRowTo('row', task, 'danger');
changeTextTo('span', task, 'Uninstall failed! Check the console for more information');
}
function removeSpinner(task) {
$('#spinner-' + task)
.removeClass('fa-pulse')
.removeClass('fa-spinner');
}
jQuery(document).ready(loadJquery);

@ -1,86 +0,0 @@
<?php
define('IN_SCRIPT', 1);
define('HESK_PATH', '../../');
require(HESK_PATH . 'install/install_functions.inc.php');
require(HESK_PATH . 'hesk_settings.inc.php');
function echoTaskRows()
{
printUninstallRow('Remove custom statuses', 'status-change');
printUninstallRow('Reset other tables', 'drop-columns');
}
function printUninstallRow($text, $id)
{
echo '<tr id="row-' . $id . '">';
echo '<td>' . $text . '</td>';
echo '<td><i id="spinner-' . $id . '" class="fa fa-spinner"></i> <span id="span-' . $id . '">Waiting...</span></td>';
echo '</tr>';
}
?>
<html>
<head>
<title>Uninstalling Mods for HESK</title>
<link href="../../hesk_style.css?<?php echo HESK_NEW_VERSION; ?>" type="text/css" rel="stylesheet"/>
<link href="<?php echo HESK_PATH; ?>css/bootstrap.css?v=<?php echo $hesk_settings['hesk_version']; ?>"
type="text/css" rel="stylesheet"/>
<link href="<?php echo HESK_PATH; ?>css/bootstrap-theme.css?v=<?php echo $hesk_settings['hesk_version']; ?>"
type="text/css" rel="stylesheet"/>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<link href="../../css/hesk_newStyle.css" type="text/css" rel="stylesheet"/>
<script src="<?php echo HESK_PATH; ?>js/jquery-1.10.2.min.js"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap.min.js"></script>
<script language="Javascript" type="text/javascript"
src="<?php echo HESK_PATH; ?>js/modsForHesk-javascript.js"></script>
<script language="JavaScript" type="text/javascript"
src="<?php echo HESK_PATH; ?>install/mods-for-hesk/js/ui-scripts.js"></script>
<script language="JavaScript" type="text/javascript"
src="<?php echo HESK_PATH; ?>install/mods-for-hesk/js/uninstall-scripts.js"></script>
<script language="JavaScript" type="text/javascript"
src="<?php echo HESK_PATH; ?>js/bootstrap-datepicker.js"></script>
</head>
<body>
<div class="headersm">Uninstalling Mods for HESK</div>
<div class="container">
<div class="page-header">
<h1>Uninstalling Mods for HESK</h1>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">Uninstallation Progress</div>
<div id="uninstall-information">
<table class="table table-striped" style="table-layout:fixed;">
<thead>
<?php echoTaskRows(); ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">Console</div>
<div style="max-height: 400px; overflow: auto;">
<table class="table table-striped">
<thead>
<tr>
<th>Severity</th>
<th>Message</th>
</tr>
</thead>
<tbody id="consoleBody"></tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
processUninstallation();
</script>
</body>
</html>

@ -0,0 +1,177 @@
<?php
define('IN_SCRIPT', 1);
define('HESK_PATH', '../');
require(HESK_PATH . 'install/install_functions.inc.php');
require(HESK_PATH . 'hesk_settings.inc.php');
hesk_dbConnect();
/*
We have four possible installation scenarios:
1. The user isn't running 3.2.0 or later; do a smart uninstall based on the migration map
2. The user is running 3.2.0 or later; use the migrationNumber
*/
$tableSql = hesk_dbQuery("SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings'");
$startingMigrationNumber = -1;
if (hesk_dbNumRows($tableSql) > 0) {
// They have installed at LEAST to version 1.6.0. Just pull the version number OR migration number
$migrationNumberSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'migrationNumber'");
if ($migrationRow = hesk_dbFetchAssoc($migrationNumberSql)) {
$startingMigrationNumber = intval($migrationRow['Value']);
} else {
$versionSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'modsForHeskVersion'");
$versionRow = hesk_dbFetchAssoc($versionSql);
$migration_map = array(
// Pre-1.4.0 to 1.5.0 did not have a settings table
'1.6.0' => 15, '1.6.1' => 16, '1.7.0' => 20, '2.0.0' => 26, '2.0.1' => 27, '2.1.0' => 28, '2.1.1' => 30,
'2.2.0' => 33, '2.2.1' => 34, '2.3.0' => 40, '2.3.1' => 41, '2.3.2' => 42, '2.4.0' => 47, '2.4.1' => 48,
'2.4.2' => 49, '2.5.0' => 53, '2.5.1' => 54, '2.5.2' => 55, '2.5.3' => 56, '2.5.4' => 57, '2.5.5' => 58,
'2.6.0' => 65, '2.6.1' => 66, '2.6.2' => 68, '2.6.3' => 69, '2.6.4' => 70, '3.0.0' => 74, '3.0.1' => 75,
'3.0.2' => 77, '3.0.3' => 78, '3.0.4' => 79, '3.0.5' => 80, '3.0.6' => 81, '3.0.7' => 82, '3.1.0' => 89,
'3.1.1' => 90
);
$startingMigrationNumber = $migration_map[$versionRow['Value']];
}
} else {
// migration # => sql for checking
$versionChecks = array(
// 1.5.0 -> users.active
8 => "SHOW COLUMNS FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` LIKE 'active'",
// 1.4.1 -> denied_emails
5 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_emails'",
// 1.4.0 -> denied ips
3 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_ips'",
// Pre-1.4.0 but still something -> statuses
1 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "statuses'"
);
foreach ($versionChecks as $migrationNumber => $sql) {
$rs = hesk_dbQuery($sql);
if (hesk_dbNumRows($rs) > 0) {
$startingMigrationNumber = $migrationNumber;
break;
}
}
}
?>
<html>
<head>
<title>Mods for HESK <?php echo MODS_FOR_HESK_NEW_VERSION; ?> Install / Upgrade</title>
<link href="<?php echo HESK_PATH; ?>css/bootstrap.css?v=<?php echo $hesk_settings['hesk_version']; ?>"
type="text/css" rel="stylesheet"/>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<link href="<?php echo HESK_PATH; ?>css/AdminLTE.min.css" type="text/css" rel="stylesheet">
<link href="<?php echo HESK_PATH; ?>css/mods-for-hesk-new.css" type="text/css" rel="stylesheet">
<link href="<?php echo HESK_PATH; ?>css/colors.css" type="text/css" rel="stylesheet">
<script src="<?php echo HESK_PATH; ?>js/jquery-1.10.2.min.js"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap.min.js"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo HESK_PATH; ?>install/js/uninstall-script.js"></script>
<style>
body, .login-box-background {
background: url('<?php echo HESK_PATH; ?>install/background.jpg') no-repeat center center fixed;
background-size: cover;
}
</style>
</head>
<body class="fixed" style="min-height: initial;">
<div class="login-box installer-login-box">
<div class="login-box-container">
<div class="login-box-background"></div>
<div class="login-box-body">
<div class="login-logo">
<img src="<?php echo HESK_PATH; ?>install/logo.png" alt="Mods for HESK logo"><br>
<span id="header-text">Uninstall</span>
</div>
<?php // BEGIN INSTALL SCREENS ?>
<div data-step="intro" class="login-box-msg">
<h4>I hoped you wouldn't be here, but let's continue anyway. 😭</h4>
<div class="checkbox">
<label>
<input type="checkbox" name="usage-stats" checked>
Submit anonymous usage statistics
</label>
</div>
</div>
<div data-step="db-confirm" style="display: none">
<table class="table table-striped" style="background: #fff">
<thead>
<tr>
<th colspan="4">Database Information / File Permissions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Database Host:</td>
<td><?php echo $hesk_settings['db_host']; ?></td>
<td>Database Name:</td>
<td><?php echo $hesk_settings['db_name']; ?></td>
</tr>
<tr>
<td>Database User:</td>
<td><?php echo $hesk_settings['db_user']; ?></td>
<td>Database Password:</td>
<td><?php echo $hesk_settings['db_pass']; ?></td>
</tr>
<tr>
<td>Database Prefix:</td>
<td><?php echo $hesk_settings['db_pfix']; ?></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</div>
<div data-step="uninstall" class="text-center" style="display: none">
<div id="spinner">
<i class="fa fa-spin fa-spinner fa-4x"></i>
<h4>Initializing...</h4>
</div>
<div id="progress-bar" class="progress" style="display: none">
<div class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"
style="width: 0">
</div>
</div>
<br>
<div id="error-block" class="well" style="display: none; font-family: 'Courier New', Courier, monospace">
</div>
<input type="hidden" name="starting-migration-number" value="<?php echo $startingMigrationNumber; ?>">
</div>
<div data-step="complete" class="text-center" style="display: none">
<i class="fa fa-check-circle fa-4x" style="color: green"></i><br><br>
<h4>Make sure to delete your <code>/install</code> folder.</h4>
<br>
</div>
<?php // END INSTALL SCREENS ?>
<div id="buttons">
<div class="btn btn-primary" id="back-button" style="display: none;"><i class="fa fa-chevron-left"></i>&nbsp;&nbsp;&nbsp;Back</div>
<div class="btn btn-primary pull-right" id="next-button">Next&nbsp;&nbsp;&nbsp;<i class="fa fa-chevron-right"></i></div>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="uninstallModal" tabindex="-1" role="dialog" aria-labelledby="uninstallModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="uninstallModalTitle"><i class="fa fa-trash"></i> Uninstall Mods for HESK
</h4>
</div>
<div class="modal-body">
<p>Are you sure you want to uninstall Mods for HESK?</p>
</div>
<div class="modal-footer">
<a class="btn btn-success" href="<?php echo HESK_PATH; ?>install/uninstallModsForHesk.php"><i class="fa fa-check"></i> Yes</a>
<button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-times"></i> No
</button>
</div>
</div>
</div>
</div>
<p id="hesk-path" style="display: none"><?php echo HESK_PATH; ?></p>
</body>
</html>
Loading…
Cancel
Save