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.
174 lines • 5.48 kB
TypeScript
export interface ScanOptions {
accounts?: string;
regions: string;
orgScan?: boolean;
roleArn?: string;
output?: string;
criticalOnly?: boolean;
verbose?: boolean;
}
export interface ContainerImage {
account: string;
accountName: string;
region: string;
cluster: string;
namespace: string;
workload: string;
workloadType: 'deployment' | 'statefulset' | 'daemonset' | 'pod' | 'job' | 'cronjob';
container: string;
image: string;
tag: string;
isLatest: boolean;
riskLevel: 'EMERGENCY' | 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
category: string;
ecrAlternative: string;
replicas: number;
lastScanned: string;
pullPolicy?: string;
resources?: {
requests?: {
cpu?: string;
memory?: string;
};
limits?: {
cpu?: string;
memory?: string;
};
};
isLegacyMigrated?: boolean;
daysUntilBreaking: number;
rSig: string;
emergencyMitigation?: {
temporaryFix: string;
legacyRepository: string;
chartMigrationRequired: boolean;
};
migrationPriority: 'IMMEDIATE' | 'URGENT' | 'HIGH' | 'MEDIUM' | 'LOW';
businessImpact: 'CRITICAL_SYSTEM' | 'HIGH_AVAILABILITY' | 'BUSINESS_FUNCTION' | 'DEV_TEST' | 'NON_CRITICAL';
}
export interface ScanResults {
metadata: {
scanId: string;
timestamp: string;
version: string;
totalAccounts: number;
totalClusters: number;
daysUntilDeadline: number;
broadcomDeadline: string;
scanDuration: number;
legacyMigrationDeadline: string;
catalogDeletionDeadline: string;
daysUntilLegacyMigration: number;
daysUntilCatalogDeletion: number;
emergencyMode: boolean;
};
summary: {
totalImages: number;
emergencyRisk: number;
criticalRisk: number;
highRisk: number;
mediumRisk: number;
lowRisk: number;
categorizedImages: Record<string, number>;
requiresImmediateMitigation: number;
legacyMigratedImages: number;
chartMigrationsRequired: number;
businessCriticalAffected: number;
topRiskClusters: Array<{
cluster: string;
account: string;
region: string;
bitnamiCount: number;
criticalCount: number;
emergencyCount: number;
daysUntilBreaking: number;
}>;
popularServices: {
jenkins: number;
tomcat: number;
zookeeper: number;
opensearch: number;
rabbitmq: number;
wordpress: number;
nginx: number;
redis: number;
kafka: number;
elasticsearch: number;
metricsServer: number;
mongodb: number;
mysql: number;
postgresql: number;
};
};
images: ContainerImage[];
clusters: Array<{
account: string;
region: string;
name: string;
status: string;
version?: string;
bitnamiImageCount: number;
totalImageCount: number;
}>;
errors: Array<{
account: string;
region?: string;
cluster?: string;
error: string;
timestamp: string;
errorType: 'AUTH' | 'NETWORK' | 'KUBECTL' | 'PARSING' | 'OTHER';
}>;
}
export declare class ContainerImageScanner {
results: ScanResults;
private startTime;
private bitnamiImages;
private readonly LEGACY_MIGRATION_DEADLINE;
private readonly CATALOG_DELETION_DEADLINE;
private readonly POPULAR_SERVICES;
private readonly BUSINESS_CRITICAL_SERVICES;
constructor();
isBitnamiImage(imageName: string): boolean;
assessRiskLevel(imageName: string): 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
getAwsAlternative(imageName: string): string | undefined;
isLegacyMigrated(imageName: string): boolean;
getDaysUntilBreaking(): {
legacy: number;
deletion: number;
emergency: boolean;
};
generateRSig(image: ContainerImage): string;
assessMigrationPriority(image: ContainerImage): 'IMMEDIATE' | 'URGENT' | 'HIGH' | 'MEDIUM' | 'LOW';
generateEmergencyMitigation(image: ContainerImage): {
temporaryFix: string;
legacyRepository: string;
chartMigrationRequired: boolean;
};
private extractServiceName;
searchImages(searchText: string, fields?: string[]): ContainerImage[];
filterImages(filters: {
field: string;
operator: string;
value: any;
}[]): ContainerImage[];
getClusterSummary(): any[];
startInteractiveMode(): Promise<void>;
displayResults(images?: ContainerImage[]): void;
displayClusterSummary(): void;
processScanResults(scanData: any): any;
processCluster(cluster: any): any;
private getRiskPriority;
validateAccountId(accountId: string): boolean;
validateRegion(region: string): boolean;
private initializeResults;
performScan(options: ScanOptions): Promise<void>;
discoverOrganizationAccounts(): Promise<Array<{
id: string;
name: string;
}>>;
private calculateSummary;
private saveResults;
scanAccount(accountId: string, accountName: string, regions: string[]): Promise<void>;
generateRoleSetupInstructions(_options: any): Promise<void>;
}
//# sourceMappingURL=scanner.d.ts.map