ocf:heartbeat:apacheでZabbixのレスポンスチェックではまった

 article  Comments Off on ocf:heartbeat:apacheでZabbixのレスポンスチェックではまった
Sep 282018
 

CentOS 7.5のPacemaker/Corosync環境でZabbix 4.0のHA構成を試していていたら、ocf:heartbeat:apacheを使ったhttpdの起動がうまくいかなかった。
クラスターリソースは以下で作成している。

pcs resource create WebSite ocf:resource:apache statusurl="http://localhost/zabbix/" client=curl

Apacheのアクセスログではステータスコード200も返っているのに、なんでかなと思ったら、返答されるHTMLの終端タグ</html>が含まれていないからだった(curl http://localhost/zabbix/の応答が</body>で終わってる)。

pcs resource update WebSite testregex="< *html *>"

とやって解決。

ISC BINDのバージョン番号隠蔽

 article  Comments Off on ISC BINDのバージョン番号隠蔽
Jul 152018
 

RHEL7/CentOS7で使われているISC BIND 9.9.4では、version “適当な値”;とするより適切な設定があります。

バージョン番号隠蔽。デフォルトは稼働しているBINDのバージョン。

// disables processing query of the name version.bind with type TXT, class CHAOS.
version none;

ホスト名隠蔽。デフォルトはgethostbyname()の値。

// disables processing query of the name hostname.bind with type TXT, class CHAOS.
hostname none;

こちらもホスト名隠蔽だが、デフォルトnoneなので返答しない。server-id hostname;にするとgethostname()の値が応答される。

// disables processing query of the name ID.SERVER with type TXT, class CHAOS.
server-id none;

Administrator Reference Manual – Chapter 6. BIND 9 Configuration ReferenceのBuilt-in server information zonesに説明があります。

NetworkManager で resolv.conf の nameserver を設定

 article  Comments Off on NetworkManager で resolv.conf の nameserver を設定
Jul 142018
 

RHEL7/CentOS7系では、resolv.conf の設定は 通常 NetworkManager によっておこなわれます。
通常は ifcfg-* に記述された DNS の値もしくは DHCP サーバーから渡された DNS になると思います。

NetworkManager の設定で、更新後の nameserver を指定するようにしてみます。
こんな感じになります。

$ sudo vi /etc/NetworkManaer/conf.d/dns.conf
$ cat /etc/NetworkManaer/conf.d/dns.conf
[main]
dns=default

[global-dns]
searches=example.test

[global-dns-domain-*]
servers=127.0.0.1, 192.168.110.71

そうすると、NetworkManager 再起動後の resolv.conf 設定は以下になります。

$ cat /etc/resolv.conf
# Generated by NetworkManager
search example.test
nameserver 127.0.0.1
nameserver 192.168.110.71

Outlookでメールアイテムを移動するVBAマクロ

 article  Comments Off on Outlookでメールアイテムを移動するVBAマクロ
Jul 122018
 

GmailではIMAPフォルダーとしてラベルが使われています。IMAPフォルダーを削除してもラベルがなくなるだけでメールアイテム自体は消えません。
ですがOffice 365はIMAPフォルダーそのものなので、削除すると中のメールアイテムも消えてしまいます。
Gmailのような処理にしたければ、IMAPフォルダーを削除するにメールアイテムを移動してやる必要がありますが手作業では面倒です。
そこでOutlookクライアントで一括でメールアーカイブするためのVBAマクロを作ってみました。

以下はInboxからArchiveフォルダにメールアイテムを移動するようになっていますが、mySrcFolderとmyDstFolderで移動元/移動先フォルダーを変更できます。

Sub ArchiveItems()

    Dim myNameSpace As Outlook.NameSpace
    Dim myInbox As Outlook.Folder
    Dim myDstFolder As Outlook.Folder
    Dim mySrcFolder As Outlook.Folder
    Dim myItems As Outlook.Items
    Dim myItem As Object

    Set myNameSpace = Application.GetNamespace("MAPI")
    Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
    Set myDstFolder = myInbox.Parent.Folders("Archive")
    Set mySrcFolder = myInbox
    Set myItems = mySrcFolder.Items

    For Each myItem In myItems
        myItem.Move myDstFolder
    Next
    
    MsgBox "Complete!"

End Sub

おまけで現在操作中のフォルダー名を表示するマクロ。

Sub DisplayCurrentFolderName()

    Dim myExplorer As Outlook.Explorer
    Dim myFolder As Outlook.Folder

    Set myExplorer = Application.ActiveExplorer
    Set myFolder = myExplorer.CurrentFolder

    MsgBox myFolder.Name

End Sub

ゾーン自体の動的追加もゾーンの中身も動的更新できるBIND環境

 article  Comments Off on ゾーン自体の動的追加もゾーンの中身も動的更新できるBIND環境
May 222018
 

ISC BINDの動的更新環境を試してみたくてやってみました。環境はCentOS 7.5.1804です。
SELinux 有効のまま、ゾーンの動的追加とゾーンの動的更新 2 つを実施できる環境を目指します。

ゾーンの動的追加

/etc/named.conf の options に allow-new-zones yes を追加して named サービスを起動します。

[root@dns1 ~]# vi /etc/named.conf
[root@dns1 ~]# systemctl start named.service

ゾーンファイルを作成します。

[root@dns1 ~]# cat <<__EOF__ > /var/named/example.com.db
\$ORIGIN example.com.
\$TTL 86400
@         IN  SOA  dns1.example.com.  hostmaster.example.com. (
              2018040101  ; serial
              21600       ; refresh after 6 hours
              3600        ; retry after 1 hour
              604800      ; expire after 1 week
              86400 )     ; minimum TTL of 1 day
;
          IN  NS     dns1.example.com.
;
dns1      IN  A      192.168.110.71
__EOF__
[root@dns1 ~]# chown named: /var/named/example.com.db
[root@dns1 ~]# chmod o-rwx /var/named/example.com.db
[root@dns1 ~]# ls -l /var/named/example.com.db
-rw-r-----. 1 named named 404 May 21 00:51 /var/named/example.com.db
[root@dns1 ~]#

ゾーンを動的追加すると、named.conf の directory 配下にファイルが作成されます。
こちらに named プロセス実行ユーザーで書き込みできるようパーミッションを変更します。

[root@dns1 ~]# chmod g+w /var/named/
[root@dns1 ~]# ls -ld /var/named/
drwxrwx---. 6 root named 169 May 22 01:00 /var/named/
[root@dns1 ~]#

rndc コマンドでゾーンを追加してみます。あとで nsupdate による RR 変更も実施したいので、localhost からの update も許可しています。

[root@dns1 ~]# rndc addzone example.com '{
    type master;
    file "example.com.db";
    allow-update { localhost; };
};'
rndc: 'addzone' failed: permission denied
[root@dns1 ~]#

