SmartUPS 連動シャットダウンを Ubuntu -> TrueNAS -> {ESXi, Win11} に設定した作業録

# 構成
- UPS: APC Smart-UPS 750 LCD
- Ubuntu 20.04
    - `BOXNUC7CJYH`
- TrueNAS
    - `Intel Pentium Gold G6400` / `DDR4 16GiB` / HDD x8 (4Tx2, 8Tx2) / SSD x4 (`ADATA ASU650SS-120GT-R x2`, `Crucial CT480BX500SSD1JP x2 (USB)`) 
    - https://qiita.com/uyiromo/items/3e634e2eeae1be27ef01#hw-%E6%A7%8B%E6%88%90
- ESXi
    - `Intel Core i5 10400` / `DDR4 SODIMM 32 GiB`
    - https://qiita.com/uyiromo/items/b1c13e571cbc8a87b250#%E6%A7%8B%E6%88%90
- Windows 11
    - `Intel Core i5 12600K` / `DDR4 64 GiB` / `GeForce RTX 3060 Ti` / `HDD 2Tx2` / `NVMe SSD 500Gx2`


# UPS 構成
- Master
    - Ubuntu 20.04
- Slave
    - TrueNAS
    - ESXi
    - Windows 11
- Misc
    - 28 inch 4K モニタ x4
    - スイッチングハブ LS108G
- 通常使用時
    - UPS 出力：250W
    - バッテリ持続時間：19m
- FF XV Bench 実行時
    - 高品質 / 4K / フルスクリーン
    - UPS 出力：480W
    - バッテリ持続時間：4m



# UPS Master 設定
- `NUT (Network UPS Tools)` で管理する

## UPS - Ubuntu 接続
- USB ケーブル（A to B）で接続
    - `U2C-BY15BK`
    - https://www.yodobashi.com/product/100000001003178030/

## NUT 設定
### Install

```zsh
% sudo apt install nut
```

### UPS との通信設定：/etc/nut/ups.conf
```diff_conf:/etc/nut/ups.conf 
      1 diff --git a/etc/nut/ups.conf.bak b/etc/nut/ups.conf
      2 index 3ea1354..195d95b 100644
      3 --- a/etc/nut/ups.conf.bak
      4 +++ b/etc/nut/ups.conf
      5 @@ -136,5 +136,11 @@
      6_  # To find out if your driver supports any extra settings, start it with
      7  # the -h option and/or read the driver's documentation.
      8  
      9 +[smartups]
     10 +       driver = usbhid-ups
     11 +       port   = auto
     12 +       desc   = "APC SmartUPS"
     13 +
     14 +
     15  # Set maxretry to 3 by default, this should mitigate race with slow devices:
     16 -maxretry = 3
     17 +#maxretry = 1
```

- 起動確認

```zsh
% sudo upsdrvctl start
Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
interrupt pipe disabled (add 'pollonly' flag to 'ups.conf' to get rid of this message)
Using subdriver: APC HID 0.96
```

### upsd のモード設定：/etc/nut/nut.conf
- `standalone`
    - UPS に直接繋がっている自身のみを保護
- `netserver`
    - NUT Master として動作

```diff_conf:/etc/nut/nut.conf
      1 diff --git a/etc/nut/nut.conf.bak b/etc/nut/nut.conf
      2 index 9309825..2ab586b 100644
      3 --- a/etc/nut/nut.conf.bak
      4 +++ b/etc/nut/nut.conf
      5 @@ -29,4 +29,4 @@
      6  #  This file is intended to be sourced by shell scripts.
      7  #  You MUST NOT use spaces around the equal sign!
      8  
      9 -MODE=none
     10 +MODE=netserver
```

### upsd master 設定：/etc/nut/upsd.conf
- 「どの slave から」「どのポートで」接続を受け入れるか
```diff_conf:/etc/nut/upsd.conf
      1 diff --git a/etc/nut/upsd.conf.bak b/etc/nut/upsd.conf
      2 index 7292777..c49e99f 100644
      3 --- a/etc/nut/upsd.conf.bak
      4 +++ b/etc/nut/upsd.conf
      5 @@ -43,6 +43,9 @@
      6  #
      7  # This will only be read at startup of upsd.  If you make changes here,
      8  # you'll need to restart upsd, reload will have no effect.
      9 +LISTEN 0.0.0.0   3493
     10  
     11  # =======================================================================
     12  # MAXCONN <connections>
```

