3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-29

構成

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 接続

NUT 設定

Install

% sudo apt install nut

UPS との通信設定:/etc/nut/ups.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
  • 起動確認
% 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 として動作
/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 から」「どのポートで」接続を受け入れるか
/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 設定

% 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
/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 を実行するまでのインターバル
/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 秒経過したら、upsgoneCMDSCRIPT に渡して起動させる
    • AT ONLINE * CANCEL-TIMER upsgone
      • 任意の UPS が復帰したら、upsgone タイマーをキャンセルする
    • AT ONLINE * EXECUTE ups-back-on-line
      • 任意の UPS が復帰したら、ups-back-on-line を即時に CMDSCRIPT に渡す
/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

動作確認

% 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

  • Send Email Status Updates
  • Email
  • Email Subject

確認

  • Reporting > UPS で統計が見えたら OK

ESXi

  • ESXi 7.0 Update3c
  • 方針:SSH でログインして shutdown する
   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 に追記
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 を得る
[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 で電源状態を得る
[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 でシャットダウン操作を行う

  • 完成形

#!/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 をマウントしてインストールする
[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 時に生成させる
/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 サービスを再起動
ProgramData\ssh\sshd_config
#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
  1. 公開鍵の配置
    • %USERPROFILE%\.ssh\authorized_keys
    • アクセス権限の編集
      • Administrators と所有者にフルコントロール(今回は UPS
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
      4. Win/ESXi は TrueNAS をマウントしているので、順序を守らせる目的もある
  • TrueNAS SHUTDOWNCMD

    • /root/shutdown-all.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
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
   Product: VMware ESXi
   Version: 7.0.3
   Build: Releasebuild-19193900
   Update: 3
   Patch: 20
  • PowerCLI でやる

PowerShell のインストール (Ubuntu)

% 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)

% 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)

# 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 を使う

NUT Tools の Download & Install

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 動作確認

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?