예제 #1
0
async def logs_page(request):
    """Show Nginx access.log"""
    access_logs = []

    known_user_agents = {
        "GoogleStackdriverMonitoring-UptimeChecks(https://cloud.google.com/monitoring)",
    }

    known_ips = {
        SERVER_IP,
        (request.headers.get("x-forwarded-for") or "").split(",")[0],
    }

    known_referees = set((get_env_var("KNOWN_REFEREES") or "").split(","))

    async with aiofiles.open(
        get_env_var("ACCESS_LOG"), "r", encoding="ISO-8859-1"
    ) as f:
        async for line in f:
            line = json.loads(line)
            if (
                line[2] == "GET"
                and line[4] == "200"
                and any(
                    (
                        line[1] in known_ips,
                        line[7] in known_referees,
                        line[8] in known_user_agents,
                    )
                )
            ):
                continue  # skip this

            line[0] = datetime.strptime(line[0], "%d/%b/%Y:%H:%M:%S %z")
            line[4] = int(line[4])

            access_logs.append(line)

    return await jinja.render_async(
        "access_log.html",
        request,
        logs=access_logs,
        known_ips=known_ips,
        bad_user_agents={"msnbot", "scrapbot", "Go-http-client"},
    )
예제 #2
0
async def update_requirements(repo_name: str,
                              packages: set[str] = None) -> None:
    """Update requirements for the given repository."""

    folder_name = get_env_var("REPO_PREFIX") + (repo_name.replace(
        "%20", " ").lower().replace("-", "_").replace(" ", "_").replace(
            "/", "").replace(".", ""))

    await update_requirements_txt(packages, folder_name)
    update_remote(folder_name)
예제 #3
0
async def check_black_status(site: str) -> bool:
    """Check if code is black."""
    folder = get_env_var("REPO_PREFIX") + get_process_name(site)
    proc = await asyncio.create_subprocess_shell(
        f'cd {folder} && black --check . --exclude "(migrations|alembic|node_modules)"',
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )
    _, stderr = await proc.communicate()

    return "All done!" in stderr.decode()
예제 #4
0
async def check_supervisor_status(process: str) -> str:
    """Check supervisor status of given process."""
    proc = await asyncio.create_subprocess_shell(
        get_env_var("SUPERVISOR_CMD").format(process=quote(process)),
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )
    stdout, stderr = await proc.communicate()
    if stderr:
        logger.warning("Error getting supervisor status: " + stderr.decode())

    return stdout.decode().strip()
예제 #5
0
async def get_requirements_statuses(
    title: str, ) -> dict[str, tuple[str, Optional[str], Optional[str]]]:
    folder = get_env_var("REPO_PREFIX") + get_process_name(title)

    requirements_status, requirements_dev_status = await asyncio.gather(
        *[
            get_requirements_status(folder, "requirements.txt", True),
            get_requirements_status(folder, "requirements-dev.txt", True),
        ],
        return_exceptions=True,
    )

    requirements_statuses = {}
    if requirements_status and not issubclass(type(requirements_status),
                                              Exception):
        requirements_statuses["requirements.txt"] = requirements_status
    if requirements_dev_status and not issubclass(
            type(requirements_dev_status), Exception):
        requirements_statuses["requirements-dev.txt"] = requirements_dev_status

    return requirements_statuses
예제 #6
0
파일: tests.py 프로젝트: mikekeda/admin
from sqlalchemy.ext.asyncio import create_async_engine
import pytest

# Set test DB.
if os.environ.get("ADMIN_DB_NAME") is None:
    os.environ["ADMIN_DB_NAME"] = "test_admin"

from admin.models import Base, hash_password, User
from admin.views import app
from admin.settings import get_env_var

test_username = "******"
test_password = os.urandom(16).hex()
app.config["WTF_CSRF_ENABLED"] = False
DB_URL = "postgresql+asyncpg://{}:{}@{}:5432/{}".format(
    get_env_var("DB_USER", "admin_admin"),
    get_env_var("DB_PASSWORD", "admin_admin_pasWQ27$"),
    get_env_var("DB_HOST", "127.0.0.1"),
    get_env_var("DB_NAME", "test_admin"),
)


def _test_page(url: str) -> None:
    """Test given page that should be not accessible for anonymous."""

    # Anonymous user - redirect to login page.
    request, response = app.test_client.get(url, allow_redirects=False)
    assert response.status == 302
    assert response.headers["Location"] == "/login"
    assert request.ctx.session.get("user") is None