とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

Explorerの右クリックにFish shellを登録するパワーシェルを書いてみた

はじめに

Windows10でこんなことが出来るようにしてみました、まずは画像を見てください。

エクスプローラーの右クリックから Fish Shell Here を選択する。

選択したフォルダでFish Shellが起動します。

動作環境

前もってFish ShellをUbuntuにインストールしています。

パワーシェルのスクリプトを書いた動機

Explorerの右クリックメニューはWindowsレジストリで編集できます。
最近パワーシェルを使うことが多いので、勉強がてらスクリプトを書いてみました。

スクリプト

register.ps1

#
#Fish shellをExplorerの右クリックメニューに登録する。
#
#(方法)
#Windowsのレジストリを利用する。
#
#(注意)
#レジストリへ書き込むため管理者として実行して下さい。
#


$script:script_path=Split-Path -Parent $MyInvocation.MyCommand.Path

function regist ($root, $item, $icon_filename, $command) {
	#add "...<snip>...\fish_shel"
	New-Item -Force -Path "${root}" -Name $fish

	#set "fish_shell\(default)"
	Set-ItemProperty -Force -Path "${root}\${item}" -Name "(default)" -Value "Fish Shell Here"
	if (Test-Path ${icon_filename}){
		#add "fish_shell\Icon"
		New-ItemProperty -Force -Path "${root}\${item}" -Name Icon -PropertyType String -Value ${icon_filename}
	}else{
		Write-Output "Not found icon file."
	}

	#add "fish_shell\command"
	New-Item -Force -Path "${root}\${item}" -Name command

	#set "fish_shell\command\(default)""
	Set-ItemProperty -Force -Path "${root}\${item}\command" -Name "(default)" -Value $command
}

function main () {
	$fish="fish_shell"
	$icon_filename="${script_path}\image\fish_shell.ico"
	regist "Registry::HKEY_CLASSES_ROOT\directory\BackGround\shell" "${fish}" "${icon_filename}" "bash.exe -c fish"
	regist "Registry::HKEY_CLASSES_ROOT\directory\shell" "${fish}" "${icon_filename}" 'cmd.exe /c cd /d "%1"&&bash.exe -c fish'
}

main
ディレクトリ構成
ー register.ps1
   +ー image
         +ー fish_shell.ico    (optional!!)

fish_shell.ico は無くても大丈夫です、その場合はExplorerの右クリックメニューにアイコンが表示されないだけです。

最後に

今更ですがWindows10とMACのシェルをFish Shellに乗り換えました。
シェルはもうこれでいいんじゃないでしょうか?

DHCP(dnsmasq)のIPリース情報をブラウザで表示する

はじめに

我が家では家庭内DHCPとしてdnsmasqを利用しています。


DHCPでリースされたIPアドレスを確認するには、サーバへSSHでログインし dnsmasq.leases のファイル内容を確認しますが、
毎回サーバへログインするのが面倒になってきました。


そこで、WEBサーバを立ち上げてDHCPのIPリース状況をWEBブラウザから簡単に確認できるようにしました。


先行事例
先行事例をgoogleで簡単に調べましたが特に見つかりませんでした。
探している時間が勿体ないのでさっさと作りました。

方針

  • DHCPのリース情報が書かれている、以下ファイル内容をWEBブラウザから確認できるようにする。
    • /var/lib/dnsmasq/dnsmasq.leases
  • httpサーバはDHCP(dnsmasq)をインストールしているサーバに構築する。
  • 今回は目的が単純なので重装備のapacheは利用せずにpythonのウェブサーバ機能を利用する。
  • 家庭内LANで利用するのでセキュリは後回しにします、まずは最速最短でサーバを構築し運用を開始する。

作成したWEBスクリプト

$vi /var/www-py/cgi-bin/index.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

print('Content-type: text/html; charset=UTF-8\r\n')
print('<H1>%s</H1>\n' % "dnsmasq.leases")

f=open("/var/lib/dnsmasq/dnsmasq.leases", "rt")
try:
  for line in f:
    print(line.strip() + "<br>\n")
