2018年7月29日日曜日

Mackerel で snap のループデバイス /dev/loop の filesystem Usage 100% を 無視する

TL;DR

mackerel-agent.conf に以下を追記

[filesystems]
ignore = "/dev/loop.*"

何か起きたか

新しいAMIからEC2を起動したらsnap でインストールされたサービスを起動すると、
空き容量には余裕があるにもかかわらず、 disk Usage 100% のアラートが発報される。

何が問題だったか

謎のデバイス /dev/loop0/dev/loop1 が増えており、かつ、それらのディスク使用率が 100% になっていた。

何ものかと調べたところ、どうやら Snappy のものらしい。

snap がデーモンを起こす際 /dev/loop[0-9]+ な命名の ループデバイスを Read Only でマウントするようで、
このデバイスの見かけ上の Usage が 100% なためdisk full アラートが発報されているようだ

解決策

mackerel-agent.conf に以下を追記。

[filesystems]
ignore = "/dev/loop.*"

これで snap がマウントするループデバイスの監視を無視することができる。

備考

なお今回の事の発端は、突然 Ubuntu 16.04 ( と Ubuntu 18.04 ) の
最新 AMI に ssm-agent がプリインストールされるようになった
こと。
この ssm-agent が snap でインストールされている。

2018年5月4日金曜日

【CentOS7】エフェメラルポートを除いた全てのアウトバウンド通信をDROP(もしくはREJECT)

「指定のポート以外の外向きの通信を禁止したい」
「Outbound通信のポートを全塞ぎしたい」
からと言って、安易に以下のように全通信をDROPしてはいけません

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 65498 -p tcp -j REJECT

エフェメラルポートまで閉じてしまうと、
内→外全ての通信が死んでしまうので…。

アウトバウンドのポートを閉じたいときは、
事前に必ずエフェメラルポートを開ける設定を入れなければいけません

加えて、エフェメラルポートを開けるルールは、
全通信をDROPするルールよりも優先度を高くしなければいけません

(ファイアウォールルールの優先度ですが、 65498 とか 65499 とか、この記事では適当な数字を使っています)


というわけで、CentOS7でエフェメラルポートを開けた後、全通信をDROPします。

エフェメラルポートを確認する

sysctl コマンドから

sysctl -a 2> /dev/null | grep net.ipv4.ip_local_port_range

proc ファイルシステムから

cat /proc/sys/net/ipv4/ip_local_port_range

以下、実行結果。

# cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999

CentOS7 デフォルトのエフェメラルポートは
32768 から 60999 までのようです。

エフェメラルポートを開放する

上記で確認した ip_local_port_range を元に、許可ルールを追加します。

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 65498 -p tcp --dport 32768:60999 -j ACCEPT

全通信をDROPする

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 65499 -p tcp -j REJECT

reload して設定を反映する

firewall-cmd --reload

ついでにループバック通信を許可する

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 65497 -p tcp -d 127.0.0.0/8 -j ACCEPT
firewall-cmd --reload

2018年4月1日日曜日

AWS ElastiCache Redis クラスターのメンテナンスについて

  • replica ロールのノード宛のメンテナンスの場合は瞬断も発生しない(若干の性能劣化はある)。特段対応は必要無し。
  • primary ロールのノード宛のメンテナンスの場合は、 Redis Cluster が有効/無効か、 MultiAZ が有効/無効かによって対応が変わる。
  • 詳細はこちら: ノードの置換 - Redis 用 Amazon ElastiCache

2018年2月6日火曜日

【1分かからずにできる】Linuxから(curlで)LINEに通知メッセージを送る - LINE Notify

めちゃくそ簡単でした。

以下のURLにアクセスします。

https://notify-bot.line.me/my/

「トークンを発行する」をクリックします。

「トークン名」を入力し、

通知の送信先を選択し、トークンを発行します。

※自身もしくはグループのみが選択できます。
 画像は自身への通知(1:1でLINE Notifyから通知を受け取る)を選択しています。

「発行したトークン」をコピーします。

以下を実行します。

curl https://notify-api.line.me/api/notify -X POST -H 'Authorization: Bearer <発行したトークン>' -F 'message=帰りたい'

おわり。

以下、レスポンス。

{"status":200,"message":"ok"}

2018年2月4日日曜日

dpkg/apt/rpm/yumでインストールしたパッケージについて、パッケージの情報やファイルのインストール場所等を確認する

パッケージをインストールしたは良いけど、
どこに何が展開されたか?を確認したいとき用。

以下コマンドで確認できる。

RedHat系の場合

rpm -lqi <パッケージ名>

Debian系の場合

dpkg -s <パッケージ名>
dpkg -L <パッケージ名>

以下、具体例。

  • rpm -lqi <パッケージ名>
$ sudo rpm -lqi openldap-clients
Name        : openldap-clients
Version     : 2.4.44
Release     : 5.el7
Architecture: x86_64
Install Date: Fri 04 Sun 2018 10:00:00 AM JST
Group       : Applications/Internet
Size        : 583815
License     : OpenLDAP
Signature   : RSA/SHA256, Fri 11 Aug 2017 03:38:04 AM JST, Key ID 24c6a8a7f4a80eb5
Source RPM  : openldap-2.4.44-5.el7.src.rpm
Build Date  : Fri 04 Aug 2017 11:24:19 PM JST
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.openldap.org/
Summary     : LDAP client utilities
Description :
OpenLDAP is an open-source suite of LDAP (Lightweight Directory Access
Protocol) applications and development tools. LDAP is a set of
protocols for accessing directory services (usually phone book style
information, but other information is possible) over the Internet,
similar to the way DNS (Domain Name System) information is propagated
over the Internet. The openldap-clients package contains the client
programs needed for accessing and modifying OpenLDAP directories.
/usr/bin/ldapadd
/usr/bin/ldapcompare
/usr/bin/ldapdelete
/usr/bin/ldapexop
/usr/bin/ldapmodify
/usr/bin/ldapmodrdn
/usr/bin/ldappasswd
/usr/bin/ldapsearch
/usr/bin/ldapurl
/usr/bin/ldapwhoami
/usr/share/man/man1/ldapadd.1.gz
/usr/share/man/man1/ldapcompare.1.gz
/usr/share/man/man1/ldapdelete.1.gz
/usr/share/man/man1/ldapexop.1.gz
/usr/share/man/man1/ldapmodify.1.gz
/usr/share/man/man1/ldapmodrdn.1.gz
/usr/share/man/man1/ldappasswd.1.gz
/usr/share/man/man1/ldapsearch.1.gz
/usr/share/man/man1/ldapurl.1.gz
/usr/share/man/man1/ldapwhoami.1.gz
  • dpkg -s <パッケージ名>; dpkg -L <パッケージ名>