### nut-server 設定
```zsh
% sudo systemctl start nut-server
% sudo systemctl status nut-server
% sudo systemctl enable nut-server
```


### upsd user account：/etc/nut/upsd.users
- upsd にアクセスするユーザアカウントの設定
    - UserName: `upsmon`
    - Password: `*********`
    - upsmon: `master`

```diff_conf:/etc/nut/upsd.users
      1 diff --git a/etc/nut/upsd.users.bak b/etc/nut/upsd.users
      2 index ec78eb5..48415e4 100644
      3 --- a/etc/nut/upsd.users.bak
      4 +++ b/etc/nut/upsd.users
      5 @@ -70,3 +70,6 @@
      6  # The matching MONITOR line in your upsmon.conf would look like this:
      7  #
      8  # MONITOR myups@localhost 1 upsmon pass master (or slave)
      9 +[upsmon]
     10 +    password = *******
     11 +    upsmon master
```

### UPS モニタリング upsmon 設定：/etc/nut/upsmon.conf
- `MONITOR`
    - `ups-name@ups-host 1 <username> <password> master`
    - ups-name は `/etc/nut/ups.conf` の `[ups-name]`
    - usename/password は `/etc/nut/upsd.users` に同じ
    - `1`: システムに繋がっている UPS の数
    - `master`/`slave`: `master` は他の `slave` の後に shutdown する
- `MINSUPPLIES`
    - これ以上の台数の UPS が反応するなら、正常状態と判断する
- `SHUTDOWNCMD`
    - シャットダウン用コマンド
- `NOTIFYCMD`
    - イベントが発生した時に呼ぶコマンド
- `POLLFREQ`
    - [seconds] の間隔で、UPSの状態確認を行う
- `POLLFREQALERT`
    - [seconds] の間隔で、バッテリ稼働中の UPS の状態確認を行う
- `HOSTSYNC`
    - Master として、Slave が FSD (Forced Shutdown) に応答して切断するのを [seconds] で待つ。応答＋切断が無い場合、その slave を無視して進む。
- `DEADTIME`
    - [seconds]
    - UPS が `POLLFREQ`/`POLLFREQALERT` に対して応答しない時、`DEADTIME` 以上の時間応答しないなら、UPS は stale とみなす。
    - On Battery Stale なら、UPS が low battery になったと見なして強制シャットダウンを行う
- `POWERDOWNFLAG`
    - FSD した場合、ここで指定されたファイルを作成する（FSD されたかのフラグ）
- `NOTIFYMSG`
    - upsmon のイベント検知時のメッセージ定義
- `NOTIFYFLAG`
    - upsmon のイベント検知時のデフォルト動作定義
    - `SYSLOG`: syslog へ書き込む
    - `WALL`: ログイン中のユーザに警告する
    - `EXEC`: `NOTIFYCMD` をメッセージ付きで実行する
- `RBWANTIME`
    - [seconds]
    - replace が必要なバッテリの警告インターバル
- `NOCOMMWANTIME`
    - [seconds]
    - **全ての** UPS と通信できない場合の警告インターバル
- `FINALDELAY`
    - [seconds]
    - `NOTIFY_SHUTDOWN` を受けてから、`SHUTDOWNCMD` を実行するまでのインターバル

