|
|
| Line 1: |
Line 1: |
| [[Category:GUI manual]]
| | = High-Performance VoIPmonitor and MySQL Setup Manual = |
|
| |
|
| This page provides troubleshooting tips and debugging techniques for the VoIPmonitor web GUI. | | This manual explains the configuration for a high-call-per-second (CPS) VoIPmonitor deployment. The configuration is split into two parts: the MySQL database and the VoIPmonitor sniffer. |
|
| |
|
| == GUI Debug Mode == | | == Overall Concept == |
|
| |
|
| The GUI debug mode allows you to see SQL queries and other debugging information directly in your browser's Developer Console.
| | This system is designed for maximum data ingestion performance based on a '''centralized writer architecture'''. It trades certain data safety and consistency guarantees for an extremely high write throughput, suitable for large-scale deployments. The architecture is composed of three distinct stages: |
|
| |
|
| === Enabling Debug Mode ===
| | # '''Centralized CDR Ingestion (Sniffer Role):''' The primary sniffer instance is configured to act as a central data collector. Its main purpose is to receive Call Detail Records (CDRs) from all other sniffer instances in the network. In this mode, the central sniffer may not process all network packets itself; its primary function is to prepare and queue CDRs for database insertion. It is critical that in this architecture, '''only the central sniffer writes to the database'''. All other sniffers must be configured to send their data to this central instance. |
|
| |
|
| To enable debug mode in the VoIPmonitor web GUI, '''add the parameter <code>?debug=31415</code> to the end of any GUI URL'''. For example: | | # '''Optimized Batch Writing (Sniffer to MySQL):''' To achieve maximum insert throughput, the central sniffer writes CDRs to MySQL in large, consolidated batches. A key optimization is that the database's automatic ID generators (<code>AUTO_INCREMENT</code>) are disabled. The sniffer pre-assigns unique IDs to the records, which allows for massive parallel inserts without the locking and serialization bottlenecks that normally occur at the database level. |
|
| |
|
| <code>http://your-server/voipmon/admin.php?debug=31415</code>
| | # '''High-Speed Database Storage (MySQL):''' The MySQL database is heavily optimized to ingest these large data batches at extremely high speeds. For environments with exceptionally high CDR-per-second rates, this configuration supports '''hourly table partitioning'''. While hourly partitioning dramatically accelerates write performance by keeping the active table small, it introduces a trade-off for data retrieval. When performing a search across an entire day, the database engine must query 24 separate partitions instead of a single daily one. This can result in slower query performance for reports or searches covering broad time ranges. |
|
| |
|
| This enables the following features:
| | == MySQL Configuration (my.cnf) == |
| * SQL queries executed by the GUI are logged to the browser's Developer Console
| |
| * Additional debugging information is displayed for dashboard panels and charts
| |
| * Performance timing and query execution details become visible
| |
|
| |
|
| === Finding SQL Queries for Dashboard Panels ===
| | The goal of this configuration is to maximize the write performance of the InnoDB engine, often at the expense of strict ACID durability. |
|
| |
|
| To see the exact SQL query executed by a dashboard panel:
| | {| class="wikitable" style="background-color: #FFFFFF;" |
| | ! Directive |
| | ! Description |
| | |- |
| | | <code>skip-log-bin</code> |
| | | Disables binary logging. This significantly increases write performance because the database doesn't have to record every data modification. The trade-off is the inability to perform point-in-time recovery or use replication. |
| | |- |
| | | <code>innodb_flush_log_at_trx_commit=0</code> |
| | | The most critical setting for write performance. Instead of flushing the transaction log to disk after every single transaction (default: <code>1</code>), the database flushes it only once per second. This dramatically speeds up writes but can lead to the loss of the last second's worth of transactions if the server crashes. Usually innodb_flush_log_at_trx_commit = 2 is enough but for extreme CDR CPS this is crucial to set it to the innodb_flush_log_at_trx_commit=0 |
| | |- |
| | | <code>innodb_flush_log_at_timeout = 1800</code> |
| | | Defines the timeout in seconds for the log flushing. However, it is effectively overridden by the more frequent one-second flush from the setting above. |
| | |- |
| | | <code>max_heap_table_size = 24G</code> |
| | | Allows for the creation of very large temporary tables in memory. This is important for complex analytical queries that the VoIPmonitor GUI might run. |
| | |- |
| | | <code>table_open_cache=9999</code> |
| | | Keeps a large number of table definitions cached. Since VoIPmonitor uses hourly partitioning, it creates a vast number of tables, and this setting prevents the overhead of constantly opening and closing table files. |
| | |- |
| | | <code>innodb_log_file_size = 5G</code> |
| | | Defines a very large size for InnoDB's redo log files. Larger files reduce the frequency of I/O-intensive checkpoint operations, improving overall throughput. |
| | |- |
| | | <code>innodb_log_buffer_size = 2G</code> |
| | | Allocates a large buffer in memory (2 GB) for storing transaction logs before they are flushed to disk. This allows the system to handle large bursts of write activity without immediate disk I/O. |
| | |- |
| | | <code>open_files_limit = 200000</code> |
| | | Increases the file handle limit for the MySQL process, which is necessary to support the high <code>table_open_cache</code> value. |
| | |- |
| | | <code>key_buffer_size = 2G</code> |
| | | This setting is for the MyISAM storage engine. While most of VoIPmonitor uses InnoDB, some system or temporary tables might still use MyISAM. A 2GB buffer is allocated for its indexes. |
| | |- |
| | | <code>sort_buffer_size = 65M</code> |
| | | A large sort buffer for handling sorting operations (like ORDER BY or GROUP BY) for complex queries. |
| | |- |
| | | <code>max_connections = 100000</code> |
| | | An extremely high limit for connections. It acts as a safeguard against "too many connections" errors, though the real number of active connections will be much lower. |
| | |- |
| | | <code>skip-name-resolve</code> |
| | | Prevents MySQL from resolving hostnames for incoming connections. This speeds up the connection process by bypassing DNS lookups. |
| | |- |
| | | <code>innodb_read_io_threads = 40</code> |
| | | Sets a high number of threads for handling read I/O operations, suitable for systems with fast multi-channel storage (like NVMe arrays). |
| | |- |
| | | <code>innodb_write_io_threads = 40</code> |
| | | Sets a high number of threads for handling write I/O operations, matching the read threads for balanced I/O. |
| | |- |
| | | <code>innodb_purge_threads = 20</code> |
| | | A high number of threads dedicated to purging old, unneeded data versions, which is crucial in a high-volume write environment to prevent performance degradation. |
| | |- |
| | | <code>innodb_flush_neighbors = 0</code> |
| | | An optimization for SSD/NVMe drives. It disables a feature useful for rotational HDDs where adjacent blocks on disk are flushed at the same time. This is counterproductive for SSDs. |
| | |- |
| | | <code>innodb_io_capacity = 1000000</code> |
| | | Informs InnoDB that it's running on a very high-performance storage system capable of 1,000,000 IOPS. This allows InnoDB to be much more aggressive with background I/O tasks. |
| | |- |
| | | <code>innodb_io_capacity_max = 10000000</code> |
| | | Sets the absolute maximum IOPS the system can burst to, allowing InnoDB to use the full potential of the storage during intensive operations. |
| | |- |
| | | <code>innodb_doublewrite = 0</code> |
| | | Disables the doublewrite buffer. This provides a significant performance boost but increases the risk of data corruption (a "torn page") if a power failure occurs during a write operation. It's a performance-vs-safety trade-off. |
| | |- |
| | | <code>innodb_buffer_pool_size = 150G</code> |
| | | The most important parameter for InnoDB performance. A massive buffer pool size of 150 GB keeps a large portion of the database (data and indexes) in RAM, minimizing slow disk access. |
| | |- |
| | | <code>innodb_flush_method = O_DIRECT</code> |
| | | Bypasses the operating system's file cache. This prevents double-caching data (once in the OS, once in InnoDB) and gives the database direct control over I/O operations. |
| | |- |
| | | <code>transaction-isolation = READ-UNCOMMITTED</code> |
| | | The lowest level of transaction isolation. It allows transactions to read data that has not yet been committed. This offers maximum performance by minimizing locking. |
| | |- |
| | | <code>performance_schema=0</code> |
| | | Disables the Performance Schema, a detailed performance monitoring tool. Disabling it slightly reduces overhead and can increase performance. |
| | |} |
|
| |
|
| # Add <code>?debug=31415</code> to your GUI URL and navigate to the dashboard
| | == VoIPmonitor Sniffer Configuration (voipmonitor.conf) == |
| # Open your browser's Developer Tools (press F12 or Ctrl+Shift+I)
| |
| # Switch to the '''Console''' tab
| |
| # Interact with the dashboard (e.g., refresh, change time range, or hover over panels)
| |
| # The SQL queries will be printed to the console log
| |
|
| |
|
| The queries appear in the console in the order the panels are rendered. If you need to isolate a specific panel, hover over it or interact with its filters after loading the page - this often triggers a re-query which will appear as a new entry in the console.
| | This configuration is tuned to enable the sniffer to process packets as quickly as possible, queue data efficiently, and avoid becoming a bottleneck. |
|
| |
|
| === Disabling Debug Mode ===
| | {| class="wikitable" style="background-color: #FFFFFF;" |
| | | ! Directive |
| Simply remove the <code>?debug=31415</code> parameter from the URL, or navigate to any GUI page without it. Debug mode is not persistent and must be re-enabled each time by adding the URL parameter.
| | ! Description |
| | | |- |
| == GUI Upgrade Issues ==
| | | <code>mysqlstore_concat_limit = 10000</code> |
| | | | Batches up to 10,000 CDRs into a single <code>INSERT</code> statement, dramatically reducing database overhead. |
| The following are common issues that may occur during GUI upgrades and their solutions.
| | |- |
| | | | <code>mysqlstore_max_threads_cdr = 40</code> |
| === "Invalid compressed data in update file" Error ===
| | | Sets 40 threads for writing CDRs to the database, essential for high-volume parallel processing. |
| | | |- |
| If the GUI update fails with the error "Invalid compressed data in update file", this is often caused by incorrect ownership of the web root directory. The web server user needs write permission to extract and install the update files.
| | | <code>mysql_enable_new_store = per_query</code> |
| | | | Activates an alternative internal queueing mechanism for SQL queries, which can improve parallelization. |
| ==== Symptoms ==== | | |- |
| | | | <code>mysql_enable_set_id = yes</code> |
| * GUI update aborts with error: <code>"Invalid compressed data in update file"</code>
| | | The sniffer generates the primary key (ID) for records itself, rather than relying on <code>AUTO_INCREMENT</code> in the database. This reduces database locking. |
| * Manual reinstallation via tar.gz extraction works fine
| | |- |
| * The update process cannot write files to the web root directory
| | | <code>server_sql_queue_limit = 1000000</code> |
| | | | Sets a massive in-memory queue (1,000,000) for SQL commands to buffer against database slowdowns. |
| ==== Root Cause ====
| | |- |
| | | | <code>partition_operations_enable_fromto = 4-6</code> |
| The web server process (Apache, httpd, nginx, etc.) runs under a specific user account (typically <code>apache</code>, <code>www-data</code>, or <code>nginx</code>). If the web root directory (typically <code>/var/www/html</code> or <code>/var/www/voipmonitor</code>) is owned by a different user, the update process will fail when attempting to extract and install the update files. The error message is misleading and appears to indicate a corrupted download, but the actual issue is a write permission problem.
| | | Schedules database partition management to run only between 4:00 and 6:00 AM, avoiding impact during peak hours. |
| | |
| ==== Solution: Fix Web Root Directory Ownership ====
| |
| | |
| Verify and fix the ownership of the web root directory:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Check current ownership of the web root | |
| ls -ld /var/www/html
| |
| # or
| |
| ls -ld /var/www/voipmonitor
| |
| | |
| # Determine your web server user:
| |
| # Debian/Ubuntu: www-data
| |
| # CentOS/RHEL: apache
| |
| # Nginx: nginx
| |
| | |
| # Fix ownership - replace with your actual web server user and path
| |
| # For Debian/Ubuntu
| |
| sudo chown -R www-data:www-data /var/www/html
| |
| | |
| # For CentOS/RHEL/AlmaLinux
| |
| sudo chown -R apache:apache /var/www/html
| |
| | |
| # For Nginx
| |
| sudo chown -R nginx:nginx /var/www/html
| |
| </syntaxhighlight>
| |
| | |
| After fixing the ownership, retry the GUI update process.
| |
| | |
| ==== Verifying the Fix ====
| |
| | |
| Ensure the web server user can write to the web root:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # For Debian/Ubuntu
| |
| sudo -u www-data touch /var/www/html/test_write
| |
| sudo rm /var/www/html/test_write
| |
| | |
| # For CentOS/RHEL
| |
| sudo -u apache touch /var/www/html/test_write
| |
| sudo rm /var/www/html/test_write
| |
| </syntaxhighlight>
| |
| | |
| If the test file can be created and deleted, ownership is correct.
| |
| | |
| === Browser Cache Issues After GUI Upgrade ===
| |
| If specific features stop working immediately after a GUI upgrade (for example, IP lookup not translating addresses, missing icons, broken styling, or JavaScript errors), the issue is likely caused by outdated browser cache. The browser may be serving stale JavaScript, CSS, and other assets from the previous GUI version.
| |
| | |
| ==== Symptoms ====
| |
| | |
| * Features that worked before the upgrade now fail or behave unexpectedly
| |
| * IP address lookup (GeoIP resolution) shows no translated addresses
| |
| * Icons, buttons, or interface elements appear broken or missing
| |
| * Visual styling appears incorrect or outdated
| |
| * The issue persists even after restarting the web server
| |
| * The problem only affects one browser, and clearing cache fixes it
| |
| | |
| ==== Root Cause ====
| |
| | |
| Web browsers cache static assets (JavaScript files, CSS stylesheets, images) to improve performance. When you upgrade the VoIPmonitor GUI, these assets are replaced with new versions. However, if the browser continues to serve cached versions of these files from the previous release, the GUI will not function correctly until the cache is cleared.
| |
| | |
| ==== Solution: Clear Browser Cache and Cookies ====
| |
| | |
| The fastest and most reliable fix is to clear the browser cache and cookies, or perform a hard refresh.
| |
| | |
| '''Option 1: Hard Refresh (Quickest)'''
| |
| | |
| Perform a hard refresh to force the browser to reload all assets:
| |
| * Windows/Linux: Press <code>Ctrl+F5</code> or <code>Ctrl+Shift+R</code>
| |
| * Mac: Press <code>Cmd+Shift+R</code>
| |
| | |
| '''Option 2: Clear Full Browser Cache and Cookies (Recommended After GUI Upgrades)'''
| |
| | |
| For a complete cache clear:
| |
| * Chrome/Edge: Press <code>Ctrl+Shift+Delete</code> (Windows) or <code>Cmd+Shift+Delete</code> (Mac), select "Cached images and files" and "Cookies and other site data", then click "Clear data"
| |
| * Firefox: Press <code>Ctrl+Shift+Delete</code> (Windows) or <code>Cmd+Shift+Delete</code> (Mac), select "Cache" and "Cookies", then click "Clear Now"
| |
| * Safari: Press <code>Cmd+Option+E</code> to clear cache, and Preferences > Privacy > Manage Website Data to clear cookies
| |
| | |
| '''Important:''' After a GUI upgrade, it is recommended to perform a hard refresh or clear the cache entirely to ensure the latest assets are loaded.
| |
| | |
| ==== Verification ====
| |
| | |
| After clearing the cache:
| |
| # Reload the GUI page
| |
| # Verify that the previously broken feature now works correctly
| |
| # Check that visual styling appears correct
| |
| # Test functionality across different browsers if available
| |
| | |
| If the problem persists after clearing the cache, proceed to other troubleshooting steps in this guide.
| |
| | |
| === Web Portal Inaccessible After Upgrade ===
| |
| If the web portal becomes inaccessible immediately after attempting an upgrade, the web server service may need to be restarted to load the new GUI files correctly. This is often the quickest fix after completing an upgrade.
| |
| | |
| ==== Solution: Restart the Web Server ====
| |
| <syntaxhighlight lang="bash">
| |
| # For CentOS/RHEL/AlmaLinux with httpd
| |
| sudo systemctl restart httpd
| |
| | |
| # For Debian/Ubuntu with Apache
| |
| sudo systemctl restart apache2
| |
| | |
| # For nginx with PHP-FPM
| |
| sudo systemctl restart php-fpm
| |
| </syntaxhighlight>
| |
| | |
| After restarting the web server, try accessing the web portal again. If the portal is now accessible, the upgrade was successful and no further action is needed. If the issue persists, proceed with the troubleshooting steps below or consider performing a full GUI reinstallation.
| |
| | |
| === VM Binary (binary missing) Error ===
| |
| | |
| If you encounter an error message indicating "VM Binary (binary missing)" during or after a GUI upgrade, this indicates that the GUI application files were not completely updated. Perform a forced CLI upgrade to resolve this issue:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Log in to the GUI host as root
| |
| # Navigate to the GUI installation directory (default is /var/www/html)
| |
| cd /var/www/html
| |
| | |
| # Execute the forced upgrade command
| |
| php php/run.php upgrade -f
| |
| </syntaxhighlight> | |
| | |
| The <code>-f</code> flag forces a complete upgrade, which updates any missing or corrupt GUI binaries.
| |
| | |
| === Blank Screen with JavaScript ReferenceError After Update ===
| |
| | |
| If you can log in to the GUI after an update but are presented with a blank screen, and the browser's JavaScript console shows an error like:
| |
| | |
| <code>ReferenceError: _AuditActivity_download_wav is not defined</code>
| |
| | |
| This is typically caused by a conflicting PEAR file that was not removed during the upgrade. The fix is simple:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Remove the conflicting old PEAR constants file
| |
| rm /usr/share/pear/constants.php
| |
| | |
| # Refresh your browser (Ctrl+Shift+R) to reload the GUI
| |
| </syntaxhighlight>
| |
| | |
| After removing this file and refreshing the browser, the GUI should load correctly. This issue occurs because the old <code>constants.php</code> file from the system's PEAR installation conflicts with VoIPmonitor's internal JavaScript definitions.
| |
| | |
| === Blank Screen Due to SELinux ===
| |
| | |
| If you can log in to the GUI but are presented with a blank white screen, and there are no JavaScript errors in the browser console, the issue may be caused by SELinux blocking access to required resources. This is particularly common on RHEL/CentOS/AlmaLinux systems where SELinux is enabled by default.
| |
| | |
| ==== Diagnosis: Check if SELinux is Running
| |
| | |
| First, verify that SELinux is enabled and in enforcing mode:
| |
| | |
| <syntaxhighlight lang="bash"> | |
| # Check current SELinux status
| |
| getenforce
| |
| | |
| # Common values: Enforcing (active), Permissive (logging only), Disabled
| |
| </syntaxhighlight>
| |
| | |
| If the output is <code>Enforcing</code>, proceed to the solution.
| |
| | |
| ==== Solution: Disable SELinux | |
| | |
| '''Permanently disable SELinux:'''
| |
| | |
| Edit the SELinux configuration file:
| |
| | |
| <syntaxhighlight lang="bash"> | |
| sudo nano /etc/selinux/config
| |
| </syntaxhighlight>
| |
| | |
| Change <code>SELINUX=enforcing</code> to:
| |
| | |
| <pre>SELINUX=disabled</pre>
| |
| | |
| Then reboot the server:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| sudo reboot
| |
| </syntaxhighlight>
| |
| | |
| After the reboot, the GUI should load correctly.
| |
| | |
| '''Temporarily disable SELinux (for testing):'''
| |
| | |
| If you want to test whether SELinux is the cause without rebooting:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Temporarily switch SELinux to permissive mode
| |
| sudo setenforce 0
| |
| </syntaxhighlight>
| |
| | |
| This change only lasts until the next reboot. If this resolves the blank screen issue, follow the permanent disable instructions above.
| |
| | |
| ==== Related Information
| |
| | |
| SELinux is a security feature that enforces mandatory access control policies. While it provides strong security, it can interfere with web applications that require access to files outside standard locations or that use non-standard system calls. If you require SELinux for security compliance, you may need to create custom SELinux policies to allow VoIPmonitor instead of disabling it entirely.
| |
| | |
| === apilicensecheck.php Fatal Error: Call to undefined function findExecutableFile() ===
| |
| | |
| '''Do NOT reinstall the entire GUI to fix this error. Use the patched file instead.'''
| |
| | |
| When calling the Check License API endpoint (<code>php/apilicensecheck.php</code>), you may encounter the following PHP fatal error:
| |
| | |
| <code>Call to undefined function findExecutableFile()</code>
| |
| | |
| This is a known bug in specific GUI versions where the <code>findExecutableFile()</code> function is missing. A full GUI reinstallation is '''not required''' to fix this issue. The solution is to replace '''only''' the affected file with a patched version provided by VoIPmonitor support.
| |
| | |
| ==== Solution: Replace apilicensecheck.php with Patched File ====
| |
| | |
| To resolve this issue, obtain the patched <code>apilicensecheck.php</code> file from VoIPmonitor support and perform the following steps:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # 1. Navigate to your GUI installation directory (default is /var/www/html)
| |
| cd /var/www/html
| |
| | |
| # 2. Back up the original file
| |
| sudo cp php/apilicensecheck.php php/apilicensecheck.php.backup
| |
| | |
| # 3. Replace with the patched file from support
| |
| # (Copy the patched file to this location, preserving permissions)
| |
| sudo cp /path/to/patched/apilicensecheck.php php/apilicensecheck.php
| |
| | |
| # 4. Ensure correct ownership and permissions
| |
| sudo chown www-data:www-data php/apilicensecheck.php
| |
| sudo chmod 644 php/apilicensecheck.php
| |
| | |
| # 5. Verify the fix by testing the API endpoint
| |
| curl "http://your-server/php/apilicensecheck.php?task=licenseCheck"
| |
| </syntaxhighlight>
| |
| | |
| You should receive a JSON response with the license status instead of a PHP error. Example successful responses:
| |
| | |
| <syntaxhighlight lang="json">
| |
| {"status":0,"message":"License OK."}
| |
| </syntaxhighlight>
| |
| | |
| or
| |
| | |
| <syntaxhighlight lang="json">
| |
| {"status":1,"message":"license file key.php expired. Current date: 2024-01-15 Expiration date: 2024-01-10"}
| |
| </syntaxhighlight>
| |
| | |
| ''Note:'' The patched file must be obtained from VoIPmonitor support. This is not a self-service fix.
| |
| | |
| == MySQL/MariaDB Database Corruption ==
| |
| | |
| If the Web GUI fails to start and logs show MySQL/MariaDB database errors (such as corrupted tables, missing files, or startup failures), this indicates database corruption. This can occur after manual file deletion, disk failures, or improper MySQL shutdown procedures.
| |
| | |
| === Symptoms ===
| |
| | |
| * Web GUI displays database connection errors or shows a blank page
| |
| * MySQL/MariaDB service fails to start or immediately crashes
| |
| * Error messages in MySQL logs indicating corrupted tables or missing database files
| |
| * CDR queries return empty results or throw SQL errors
| |
| | |
| === Diagnosis ===
| |
| | |
| First, check the MySQL/MariaDB service status:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Check if MySQL/MariaDB is running
| |
| systemctl status mysql
| |
| # or
| |
| systemctl status mariadb
| |
| | |
| # View MySQL error logs for corruption indicators
| |
| tail -100 /var/log/mysql/error.log
| |
| # or
| |
| tail -100 /var/log/mariadb/mariadb.log
| |
| </syntaxhighlight>
| |
| | |
| Look for error messages such as:
| |
| * <code>Table is marked as crashed</code>
| |
| * <code>InnoDB: Database page corruption</code>
| |
| * <code>Incorrect key file</code>
| |
| * <code>Can't open file</code>
| |
| * <code>semaphore waits</code>
| |
| * <code>page corruption detected</code>
| |
| * <code>InnoDB: Assertion failure</code>
| |
| | |
| === Solution: Table-Level Repair (mysqlcheck --repair) ===
| |
| | |
| If MySQL is running but specific tables in the voipmonitor database are corrupted, you can attempt to repair the tables without dropping the entire database. This method preserves CDR data when the corruption is limited to individual tables.
| |
| | |
| '''When to use table-level repair:'''
| |
| * MySQL service is running and accessible
| |
| * Only specific tables are corrupted (not the entire database)
| |
| * You want to preserve CDR data as much as possible
| |
| * Corruption is detected early and is not widespread
| |
| | |
| ==== Step 1: Stop All VoIPmonitor Processes ====
| |
| | |
| Stop VoIPmonitor sensors to prevent write operations during repair:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Stop all VoIPmonitor sensor services
| |
| systemctl stop voipmonitor
| |
| </syntaxhighlight>
| |
| | |
| ==== Step 2: Repair Tables Using mysqlcheck ==== | |
| | |
| The <code>mysqlcheck</code> utility can repair corrupted MyISAM tables. For InnoDB tables, <code>mysqlcheck --repair</code> will attempt to analyze and fix corruption.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Repair all tables in the voipmonitor database
| |
| mysqlcheck -u root -p --repair voipmonitor
| |
| | |
| # Repair a specific table
| |
| mysqlcheck -u root -p --repair voipmonitor cdr
| |
| | |
| # Check tables before repair (shows table status)
| |
| mysqlcheck -u root -p --auto-repair voipmonitor
| |
| </syntaxhighlight>
| |
| | |
| The <code>--auto-repair</code> option automatically repairs tables that show signs of corruption during the check. The <code>--repair</code> option forces repair on all tables even if they do not appear corrupted.
| |
| | |
| '''Important notes:'''
| |
| * <code>mysqlcheck --repair</code> works on MyISAM tables. For InnoDB tables, it may simply analyze and report problems without fixing them
| |
| * VoIPmonitor primarily uses InnoDB tables, so <code>REPAIR TABLE</code> SQL commands may be required directly
| |
| | |
| ==== Step 3: Repair InnoDB Tables with REPAIR TABLE ====
| |
| | |
| For InnoDB tables (most VoIPmonitor tables), use the SQL <code>REPAIR TABLE</code> command:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| mysql -u root -p voipmonitor
| |
| </syntaxhighlight>
| |
| | |
| Run the following SQL command to repair a specific table:
| |
| | |
| <syntaxhighlight lang="sql">
| |
| REPAIR TABLE cdr;
| |
| REPAIR TABLE cdr_next_partition;
| |
| REPAIR TABLE cdr_partition_202501;
| |
| </syntaxhighlight>
| |
| | |
| You can repair multiple tables in one statement:
| |
| | |
| <syntaxhighlight lang="sql">
| |
| REPAIR TABLE cdr, cdr_next_partition, cdr_partition_202501, sip, message;
| |
| </syntaxhighlight>
| |
| | |
| If <code>REPAIR TABLE</code> fails on InnoDB tables, this indicates more severe corruption that requires the <code>innodb_force_recovery</code> method (see below).
| |
| | |
| ==== Step 4: Check Disk Space and Trim Large Tables ====
| |
| | |
| Large tables consuming excessive disk space can contribute to corruption and performance issues. Check and trim tables if necessary:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Check table sizes
| |
| mysql -u root -p voipmonitor -e "SELECT table_name AS 'Table', ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)' FROM information_schema.TABLES WHERE table_schema = 'voipmonitor' ORDER BY (data_length + index_length) DESC LIMIT 10;"
| |
| </syntaxhighlight> | |
| | |
| Identify very large tables and consider using the <code>DELETE</code> statement with a date filter to remove old data, or use VoIPmonitor's built-in <code>cleandatabase*</code> configuration options to trim data automatically.
| |
| | |
| For example, to delete old CDR records manually:
| |
| | |
| <syntaxhighlight lang="sql">
| |
| -- Delete CDRs older than 90 days (replace date as needed)
| |
| DELETE FROM cdr WHERE calldate < '2024-10-01';
| |
| | |
| -- Optimize table after deletion to reclaim space
| |
| OPTIMIZE TABLE cdr;
| |
| </syntaxhighlight>
| |
| | |
| '''Recommendation:** Instead of manual deletion, configure automatic data cleanup in <code>/etc/voipmonitor.conf</code>:
| |
| | |
| <syntaxhighlight lang="ini">
| |
| [general]
| |
| # Automatically delete old data
| |
| cleandatabase = 90
| |
| cleandatabasecdr = 90
| |
| cleandatabasemsg = 30
| |
| cleandatabaseregister = 7
| |
| </syntaxhighlight>
| |
| | |
| See the <code>Prevention: Automatic Database Cleanup</code> section below for more details.
| |
| | |
| ==== Step 5: Restart Services ====
| |
| | |
| After the repair is complete, restart VoIPmonitor:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Restart the sensor service
| |
| systemctl start voipmonitor
| |
| | |
| # Verify the service is running
| |
| systemctl status voipmonitor
| |
| | |
| # Check MySQL error logs for any new errors
| |
| tail -f /var/log/mysql/error.log
| |
| # or
| |
| tail -f /var/log/mariadb/mariadb.log
| |
| </syntaxhighlight>
| |
| | |
| If table repair was successful, the system should operate normally. If corruption persists or mysqlcheck reports errors that cannot be repaired, proceed to one of the full recovery methods (Drop and Recreate Database or innodb_force_recovery).
| |
| | |
| ==== Step 6: Upgrade MySQL Server (Optional but Recommended) ====
| |
| | |
| After recovering from corruption, consider upgrading MySQL/MariaDB to the latest version in your current branch. This provides performance and stability improvements that can prevent future corruption.
| |
| | |
| For example, if you are running MySQL 5.7.33, upgrade to the latest 5.7.x version within the same series (not jumping to 8.0 unless you are prepared for a major upgrade).
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Check current version
| |
| mysql -V
| |
| | |
| # Debian/Ubuntu: Check available upgrades
| |
| apt list --upgradable | grep mysql-server
| |
| | |
| # Upgrade MySQL (distribution-specific commands vary)
| |
| # For Debian/Ubuntu:
| |
| sudo apt update
| |
| sudo apt upgrade mysql-server
| |
| | |
| # For CentOS/RHEL/AlmaLinux:
| |
| sudo yum update mysql-server
| |
| # or
| |
| sudo dnf upgrade mysql-server
| |
| </syntaxhighlight>
| |
| | |
| '''Important notes:'**
| |
| * Always backup your database before upgrading
| |
| * Test the upgrade on a development/staging system first if possible
| |
| * Major version upgrades (e.g., 5.7 to 8.0) require additional planning and testing
| |
| * Review the MySQL upgrade documentation for your version for any breaking changes
| |
| | |
| === Which Recovery Method to Use ===
| |
| | |
| '''Use Table-Level Repair (First Attempt when MySQL is running):'''
| |
| * MySQL/MariaDB service is running and accessible
| |
| * Only specific tables are corrupted (not entire database)
| |
| * You want to preserve CDR data as much as possible
| |
| * Corruption appears mild and detected early
| |
| * System is experiencing poor performance but still accessible
| |
| | |
| This method uses <code>mysqlcheck --repair</code> or <code>REPAIR TABLE</code> to fix individual tables without dropping the database. See the <code>Solution: Table-Level Repair</code> section above.
| |
| | |
| '''Use Drop and Recreate Database (Simplest, when MySQL is running):'''
| |
| * MySQL/MariaDB service is running and accessible
| |
| * Only the voipmonitor database is corrupted
| |
| * You do not need to preserve CDR data (historical call records are acceptable to lose)
| |
| * You want to restore service quickly with minimal downtime
| |
| * GUI configuration loss is acceptable or will be reconfigured
| |
| | |
| '''Use innodb_force_recovery (Recommended for filesystem corruption/InnoDB assertion failures):'''
| |
| * MySQL fails to start after a filesystem issue (Read-only file system errors)
| |
| * InnoDB assertion failures during startup
| |
| * PCAP files may or may not be available in the spool directory
| |
| * You need to preserve GUI configuration (users, sensors, settings)
| |
| * You are willing to lose all CDR data if it cannot be restored from PCAP
| |
| | |
| '''Use PCAP restore (Alternative):'''
| |
| * PCAP files are definitely available and intact in the spool directory
| |
| * You want to restore historical CDR data along with GUI configuration
| |
| * The innodb_force_recovery method did not work
| |
| * You have time for a lengthy re-processing operation
| |
| | |
| === Solution: Drop and Recreate Database (Simplest, When MySQL is Running) ===
| |
| | |
| If MySQL/MariaDB is running but only the voipmonitor database is corrupted, the fastest recovery method is to drop the corrupted database and let the sensor recreate it automatically.
| |
| | |
| '''Warning:''' This procedure will result in complete loss of all CDR data, call recordings, and GUI configuration. You will need to reconfigure sensors, users, and settings in the GUI.
| |
| | |
| ==== Step 1: Stop All VoIPmonitor Sensor Processes ====
| |
| | |
| Stop all VoIPmonitor sensors to prevent further database corruption during the recovery process.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Stop all VoIPmonitor sensor services
| |
| systemctl stop voipmonitor
| |
| | |
| # If running distributed (client/server mode), stop all sensor services:
| |
| # - On server sensors: systemctl stop voipmonitor-server
| |
| # - On client sensors: systemctl stop voipmonitor-client
| |
| # - Check all running sensors: ps aux | grep voipmonitor
| |
| </syntaxhighlight> | |
| | |
| If you are using a client/server architecture, stop ALL sensors first, including both client and server sensors.
| |
| | |
| ==== Step 2: Drop the Corrupted VoIPmonitor Database ==== | |
| | |
| Delete the corrupted voipmonitor database from MySQL/MariaDB.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Connect to MySQL as root
| |
| mysql -u root -p
| |
| </syntaxhighlight> | |
| | |
| Run the following SQL command:
| |
| | |
| <syntaxhighlight lang="sql">
| |
| DROP DATABASE IF EXISTS voipmonitor;
| |
| EXIT;
| |
| </syntaxhighlight>
| |
| | |
| Replace the database name <code>voipmonitor</code> if you are using a custom database name in your configuration.
| |
| | |
| ==== Step 3: Restart a Single Sensor to Create Fresh Database ====
| |
| | |
| Start ONE sensor instance (preferably the server sensor in client/server mode) so it can automatically create a fresh, empty database with all required tables.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Start the primary sensor (or server sensor in client/server mode)
| |
| systemctl start voipmonitor
| |
| | |
| # Verify the sensor is running
| |
| systemctl status voipmonitor
| |
| | |
| # Monitor the sensor log for database creation messages
| |
| journalctl -u voipmonitor -f
| |
| </syntaxhighlight>
| |
| | |
| The sensor will automatically create the voipmonitor database, all tables, functions, and routines. You should see log messages indicating the database structure is being created.
| |
| | |
| ==== Step 4: Start All Remaining Sensors ====
| |
| | |
| Once the database is created, start any additional sensors (client sensors in distributed mode).
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Start any remaining sensors
| |
| systemctl start voipmonitor-client1
| |
| systemctl start voipmonitor-client2
| |
| # ... etc for all sensors
| |
| </syntaxhighlight>
| |
| | |
| ==== Step 5: Verify System Functionality ====
| |
| | |
| Verify that the system is operating correctly.
| |
| | |
| * Access the VoIPmonitor web GUI and log in
| |
| * You may need to reconfigure the GUI (create users, sensors, capture rules, alerts)
| |
| * Check that the sniffer service is running and capturing:
| |
| <syntaxhighlight lang="bash">systemctl status voipmonitor</syntaxhighlight>
| |
| * Confirm that new calls are being captured and processed
| |
| | |
| ==== Step 6: Prevent Future Corruption with Automatic Database Cleanup ====
| |
| | |
| To prevent future database corruption due to excessive data accumulation, configure automatic database cleanup using the <code>cleandatabase*</code> options in your sensor configuration file (<code>/etc/voipmonitor.conf</code>).
| |
| | |
| Edit the configuration file:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| sudo nano /etc/voipmonitor.conf
| |
| </syntaxhighlight>
| |
| | |
| Add or adjust the following parameters based on your requirements:
| |
| | |
| <syntaxhighlight lang="ini">
| |
| # Automatically delete CDR records older than X days
| |
| cleandatabase = 90; # Delete CDRs older than 90 days
| |
| | |
| # Optionally control per-table cleanup
| |
| cleandatabasecdr = 90; # Delete cdr table records older than 90 days
| |
| cleandatabasemsg = 30; # Delete message table records older than 30 days
| |
| cleandatabaseregister = 7; # Delete register table records older than 7 days
| |
| cleandatabasesip = 30; # Delete sip table records older than 30 days
| |
| cleandatabasequeue = 180; # Delete queue table records older than 180 days
| |
| | |
| # Optionally control cleanup timing
| |
| cleandatabasehour = 3; # Run cleanup at 3:00 AM daily
| |
| cleandatabaseminute = 0; # At 00 minutes past the hour
| |
| </syntaxhighlight>
| |
| | |
| For more information on data retention and cleanup options, see the [[Data_Cleaning]] page.
| |
| | |
| Restart the sensor after making configuration changes:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| systemctl restart voipmonitor
| |
| </syntaxhighlight>
| |
| | |
| === Solution: Using innodb_force_recovery (Recommended for Filesystem Corruption and InnoDB Assertion Failures) ===
| |
| | |
| If the database is corrupted after a filesystem issue and MySQL/MariaDB fails to start with InnoDB assertion errors, you can attempt to recover using the MySQL <code>innodb_force_recovery</code> parameter. This method starts MySQL in a read-only recovery mode, allowing you to back up and restore the GUI configuration.
| |
| | |
| '''Warning:''' This procedure will result in complete loss of CDR data. Only the GUI configuration can be preserved.
| |
| | |
| ==== Step 1: Ensure Filesystem Issues Are Resolved ====
| |
| | |
| Before attempting MySQL recovery, the underlying filesystem issue that caused the corruption must be fixed. MySQL will likely fail again if the disk is still having problems.
| |
| | |
| ===== Detailed Filesystem Check (fsck) Procedure =====
| |
| | |
| If a partition becomes read-only due to filesystem errors, follow these steps to repair it:
| |
| | |
| 1. '''Identify the problematic partition:'''
| |
| <syntaxhighlight lang="bash">
| |
| # Check mount points to see which partition is affected
| |
| df -h
| |
| | |
| # Check for read-only mount or I/O errors in dmesg
| |
| dmesg | tail -100 | grep -i "read-only\|i/o error\|ext4-fs"
| |
| </syntaxhighlight>
| |
| | |
| 2. '''Stop services writing to the partition:'''
| |
| Important: You must stop any services (voipmonitor, mariadb, etc.) that are writing to the affected partition before unmounting it.
| |
| <syntaxhighlight lang="bash">
| |
| # Example: Stop services that write to /home partition
| |
| systemctl stop voipmonitor mariadb
| |
| # Adjust these services based on which partition is affected
| |
| </syntaxhighlight>
| |
| | |
| 3. '''Unmount the partition:'''
| |
| <syntaxhighlight lang="bash">
| |
| # Unmount the affected partition
| |
| umount /home
| |
| # Replace /home with your actual mount point from df -h
| |
| </syntaxhighlight>
| |
| | |
| 4. '''Run filesystem check:''' | |
| <syntaxhighlight lang="bash">
| |
| # Standard partition (e.g., /dev/sda1)
| |
| fsck -t ext4 -y /dev/sda1
| |
| | |
| # LVM partition (e.g., /dev/mapper/vg_northvoipmonitorr630-lv_home)
| |
| fsck -t ext4 -y /dev/mapper/vg_northvoipmonitorr630-lv_home
| |
| </syntaxhighlight>
| |
| | |
| The <code>-t ext4</code> flag specifies the filesystem type (ext3, ext4, xfs, etc.). Use <code>df -T</code> to check the filesystem type. The <code>-y</code> flag automatically answers 'yes' to all repair prompts.
| |
| | |
| 5. '''Remount the partition:'''
| |
| <syntaxhighlight lang="bash">
| |
| mount /home
| |
| # Replace with your mount point
| |
| </syntaxhighlight>
| |
| | |
| 6. '''Restart the services:'''
| |
| <syntaxhighlight lang="bash">
| |
| systemctl start mariadb voipmonitor
| |
| # Adjust these services based on what you stopped
| |
| </syntaxhighlight>
| |
| | |
| 7. '''Verify the filesystem is healthy:'''
| |
| <syntaxhighlight lang="bash">
| |
| # Check mount status and free space
| |
| df -h
| |
| | |
| # Verify mounted read-write (not read-only)
| |
| mount | grep "on /home type"
| |
| | |
| # Check system logs for filesystem errors
| |
| dmesg | grep -i ext4 | tail -20
| |
| </syntaxhighlight>
| |
| | |
| '''Summary Checklist:'''
| |
| * Check <code>dmesg</code> or <code>/var/log/syslog</code> for I/O errors
| |
| * Ensure the partition is mounted Read-Write (not Read-Only)
| |
| * Stop services writing to the partition before unmounting
| |
| * Unmount and run <code>fsck</code> on the unmounted device
| |
| * Remount and restart services
| |
| * Verify filesystem health with <code>df -h</code>, <code>mount</code>, and <code>dmesg</code>
| |
| | |
| ==== Step 2: Enable innodb_force_recovery Mode ====
| |
| | |
| Add the recovery parameter to MySQL's configuration to start it in read-only mode. This allows MySQL to start despite InnoDB corruption.
| |
| | |
| Edit the MySQL/MariaDB configuration file:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| sudo nano /etc/my.cnf
| |
| # or
| |
| sudo nano /etc/mysql/my.cnf
| |
| </syntaxhighlight>
| |
| | |
| Add the following line to the <code>[mysqld]</code> section:
| |
| | |
| <syntaxhighlight lang="ini">
| |
| [mysqld]
| |
| innodb_force_recovery=6
| |
| </syntaxhighlight>
| |
| | |
| The <code>innodb_force_recovery=6</code> setting is the most aggressive recovery mode. It allows MySQL to start in read-only mode even with severe InnoDB corruption. See the [[#Understanding innodb_force_recovery Levels|innodb_force_recovery levels]] section below for details on each level.
| |
| | |
| ==== Step 3: Back Up GUI Configuration ====
| |
| | |
| With MySQL in recovery mode, back up the GUI configuration before proceeding.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| cd /var/www/html
| |
| php php/run.php backupGuiTables -t config -f /root/backup.zip
| |
| </syntaxhighlight>
| |
| | |
| This command exports all GUI settings (users, sensors, capture rules, alerts, etc.) to a backup file. For more information on GUI backup and restore, see the [[Backing_Up_GUI_Configuration]] page.
| |
| | |
| ==== Step 4: Stop MySQL and Back Up Corrupted Data ====
| |
| | |
| Stop the MySQL service and create a backup of the corrupted MySQL data directory.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Stop MySQL
| |
| systemctl stop mysql
| |
| # or
| |
| systemctl stop mariadb
| |
| | |
| # Move the corrupted data directory to a backup location
| |
| sudo mv /var/lib/mysql /var/lib/mysql-corrupted
| |
| </syntaxhighlight>
| |
| | |
| ==== Step 5: Re-initialize MySQL Data Directory ====
| |
| | |
| Create a new, empty MySQL data directory.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| # Reinitialize MySQL data directory
| |
| sudo mysql_install_db --user=mysql --datadir=/var/lib/mysql
| |
| # or on newer systems:
| |
| sudo mysqld --initialize --user=mysql
| |
| </syntaxhighlight>
| |
| | |
| ==== Step 6: Remove innodb_force_recovery and Start MySQL ====
| |
| | |
| Remove the recovery parameter from the configuration file and start MySQL normally.
| |
| | |
| First, edit the configuration file and remove or comment out the line:
| |
| | |
| <syntaxhighlight lang="ini">
| |
| [mysqld]
| |
| # innodb_force_recovery=6 <-- Comment out or remove this line
| |
| </syntaxhighlight>
| |
| | |
| Then start MySQL:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| systemctl start mysql
| |
| # or
| |
| systemctl start mariadb
| |
| | |
| # Verify MySQL is running
| |
| systemctl status mysql
| |
| </syntaxhighlight>
| |
| | |
| MySQL should now be able to start with a fresh, empty database.
| |
| | |
| ==== Step 7: Create VoIPmonitor Database ====
| |
| | |
| Create a new database for VoIPmonitor:
| |
| | |
| <syntaxhighlight lang="bash">
| |
| mysql -u root -p
| |
| </syntaxhighlight>
| |
| | |
| Run the following SQL commands:
| |
| | |
| <syntaxhighlight lang="sql">
| |
| CREATE DATABASE voipmonitor;
| |
| CREATE USER 'voipmonitor'@'localhost' IDENTIFIED BY 'your_password_here';
| |
| GRANT ALL PRIVILEGES ON voipmonitor.* TO 'voipmonitor'@'localhost';
| |
| FLUSH PRIVILEGES;
| |
| EXIT;
| |
| </syntaxhighlight>
| |
| | |
| ==== Step 8: Restore GUI Configuration ====
| |
| | |
| Restore the GUI configuration from the backup file created in Step 3.
| |
| | |
| <syntaxhighlight lang="bash">
| |
| cd /var/www/html
| |
| php php/run.php restoreGuiTables -t config -f /root/backup.zip
| |
| </syntaxhighlight>
| |
| | |
| ==== Step 9: Verify System Functionality ====
| |
| | |
| Verify that the GUI and sniffer are working correctly.
| |
| | |
| * Access the VoIPmonitor web GUI and log in
| |
| * Verify that sensors, users, and other settings are present
| |
| * Check that the sniffer service is running:
| |
| <syntaxhighlight lang="bash">systemctl status voipmonitor</syntaxhighlight>
| |
| * Confirm that new calls are being captured and processed
| |
| | |
| '''Note:''' All historical CDR data has been lost. Only the GUI configuration was preserved. The system will begin accumulating new CDR data from this point forward.
| |
| | |
| ==== Understanding innodb_force_recovery Levels ====
| |
| | |
| The <code>innodb_force_recovery</code> parameter accepts values from 1 to 6, each enabling progressively more aggressive recovery options:
| |
| | |
| {| class="wikitable"
| |
| |- | | |- |
| ! Value
| | | <code>disable_partition_operations = yes</code> |
| ! Meaning
| | | Disables partition management operations (creating new partitions, dropping old ones) on this sniffer instance. Use this on all sniffer instances '''except one''' when running multiple sniffers that write to the same database. Only a single designated sniffer should manage the database partition structure to avoid metadata table locks and database unresponsiveness. |
| |- | | |- |
| | 1 | | | <code>cleandatabase = N</code> |
| | (SRV_FORCE_IGNORE_CORRUPT) Runs the server even if it detects a corrupt page | | | Reduces the data retention period for cleaning the database to N days. |
| |- | | |- |
| | 2 | | | <code>mysql_redirect_cdr_queue = yes</code> |
| | (SRV_FORCE_NO_BACKGROUND) Prevents the master thread from running; prevents crash recovery | | | Enables a separate, dedicated queue for CDRs being redirected from other sniffers. |
| |- | | |- |
| | 3 | | | <code>partition_operations_drop_first = yes</code> |
| | (SRV_FORCE_NO_TRX_UNDO) Does not run transaction rollbacks after recovery | | | Drops the oldest partition first before creating a new one during cleanup, which can be faster. |
| |- | | |- |
| | 4 | | | <code>cdr_partition_by_hours = yes</code> |
| | (SRV_FORCE_NO_IBUF_MERGE) Prevents insert buffer merge operations | | | Partitions CDR tables hourly instead of daily. This keeps the active write table extremely small, which is critical for high performance. |
| |- | | |- |
| | 5 | | | <code>disable_cdr_indexes_rtp = yes</code> |
| | (SRV_FORCE_NO_UNDO_LOG_SCAN) Does not look at undo logs when starting the database | | | Disables some indexes on the <code>cdr_rtp</code> table to speed up writes, at the cost of slower searches on those fields. |
| |- | | |- |
| | 6 | | | <code>sql_errors_skip = 1136,1054</code> |
| | (SRV_FORCE_NO_LOG_REDO) Does not apply the redo log from crash recovery (most aggressive) | | | Instructs the sniffer to ignore specific, non-critical database errors to prevent it from stopping during database maintenance. |
| |} | | |} |
|
| |
| For maximum recovery capability, use <code>innodb_force_recovery=6</code>. This mode enables all recovery strategies and allows MySQL to start even with severe InnoDB corruption.
| |
|
| |
| === Solution: Restore from PCAP Files (Alternative) ===
| |
|
| |
| If you have PCAP files available in the spool directory, you can restore CDR data from them instead of using <code>innodb_force_recovery</code>. This preserves your call recordings and metadata by reprocessing the packet captures.
| |
|
| |
| '''When to use PCAP restore:'''
| |
| * PCAP files are available in the spool directory
| |
| * You want to restore historical CDR data, not just GUI configuration
| |
| * <code>innodb_force_recovery</code> method did not work
| |
|
| |
| '''Warning:''' This procedure requires stopping the VoIPmonitor services and may take significant time depending on the amount of data to restore.
| |
|
| |
| The following diagram illustrates the restoration workflow:
| |
|
| |
| <kroki lang="plantuml">
| |
| @startuml
| |
| skinparam shadowing false
| |
| skinparam defaultFontName Arial
| |
| skinparam activityFontSize 12
| |
| skinparam arrowFontSize 11
| |
|
| |
| title Database Restore from PCAP Files
| |
|
| |
| start
| |
|
| |
| :Stop VoIPmonitor services;
| |
| note right: voipmonitor, manager, gui
| |
|
| |
| :Backup corrupted database;
| |
| note right: /var/lib/mysql-backup-corrupted
| |
|
| |
| :Remove corrupted database;
| |
| note right: /var/lib/mysql/voipmonitor
| |
|
| |
| :Start MySQL/MariaDB;
| |
|
| |
| :Create fresh database;
| |
| note right: CREATE DATABASE voipmonitor
| |
|
| |
| :Run sniffer in restore mode;
| |
| note right: --readpcapdir /var/spool/voipmonitor
| |
|
| |
| while (All PCAP files processed?) is (no)
| |
| :Process next PCAP file;
| |
| :Generate CDR records;
| |
| endwhile (yes)
| |
|
| |
| :Stop restore process;
| |
|
| |
| :Start normal service;
| |
| note right: systemctl start voipmonitor
| |
|
| |
| :Verify Web GUI access;
| |
|
| |
| stop
| |
|
| |
| @enduml
| |
| </kroki>
| |
|
| |
| ==== Step 1: Stop VoIPmonitor Services ====
| |
|
| |
| Stop all VoIPmonitor services to prevent further database corruption:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Stop the sniffer service
| |
| systemctl stop voipmonitor
| |
|
| |
| # Stop sniffer manager (if running)
| |
| systemctl stop voipmonitor-manager
| |
|
| |
| # Stop any other VoIPmonitor services
| |
| systemctl stop voipmonitor-gui
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 2: Backup the Corrupted Database ====
| |
|
| |
| Although corrupted, create a backup of the existing database for troubleshooting purposes:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Stop MySQL/MariaDB service
| |
| systemctl stop mysql
| |
|
| |
| # Create a backup of the MySQL data directory
| |
| sudo cp -a /var/lib/mysql /var/lib/mysql-backup-corrupted
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 3: Remove the Corrupted Database ====
| |
|
| |
| Move or remove the corrupted database files to prepare for a fresh database:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Remove the corrupted VoIPmonitor database directory
| |
| sudo rm -rf /var/lib/mysql/voipmonitor
| |
|
| |
| # Alternatively, move it instead of deleting:
| |
| sudo mv /var/lib/mysql/voipmonitor /var/lib/mysql/voipmonitor.corrupted
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 4: Start MySQL/MariaDB Service ====
| |
|
| |
| Restart the MySQL/MariaDB service:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Start MySQL/MariaDB
| |
| systemctl start mysql
| |
|
| |
| # Verify the service is running
| |
| systemctl status mysql
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 5: Create a Fresh VoIPmonitor Database ====
| |
|
| |
| Create a new empty database for VoIPmonitor:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Log in to MySQL as root
| |
| mysql -u root -p
| |
| </syntaxhighlight>
| |
|
| |
| Run the following SQL commands:
| |
|
| |
| <syntaxhighlight lang="sql">
| |
| CREATE DATABASE voipmonitor;
| |
| CREATE USER 'voipmonitor'@'localhost' IDENTIFIED BY 'your_password_here';
| |
| GRANT ALL PRIVILEGES ON voipmonitor.* TO 'voipmonitor'@'localhost';
| |
| FLUSH PRIVILEGES;
| |
| EXIT;
| |
| </syntaxhighlight>
| |
|
| |
| Replace <code>your_password_here</code> with a strong password.
| |
|
| |
| ==== Step 6: Restore CDRs from PCAP Files ====
| |
|
| |
| Instruct the sniffer to reprocess all PCAP files from the spool directory and populate the new database:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # 1. Verify your spool directory path
| |
| # Check voipmonitor.conf for the spooldir setting (default: /var/spool/voipmonitor)
| |
| grep "^spooldir" /etc/voipmonitor.conf
| |
|
| |
| # 2. Clear the sniffer's manager socket for the restore process
| |
| # This ensures clean communication with the sniffer
| |
| rm -f /tmp/vmsck
| |
|
| |
| # 3. Start the sniffer in restore mode
| |
| # The sniffer will read all PCAP files from the spool directory
| |
| # and regenerate CDR records in the new database
| |
| voipmonitor --config-file /etc/voipmonitor.conf --readpcapdir /var/spool/voipmonitor
| |
| </syntaxhighlight>
| |
|
| |
| '''Note:''' The <code>--readpcapdir</code> parameter instructs the sniffer to process all PCAP files in the specified directory. This may take considerable time depending on the amount of historical data.
| |
|
| |
| ==== Step 7: Monitor the Restore Process ====
| |
|
| |
| Monitor the restore progress:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Monitor sniffer output for progress
| |
| journalctl -u voipmonitor -f
| |
|
| |
| # Alternatively, check the database for new CDR records
| |
| mysql -u root -p voipmonitor -e "SELECT COUNT(*) FROM cdr;"
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 8: Restart Normal Service ====
| |
|
| |
| Once the restore is complete, restart the sniffer in normal operation mode:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Stop the restore process (Ctrl+C if running manually)
| |
| # Then start the normal sniffer service
| |
| systemctl start voipmonitor
| |
|
| |
| # Verify the sniffer is running and capturing
| |
| systemctl status voipmonitor
| |
|
| |
| # Test Web GUI access
| |
| # Navigate to http://your-server/ in your browser
| |
| </syntaxhighlight>
| |
|
| |
| === Prevention: Database Backup Strategies ===
| |
|
| |
| To avoid future data loss due to database corruption:
| |
|
| |
| ==== Automatic Filesystem Backup ====
| |
|
| |
| Configure regular backups of the MySQL data directory:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Example: Daily backup using cron
| |
| 0 2 * * * /usr/bin/rsync -av --delete /var/lib/mysql/ /backup/mysql-$(date +\%Y\%m\%d)/
| |
| </syntaxhighlight>
| |
|
| |
| ==== MySQL Replication ====
| |
|
| |
| Set up MySQL master-slave replication for redundancy:
| |
| * See the [[Mysql_master-slave_replication_hints]] guide for detailed instructions
| |
| * This provides a real-time backup database that can be promoted if corruption occurs
| |
|
| |
| ==== VoIPmonitor Database Replication ====
| |
|
| |
| Use VoIPmonitor's built-in database backup mode ([[Redundant_database]]):
| |
| * This replicates CDR data to a secondary database server
| |
| * No traditional MySQL replication required
| |
| * Useful for GUI migrations and disaster recovery
| |
|
| |
| == RRD Graph Errors After Hardware Upgrades ==
| |
|
| |
| After a hardware upgrade or system migration, RRD (Round Robin Database) graphs in the VoIPmonitor GUI may display errors indicating that Data Sources (DS) are missing from RRD files. This occurs because RRD files are created with a specific hardware-dependent schema that may become incompatible after system changes.
| |
|
| |
| === Symptoms ===
| |
|
| |
| * RRD graphs in the Web GUI show display errors instead of rendering data
| |
| * Error message: <code>ERROR: No DS called '...' in '/var/spool/voipmonitor/rrd/..."'</code>
| |
| * Example: <code>ERROR: No DS called 'SQLq-SM' in '/var/spool/voipmonitor/rrd/3db-SQL.rrd'</code>
| |
| * The error appears after hardware upgrades, CPU changes, or system migrations
| |
| * Multiple RRD files may be affected, affecting various graph types
| |
|
| |
| === RRD File Location ===
| |
|
| |
| RRD files are stored in the RRD directory within the VoIPmonitor spool directory:
| |
|
| |
| <code>/var/spool/voipmonitor/rrd/</code>
| |
|
| |
| === Root Cause ===
| |
|
| |
| RRD (Round Robin Database) files contain time-series data with a schema defined at creation time. Some data sources in RRD files are hardware-specific (e.g., CPU metrics tied to specific CPU identifiers). When hardware changes, the schema information stored in the RRD files may no longer match the current system configuration, resulting in missing Data Source (DS) errors.
| |
|
| |
| === Solution: Delete Corrupted RRD Files ===
| |
|
| |
| The VoIPmonitor service will automatically recreate RRD files with the correct schema if they are missing. This is a safe operation because:
| |
|
| |
| * New RRD files will be created with the current hardware's correct schema
| |
| * Historical RRD data is typically short-term (graph display purposes only)
| |
| * CDR data and call recordings are stored separately and are not affected
| |
|
| |
| ==== Step 1: Stop the VoIPmonitor Service ====
| |
|
| |
| Stop the voipmonitor service to prevent file access conflicts:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| systemctl stop voipmonitor
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 2: Remove Corrupted RRD Files ====
| |
|
| |
| Delete the affected RRD files from the RRD directory. You can remove individual problematic files or the entire RRD directory:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Option 1: Remove specific corrupted RRD file (recommended)
| |
| rm /var/spool/voipmonitor/rrd/3db-SQL.rrd
| |
|
| |
| # Option 2: Remove all RRD files if multiple errors exist
| |
| rm /var/spool/voipmonitor/rrd/*
| |
| </syntaxhighlight>
| |
|
| |
| Replace <code>3db-SQL.rrd</code> with the actual filename from the error message.
| |
|
| |
| ==== Step 3: Start the VoIPmonitor Service ====
| |
|
| |
| Start the voipmonitor service to recreate the RRD files:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| systemctl start voipmonitor
| |
| </syntaxhighlight>
| |
|
| |
| The service will automatically detect the missing RRD files and recreate them with the correct schema based on the current hardware configuration. New graph data will begin accumulating immediately.
| |
|
| |
| ==== Step 4: Verify RRD Graphs ====
| |
|
| |
| Check the Web GUI to verify that RRD graphs are now displaying correctly:
| |
|
| |
| * Navigate to the VoIPmonitor Web GUI
| |
| * Access dashboard or reporting pages with RRD graphs
| |
| * Verify that graphs render without errors
| |
| * Note: Historical data in the affected RRD files will be lost, but new data will start appearing
| |
|
| |
| === Rerunning with Different Hardware ===
| |
|
| |
| If you need to preserve RRD data when moving to different hardware (for example, testing on a different machine), consider these options:
| |
|
| |
| * '''Don't copy RRD files''' - Let the new system create fresh RRD files with appropriate schemas
| |
| * '''Use rrdtool dump/restore''' - For advanced users, you can modify RRD file contents using rrdtool export/import tools
| |
| * '''Accept data loss''' - RRD data is typically short-term monitoring data, not critical call records
| |
|
| |
| === Related Information ===
| |
|
| |
| * RRD files are separate from CDR data (cdr table in MySQL) and PCAP recordings
| |
| * The VoIPmonitor <code>spooldir</code> location is configurable in /etc/voipmonitor.conf
| |
| * RRD files are automatically created by the sniffer service when needed
| |
|
| |
| == Faxes Cannot Be Displayed in the GUI ==
| |
|
| |
| If faxes cannot be displayed in the GUI and an error message appears, the issue is likely that the required package for fax conversion is not installed.
| |
|
| |
| === Symptoms ===
| |
|
| |
| * Faxes are not displayed in the GUI or a generic error message appears when attempting to view fax contents
| |
| * Other GUI features work normally
| |
| * No error in browser console related to failed binary execution
| |
|
| |
| === Root Cause ===
| |
|
| |
| The GUI requires the `tiff2pdf` utility to convert fax TIFF images for display in the web browser. This utility is part of the `libtiff-tools` package on Debian/Ubuntu systems or related packages on other distributions.
| |
|
| |
| === Solution: Install libtiff-tools Package ===
| |
|
| |
| Install the required package using your system's package manager.
| |
|
| |
| '''For Debian/Ubuntu:'''
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # SSH into the GUI host
| |
| sudo apt-get update
| |
| sudo apt-get install libtiff-tools
| |
| </syntaxhighlight>
| |
|
| |
| '''For CentOS/RHEL/AlmaLinux:'''
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| sudo yum install libtiff-tools
| |
| # or on newer systems:
| |
| sudo dnf install libtiff-tools
| |
| </syntaxhighlight>
| |
|
| |
| === Verifying the Fix ===
| |
|
| |
| Verify that the `tiff2pdf` binary is accessible and executable by the web server user:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check if tiff2pdf is available system-wide
| |
| which tiff2pdf
| |
|
| |
| # Verify the web server user can access tiff2pdf
| |
| # For Debian/Ubuntu (www-data)
| |
| runuser -u www-data -- which tiff2pdf
| |
|
| |
| # For CentOS/RHEL (apache)
| |
| runuser -u apache -- which tiff2pdf
| |
| </syntaxhighlight>
| |
|
| |
| If the command returns a path (e.g., `/usr/bin/tiff2pdf`), the binary is correctly installed and accessible.
| |
|
| |
| After installing the package, reload the GUI and try to display faxes again. The ability to view faxes in the GUI should now be restored.
| |
|
| |
| === Related Information ===
| |
|
| |
| * The `tiff2pdf` utility converts TIFF image files to PDF format for web browser display
| |
| * Faxes are captured by VoIPmonitor as TIFF images in T.38 fax sessions
| |
| * This conversion is required because not all browsers can display TIFF images natively
| |
| * Other GUI features (audio playback, graphs, etc.) may have different package requirements
| |
|
| |
| == Incorrect Ownership / Permission Errors ==
| |
|
| |
| If the GUI reports an "incorrect ownership" error even after verifying that the web server user (e.g., apache or www-data) has write permissions to the web root directory, the actual error may be hidden. The web server user needs **execute permissions** on all binary files in the `./bin` directory of the GUI installation.
| |
|
| |
| === Symptoms ===
| |
|
| |
| * GUI displays "incorrect ownership" or permission errors
| |
| * Error persists even after fixing ownership/permissions on the web root directory
| |
| * Binary files in the bin directory cannot be executed by the web server
| |
|
| |
| === Root Cause ===
| |
|
| |
| The GUI requires the web server user to have execute permissions on all binary files in the `bin` directory (e.g., `sox-x86_64`, `ffmpeg`, etc.). These binaries are used by the GUI for audio processing, call playback, and other features. If the binaries lack execute permissions, the GUI cannot run them.
| |
|
| |
| === Solution: Set Execute Permissions on Binaries ===
| |
|
| |
| Check and fix permissions on all files in the `./bin` directory:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Navigate to the GUI installation directory (default is /var/www/html)
| |
| cd /var/www/html
| |
|
| |
| # Check the bin directory
| |
| ls -la bin/
| |
|
| |
| # Set execute permissions on all files in the bin directory
| |
| chmod +x bin/*
| |
|
| |
| # For specific binaries, you can set execute permissions individually
| |
| chmod +x bin/sox-x86_64
| |
| chmod +x bin/ffmpeg
| |
| </syntaxhighlight>
| |
|
| |
| === Verifying the Fix ===
| |
|
| |
| Test that the binaries can be executed by the web server user:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # For Debian/Ubuntu (www-data)
| |
| su - www-data -s /bin/bash -c "/var/www/html/bin/sox-x86_64 --version"
| |
| # or
| |
| su - www-data -s /bin/bash -c "ls -x /var/www/html/bin/"
| |
|
| |
| # For CentOS/RHEL (apache)
| |
| su - apache -s /bin/bash -c "/var/www/html/bin/sox-x86_64 --version"
| |
| # or
| |
| su - apache -s /bin/bash -c "ls -x /var/www/html/bin/"
| |
| </syntaxhighlight>
| |
|
| |
| If the binaries can now be executed, the GUI should work correctly.
| |
|
| |
| === Troubleshooting Symlinks ===
| |
|
| |
| Sometimes the `bin` directory contains symlinks to other locations. Check both the symlink and its target:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check if files are symlinks and their targets
| |
| ls -lah bin/
| |
|
| |
| # If a symlink cannot be accessed, check permissions on the target
| |
| # For example, if bin/sox-x86_64 is a symlink:
| |
| ls -l bin/sox-x86_64
| |
| ls -l /path/to/real/location/sox-x86_64
| |
|
| |
| # Fix permissions on the target if needed
| |
| chmod +x /path/to/real/location/sox-x86_64
| |
| </syntaxhighlight>
| |
|
| |
| === Reproducing the Error ===
| |
|
| |
| To verify that missing execute permissions cause this error, you can temporarily remove execute permissions:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Remove execute permissions (reproduces the error)
| |
| chmod -x bin/sox-x86_64
| |
|
| |
| # Test the GUI - should show "incorrect ownership" error
| |
|
| |
| # Restore execute permissions
| |
| chmod +x bin/sox-x86_64
| |
| </syntaxhighlight>
| |
|
| |
| === Common Binaries in bin/ Directory ===
| |
|
| |
| Typical binaries that require execute permissions include:
| |
|
| |
| * `sox-x86_64` - Audio conversion tool
| |
| * `ffmpeg` - Video/audio processing
| |
| * `soxr` - Audio resampling library
| |
| * Other utility binaries used by the GUI
| |
|
| |
| == IonCube Loader Issues ==
| |
|
| |
| The VoIPmonitor GUI is protected with IonCube, which requires proper PHP configuration. Common issues include permission errors on temporary directories and security module interference.
| |
|
| |
| === Unable to create lock file / temp directory not writable ===
| |
|
| |
| If you see errors like "Unable to create lock file" or "System temp directory check fails... not writable" from IonCube Loader, follow these troubleshooting steps:
| |
|
| |
| ==== Step 1: Update the system and restart ====
| |
|
| |
| First, ensure your system packages are up to date:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Debian/Ubuntu
| |
| sudo apt update && sudo apt upgrade -y
| |
|
| |
| # RHEL/CentOS/AlmaLinux
| |
| sudo yum update -y
| |
| # or
| |
| sudo dnf update -y
| |
|
| |
| # Then restart the server
| |
| sudo reboot
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 2: Check SELinux or AppArmor ====
| |
|
| |
| Security modules like SELinux (default on RHEL/CentOS/Red Hat systems) or AppArmor (default on Ubuntu/Debian) can block IonCube from accessing temporary directories.
| |
|
| |
| '''Check if SELinux is enabled:'''
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check current status
| |
| getenforce
| |
|
| |
| # Common values: Enforcing (active), Permissive (logging only), Disabled
| |
|
| |
| # To temporarily disable SELinux for testing:
| |
| sudo setenforce 0
| |
| </syntaxhighlight>
| |
|
| |
| If disabling SELinux resolves the issue, you can permanently configure it:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Edit the SELinux configuration file
| |
| sudo nano /etc/selinux/config
| |
|
| |
| # Change SELINUX= to either:
| |
| # SELINUX=permissive
| |
| # or
| |
| # SELINUX=disabled
| |
|
| |
| # Then reboot the server
| |
| sudo reboot
| |
| </syntaxhighlight>
| |
|
| |
| '''Check if AppArmor is enabled:'''
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check AppArmor status
| |
| sudo aa-status
| |
|
| |
| # If AppArmor is running, temporarily disable individual profiles:
| |
| sudo aa-disable /etc/apparmor.d/*php*
| |
|
| |
| # Or disable it entirely for testing:
| |
| sudo systemctl stop apparmor
| |
| sudo systemctl disable apparmor
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 3: Check systemd PrivateTmp ====
| |
|
| |
| Some systemd service configurations use <code>PrivateTmp=true</code>, which creates a private temporary directory for each service. This can cause issues if the private tmp directory has restrictive permissions.
| |
|
| |
| Check if your web server is using PrivateTmp:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # For Apache
| |
| systemctl show httpd | grep PrivateTmp
| |
| # or
| |
| systemctl show apache2 | grep PrivateTmp
| |
|
| |
| # For PHP-FPM
| |
| systemctl show php-fpm | grep PrivateTmp
| |
| </syntaxhighlight>
| |
|
| |
| If PrivateTmp is enabled (value=1), disable it in the service file:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Create override directory if it doesn't exist
| |
| sudo mkdir -p /etc/systemd/system/httpd.service.d
| |
|
| |
| # Create override file
| |
| sudo nano /etc/systemd/system/httpd.service.d/privatetmp.conf
| |
| </syntaxhighlight>
| |
|
| |
| Add the following content:
| |
|
| |
| <syntaxhighlight lang="ini">
| |
| [Service]
| |
| PrivateTmp=false
| |
| </syntaxhighlight>
| |
|
| |
| Then reload and restart:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Reload systemd and restart the service
| |
| sudo systemctl daemon-reload
| |
| sudo systemctl restart httpd
| |
| # or
| |
| sudo systemctl restart apache2
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 4: Verify PHP Temporary Directory Configuration ====
| |
|
| |
| Check which temporary directory PHP is using:
| |
|
| |
| Create a PHP info file:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| echo '<?php phpinfo(); ?>' > /var/www/html/info.php
| |
| </syntaxhighlight>
| |
|
| |
| Visit <code>http://your-server-ip/info.php</code> in your browser and search for:
| |
| * <code>upload_tmp_dir</code>
| |
| * <code>sys_get_temp_dir</code>
| |
| * <code>session.save_path</code>
| |
|
| |
| Ensure these directories are writable by the web server user:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check ownership
| |
| ls -ld /tmp
| |
|
| |
| # Fix ownership if needed
| |
| sudo chown www-data:www-data /tmp # Debian/Ubuntu
| |
| # or
| |
| sudo chown apache:apache /tmp # CentOS/RHEL
| |
|
| |
| # Fix permissions
| |
| sudo chmod 1777 /tmp
| |
| </syntaxhighlight>
| |
|
| |
| '''Important:''' Clean up after troubleshooting:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| rm /var/www/html/info.php
| |
| </syntaxhighlight>
| |
|
| |
| ==== Step 5: Check open_basedir restrictions ====
| |
|
| |
| If the above steps don't resolve the issue, check if PHP's <code>open_basedir</code> is restricting access to the temp directory:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check open_basedir in php.ini
| |
| grep open_basedir /etc/php/*/apache2/php.ini
| |
| # or
| |
| grep open_basedir /etc/php.ini
| |
| </syntaxhighlight>
| |
|
| |
| Ensure the temp directory is included in the list, e.g.:
| |
|
| |
| <code>open_basedir = /var/www/html:/tmp:/var/tmp</code>
| |
|
| |
| === Failed check Ioncube.com PHP Loader for php cli ===
| |
|
| |
| If the GUI installation check fails with the error "Failed check Ioncube.com PHP Loader for php cli : no ionCube extension enabled in PHP cli" even though IonCube appears to be correctly installed from the command line, the issue is often a difference between the PHP CLI environment tested by root and the PHP environment used by the web server.
| |
|
| |
| ==== Diagnosis: Exact Web Server Environment Test ====
| |
|
| |
| To diagnose the issue, run the exact command the GUI uses as the web server user instead of root:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Test IonCube extension as the web server user
| |
| sudo -u www-data PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin php -r 'echo extension_loaded("ionCube Loader")?"yes":"no";' 2>&1
| |
|
| |
| # For CentOS/RHEL systems, replace www-data with apache
| |
| sudo -u apache PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin php -r 'echo extension_loaded("ionCube Loader")?"yes":"no";' 2>&1
| |
| </syntaxhighlight>
| |
|
| |
| If this command returns "no" but the same command as root returns "yes", there is a configuration difference between users.
| |
|
| |
| Note the <code>PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</code> parameter is critical - it ensures the web server user can find the correct PHP binary.
| |
|
| |
| ==== Compare PHP Configuration Files ====
| |
|
| |
| The CLI PHP may use a different configuration file than the web server PHP. Compare the configurations:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check which configuration file CLI PHP uses
| |
| php --ini
| |
|
| |
| # Create phpinfo file to check web server configuration
| |
| echo '<?php phpinfo(); ?>' > /var/www/html/info.php
| |
|
| |
| # Visit http://your-server-ip/info.php in your browser
| |
| # Look for "Loaded Configuration File" and "Additional .ini files parsed"
| |
| </syntaxhighlight>
| |
|
| |
| ==== Verify zend_extension Directive Placement ====
| |
|
| |
| Ensure the <code>zend_extension</code> directive for IonCube Loader is in the correct PHP configuration file used by the web server, not just in the CLI configuration:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check for IonCube in web server config
| |
| grep -r "ioncube_loader" /etc/php/*/apache2/conf.d/
| |
| grep -r "ioncube_loader" /etc/php/*/fpm/conf.d/
| |
| # or for CentOS/RHEL
| |
| grep -r "ioncube_loader" /etc/php.d/
| |
|
| |
| # Check CLI config
| |
| grep -r "ioncube_loader" /etc/php/*/cli/conf.d/
| |
| </syntaxhighlight>
| |
|
| |
| If the web server config is missing the <code>zend_extension = ioncube_loader_lin_*.so</code> line, add it in the appropriate directory:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Example for PHP 8.1 on Debian/Ubuntu (Apache)
| |
| echo 'zend_extension = ioncube_loader_lin_8.1.so' | sudo tee /etc/php/8.1/apache2/conf.d/00-ioncube.ini
| |
|
| |
| # Example for PHP 8.1 on Debian/Ubuntu (FPM)
| |
| echo 'zend_extension = ioncube_loader_lin_8.1.so' | sudo tee /etc/php/8.1/fpm/conf.d/00-ioncube.ini
| |
|
| |
| # Example for CentOS/RHEL
| |
| echo 'zend_extension = ioncube_loader_lin_8.1.so' | sudo tee /etc/php.d/00-ioncube.ini
| |
| </syntaxhighlight>
| |
|
| |
| Restart the web server after making changes:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Debian/Ubuntu with Apache
| |
| sudo systemctl restart apache2
| |
|
| |
| # Debian/Ubuntu with PHP-FPM
| |
| sudo systemctl restart php8.1-fpm
| |
|
| |
| # CentOS/RHEL with httpd
| |
| sudo systemctl restart httpd
| |
|
| |
| # CentOS/RHEL with PHP-FPM
| |
| sudo systemctl restart php-fpm
| |
| </syntaxhighlight>
| |
|
| |
| Clean up the test file:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| rm /var/www/html/info.php
| |
| </syntaxhighlight>
| |
|
| |
| == /dev/shm Filesystem Capacity Issues ==
| |
|
| |
| After a period of operation, user sessions may start logging out and new logins become impossible. This occurs when the <code>/dev/shm</code> filesystem (tmpfs) reaches its capacity limit. The VoIPmonitor GUI stores PHP session files in <code>/dev/shm</code> by default for performance reasons.
| |
|
| |
| === Symptoms ===
| |
|
| |
| * Users are frequently logged out from the GUI
| |
| * New logins fail or immediately redirect to login screen
| |
| * <code>/dev/shm</code> is reported as full (100% capacity)
| |
| * GUI behavior improves temporarily after clearing session files
| |
|
| |
| === Diagnosis ===
| |
|
| |
| Check the current <code>/dev/shm</code> usage:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check /dev/shm usage and available space
| |
| df -h /dev/shm
| |
|
| |
| # Check how much space is used by session files
| |
| du -sh /dev/shm/php_sessions/*
| |
|
| |
| # Count session files
| |
| ls /dev/shm/php_sessions/ | wc -l
| |
| </syntaxhighlight>
| |
|
| |
| === Solution: Increase /dev/shm Size ===
| |
|
| |
| ==== Temporary Increase (Until Reboot) ====
| |
|
| |
| To temporarily increase the size of <code>/dev/shm</code> without rebooting:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Remount /dev/shm with increased size (example: 1GB)
| |
| mount -o remount,size=1G /dev/shm
| |
|
| |
| # Verify the new size
| |
| df -h /dev/shm
| |
| </syntaxhighlight>
| |
|
| |
| Adjust the size parameter (<code>size=1G</code>) based on your server's RAM and expected number of concurrent users.
| |
|
| |
| ==== Permanent Configuration (Persistent After Reboot) ====
| |
|
| |
| To make the size increase permanent, edit the <code>/etc/fstab</code> file:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Edit /etc/fstab as root
| |
| sudo nano /etc/fstab
| |
| </syntaxhighlight>
| |
|
| |
| Find the line for <code>/dev/shm</code>. It typically looks like this:
| |
| <pre>tmpfs /dev/shm tmpfs defaults 0 0</pre>
| |
|
| |
| Modify it to include the size parameter:
| |
| <pre>tmpfs /dev/shm tmpfs defaults,size=1G 0 0</pre>
| |
|
| |
| Save the file and apply the changes without rebooting:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Remount all filesystems from /etc/fstab
| |
| mount -a
| |
|
| |
| # Verify the new size
| |
| df -h /dev/shm
| |
| </syntaxhighlight>
| |
|
| |
| === Prevention: Session Cleanup Configuration ===
| |
|
| |
| Ensure that PHP is configured to clean up old session files from <code>/dev/shm</code>. Check the following PHP configuration settings:
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| # Check session configuration
| |
| php -i | grep -i session
| |
|
| |
| # Look for these directives in php.ini:
| |
| # session.gc_maxlifetime - Session lifetime in seconds (default: 1440 = 24 minutes)
| |
| # session.gc_probability - Probability of garbage collection (default: 0)
| |
| # session.gc_divisor - Garbage collection divisor (default: 1000)
| |
| </syntaxhighlight>
| |
|
| |
| For automatic cleanup, ensure <code>session.gc_probability</code> is set to a non-zero value. The probability is calculated as <code>gc_probability / gc_divisor</code>. For example:
| |
|
| |
| * <code>session.gc_probability = 1</code> and <code>session.gc_divisor = 100</code> = 1% chance each session start
| |
| * <code>session.gc_probability = 1</code> and <code>session.gc_divisor = 10</code> = 10% chance each session start
| |
|
| |
| === Related Information ===
| |
|
| |
| * <code>/dev/shm</code> is a tmpfs filesystem backed by RAM
| |
| * Increasing <code>/dev/shm</code> size consumes physical RAM - monitor total memory usage
| |
| * The GUI typically stores session files in <code>/dev/shm/php_sessions/</code> when configured for performance
| |
| * Alternative session handlers (memcached, redis) can be considered for very high-traffic deployments
| |
|
| |
| == Alternative: MySQL General Log ==
| |
|
| |
| If you need a persistent server-side log of all database queries (not just from the GUI), you can enable the MySQL general log:
| |
|
| |
| <syntaxhighlight lang="sql">
| |
| -- Enable general log
| |
| SET GLOBAL general_log = 'ON';
| |
|
| |
| -- Perform actions in the GUI...
| |
|
| |
| -- Disable when done (important for performance)
| |
| SET GLOBAL general_log = 'OFF';
| |
| </syntaxhighlight>
| |
|
| |
| The log file location is typically <code>/var/lib/mysql/hostname.log</code> or as defined in your MySQL configuration.
| |
|
| |
| '''Warning:''' The general log can grow very quickly on a busy system. Always disable it after debugging.
| |
|
| |
|
| == AI Summary for RAG == | | == AI Summary for RAG == |
| | | '''Summary:''' This document provides an expert-level guide to configuring a VoIPmonitor deployment for extreme high-call-per-second (CPS) rates (10,000+ concurrent calls). It describes a "centralized writer architecture" with three stages: 1) A central sniffer that collects CDRs from all other sensors. 2) The central sniffer performs optimized batch writing to the database, notably by pre-assigning primary keys instead of using AUTO_INCREMENT (`mysql_enable_set_id=yes`). 3) The MySQL/MariaDB database is heavily tuned for write ingestion. This configuration is critical for resolving UI lag, unresponsive GUI, and database queue (SQLq) issues under high load. The guide provides and annotates two complete configuration examples. The `my.cnf` configuration focuses on maximizing write performance by disabling binary logging, relaxing transaction durability (`innodb_flush_log_at_trx_commit=0`), disabling the doublewrite buffer, and allocating massive memory buffers (`innodb_buffer_pool_size=150G`). Key MySQL optimization parameters include `innodb_io_capacity=1000000`, `innodb_thread_concurrency=40`, `innodb_flush_method=O_DIRECT`, `innodb_read_io_threads=20`, `innodb_write_io_threads=20`, `innodb_purge_threads=20`, and LZ4 compression. The `voipmonitor.conf` for the central sniffer is tuned for large-scale batching (`mysqlstore_concat_limit=10000`), high thread counts (`mysqlstore_max_threads_cdr=40`), and hourly partitioning (`cdr_partition_by_hours=yes`) to keep active tables small. This setup can handle 3000+ CDRs/second, making it suitable for deployments with 4000-5000+ concurrent calls experiencing performance issues. |
| '''Summary:''' This page covers GUI troubleshooting techniques including debug mode activation, MySQL/MariaDB database corruption restoration, and filesystem repair procedures. The database corruption section includes FOUR recovery methods with clear decision criteria: (1) Table-Level Repair (FIRST ATTEMPT when MySQL is running and corruption is limited to specific tables - use mysqlcheck --repair or REPAIR TABLE) by stopping voipmonitor, running mysqlcheck --repair voipmonitor, repairing specific InnoDB tables with "REPAIR TABLE cdr; REPAIR TABLE cdr_next_partition;", checking and trimming large tables with DELETE/OPTIMIZE or configuring cleandatabase options, restarting services, and optionally upgrading MySQL to latest version in branch (e.g., 5.7.33 to latest 5.7.x), (2) Drop and recreate database (SIMPLEST AND FASTEST - use when MySQL is running, corruption is widespread, data loss is acceptable, and quick service restoration is needed) by stopping sensors with systemctl stop voipmonitor, dropping the database with DROP DATABASE IF EXISTS voipmonitor, restarting one sensor to auto-recreate the database, then starting remaining sensors, (3) innodb_force_recovery parameter (ONLY for InnoDB assertion failures after filesystem corruption where MySQL fails to start - this is more complex and requires GUI backup/restore) to save GUI configuration when MySQL cannot start normally, and (4) restore from PCAP files (alternative when PCAP files are available and you want to restore historical CDR data). For recovery, ALWAYS try table-level repair first (mysqlcheck) if MySQL is running, then drop/recreate if repair fails or data loss is acceptable, then innodb_force_recovery for severe InnoDB corruption. Corruption indicators in MySQL logs include "semaphore waits", "page corruption detected", "Table is marked as crashed", "InnoDB Assertion failure". Prevention: Configure cleandatabase* options (cleandatabase=90 etc.) in /etc/voipmonitor.conf to prevent future corruption from excessive data accumulation. The filesystem check section provides complete fsck procedure for repairing read-only partitions (stop services, unmount, run fsck -t ext4 -y, remount, restart services, verify). Other topics include browser cache issues after GUI upgrade (clear cache or hard refresh Ctrl+F5/Cmd+Shift+R), faxes not being displayed in the GUI (missing libtiff-tools package with tiff2pdf utility), incorrect ownership errors caused by missing execute permissions on GUI binaries in the ./bin directory, incorrect web root directory ownership causing "Invalid compressed data in update file" error, RRD graph errors after hardware upgrades (delete RRD files, service auto-recreates), upgrade issues (web portal inaccessible after upgrade requiring web server restart, blank screen with JavaScript errors, conflicting constants.php file, blank white screen due to SELinux), apilicensecheck.php fatal error (DO NOT reinstall entire GUI - replace only the patched file), IonCube Loader problems, and /dev/shm filesystem capacity issues. | | '''Keywords:''' high performance, high cps, calls per second, scaling, tuning, database, mysql, mariadb, my.cnf, voipmonitor.conf, centralized writer, batch writing, `mysql_enable_set_id`, `innodb_flush_log_at_trx_commit`, `innodb_buffer_pool_size`, hourly partitioning, `cdr_partition_by_hours`, `mysqlstore_concat_limit`, UI lag, unresponsive GUI, SQL queue, SQLq growing, database bottleneck, extreme performance, 4000 concurrent calls, 5000 concurrent calls, `innodb_io_capacity`, `innodb_thread_concurrency`, `innodb_flush_method=O_DIRECT`, `innodb_read_io_threads`, `innodb_write_io_threads`, `innodb_purge_threads`, LZ4 compression, `innodb_compression_algorithm=lz4`, `skip-external-locking`, `skip-name-resolve`, `performance_schema=0`, `innodb_flush_neighbors=0`, `innodb_doublewrite=0`, `open_files_limit=200000`, `innodb_log_file_size=5G`, `innodb_log_buffer_size=2G`, `max_heap_table_size=24G`, `sort_buffer_size=65M` |
| | |
| '''Keywords:''' GUI troubleshooting, debug mode, MySQL corruption, MariaDB corruption, database restore, PCAP restore, CDR restore, drop database, recreate database, drop and recreate, DROP DATABASE, sensor auto-create, database corruption recovery, cleandatabase, cleandatabasecdr, cleandatabasemsg, cleandatabaseregister, cleandatabasesip, cleandatabasequeue, automatic database cleanup, prevent corruption, innodb_force_recovery, InnoDB assertion failure, read-only filesystem, filesystem repair, filesystem check, fsck, partition repair, umount, remount, ext4, filesystem errors, I/O errors, disk check, partition readonly, read-only partition, GUI configuration backup, GUI configuration restore, table-level repair, mysqlcheck, mysqlcheck --repair, REPAIR TABLE, repair corrupted tables, table corruption, semaphore waits, page corruption, InnoDB page corruption, database error log, check MySQL error log, trim large tables, DELETE old data, OPTIMIZE TABLE, upgrade MySQL server, MySQL upgrade, latest MySQL version, MySQL 5.7.33, MySQL 5.7 upgrade, faxes not displaying, cannot display faxes, fax error, FAX, T.38, fax TIFF, TIFF images, PDF conversion, tiff2pdf, missing tiff2pdf, libtiff-tools, install libtiff-tools, fax package, fax conversion, fax preview, fax missing, incorrect ownership, permission errors, bin directory, execute permissions, chmod +x, sox-x86_64, ffmpeg, symlinks, web root ownership, chown -R, Invalid compressed data in update file, web server user, apache, www-data, nginx, directory ownership fix, update fails, RRD graphs, RRD error, Round Robin Database, hardware upgrade, No DS called, delete RRD files, systemctl stop voipmonitor, upgrade issues, web portal inaccessible, restart httpd, restart apache2, restart php-fpm, systemctl restart, IonCube, SELinux, AppArmor, PrivateTmp, temporary directory, permissions, open_basedir, blank screen, blank white screen, JavaScript errors, constants.php, PEAR, ReferenceError, setenforce, /dev/shm, dev shm, tmpfs, session logout, login failed, mount -o remount, fstab, session gc, session.gc_maxlifetime, session.gc_probability, php_sessions, apilicensecheck.php, findExecutableFile, patched file, license check API, Check License, undefined function, call to undefined function, PHP Fatal error, DO NOT reinstall, full reinstall not required, replace single file, backup original file, chown www-data:www-data, chmod 644, browser cache, clear cache, hard refresh, Ctrl+F5, Cmd+Shift+R, cookies, stale assets, GUI upgrade cache issues | |
| | |
| '''Key Questions:''' | | '''Key Questions:''' |
| * How do I enable debug mode in the GUI to see SQL queries? | | * How do I configure VoIPmonitor for very high call volumes (4000-5000+ concurrent calls)? |
| * IP lookup stopped working after GUI upgrade - what do I do?
| | * How do I fix unresponsive UI or GUI lag under high load? |
| * Features stop working immediately after GUI upgrade - how do I fix it? | | * What causes SQL queue (SQLq) growth and how do I resolve it? |
| * How do I clear browser cache and cookies after a GUI upgrade?
| | * What is the centralized writer architecture? |
| * What is a hard refresh and how do I perform it (Ctrl+F5, Cmd+Shift+R)? | | * What are the recommended MySQL settings for high CDR ingestion rates? |
| * Why should I clear browser cache after upgrading the GUI?
| | * How does `mysql_enable_set_id=yes` improve performance? |
| * GUI features broken after upgrade but web server restart doesn't help - what now?
| | * What are the benefits and drawbacks of hourly partitioning? |
| * Icons or styling appear wrong after GUI upgrade - how do I fix it?
| | * Why set `innodb_flush_log_at_trx_commit` to 0? |
| * Faxes cannot be displayed in the GUI - what do I do?
| | * How can I configure the sniffer to act as a central data collector? |
| * What package do I need to install to view faxes in the GUI? | | * What are the key `voipmonitor.conf` parameters for a high-performance setup? |
| * How do I fix fax display errors in VoIPmonitor?
| | * What MySQL parameters help with extreme CDR insertion rates (1000+ CDRs/sec)? |
| * Why are faxes not showing in my VoIPmonitor GUI?
| | * How do I tune `innodb_io_capacity` and `innodb_thread_concurrency` for high performance? |
| * tiff2pdf command not found - how do I fix fax display?
| | * How does LZ4 compression improve MySQL performance on large datasets? |
| * How do I verify tiff2pdf is accessible to the web server?
| |
| * What is the tiff2pdf utility used for in VoIPmonitor? | |
| * How do I install libtiff-tools for fax display? | |
| * GUI update fails with "Invalid compressed data in update file" - what do I do?
| |
| * The GUI reports an incorrect ownership error but web server user has permissions - what do I check?
| |
| * My MySQL database is corrupted, data loss is acceptable, and I need to restore service quickly - what do I do?
| |
| * What is the FASTEST way to restore service when MySQL database is corrupted? | |
| * How do I quickly fix a corrupted voipmonitor database when MySQL is running?
| |
| * Should I use drop and recreate or innodb_force_recovery for database corruption?
| |
| * When should I use DROP DATABASE vs innodb_force_recovery? | |
| * What is the simplest way to restore service when the voipmonitor database is corrupted?
| |
| * How do I use the sensor to auto-create a fresh database? | |
| * What should I do if the MySQL/MariaDB database is corrupted but the service is running?
| |
| * How do I use mysqlcheck --repair to fix corrupted tables?
| |
| * What is the table-level repair method for database corruption?
| |
| * How do I use REPAIR TABLE to fix InnoDB corruption?
| |
| * How do I trim large tables to free disk space?
| |
| * How do I upgrade MySQL server after database corruption?
| |
| * What are the MySQL error log indicators for database corruption (semaphore waits, page corruption, InnoDB Assertion failure)? | |
| * How do I fix a corrupted voipmonitor database when MySQL is running?
| |
| * How do I drop and recreate the voipmonitor database?
| |
| * How do I configure cleandatabase options to prevent future database corruption?
| |
| * What cleandatabase parameters should I set for automatic database cleanup?
| |
| * How do I prevent database corruption due to excessive data accumulation?
| |
| * How do I stop sensors and restart them to recreate the database?
| |
| * What is the DROP DATABASE command for corrupted voipmonitor database?
| |
| * How do I choose between drop/recreate and innodb_force_recovery for database corruption?
| |
| * How do I fix incorrect ownership errors related to the bin directory?
| |
| * What files need execute permissions in the GUI bin directory?
| |
| * How do I use chmod +x on GUI binaries like sox-x86_64?
| |
| * Why do GUI binaries need execute permissions?
| |
| * How do I verify that the web server user can execute binaries in the bin directory?
| |
| * What should I do if the MySQL/MariaDB database is corrupted after a filesystem issue?
| |
| * How do I choose between innodb_force_recovery and PCAP restore for database corruption?
| |
| * MySQL fails to start after filesystem crash with InnoDB assertion failures - which method should I use?
| |
| * How do I use innodb_force_recovery to recover MySQL from InnoDB corruption?
| |
| * What is the innodb_force_recovery parameter in MySQL? | |
| * How do I back up and restore GUI configuration using backupGuiTables and restoreGuiTables?
| |
| * MySQL fails to start with InnoDB assertion failure - how do I fix it?
| |
| * How do I reinitialize MySQL data directory after corruption?
| |
| * How do I restore CDR data from PCAP files after database corruption?
| |
| * When should I use innodb_force_recovery versus PCAP restore for database corruption?
| |
| * RRD graphs show error "No DS called 'SQLq-SM'" after hardware upgrade - how do I fix it?
| |
| * How do I fix web portal inaccessible after GUI upgrade?
| |
| * Should I restart the web server after upgrading the GUI?
| |
| * What web server commands should I use after a GUI upgrade?
| |
| * How do I fix RRD graph errors appearing after system migration or CPU change?
| |
| * Can I delete RRD files and will voipmonitor recreate them automatically?
| |
| * Where are VoIPmonitor RRD files stored?
| |
| * How do I fix "Unable to create lock file" errors from IonCube Loader?
| |
| * How do I check if SELinux or AppArmor is blocking the GUI?
| |
| * What is systemd PrivateTmp and how does it affect the GUI?
| |
| * Why is my GUI showing a blank screen with JavaScript ReferenceError after an update?
| |
| * How do I fix ReferenceError: _AuditActivity_download_wav is not defined?
| |
| * My GUI shows a blank white screen after login without JavaScript errors - is this caused by SELinux?
| |
| * How do I disable SELinux to fix blank white screen in the GUI?
| |
| * What is the command to temporarily disable SELinux (setenforce 0)?
| |
| * How do I permanently disable SELinux in /etc/selinux/config?
| |
| * How do I check if SELinux is enabled with getenforce?
| |
| * My Check License API call fails with "Call to undefined function findExecutableFile()" - how do I fix it?
| |
| * Call to undefined function findExecutableFile in apilicensecheck.php - should I reinstall the entire GUI?
| |
| * How do I replace apilicensecheck.php with a patched file from support? | |
| * What is the correct fix for apilicensecheck.php PHP Fatal error?
| |
| * How do I fix the apilicensecheck.php fatal error requiring a patched file?
| |
| * Users are being logged out and cannot login - /dev/shm is full - what do I do?
| |
| * How do I increase /dev/shm size?
| |
| * How do I permanently change /dev/shm size in /etc/fstab?
| |
| * How do I configure PHP to clean up old session files from /dev/shm?
| |
| * A Linux partition becomes read-only due to filesystem errors - how do I fix it?
| |
| * How do I run fsck to repair a read-only filesystem?
| |
| * What is the procedure for fixing a filesystem that is mounted read-only?
| |
| * How do I stop services before running fsck on a partition? | |
| * How do I unmount a partition to run filesystem check?
| |
| * What fsck command do I use to repair a read-only partition?
| |
| * How do I check the filesystem type before running fsck?
| |
| * What should I do after running fsck on a corrupted filesystem?
| |
| * How do I verify the filesystem is healthy after running fsck?
| |
| * What is the correct order: fsck first or MySQL recovery first?
| |