ディレクトリの書き込み権限は先ほど与えたのに、permission denied です。
SELinux は無効化していないため、audit.log を確認してみます。

[root@dns1 ~]# audit2allow < /var/log/audit/audit.log


#============= named_t ==============

#!!!! This avc can be allowed using the boolean 'named_write_master_zones'
allow named_t named_zone_t:dir { add_name remove_name write };

#!!!! This avc can be allowed using the boolean 'named_write_master_zones'
allow named_t named_zone_t:file { append create rename unlink write };
[root@dns1 ~]#

どうやら named_write_master_zones を on にする必要があるようです。

[root@dns1 ~]# getsebool named_write_master_zones
named_write_master_zones --> off
[root@dns1 ~]# setsebool named_write_master_zones=on
[root@dns1 ~]# rndc addzone example.com '{
    type master;
    file "example.com.db";
    allow-update { localhost; };
};'
[root@dns1 ~]# 

今度はエラーなく実行できました。dig コマンドでのクエリーも問題ありません。

[root@dns1 ~]# dig +noall +answer @localhost example.com. ns
example.com.            86400   IN      NS      dns1.example.com.
[root@dns1 ~]#

先ほど設定した named_write_master_zones 設定を永続化します。

[root@dns1 ~]# setsebool -P named_write_master_zones=on
[root@dns1 ~]#

なお、追加したゾーン定義の情報は /var/named/ 配下に *.nzf として保存されます。
ファイル名は view (今回の例では default)を hash 化した値になるそうです。

[root@dns1 ~]# ls /var/named/*.nzf
/var/named/3bf305731dd26307.nzf
[root@dns1 ~]#

ゾーンの動的更新

次にゾーンの動的更新です。先ほど追加した example.com ゾーンに A レコードを追加します。
nsupdate にはローカル更新を指示するため、-l スイッチを付けて起動します(デフォルトでは SOA レコードを探索してネームサーバーを探しに行っちゃうはず)。

[root@dns1 ~]# nsupdate -l
update add newhost.example.com 86400 A 172.16.1.1
send
quit
[root@dns1 ~]# dig +noall +answer @localhost newhost.example.com. a
newhost.example.com.    86400   IN      A       172.16.1.1
[root@dns1 ~]#

できました。しかし追加したレコードはゾーン定義のジャーナルファイル(*.jnl)に格納されてゾーン定義ファイル自体には書き込まれません。rndc sync コマンドを使うとジャーナルファイルの内容をマージできます。-clean オプションは *.jnl ファイルも削除。