finally:
  f.close()
スクリプトを実行できるように権限を付与する
$ ls -l /var/www-py/cgi-bin/index.py
-rwxr-xr-x. 1 root root 121  612 15:13 /var/www-py/cgi-bin/index.py

実行方法

#ファイヤウォールのポートを空ける
#webサーバが起動しているときだけポートを空けたいので --permanent は付けない。
#ファイヤウォールの制御は後述でスクリプトにします。
$firewall-cmd --add-port=8000/tcp --zone=public
$firewall-cmd --reload

#サーバの起動
$cd /var/www-py
$python -m CGIHTTPServer 8000

#ctl-z で終了します。

WEBブラウザで確認する

プライベートな情報は伏せています。(殆ど黒塗りだな・・・)

サービス化する

OS起動時にWEBサーバを自動起動できるようにサービスを作ります。

サービスの設定ファイル

$vi /usr/lib/systemd/system/www-py.service

[Unit]
Description=www-py server.
After=dnsmasq.service firewalld.service

[Service]
Type=simple
ExecStartPre=/var/www-py/service/start StartPre
ExecStart=/var/www-py/service/start Start
ExecStopPost=/var/www-py/service/start StopPost

[Install]
WantedBy=multi-user.target
サービスから呼ぶスクリプトファイル

サービスが起動しているときだけFirewallのポートを空けたいので、firewall-cmdコマンドに --permanent オプションは付けません。

$vi /var/www-py/service/start

#!/bin/bash

if [ "$1" = "StartPre" ] ; then
  firewall-cmd --add-port=8000/tcp --zone=public
elif [ "$1" = "StopPost" ] ; then
  firewall-cmd --remove-port=8000/tcp --zone=public
elif [ "$1" = "Start" ] ; then
  cd /var/www-py/
  python -m CGIHTTPServer 8000
else
  echo "Unknown arg. arg=$1"
fi
ファイルのアクセス権
ls -l  /var/www-py/service/start
-rwxr-xr-x. 1 root root 105 Jun 12 20:36 /var/www-py/service/start
仕上げ
#サービスを起動&停止して
$systemctl start www-py
$systemctl stop www-py

webサーバのプロセスが残っていないか確認します。
$ps -aux | grep python

#サービス起動時にポートが開き、終了時にはポートが閉じているか確認します。
$firewall-cmd --list-ports --zone=public

#問題なければOS起動時にサービスを読み込むようにします。

$systemctl enable www-py

環境

Raspberry Pi3 b

$uname -a
Linux foo-bar.local 4.9.80-v7.1.el7 #1 SMP Thu Mar 15 13:29:03 UTC 2018 armv7l armv7l armv7l GNU/Linux

$ cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 

$ python --version
Python 2.7.5

Release for CentOS Linux 7 (1804) on armhfp

今更ですが・・・
Arm版CentOSの開発をされているFabian Arrotin氏が、
5月10日にRaspberry PiCentOSイメージをリリースされてました。


氏がMLに流したメール
[CentOS-announce] Release for CentOS Linux 7 (1804) on armhfp

Raspberry Piのイメージ

http://mirror.centos.org/altarch/7/isos/armhfp/

  • CentOS-Userland-7-armv7hl-RaspberryPI-GNOME-1804-sda.raw.xz
  • CentOS-Userland-7-armv7hl-RaspberryPI-KDE-1804-sda.raw.xz
  • CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1804-sda.raw.x

最後に

手元のRaspberry Piは全て稼働中なので、新しいディスクイメージを試すだけの余剰機材がないです😰
Raspberry Piを新しく買うことがあれば試してみたいです😃

DD for Windowsでフォールト トレラント ヒープのエラーが発生する

DD for Windows(ディスクイメージの読み書きを行うアプリ)でフォールト トレラント ヒープのエラーが発生したので、情報をネットの海に放流しておきます。

エラーメッセージ

[19164] FTH: (19164): *** Fault tolerant heap shim applied to current process. This is usually due to previous crashes. ***


DD for Windowsを起動したタイミングで出力されます。

