在NAS上部署.NET版本的WOL远程开机服务

在本文中,我们将以部署基于.NET的WOL远程开机服务为例,详细介绍如何利用Docker技术在群辉部署ASP.NET服务。同时,我们还将展示如何对原有的控制台WOL进行改造,以及如何使用SignAuthorization简易URL验签类库。文章相关的代码开源地址:https://github.com/sangyuxiaowu/WakeOnLan?wt.mc_id=DT-MVP-5005195

文章目录

  • 1. 背景
  • 2. 准备工作
  • 2.1 创建 WebAPI 服务
  • 2.2 迁移原有代码
  • 2.3 加入 URL 验签
  • 3. 在NAS部署
    • 3.1 Docker 镜像打包
    • 3.2 导出与导入
  • 4. 测试与使用
    • 4.1 测试
    • 4.2 部署
    • 4.3 使用
  • 5. 总结

1. 背景

在之前的文章《使用.NET实现WOL唤醒远程开机》中,我们已经成功实现了一个基于.NET的控制台程序,用于控制设备的远程唤醒功能。然而,为了实现远程控制访问,我们需要将这个控制台程序转换为WebAPI形式,并进行相应的部署。

通过本篇文章你会了解到:

  • APS.NET 项目的容器化
  • Docker 镜像的导出
  • 群辉 Docker 的使用
  • 远程网络唤醒服务的部署
  • SignAuthorization 简易URL验签类库的使用

2. 准备工作

在开始部署之前,请确保您已经拥有一台支持Docker的群辉NAS设备。当然,您也可以选择其他方式部署ASP.NET服务。

2.1 创建 WebAPI 服务