[root@dns1 ~]# rndc sync -clean example.com
[root@dns1 ~]#

ゾーンを指定しなければ全ゾーンの同期になります。

Django Girls TutorialをWindowsのVisual Studio Codeで始めてみる

 article  Comments Off on Django Girls TutorialをWindowsのVisual Studio Codeで始めてみる
Apr 242018
 

Djang Girls TutorialをWindowsのVisual Studio Code環境で開始するまでの手順です。
やってることはチュートリアルの内容とほぼほぼ同じですが、.gitignoreやPython仮想環境の設定をPowerShellから実施しているので、PowerShellでのヒアドキュメント指定方法やエンコーディング指定が主なTipsです。

ディレクトリ作成

mkdir djangodirls
cd djangogirls

python仮想環境を作成してDjangoモジュール導入

python -m venv myvenv
.\myvenv\Scripts\activate
pip install django~=1.11.0

Djangoプロジェクトを作成

django-admin.py startproject mysite .

git初期化

git init
echo @"
*.pyc
*~
__pycache__
myvenv
db.sqlite3
/static
.DS_Store
.vscode
"@ | Set-Content -Encoding ASCII .gitignore

Encoding未指定はBOM付きUTF-16、UTF8でもBOM付きUTF-8になってしまうので、ASCIIを指定します。

Python実行環境指定

mkdir .vscode
echo @"
{
    "python.pythonPath": "`${workspaceFolder}/myvenv/Scripts/python.exe"
}
"@ | Set-Content -Encoding ASCII .vscode/settings.json

Windows 10でWi-Fiのプロファイル名を変更する

 article  Comments Off on Windows 10でWi-Fiのプロファイル名を変更する
Feb 072018
 

WindowsでのWi-Fi接続プロファイル名はデフォルトでSSID名になるのでいつも変更するようにしています。
Windows 7の頃は右クリックでリネームのような操作ができたものの、Windows 10では同様の操作がおこなえませんでした。

レジストリを漁って直接変更も考えましたが、netshコマンドでプロファイルを再作成してみます。
プロファイル構成をエクスポート、削除、変更したプロファイル名の構成ファイルで再作成、という段取りになります。

エクスポートします。

>netsh wlan export profile name="旧プロファイル名"

インターフェイス プロファイル "旧プロファイル名" がファイル ".\ワイヤレス ネットワーク接続-旧プロファイル名.xml" に保存されました。

プロファイルを一旦削除します。

>netsh wlan delete profile name="旧プロファイル名"
プロファイル "旧プロファイル名" がインターフェイス "ワイヤレス ネットワーク接続" から削除されます。

エクスポートされた構成ファイルをコピーしてプロファイル名を変更します。

>copy "ワイヤレス ネットワーク接続-旧プロファイル名.xml" "ワイヤレス ネットワーク接続-新プロファイル名.xml"
>notepad "ワイヤレス ネットワーク接続-新プロファイル名.xml"

私のケースでは3行目に記載されていました。

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
	<name>旧プロファイル名</name>
	<SSIDConfig>
		<SSID>
~ 中略 ~
</WLANProfile>

変更した構成ファイルでプロファイルを作成します。

>netsh wlan add profile filename="ワイヤレス ネットワーク接続-新プロファイル名.xml"
プロファイル "新プロファイル名" がインターフェイス "ワイヤレス ネットワーク接続" に追加されます。

以上で完了です。

ちなみに上記手順での変更後のプロファイル名は、レジストリキー \HKLM\SOFTWARE\Microsoft\WcmSvc の CMPOL 記録されていましたが、こちらを直接変更してプロファイル名を変更できるかは定かではありません。

WindowsにAnaconda使わずにJupyter notebookをセットアップ

 article  Comments Off on WindowsにAnaconda使わずにJupyter notebookをセットアップ
Nov 232017
 

Windows環境でのPython + Jupyter notebookはAnacondaで利用する説明が多いように思ったのですが、あえてAnacondaを使わずに導入して、Jupyter notebookのコンテキストメニューをExplorerに表示させるところまでやってみます。

PythonのWindows向けリリースを公式サイトからダウンロードしインストール。
https://www.python.org/downloads/windows/

後述のコンテキストメニュー登録用モジュールに必要なPython for Windows Extensionsをインストール。
以下からPythonのバージョンやプラットフォームにあったものを選択。
https://sourceforge.net/projects/pywin32/

後述のコンテキストメニュー登録用にPython for Window Extensionsが必要なのだけれど、piwin32だけ指定してもインストールできないので、pypiwin32をインストール。