$ sudo dpkg -s ldap-utils
Package: ldap-utils
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 675
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Source: openldap
Version: 2.4.42+dfsg-2ubuntu3.2
Replaces: openldap-utils, openldapd, slapd (<< 2.2.23-0.pre6)
Provides: ldap-client, openldap-utils
Depends: libc6 (>= 2.14), libldap-2.4-2 (= 2.4.42+dfsg-2ubuntu3.2), libsasl2-2
Recommends: libsasl2-modules
Suggests: libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal
Conflicts: ldap-client, openldap-utils, umich-ldap-utils
Description: OpenLDAP utilities
 This package provides utilities from the OpenLDAP (Lightweight
 Directory Access Protocol) package. These utilities can access a
 local or remote LDAP server and contain all the client programs
 required to access LDAP servers.
Homepage: http://www.openldap.org/
Original-Maintainer: Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>

$ dpkg -L ldap-utils
/.
/usr
/usr/bin
/usr/bin/ldapmodify
/usr/bin/ldapexop
/usr/bin/ldapurl
/usr/bin/ldapsearch
/usr/bin/ldapwhoami
/usr/bin/ldapcompare
/usr/bin/ldappasswd
/usr/bin/ldapmodrdn
/usr/bin/ldapdelete
/usr/share
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/ldif.5.gz
/usr/share/man/man1
/usr/share/man/man1/ldapmodify.1.gz
/usr/share/man/man1/ldappasswd.1.gz
/usr/share/man/man1/ldapmodrdn.1.gz
/usr/share/man/man1/ldapsearch.1.gz
/usr/share/man/man1/ldapcompare.1.gz
/usr/share/man/man1/ldapdelete.1.gz
/usr/share/man/man1/ldapadd.1.gz
/usr/share/man/man1/ldapwhoami.1.gz
/usr/share/man/man1/ldapurl.1.gz
/usr/share/man/man1/ldapexop.1.gz
/usr/share/doc
/usr/share/doc/ldap-utils
/usr/share/doc/ldap-utils/README.Debian
/usr/share/doc/ldap-utils/copyright
/usr/bin/ldapadd
/usr/share/doc/ldap-utils/changelog.Debian.gz

2018年2月3日土曜日

【コピペ用Tips】ldapsearchコマンド

# vars
_ldapuri=ldap://ldap.example.com/
_binddn=cn=user01,ou=administrators,dc=example,dc=com
_basedn=dc=example,dc=com

# command
ldapsearch -v -LLL -H $_ldapuri -D $_binddn -W -b $_basedn "(objectClass=*)"

ちょっとだけ解説。

  • -v: 詳細を出力する(stderrへ出力)
  • -LLL: レスポンスをコメントなしでLDIF形式で出力する
  • -H: 接続するLDAPサーバのURIを指定
  • -D: bindユーザのDN(distinguished name)を指定
  • -W: bindユーザのパスワードをプロンプトから入力する
  • -b: サーチベースDNを指定
  • "(...)": LDAPフィルタ

Ubuntu、CentOSへのインストールについてはこちら

2018年2月2日金曜日

Ubuntuにldapsearch/ldapadd/ldapmodify/ldapwhoami等各種コマンドをインストール

結論から。

sudo apt -y install ldap-utils

無事インストールできました。