首先,我们需要创建一个WebAPI服务。在本教程中,我们将使用minAPI来实现轻量级的API,并启用Docker容器化支持。启用后,会在项目目录自动生成 `Dockerfile`` 文件。

请添加图片描述

2.2 迁移原有代码

接下来,我们需要将原有的控制台程序中的WOL唤醒功能代码迁移到新创建的WebAPI服务中。

这里我们单独写一个 WOL 的类来处理网络唤醒包数据的发送实现:

using System.Net.Sockets;
using System.Net;

namespace WakeOnLan
{
    internal class WOL
    {
        internal static void Send(string macAddress)
        {
            byte[] magicPacket = CreateMagicPacket(macAddress);
            SendMagicPacket(magicPacket);
        }

        static byte[] CreateMagicPacket(string macAddress)
        {
            byte[] macBytes = ParseMacAddress(macAddress);
            byte[] magicPacket = new byte[6 + (6 * 16)];

            for (int i = 0; i < 6; i++)
            {
                magicPacket[i] = 0xFF;
            }

            for (int i = 6; i < magicPacket.Length; i += 6)
            {
                Array.Copy(macBytes, 0, magicPacket, i, 6);
            }

            return magicPacket;
        }

        static byte[] ParseMacAddress(string macAddress)
        {
            string cleanedMacAddress = macAddress.Replace(":", "").Replace("-", "");

            if (cleanedMacAddress.Length != 12)
            {
                throw new ArgumentException("Invalid MAC address format");
            }

            byte[] macBytes = new byte[6];

            for (int i = 0; i < 6; i++)
            {
                macBytes[i] = Convert.ToByte(cleanedMacAddress.Substring(i * 2, 2), 16);
            }

            return macBytes;
        }

        static void SendMagicPacket(byte[] magicPacket)
        {
            using (UdpClient udpClient = new UdpClient())
            {
                udpClient.Connect(IPAddress.Broadcast, 9);
                udpClient.Send(magicPacket, magicPacket.Length);
            }
        }

    }
}

另外增加一个帮助类,用于 MAC 地址检查和设备是否在线的 Ping 测试:

internal class Helper
{
    internal static bool IsValidMacAddress(string macAddress)
    {
        Regex regex = new Regex("^([0-9a-fA-F]{2}[:-]?){5}([0-9a-fA-F]{2})$");
        return regex.IsMatch(macAddress);
    }

    internal static bool Ping(string iP)
    {
        // 检查IP是否在线
        Ping ping = new Ping();
        PingReply pingReply = ping.Send(iP,100);
        return pingReply.Status == IPStatus.Success;
    }
}

2.3 加入 URL 验签

为了确保WebAPI服务的访问安全,我们将加入简易且安全的SignAuthorization URL验签机制。

可以通过 Nuget 管理工具搜索或者执行直接命令安装:

Install-Package Sang.AspNetCore.SignAuthorization

请添加图片描述

安装完成后,需要在 Program.cs 进行简单的配置,从 appsettings.json 读取配置的 token 即可。

app.UseSignAuthorization(opt => {
    // 从配置文件读取 Token
    opt.sToken = app.Configuration["Token"];
});

引入 SignAuthorization 后进行简单的声明就可以让接口必须进行 URL 验签才可以访问,这里为了方便调试,只在生产环境起效,添加了 SignAuthorizeAttribute,比如下面的唤醒接口:

app.MapGet("/wol", (string mac) =>
{
    if (!Helper.IsValidMacAddress(mac))
    {
        return new CallBack(false, 400, "MAC地址格式错误");
    }
    WOL.Send(mac);
    return new CallBack(true, 200, "发送成功");
})
#if DEBUG
.WithOpenApi(operation => new(operation)
{
    Summary = "执行网络唤醒",
    Description = "通过传入MAC地址唤醒局域网内的设备"
})
#else
.WithMetadata(new SignAuthorizeAttribute())
#endif
;

最后添加一个从配置文件展示设备列表的接口,整体的迁移工作就可以完事了:

app.MapGet("/devices", () =>
{
    // 从配置文件读取设备列表
    var devices = app.Configuration.GetSection("Devices").Get<List<Device>>();
    // 判断IP是否在线
    Parallel.ForEach(devices, (device) =>
    {
        device.Online = Helper.Ping(device.IP);
    });
    return new CallBack<List<Device>>(true, 200, "获取成功", devices);
})
#if DEBUG
.WithOpenApi(operation => new(operation)
{
    Summary = "获取设备配置列表",
    Description = "获取配置的设备信息"
})
#else
.WithMetadata(new SignAuthorizeAttribute())
#endif
;

3. 在NAS部署

3.1 Docker 镜像打包

在部署前,我们需要先进行镜像制备,这里我们有两种主要方法可以选择。首先,可以在云端创建镜像,然后通过群辉的Docker管理后台通过 URL 方式添加。此外,另一种更常用的方法是在本地进行镜像制备。在这种情况下,我们同样有两种途径可供选择。

请添加图片描述

第一种方案是通过SSH登录群辉,直接执行Docker构建。为了实现这个目的,需要将项目文件拷贝到NAS上,然后在项目目录中执行相应的构建命令。这种方法的优点是可以直接在NAS上完成构建过程,从而节省了将镜像从本地上传到NAS的时间。

不过,这种方式需要在管理后台开启SSH,为了安全起见这个功能一般是不建议开启的。开开关关的折腾也挺不方便的。

一般的做法是在本地,如通过 wsl 打包 Docker 镜像(可以使用 Docker Desktop 或),然后导出镜像文件,最后通过群辉的管理后台上传镜像文件。

无论哪种方式制备镜像,我们只需要进入项目目录,执行打包命令:

docker build -t wol -f Dockerfile ..

请添加图片描述

注意: 这里的 Dockerfile 需要根据项目的情况修改默认的模板,可以查看今天推送的另一篇文章。

3.2 导出与导入

如果你没有使用 NAS 上的 Docker 进行打包,则需要导出,可以通过下面的指令:

docker save -o wol.tar wol

特别注意,这里会导出 wol:latest,不要通过查询 Image ID 的方式传参,这样导入的镜像会失去原有的 name 和 tag 。这种情况在群辉管理后台是无法显示这样的镜像的。

执行导出后,我们会得到一个 wol.tar 文件。在群辉管理后台上传即可。

请添加图片描述

4. 测试与使用

4.1 测试

如果使用 wsl 生成,我们直接启动镜像即可测试:

docker run -d -p 8080:8080 --name wol-1 wol

以上指令仅用于测试服务能否访问,无法实际使用

4.2 部署

在群辉的管理后台,我们也可以直接创建容器。需要特别注意的是,因为项目的特殊性,这里需要使用宿主机的本地网络,这样才可以发送唤醒包。

请添加图片描述

如果你有修改默认端口的需求,则需要通过修改环境变量 ASPNETCORE_HTTP_PORTS

请添加图片描述

对于设备列表的修改,则需要通过修改 appsettings.json 配置文件,这里除了在制备 Docker 镜像前修改外也可以通过进入容器内部或是在管理后台映射配置文件到 NAS 存储上。

请添加图片描述

4.3 使用

正式环境中 SignAuthorization 的配置是生效的,我们需要通过 URL 签名的方式访问服务的API。服务对外提供的是API调用,所以我们一般需要通过编程的方式来调用。签名方法可以查看 SignAuthorization 项目的介绍。同时,也可以关注后续项目增加的简易 Web 页面。

5. 总结

本文详细介绍了如何将基于.NET的WOL远程开机服务控制台程序迁移到minAPI创建的WebAPI服务中,并使用群辉的Docker技术进行部署。此外,我们还介绍了如何加入简易且安全的SignAuthorization URL验签机制,以确保远程访问的安全性。希望本文能为您提供实际操作的指导和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字&#xff1a; raster、point、PostGIS、等值线 环境准备 Postgresql版本&#xff1a;PostgreSQL 14.0, 64-bitPostGIS版本&#xff1a;POSTGIS"3.3.2"QGIS版本&#xff1a;3.28.3-Firenze&#xff08;验证用&…

Windows系统下更新后自带的画图软件出现马赛克bug

一.bug的样子&#x1f357; 在使用橡皮后&#xff0c;原来写的内容会变成马赛克。而我们希望它是纯白色的。 二.解决方法&#x1f357; 第一步 第二步 第三步 三. 解决后的效果&#x1f357; 用橡皮擦随便擦都不会出现马赛克了。 更新过后&#xff0c;想用win自带的画图软件会出…

免杀原理(php)

免杀原理 0x01 前言 何为免杀&#xff0c;免杀就是一种逃脱杀毒软件查杀的方法&#xff0c;免杀的目的就是绕过“墙”&#xff0c;去执行危险的操作。那么如何绕过这堵“墙”&#xff0c;就是免杀的本质。有句俗话说得好“知己知彼&#xff0c;百战不殆”&#xff0c;想要用好…

VM安装Centos

文章目录 第2章 VM与Linux的安装2.1 VMWare安装2.2 CentOS安装 第3章 Linux文件与目录结构3.1 Linux文件3.2 Linux目录结构 第4章 VI/VIM编辑器4.1 是什么4.2 测试数据准备4.3 一般模式4.4 编辑模式4.5 命令模式4.6 模式间转换 第5章 网络配置和系统管理操作5.1 查看网络IP和网…

sam和mobilesam的c++ dll打包

一、前言 前面我们已经成功导出分割模型和预处理模型了&#xff1a; 因此接下来就是要c推理的测试了 二、c推理

OpenCV入门11——图像的分割与修复

文章目录 图像分割的基本概念实战-分水岭法(一)实战-分水岭法(二)GrabCut基本原理实战-GrabCut主体程序的实现实战-GrabCut鼠标事件的处理实战-调用GrabCut实现图像分割meanshift图像分割视频前后景分离其它对视频前后影分离的方法图像修复 图像分割是计算机视觉中的一个重要领…

基于springboot实现智慧党建系统项目【项目源码】

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

cpp中虚实继承问题

1.一个基类base&#xff0c;被类a虚继承&#xff0c;类a被其他的类继续继承&#xff0c;那么base中的初始化必须由派生类的最后一个完成&#xff0c;其中任意一个都不能代替完成基类&#xff0c;如果在最后一个派生类里不进行这个base的初始化&#xff0c;那么就会调用相应的无…

全面探讨HTTP协议从0.9到3.0版本的发展和特点

前言&#xff1a; 最近的几场面试都问到了http的相关知识点&#xff0c;博主在此结合书籍和网上资料做下总结。本篇文章讲收录到秋招专题&#xff0c;该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮…

NetSuite 应用性能管理器(APM)

前段时间&#xff0c;我们发过一个文章谈系统健康检查。 NetSuite ERP系统健康检查-CSDN博客文章浏览阅读119次。“健康检查”本质上是属于信息化持续改善的组成部分。如果说信息化是一个持续不断的过程的话&#xff0c;那么“健康检查”就是持续不断的PDCA中的Check那一环。h…

Python实现定时任务的方案及其比较

目录 一、引言 二、基于time模块的定时任务 三、基于schedule库的定时任务 四、基于APScheduler库的定时任务 五、基于Celery库的定时任务 七、总结与比较 一、引言 在Python中&#xff0c;定时任务指的是在特定的时间间隔或者特定的时间点自动执行某些操作的任务。定时…

C语言--利用选择法对数组中的10个整数按由小到大排序

一.选择法排序介绍&#x1f357; 所谓选择法就是先将10个数中最小的数字与arr[0]交换&#xff0c;再将arr[1]-arr[9]中最小的数字与arr[1]进行交换....每一次比较&#xff0c;找出一个未经排序的数中最小的一个。总共比较9轮。 下面以5个数字为例说明选择法的步骤。 二.完整代码…

PubMedBERT:生物医学自然语言处理领域的特定预训练模型

今年大语言模型的快速发展导致像BERT这样的模型都可以称作“小”模型了。Kaggle LLM比赛LLM Science Exam 的第四名就只用了deberta&#xff0c;这可以说是一个非常好的成绩了。所以说在特定的领域或者需求中&#xff0c;大语言模型并不一定就是最优的解决方案&#xff0c;“小…

自动化横行时代,手工测试如何突破重围?测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试是每个…

【C++高阶(五)】哈希思想--哈希表哈希桶

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 哈希结构 1. 前言2. unordered系列容器3. 哈希概…

01.vue3大事件——项目初始化、技术介绍

后台数据管理系统 - 项目架构设计 在线演示&#xff1a;https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑氢储一体化协同的综合能源系统低碳优化》

这个标题涉及到考虑了多个方面的能源系统优化&#xff0c;其中关键的关键词包括"氢储一体化"、"协同"、"综合能源系统"和"低碳优化"。以下是对这些关键词的解读&#xff1a; 氢储一体化&#xff1a; 氢储存&#xff1a; 指的是氢气的存…

网络运维与网络安全 学习笔记2023.11.27

网络运维与网络安全 学习笔记 第二十八天 今日目标 OSPF基本原理、OSPF单区域配置、OSPF多区域配置 特殊区域之Stub、特殊区域之NSSA OSPF基本原理 项目背景 随着企业的发展&#xff0c;网络的规模越来越大&#xff0c;网段的数量越来越多&#xff0c;公司内部的路由器的…

JSP 条件动作标签之choose when otherwise组合标签详解

好 上文JSP 条件动作标签之if标签详解中 我们详细的说了说 if标签 但是 这个if是没有else的 多少对我们的编程习惯没有那么友好 所以 就出现了另外一种语法 由 choose when otherwise组成 和我们java中的switch语句 我们的基本语法就是 外面一个大的choose包裹起来 里面是很多…

VMware上pfsense开源防火墙的下载、安装、简单配置

文章目录 1. pfsense概述1.1. 官方描述1.2. 个人描述 2. pfsense下载2.1. 官网下载 3. pfsense安装3.1. 官网手册3.2. 安装步骤 4. pfsense配置4.1. 默认账号密码4.2. 初始化配置4.3. 切换语言 5. 简单测试5.1. 调整测试网络5.2. 测试结果 6. 虚拟机操作界面讲解7. 最后 1. pfs…