```diff_conf:/etc/nut/upsmon.conf
      1 diff --git a/etc/nut/upsmon.conf.bak b/etc/nut/upsmon.conf
      2 index f3a0862..90a6cab 100644
      3 --- a/etc/nut/upsmon.conf.bak
      4 +++ b/etc/nut/upsmon.conf
      5 @@ -82,6 +82,7 @@
      6  # MONITOR myups@bigserver 1 monmaster blah master
      7  # MONITOR su700@server.example.com 1 upsmon secretpass slave
      8  # MONITOR myups@localhost 1 upsmon pass master (or slave)
      9 +MONITOR upsmon@localhost 1 smArt%UPS master
     10  
     11  # --------------------------------------------------------------------------
     12  # MINSUPPLIES <num>
     13 @@ -127,6 +128,7 @@ SHUTDOWNCMD "/sbin/shutdown -h +0"
     14  #
     15  # Example:
     16  # NOTIFYCMD /bin/notifyme
     17 +NOTIFYCMD /sbin/upssched
     18  
     19  # --------------------------------------------------------------------------
     20  # POLLFREQ <n> 
     21 @@ -261,6 +263,9 @@ POWERDOWNFLAG /etc/killpower
     22  # IGNORE - Don't do anything
     23  #
     24  # If you use IGNORE, don't use any other flags on the same line.
     25 +NOTIFYFLAG ONLINE     SYSLOG+WALL+EXEC
     26 +NOTIFYFLAG ONBATT     SYSLOG+WALL+EXEC
     27 +NOTIFYFLAG LOWBATT    SYSLOG+WALL+EXEC
     28  
     29  # --------------------------------------------------------------------------
     30  # RBWARNTIME - replace battery warning time in seconds
```

### upssched 設定：/etc/nut/upssched.conf
- `CMDSCRIPT`
    - AT... で定義される timename を引数として実行されるスクリプト
- `PIPEFN`
    - start/stop timer の通信で使用されるファイルパス
- `LOCKFN`
    - lock で使用されるファイルパス
- `AT`
    - `AT ONBATT * START-TIMER upsgone 300`
        - `*`: 任意の UPS が
        - `ONBATT`: バッテリ動作に移行したら
        - `START-TIMER`: タイマーをスタートさせる
        - `upsgone`: タイマーの名前
        - `300`: `ONBATT` になって `300` 秒経過したら、`upsgone` を `CMDSCRIPT` に渡して起動させる
    - `AT ONLINE * CANCEL-TIMER upsgone`
        - 任意の UPS が復帰したら、`upsgone` タイマーをキャンセルする
    - `AT ONLINE * EXECUTE ups-back-on-line`
        - 任意の UPS が復帰したら、`ups-back-on-line` を即時に `CMDSCRIPT` に渡す

```diff_conf:/etc/nut/upssched.conf
      1 diff --git a/etc/nut/upssched.conf.bak b/etc/nut/upssched.conf
      2 index 6626942..f01f3ee 100644
      3 --- a/etc/nut/upssched.conf.bak
      4 +++ b/etc/nut/upssched.conf
      5 @@ -42,6 +42,7 @@ CMDSCRIPT /bin/upssched-cmd
      6  # about how your system works before potentially opening a hole.
      7  #
      8  # PIPEFN /run/nut/upssched/upssched.pipe
      9 +PIPEFN /run/nut/upssched.pipe
     10  
     11  # ============================================================================
     12  #
     13 @@ -57,6 +58,7 @@ CMDSCRIPT /bin/upssched-cmd
     14  # You should put this in the same directory as PIPEFN.
     15  #
     16  # LOCKFN /run/nut/upssched/upssched.lock
     17 +PIPEFN /run/nut/upssched.lock
     18  
     19  # ============================================================================
     20  #
     21 @@ -111,3 +113,6 @@ CMDSCRIPT /bin/upssched-cmd
     22  #   'ups-back-on-line' via CMDSCRIPT.
     23  #
     24  #   AT ONLINE * EXECUTE ups-back-on-line
     25 +AT ONBATT * START-TIMER upsgone 300
     26 +AT ONLINE * CANCEL-TIMER upsgone
     27 +AT LOWBATT * START-TIMER upsgone 5
     28 \ No newline at end of file
```


### 動作確認
```zsh
% upsc smartups
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.runtime: 1140         <---- [seconds]
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 27.3
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion 
device.model: Smart-UPS 750
device.serial: *********************
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: UPS 09.3 / ID=18
ups.mfr: American Power Conversion 
ups.mfr.date: 2016/06/15
ups.model: Smart-UPS 750
ups.productid: 0003
ups.serial: *****************
ups.status: OL
ups.timer.reboot: -1
ups.timer.shutdown: -1
ups.vendorid: 051d
```

# UPS Slave 設定
## TrueNAS
- `TrueNAS-12.0-U8`
- `UPS Service` を使う

### UPS Service 有効化
- `Services` > `UPS`
    - `Running` & `Start Automatically`

### UPS 設定
#### General Options
- `Identifier`
    - `/etc/nut/ups.conf` の `[*****]`