$ ldapsearch -V
ldapsearch: @(#) $OpenLDAP: ldapsearch  (Ubuntu) (May 30 2017 19:20:53) $
        buildd@lgw01-18:/build/openldap-JXEADB/openldap-2.4.42+dfsg/debian/build/clients/tools
        (LDAP library: OpenLDAP 20442)

CentOS だったらこんな感じですね。

sudo yum -y install openldap-clients
$ ldapsearch -V
ldapsearch: @(#) $OpenLDAP: ldapsearch 2.4.44 (Aug  4 2017 14:23:23) $
        mockbuild@c1bm.rdu2.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/clients/tools
        (LDAP library: OpenLDAP 20444)

普段 CentOS ユーザなので、ちょっと迷いました。

$ sudo apt list *openldap*
Listing... Done
golang-openldap-dev/xenial 0.2-1 all

$ sudo apt list *ldap*
Listing... Done
aolserver4-nsldap/xenial 0.8-4build1 amd64
argonaut-ldap2zone/xenial 0.9.2-1 all
autofs-ldap/xenial-updates 5.1.1-1ubuntu3.1 amd64
autofs5-ldap/xenial-updates 5.1.1-1ubuntu3.1 all
bind9-dyndb-ldap/xenial 8.0-4 amd64
buildapp/xenial 1.5.5-1 amd64
courier-authlib-ldap/xenial 0.66.4-3build1 amd64
courier-ldap/xenial 0.68.2-1ubuntu7 amd64
dlz-ldap-enum/xenial 1.0.3-1 amd64
dovecot-ldap/xenial-updates,xenial-security 1:2.2.22-1ubuntu2.4 amd64
erlang-eldap/xenial 1:18.3-dfsg-1ubuntu3 amd64
freeradius-ldap/xenial-updates,xenial-security 2.2.8+dfsg-0.1ubuntu0.1 amd64
fts-fai-ldap/xenial 1.1-2 all
fts-ltsp-ldap/xenial 1.1-2 all
fusiondirectory-plugin-ldapdump/xenial 1.0.8.8-3ubuntu2 all
fusiondirectory-plugin-ldapmanager/xenial 1.0.8.8-3ubuntu2 all
fusionforge-plugin-authldap/xenial 6.0.3+20151023-1ubuntu1 all
fusionforge-plugin-sysauthldap/xenial 6.0.3+20151023-1ubuntu1 all
golang-github-go-ldap-ldap-dev/xenial 0.0~git20150817.24.12f2865-1 all
golang-openldap-dev/xenial 0.2-1 all
gosa-plugin-ldapmanager/xenial 2.7.4+reloaded2-9ubuntu1 all
isc-dhcp-server-ldap/xenial-updates 4.3.3-5ubuntu12.7 amd64
jmeter-ldap/xenial 2.11-5 all
kamailio-ldap-modules/xenial 4.3.4-1.1ubuntu2 amd64
krb5-kdc-ldap/xenial-updates 1.13.2+dfsg-5ubuntu2 amd64
lcmaps-plugins-basic-ldap/xenial 1.6.1-3 amd64
ldap-account-manager/xenial 5.2-1ubuntu1 all
ldap-account-manager-lamdaemon/xenial 5.2-1ubuntu1 all
ldap-auth-client/xenial 0.5.3 all
ldap-auth-config/xenial 0.5.3 all
ldap-git-backup/xenial 1.0.7-1 all
ldap-utils/xenial-updates,xenial-security 2.4.42+dfsg-2ubuntu3.2 amd64
ldap2dns/xenial 0.3.1-3.1 amd64
ldap2zone/xenial 0.2-8 amd64
ldapscripts/xenial 2.0.6-1ubuntu1 all
ldaptor-doc/xenial 0.0.43+debian1-7 all
ldaptor-utils/xenial 0.0.43+debian1-7 all
ldapvi/xenial 1.7-10 amd64
lemonldap-ng/xenial 1.4.6-3 all
lemonldap-ng-doc/xenial 1.4.6-3 all
libapache-authznetldap-perl/xenial 0.07-6 all
libapache-session-ldap-perl/xenial 0.4-1 all
libapache2-mod-ldap-userdir/xenial 1.1.19-2.1 amd64
libapache2-mod-ldap-userdir-dbg/xenial 1.1.19-2.1 amd64
libapache2-mod-vhost-ldap/xenial 2.4.0-1 amd64
libapache2-mod-webauthldap/xenial 4.7.0-3build1 amd64
libaprutil1-ldap/xenial 1.5.4-1build1 amd64
libauthen-simple-ldap-perl/xenial 0.3-1 all
libdbd-ldap-perl/xenial 0.20-1 all
libghc-ldap-dev/xenial 0.6.10-5 amd64
libghc-ldap-doc/xenial 0.6.10-5 all
libghc-ldap-prof/xenial 0.6.10-5 amd64
libkf5ldap-dbg/xenial 15.12.3-0ubuntu1 amd64
libkf5ldap-dev/xenial 15.12.3-0ubuntu1 amd64
libkf5ldap5/xenial 15.12.3-0ubuntu1 amd64
libkldap4/xenial 4:4.14.10-1ubuntu2 amd64
libldap-2.4-2/xenial-updates,xenial-security,now 2.4.42+dfsg-2ubuntu3.2 amd64 [installed]
libldap-2.4-2-dbg/xenial-updates,xenial-security 2.4.42+dfsg-2ubuntu3.2 amd64
libldap-java/xenial 4.18+dfsg1-1 all
libldap-ocaml-dev/xenial 2.1.8-10build1 amd64
libldap2-dev/xenial-updates,xenial-security 2.4.42+dfsg-2ubuntu3.2 amd64
liblemonldap-ng-common-perl/xenial 1.4.6-3 all
liblemonldap-ng-conf-perl/xenial 1.4.6-3 all
liblemonldap-ng-handler-perl/xenial 1.4.6-3 all
liblemonldap-ng-manager-perl/xenial 1.4.6-3 all
liblemonldap-ng-portal-perl/xenial 1.4.6-3 all
libmono-ldap4.0-cil/xenial 4.2.1.102+dfsg2-7ubuntu4 all
libmono-system-ldap-protocols4.0-cil/xenial 4.2.1.102+dfsg2-7ubuntu4 all
libmono-system-ldap4.0-cil/xenial 4.2.1.102+dfsg2-7ubuntu4 all
libmozilla-ldap-perl/xenial 1.5.3-2build2 amd64
libnet-ldap-filterbuilder-perl/xenial 1.0004-1 all
libnet-ldap-perl/xenial 1:0.6500+dfsg-1 all
libnet-ldap-server-perl/xenial 0.4-2 all
libnet-ldapapi-perl/xenial 3.0.3-7build5 amd64
libnss-ldap/xenial 265-3ubuntu2 amd64
libnss-ldapd/xenial 0.9.6-3 amd64
libpam-ldap/xenial 184-8.7ubuntu1 amd64
libpam-ldapd/xenial 0.9.6-3 amd64
libroot-net-ldap-dev/xenial 5.34.30-0ubuntu8 amd64
libroot-net-ldap5.34/xenial 5.34.30-0ubuntu8 amd64
libsasl2-modules-ldap/xenial 2.1.26.dfsg1-14build1 amd64
libtest-net-ldap-perl/xenial 0.07-1 all
libvt-ldap-java/xenial 3.3.8-1 all
libvt-ldap-java-doc/xenial 3.3.8-1 all
lua-ldap/xenial 1.1.0-1-geeac494-6 amd64
lua-ldap-dev/xenial 1.1.0-1-geeac494-6 amd64
nordugrid-arc-ldap-infosys/xenial 5.0.5-1ubuntu1 all
nordugrid-arc-ldap-monitor/xenial 5.0.5-1ubuntu1 all
openvpn-auth-ldap/xenial-updates 2.0.3-6.1ubuntu0.16.04.1 amd64
pdns-backend-ldap/xenial 4.0.0~alpha2-3build1 amd64
perdition-ldap/xenial 2.1-2build1 amd64
phamm-ldap/xenial 0.6.2-1.2ubuntu1 all
phamm-ldap-amavis/xenial 0.6.2-1.2ubuntu1 all
phamm-ldap-vacation/xenial 0.6.2-1.2ubuntu1 all
php-horde-ldap/xenial 2.3.2-1ubuntu1 all
php-ldap/xenial 1:7.0+35ubuntu6 all
php-net-ldap/xenial 1:1.1.5-3ubuntu1 all
php-net-ldap2/xenial 2.2.0-1ubuntu1 all
php-net-ldap3/xenial 1.0.3-1build1 all
php7.0-ldap/xenial-updates,xenial-security 7.0.22-0ubuntu0.16.04.1 amd64
phpldapadmin/xenial-updates,xenial-security 1.2.2-5.2ubuntu2.1 all
postfix-ldap/xenial-updates 3.1.0-3ubuntu0.2 amd64
proftpd-mod-ldap/xenial 1.3.5a-1build1 amd64
pure-ftpd-ldap/xenial 1.0.36-3.2build1 amd64
python-django-auth-ldap/xenial 1.2.7+dfsg-1 all
python-django-auth-ldap-doc/xenial 1.2.7+dfsg-1 all
python-django-ldapdb/xenial 0.2.0-1 all
python-django-python3-ldap/xenial 0.9.8-1 all
python-ldap/xenial 2.4.22-0.1 amd64
python-ldap-dbg/xenial 2.4.22-0.1 amd64
python-ldap3/xenial 1.0.3-1 all
python-ldappool/xenial 1.0-1ubuntu1 all
python-ldaptor/xenial 0.0.43+debian1-7 all
python-mockldap/xenial 0.2.5-1 all
python-mockldap-doc/xenial 0.2.5-1 all
python-schooltool.ldap/xenial 1.0.2-0ubuntu1 all
python3-django-python3-ldap/xenial 0.9.8-1 all
python3-ldap3/xenial 1.0.3-1 all
ruby-activeldap/xenial 4.0.3-2 all
ruby-activeldap-doc/xenial 4.0.3-2 all
ruby-ldap/xenial 0.9.16-1build6 amd64
ruby-net-ldap/xenial 0.8.0-1 all
ruby-omniauth-ldap/xenial 1.0.4-4 all
shelldap/xenial 1.3.1-2 all
simpleid-ldap/xenial 1.0.1-1ubuntu1 all
smbldap-tools/xenial-updates 0.9.9-1ubuntu1.16.04.2 all
sssd-ldap/xenial-updates,xenial-security 1.13.4-1ubuntu1.10 amd64
strongswan-plugin-ldap/xenial-updates 5.3.5-1ubuntu3.5 all
sudo-ldap/xenial-updates 1.8.16-0ubuntu1.5 amd64
tryton-modules-ldap-authentication/xenial 3.8.0-1 all
uwsgi-plugin-ldap/xenial-updates 2.0.12-5ubuntu3.1 amd64
web2ldap/xenial 1.1.43~dfsg-1 all

# どれ・・・?

2018年2月1日木曜日

Windows Subsystem for Linux (WSL, 旧 Bash on Windows) でデフォルトで使用するユーザを変更する。

以下を実行します。

ubuntu config --default-user djeeno

内訳は以下。

<インストールしたWSLのディストリビューション> --default-user=<ユーザ名>

ユーザのパスワードがわからなくなったときの初期化用途にも使えるようですね。

ubuntu config --default-user root

デフォルトユーザを root に戻して、 passwd コマンドでパスワード初期化、って流れらしいです。


ちなみに、Bash on Windows時代は、以下コマンドで変更していました。

lxrun /setdefaultuser djeeno

現時点 (2018/02/01) では、実行してもエラーになるだけで、変更できません。

C:\> lxrun /setdefaultuser djeeno
警告: lxrun.exe は、Linux ディストリビューションのためにレガシ Windows サブシステムを構成するだけに使用されます。
ディストリビューションは次の Windows ストアを訪問してインストールすることができます:
https://aka.ms/wslstore

エラー: 0x80070002

2018年1月31日水曜日

Webページを完全に単一のHTMLファイルで保存(cssや画像もhtml内に埋め込み)

Chromeの話です。

Ctrl+Sで保存しようとすると、以下2通りの選択があります。

  • ウェブページ、HTMLのみ
  • ウェブページ、完全

しかし何れも一長一短で、
「HTMLのみ」は、単純にhtmlファイルダウンロードするだけなので、cssやなどはリンクのままになり、
逆に「完全」は、リンクされているcssやイメージ画像などを全てダウンロードしてしまいます。


そこでこちら。

  • ウェブページ、1つのファイル

こいつを使うと、cssはファイル内に埋め込まれ、
画像ファイルはbase64変換され、
ひとつのHTMLファイルとしてWebページを保存できます。

Web魚拓などにも使われている技術らしいですね。
絶対にロストしたくないページについてはこれで
ローカルにでもアーカイブするのがよさそうです。


以下、機能の有効化の手順です。

まずは以下URLをChromeで開きます。

chrome://flags/#save-page-as-mhtml

すると以下画面が表示されるため、 Sage Page as MHTML
有効にするをクリックします。

☑ Sage Page as MHTML チェックが入ったことを確認し、
今すぐ再起動をクリックします。

以後、 ウェブページ、1つのファイル が利用できるようになります。


MHTMLってのがあるんですね。

2018年1月30日火曜日

ntpdateコマンドの代わりにchronyで強制同期

chronyでntpdateコマンドの代わりに強制同期

時刻を強制同期するときにはCentOS6まではntpdateコマンドを使用していましたが、
CentOS7からntpdがプリインストールされなくなり、代わりに
chronyがインストールされるようになりました。

今までは以下で強制的に時刻同期していましたが、
ntpdateコマンドもntpdと同様デフォルトでは入っていないため、
とりあえず以下打って強制同期、ってことができなくなりました。

ntpdate ntp.nict.jp

同等のことをchronyで行うには、以下を実行します。

chronyc makestep

以下のように応答があれば問題なく同期できています。

$ sudo chronyc makestep
200 OK

以下のように出力される場合、多分chronydが起動していません。

$ sudo chronyc makestep
506 Cannot talk to daemon
$ sudo systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Wed 2018-01-30 09:00:00 JST; 30s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: ***** ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: ***** ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: ***** (code=exited, status=0/SUCCESS)
     :
     :

-dオプションでデバッグ出力。

$ sudo chronyc -d makestep
Resolved 127.0.0.1 to 127.0.0.1
Resolved ::1 to ::1
Opening connection to /var/run/chrony/chronyd.sock
Could not connect socket : No such file or directory
Opening connection to 127.0.0.1:323
Sent 28 bytes
Timeout 0.999909 seconds
Could not receive : Connection refused
Sent 28 bytes
Timeout 1.999987 seconds
Could not receive : Connection refused
Sent 28 bytes
Timeout 3.999990 seconds
Could not receive : Connection refused
Opening connection to ::1:323
Sent 28 bytes
Timeout 0.999927 seconds
Could not receive : Connection refused
Sent 28 bytes
Timeout 1.999986 seconds
Could not receive : Connection refused
Sent 28 bytes
Timeout 3.999988 seconds
Could not receive : Connection refused
506 Cannot talk to daemon

デーモンを起動してリトライ。

$ sudo systemctl start chronyd
$ sudo chronyc makestep
200 OK

どこと同期しているか、は以下で確認できます。

chronyc sources

以下、出力例。

$ sudo chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ nipper.paina.net              2   6   377    26   +779us[ +793us] +/-   27ms
^+ y.ns.gin.ntt.net              2   6   377    25   -434us[ -434us] +/-  101ms
^+ 122x215x240x52.ap122.ftt>     2   6   377   157   -397us[ -373us] +/-   49ms
^* timpany.srv.jre655.com        2   6   377    26   -820us[ -806us] +/-   47ms

2018年1月29日月曜日

jqコマンドが入っていない環境でJSONを整形

jqコマンドなんてバイナリ一個なんだから何も考えず放り込んじゃっていいじゃん…
って思うんですけど、運用ポリシー的にNGな環境も有るんですよね…。

そんなイケてないポリシーの方をなんとかしろっていう議論は置いておき、
標記、jqコマンドが入っていない環境でJSONを整形する方法です。

めっちゃ簡単です。

19.2. json — 19.2.5. コマンドラインインターフェイス — Python 3.6.3 ドキュメント

JSONをパイプで以下コマンドに渡すだけ。

python -m json.tool

以下、例。

$ echo '{"date":"2018-01-29T10:00:00+0900","place":"workplace","status":["sleepy","hungry","wanna go home"]}' | python -m json.tool
{
    "date": "2018-01-29T10:00:00+0900",
    "place": "workplace",
    "status": [
        "sleepy",
        "hungry",
        "wanna go home"
    ]
}

いい感じにパースしてくれます。

「filterが無い」とか「色が付かない」とか言うわがままは我慢します。
あるだけマシです。

2018年1月28日日曜日

CIDR表記のネットワークアドレスを計算する/指定したネットワークに属するIPアドレス一覧を出力する/そのIPアドレス群のPing応答を確認するスクリプト

CIDR表記のネットワークのネットワークアドレスを出力したり、
ブロードキャストアドレス以外のIPアドレスを一覧出力したり、
またそのIPアドレス群のPing応答を確認したりするbashスクリプトを、
個人的に欲しかったので、作りました。

https://gist.github.com/djeeno/fcd09b666a8e7bd6fc356b5f410f0ff5

CentOS7、Ubuntu16.04、Ubuntu16.04(WSL)、Debian9、macOS High Sierraで動作を確認しています。

使い方を以下に例示。

# IPアドレスを一覧出力: netaddr
$ ip.sh netaddr 192.168.100.50/29
192.168.100.48

# IPアドレスを一覧出力: list
$ ip.sh list 192.168.100.0/29
192.168.100.49
192.168.100.50
192.168.100.51
192.168.100.52
192.168.100.53
192.168.100.54

# IPアドレスに対してPingを飛ばし応答のあったアドレスを出力: inuse
$ ip.sh ping 192.168.100.1/29
192.168.100.49  ttl=64 Linu   time=7.43ms
192.168.100.50  ttl=128 Windows time=8.88ms
192.168.100.54  ttl=64   Linux    time=5.69ms

Ping応答のttlからOSを(ある程度)判別できるので、
「これが何のOSなのか」も横に出力するようにしました。

(と言っても、Linux or UNIX or Windowsの3択ですが…)


適当に立てたマシンがDHCPからどのIPアドレスを振られているか調べる時とか、非常に便利です。

2018年1月27日土曜日

Windowsでhostsをすごく簡単に編集するためのバッチファイル(.bat)

Windowsでhostsをすごく簡単に編集するためのバッチファイル(.bat)

Windowsのhostsファイルってすごく深いところにある上に、
管理者権限で起動しているエディタでないと編集できないっていう、
かなりしんどい仕上がりになっています。


それを解決するのがこちら。

@echo off
start powershell.exe -Command "Start-Process -Verb RUNAS notepad C:\Windows\System32\drivers\etc\hosts"

たった二行だけのバッチファイルですが、非常に有用です。
僕自身、これを使わない日はありません。


これを起動すると、管理者権限でメモ帳を起動し、hostsファイルを開いてくれます。
つまり、このバッチを実行するだけで、hostsファイルが編集できるということ。

例えば、下記パスに設置しておけば、

%USERPROFILE%\edit-hosts.bat

Windows + R を押下し、

ファイル名を指定して実行から、edit-hostsと入力、実行すると、

この通り!


Windowsエンジニアにとっては結構革命的なことだと思うんです、これ…。

2018年1月26日金曜日

エクスプローラーの何もないところを右クリック→そのパスをカレントディレクトリにコマンドプロンプト(cmd.exe)やPowerShellを起動

長いタイトルですが…。
本当はbashについても書きたかったのを泣く泣く削ってこの長さです。

何かというと、つまりこういうことをします。

デスクトップで右クリックすると、見慣れない

Open with Bash(B)
Open with cmd.exe(C)
Open with PowerShell(P)

というメニューが増えます。

以下画像参照。

こいつらをクリックすると、先程右クリックしたパス、
デスクトップをカレントディレクトリに、
bash、コマンドプロンプト、PowerShellが起動できます。

なんて楽なんでしょう。

エクスプローラー触っているときに「このパスで起動したいな」ってこと、
結構「あるある」じゃないでしょうか。


ということで、どうすれば追加できるか。

管理者権限でコマンドプロンプトを立ち上げて、以下を実行します。

reg add HKEY_CLASSES_ROOT\Directory\Background\shell\OpenWithCmdexe /t REG_SZ /d "Open with cmd.exe(&C)"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\OpenWithCmdexe\command /t REG_SZ /d "cmd.exe"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\OpenWithPowershell /t REG_SZ /d "Open with Powershell(&S)"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\OpenWithPowershell\command /t REG_SZ /d "powershell.exe"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\OpenWithBash /t REG_SZ /d "Open with Bash(&B)"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\OpenWithBash\command /t REG_SZ /d "bash.exe"

以上。


WindowsのTipsを載せていきたいリポジトリ。

https://github.com/djeeno/windows/

2017/01/26 現在 空っぽに近い。

2018年1月24日水曜日

世界一簡単な git コマンドのソースからのインストール for Linux

yum や apt などのパッケージ管理ツールでインストールできる git のバージョンは大抵かなり古いので、僕はいつもソースから最新版をインストールするようにしています。

sudo権限を持つユーザで以下を実行するだけ。

UbuntuなどDebian系の場合

install_git_from_source() { sudo bash -cx 'apt-get update && apt-get -y install lib{curl4-gnutls,expat1,ssl,z}-dev gcc gettext make wget && cd /usr/local/src && BASE_URL="https://www.kernel.org/pub/software/scm/git/" && wget -cSv "${BASE_URL}$(wget -qO- ${BASE_URL} | grep -o -E "git-[0-9\\.]+.tar.gz" | sort -uV | tail -n 1)" && tar vxzf $(basename $_) && cd $(basename -s .tar.gz $_) && make prefix=/usr/local all && make prefix=/usr/local install && git --version'; } && install_git_from_source

CentOSなどRHEL系の場合

install_git_from_source() { sudo bash -cx 'yum makecache fast && yum -y install {curl,expat,gettext,openssl,zlib}-devel gcc make perl-ExtUtils-MakeMaker wget && cd /usr/local/src && BASE_URL="https://www.kernel.org/pub/software/scm/git/" && wget -cSv "${BASE_URL}$(wget -qO- ${BASE_URL} | grep -o -E "git-[0-9\\.]+.tar.gz" | sort -uV | tail -n 1)" && tar vxzf $(basename $_) && cd $(basename -s .tar.gz $_) && make prefix=/usr/local all && make prefix=/usr/local install && git --version'; } && install_git_from_source

世界一簡単。

[user@localhost ~]$ git --version
git version 2.16.1

2018年1月22日月曜日

gogsをソースからインストールするとデータベースにSQLiteを選択できない?

gogsをソースからインストールするとデータベースにSQLiteを選択できない?

golang製のgithubクローンのgitサーバ【gogs】を、
ソースからインストールしたのですが、
タイトルでハマりました。

以下実際にやったインストール手順。

go get -u github.com/gogits/gogs
cd $GOPATH/go/src/github.com/gogits/gogs
go build

http://gogs.local:3000/

何故かSQLite3がドロップダウンリストに表示されません。

調べてみたところすぐに原因は判明しました。

From source - Gogs

めっちゃ普通に公式に書いてありました。

以下、抜粋。

A couple of things do not come with Gogs automatically, you need to compile Gogs with corresponding build tags.
Available build tags are:

  • sqlite3: SQLite3 database support
  • pam: PAM authentication support
  • cert: Generate self-signed certificates support
  • miniwinsvc: Builtin windows service support (or you can use NSSM to create a service)

For example, you want to support all of them, first delete directory
$GOPATH/pkg/${GOOS}_${GOARCH}/github.com/gogits/gogs and then do:

$ go get -u -tags "sqlite pam cert" github.com/gogits/gogs
$ cd $GOPATH/src/github.com/gogits/gogs
$ go build -tags "sqlite pam cert"

If you get error: fatal error: security/pam_appl.h: No such file or directory, then install missing package via sudo apt-get install libpam0g-dev.

要は上の通り「-tagsオプションをつけてビルドしてくださいね」ということでした。

実際にやってみると、

無事データベースにSQLite3を選択できるようになりました。

2018年1月21日日曜日

Markdown(.md)でキーボードのキーを表記する

Markdown(.md)でキーボードのキーを表記する。

こんな感じ: Ctrl+C, Ctrl+P

どこで見つけたかすっかり忘れましたが、以来重宝しています。


書き方はとっても簡単。

これが、

<kbd>Ctrl</kbd>

こうなる。

Ctrl


意外と知らない方が多いみたい。

2018年1月20日土曜日

LinuxのコマンドでGithubに登録したSSH公開鍵を確認/ダウンロードする方法

LinuxのコマンドでGithubに登録したSSH公開鍵を確認/ダウンロードする方法。

Githubに登録したSSH公開鍵は以下のURLとして公開されています。

https://github.com/$USERNAME.keys

よってcurlなりwgetなりでその内容を取得することができます。

curlの場合。

curl https://github.com/djeeno.keys

wgetの場合。

wget -qO- https://github.com/djeeno.keys

ただ、人によっては複数の公開鍵が登録されているなど、
そのままauthorized_keys等に投げ込むには若干厄介かと。
(少なくとも僕はそうです。)

なので、僕はいつもGithub Pagesでkeysってファイルを公開してます。

curl https://djeeno.github.io/keys

2018年1月19日金曜日

Linuxのコマンドで自分のグローバルIPアドレスを調べる方法(+おまけ【cli.fyi】)

Linuxのコマンドで自分のグローバルIPアドレスを調べる方法(+おまけ【cli.fyi】)。

curl checkip.amazonaws.com
curl cli.fyi/me
curl ifconfig.io
curl ifconfig.me
curl ipinfo.io

bashスクリプトに組み込む時などは、
一番可用性が高そうなcheckip.amazonaws.comを使っています。
ちょっと長いですが。


cli.fyi(cli for your information)は他にも色々できるみたいです。
公式 https://cli.fyi/ を見ると色々載っています。
以下、参考。

  • Crypto Currency Prices(暗号通貨の現在価格)
    • curl cli.fyi/BTC
  • Email Address Information
    • curl cli.fyi/john.doe@10minutemail.com
  • IP Address Information
    • curl cli.fyi/8.8.8.8
  • Media/URL Information
    • curl cli.fyi/https://vimeo.com/231191863
  • Client Information
    • curl cli.fyi/me
  • Domain Whois / DNS information
    • curl cli.fyi/github.com
  • Date/Time Information
    • curl cli.fyi/time
  • Programming Language Links
    • curl cli.fyi/PHP
  • Country Information
    • curl cli.fyi/united-states
  • Popular Emojis(絵文字)
    • curl cli.fyi/emojis
  • Help
    • curl cli.fyi/help

詳細はこちらから。

2018年1月18日木曜日

PowerShellスクリプト(.ps1)をバッチファイル(.bat)として実行したい

PowerShellスクリプト(.ps1)をバッチファイル(.bat)として実行したい。

そのような場合には、以下を1行目に追記する。

@setlocal enableextensions enabledelayedexpansion & set "PATH0=%~f0" & PowerShell.exe -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!PATH0:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!

以下、具体例。

@setlocal enableextensions enabledelayedexpansion & set "PATH0=%~f0" & PowerShell.exe -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!PATH0:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!

# 以下、PowerShellスクリプト
while (1) {
  Get-Date
  Start-Sleep 1
}

以上の内容をtest.bat等適当な名前で保存、実行すれば、
PowerShellをバッチファイルとして実行できます。


参考
https://www.pg-fl.jp/program/tips/ps1bat2.htm

2018年1月17日水曜日

【ワンライナー】カレントディレクトリ配下のディレクトリ群をzip

【ワンライナー】カレントディレクトリ配下のディレクトリ群をzip


find ./* -maxdepth 1 -type d | xargs -P254 -I@ zip -qr "@.zip" "@"
  • findコマンド
    • -maxdepthオプションで階層を指定。
      • 今回の-maxdepth 1の場合、探しに行くのは1階層まで。
    • -typeオプションで対象を指定。
      • dでディレクトリ、fでファイルを示す。
  • xargsコマンド
    • 今回はパイプ|から渡された標準入力を処理している。
    • -Iオプションで、標準入力から受け取った内容を展開する。
      • 今回の-I@の場合、zip -qr "@.zip" "@"は以下のように展開される。
        • zip -qr ディレクトリ名.zip ディレクトリ名
    • -Pオプションで、複数プロセスを立ち上げ並列処理を実施する。
      • 今回の-P254の場合、254個まで並列化する。

昔はこんな感じでやってました。拙い感じが懐かしいです。

ls | while read LINE; do zip -qr "$LINE".zip "$LINE"; done

2018年1月16日火曜日

htaccess等による30xリダイレクトが使えない際のページリダイレクト

htaccess等による30xリダイレクトが使えない際のページリダイレクト


サーバ側で301、302リダイレクトができない状況下で、
特定のURLへのアクセスを、特定ページへリダイレクトさせたい、というお話。

window.location.hrefに、http-equiv="refresh"もおまけして、
以下な感じのリダイレクト用index.htmlを設置しました。

<!DOCTYPE html>
<html>
<head>
<title>Redirect page</title>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=//djeeeno.blogspot.com/">
<script>window.location.href = "//djeeeno.blogspot.com/";</script>
</head>
<body>
Please click <a href="//djeeeno.blogspot.com/">here</a> if you are not redirected automatically.
</body>
</html>

コピペする際には//djeeeno.blogspot.com/を置換してください。


余談ですが、Googlebotさん的には、以下な感じらしいです。

可能なら、htaccessなり、サーバ側で30xリダイレクトの方が良いみたいですね。


参考
Google がサポートしているメタタグ - Search Console ヘルプ


2018/02/05 追記 そのHTMLの書き方、本当に合ってますか? - HTMLの検証を行う「Nu Html Checker」を以て修正したものを追記しました。

<!DOCTYPE html>
<html>
<head>
<title>Redirect page</title>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=//djeeeno.blogspot.com/">
<script>window.location.href = "//djeeeno.blogspot.com/";</script>
</head>
<body>
Please click <a href="//djeeeno.blogspot.com/">here</a> if you are not redirected automatically.
</body>
</html>

2018年1月15日月曜日

【ワンライナー】世界一簡単なSELinuxの無効化

【ワンライナー】世界一簡単なSELinuxの無効化

早速書くことがないので、SELinuxの無効化のワンライナーでも書いてお茶を濁します。

test -r /etc/selinux/config && sudo su -c '(grep -q ^SELINUX=enforcing /etc/selinux/config && { sed "s/^\(SELINUX=\)\(enforcing\)/$(date +\#\ \%Y\%m\%d\ \#)\1\2\n\1disabled/g" $_ -i_$(date +\%Y\%m\%d_\%H\%M\%S).backup ; setenforce 0 ; })'

動作としては以下。

  • 何かしらのスクリプトに組み込む際、複数ディストリビューションに対応するため、最初に/etc/selinux/configの存在確認を行う。
  • /etc/selinux/configファイルにSELINUX=enforcingもしくはSELINUX=permissiveの記載があれば、
    • /etc/selinux/config_YYYYmmdd_HHMMSS.backupとして、/etc/selinux/configファイルのバックアップを取得する。
    • SELINUX=enforcingもしくはSELINUX=permissiveをコメントアウトし、SELINUX=disabledを追記する。
  • SELinuxが起動している場合、Permissiveモードに変更する。

2018年1月14日日曜日

MarkdownとStackEditでBlogger(改)

前々回、こんな記事を書いたばかりですが、下書きの再編集を行うと改行が消滅したり、
Bloggerから投稿を編集すると、StackEditのMarkdown(.md)ファイルとの
整合性が取れなくなったりと、若干面倒な点があったため、運用方法を変更しました。


以下、記事投稿の手順。

Export to disk

Export as HTMLから

Plain HTMLを選択し、COPY TO CLIPBOARD

あとは、Bloggerに貼り付けて投稿するだけです。


以前の方法よりシンプルで気に入っています。

2018年1月13日土曜日

BloggerでMarkdownのシンタックスハイライト

前回、Bloggerの記事をMarkdown(.md)で書けるようにしたので、
次はコードブロックのシンタックスハイライトに手を加えます。

Bloggerのテーマにjsとcssを追記するだけです。
超簡単。


Bloggerの左ペインテーマ

HTMLの編集

headの終了タグ</head>の行の直前に、以下を追記します。

以下は当ブログ(2018/01/13時点)の例です。
コピペ、もしくは適宜変更してご利用ください。

  <!-- START USER DEFINED AREA -->
  <link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css' rel='stylesheet'/>
  <style>code{font-family:Menlo,"Osaka-等幅",Consolas,"Courier New",Courier,monospace;color:#333;background:#f8f8f8};</style>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/awk.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/erlang.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/erlang-repl.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/go.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/ldif.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/scheme.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/yaml.min.js'></script>
  <script>hljs.initHighlightingOnLoad();</script>
  <!-- END USER DEFINED AREA -->

たったこれだけ。簡単ですね。


2018/01/24 時点追記。

Markdownのキーボードのキー表記のCSSを追加。

  <!-- START USER DEFINED AREA -->
  <link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css' rel='stylesheet'/>
  <style>code{font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;color:#333;background:#f8f8f8};</style>
  <style>kbd{padding:.1em .6em;border:1px solid rgba(63,63,63,0.25);-webkit-box-shadow:0 1px 0 rgba(63,63,63,0.25);box-shadow:0 1px 0 rgba(63,63,63,0.25);font-size:.7em;font-family:sans-serif;background-color:#fff;color:#333;border-radius:3px;display:inline-block;margin:0 .1em;white-space:nowrap}</style>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/awk.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/dos.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/erlang.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/erlang-repl.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/go.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/ldif.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/scheme.min.js'></script>
  <script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/yaml.min.js'></script>
  <script>hljs.initHighlightingOnLoad();</script>
  <!-- END USER DEFINED AREA -->

2018年1月12日金曜日

MarkdownとStackEditでBlogger

当ブログは以下要件を満たすため、記事作成にStackEditを使用しています。

  • blogサービスはbloggerを利用すること。
  • Markdown(.md)を用いて記事を記載できること。

(bloggerが公式でMarkdownサポートしてくれればいいのに…。)


StackEditで編集した記事をbloggerに投稿する際、
投稿事前にレイアウトを確認したかったり、
パーマリンクを編集したかったりしたため、
下書きとしてPublishしています。

以下、手順です。

↓右ペインPublish

Publish to Blogger

file properties

Current file propertiesstatus: draftを追記してOK


しかし、Publish毎度こんなことをしていては、
あまりに面倒くさすぎるので、デフォルト設定を
下書き投稿にできないか、と設定を探したところ、
いい感じのやつがありました。

↓右ペインMore...

Settingsから

↓次の2行を追記します。

newFileProperties: |
  status: draft

これで、新規に作成するファイルのプロパティには、
status: draftが自動で付与されるようになりました。