container-image-scanner
Version:
šØ EMERGENCY Bitnami Migration Scanner - Critical Timeline Aug 28/Sep 29, 2025. Enterprise scanner for 280+ Bitnami images, 118+ Helm charts with emergency migration automation to AWS alternatives.
155 lines (130 loc) ⢠5.14 kB
JavaScript
const chalk = require('chalk');
class BitnamiRealityAnalyzer {
analyzeImage(imageName) {
const [name, tag] = imageName.split(':');
const tagValue = tag || 'latest';
if (!name.includes('bitnami')) {
return { applicable: false };
}
const isLatest = tagValue === 'latest';
const isVersioned = !isLatest && /^\d+\.\d+/.test(tagValue);
return {
applicable: true,
imageName,
tag: tagValue,
isLatest,
isVersioned,
migrationRequired: isVersioned,
securityConcerns: this.assessSecurityNeeds(imageName),
recommendation: this.getRecommendation(imageName, isLatest, isVersioned)
};
}
assessSecurityNeeds(imageName) {
// Enterprise workloads typically need security features
const service = imageName.split('/')[1]?.split(':')[0];
const criticalServices = ['mysql', 'postgresql', 'mongodb', 'redis', 'elasticsearch'];
return {
needsSBOM: criticalServices.includes(service),
needsCVEReports: true,
needsSignatureVerification: criticalServices.includes(service),
complianceRequired: criticalServices.includes(service)
};
}
getRecommendation(imageName, isLatest, isVersioned) {
const service = imageName.split('/')[1]?.split(':')[0];
const awsAlternatives = {
'mysql': 'Amazon RDS for MySQL',
'postgresql': 'Amazon Aurora PostgreSQL',
'mongodb': 'Amazon DocumentDB',
'redis': 'Amazon ElastiCache for Redis',
'elasticsearch': 'Amazon OpenSearch Service'
};
if (isLatest) {
return {
priority: 'LOW',
action: 'NO ACTION NEEDED',
reason: 'Latest tag automatically transitions to Premium',
awsAlternative: awsAlternatives[service]
};
}
if (isVersioned) {
return {
priority: 'HIGH',
action: 'MIGRATION REQUIRED',
reason: 'Versioned image requires manual registry migration',
options: [
`Migrate to ${awsAlternatives[service]} (RECOMMENDED)`,
`Update to bitnamiprem registry + authentication setup`
],
awsAlternative: awsAlternatives[service]
};
}
return {
priority: 'MEDIUM',
action: 'REVIEW NEEDED',
reason: 'Unusual tag pattern'
};
}
generateReport(images) {
console.log(chalk.bold.blue('šÆ Bitnami Premium Reality Check'));
console.log(chalk.gray('Focus: Versioned Images + Security Requirements\n'));
const results = images.map(img => this.analyzeImage(img)).filter(r => r.applicable);
// Group by priority
const highPriority = results.filter(r => r.recommendation.priority === 'HIGH');
const lowPriority = results.filter(r => r.recommendation.priority === 'LOW');
if (lowPriority.length > 0) {
console.log(chalk.green.bold('ā
NO ACTION NEEDED (Latest Tags)'));
lowPriority.forEach(result => {
console.log(chalk.green(` š¦ ${result.imageName}`));
console.log(chalk.gray(` ā ${result.recommendation.reason}`));
});
console.log('');
}
if (highPriority.length > 0) {
console.log(chalk.red.bold('šØ ACTION REQUIRED (Versioned Images)'));
highPriority.forEach(result => {
console.log(chalk.red(` š¦ ${result.imageName}`));
console.log(chalk.yellow(` Priority: ${result.recommendation.priority}`));
console.log(chalk.yellow(` Issue: ${result.recommendation.reason}`));
if (result.recommendation.options) {
console.log(chalk.blue(' Options:'));
result.recommendation.options.forEach(option => {
console.log(chalk.blue(` ⢠${option}`));
});
}
// Security assessment
if (result.securityConcerns.complianceRequired) {
console.log(chalk.magenta(' Security: Enterprise compliance required'));
console.log(chalk.magenta(' ā SBOMs, CVE reports, signature verification needed'));
}
console.log('');
});
}
// Summary
console.log(chalk.bold('š Summary:'));
console.log(` Latest tags (no action): ${chalk.green(lowPriority.length)}`);
console.log(` Versioned images (action required): ${chalk.red(highPriority.length)}`);
if (highPriority.length > 0) {
console.log(chalk.yellow('\nš” Recommendation: Consider AWS managed services for versioned images'));
console.log(chalk.gray(' ā Eliminates registry migration complexity'));
console.log(chalk.gray(' ā Built-in security and compliance features'));
console.log(chalk.gray(' ā Reduced operational overhead'));
}
}
}
// Test with sample images
if (require.main === module) {
const analyzer = new BitnamiRealityAnalyzer();
const testImages = [
'bitnami/mysql:latest',
'bitnami/mysql:8.0.35',
'bitnami/postgresql:latest',
'bitnami/postgresql:15.4.0',
'bitnami/redis:7.2.4',
'bitnami/mongodb:6.0.8',
'nginx:latest'
];
analyzer.generateReport(testImages);
}
module.exports = { BitnamiRealityAnalyzer };