PHP 7.4.33
Preview: container_discovery.py Size: 3.54 KB
/home/godevadmin/public_html/upload_images/home/000~ROOT~000/lib/fm-agent/library/container_discovery.py

import logging
import os.path
import sys

from agent_util import UnixHTTPConnection, json_loads

logger = logging.getLogger("Containers")


def check_access():
    if not os.path.exists("/var/run/docker.sock"):
        return "no-docker"

    try:
        conn = UnixHTTPConnection("/var/run/docker.sock")
        conn.request("GET", "/containers/json", headers={"Host": "localhost"})
        conn.getresponse()
    except Exception:
        return "no-permission"

    return "success"


def discover_docker_containers(config, plugins, existing_containers, rebuild=False):
    conn = UnixHTTPConnection("/var/run/docker.sock")
    conn.request("GET", "/containers/json?all=true", headers={"Host": "localhost"})
    r = conn.getresponse().read()
    j = json_loads(r)

    if not len(j):
        return []

    app_mapping = {}

    if config.has_section("docker_image_mapping"):
        items = config.items("docker_image_mapping")
        for app, image in items:
            app_mapping.setdefault(image, []).append(app)

    containers = []
    for container in j:
        short_id = container["Id"][:12]
        state = container["State"]

        existing_container = existing_containers.get(short_id)

        if not existing_container and state != "running":
            # Don't send stopped containers that we've never seen
            continue

        if existing_container and not rebuild:
            changed_state = existing_container["State"] != container["State"]
            existing_container.update(container)
            if changed_state:
                # Flag this container as updated
                existing_container["updated"] = True
            container = existing_container
        else:
            # Only fetch metadata for new containers
            container["container_platform"] = "docker"

            app_image = container["Image"]
            applications = []
            if app_image in app_mapping:
                applications.extend(app_mapping[app_image])
            container["applications"] = applications

            app_metadata = {}
            for app in ["docker"] + applications:
                try:
                    plugin = plugins.plugins.get(app)
                    if not plugin:
                        logger.error("Unknown/unloaded docker plugin '%s'", app)
                        continue
                    metadata = (
                        plugin.get_metadata_docker(
                            container, plugins.config.get(app, {})
                        )
                        or {}
                    )
                    logger.info(
                        "Container %s: %d textkeys for %s",
                        short_id,
                        len(metadata.keys()),
                        app,
                    )
                    plugin_label = getattr(plugin, "label", plugin.textkey)
                    app_metadata[app] = (plugin_label, metadata)
                except Exception:
                    t, e = sys.exc_info()[:2]
                    logging.exception(e)
                    continue
            container["app_metadata"] = app_metadata

        containers.append(container)

    return containers


def find_docker_container(container_id):
    conn = UnixHTTPConnection("/var/run/docker.sock")
    conn.request("GET", "/containers/json?all=true", headers={"Host": "localhost"})
    r = conn.getresponse().read()
    container_list = json_loads(r)

    for container in container_list:
        short_id = container["Id"][:12]
        if short_id == container_id:
            return container

    return None

Directory Contents

Dirs: 1 × Files: 23

Name Size Perms Modified Actions
- drwxr-xr-x 2025-06-19 05:08:01
Edit Download
107.89 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
110 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
9.19 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
14.82 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.17 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
807 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.54 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.12 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.99 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
16.17 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.97 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.96 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.25 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.62 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.34 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.32 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
11.69 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
872 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
874 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.99 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.23 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.48 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
0 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).