삽질하다 도저히 문제 파악이 안돼서 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";
|
||||
}
|
||||
}
|
||||
@@ -1,27 +1,58 @@
|
||||
using OpcPks.Core.Services;
|
||||
using OpcPks.Core.Models;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
// -----------------------------------------------------------
|
||||
// 1. 공통 경로 설정
|
||||
// -----------------------------------------------------------
|
||||
string baseDataPath = "/home/pacer/projects/OpcPksPlatform/OpcPks.Core/Data";
|
||||
|
||||
// -----------------------------------------------------------
|
||||
// 2. 서비스 등록 (Dependency Injection)
|
||||
// -----------------------------------------------------------
|
||||
builder.Services.AddControllersWithViews();
|
||||
|
||||
// [수정] OpcSessionManager를 먼저 등록해야 Generator에서 가져다 쓸 수 있습니다.
|
||||
builder.Services.AddSingleton<OpcSessionManager>();
|
||||
|
||||
// [수정] 팩토리 메서드를 사용하여 OpcSessionManager를 주입(Injection)합니다.
|
||||
builder.Services.AddSingleton<CertificateGenerator>(sp =>
|
||||
{
|
||||
var sessionManager = sp.GetRequiredService<OpcSessionManager>();
|
||||
return new CertificateGenerator(baseDataPath, sessionManager);
|
||||
});
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
// -----------------------------------------------------------
|
||||
// 3. 실행 환경 설정
|
||||
// -----------------------------------------------------------
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Home/Error");
|
||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||
app.UseHsts();
|
||||
}
|
||||
|
||||
//app.UseHttpsRedirection();
|
||||
// -----------------------------------------------------------
|
||||
// 4. 미들웨어 및 라우팅 설정
|
||||
// -----------------------------------------------------------
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
// 컨트롤러 루트 매핑
|
||||
app.MapControllerRoute(
|
||||
name: "default",
|
||||
pattern: "{controller=Home}/{action=Index}/{id?}");
|
||||
|
||||
app.Run();
|
||||
// [이미지: ASP.NET Core Dependency Injection Container flow]
|
||||
|
||||
|
||||
// -----------------------------------------------------------
|
||||
// 5. 서버 가동
|
||||
// -----------------------------------------------------------
|
||||
Console.WriteLine("🚀 OpcPksPlatform 서버 대기 중... (http://0.0.0.0:5000)");
|
||||
Console.WriteLine("💡 사용자가 '인증서 생성' 버튼을 누를 때까지 대기합니다.");
|
||||
|
||||
app.Run();
|
||||
@@ -1,89 +1,117 @@
|
||||
@model OpcPks.Core.Models.CertRequestModel
|
||||
|
||||
<div class="container mt-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4>🛡️ 하니웰 Experion 전용 인증서 생성기</h4>
|
||||
<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">
|
||||
<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 class="form-label fw-bold">시스템 구성</label>
|
||||
<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 class="form-label fw-bold">어플리케이션 이름</label>
|
||||
<input asp-for="ApplicationName" class="form-control" placeholder="OpcPksClient" />
|
||||
<label asp-for="ApplicationName" class="form-label fw-bold">어플리케이션 이름</label>
|
||||
<input asp-for="ApplicationName" class="form-control" readonly value="OpcPksClient" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<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>
|
||||
|
||||
<h5 class="text-secondary"><span class="badge bg-info">Primary</span> 서버 정보</h5>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">Host Name</label>
|
||||
<input asp-for="PrimaryHostName" class="form-control" placeholder="예: HONPKS" />
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label text-warning">IP Address (Yellow)</label>
|
||||
<input asp-for="PrimaryIpA" class="form-control" placeholder="192.168.0.20" />
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label text-success">IP Address (Green)</label>
|
||||
<input asp-for="PrimaryIpB" class="form-control" placeholder="192.168.1.20" />
|
||||
<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>
|
||||
|
||||
<h5 class="text-secondary mt-4"><span class="badge bg-secondary" id="secondaryBadge">Secondary</span> 서버 정보</h5>
|
||||
<div class="row mb-3" id="secondaryFields">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">Host Name</label>
|
||||
<input asp-for="SecondaryHostName" class="form-control sec-input" placeholder="예: HONPKS" />
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label text-warning">IP Address (Yellow)</label>
|
||||
<input asp-for="SecondaryIpA" class="form-control sec-input" placeholder="192.168.0.21" />
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label text-success">IP Address (Green)</label>
|
||||
<input asp-for="SecondaryIpB" class="form-control sec-input" placeholder="192.168.1.21" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card bg-light border-warning mt-5">
|
||||
<div class="card-body">
|
||||
@if (ViewBag.IsCertExists == true)
|
||||
{
|
||||
<div class="alert alert-warning d-flex align-items-center">
|
||||
<span class="fs-4 me-3">⚠️</span>
|
||||
<div>
|
||||
<strong>기존 인증서가 이미 존재합니다!</strong><br />
|
||||
새로 생성 시 기존 서버와의 통신 신뢰관계(Trust)가 깨질 수 있습니다.
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="form-check mb-3">
|
||||
<input class="form-check-input" type="checkbox" id="chkUnlock" onchange="toggleCertBtn()">
|
||||
<label class="form-check-label text-danger fw-bold" for="chkUnlock">
|
||||
[위험 인지] 기존 인증서를 무시하고 새로 생성하는 것에 동의합니다.
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<button type="submit" id="btnGenerate" class="btn btn-danger btn-lg w-100" disabled>
|
||||
🔒 인증서가 이미 존재하여 잠겨있습니다
|
||||
</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button type="submit" id="btnGenerate" class="btn btn-primary btn-lg w-100">
|
||||
🚀 인증서 생성 및 자동 적용 시작
|
||||
</button>
|
||||
}
|
||||
<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>
|
||||
@@ -92,37 +120,48 @@
|
||||
</div>
|
||||
|
||||
@section Scripts {
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
// 1. 이중화 선택 로직
|
||||
$('#systemType').change(function () {
|
||||
const isRedundant = $(this).val() === 'true';
|
||||
$('.sec-input').prop('disabled', !isRedundant);
|
||||
|
||||
if(isRedundant) {
|
||||
$('#secondaryBadge').removeClass('bg-secondary').addClass('bg-info');
|
||||
$('#secondaryContainer').removeClass('bg-light').addClass('bg-white');
|
||||
$('#secondaryTitle').removeClass('text-secondary').addClass('text-primary');
|
||||
} else {
|
||||
$('#secondaryBadge').removeClass('bg-info').addClass('bg-secondary');
|
||||
$('#secondaryContainer').addClass('bg-light').removeClass('bg-white');
|
||||
$('#secondaryTitle').addClass('text-secondary').removeClass('text-primary');
|
||||
}
|
||||
});
|
||||
|
||||
$('#systemType').trigger('change');
|
||||
}).trigger('change');
|
||||
});
|
||||
|
||||
// 2. 버튼 잠금 해제 로직
|
||||
function toggleCertBtn() {
|
||||
const isChecked = document.getElementById('chkUnlock').checked;
|
||||
const btn = document.getElementById('btnGenerate');
|
||||
|
||||
const isChecked = $('#chkUnlock').is(':checked');
|
||||
const btn = $('#btnGenerate');
|
||||
if(isChecked) {
|
||||
btn.disabled = false;
|
||||
btn.innerText = "🔥 인증서 새로 생성 (강제 실행)";
|
||||
btn.classList.replace('btn-danger', 'btn-warning');
|
||||
btn.prop('disabled', false).html('<i class="bi bi-arrow-repeat"></i> 인증서 갱신 및 전송 실행').removeClass('btn-secondary').addClass('btn-info text-white');
|
||||
} else {
|
||||
btn.disabled = true;
|
||||
btn.innerText = "🔒 인증서가 이미 존재하여 잠겨있습니다";
|
||||
btn.classList.replace('btn-warning', 'btn-danger');
|
||||
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>
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -13,10 +13,10 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("OpcPks.Web")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4e006a5a5f65f597fafaa3777b8a1073944eada2")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4ea351946aa5ffb76c8c693b768cb7f460f0cb79")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("OpcPks.Web")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("OpcPks.Web")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
e1494e87c92c732759b5281464380da6aa825fc12aba342324181898b9f0d33d
|
||||
b82f0dd43a91c4b442cef90caf9521112866289d267678a4f9dd1c8eb3205e82
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
da88b9ec6f30d3a67ed38dde28b0fbcd513cedae3a9742b74a5f06636cf1a15e
|
||||
211409f9c66f4d86deef10e146a286bf43dcff595588425d60ad90ee2a7fd32f
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
6467bb07a49b01c95068173444a1866c77670de41eed0f2a920478da9d4c65bc
|
||||
ef34cdd3c41169ab6b411993059073056d84145d36a38b4aea950172aff7d741
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -10,11 +10,11 @@
|
||||
"projectUniqueName": "/home/pacer/projects/OpcPksPlatform/OpcPks.Core/OpcPks.Core.csproj",
|
||||
"projectName": "OpcPks.Core",
|
||||
"projectPath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Core/OpcPks.Core.csproj",
|
||||
"packagesPath": "/root/.nuget/packages/",
|
||||
"packagesPath": "/home/pacer/.nuget/packages/",
|
||||
"outputPath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Core/obj/",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"/root/.nuget/NuGet/NuGet.Config"
|
||||
"/home/pacer/.nuget/NuGet/NuGet.Config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net8.0"
|
||||
@@ -73,11 +73,11 @@
|
||||
"projectUniqueName": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/OpcPks.Web.csproj",
|
||||
"projectName": "OpcPks.Web",
|
||||
"projectPath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/OpcPks.Web.csproj",
|
||||
"packagesPath": "/root/.nuget/packages/",
|
||||
"packagesPath": "/home/pacer/.nuget/packages/",
|
||||
"outputPath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/obj/",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"/root/.nuget/NuGet/NuGet.Config"
|
||||
"/home/pacer/.nuget/NuGet/NuGet.Config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net8.0"
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/root/.nuget/packages/</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/root/.nuget/packages/</NuGetPackageFolders>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/pacer/.nuget/packages/</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/pacer/.nuget/packages/</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.8.1</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="/root/.nuget/packages/" />
|
||||
<SourceRoot Include="/home/pacer/.nuget/packages/" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -574,7 +574,7 @@
|
||||
]
|
||||
},
|
||||
"packageFolders": {
|
||||
"/root/.nuget/packages/": {}
|
||||
"/home/pacer/.nuget/packages/": {}
|
||||
},
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
@@ -582,11 +582,11 @@
|
||||
"projectUniqueName": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/OpcPks.Web.csproj",
|
||||
"projectName": "OpcPks.Web",
|
||||
"projectPath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/OpcPks.Web.csproj",
|
||||
"packagesPath": "/root/.nuget/packages/",
|
||||
"packagesPath": "/home/pacer/.nuget/packages/",
|
||||
"outputPath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/obj/",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"/root/.nuget/NuGet/NuGet.Config"
|
||||
"/home/pacer/.nuget/NuGet/NuGet.Config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net8.0"
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "1ODJAJibZeCWjDB9k93/7u2tzIkxUKCpt4LpJwtoyk9SPN+V9Z00ioG5BCZSRPJv0f/i3y9/JoZYPrLxXjCawQ==",
|
||||
"dgSpecHash": "Lhk78ivUpJSYUca9AozBeOWL1MSXwG/J03crkR8ohPXr0Jr13fI6SjcPbbT0IMW8j7gHacAchV4I/6FtcYipBA==",
|
||||
"success": true,
|
||||
"projectFilePath": "/home/pacer/projects/OpcPksPlatform/OpcPks.Web/OpcPks.Web.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"/root/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/8.0.1/microsoft.extensions.dependencyinjection.abstractions.8.0.1.nupkg.sha512",
|
||||
"/root/.nuget/packages/microsoft.extensions.logging.abstractions/8.0.1/microsoft.extensions.logging.abstractions.8.0.1.nupkg.sha512",
|
||||
"/root/.nuget/packages/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg.sha512",
|
||||
"/root/.nuget/packages/npgsql/8.0.4/npgsql.8.0.4.nupkg.sha512",
|
||||
"/root/.nuget/packages/opcfoundation.netstandard.opc.ua.client/1.5.374.78/opcfoundation.netstandard.opc.ua.client.1.5.374.78.nupkg.sha512",
|
||||
"/root/.nuget/packages/opcfoundation.netstandard.opc.ua.configuration/1.5.374.78/opcfoundation.netstandard.opc.ua.configuration.1.5.374.78.nupkg.sha512",
|
||||
"/root/.nuget/packages/opcfoundation.netstandard.opc.ua.core/1.5.374.78/opcfoundation.netstandard.opc.ua.core.1.5.374.78.nupkg.sha512",
|
||||
"/root/.nuget/packages/opcfoundation.netstandard.opc.ua.security.certificates/1.5.374.78/opcfoundation.netstandard.opc.ua.security.certificates.1.5.374.78.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.formats.asn1/8.0.1/system.formats.asn1.8.0.1.nupkg.sha512",
|
||||
"/root/.nuget/packages/system.security.cryptography.cng/5.0.0/system.security.cryptography.cng.5.0.0.nupkg.sha512"
|
||||
"/home/pacer/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/8.0.1/microsoft.extensions.dependencyinjection.abstractions.8.0.1.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/microsoft.extensions.logging.abstractions/8.0.1/microsoft.extensions.logging.abstractions.8.0.1.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/npgsql/8.0.4/npgsql.8.0.4.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/opcfoundation.netstandard.opc.ua.client/1.5.374.78/opcfoundation.netstandard.opc.ua.client.1.5.374.78.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/opcfoundation.netstandard.opc.ua.configuration/1.5.374.78/opcfoundation.netstandard.opc.ua.configuration.1.5.374.78.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/opcfoundation.netstandard.opc.ua.core/1.5.374.78/opcfoundation.netstandard.opc.ua.core.1.5.374.78.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/opcfoundation.netstandard.opc.ua.security.certificates/1.5.374.78/opcfoundation.netstandard.opc.ua.security.certificates.1.5.374.78.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/system.formats.asn1/8.0.1/system.formats.asn1.8.0.1.nupkg.sha512",
|
||||
"/home/pacer/.nuget/packages/system.security.cryptography.cng/5.0.0/system.security.cryptography.cng.5.0.0.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
Reference in New Issue
Block a user