動作について

フォールト トレラント ヒープのエラーは発生してますがDD for Windowsは問題なく動作しています。
潜在的にメモリ破壊の問題があるのかも?

環境

Windows10 64bit
DD for Windows Ver.0.9.9.8

Raspberry Pi3 Model B+上でCentOS7が動いたよ

はじめに

Raspberry Pi3 Model B+を入手しました。
日本の技適を通過していないのでWifiを利用できないのが難点ですが。。。


さて本題です、
Raspberry Pi3 Model B+ を既存のCentOS7イメージでブートすると虹色の画面で止まったままになります。
困った困った😖

状況
ファイル名 bootするか?
CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz 虹色の画面で止まる
CentOS-Userland-7-armv7hl-Minimal-1708-RaspberryPi3.img.xz 虹色の画面で止まる

解決方法

FabianArrotin氏がRaspberry Pi3 Model B+で動くようにビルドしたイメージを利用します。


(ファイル)
https://buildlogs.centos.org/rolling/7/isos/armhfp/CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-sda.raw.xz


単にソースをビルドしただけのようでリリース前のテストが十分に行われているのか不明です。
利用時はご注意を。

まとめ

Arm版CentOSで困ったときはArm-devのMLを読み書きするのが良いと思います。

【Raspberry Pi3+CentOS7】NIC2枚差しの設定をした

はじめに

Raspberry Pi3+CentOS7の環境にSoftEtherVPNを設定したときの自分用メモです。

なぜNICを2枚差したのか?

SoftetherVPNの公式にはVPN専用のNICを追加した方が良いと書いてあり、言われるがママ素直にRaspberry PiにUSB-NICを1つ追加しました。
3.6 ローカルブリッジ - SoftEther VPN プロジェクト

まあ当然、追加しただけでは正しく動作しないのでネットの情報を鵜呑み参考にしながら設定を行いました。


以下、作業メモです。

Raspberry Piのネットワーク

192.168.30.40  12:34:56:11:11:11  eth0 (Raspberry Piに元からあるLANポート)
192.168.30.50  ab:cd:ef:22:22:22  eth1 (USB-NIC)

DHCPで固定アドレスを割り当ててます。

問題の発生

WindowsコマンドプロンプトからARPテーブルを確認したところ、

> arp -a
インターネット アドレス 物理アドレス   
192.168.30.40           12-34-56-11-11-11
192.168.30.50           12-34-56-11-11-11

あれ??
異なるIPアドレスに対して同じMACアドレスが割当たってます。
正解は以下の通りです。

192.168.30.40         12-34-56-11-11-11
192.168.30.50         ab-cd-ef-22-22-22

では、ネットワークの設定が正解になるように対応を行います。

異なるIPアドレスMACアドレスが同じになる原因

eth1で受けた通信をeth0から返信しているため。

//tcpdumpコマンドで確認済です。
//ログは省略。

対応方法の概要

NICを2枚を差したときに発生するありがちな問題のようで、マルチホーミング設定を行います。
http://d.hatena.ne.jp/hirose31/20120822/1345626743
http://takumicloud.jp/blog/2015/11/30/nw/
http://ibucket.blogspot.jp/2010/07/centos.html

手順

$cat  /etc/iproute2/rt_tables

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

100     subroute-eth1   <- 追加
$ ip rule add from 192.168.30.50 table subroute-eth1 prio 100
$ ip route add table subroute-eth1 192.168.30.0/24 dev eth1 scope link proto kernel
$ ip route add table subroute-eth1 default via 192.168.30.1 dev eth1

反映されているか確認します。

$ ip route show table subroute-eth1
default via 192.168.30.1 dev eth1
192.168.30.0/24 dev eth1 proto kernel scope link
$ ip rule
0:      from all lookup local
100:    from 192.168.30.50 lookup subroute-eth1
32766:  from all lookup main
32767:  from all lookup default

OSの再起動対応

以下ファイルを作りCentOSの再起動で設定が消えないようにします。
/etc/sysconfig/network-scripts/{rule,route}-eth1