- `UPS Mode`
    - Slave
- `Remote Host`
- `Remote Port`
    - `/etc/nut/upsd.conf` で設定したポート番号
- `Port or HostName`
    - auto

#### Monitor
- `Monitor User` / `Monitor Password`
    - `/etc/nut/upsd.users` で設定したアカウント情報

#### Shutdown
- `Shutdown Mode`
    - UPS goes on battery
- `Shutdown Timer`
    - `UPS goes on battery` の場合、[seconds] の間反応しなかったらシャットダウンを開始する（その間に復帰したらキャンセル）
- `Shutdown Command`

#### Email
- [x] `Send Email Status Updates`
- `Email`
- `Email Subject`

### 確認
- `Reporting` > `UPS` で統計が見えたら OK

## ESXi
- `ESXi 7.0 Update3c`
- 方針：**SSH でログインして shutdown する**

```zsh
   Product: VMware ESXi
   Version: 7.0.3
   Build: Releasebuild-19193900
   Update: 3
   Patch: 20
```

### ssh 有効化
- `ナビゲータ > ホスト > 管理 > サービス`
- `TSM-SSH`
    - `起動`
    - ポリシーを `ホストと連動して起動および停止します`

### 鍵ペア設定
- Master 側で `root` として鍵を生成
    - ```ssh-keygen -t ed25519 -C $USER@`hostname` ```
- ESXi にログインして Master の /root/.ssh/id_ed25519.pub を ESXi の /etc/ssh/keys-root/authorized_keys に追記
    - ed25519 は設定してあげないと鍵として機能しないらしい……
    - https://sig9.org/archives/2975

```zsh
ubuntu# ssh <ESXi> "echo `cat /root/.ssh/id_ed25519.pub` > /etc/ssh/keys-root/authorized_keys"
ubuntu# ssh <ESXi> "echo "PubkeyAcceptedKeyTypes=+ssh-ed25519" >> /etc/ssh/sshd_config"
ubuntu# ssh <ESXi> "/etc/init.d/SSH restart"
```

### シャットダウンスクリプト
- `vim-cmd vmsvc/getallvms` で Vmid を得る

```zsh
[root@localhost:~] vim-cmd vmsvc/getallvms
Vmid   Name              File                   Guest OS       Version   Annotation
5      win2   [TrueNAS SSD] win2/win2.vmx   windows9_64Guest   vmx-19 

[root@localhost:~] Vmids=$( vim-cmd vmsvc/getallvms | awk 'NR>1 { print $1 }' )
[root@localhost:~] echo $Vmids
5         
```

- `vim-cmd vmsvc/power.getstate` で電源状態を得る

```zsh
[root@localhost:~] vim-cmd vmsvc/power.getstate 5
Retrieved runtime info
Powered on

[root@localhost:~] for vmid in $Vmids; do vim-cmd vmsvc/power.getstate $vmid; done
Retrieved runtime info
Powered on
```

- `Powered on` なら `vim-cmd vmsvc/power.shutdown` でシャットダウン操作を行う

- 完成形

```sh
#!/bin/sh

Vmids=$( vim-cmd vmsvc/getallvms | awk 'NR>1 { print $1 }' )
for vmid in $Vmids; do
    vim-cmd vmsvc/power.getstate $vmid | tail -n 1 | grep "Powered on" &> /dev/null
    ret=$?
    if [ $ret -eq 0 ]; then
        vim-cmd vmsvc/power.shutdown $vmid
    fi
done
poweroff -d 0
```


- 以下のエラーメッセージが出る場合は ESXi Console などから VMWare Tools をマウントしてインストールする

```zsh
[root@localhost:~] vim-cmd vmsvc/power.shutdown 5
(vim.fault.ToolsUnavailable) {
   faultCause = (vmodl.MethodFault) null, 
   faultMessage = <unset>
   msg = "Received SOAP response fault from [<<io_obj p:0x000000d22d219f18, h:5, <TCP '127.0.0.1 : 58564'>, <TCP '127.0.0.1 : 8307'>>, /sdk>]: shutdownGuest
Cannot complete operation because VMware Tools is not running in this virtual machine."
}
```

### スクリプトの自動生成
- `/sbin/shutdown-all.sh` を Boot 時に生成させる

