win-acmeの新バージョン通知

 v2.1.15辺りからwin-acmeに自身のバージョンをチェックする機能が追加された。

 ただし、実行時のログファイルに記録されているだけなので、定期的にログファイルを確認しないと気付けかない。

 そこで、win-acmeの実行に合わせてログファイルを確認し、新バージョンが発行されていれば電子メールを送るようにする。リポジトリに登録すれば良いとかは無しで。

 まず、win-acmeでバージョンチェックを有効にする。
展開されたwin-acmeのフォルダー内にあるsettings_default.jsonをsettings.jsonという名前でコピーし、VersionCheckをtrueにする。

  "Client": {
    "ClientName": "win-acme",
    "ConfigurationPath": null,
    "LogPath": null,
    "VersionCheck": true

  },

 ログファイルをチェックするバッチファイル(win-acme_checknew.bat)
実行した結果をログファイルに追記しておく。

@echo off
@echo win-acmeの新バージョンがあれば、postmaster宛にメールを送る
@echo %DATE%-%TIME: =0% : Excecuting ... %0 %*

setlocal enabledelayedexpansion

set ACME_LOGFILE=C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org\Log\log-%date:~-10,4%%date:~-5,2%%date:~-2,2%.txt

@rem ログファイルが無ければ、終了する。
if not exist %ACME_LOGFILE% goto :DONE

set AVAILABLE=
@rem setlocal enabledelayedexpansion なので ^! で ! をエスケープする
for /f "usebackq delims=" %%a in (`findstr /r /c:"\[WRN\] New version .* available^!" %ACME_LOGFILE%`) do Set AVAILABLE=%%a

if not "%AVAILABLE%" == "" (
    @echo New version available!
    @echo call %~dp0SendMail.bat "win-acme New version available^!" "%AVAILABLE%"
          call %~dp0SendMail.bat "win-acme New version available^!" "%AVAILABLE%"
    @echo %DATE%-%TIME: =0% %~nx0 : Send mail.>>%ACME_LOGFILE%
) else (
    echo No new version.
    @echo %DATE%-%TIME: =0% %~nx0 : No New Version.>>%ACME_LOGFILE%
)

:DONE
endlocal

timeout /T 300

exit /b

 PowerShellスクリプトを呼び出すバッチファイル(SendMail.bat)

@echo off
@rem 電子メールを送信する
@rem 送信元アドレス
@rem 送信先アドレス
@rem 件名
@rem 内容
@rem 送信元アドレス、送信先アドレスの両方とも省略した場合は、postmasterのアドレスが使用される
echo %DATE%-%TIME: =0% : Excecuting ... %0 %*

setlocal enabledelayedexpansion

if "%~4" == "" (
  set MailFrom="postmaster@domain.com"
  set MailTo="postmaster@domain.com"

  if not "%~1" == "" set Title=%~1
  if not "%~2" == "" set TxtBody=%~2
) else (
  if not "%~1" == "" set MailFrom=%~1
  if not "%~2" == "" set MailTo=%~2
  if not "%~3" == "" set Title=%~3
  if not "%~4" == "" set TxtBody=%~4
)

@echo powershell -file %~dp0SendMail.ps1 !MailFrom! !MailTo! "!Title!" "!TxtBody!"
      powershell -file %~dp0SendMail.ps1 !MailFrom! !MailTo! "!Title!" "!TxtBody!"

endlocal

exit /b %ERRORLEVEL%

 電子メールを送信するPowerShellスクリプト(SendMail.ps1)

Param($from, $to, $subject, $body)

$ary = $from.Split("@")
$server = $ary[1]
$port = 587
$user = "xxx"
$password ="xxx"

$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential(
  $user, $securepassword)

Send-MailMessage `
  -From $from `
  -To $to `
  -Subject $subject `
  -Body $body `
  -Encoding UTF8 `
  -SmtpServer $server `
  -Port $port `
  -UseSsl `
  -Credential $credential

  タスクスケジューラーライブラリのwin-acme renew (acme-v02.api.letsencrypt.org)の操作に、win-acme_checknew.batを追加し、win-acme.exeの後に実行するようにする。

 Windows Server 2016上で実行したときは、SYSTEMアカウントで実行するとログファイルにアクセスできないようだったので、Administratorアカウントにて実行させた。

 なお、win-acmeや電子証明書が更新された場合はタスクスケジューラーからこのバッチファイルの設定が削除されるかもしれないので、そういう場合は再確認しておく。