UNPKG

wp-host

Version:

Automated WordPress hosting deployment tool for bulk site creation with MySQL database management

172 lines • 7.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AppPasswordManager = void 0; class AppPasswordManager { constructor(config) { this.config = config; } /** * Generate application passwords for all sites */ async generateAllAppPasswords() { console.log(`\nšŸ”‘ Starting Application Password generation for ${this.config.sites.length} site(s)...`); const results = []; for (let i = 0; i < this.config.sites.length; i++) { const site = this.config.sites[i]; console.log(`\nšŸ“± [${i + 1}/${this.config.sites.length}] Generating App Password: ${site.site_name}`); try { const result = await this.generateSiteAppPassword(site); results.push(result); console.log(`āœ… ${site.site_name}: Application password generated successfully`); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error(`āŒ ${site.site_name}: App password generation failed - ${errorMessage}`); // Add a fallback result with manual instructions const siteUrl = this.generateSiteUrl(site.directory_path); results.push({ site_name: site.site_name, username: site.wordpress_admin_username || 'admin', app_password: 'MANUAL_GENERATION_REQUIRED', app_name: `${site.site_name}_automation`, site_url: siteUrl, admin_login_url: `${siteUrl}/wp-admin/` }); } } return results; } /** * Generate application password for a single site */ async generateSiteAppPassword(site) { const siteUrl = this.generateSiteUrl(site.directory_path); const username = site.wordpress_admin_username || 'admin'; const appName = `${site.site_name}_automation`; try { // Use WP-CLI to generate application password directly const appPassword = await this.createAppPasswordViaWPCLI(site.directory_path, username, appName); return { site_name: site.site_name, username, app_password: appPassword, app_name: appName, site_url: siteUrl, admin_login_url: `${siteUrl}/wp-admin/` }; } catch (error) { // Fallback: Generate a secure random password for manual setup const fallbackPassword = this.generateSecurePassword(); console.log(` āš ļø WP-CLI generation failed, using secure fallback password`); console.log(` šŸ“ Manual setup required in WordPress admin`); return { site_name: site.site_name, username, app_password: fallbackPassword, app_name: appName, site_url: siteUrl, admin_login_url: `${siteUrl}/wp-admin/` }; } } /** * Create application password via WP-CLI */ async createAppPasswordViaWPCLI(siteDirectory, username, appName) { const { exec } = require('child_process'); const { promisify } = require('util'); const execAsync = promisify(exec); try { // Use WP-CLI to create an application password const command = `cd "${siteDirectory}" && wp --allow-root user application-password create ${username} "${appName}" --porcelain`; console.log(` šŸ”§ Generating app password via WP-CLI...`); const { stdout, stderr } = await execAsync(command); if (stderr) { console.log(` āš ļø WP-CLI warnings: ${stderr}`); } const appPassword = stdout.trim(); if (appPassword && appPassword.length > 10) { console.log(` āœ… Application password generated successfully`); return appPassword; } else { throw new Error('Invalid application password returned from WP-CLI'); } } catch (error) { throw new Error(`WP-CLI application password creation failed: ${error.message}`); } } /** * Generate a secure random password for fallback */ generateSecurePassword() { // Generate a WordPress-compatible application password format const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; let password = ''; // Generate 24 character password in groups of 4 for (let i = 0; i < 24; i++) { if (i > 0 && i % 4 === 0) { password += ' '; } password += chars.charAt(Math.floor(Math.random() * chars.length)); } return password; } /** * Generate site URL based on directory path */ generateSiteUrl(targetDir) { // Extract domain from directory path if (targetDir.includes('/www/wwwroot/')) { // Remote server structure: /www/wwwroot/domain.com const sitePath = targetDir.replace('/www/wwwroot/', ''); return `https://${sitePath}`; } else if (targetDir.includes('/var/www/html/')) { // Traditional Apache structure const sitePath = targetDir.replace('/var/www/html/', ''); return `https://${sitePath}`; } else if (targetDir.includes('/var/www/')) { // Nginx structure const sitePath = targetDir.replace('/var/www/', ''); return `https://${sitePath}`; } else { // Extract domain from path if it looks like a domain const pathParts = targetDir.split('/'); const lastPart = pathParts[pathParts.length - 1]; // Check if last part looks like a domain if (lastPart.includes('.') && !lastPart.includes(' ')) { return `https://${lastPart}`; } // Local development fallback return `http://localhost:8080`; } } /** * Display application passwords summary */ displaySummary(results) { console.log('\nšŸ“± Application Passwords Summary'); console.log('================================'); results.forEach((result, index) => { console.log(`\n${index + 1}. ${result.site_name}`); console.log(` šŸ‘¤ Username: ${result.username}`); console.log(` šŸ”‘ App Password: ${result.app_password}`); console.log(` šŸ“± App Name: ${result.app_name}`); console.log(` 🌐 Site URL: ${result.site_url}`); console.log(` šŸ”§ Admin Panel: ${result.admin_login_url}`); if (result.app_password === 'MANUAL_GENERATION_REQUIRED' || result.app_password.includes(' ')) { console.log(` āš ļø Manual setup: Go to Users > Profile > Application Passwords`); } }); const successful = results.filter(r => r.app_password !== 'MANUAL_GENERATION_REQUIRED').length; const manual = results.length - successful; console.log(`\nšŸ“Š Results: ${successful} automated, ${manual} require manual setup`); } } exports.AppPasswordManager = AppPasswordManager; //# sourceMappingURL=app-password-manager.js.map