{"id":248644,"date":"2025-09-05T21:19:53","date_gmt":"2025-09-05T21:19:53","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/package-installator\/"},"modified":"2026-05-28T13:57:34","modified_gmt":"2026-05-28T13:57:34","slug":"package-installator","status":"publish","type":"plugin","link":"https:\/\/oci.wordpress.org\/plugins\/package-installator\/","author":22011295,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.2.0","stable_tag":"2.2.0","tested":"7.0","requires":"5.0","requires_php":"8.2","requires_plugins":null,"header_name":"WP DevOps Dashboard","header_author":"Tlloancy (in zusammenarbeit mit xAI)","header_description":"A plugin to manage system packages (e.g., php-xml) with a modern UI.","assets_banners_color":"217c85","last_updated":"2026-05-28 13:57:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":10,"downloads":745,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"tlloancy","date":"2025-09-05 21:19:24"},"1.1.0":{"tag":"1.1.0","author":"tlloancy","date":"2025-12-11 15:02:42"},"1.2.0":{"tag":"1.2.0","author":"tlloancy","date":"2026-03-03 03:59:58"},"1.2.1":{"tag":"1.2.1","author":"tlloancy","date":"2026-03-03 05:35:31"},"1.3.0":{"tag":"1.3.0","author":"tlloancy","date":"2026-04-08 04:41:13"},"1.4.0":{"tag":"1.4.0","author":"tlloancy","date":"2026-04-08 23:53:42"},"2.0.0":{"tag":"2.0.0","author":"tlloancy","date":"2026-04-12 01:18:36"},"2.1.0":{"tag":"2.1.0","author":"tlloancy","date":"2026-04-12 15:50:53"},"2.1.2":{"tag":"2.1.2","author":"tlloancy","date":"2026-04-13 02:19:32"},"2.2.0":{"tag":"2.2.0","author":"tlloancy","date":"2026-05-28 13:57:34"}},"upgrade_notice":{"2.2.0":"<p>Performance and UX release. No database changes. Safe to update directly.<\/p>","2.0.0":"<p>Major architectural change. Back up your database before upgrading. SSH credentials and settings are preserved.<\/p>","1.1.0":"<p>Major update with translations, command logging, and safer execution mode. Back up your database before upgrading.<\/p>","1.0.0":"<p>Initial release. Configure SSH settings before managing packages. Ensure the SSH user has <code>sudo<\/code> privileges.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3356907,"resolution":"256x256","location":"assets","locale":"","width":560,"height":560}},"assets_banners":{"banner-772x250.gif":{"filename":"banner-772x250.gif","revision":3356907,"resolution":"772x250","location":"assets","locale":"","width":752,"height":416}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0","1.2.1","1.3.0","1.4.0","2.0.0","2.1.0","2.1.2","2.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.gif":{"filename":"screenshot-1.gif","revision":3502038,"resolution":"1","location":"assets","locale":"","width":800,"height":450},"screenshot-2.gif":{"filename":"screenshot-2.gif","revision":3502038,"resolution":"2","location":"assets","locale":"","width":800,"height":450},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3504555,"resolution":"3","location":"assets","locale":"","width":1918,"height":953}},"screenshots":{"1":"<strong>DevOps Dashboard<\/strong>: Unified view showing server stats (CPU\/RAM\/disk), Docker containers, package status, and Ansible playbook catalog with real-time SSH status indicator.","2":"<strong>SSH Settings<\/strong>: Configure SSH host, port, username, authentication type (private key or password), and playbook repository URL, with a live connection test button."}},"plugin_section":[],"plugin_tags":[260001,32397,59197,61725,38959],"plugin_category":[],"plugin_contributors":[232640],"plugin_business_model":[],"class_list":["post-248644","plugin","type-plugin","status-publish","hentry","plugin_tags-ansible","plugin_tags-devops","plugin_tags-docker","plugin_tags-server-management","plugin_tags-ssh","plugin_contributors-tlloancy","plugin_committers-tlloancy"],"banners":{"banner":"https:\/\/ps.w.org\/package-installator\/assets\/banner-772x250.gif?rev=3356907","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/package-installator\/assets\/icon-256x256.gif?rev=3356907","icon_2x":"https:\/\/ps.w.org\/package-installator\/assets\/icon-256x256.gif?rev=3356907","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/package-installator\/assets\/screenshot-1.gif?rev=3502038","caption":"<strong>DevOps Dashboard<\/strong>: Unified view showing server stats (CPU\/RAM\/disk), Docker containers, package status, and Ansible playbook catalog with real-time SSH status indicator."},{"src":"https:\/\/ps.w.org\/package-installator\/assets\/screenshot-2.gif?rev=3502038","caption":"<strong>SSH Settings<\/strong>: Configure SSH host, port, username, authentication type (private key or password), and playbook repository URL, with a live connection test button."},{"src":"https:\/\/ps.w.org\/package-installator\/assets\/screenshot-3.png?rev=3504555","caption":""}],"raw_content":"<!--section=description-->\n<p>WP DevOps Dashboard turns your WordPress admin into a full server orchestration panel. Connect once via SSH and get a live, React-powered interface to manage your Linux server without ever leaving the dashboard.<\/p>\n\n<h3>Why WP DevOps Dashboard?<\/h3>\n\n<p>The key differentiator is its <strong>forkable playbook catalog<\/strong>. The plugin does not ship a fixed list of automation scripts \u2014 it pulls a live catalog from a GitHub repository you control. Fork the <a href=\"https:\/\/github.com\/elestranobaron\/wp-package-installator-playbooks\">Official Playbook Repository<\/a>, add your own <code>manifest.json + info.json + main.yml<\/code> bundles, and the dashboard picks them up automatically on the next sync. No plugin code to touch. No pull requests to submit. Your infrastructure, your catalog.<\/p>\n\n<h3>Key Features<\/h3>\n\n<ul>\n<li><strong>Forkable Automation Catalog<\/strong>: Point the plugin at any GitHub repository. The catalog format (<code>manifest.json<\/code> + per-service <code>info.json<\/code> + <code>main.yml<\/code>) is documented in the official repo. GitHub Actions auto-generates new entries. Fork once, own your automation library forever.<\/li>\n<li><strong>Ansible Orchestrator<\/strong>: Run playbooks directly from WordPress with real-time log streaming via xterm.js. Long-running tasks execute in the background via <code>nohup<\/code> and stream output back as they run.<\/li>\n<li><strong>Multi-distro Package Manager<\/strong>: Install and remove system packages on Debian, Ubuntu, Red Hat, Fedora, Arch Linux, and SUSE \u2014 <code>apt<\/code>, <code>yum<\/code>, <code>dnf<\/code>, <code>pacman<\/code>, and <code>zypper<\/code> are all supported.<\/li>\n<li><strong>Docker Integration<\/strong>: List all containers, start, stop, and restart them securely from the dashboard.<\/li>\n<li><strong>Server Monitoring (Cockpit)<\/strong>: Live CPU, RAM, and disk usage pulled in a single SSH round-trip via the unified REST endpoint (<code>\/wp-json\/wpkginst\/v1\/full-status<\/code>).<\/li>\n<li><strong>SSH Terminal<\/strong>: A browser-based root command executor with password re-authentication gate and full command audit log.<\/li>\n<li><strong>Zero External Dependencies<\/strong>: React 18, Axios, xterm.js, react-select, and phpseclib3 are all bundled. No Composer or npm required on the WordPress server.<\/li>\n<li><strong>Modern React UI<\/strong>: Searchable tables, animated progress bars, live terminal output, and real-time SSH status indicator.<\/li>\n<\/ul>\n\n<h3>Architecture Overview<\/h3>\n\n<pre><code>`\n<\/code><\/pre>\n\n<p>GitHub Repo (your fork)\n  \u2514\u2500\u2500 manifest.json          \u2190 catalog index (auto-generated by GitHub Actions)\n  \u2514\u2500\u2500 services\/\n        \u2514\u2500\u2500 my-service\/\n              \u251c\u2500\u2500 info.json  \u2190 display name, description, icon\n              \u2514\u2500\u2500 main.yml   \u2190 Ansible playbook\n    `<\/p>\n\n<p>The plugin clones the repository to the remote server via SSH, reads <code>manifest.json<\/code>, and builds the playbook list dynamically. Change the repository URL in SSH Settings to point at your own fork \u2014 no other configuration needed.<\/p>\n\n<h3>Dependencies<\/h3>\n\n<p>All runtime dependencies are bundled \u2014 React 18, Axios, xterm.js, react-select, and phpseclib3. No Composer or npm installation required.<\/p>\n\n<h3>Important Security Warnings<\/h3>\n\n<ul>\n<li>This plugin executes <strong>root-level commands<\/strong> on a remote server via SSH from within WordPress.<\/li>\n<li>A single security breach \u2014 XSS exploit, stolen admin session, or compromised administrator account \u2014 could result in full server takeover.<\/li>\n<li><strong>Do NOT use in production without all of the following<\/strong>:\n\n<ul>\n<li>HTTPS enforced site-wide<\/li>\n<li>Two-factor authentication on all administrator accounts<\/li>\n<li>IP restriction on the WordPress admin area<\/li>\n<li>Regular backups (files and database)<\/li>\n<\/ul><\/li>\n<li><strong>Test on a staging environment first.<\/strong><\/li>\n<\/ul>\n\n<h3>Future Plans<\/h3>\n\n<ul>\n<li>Playbook editor: create and edit <code>main.yml<\/code> files directly from the WordPress UI without needing to push to GitHub.<\/li>\n<li>Multi-server support: manage multiple remote servers from a single dashboard, switchable via a server selector.<\/li>\n<li>SFTP file browser: browse and edit remote files from the dashboard without requiring a separate SSH key configuration.<\/li>\n<li>WP-CLI integration: run WP-CLI commands on the remote WordPress installation from the dashboard.<\/li>\n<\/ul>\n\n<h3>Contact<\/h3>\n\n<p>For contributions or issues, contact Tlloancy at [tlloancy@deter-mi.net].<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/package-installator\/<\/code> or install it directly via the WordPress plugin screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Navigate to <strong>WP DevOps Dashboard &gt; SSH Settings<\/strong> and configure your SSH credentials (host, port, username, and either a private key or password).<\/li>\n<li>Use the <strong>Test Connection<\/strong> button to verify SSH access.<\/li>\n<li>Optionally, replace the default playbook repository URL with the URL of your own fork.<\/li>\n<\/ol>\n\n<h3>File Permissions (if installing manually)<\/h3>\n\n<pre><code>`bash\n<\/code><\/pre>\n\n<p>sudo chown -R www-data:www-data \/var\/www\/html\/wordpress\/wp-content\/plugins\/package-installator\nsudo chmod -R 755 \/var\/www\/html\/wordpress\/wp-content\/plugins\/package-installator\n    `<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20linux%20distributions%20are%20supported%3F\"><h3>Which Linux distributions are supported?<\/h3><\/dt>\n<dd><p>Debian, Ubuntu, Red Hat, CentOS, Fedora, Arch Linux, and SUSE are all supported. The plugin detects the distribution and selects the correct package manager (<code>apt<\/code>, <code>yum<\/code>, <code>dnf<\/code>, <code>pacman<\/code>, or <code>zypper<\/code>) automatically.<\/p><\/dd>\n<dt id=\"how%20do%20i%20use%20my%20own%20playbook%20catalog%3F\"><h3>How do I use my own playbook catalog?<\/h3><\/dt>\n<dd><p>Fork the <a href=\"https:\/\/github.com\/elestranobaron\/wp-package-installator-playbooks\">Official Playbook Repository<\/a> and read its README for the full catalog format specification. Then go to <strong>WP DevOps Dashboard &gt; SSH Settings<\/strong>, paste your fork's <code>.git<\/code> URL into the <strong>GitHub Repository URL<\/strong> field, and save. The plugin will clone your fork to the remote server and display your custom playbooks.<\/p><\/dd>\n<dt id=\"does%20ansible%20need%20to%20be%20installed%20on%20the%20wordpress%20server%3F\"><h3>Does Ansible need to be installed on the WordPress server?<\/h3><\/dt>\n<dd><p>No. Ansible runs on the <strong>remote server<\/strong> (the one you connect to via SSH), not on the server hosting WordPress. The WordPress server only needs PHP 8.2+ and outbound SSH access.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20to%20use%20in%20production%3F\"><h3>Is it safe to use in production?<\/h3><\/dt>\n<dd><p>Read the security warnings section below carefully before deploying in any environment. The plugin executes privileged commands on a remote server. A compromised WordPress admin account means full server access. Follow all hardening steps and test on a staging environment first.<\/p><\/dd>\n<dt id=\"what%20if%20a%20package%20is%20already%20installed%3F\"><h3>What if a package is already installed?<\/h3><\/dt>\n<dd><p>The plugin queries the package manager for current status before taking any action. Already-installed packages are shown with a 100% progress indicator and an \"Installed\" status badge.<\/p><\/dd>\n<dt id=\"can%20i%20add%20packages%20beyond%20the%20default%20php%20extension%20list%3F\"><h3>Can I add packages beyond the default PHP extension list?<\/h3><\/dt>\n<dd><p>Yes. Edit the <code>$php_packages<\/code> array in <code>includes\/ajax-handlers.php<\/code> to add any system package available in your distribution's repositories.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h3>2.2.0 \u2014 May 28, 2026 \u2014 15:30 UTC+2<\/h3>\n\n<ul>\n<li>Plugin display name changed to \"WP DevOps Dashboard\". The WP.org slug (<code>package-installator<\/code>) is permanent and unchanged \u2014 only the visible name in the admin menu and plugin list is updated.<\/li>\n<li>SSH Settings page no longer blocks on load. The page previously made a live SSH connection before sending any HTML to the browser, causing a 5\u20137 second delay. The connection test is now async: the page renders instantly and tests the connection in the background after load.<\/li>\n<li>New: animated \"Test Connection\" button on the SSH Settings page with live status badge (green glow on success, red on failure). No page reload required.<\/li>\n<li>SSH Settings page redesigned: card-based layout with separate sections for SSH Credentials and Automation Catalog, consistent with the main dashboard aesthetic.<\/li>\n<li>Performance: the package status query (20 SSH checks) is now lazy-loaded. It only runs when the user opens the package accordion, not on every background poll. The 35-second polling cycle now only fetches server stats, Docker containers, and Ansible catalog.<\/li>\n<li>Performance: <code>wpkginst_get_automation_readiness()<\/code> (Ansible, Docker Compose, Git detection) result is now cached in a WordPress transient for 2 minutes. Subsequent dashboard loads within that window are instant. The cache is invalidated automatically when a tool is installed via the FIX button.<\/li>\n<li>The script and style enqueue function is now split: the settings page only loads CSS; the React app and all SSH readiness calls are restricted to the main dashboard page.<\/li>\n<li>Full English UI: all user-visible French strings in the React interface replaced with English (status labels, button text, placeholders, empty states, console messages).<\/li>\n<li>Dashboard polling reduced from 5 sequential SSH connections to 1. Stats, Docker container list, and Ansible catalog are now fetched in a single SSH exec via a sectioned mega-command. The automation catalog no longer performs a <code>git fetch<\/code> on every poll \u2014 git sync only happens when the user explicitly clicks \"Sync Ansible Catalog\".<\/li>\n<li>Removed the redundant <code>whoami<\/code> SSH call on each REST poll; SSH connection status is now derived from the stats command result.<\/li>\n<li>SSH status indicator shows a distinct yellow pulsing state with an explicit \"Establishing SSH connection\u2026\" message during the initial load.<\/li>\n<\/ul>\n\n<h3>2.1.2 \u2014 April 2026<\/h3>\n\n<ul>\n<li>Arch Linux and SUSE are now supported, bringing distribution coverage to approximately 99% of common Linux server environments.<\/li>\n<li>Package installation now uses <code>nohup<\/code> for background execution, consistent with the rest of the plugin.<\/li>\n<\/ul>\n\n<h3>2.1.0 \u2014 April 2026<\/h3>\n\n<ul>\n<li>SSH \"One-Shot\" Engine: system metrics (CPU, RAM, disk, distro detection) are now collected in a single SSH session instead of multiple separate connections \u2014 significant performance improvement and reduced load on the remote server.<\/li>\n<li>REST API migration: replaced fragmented AJAX polling with a single centralized REST route (<code>\/wp-json\/wpkginst\/v1\/full-status<\/code>), reducing HTTP requests by approximately 80%.<\/li>\n<li>Double-nonce architecture: hybrid token system to isolate data read flows (REST) from privileged system actions (AJAX).<\/li>\n<li>Strengthened <code>permission_callback<\/code> enforcement on all REST and AJAX endpoints.<\/li>\n<li>React lifecycle refactor: simultaneous update of all UI components (Docker, Packages, Stats) for a latency-free experience, with removal of redundant <code>useEffect<\/code> calls.<\/li>\n<li>Improved error feedback on API connection loss or SSH authentication failure.<\/li>\n<\/ul>\n\n<h3>2.0.0 \u2014 April 2026<\/h3>\n\n<ul>\n<li>Major milestone: transition from a simple package manager to a full DevOps orchestrator.<\/li>\n<li>New: Ansible core \u2014 run playbooks directly from the WordPress dashboard.<\/li>\n<li>New: Forkable automation catalog \u2014 point the plugin at any GitHub repository following the <code>manifest.json<\/code> spec.<\/li>\n<li>New: Background processing \u2014 long-running tasks execute via <code>nohup<\/code> over SSH.<\/li>\n<li>New: Real-time streaming \u2014 live log output for Ansible playbooks and package installations.<\/li>\n<li>Security hardening: stricter nonce validation and path sanitization throughout.<\/li>\n<li>Full rewrite of AJAX polling logic to handle high-concurrency background tasks.<\/li>\n<\/ul>\n\n<h3>1.4.0<\/h3>\n\n<ul>\n<li>New: Cockpit dashboard with real-time system resource monitoring (CPU, RAM, disk).<\/li>\n<\/ul>\n\n<h3>1.3.0 \u2014 April 2026<\/h3>\n\n<ul>\n<li>Security audit and refactoring co-authored with Gemini (Google AI).<\/li>\n<li>Hardened SQL queries and input sanitization.<\/li>\n<li>Docker integration: list, start, stop, and restart containers via SSH.<\/li>\n<\/ul>\n\n<h3>1.2.1 \u2014 March 2026<\/h3>\n\n<ul>\n<li>PHP session is now opened only on the Terminal and Log pages via a conditional check in the <code>admin_init<\/code> hook.<\/li>\n<li><code>session_write_close()<\/code> called systematically after every session usage.<\/li>\n<li>Terminal authentication persists correctly across page refreshes without blocking REST API or loopback requests.<\/li>\n<li>Fixed \"Access denied \u2014 Session expired\" error when running commands after a page refresh.<\/li>\n<li>Removed global session lock that caused Site Health failures (active PHP session + REST API timeout).<\/li>\n<\/ul>\n\n<h3>1.2.0 \u2014 March 2026<\/h3>\n\n<ul>\n<li>Complete overhaul of PHP session management to resolve Site Health warnings (REST API timeout and active session detection).<\/li>\n<\/ul>\n\n<h3>1.1.0 \u2014 December 2025<\/h3>\n\n<ul>\n<li>Full internationalization (i18n) support with French and English translations.<\/li>\n<li>Command history logging with dedicated database table.<\/li>\n<li>Non-interactive root command executor (SSH Terminal page).<\/li>\n<li>Improved session handling and security hardening.<\/li>\n<li>WordPress 6.9 compatibility.<\/li>\n<\/ul>\n\n<h3>1.0.0<\/h3>\n\n<ul>\n<li>Initial release: React UI, SSH-based package management, support for Debian-based systems.<\/li>\n<li>Animated progress bars, expandable command output, and SSH status indicator.<\/li>\n<\/ul>","raw_excerpt":"A WordPress DevOps dashboard: manage system packages, run Ansible playbooks, control Docker containers, and monitor your server \u2014 all via SSH.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/248644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=248644"}],"author":[{"embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tlloancy"}],"wp:attachment":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=248644"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=248644"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=248644"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=248644"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=248644"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=248644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}