<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
# -*- coding: utf-8 -*-

# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT

"""
Shared constants and helpers for clos_ssa.ini file management.
"""

import pwd
import re


INI_FILE_NAME = 'clos_ssa.ini'

# Base user locations for clos_ssa.ini files
INI_USER_LOCATIONS_BASE = (
    dict(path='/var/cagefs/*/*/etc/cl.php.d/alt-php[0-9][0-9]',
         user=lambda path: pwd.getpwnam(path.split('/')[4])),
)

# Per-website locations used when website isolation is enabled
INI_USER_LOCATIONS_WEBSITE_ISOLATION = (
    dict(path='/var/cagefs/*/*/etc/cl.php.d/*/alt-php[0-9][0-9]',
         user=lambda path: pwd.getpwnam(path.split('/')[4])),
)

# Directories to exclude
EXCLUDE_DIR_PATHS = (
    'php44', 'php51', 'php52', 'php53', r'php\d+-imunify', 'php-internal'
)


def is_excluded_path(dir_path: str) -> bool:
    """Check if given path is in exclude list."""
    for pattern in EXCLUDE_DIR_PATHS:
        if re.search(pattern, dir_path):
            return True
    return False


def extract_php_version(path: str) -> str:
    """Extract PHP version number from path (e.g., 'alt-php80' -> '80')."""
    match = re.search(r'php(\d{2})', path)
    return match.group(1) if match else None
