Datenmüll löschen (SQL Daten)
Dieser Commit ist enthalten in:
1
backups/backup_v2docker_20250609_050507_encrypted.sql.gz.enc
Normale Datei
1
backups/backup_v2docker_20250609_050507_encrypted.sql.gz.enc
Normale Datei
Dateidiff unterdrückt, weil mindestens eine Zeile zu lang ist
@@ -1,94 +0,0 @@
|
||||
-- Erstelle die fehlenden Resource Pool Tabellen
|
||||
-- Nur ausführen wenn die Tabellen noch nicht existieren
|
||||
|
||||
-- Resource Pool Haupttabelle
|
||||
CREATE TABLE IF NOT EXISTS resource_pools (
|
||||
id SERIAL PRIMARY KEY,
|
||||
resource_type VARCHAR(20) NOT NULL CHECK (resource_type IN ('domain', 'ipv4', 'phone')),
|
||||
resource_value VARCHAR(255) NOT NULL,
|
||||
status VARCHAR(20) DEFAULT 'available' CHECK (status IN ('available', 'allocated', 'quarantine')),
|
||||
allocated_to_license INTEGER REFERENCES licenses(id) ON DELETE SET NULL,
|
||||
status_changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
status_changed_by VARCHAR(50),
|
||||
quarantine_reason VARCHAR(100) CHECK (quarantine_reason IN ('abuse', 'defect', 'maintenance', 'blacklisted', 'expired', 'review', NULL)),
|
||||
quarantine_until TIMESTAMP WITH TIME ZONE,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
notes TEXT,
|
||||
UNIQUE(resource_type, resource_value)
|
||||
);
|
||||
|
||||
-- Historie für Resource-Aktionen
|
||||
CREATE TABLE IF NOT EXISTS resource_history (
|
||||
id SERIAL PRIMARY KEY,
|
||||
resource_id INTEGER REFERENCES resource_pools(id) ON DELETE CASCADE,
|
||||
license_id INTEGER REFERENCES licenses(id) ON DELETE SET NULL,
|
||||
action VARCHAR(50) NOT NULL CHECK (action IN ('allocated', 'deallocated', 'quarantined', 'released', 'created', 'deleted')),
|
||||
action_by VARCHAR(50) NOT NULL,
|
||||
action_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
details JSONB,
|
||||
ip_address TEXT
|
||||
);
|
||||
|
||||
-- Metriken für Resource Performance
|
||||
CREATE TABLE IF NOT EXISTS resource_metrics (
|
||||
id SERIAL PRIMARY KEY,
|
||||
resource_id INTEGER REFERENCES resource_pools(id) ON DELETE CASCADE,
|
||||
metric_date DATE NOT NULL,
|
||||
usage_count INTEGER DEFAULT 0,
|
||||
performance_score DECIMAL(5,2) DEFAULT 0.00,
|
||||
cost DECIMAL(10,2) DEFAULT 0.00,
|
||||
revenue DECIMAL(10,2) DEFAULT 0.00,
|
||||
issues_count INTEGER DEFAULT 0,
|
||||
availability_percent DECIMAL(5,2) DEFAULT 100.00,
|
||||
UNIQUE(resource_id, metric_date)
|
||||
);
|
||||
|
||||
-- Zuordnungstabelle zwischen Lizenzen und Ressourcen
|
||||
CREATE TABLE IF NOT EXISTS license_resources (
|
||||
id SERIAL PRIMARY KEY,
|
||||
license_id INTEGER REFERENCES licenses(id) ON DELETE CASCADE,
|
||||
resource_id INTEGER REFERENCES resource_pools(id) ON DELETE CASCADE,
|
||||
assigned_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
assigned_by VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
UNIQUE(license_id, resource_id)
|
||||
);
|
||||
|
||||
-- Erweiterung der licenses Tabelle um Resource-Counts
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'licenses' AND column_name = 'domain_count') THEN
|
||||
ALTER TABLE licenses
|
||||
ADD COLUMN domain_count INTEGER DEFAULT 1 CHECK (domain_count >= 0 AND domain_count <= 10),
|
||||
ADD COLUMN ipv4_count INTEGER DEFAULT 1 CHECK (ipv4_count >= 0 AND ipv4_count <= 10),
|
||||
ADD COLUMN phone_count INTEGER DEFAULT 1 CHECK (phone_count >= 0 AND phone_count <= 10);
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Indizes für Performance
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_status ON resource_pools(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_type_status ON resource_pools(resource_type, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_allocated ON resource_pools(allocated_to_license) WHERE allocated_to_license IS NOT NULL;
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_quarantine ON resource_pools(quarantine_until) WHERE status = 'quarantine';
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_history_date ON resource_history(action_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_history_resource ON resource_history(resource_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_resource_metrics_date ON resource_metrics(metric_date DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_license_resources_active ON license_resources(license_id) WHERE is_active = TRUE;
|
||||
|
||||
-- Prüfe ob Tabellen erfolgreich erstellt wurden
|
||||
DO $$
|
||||
DECLARE
|
||||
table_count INT;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO table_count
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name IN ('resource_pools', 'resource_history', 'resource_metrics', 'license_resources');
|
||||
|
||||
IF table_count = 4 THEN
|
||||
RAISE NOTICE 'Alle 4 Resource-Tabellen wurden erfolgreich erstellt!';
|
||||
ELSE
|
||||
RAISE WARNING 'Nur % von 4 Tabellen wurden erstellt!', table_count;
|
||||
END IF;
|
||||
END $$;
|
||||
@@ -1,263 +0,0 @@
|
||||
-- Migration Script für bestehende Lizenzen
|
||||
-- Setzt Default-Werte für Resource Counts
|
||||
-- Stand: 2025-06-09
|
||||
|
||||
-- ====================================
|
||||
-- Prüfe ob Migration notwendig ist
|
||||
-- ====================================
|
||||
DO $$
|
||||
DECLARE
|
||||
licenses_without_resources INT;
|
||||
total_licenses INT;
|
||||
BEGIN
|
||||
-- Zähle Lizenzen ohne Resource-Count Werte
|
||||
SELECT COUNT(*) INTO licenses_without_resources
|
||||
FROM licenses
|
||||
WHERE domain_count IS NULL
|
||||
OR ipv4_count IS NULL
|
||||
OR phone_count IS NULL;
|
||||
|
||||
SELECT COUNT(*) INTO total_licenses FROM licenses;
|
||||
|
||||
IF licenses_without_resources > 0 THEN
|
||||
RAISE NOTICE 'Migration notwendig für % von % Lizenzen', licenses_without_resources, total_licenses;
|
||||
ELSE
|
||||
RAISE NOTICE 'Keine Migration notwendig - alle Lizenzen haben bereits Resource Counts';
|
||||
RETURN;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- Setze Default Resource Counts
|
||||
-- ====================================
|
||||
|
||||
-- Vollversionen erhalten standardmäßig je 2 Ressourcen
|
||||
UPDATE licenses
|
||||
SET domain_count = COALESCE(domain_count, 2),
|
||||
ipv4_count = COALESCE(ipv4_count, 2),
|
||||
phone_count = COALESCE(phone_count, 2)
|
||||
WHERE license_type = 'full'
|
||||
AND (domain_count IS NULL OR ipv4_count IS NULL OR phone_count IS NULL);
|
||||
|
||||
-- Testversionen erhalten standardmäßig je 1 Ressource
|
||||
UPDATE licenses
|
||||
SET domain_count = COALESCE(domain_count, 1),
|
||||
ipv4_count = COALESCE(ipv4_count, 1),
|
||||
phone_count = COALESCE(phone_count, 1)
|
||||
WHERE license_type = 'test'
|
||||
AND (domain_count IS NULL OR ipv4_count IS NULL OR phone_count IS NULL);
|
||||
|
||||
-- Inaktive Lizenzen erhalten 0 Ressourcen
|
||||
UPDATE licenses
|
||||
SET domain_count = COALESCE(domain_count, 0),
|
||||
ipv4_count = COALESCE(ipv4_count, 0),
|
||||
phone_count = COALESCE(phone_count, 0)
|
||||
WHERE is_active = FALSE
|
||||
AND (domain_count IS NULL OR ipv4_count IS NULL OR phone_count IS NULL);
|
||||
|
||||
-- ====================================
|
||||
-- Erstelle Resource-Zuweisungen für bestehende aktive Lizenzen
|
||||
-- ====================================
|
||||
DO $$
|
||||
DECLARE
|
||||
license_rec RECORD;
|
||||
resource_rec RECORD;
|
||||
resources_assigned INT := 0;
|
||||
resources_needed INT;
|
||||
BEGIN
|
||||
-- Durchlaufe alle aktiven Lizenzen mit Resource Counts > 0
|
||||
FOR license_rec IN
|
||||
SELECT id, domain_count, ipv4_count, phone_count
|
||||
FROM licenses
|
||||
WHERE is_active = TRUE
|
||||
AND (domain_count > 0 OR ipv4_count > 0 OR phone_count > 0)
|
||||
ORDER BY created_at
|
||||
LOOP
|
||||
-- Domains zuweisen
|
||||
resources_needed := license_rec.domain_count;
|
||||
FOR i IN 1..resources_needed LOOP
|
||||
-- Finde eine verfügbare Domain
|
||||
SELECT id INTO resource_rec
|
||||
FROM resource_pools
|
||||
WHERE resource_type = 'domain'
|
||||
AND status = 'available'
|
||||
ORDER BY RANDOM()
|
||||
LIMIT 1;
|
||||
|
||||
IF resource_rec.id IS NOT NULL THEN
|
||||
-- Weise Resource zu
|
||||
UPDATE resource_pools
|
||||
SET status = 'allocated',
|
||||
allocated_to_license = license_rec.id,
|
||||
status_changed_at = NOW(),
|
||||
status_changed_by = 'migration'
|
||||
WHERE id = resource_rec.id;
|
||||
|
||||
-- Erstelle Zuordnung
|
||||
INSERT INTO license_resources (license_id, resource_id, assigned_by)
|
||||
VALUES (license_rec.id, resource_rec.id, 'migration');
|
||||
|
||||
-- Historie eintragen
|
||||
INSERT INTO resource_history (resource_id, license_id, action, action_by, details)
|
||||
VALUES (resource_rec.id, license_rec.id, 'allocated', 'migration',
|
||||
'{"reason": "Migration bestehender Lizenzen"}'::jsonb);
|
||||
|
||||
resources_assigned := resources_assigned + 1;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
-- IPv4-Adressen zuweisen
|
||||
resources_needed := license_rec.ipv4_count;
|
||||
FOR i IN 1..resources_needed LOOP
|
||||
SELECT id INTO resource_rec
|
||||
FROM resource_pools
|
||||
WHERE resource_type = 'ipv4'
|
||||
AND status = 'available'
|
||||
ORDER BY RANDOM()
|
||||
LIMIT 1;
|
||||
|
||||
IF resource_rec.id IS NOT NULL THEN
|
||||
UPDATE resource_pools
|
||||
SET status = 'allocated',
|
||||
allocated_to_license = license_rec.id,
|
||||
status_changed_at = NOW(),
|
||||
status_changed_by = 'migration'
|
||||
WHERE id = resource_rec.id;
|
||||
|
||||
INSERT INTO license_resources (license_id, resource_id, assigned_by)
|
||||
VALUES (license_rec.id, resource_rec.id, 'migration');
|
||||
|
||||
INSERT INTO resource_history (resource_id, license_id, action, action_by, details)
|
||||
VALUES (resource_rec.id, license_rec.id, 'allocated', 'migration',
|
||||
'{"reason": "Migration bestehender Lizenzen"}'::jsonb);
|
||||
|
||||
resources_assigned := resources_assigned + 1;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
-- Telefonnummern zuweisen
|
||||
resources_needed := license_rec.phone_count;
|
||||
FOR i IN 1..resources_needed LOOP
|
||||
SELECT id INTO resource_rec
|
||||
FROM resource_pools
|
||||
WHERE resource_type = 'phone'
|
||||
AND status = 'available'
|
||||
ORDER BY RANDOM()
|
||||
LIMIT 1;
|
||||
|
||||
IF resource_rec.id IS NOT NULL THEN
|
||||
UPDATE resource_pools
|
||||
SET status = 'allocated',
|
||||
allocated_to_license = license_rec.id,
|
||||
status_changed_at = NOW(),
|
||||
status_changed_by = 'migration'
|
||||
WHERE id = resource_rec.id;
|
||||
|
||||
INSERT INTO license_resources (license_id, resource_id, assigned_by)
|
||||
VALUES (license_rec.id, resource_rec.id, 'migration');
|
||||
|
||||
INSERT INTO resource_history (resource_id, license_id, action, action_by, details)
|
||||
VALUES (resource_rec.id, license_rec.id, 'allocated', 'migration',
|
||||
'{"reason": "Migration bestehender Lizenzen"}'::jsonb);
|
||||
|
||||
resources_assigned := resources_assigned + 1;
|
||||
END IF;
|
||||
END LOOP;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE 'Migration abgeschlossen: % Ressourcen wurden zugewiesen', resources_assigned;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- Abschlussbericht
|
||||
-- ====================================
|
||||
DO $$
|
||||
DECLARE
|
||||
v_total_licenses INT;
|
||||
v_licenses_with_resources INT;
|
||||
v_total_resources_assigned INT;
|
||||
v_domains_assigned INT;
|
||||
v_ipv4_assigned INT;
|
||||
v_phones_assigned INT;
|
||||
BEGIN
|
||||
-- Statistiken sammeln
|
||||
SELECT COUNT(*) INTO v_total_licenses FROM licenses;
|
||||
|
||||
SELECT COUNT(*) INTO v_licenses_with_resources
|
||||
FROM licenses
|
||||
WHERE id IN (SELECT DISTINCT license_id FROM license_resources WHERE is_active = TRUE);
|
||||
|
||||
SELECT COUNT(*) INTO v_total_resources_assigned
|
||||
FROM license_resources
|
||||
WHERE is_active = TRUE;
|
||||
|
||||
SELECT COUNT(*) INTO v_domains_assigned
|
||||
FROM resource_pools
|
||||
WHERE resource_type = 'domain' AND status = 'allocated';
|
||||
|
||||
SELECT COUNT(*) INTO v_ipv4_assigned
|
||||
FROM resource_pools
|
||||
WHERE resource_type = 'ipv4' AND status = 'allocated';
|
||||
|
||||
SELECT COUNT(*) INTO v_phones_assigned
|
||||
FROM resource_pools
|
||||
WHERE resource_type = 'phone' AND status = 'allocated';
|
||||
|
||||
-- Bericht ausgeben
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE '========================================';
|
||||
RAISE NOTICE 'MIGRATION ABGESCHLOSSEN';
|
||||
RAISE NOTICE '========================================';
|
||||
RAISE NOTICE 'Lizenzen gesamt: %', v_total_licenses;
|
||||
RAISE NOTICE 'Lizenzen mit Ressourcen: %', v_licenses_with_resources;
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE 'Zugewiesene Ressourcen:';
|
||||
RAISE NOTICE '- Domains: %', v_domains_assigned;
|
||||
RAISE NOTICE '- IPv4-Adressen: %', v_ipv4_assigned;
|
||||
RAISE NOTICE '- Telefonnummern: %', v_phones_assigned;
|
||||
RAISE NOTICE '- Gesamt: %', v_total_resources_assigned;
|
||||
RAISE NOTICE '========================================';
|
||||
|
||||
-- Warnungen ausgeben
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM licenses l
|
||||
WHERE l.is_active = TRUE
|
||||
AND (l.domain_count > 0 OR l.ipv4_count > 0 OR l.phone_count > 0)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM license_resources lr
|
||||
WHERE lr.license_id = l.id AND lr.is_active = TRUE
|
||||
)
|
||||
) THEN
|
||||
RAISE WARNING 'ACHTUNG: Einige aktive Lizenzen konnten keine Ressourcen erhalten (möglicherweise nicht genug verfügbar)';
|
||||
|
||||
-- Liste betroffene Lizenzen auf
|
||||
FOR v_total_licenses IN
|
||||
SELECT l.id FROM licenses l
|
||||
WHERE l.is_active = TRUE
|
||||
AND (l.domain_count > 0 OR l.ipv4_count > 0 OR l.phone_count > 0)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM license_resources lr
|
||||
WHERE lr.license_id = l.id AND lr.is_active = TRUE
|
||||
)
|
||||
LOOP
|
||||
RAISE WARNING 'Lizenz ID % hat keine Ressourcen erhalten', v_total_licenses;
|
||||
END LOOP;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- Audit Log Eintrag für Migration
|
||||
-- ====================================
|
||||
INSERT INTO audit_log (
|
||||
timestamp,
|
||||
username,
|
||||
action,
|
||||
entity_type,
|
||||
additional_info
|
||||
) VALUES (
|
||||
NOW(),
|
||||
'system',
|
||||
'MIGRATION',
|
||||
'licenses',
|
||||
'Resource Pool Migration für bestehende Lizenzen durchgeführt'
|
||||
);
|
||||
@@ -1,93 +0,0 @@
|
||||
-- Beispieldaten für v2-Docker Admin Panel
|
||||
-- Führen Sie dieses Script aus, um Testdaten zu generieren
|
||||
|
||||
-- Kunden einfügen
|
||||
INSERT INTO customers (name, email) VALUES
|
||||
('TechStart GmbH', 'info@techstart.de'),
|
||||
('Digital Solutions AG', 'kontakt@digital-solutions.ch'),
|
||||
('WebMaster Pro', 'admin@webmaster-pro.com'),
|
||||
('Social Media Experts', 'hello@social-experts.de'),
|
||||
('Marketing Genius Ltd', 'contact@marketing-genius.co.uk'),
|
||||
('StartUp Factory', 'team@startup-factory.de'),
|
||||
('Innovation Hub GmbH', 'info@innovation-hub.de'),
|
||||
('Creative Agency Berlin', 'office@creative-berlin.de'),
|
||||
('Data Analytics Corp', 'support@data-analytics.com'),
|
||||
('Cloud Services 24/7', 'info@cloud247.de'),
|
||||
('Mobile First Solutions', 'contact@mobile-first.de'),
|
||||
('AI Powered Marketing', 'hello@ai-marketing.de'),
|
||||
('Performance Media Group', 'info@performance-media.de'),
|
||||
('Growth Hacker Studio', 'team@growth-hacker.de'),
|
||||
('Digital Transformation AG', 'contact@digital-transform.ch')
|
||||
ON CONFLICT (email) DO NOTHING;
|
||||
|
||||
-- Lizenzen einfügen (verschiedene Status)
|
||||
-- Aktive Vollversionen
|
||||
INSERT INTO licenses (license_key, customer_id, license_type, valid_from, valid_until, is_active) VALUES
|
||||
('AF-202506F-A7K9-M3P2-X8R4', 1, 'full', CURRENT_DATE - INTERVAL '30 days', CURRENT_DATE + INTERVAL '335 days', true),
|
||||
('AF-202506F-B2N5-K8L3-Q9W7', 2, 'full', CURRENT_DATE - INTERVAL '60 days', CURRENT_DATE + INTERVAL '305 days', true),
|
||||
('AF-202506F-C4M8-P2R6-T5Y3', 3, 'full', CURRENT_DATE - INTERVAL '90 days', CURRENT_DATE + INTERVAL '275 days', true),
|
||||
('AF-202506F-D9L2-S7K4-U8N6', 4, 'full', CURRENT_DATE - INTERVAL '15 days', CURRENT_DATE + INTERVAL '350 days', true),
|
||||
('AF-202506F-E3P7-W5M9-V2X8', 5, 'full', CURRENT_DATE - INTERVAL '45 days', CURRENT_DATE + INTERVAL '320 days', true);
|
||||
|
||||
-- Bald ablaufende Lizenzen (innerhalb 30 Tage)
|
||||
INSERT INTO licenses (license_key, customer_id, license_type, valid_from, valid_until, is_active) VALUES
|
||||
('AF-202506F-F6K2-Y8L4-Z3N9', 6, 'full', CURRENT_DATE - INTERVAL '350 days', CURRENT_DATE + INTERVAL '15 days', true),
|
||||
('AF-202506F-G4M7-A9P3-B5R8', 7, 'full', CURRENT_DATE - INTERVAL '340 days', CURRENT_DATE + INTERVAL '25 days', true),
|
||||
('AF-202506T-H8N3-C2K6-D7L9', 8, 'test', CURRENT_DATE - INTERVAL '25 days', CURRENT_DATE + INTERVAL '5 days', true),
|
||||
('AF-202506T-J5P8-E4M2-F9N7', 9, 'test', CURRENT_DATE - INTERVAL '20 days', CURRENT_DATE + INTERVAL '10 days', true);
|
||||
|
||||
-- Abgelaufene Lizenzen
|
||||
INSERT INTO licenses (license_key, customer_id, license_type, valid_from, valid_until, is_active) VALUES
|
||||
('AF-202406F-K3L7-G8P4-H2M9', 10, 'full', CURRENT_DATE - INTERVAL '400 days', CURRENT_DATE - INTERVAL '35 days', true),
|
||||
('AF-202406F-L9N2-J5K8-M7P3', 11, 'full', CURRENT_DATE - INTERVAL '380 days', CURRENT_DATE - INTERVAL '15 days', true),
|
||||
('AF-202406T-M4K6-L3N9-P8R2', 12, 'test', CURRENT_DATE - INTERVAL '45 days', CURRENT_DATE - INTERVAL '15 days', true);
|
||||
|
||||
-- Deaktivierte Lizenzen
|
||||
INSERT INTO licenses (license_key, customer_id, license_type, valid_from, valid_until, is_active) VALUES
|
||||
('AF-202506F-N7P3-Q2L8-R5K4', 13, 'full', CURRENT_DATE - INTERVAL '120 days', CURRENT_DATE + INTERVAL '245 days', false),
|
||||
('AF-202506F-P8M5-S4N7-T9L2', 14, 'full', CURRENT_DATE - INTERVAL '180 days', CURRENT_DATE + INTERVAL '185 days', false),
|
||||
('AF-202506T-Q3K9-U7P5-V2M8', 15, 'test', CURRENT_DATE - INTERVAL '10 days', CURRENT_DATE + INTERVAL '20 days', false);
|
||||
|
||||
-- Testversionen
|
||||
INSERT INTO licenses (license_key, customer_id, license_type, valid_from, valid_until, is_active) VALUES
|
||||
('AF-202506T-R6N4-W8L2-X3P7', 1, 'test', CURRENT_DATE, CURRENT_DATE + INTERVAL '30 days', true),
|
||||
('AF-202506T-S9K7-Y5M3-Z8N2', 3, 'test', CURRENT_DATE - INTERVAL '5 days', CURRENT_DATE + INTERVAL '25 days', true),
|
||||
('AF-202506T-T4L8-A2P6-B7K3', 5, 'test', CURRENT_DATE - INTERVAL '10 days', CURRENT_DATE + INTERVAL '20 days', true);
|
||||
|
||||
-- Sessions einfügen (nur für Demonstration)
|
||||
-- Aktive Sessions
|
||||
INSERT INTO sessions (license_id, session_id, ip_address, user_agent, last_heartbeat, is_active) VALUES
|
||||
(1, 'sess_' || gen_random_uuid(), '192.168.1.100', 'Mozilla/5.0 Windows NT 10.0', CURRENT_TIMESTAMP - INTERVAL '2 minutes', true),
|
||||
(2, 'sess_' || gen_random_uuid(), '10.0.0.50', 'Mozilla/5.0 Macintosh', CURRENT_TIMESTAMP - INTERVAL '5 minutes', true),
|
||||
(3, 'sess_' || gen_random_uuid(), '172.16.0.25', 'Chrome/91.0.4472.124', CURRENT_TIMESTAMP - INTERVAL '1 minute', true),
|
||||
(4, 'sess_' || gen_random_uuid(), '192.168.2.75', 'Safari/14.1.1', CURRENT_TIMESTAMP - INTERVAL '8 minutes', true);
|
||||
|
||||
-- Inaktive Sessions (beendet)
|
||||
INSERT INTO sessions (license_id, session_id, ip_address, user_agent, started_at, last_heartbeat, ended_at, is_active) VALUES
|
||||
(5, 'sess_' || gen_random_uuid(), '10.10.10.10', 'Firefox/89.0', CURRENT_TIMESTAMP - INTERVAL '2 hours', CURRENT_TIMESTAMP - INTERVAL '1 hour', CURRENT_TIMESTAMP - INTERVAL '1 hour', false),
|
||||
(6, 'sess_' || gen_random_uuid(), '172.20.0.100', 'Edge/91.0.864.59', CURRENT_TIMESTAMP - INTERVAL '5 hours', CURRENT_TIMESTAMP - INTERVAL '3 hours', CURRENT_TIMESTAMP - INTERVAL '3 hours', false);
|
||||
|
||||
-- Audit Log Einträge
|
||||
INSERT INTO audit_log (username, action, entity_type, entity_id, new_values, ip_address, additional_info) VALUES
|
||||
('rac00n', 'CREATE', 'customer', 1, '{"name": "TechStart GmbH", "email": "info@techstart.de"}', '192.168.1.1', 'Neuer Kunde angelegt'),
|
||||
('w@rh@mm3r', 'CREATE', 'license', 1, '{"license_key": "AF-202506F-A7K9-M3P2-X8R4", "type": "full"}', '192.168.1.2', 'Vollversion erstellt'),
|
||||
('rac00n', 'UPDATE', 'license', 13, '{"is_active": false}', '192.168.1.1', 'Lizenz deaktiviert'),
|
||||
('w@rh@mm3r', 'DELETE', 'customer', 16, '{"name": "Test Kunde"}', '192.168.1.2', 'Kunde ohne Lizenzen gelöscht'),
|
||||
('rac00n', 'EXPORT', 'licenses', null, '{"format": "excel", "count": 15}', '192.168.1.1', 'Lizenzexport durchgeführt'),
|
||||
('system', 'CREATE_BATCH', 'licenses', null, '{"customer": "Digital Solutions AG", "count": 5}', '127.0.0.1', 'Batch-Lizenzen erstellt');
|
||||
|
||||
-- Login Attempts (für Security Dashboard)
|
||||
INSERT INTO login_attempts (ip_address, attempt_count, last_username_tried, last_error_message) VALUES
|
||||
('192.168.100.50', 2, 'admin', 'Falsches Passwort'),
|
||||
('10.0.0.200', 3, 'test', 'Benutzer nicht gefunden'),
|
||||
('172.16.50.100', 1, 'rac00n', 'Falsches Passwort');
|
||||
|
||||
-- Ein gesperrter Versuch
|
||||
INSERT INTO login_attempts (ip_address, attempt_count, last_username_tried, last_error_message, blocked_until) VALUES
|
||||
('192.168.200.100', 5, 'hacker', 'Zu viele Fehlversuche', CURRENT_TIMESTAMP + INTERVAL '20 hours');
|
||||
|
||||
-- Backup History
|
||||
INSERT INTO backup_history (filename, filepath, filesize, backup_type, status, created_by, tables_count, records_count, duration_seconds, is_encrypted) VALUES
|
||||
('backup_v2docker_20250608_120000_encrypted.sql.gz.enc', '/app/backups/backup_v2docker_20250608_120000_encrypted.sql.gz.enc', 1048576, 'manual', 'success', 'rac00n', 8, 150, 2.5, true),
|
||||
('backup_v2docker_20250608_030000_encrypted.sql.gz.enc', '/app/backups/backup_v2docker_20250608_030000_encrypted.sql.gz.enc', 1024000, 'scheduled', 'success', 'system', 8, 145, 2.1, true),
|
||||
('backup_v2docker_20250607_150000_encrypted.sql.gz.enc', '/app/backups/backup_v2docker_20250607_150000_encrypted.sql.gz.enc', 980000, 'manual', 'success', 'w@rh@mm3r', 8, 140, 1.9, true);
|
||||
@@ -1,321 +0,0 @@
|
||||
-- Test-Daten für Resource Pool System
|
||||
-- Generiert für AccountForger v2-Docker
|
||||
-- Stand: 2025-06-09
|
||||
|
||||
-- ====================================
|
||||
-- Test-Domains (500 Stück)
|
||||
-- ====================================
|
||||
|
||||
-- Verfügbare Domains
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, notes) VALUES
|
||||
('domain', 'example-shop-001.com', 'available', 'Premium Domain'),
|
||||
('domain', 'best-deals-online.net', 'available', 'E-Commerce Domain'),
|
||||
('domain', 'super-store-24.com', 'available', 'Shop Domain'),
|
||||
('domain', 'mega-market-place.org', 'available', 'Marketplace Domain'),
|
||||
('domain', 'discount-heaven.net', 'available', 'Discount Domain'),
|
||||
('domain', 'fashion-outlet-now.com', 'available', 'Fashion Domain'),
|
||||
('domain', 'tech-gadgets-pro.net', 'available', 'Tech Domain'),
|
||||
('domain', 'home-decor-style.com', 'available', 'Home Domain'),
|
||||
('domain', 'sports-gear-central.net', 'available', 'Sports Domain'),
|
||||
('domain', 'beauty-products-24.com', 'available', 'Beauty Domain');
|
||||
|
||||
-- Weitere Domains mit verschiedenen Patterns
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 11..400 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status)
|
||||
VALUES ('domain',
|
||||
CASE
|
||||
WHEN i % 5 = 0 THEN 'shop-' || i || '-online.com'
|
||||
WHEN i % 5 = 1 THEN 'store-' || i || '-pro.net'
|
||||
WHEN i % 5 = 2 THEN 'market-' || i || '-24.org'
|
||||
WHEN i % 5 = 3 THEN 'outlet-' || i || '-deals.com'
|
||||
ELSE 'commerce-' || i || '-now.net'
|
||||
END,
|
||||
'available');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- Einige zugeteilte Domains (50 Stück)
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 401..450 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, allocated_to_license, status_changed_at, status_changed_by)
|
||||
VALUES ('domain',
|
||||
'allocated-domain-' || i || '.com',
|
||||
'allocated',
|
||||
(i % 10) + 1, -- Zuweisung zu Lizenzen 1-10
|
||||
NOW() - INTERVAL '30 days' * RANDOM(),
|
||||
'admin');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- Domains in Quarantäne (50 Stück)
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 451..500 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, quarantine_reason, quarantine_until, notes)
|
||||
VALUES ('domain',
|
||||
'quarantine-domain-' || i || '.com',
|
||||
'quarantine',
|
||||
CASE i % 5
|
||||
WHEN 0 THEN 'abuse'
|
||||
WHEN 1 THEN 'defect'
|
||||
WHEN 2 THEN 'blacklisted'
|
||||
WHEN 3 THEN 'expired'
|
||||
ELSE 'review'
|
||||
END,
|
||||
NOW() + INTERVAL '7 days' + INTERVAL '1 day' * (i % 14),
|
||||
'Automatisch in Quarantäne versetzt');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- Test IPv4-Adressen (200 Stück)
|
||||
-- ====================================
|
||||
|
||||
-- Verfügbare IPv4-Adressen
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 1..150 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, notes)
|
||||
VALUES ('ipv4',
|
||||
'192.168.' || (i / 256 + 1)::INT || '.' || (i % 256),
|
||||
'available',
|
||||
CASE
|
||||
WHEN i % 10 = 0 THEN 'Premium IP'
|
||||
WHEN i % 20 = 0 THEN 'Dedicated Server IP'
|
||||
ELSE 'Standard IP'
|
||||
END);
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- Zugeteilte IPv4-Adressen (30 Stück)
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 151..180 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, allocated_to_license, status_changed_at, status_changed_by)
|
||||
VALUES ('ipv4',
|
||||
'10.0.' || ((i-150) / 256)::INT || '.' || ((i-150) % 256),
|
||||
'allocated',
|
||||
((i-150) % 15) + 1,
|
||||
NOW() - INTERVAL '60 days' * RANDOM(),
|
||||
'system');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- IPv4 in Quarantäne (20 Stück)
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 181..200 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, quarantine_reason, quarantine_until, notes)
|
||||
VALUES ('ipv4',
|
||||
'172.16.' || ((i-180) / 256)::INT || '.' || ((i-180) % 256),
|
||||
'quarantine',
|
||||
CASE (i-180) % 4
|
||||
WHEN 0 THEN 'blacklisted'
|
||||
WHEN 1 THEN 'abuse'
|
||||
WHEN 2 THEN 'maintenance'
|
||||
ELSE 'defect'
|
||||
END,
|
||||
NOW() + INTERVAL '3 days' + INTERVAL '1 day' * ((i-180) % 7),
|
||||
'IP wurde gemeldet oder ist in Wartung');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- Test Telefonnummern (100 Stück)
|
||||
-- ====================================
|
||||
|
||||
-- Verfügbare Telefonnummern
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 1..70 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, notes)
|
||||
VALUES ('phone',
|
||||
'+49' || (1500000000 + i),
|
||||
'available',
|
||||
CASE
|
||||
WHEN i % 5 = 0 THEN 'Premium Nummer'
|
||||
WHEN i % 10 = 0 THEN 'Vanity Nummer'
|
||||
ELSE 'Standard Nummer'
|
||||
END);
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- Zugeteilte Telefonnummern (20 Stück)
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 71..90 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, allocated_to_license, status_changed_at, status_changed_by)
|
||||
VALUES ('phone',
|
||||
'+49' || (1600000000 + i),
|
||||
'allocated',
|
||||
((i-70) % 10) + 1,
|
||||
NOW() - INTERVAL '45 days' * RANDOM(),
|
||||
'admin');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- Telefonnummern in Quarantäne (10 Stück)
|
||||
DO $$
|
||||
BEGIN
|
||||
FOR i IN 91..100 LOOP
|
||||
INSERT INTO resource_pools (resource_type, resource_value, status, quarantine_reason, quarantine_until, notes)
|
||||
VALUES ('phone',
|
||||
'+49' || (1700000000 + i),
|
||||
'quarantine',
|
||||
CASE (i-90) % 3
|
||||
WHEN 0 THEN 'expired'
|
||||
WHEN 1 THEN 'defect'
|
||||
ELSE 'review'
|
||||
END,
|
||||
NOW() + INTERVAL '5 days' + INTERVAL '1 day' * ((i-90) % 5),
|
||||
'Nummer wurde zurückgegeben oder ist defekt');
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- Resource History für einige Ressourcen
|
||||
-- ====================================
|
||||
|
||||
-- Historie für einige Domains
|
||||
INSERT INTO resource_history (resource_id, license_id, action, action_by, details, ip_address)
|
||||
SELECT
|
||||
id,
|
||||
allocated_to_license,
|
||||
'allocated',
|
||||
'system',
|
||||
'{"reason": "Neue Lizenz erstellt", "customer": "Test Customer"}'::jsonb,
|
||||
'192.168.1.100'
|
||||
FROM resource_pools
|
||||
WHERE status = 'allocated'
|
||||
AND resource_type = 'domain'
|
||||
LIMIT 10;
|
||||
|
||||
-- Historie für Quarantäne
|
||||
INSERT INTO resource_history (resource_id, action, action_by, details, ip_address)
|
||||
SELECT
|
||||
id,
|
||||
'quarantined',
|
||||
'admin',
|
||||
jsonb_build_object('reason', quarantine_reason, 'duration', '7 days'),
|
||||
'192.168.1.101'
|
||||
FROM resource_pools
|
||||
WHERE status = 'quarantine'
|
||||
LIMIT 20;
|
||||
|
||||
-- ====================================
|
||||
-- Resource Metrics für Performance-Tracking
|
||||
-- ====================================
|
||||
|
||||
-- Metriken für die letzten 30 Tage
|
||||
DO $$
|
||||
DECLARE
|
||||
resource_rec RECORD;
|
||||
days_back INT;
|
||||
BEGIN
|
||||
-- Für jede Ressource, die allocated ist
|
||||
FOR resource_rec IN
|
||||
SELECT id FROM resource_pools WHERE status = 'allocated' LIMIT 50
|
||||
LOOP
|
||||
-- Generiere Metriken für die letzten 30 Tage
|
||||
FOR days_back IN 0..29 LOOP
|
||||
INSERT INTO resource_metrics (
|
||||
resource_id,
|
||||
metric_date,
|
||||
usage_count,
|
||||
performance_score,
|
||||
cost,
|
||||
revenue,
|
||||
issues_count,
|
||||
availability_percent
|
||||
) VALUES (
|
||||
resource_rec.id,
|
||||
CURRENT_DATE - INTERVAL '1 day' * days_back,
|
||||
FLOOR(RANDOM() * 100 + 50), -- 50-150 Nutzungen
|
||||
ROUND((RANDOM() * 40 + 60)::numeric, 2), -- 60-100 Score
|
||||
ROUND((RANDOM() * 5 + 2)::numeric, 2), -- 2-7 EUR Kosten
|
||||
ROUND((RANDOM() * 20 + 10)::numeric, 2), -- 10-30 EUR Umsatz
|
||||
FLOOR(RANDOM() * 3), -- 0-2 Issues
|
||||
ROUND((RANDOM() * 5 + 95)::numeric, 2) -- 95-100% Verfügbarkeit
|
||||
) ON CONFLICT (resource_id, metric_date) DO NOTHING;
|
||||
END LOOP;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- ====================================
|
||||
-- License Resources Zuordnungen
|
||||
-- ====================================
|
||||
|
||||
-- Verbinde einige bestehende Lizenzen mit Ressourcen
|
||||
DO $$
|
||||
DECLARE
|
||||
license_rec RECORD;
|
||||
domain_id INT;
|
||||
ipv4_id INT;
|
||||
phone_id INT;
|
||||
BEGIN
|
||||
-- Für die ersten 10 aktiven Lizenzen
|
||||
FOR license_rec IN
|
||||
SELECT id FROM licenses WHERE is_active = TRUE LIMIT 10
|
||||
LOOP
|
||||
-- Hole eine verfügbare Domain
|
||||
SELECT id INTO domain_id FROM resource_pools
|
||||
WHERE resource_type = 'domain' AND status = 'available'
|
||||
ORDER BY RANDOM() LIMIT 1;
|
||||
|
||||
IF domain_id IS NOT NULL THEN
|
||||
-- Weise die Domain zu
|
||||
UPDATE resource_pools
|
||||
SET status = 'allocated',
|
||||
allocated_to_license = license_rec.id,
|
||||
status_changed_at = NOW(),
|
||||
status_changed_by = 'migration'
|
||||
WHERE id = domain_id;
|
||||
|
||||
-- Erstelle Zuordnung
|
||||
INSERT INTO license_resources (license_id, resource_id, assigned_by)
|
||||
VALUES (license_rec.id, domain_id, 'migration');
|
||||
END IF;
|
||||
|
||||
-- Wiederhole für IPv4
|
||||
SELECT id INTO ipv4_id FROM resource_pools
|
||||
WHERE resource_type = 'ipv4' AND status = 'available'
|
||||
ORDER BY RANDOM() LIMIT 1;
|
||||
|
||||
IF ipv4_id IS NOT NULL THEN
|
||||
UPDATE resource_pools
|
||||
SET status = 'allocated',
|
||||
allocated_to_license = license_rec.id,
|
||||
status_changed_at = NOW(),
|
||||
status_changed_by = 'migration'
|
||||
WHERE id = ipv4_id;
|
||||
|
||||
INSERT INTO license_resources (license_id, resource_id, assigned_by)
|
||||
VALUES (license_rec.id, ipv4_id, 'migration');
|
||||
END IF;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- Zusammenfassung ausgeben
|
||||
DO $$
|
||||
DECLARE
|
||||
domain_count INT;
|
||||
ipv4_count INT;
|
||||
phone_count INT;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO domain_count FROM resource_pools WHERE resource_type = 'domain';
|
||||
SELECT COUNT(*) INTO ipv4_count FROM resource_pools WHERE resource_type = 'ipv4';
|
||||
SELECT COUNT(*) INTO phone_count FROM resource_pools WHERE resource_type = 'phone';
|
||||
|
||||
RAISE NOTICE 'Test-Daten erfolgreich eingefügt:';
|
||||
RAISE NOTICE '- Domains: %', domain_count;
|
||||
RAISE NOTICE '- IPv4-Adressen: %', ipv4_count;
|
||||
RAISE NOTICE '- Telefonnummern: %', phone_count;
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE 'Status-Verteilung:';
|
||||
RAISE NOTICE '- Verfügbar: % Ressourcen', (SELECT COUNT(*) FROM resource_pools WHERE status = 'available');
|
||||
RAISE NOTICE '- Zugeteilt: % Ressourcen', (SELECT COUNT(*) FROM resource_pools WHERE status = 'allocated');
|
||||
RAISE NOTICE '- Quarantäne: % Ressourcen', (SELECT COUNT(*) FROM resource_pools WHERE status = 'quarantine');
|
||||
END $$;
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren