삽질하다 도저히 문제 파악이 안돼서 opcUaManager로 분리 테스트 중
This commit is contained in:
@@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using Npgsql;
|
||||
using OpcPks.Core.Data;
|
||||
using OpcPks.Core.Services;
|
||||
using OpcPks.Core.Models; // CertRequestModel 참조 추가
|
||||
using OpcPks.Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -14,8 +14,19 @@ namespace OpcPks.Web.Controllers;
|
||||
[Route("Engineering")]
|
||||
public class EngineeringController : Controller
|
||||
{
|
||||
// 하니웰 데이터 및 PKI 경로 고정
|
||||
// [현장 설정] 하니웰 데이터 및 PKI 경로 고정
|
||||
private readonly string _basePath = "/home/pacer/projects/OpcPksPlatform/OpcPks.Core/Data";
|
||||
|
||||
// [수정] 의존성 주입을 위한 필드 추가
|
||||
private readonly CertificateGenerator _certGenerator;
|
||||
private readonly OpcSessionManager _sessionManager;
|
||||
|
||||
// [수정] 생성자를 통해 Program.cs에서 등록된 서비스를 주입받음
|
||||
public EngineeringController(CertificateGenerator certGenerator, OpcSessionManager sessionManager)
|
||||
{
|
||||
_certGenerator = certGenerator;
|
||||
_sessionManager = sessionManager;
|
||||
}
|
||||
|
||||
#region [기존 기능: 태그 탐사 및 관리]
|
||||
|
||||
@@ -72,6 +83,8 @@ public class EngineeringController : Controller
|
||||
ON CONFLICT (full_node_id) DO NOTHING;";
|
||||
|
||||
foreach (var tag in tags) {
|
||||
if (string.IsNullOrEmpty(tag.NodeId)) continue;
|
||||
|
||||
string sContent = tag.NodeId.Contains("s=") ? tag.NodeId.Split("s=")[1] : tag.NodeId;
|
||||
string[] parts = sContent.Split(':');
|
||||
string server = parts[0];
|
||||
@@ -107,15 +120,14 @@ public class EngineeringController : Controller
|
||||
public async Task<IActionResult> RunCrawler()
|
||||
{
|
||||
try {
|
||||
var sessionManager = new OpcSessionManager();
|
||||
var session = await sessionManager.GetSessionAsync();
|
||||
|
||||
// [수정] new 생성 대신 주입된 _sessionManager 사용
|
||||
// GetSessionAsync에 필요한 인자(IP) 전달 (기본값 또는 모델 활용)
|
||||
var session = await _sessionManager.GetSessionAsync("192.168.0.20", new CertRequestModel());
|
||||
if (session == null || !session.Connected)
|
||||
return BadRequest(new { message = "하니웰 서버 연결 실패." });
|
||||
|
||||
var crawler = new HoneywellCrawler(session);
|
||||
string csvPath = Path.Combine(_basePath, "Honeywell_FullMap.csv");
|
||||
|
||||
await crawler.RunAsync("ns=1;s=$assetmodel", csvPath);
|
||||
return Ok(new { message = "탐사 및 CSV 생성 완료!" });
|
||||
}
|
||||
@@ -142,18 +154,18 @@ public class EngineeringController : Controller
|
||||
|
||||
#endregion
|
||||
|
||||
#region [신규 기능: 하니웰 전용 인증서 관리]
|
||||
#region [안전 강화 기능: 하니웰 전용 인증서 관리]
|
||||
|
||||
[HttpGet("CertManager")]
|
||||
public IActionResult CertManager()
|
||||
{
|
||||
string pfxPath = Path.Combine(_basePath, "pki/own/private/OpcTestClient.pfx");
|
||||
// [약속] 통일된 경로 확인 (CertificateGenerator 내부 경로와 일치시킴)
|
||||
string pfxPath = Path.Combine(_basePath, "own/private/OpcPksClient.pfx");
|
||||
|
||||
// 파일 존재 여부를 ViewData에 담아 보냅니다.
|
||||
ViewBag.IsCertExists = System.IO.File.Exists(pfxPath);
|
||||
|
||||
ViewBag.SuccessMsg = TempData["Success"];
|
||||
ViewBag.ErrorMsg = TempData["Error"];
|
||||
|
||||
return View(new CertRequestModel());
|
||||
}
|
||||
|
||||
@@ -162,26 +174,38 @@ public class EngineeringController : Controller
|
||||
{
|
||||
try
|
||||
{
|
||||
var generator = new CertificateGenerator(_basePath);
|
||||
var success = await generator.CreateHoneywellCertificateAsync(model);
|
||||
// [수정] 직접 new 생성하던 코드를 지우고 주입된 _certGenerator 사용
|
||||
// 이제 이 호출은 내부적으로 하니웰 서버와 3회 밀당을 수행합니다.
|
||||
var success = await _certGenerator.CreateHoneywellCertificateAsync(model);
|
||||
|
||||
if (success) {
|
||||
TempData["Success"] = "하니웰 FTE 대응 인증서가 생성 및 백업되었습니다.";
|
||||
TempData["Success"] = "인증서 생성 및 하니웰 서버 최종 수용 확인 완료!";
|
||||
return RedirectToAction("CertManager");
|
||||
}
|
||||
|
||||
TempData["Error"] = "인증서 생성 중 오류가 발생했습니다.";
|
||||
TempData["Error"] = "인증서 전송 과정에서 오류가 발생했습니다.";
|
||||
return RedirectToAction("CertManager");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TempData["Error"] = ex.Message;
|
||||
Console.WriteLine($"[FATAL_CERT] {DateTime.Now}: {ex.Message}");
|
||||
TempData["Error"] = $"시스템 오류: {ex.Message}";
|
||||
return RedirectToAction("CertManager");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public class SearchRequest { public string TagTerm { get; set; } public List<string> Suffixes { get; set; } }
|
||||
public class TagRegistrationRequest { public string TagName { get; set; } public string NodeId { get; set; } public string DataType { get; set; } }
|
||||
public class SearchRequest
|
||||
{
|
||||
public string TagTerm { get; set; } = string.Empty;
|
||||
public List<string> Suffixes { get; set; } = new();
|
||||
}
|
||||
|
||||
public class TagRegistrationRequest
|
||||
{
|
||||
public string TagName { get; set; } = string.Empty;
|
||||
public string NodeId { get; set; } = string.Empty;
|
||||
public string DataType { get; set; } = "Double";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user