```sh:/etc/rc.local.d/local.sh 
#!/bin/sh ++group=host/vim/vmvisor/boot

# local configuration options

# Note: modify at your own risk!  If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading.  Changes are not supported unless under direction of
# VMware support.

# Note: This script will not be run when UEFI secure boot is enabled.

cat << EOF > /sbin/shutdown-all.sh
#!/bin/sh

Vmids=$( vim-cmd vmsvc/getallvms | awk 'NR>1 { print $1 }' )
for vmid in $Vmids; do
    vim-cmd vmsvc/power.getstate $vmid | tail -n 1 | grep "Powered on" &> /dev/null
    ret=$?
    if [ $ret -eq 0 ]; then
        vim-cmd vmsvc/power.shutdown $vmid
    fi
done
poweroff -d 0
EOF
chmod +x /sbin/shutdown-all.sh

exit 0
````



## Windows 11
- `Windows 11 Home (21H2) 10.0.22000 / Build 22000.556`
- 方針：**SSH でログインして shutdown する**

### OpenSSH サーバ機能の有効化
- 設定 > アプリ > オプション機能
    - `OpenSSH サーバ` を有効化する

### ユーザ設定
- ローカルアカウントを作成する
    - パスワードを設定
    - 管理者 / Administrators に設定しておく

### 鍵認証設定
1. sshd の設定変更
    - `C:\ProgramData\ssh\sshd_config` から、鍵認証の保存場所をユーザディレクトリに変更しておく
    - `Match Group ...` をコメントアウト
    - OpenSSH サービスを再起動

```conf:ProgramData\\ssh\\sshd_config
#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```

1. 公開鍵の配置
    - `%USERPROFILE%\.ssh\authorized_keys`
    - アクセス権限の編集
        - Administrators と所有者にフルコントロール（今回は `UPS`）

```console
C:\Users\UPS\.ssh>icacls authorized_keys /grant BUILTIN\Administrators:f
処理ファイル: authorized_keys
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\UPS\.ssh>icacls authorized_keys /grant *******\UPS:f 
処理ファイル: authorized_keys
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\UPS\.ssh>icacls authorized_keys
authorized_keys *******\UPS:(F)
                BUILTIN\Administrators:(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
```

### SSH 動作確認
- `ssh ups@<win11-ip/host> "shutdown.exe -s -t 0"`
    - 鍵認証と管理者設定ができていれば、ssh から即時シャットダウンされる

# 最終構成
- Master
    - Ubuntu 20.04
- Slave
    - Windows 11
    - TrueNAS
    - ESXi

- UPS Shutdown
    1. Master が upsmon で検知
    2. TrueNAS が NUT Client で `NOTIFY_SHUTDOWN` を受信
        1. Windows 11 を SSH & Shutdown
        2. ESXi を SSH & Shutdown
        3. 自身を Shutdown
        3. Win/ESXi は TrueNAS をマウントしているので、順序を守らせる目的もある

- TrueNAS SHUTDOWNCMD
    - `/root/shutdown-all.sh`

```sh:/root/shutdown-all.sh
#!/bin/sh

ssh ups@<win11> "shutdown.exe -s -t 0"
ssh <esxi> "/sbin/shutdown-all.sh"
/sbin/shutdown -p now

```






# Try 記録
## ESXi を PowerCLI でシャットダウンする
- [Master] `Ubuntu 20.04.4 LTS`

```zsh
Linux ubuntu 5.4.0-105-generic #119-Ubuntu SMP Mon Mar 7 18:49:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```


- [Slave] `ESXi 7.0 Update3c`

```zsh
   Product: VMware ESXi
   Version: 7.0.3
   Build: Releasebuild-19193900
   Update: 3
   Patch: 20
```

- `PowerCLI` でやる

### PowerShell のインストール (Ubuntu)
```zsh
% curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add
% sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/20.04/prod.list
% sudo apt update
% sudo apt install powershell
```

### PowerCLI のインストール (Ubuntu)
```powershell
% sudo pwsh
PowerShell 7.2.2
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

PS /home/uyiromo> Install-Module -Name VMWare.PowerCLI
```

