149 lines
6.9 KiB
Python
149 lines
6.9 KiB
Python
|
|
import os, json, subprocess, time, shutil
|
|
|
|
LOG = '/var/log/wevia-antiregression.log'
|
|
STATUS = '/var/www/html/api/wevia-antiregression-status.json'
|
|
fixes = []
|
|
issues = []
|
|
|
|
def lg(m):
|
|
with open(LOG,'a') as f: f.write(time.strftime('%H:%M ')+m+chr(10))
|
|
def fx(t): fixes.append(t); lg('[FIX] '+t)
|
|
|
|
# ═══ 1. HOMEPAGE REDIRECT CHECK ═══
|
|
# Homepage MUST return 200 with >10KB and NO redirect
|
|
try:
|
|
r = subprocess.run(['curl','-sk','-L','--max-redirs','3','https://weval-consulting.com/',
|
|
'-o','/dev/null','-w','%{http_code}|%{size_download}|%{url_effective}|%{num_redirects}',
|
|
'--max-time','10'], capture_output=True, text=True, timeout=15)
|
|
parts = r.stdout.strip().split('|')
|
|
code,size,url,redirs = int(parts[0]),int(parts[1]),parts[2],int(parts[3])
|
|
|
|
if code != 200 or size < 5000:
|
|
issues.append(f'Homepage: HTTP {code}, {size} bytes (expected 200, >5KB)')
|
|
if 'command-center' in url or 'login' in url:
|
|
issues.append(f'Homepage REDIRECT to {url}!')
|
|
# AUTO-FIX: remove ak_redirect from JS
|
|
f = '/var/www/html/weval-faq-fix.js'
|
|
os.system('chattr -i '+f)
|
|
c = open(f).read()
|
|
if 'ak_redirect' in c and 'REMOVED' not in c:
|
|
lines = c.split(chr(10))
|
|
new = []; skip=False
|
|
for L in lines:
|
|
if 'Fix 9' in L and 'redirect' in L.lower(): skip=True; new.append('// Fix 9: REMOVED by anti-regression'); continue
|
|
if skip and L.strip()=='})();': skip=False; continue
|
|
if skip: continue
|
|
new.append(L)
|
|
open(f,'w').write(chr(10).join(new))
|
|
fx('Removed ak_redirect JS from faq-fix.js')
|
|
os.system('chattr +i '+f)
|
|
if redirs > 0 and 'weval-consulting.com' in url:
|
|
pass # OK if final URL is still homepage
|
|
except Exception as e:
|
|
issues.append(f'Homepage check error: {e}')
|
|
|
|
# ═══ 2. CHATBOT POST HEALTH ═══
|
|
try:
|
|
r = subprocess.run(['curl','-sk','-X','POST','https://127.0.0.1/api/weval-ia-fast.php',
|
|
'-H','Host: weval-consulting.com','-H','Content-Type: application/json',
|
|
'-d',json.dumps({'message':'health check'}),
|
|
'--max-time','15'], capture_output=True, text=True, timeout=20)
|
|
d = json.loads(r.stdout)
|
|
if 'maintenance' in d.get('response','').lower():
|
|
issues.append('Chatbot POST returning maintenance (crash)')
|
|
# AUTO-FIX: remove duplicate function
|
|
fast = open('/var/www/html/api/weval-ia-fast.php').read()
|
|
wire = '/var/www/weval/wevia-ia/cognitive-wire.php'
|
|
if os.path.exists(wire) and 'function wevia_mirofish_insights' in fast and 'function wevia_mirofish_insights' in open(wire).read():
|
|
os.system('chattr -i /var/www/html/api/weval-ia-fast.php')
|
|
lines = fast.split(chr(10)); new=[]; skip=False; depth=0
|
|
for L in lines:
|
|
if not skip and 'function wevia_mirofish_insights($msg)' in L:
|
|
skip=True; depth=0; new.append('// mirofish: auto-fixed by anti-regression'); continue
|
|
if skip:
|
|
depth += L.count('{') - L.count('}')
|
|
if depth <= 0 and '}' in L: skip=False
|
|
continue
|
|
new.append(L)
|
|
open('/var/www/html/api/weval-ia-fast.php','w').write(chr(10).join(new))
|
|
# Update GOLD
|
|
gold = '/opt/wevads/vault/gold-4avr-brain/weval-ia-fast-FINAL.GOLD'
|
|
if os.path.exists(os.path.dirname(gold)):
|
|
shutil.copy('/var/www/html/api/weval-ia-fast.php', gold)
|
|
os.system('chattr +i /var/www/html/api/weval-ia-fast.php')
|
|
fx('Removed duplicate mirofish function + updated GOLD')
|
|
except Exception as e:
|
|
issues.append(f'Chatbot check error: {e}')
|
|
|
|
# ═══ 3. AUTH REDIRECT LOOP CHECK ═══
|
|
try:
|
|
js = open('/var/www/html/weval-faq-fix.js').read()
|
|
if 'window.location.replace' in js and 'ak_redirect' in js and 'REMOVED' not in js:
|
|
issues.append('ak_redirect JS still present (redirect loop risk)')
|
|
os.system('chattr -i /var/www/html/weval-faq-fix.js')
|
|
lines = js.split(chr(10)); new=[]; skip=False
|
|
for L in lines:
|
|
if 'Fix 9' in L and 'redirect' in L.lower(): skip=True; new.append('// Fix 9: REMOVED by anti-regression'); continue
|
|
if skip and L.strip()=='})();': skip=False; continue
|
|
if skip: continue
|
|
new.append(L)
|
|
open('/var/www/html/weval-faq-fix.js','w').write(chr(10).join(new))
|
|
os.system('chattr +i /var/www/html/weval-faq-fix.js')
|
|
fx('Removed ak_redirect JS redirect loop')
|
|
except Exception as e:
|
|
issues.append(f'JS check error: {e}')
|
|
|
|
# ═══ 4. NGINX SYNTAX CHECK ═══
|
|
try:
|
|
r = subprocess.run(['nginx','-t'], capture_output=True, text=True, timeout=5)
|
|
if 'successful' not in r.stderr:
|
|
issues.append(f'Nginx config error: {r.stderr[:50]}')
|
|
except: pass
|
|
|
|
# ═══ 5. PHP SYNTAX CHECK (critical files) ═══
|
|
for php in ['/var/www/html/api/weval-ia-fast.php','/var/www/html/api/wevia-action-engine.php',
|
|
'/var/www/html/api/wevia-autonomy-controller.php','/var/www/html/api/wevia-auth-agent.php']:
|
|
try:
|
|
r = subprocess.run(['php','-l',php], capture_output=True, text=True, timeout=5)
|
|
if 'No syntax errors' not in r.stdout:
|
|
issues.append(f'PHP syntax error: {os.path.basename(php)}')
|
|
except: pass
|
|
|
|
# ═══ 6. DOMAIN CHECK ═══
|
|
for d in [
|
|
'weval-consulting.com','wevads.weval-consulting.com','monitor.weval-consulting.com',
|
|
'ethica.weval-consulting.com','auth.weval-consulting.com','paperclip.weval-consulting.com',
|
|
'mirofish.weval-consulting.com','crm.weval-consulting.com','code.weval-consulting.com',
|
|
'deerflow.weval-consulting.com','mm.weval-consulting.com','n8n.weval-consulting.com',
|
|
'analytics.weval-consulting.com','consent.wevup.app','ethica.wevup.app']:
|
|
try:
|
|
r = subprocess.run(['curl','-sk','-o','/dev/null','-w','%{http_code}',f'https://{d}/',
|
|
'--max-time','5'], capture_output=True, text=True, timeout=8)
|
|
if r.stdout not in ['200','302','301']:
|
|
issues.append(f'Domain {d}: HTTP {r.stdout}')
|
|
except: pass
|
|
|
|
# ═══ SAVE ═══
|
|
status = {
|
|
'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'),
|
|
'healthy': len(issues) == 0,
|
|
'issues': issues,
|
|
'fixes': fixes,
|
|
'issues_count': len(issues),
|
|
'fixes_count': len(fixes)
|
|
}
|
|
open(STATUS,'w').write(json.dumps(status, indent=2))
|
|
|
|
# Email on issues
|
|
if issues:
|
|
body = 'WEVIA Anti-Regression - ' + time.strftime('%Y-%m-%d %H:%M') + chr(10)*2
|
|
for i in issues: body += '- ' + i + chr(10)
|
|
if fixes:
|
|
body += chr(10) + 'Auto-fixes applied:' + chr(10)
|
|
for f in fixes: body += ' + ' + f + chr(10)
|
|
os.system(f'echo "{body}" | mail -s "[WEVIA REGRESSION] {len(issues)} issues" ymahboub@weval-consulting.com 2>/dev/null')
|
|
|
|
lg(f'AntiReg: {len(issues)} issues, {len(fixes)} fixes')
|
|
print(f'AntiReg: {len(issues)} issues | {len(fixes)} fixes | {"HEALTHY" if not issues else "ISSUES"}')
|