手作業でファイルを作ると間違う可能性があるので、
CentOS7ではnmcliコマンドを使うのを推奨されていますが、
何故か、nmcliコマンドでポリシーベースの設定は出来ないようです(注意、2015年の古い情報です)
https://www.centos.org/forums/viewtopic.php?t=50400
https://mano.xyz/2033/

nmcliコマンドで設定が可能なら誰か教えて欲しい・・・

しかたないので今回は以下のファイルを手作業で作りました。

$ cat /etc/sysconfig/network-scripts/route-eth1
192.168.30.0/24 dev eth1 src 192.168.30.50 table subroute-eth1
default via 192.168.30.1 dev eth1 table subroute-eth1
$ cat /etc/sysconfig/network-scripts/rule-eth1
from 192.168.30.50 table subroute-eth1 priority 100

NetworkManager-config-routing-rulesの起動

CentOS7をMinimalで構築している場合は以下パッケージをインストールして起動します。

$ yum install NetworkManager-config-routing-rules
$ systemctl enable NetworkManager-dispatcher
$ systemctl start NetworkManager-dispatcher

こうしないと /etc/sysconfig/network-scripts/{rule,route}-eth1 の設定がネットワークに反映されません。

NetworkManagerの再起動

$ systemctl restart NetworkManager

再起動後の設定を確認する

$ ip route show table subroute-eth1
default via 192.168.30.1 dev eth1
192.168.30.0/24 dev eth1 scope link src 192.168.30.50
$ ip route
default via 192.168.30.1 dev eth0 proto static metric 100
192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.40 metric 100
192.168.30.0/24 dev eth1 proto kernel scope link src 192.168.30.50 metric 101
$ ip rule
0:      from all lookup local
100:    from 192.168.30.50 lookup subroute-eth1
32766:  from all lookup main
32767:  from all lookup default

その他

VPN接続はパケット転送をおこなわなくても出来るはずなので無効化しています。

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

VPN接続

SoftEtherの設定、サービス起動(systemctlコマンド)とファイヤウォールの設定(firewall-cmd)を行って、Android端末からVPN接続出来ることを確認できました。
めでたしめでたし

最後に

CentOSWindowsと比べるとネットワークを細かく制御できる分めんどうですね。
少しずつ勉強します、めでたしめでたし、



と終わりたいところですが、
OSを再起するとNICを認識する順序によってVPN接続できなくなります、ググるCentOS界隈ではよくある現象でNICの名前(ifcgf-eth0, ifcfg-eth1)を固定する設定が必要になります。
おいおい初見殺しだな


(参考)
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/appe-Consistent_Network_Device_Naming
RHEL7のNICのネーミングルール - めもめも
mrwk update: systemd-udevdによるNIC命名とbiosdevnameがまざって混乱する件
CentOS7におけるNIC命名ルール - 雑木林

【Raspberry Pi3 + CentsOS7】irqbalanceのメモリリークなおったよ

はじめに

先日、irqbalanceが派手にメモリリークしているという日記を書きましたが、
http://d.hatena.ne.jp/ohtorii/20180403/p1

irqbalanceをバージョンアップしたらメモリリークが直りました。

irqbalanceのバージョン情報

メモリリークなし版

$ yum list|grep irqbalance
irqbalance.armv7hl                          3:1.0.7-10.el7              @updates

メモリリークあり版

$ yum list|grep irqbalance
irqbalance.armv7hl 2:1.0.7-1.el7.centos @centos-base_rbf

irqbalanceのメモリ状態

起動直後

$ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 217 0.0 0.2 4212 2084 ? Ss 12:30 0:01 /usr/sbin/irqbalance --foreground

1日経過後

$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root       231  0.0  0.2   4212  2148 ?        Ss   03:00   0:08 /usr/sbin/irqbalance --foreground

まとめ

irqbalanceが派手にメモリリークしていたのは、ハズレのバージョンを引いたのが原因でした。
そもそもCentOSは会社の業務で利用しているので、安定しているイメージを持っていましたが認識を改めるきっかけになりました。