Deployments, backups, log rotation, system updates
Database migrations, data imports, report generation
Service monitoring, connectivity tests, performance checks
Scheduled tasks, cleanup operations, notifications
Execute bash scripts directly on the server host with full system access.
#!/bin/bash echo "System uptime: $(uptime)" echo "Disk usage:" df -h | grep -E '^/dev/' echo "Memory usage:" free -h
Run Node.js scripts with full access to system resources and Node.js APIs.
const fs = require('fs'); const path = require('path'); // Read package.json and analyze dependencies const packagePath = path.join(process.cwd(), 'package.json'); const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8')); const depCount = Object.keys(packageData.dependencies || {}).length; const devDepCount = Object.keys(packageData.devDependencies || {}).length; // Output results (captured in script output) console.log(`Dependencies: ${depCount}`); console.log(`Dev Dependencies: ${devDepCount}`); console.log(`Total: ${depCount + devDepCount}`); // Output structured data as JSON for parsing const result = { dependencies: depCount, devDependencies: devDepCount, total: depCount + devDepCount, name: packageData.name, version: packageData.version }; console.log(JSON.stringify(result));
Run Node.js scripts in a secure VM2 sandbox with limited API access.
// Safe data processing in sandbox const data = [ { name: 'Alice', score: 85 }, { name: 'Bob', score: 92 }, { name: 'Charlie', score: 78 } ]; // Calculate statistics const total = data.reduce((sum, item) => sum + item.score, 0); const average = total / data.length; const topStudent = data.reduce((max, item) => item.score > max.score ? item : max ); // Output human-readable results console.log(`Average score: ${average.toFixed(2)}`); console.log(`Top student: ${topStudent.name} (${topStudent.score})`); // Output structured data as JSON for parsing const result = { average: parseFloat(average.toFixed(2)), topStudent: { name: topStudent.name, score: topStudent.score }, totalStudents: data.length, processed: new Date().toISOString() }; console.log(JSON.stringify(result));
Execute JavaScript directly in the browser for UI interactions and client-side tasks.
// UI automation and form validation const forms = document.querySelectorAll('form'); let totalForms = forms.length; // Count input fields across all forms let totalInputs = 0; forms.forEach(form => { const inputs = form.querySelectorAll('input, select, textarea'); totalInputs += inputs.length; }); // Check for required fields and validation let requiredFields = 0; let emptyRequiredFields = []; document.querySelectorAll('[required]').forEach(field => { requiredFields++; if (!field.value.trim()) { emptyRequiredFields.push({ name: field.name || field.type || 'unnamed', type: field.type, id: field.id }); field.style.borderColor = '#ef4444'; } }); console.log(`Forms found: ${totalForms}`); console.log(`Total input fields: ${totalInputs}`); console.log(`Required fields: ${requiredFields}`); console.log(`Empty required fields: ${emptyRequiredFields.length}`); // Output structured data as JSON for parsing const result = { forms: totalForms, totalInputs: totalInputs, requiredFields: requiredFields, emptyRequiredFields: emptyRequiredFields, validationPassed: emptyRequiredFields.length === 0, timestamp: new Date().toISOString() }; console.log(JSON.stringify(result));
Use Host Runner for trusted system scripts, VM2 for untrusted code, and Browser for UI tasks.
List all script definitions
Create a new script definition
Get a specific script definition
Update a script definition
Delete a script definition
Execute a script and return run ID
Get execution results and status
List all script runs (optional scriptId filter)
Server-Sent Events stream for live output
All endpoints require basic authentication with admin credentials.
const { startRun } = require('./services/scriptsRunner.service'); const ScriptDefinition = require('./models/ScriptDefinition'); // Get script definition const script = await ScriptDefinition.findById(scriptId); if (!script || !script.enabled) throw new Error('Script not found or disabled'); // Run script programmatically const runDoc = await startRun(script, { trigger: 'api', meta: { actorType: 'system', customData: '...' } }); console.log('Run ID:', runDoc._id);
// Execute script via HTTP API const response = await fetch('/api/admin/scripts/scriptId/run', { method: 'POST', headers: { 'Authorization': 'Basic ' + btoa('username:password'), 'Content-Type': 'application/json' } }); const { runId } = await response.json(); // Get results const runResult = await fetch('/api/admin/scripts/runs/' + runId); const run = await runResult.json(); console.log('Status:', run.status, 'Exit Code:', run.exitCode);
const eventSource = new EventSource('/api/admin/scripts/runs/' + runId + '/stream'); eventSource.addEventListener('log', (e) => { const data = JSON.parse(e.data); console.log('Output:', data.line); }); eventSource.addEventListener('status', (e) => { const data = JSON.parse(e.data); console.log('Status changed:', data.status); }); eventSource.addEventListener('done', (e) => { console.log('Execution completed'); eventSource.close(); });
const ScriptRun = require('./models/ScriptRun'); // Get run status and results const run = await ScriptRun.findById(runId); console.log('Status:', run.status); console.log('Exit code:', run.exitCode); console.log('Output tail:', run.outputTail); // List recent runs const recentRuns = await ScriptRun.find() .sort({ createdAt: -1 }) .limit(10) .populate('scriptId') .lean();
Scripts are used by Cron Scheduler, Health Checks, and can be integrated into any system component.