### PowerCLI のテスト (Ubuntu)
```powershell
# Disable "command confirmation" and "certification error"
PS /home/uyiromo> Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false | Out-Null

# Create credential with both User and Password
PS /home/uyiromo> $User = "root"
PS /home/uyiromo> $Password = ConvertTo-SecureString -String "******" -AsPlainText -Force 
PS /home/uyiromo> $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Password

# Connect to the ESXi Host
PS /home/uyiromo> $VMHost = "192.168.*.*"
PS /home/uyiromo> Connect-VIServer -Server $VMHost -Credential $Credential | Out-Null 

# Get ALL VMs and Shutdown them
PS /home/uyiromo> Get-VM | Stop-VM -Confirm:$false             
Stop-VM: 3/26/2022 11:09:11 PM  Stop-VM         Current license or ESXi version prohibits execution of the requested operation.
```

- ESXi Free License だと API が Read-Only になるから使えないらしい……


## Windows 11 で NUT Tools を使う
- 参考
    - https://qiita.com/tmitani/items/565d9584c6579f3064be

### NUT Tools の Download & Install
- https://networkupstools.org/download.html#_binary_packages
    - Windows (complete port, Beta): Windows MSI installer 2.6.5-6

### BugFix
- DLL が欠けているため、Download する
    - `http://web.archive.org/web/20160826051001/http:/indy.fulgan.com/SSL/`
    - `openssl-1.0.2g-i386-win32.zip`
        - `openssl-1.0.2g-x64_86-win64.zip` では機能しない

1. Download した zip から、`LIBEAY32.dll` / `SSLEAY32.dll` を NUT に Copy
    - `C:\Program Files (x86)\NUT\bin\`
        - `upsc` とかのため
    - `C:\Program Files (x86)\NUT\sbin\`
        - こちらにもコピーしないと `upsmon` が起動しない
2. `libgcc_s_dw2-1.dll` のコピー
    - `C:\Program Files (x86)\NUT\bin\` から `C:\Program Files (x86)\NUT\sbin\` へ
    - `upsmon` の動作のため

### upsc 動作確認
```console
C:\Users\User> "C:\Program Files (x86)\NUT\bin\upsc.exe" <ups-name>@<ups-ip/host>:<ups-port>
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.runtime: 960
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 27.0
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: Smart-UPS 750
device.serial: **************
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: UPS 09.3 / ID=18
ups.mfr: American Power Conversion
ups.mfr.date: 2016/06/15
ups.model: Smart-UPS 750
ups.productid: 0003
ups.serial: ****************
ups.status: OL
ups.timer.reboot: -1
ups.timer.shutdown: -1
ups.vendorid: 051d
```

### NUT Client 設定
1. `etc/nut.conf`
    - NUT Client として起動する
    - `MODE=netclient` を追記
2. `etc/upsmon.conf`
    - NUT 監視設定
    - `MONITOR <ups-name>@<ups-ip/host> 1 <ups-Username> <ups-Password> slave`
    - `SHUTDOWNCMD "C:\\WINDOWS\\system32\\shutdown.exe -s -t 0"`

### NUT サービス起動
-サービスの管理から、
    - ログオンアカウントを管理者アカウントに変えて
    - サービスを開始する

### UPS 連動テスト
- Master に繋いであるのは確認できたが、`NOTIFY_SHUTDOWN` に反応してないように見える……
    - `SHUTDOWNCMD` をメモ帳あたりに設定しても反応しないし……
- 何か間違えてる可能性はあるが、それはそれとして別の回避法があるなら面倒なので諦める 






# ref
- UbuntuServerの停電対策を行う
    - https://竹内電設.com/post/ubuntuserver%E3%81%AE%E5%81%9C%E9%9B%BB%E5%AF%BE%E7%AD%96%E3%82%92%E8%A1%8C%E3%81%86/
-  Debian-GNU-Linux-Profiles/docs/ha/using-ups-with-nut.md 
    -  https://github.com/hardenedlinux/Debian-GNU-Linux-Profiles/blob/master/docs/ha/using-ups-with-nut.md
- upsc 出力のドキュメント
    -  https://networkupstools.org/docs/user-manual.chunked/apcs02.html
- vSphere 6.7 Update1 で ESXi への SSH アクセス時に ED25519 が使えるようにする 
    - https://sig9.org/archives/2975