Fixed export blank page when try to export ticket queue from agent side
I'm curious as to how you got this to work when exportExists()
does not exist in core osTicket. Do you mean isAvailable()
instead or did you add your own custom function?
Cheers.
I'm delving deeper into this and I simply cannot replicate it no matter what I try. However, through research and testing (and general knowledge of the codebase) I can indeed confirm exportExists()
is not a real function. So how the above patch works when using exportExists()
(a non-existing function) is it simply causes an uncaught error within the top-level of the try{}
statement which causes it to immediately exit the queueExport()
function and continue on. So without being able to replicate this, my best guess would be that within that email portion is causing some sort of fatal error that's not catchable by Exception
or some sort of exit.
It would be nice if someone that can replicate this can get back to me so we can further debug this and make a real fix. If someone can replicate this don't try the above patch as it's bogus; try simply changing the original } catch (Exception $ex) {
to } catch (Throwable $ex) {
and see if that helps any as that should catch whatever is thrown deeper down.
Hi KevinTheJedi you are awsom! Your professionalims is amaizing due to follow all the open issues :-)
I can confirm that in may case, the problem was solved with the help of PHP Composer, that updated some packages:
So, now is working fine, and I supposse you can't replicate the problem because you have already updated this packages.
Thanks a lot for your help and your professionalism.
Take care!
I don't have them updated in my test instance however I do have a pull for this that has already been merged. This update will be included in the next release of osTicket so stay tuned!
Cheers.
- Edited
Hello everyone,
Sorry, I didn't see this before.
I can test them if you want.
I've change the code:
} catch (Exception $ex) {
// $errors['err'] = __('Unable to prepare the export');
// Handle any exceptions that occur during the export process
// Log the error or display an error message to the user
echo "An error occurred: " . $e->getMessage();
}
Into:
} catch (Throwable $ex) {
// $errors['err'] = __('Unable to prepare the export');
// Handle any exceptions that occur during the export process
// Log the error or display an error message to the user
echo "An error occurred: " . $e->getMessage();
}
And get the errors on console:
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: PHP Fatal error: Uncaught Error: Call to a member function getMessage() on null in /var/www/vhosts/mysite.xx/support.mysite.xx/include/ajax.tickets.php:2068, referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: Stack trace:, referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #0 /var/www/vhosts/mysite.xx/support.mysite.xx/include/ajax.tickets.php(2007): TicketsAjaxAPI->queueExport(), referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #1 /var/www/vhosts/mysite.xx/support.mysite.xx/include/class.dispatcher.php(153): TicketsAjaxAPI->export(), referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #2 /var/www/vhosts/mysite.xx/support.mysite.xx/include/class.dispatcher.php(40): UrlMatcher->dispatch(), referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #3 /var/www/vhosts/mysite.xx/support.mysite.xx/include/class.dispatcher.php(119): Dispatcher->resolve(), referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #4 /var/www/vhosts/mysite.xx/support.mysite.xx/include/class.dispatcher.php(40): UrlMatcher->dispatch(), referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #5 /var/www/vhosts/mysite.xx/support.mysite.xx/scp/ajax.php(327): Dispatcher->resolve(), referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: #6 {main}, referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
2025-01-22 11:24:35 Warning xx.xx.xx.xx mod_fcgid: stderr: thrown in /var/www/vhosts/mysite.xx/support.mysite.xx/include/ajax.tickets.php on line 2068, referer: https://support.mysite.xx/scp/tickets.php?queue=6 Errore di Apache
- Edited
Since @KevinTheJedi was right, exportExists()
does not exist, I reverted to the original function but caught more errors catch (Throwable $ex)
:
try {
$interval = 5;
$options = ['filename' => $filename,
'interval' => $interval, 'delimiter' => $_POST['csv-delimiter']];
// Create desired exporter
$exporter = new CsvExporter($options);
// Acknowledge the export
$exporter->ack();
// Phew... now we're free to do the export
// Ask the queue to export to the exporter
$queue->export($exporter);
$exporter->finalize();
// Email the export if it exists
$exporter->email($thisstaff);
// Delete the file.
@$exporter->delete();
exit;
} catch (Throwable $ex) {
$errors['err'] = __('Unable to prepare the export');
}
In the console I only see:
2025-01-22 11:36:21 Error xx.xx.xx.xx 404 GET /scp/ajax.php/export/fxuT5_/check HTTP/1.0 https://support.mysite.xx/scp/tickets.php?queue=6 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 495 Accesso SSL/TLS Apache
2025-01-22 11:47:06 Error xx.xx.xx.xx 404 GET /scp/ajax.php/export/dUlZE0/check HTTP/1.0 https://support.mysite.xx/scp/tickets.php?queue=6 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 495 Accesso SSL/TLS Apache
With the original code, but with catch (Throwable $ex)
the result does not change:
- The file is not exported and the popup in osticket remains white.
I get that, but I'm wondering if the error code is the same and everything so I can narrow this down.
So what this likely means is something within the $exporter->email($thisstaff);
part is crapping out causing the issue or it gets skipped too fast and goes on to delete()
which would make the /check
call fail (although we should be returning an error in a way the popup wouldn't crap out). Also, idk why throwable can't catch whatever is happening there unless it's simply not throwing an error but skipping past it real fast.
Cheers.
- Edited
With:
} catch (Exception $ex) {
$errors['err'] = __('Unable to prepare the export');
echo "An error occurred: " . $e->getMessage();
}
or:
} catch (Throwable $ex) {
$errors['err'] = __('Unable to prepare the export');
echo "An error occurred: " . $e->getMessage();
}
The error on Plesk log console is the same:
- 404 GET /scp/ajax.php/export/pE1drK/check HTTP/1.0
- 404 GET /scp/ajax.php/export/bmS1el/check HTTP/1.0
KevinTheJedi
Based on your suggestion, I commented the line:
// Delete the file.
// @$exporter->delete();
And everything worked fine.
So yes, I confirm your hypothesis: $exporter->email($thisstaff);
for some reason is executed too slowly and the subsequent @$exporter->delete();
deletes the file too early.
Unfortunately the error is not intercepted by the two methods you indicated.
With PHP X-RAY i see that there is a sleep function on /include/class.export.php:516 that take 15 sec.
I try to add a sleep(20);
before @$exporter->delete();
but nothing changed.
No different errors on apache log.