pip install pypiwin32

jupyterをインストール。

pip install jupyter

Windowsコンテキストメニューを登録するためのstart_jupyter_cmをインストール。

pip install start_jupyter_cm

Windowsコンテキストメニューを登録。管理者権限が必要でした。

jupyter_context-menu_add

以上でExplorerコンテキストメニューに「Jupyter notebook here」と「Jupyter qtconsole here」が表示されるようになります。
コンテキストメニューなしで、コマンドラインからjupyter notebookを起動してもいいんですけどね。

Docker for Windowsのインストールに失敗する

 article  Comments Off on Docker for Windowsのインストールに失敗する
Nov 012017
 

インストーラーを実行すると
“Do you want to replace your current version of Docker for Windows with this new one 17.09.0-ce-win33(13620)?”
のダイアログが出てきて、どう答えようがインストールに失敗してしまいます。

確かに昔インストールしてたけど、アンインストール済みで既に残っていないはず。
試しにコマンドラインでインストーラーを実行すると少し詳しくメッセージが出ます。

C:\> "Docker for Windows Installer.exe"
[01:23:00.032] [InstallHandler] Not run as admin, relaunching with UAC prompt
[01:23:02.803] [InstallHandler] No d4w installation found
[01:23:02.803] [InstallHandler] Using embedded package
[01:23:02.897] [InstallWorkflow] Using package: res:d4w
[01:23:02.897] [InstallWorkflow] Downloadingerequisites
[01:23:03.707] [InstallWorkflow] Exracting manifesttion found, prompting user
[01:23:03.756] [InstallWorkflow] Checking prerequisites installation, with special flag
[01:23:03.783] [InstallWorkflow] Msi based installation found, prompting user
[01:23:05.548] [InstallWorkflow] Uninstalling msi based installation, with special flag
[01:23:05.608] [InstallWorkflow] MSI Uninstall failed

参考になったのは以下2件の記事。
Cannot uninstall Docker for Windows
Docker doesn’t upgrade #1043
Process Monitorを使ってインストーラーがアクセスしているHKCR\Installer\UpgradeCodes以下のレジストリを確認したとのこと。

早速SysinternalSuiteのprocmon.exeを使って確認してみます。

FilterでPathにHKCR\Installer\UpgradeCodesを含むものを表示するよう設定。

Addするとこうなります。

インストーラーを実行するとレジストリが表示されます。

確認できたレジストリーキーを削除し、無事インストールできました。

WinNAT定義の強制削除

 article  Comments Off on WinNAT定義の強制削除
Apr 222017
 

Hyver-V仮想マシン用に設定していたWinNATが動作しなくなりました。

PS C:\WINDOWS\system32> Get-NetNat


Name                             : MyNATnetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.0.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : False



PS C:\WINDOWS\system32> 

最後のActive:Falseになっているのが怪しいのですが、Trueにしようと思ってもSet-NetNatコマンドレットにはそのようなオプションはありません。
作り直そうと思っても、削除時にエラーになってしまいます。

PS C:\WINDOWS\system32> Get-NetNat|Remove-NetNat

確認
この操作を実行しますか?
対象 MyNATnetwork の PolicyStore Local に対して操作 Delete を実行しています
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y
Remove-NetNat : 要求された操作がサポートされていません。
発生場所 行:1 文字:12
+ Get-NetNat|Remove-NetNat
+            ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (MSFT_NetNat (In...yNATnetwork;0"):root/StandardCimv2/MSFT_NetNat) [Remove-NetNat]、CimException
    + FullyQualifiedErrorId : Windows System Error 50,Remove-NetNat

PS C:\WINDOWS\system32> 

なんとも方法がわからず途方に暮れていたら以下の記事に同じような事象がありました。
Set up a Hyper-V Virtual Switch using a NAT Network | Thomas Maurer
ちょっとコメントがつぶれていますが、以下のレジストリキーを削除したとのこと。
HKLM\System\CurrentControlSet\Control\NSI\{eb004a20-…..7759bc}\6\

今のままでは他に情報もないので、以下のキーをバックアップして削除してみたところ、Get-NetNatでエントリーが出現しなくなりました。
HKLM\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a20-9b1a-11d4-9123-0050047759bc}\6

PS C:\WINDOWS\system32> Get-NetNat

うーん、これで大丈夫なのかわかりませんが、とりあえずNew-NetNatでの再作成は成功したので暫く経過観察します。

PS C:\WINDOWS\system32> New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24


Name                             : MyNATnetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.0.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True



PS C:\WINDOWS\system32>

ちゃんとActive:Trueになってるし。