GNU/_PAGE/monitoring/upbit/OFF_daemon/OFF_daemon.php
<?php
include_once('./_common.php');
if (!defined('_GNUBOARD_')) exit;
if (!$is_admin) exit;
/**
 * 디렉토리 감시 제어 관리자 페이지 (프리미엄 에디션)
 * 경로: /home/www/GNU/_PAGE/monitoring/upbit/OFF_daemon/index.php
 */
require_once '/home/www/GNU/_PAGE/head.php';

// [설정] 감시 제어 파일이 위치한 본진 디렉토리
$DAEMON_DIR = '/home/www/DATA';
$msg = '';
$msg_type = 'info';

// 1. 접두사 변경 처리 (ON_ <-> OFF_)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['toggle_file'])) {
    $sub_path = $_POST['toggle_file']; 
    $full_path = $DAEMON_DIR . '/' . $sub_path;

    if (file_exists($full_path)) {
        $path_info = pathinfo($sub_path);
        $dirname = ($path_info['dirname'] === '.') ? '' : $path_info['dirname'] . '/';
        $filename = $path_info['basename'];

        if (strpos($filename, 'ON_') === 0) {
            $new_filename = str_replace('ON_', 'OFF_', $filename);
            $new_full_path = $DAEMON_DIR . '/' . $dirname . $new_filename;
            if (rename($full_path, $new_full_path)) {
                $msg = "<b>감시 중단</b> 설정 완료: " . htmlspecialchars($dirname . $new_filename);
                $msg_type = 'danger';
            }
        } elseif (strpos($filename, 'OFF_') === 0) {
            $new_filename = str_replace('OFF_', 'ON_', $filename);
            $new_full_path = $DAEMON_DIR . '/' . $dirname . $new_filename;
            if (rename($full_path, $new_full_path)) {
                $msg = "<b>감시 가동</b> 설정 완료: " . htmlspecialchars($dirname . $new_filename);
                $msg_type = 'success';
            }
        }
    }
}

// 2. 하위 디렉토리 재귀 스캔
$control_files = [];
if (is_dir($DAEMON_DIR)) {
    try {
        $dirIter = new RecursiveDirectoryIterator($DAEMON_DIR, FilesystemIterator::SKIP_DOTS);
        $iter = new RecursiveIteratorIterator($dirIter, RecursiveIteratorIterator::LEAVES_ONLY);

        foreach ($iter as $fileInfo) {
            $filename = $fileInfo->getFilename();
            if (strpos($filename, 'ON_') === 0 || strpos($filename, 'OFF_') === 0) {
                $control_files[] = $iter->getSubPathName();
            }
        }
    } catch (Exception $e) { $msg = "스캔 오류: " . $e->getMessage(); $msg_type = 'danger'; }
}
sort($control_files);
?>

<!-- 웹 폰트 및 아이콘 로드 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css">
<link rel="stylesheet" href="./OFF_daemon.css">

<style>

</style>

<!-- 로딩 화면 -->
<div id="page-loader"><div class="spinner"></div></div>

<div class="header-box">
    <h1 class="main-title">
        <i class="fa-solid fa-shield-halved"></i>
        UPBIT MONITORING MASTER
    </h1>
    <div>
        <i class="fa-regular fa-clock"></i> <?= date('Y-m-d H:i:s') ?>
    </div>
</div>

    
<div class="master-wrapper" id="mainContainer">


    <?php if ($msg): ?>
        <div class="alert-box alert-<?= $msg_type ?>">
            <i class="fa-solid <?= $msg_type==='success'?'fa-circle-check':'fa-circle-exclamation' ?>"></i>
            <?= $msg ?>
        </div>
    <?php endif; ?>

    <div class="table-container">
        <table class="modern-table">
            <thead>
                <tr>
                    <th width="200">STATUS</th>
                    <th>TARGET DIRECTORY & CONTROL FILE</th>
                    <th>CONTROL</th>
                </tr>
            </thead>
            <tbody>
                <?php if (empty($control_files)): ?>
                    <tr>
                        <td colspan="3">
                            <div class="empty-state">
                                <i class="fa-solid fa-folder-open"></i>
                                <p>감시 제어 파일(ON_/OFF_)을 찾을 수 없습니다.</p>
                            </div>
                        </td>
                    </tr>
                <?php else: ?>
                    <?php foreach ($control_files as $subPath): 
                        $filename = basename($subPath);
                        $dirname = dirname($subPath);
                        $is_on = (strpos($filename, 'ON_') === 0);
                        $target_name = substr($filename, 3);
                    ?>
                    <tr>
                        <td>
                            <div class="status-badge <?= $is_on ? 'badge-on' : 'badge-off' ?>">
                                <div class="pulse"></div>
                                <?= $is_on ? 'WATCHING ACTIVE' : 'WATCHING PAUSED' ?>
                            </div>
                        </td>
                        <td>
                            <span class="path-label">
                                <i class="fa-regular fa-folder-closed"></i> 
                                <?= ($dirname === '.') ? 'ROOT' : htmlspecialchars($dirname) ?>
                            </span>
                            <span class="file-name-text"><?= htmlspecialchars($filename) ?></span>
                        </td>
                        <td style="width:170px; text-align: center;">
                            <form method="post" style="margin:0;">
                                <input type="hidden" name="toggle_file" value="<?= htmlspecialchars($subPath) ?>">
                                <button type="submit" class="btn-action <?= $is_on ? 'btn-to-off' : 'btn-to-on' ?>">
                                    <i class="fa-solid <?= $is_on ? 'fa-pause' : 'fa-play' ?>"></i>
                                    <?= $is_on ? '감시 중단' : '감시 가동' ?>
                                </button>
                            </form>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                    <tr>
                        <td colspan="3" class="Help">
                            <i class="fa-regular fa-folder-closed"></i><span>디렉토리 관리</span> : 최상위 데몬 디렉토리 이하 모든 디렉토리 데몬 관리.<br>
                            <i class="fa-solid fa-play"></i> <span>디렉토리 단위 이하 데몬 관리</span> : 디렉토리 내 'OFF_디렉토리명.php' 파일이 있으면 해당 디텍토리 이하 데몬은 감시하지 않는다. (파일 내용 무관)<br>
                            <i class="fa-solid fa-pause"></i> <span>파일관리 시스템</span> : 'OFF_디렉토리명' 파일은 규칙에 따라 직접 추가 해야 하면 이후 '실행' / '중단'에 따라 파일명을 변경/관리 된다.
                        </td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
    </div>
</div>

<script>
window.addEventListener('load', function() {
    const loader = document.getElementById('page-loader');
    const container = document.getElementById('mainContainer');
    
    // 로더 제거 및 컨테이너 페이드인
    setTimeout(() => {
        loader.style.opacity = '0';
        setTimeout(() => {
            loader.style.display = 'none';
            container.classList.add('active');
        }, 500);
    }, 400);
});

// 버튼 클릭 시 로딩 효과 (피드백)
document.querySelectorAll('.btn-action').forEach(btn => {
    btn.addEventListener('click', function() {
        this.style.width = this.offsetWidth + 'px';
        this.innerHTML = '<i class="fa-solid fa-spinner fa-spin"></i> 처리중';
        this.style.opacity = '0.7';
    });
});
</script>

<?php
require_once '/home/www/GNU/_PAGE/tail.php';
?>