167 lines
9.5 KiB
Plaintext
167 lines
9.5 KiB
Plaintext
@model OpcPks.Core.Models.CertRequestModel
|
|
|
|
<div class="container mt-4">
|
|
<div class="card shadow border-0">
|
|
<div class="card-header bg-dark text-white d-flex justify-content-between align-items-center">
|
|
<h4 class="mb-0">🛡️ Honeywell Experion Certificate Manager</h4>
|
|
<span class="badge bg-success">v2.2 (Safe SMB Transfer)</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<form asp-action="GenerateCertificate" method="post" id="certForm">
|
|
|
|
<div class="card bg-light mb-4 border-info">
|
|
<div class="card-body">
|
|
<h5 class="card-title text-info"><i class="bi bi-shield-lock-fill"></i> Windows Administrator Credentials</h5>
|
|
<p class="small text-muted">인증서 파일을 하니웰 서버의 Trusted 폴더로 안전하게 전송하기 위한 관리자 권한이 필요합니다.</p>
|
|
<div class="row">
|
|
<div class="col-md-6 mb-2">
|
|
<label asp-for="AdminId" class="form-label small fw-bold">Admin ID</label>
|
|
<input asp-for="AdminId" class="form-control" placeholder="Administrator" required />
|
|
<span asp-validation-for="AdminId" class="text-danger small"></span>
|
|
</div>
|
|
<div class="col-md-6 mb-2">
|
|
<label asp-for="AdminPassword" class="form-label small fw-bold">Password</label>
|
|
<input asp-for="AdminPassword" type="password" class="form-control" placeholder="********" required />
|
|
<span asp-validation-for="AdminPassword" class="text-danger small"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6">
|
|
<label asp-for="IsRedundant" class="form-label fw-bold">시스템 구성 (FTE)</label>
|
|
<select asp-for="IsRedundant" class="form-select" id="systemType">
|
|
<option value="false">Standalone (단일 서버)</option>
|
|
<option value="true">Redundant (이중화 서버)</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label asp-for="ApplicationName" class="form-label fw-bold">어플리케이션 이름</label>
|
|
<input asp-for="ApplicationName" class="form-control" readonly value="OpcPksClient" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="p-3 border rounded bg-white shadow-sm">
|
|
<h5 class="text-primary border-bottom pb-2">Primary Server</h5>
|
|
<div class="mb-2">
|
|
<label class="small fw-bold">Host Name</label>
|
|
<input asp-for="PrimaryHostName" class="form-control form-control-sm" />
|
|
</div>
|
|
<div class="mb-2">
|
|
<label class="small text-warning fw-bold">FTE Yellow (A)</label>
|
|
<input asp-for="PrimaryIpA" class="form-control form-control-sm" placeholder="192.168.0.x" />
|
|
</div>
|
|
<div>
|
|
<label class="small text-success fw-bold">FTE Green (B)</label>
|
|
<input asp-for="PrimaryIpB" class="form-control form-control-sm" placeholder="192.168.1.x" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="p-3 border rounded bg-light shadow-sm" id="secondaryContainer">
|
|
<h5 class="text-secondary border-bottom pb-2" id="secondaryTitle">Secondary Server</h5>
|
|
<div class="mb-2">
|
|
<label class="small fw-bold">Host Name</label>
|
|
<input asp-for="SecondaryHostName" class="form-control form-control-sm sec-input" />
|
|
</div>
|
|
<div class="mb-2">
|
|
<label class="small text-warning fw-bold">FTE Yellow (A)</label>
|
|
<input asp-for="SecondaryIpA" class="form-control form-control-sm sec-input" />
|
|
</div>
|
|
<div>
|
|
<label class="small text-success fw-bold">FTE Green (B)</label>
|
|
<input asp-for="SecondaryIpB" class="form-control form-control-sm sec-input" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-4 border-primary">
|
|
<div class="card-body bg-light">
|
|
<div class="alert alert-info mb-0">
|
|
<h6 class="fw-bold"><i class="bi bi-info-circle-fill"></i> 하니웰 인증서 안전 전송 안내</h6>
|
|
<p class="small mb-2">이 작업은 하니웰 <code>HSCSERVER_Servicehost.exe</code> 프로세스를 <strong>종료하지 않습니다.</strong></p>
|
|
<ul class="small mb-0">
|
|
<li>인증서 파일(.der)만 원격 서버의 Trusted 저장소로 복사됩니다.</li>
|
|
<li>실제 적용은 추후 엔지니어가 서버를 수동으로 재시작할 때 반영됩니다.</li>
|
|
<li>현재 운영 중인 실시간 데이터 및 Station 연결에 영향을 주지 않습니다.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="mt-3">
|
|
@if (ViewBag.IsCertExists == true)
|
|
{
|
|
<div class="form-check mb-3">
|
|
<input class="form-check-input" type="checkbox" id="chkUnlock" onchange="toggleCertBtn()">
|
|
<label class="form-check-label text-primary fw-bold" for="chkUnlock">
|
|
기존 인증서 갱신 및 파일 전송에 동의합니다.
|
|
</label>
|
|
</div>
|
|
<button type="button" id="btnGenerate" class="btn btn-secondary btn-lg w-100 shadow-sm" onclick="confirmTransfer()" disabled>
|
|
<i class="bi bi-lock-fill"></i> 기존 인증서 존재 (보호됨)
|
|
</button>
|
|
}
|
|
else
|
|
{
|
|
<button type="button" id="btnGenerate" class="btn btn-primary btn-lg w-100 shadow-sm" onclick="confirmTransfer()">
|
|
<i class="bi bi-send-check-fill"></i> 인증서 생성 및 원격 전송 시작
|
|
</button>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@section Scripts {
|
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
|
<script>
|
|
$(document).ready(function () {
|
|
$('#systemType').change(function () {
|
|
const isRedundant = $(this).val() === 'true';
|
|
$('.sec-input').prop('disabled', !isRedundant);
|
|
|
|
if(isRedundant) {
|
|
$('#secondaryContainer').removeClass('bg-light').addClass('bg-white');
|
|
$('#secondaryTitle').removeClass('text-secondary').addClass('text-primary');
|
|
} else {
|
|
$('#secondaryContainer').addClass('bg-light').removeClass('bg-white');
|
|
$('#secondaryTitle').addClass('text-secondary').removeClass('text-primary');
|
|
}
|
|
}).trigger('change');
|
|
});
|
|
|
|
function toggleCertBtn() {
|
|
const isChecked = $('#chkUnlock').is(':checked');
|
|
const btn = $('#btnGenerate');
|
|
if(isChecked) {
|
|
btn.prop('disabled', false).html('<i class="bi bi-arrow-repeat"></i> 인증서 갱신 및 전송 실행').removeClass('btn-secondary').addClass('btn-info text-white');
|
|
} else {
|
|
btn.prop('disabled', true).html('<i class="bi bi-lock-fill"></i> 기존 인증서 존재 (보호됨)').removeClass('btn-info text-white').addClass('btn-secondary');
|
|
}
|
|
}
|
|
|
|
function confirmTransfer() {
|
|
Swal.fire({
|
|
title: '인증서 전송',
|
|
text: "하니웰 서버의 파일만 교체됩니다. 서비스 연결은 끊기지 않습니다. 진행하시겠습니까?",
|
|
icon: 'question',
|
|
showCancelButton: true,
|
|
confirmButtonColor: '#0d6efd',
|
|
cancelButtonColor: '#6c757d',
|
|
confirmButtonText: '네, 전송합니다',
|
|
cancelButtonText: '취소'
|
|
}).then((result) => {
|
|
if (result.isConfirmed) {
|
|
$('#certForm').submit();
|
|
}
|
|
});
|
|
}
|
|
</script>
|
|
} |