2018年12月5日水曜日

ldap.cidict.cidict

何年前の話してるんだよと言われそうだが、python-ldap で search_s とかで返ってくるディクショナリが case-insensitive じゃないてことで、わざわざ key(属性名)を lower() して reduce() で別のディクショナリ作って in とかで存在確認したりしてたとかもう誰にも言えないけど自分への戒めでここにメモっておきたい。

ldap.cidict.cidict(result[0][1]) で case-insensitive なディクショナリで返してくれるっていや、ホント知らなかった。ググっても意外と少ない。例えば以下のように objectClass の C が大文字でも小文字でも cidict した後なら in で存在チェックできる。

>>> 'objectclass' in ret[0][1]
False
>>> 'objectClass' in ldap.cidict.cidict(ret[0][1])
True

2018年9月28日金曜日

NGINX の proxy_pass のちょっとだけメモ

NGINX の proxy_pass で GET リクエストがどうなっちゃうのかいつもわからなくなるのでメモ。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

まぁ全ては上記の NGINX に書いてあるんだけど、ここでは前方一致のやつだけ。

  • proxy_pass に URI が含まれる場合
  • location /name/ {
        proxy_pass http://127.0.0.1/remote/;
    }
    上記の NGINX ドキュメントページにおける「URI」という用語はどうも NGINX における $uri と同じで、ホスト名より後ろの文字列のようだ。上記例だと /remote/ という部分と思われる。

    この場合は、normalized URI (URI のデコード後: // を / にしたり %xx をデコードしたり)の location に定義した部分に一致する箇所を、proxy_pass て定義した URI 部分に置き換えて後ろのサーバに渡す模様。上記設定例の場合は例えば以下のようになる。
    http://www.example.com/name/foo?bar=baz

    http://127.0.0.1/remote/foo?bar=baz
    (/name/ を /remote/ に置き換えて GET リクエストはそのまま)

  • proxy_pass に URI が含まれない場合
  • location /some/path/ {
        proxy_pass http://127.0.0.1;
    }
    上記 NGINX ドキュメントには、proxy_pass に定義された値がホスト名部分で終わっちゃう場合は request uri ($request_uri)をそのまんま後ろのサーバに渡すって書いてある(または完全な normalized URI = $uri)。

    つまり上記設定例の場合は以下のような感じ。
    http://www.example.com/some/path/foo?bar=baz

    http://127.0.0.1/some/path/foo?bar=baz
    (ホスト名の後ろからはそのまま)

  • proxy_pass で変数を利用している場合
  • location /name/ {
        set myhost myhost.example.com;
        proxy_pass http://$myhost/;
    }
    この例のように proxy_pass 内で変数を利用してしまうと proxy_pass に指定した値のまま後ろのサーバに渡してしまう。つまり:
    http://www.example.com/name/foo?bar=baz

    http://myhost.example.com/
    (とにかく proxy_pass で指定したものしか渡さない)
    もしリクエストを渡したい場合、proxy_pass は以下のようにすれば良いだろう。
    proxy_pass http://$myhost$request_uri;

2018年9月20日木曜日

Dockerfile の EXPOSE もしくは docker run --expose の意味

どこのサイトとは言わないが、docker の EXPOSE について誤った情報が蔓延しているような気がしてならない。

そのサイトは docker0 で繋がっているコンテナ同士の通信のために EXPOSE が必要と書いている。つまり EXPOSE しないと他のコンテナからそのポートにアクセスできないということを言っている。

しかし Dockerfile に EXPOSE なんて書かなくても(docker run で --expose を与えなくても)、あるポートを listen しているコンテナに対して他のコンテナから接続することは可能だ。

嘘だと思うなら以下のような Dockerfile から作ったイメージを --expose せずに docker run して、他のコンテナから「nc -vz <相手> 8080」でもしてみるといい。普通に connected になるはず。
FROM fedora:28
RUN dnf install -y nc
ENTRYPOINT ["/usr/bin/nc", "-kl", "8080"]

私の EXPOSE の理解は以下。間違ってたらコメント等で指摘ください。

EXPOSE で指定されたポートは docker run に -P (--publish-all) を付与した際の対象ポートとなる。つまりコンテナ内のポートを -P でホストの任意ポートにマッピングしたい場合にEXPOSE でポートを明示する必要がある。

2018年8月30日木曜日

curl で Proxy Protocol

NGINX で proxy_protocol を設定しちゃうと、curl なんかのクライアントから直接 NGINX のサーバにアクセスできなくなっちゃって辛い。
検証やテストなんかのときに応答を確認したいのに、上段のロードバランサ等を介さなくちゃならないのは非常に辛い。
そこで curl に Proxy Protocol オプションが無いかなと探してたらありました。7.60.0 からの実装だそうです。


--haproxy-protocol
(HTTP) Send a HAProxy PROXY protocol v1 header at the beginning of the connection. This is used by some load balancers and reverse proxies to indicate the client's true IP address and port.
This option is primarily useful when sending test requests to a service that expects this header.
Added in 7.60.0.

Fedora はまだ追いついてないや(7.59.0)。バックポートもされてない。


2018年8月25日土曜日

fcitx-mozc for Fedora 28

Fedora Copr で fcitx-mozc を build してみました(fedora-28-x86_64 のみ)。

https://copr.fedorainfracloud.org/coprs/ryohayakawa/fcitx-mozc/

よろしければどなたか使っていただけるとうれしかったり。不安な方は src.rpm 見てみて下さい。怪しいことはしてません。

まぁそのうち epel とか Fedora 29 の chroot もやろうかと。


2018年8月6日月曜日

最近の Fedora でマウスが速い

Fedora 27 にアップデートした頃からだったか、マウスの動きがぴゅんぴゅん速くなってしまい年寄りには結構厳しい状態に...仕方ない、xset m でチョチョイと、、、あれ?遅くならない????

と、その後忙しさにかまけて調べず我慢してそのまま使っていたが、最近会社 PC を X1 Carbon 6th にして Fedora 28 を入れていて良い機会なのでこれを直すことに。

最近の Fedora は Wayland がデフォルトのようだが、私は未だに自分の .xinitrc を設定して startx から起動するって流れで Xorg から抜けきれない老人である。しかし Xorg でも libinput というナウな入力デバイスのドライバが主流のようで、Fedora 28 でも /usr/share/X11/xorg.conf.d/40-libinput.conf にデフォルト設定として定義されている。

この libinput だが、アクセラレーションのモードとして adaptive と flat があり、adaptive の場合 xset m が効かないらしい。このモードは libinput コマンドの list-devices オプションで確認できる。adaptive がデフォルトとのこと。

$ sudo libinput list-devices
   :
Device:           TPPS/2 Elan TrackPoint
Kernel:           /dev/input/event15
Group:            10
   :
Accel profiles:   flat *adaptive
Rotation:         n/a

xset が効かないとなるとどうやって,,, ということでググって xinput でやるべしということがわかった。まず、マウスのデバイス名の確認。

$ xinput --list --short
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Synaptics TM3288-011                        id=12    [slave  pointer  (2)]
⎜   ↳ TPPS/2 Elan TrackPoint                      id=13    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]

X1 Carbon の赤ポチは「TPPS/2 Elan TrackPoint」という名前のようで、この設定情報を見てみる。

 $ xinput --list-props "TPPS/2 Elan TrackPoint"
Device 'TPPS/2 Elan TrackPoint':
    Device Enabled (146):    1
    :
libinput Accel Speed (301):    0.000000
    :
この「libinput Accel Speed」を -0.5 くらいに修正してみる。
$ xinput --set-prop "TPPS/2 Elan TrackPoint" "libinput Accel Speed" -0.5


おぉ、遅くなったぞ。良かった。これを .xinitrc に書いておこう。
















2018年8月2日木曜日

gnome-control-center を docker コンテナから(もしくは別のWMから)

docker コンテナから手元のホストの Xorg に gnome-control-center を表示したかったんだけど、単純に gnome-control-center を起動すると画面が空っぽで Devices ってのだけが表示されてる。

以下の環境変数で解決したのでメモ。

XDG_CURRENT_DESKTOP=GNOME gnome-control-center


2018年7月30日月曜日

docker container から X の画面を出すときの SELinux

ドメインソケット経由で docker コンテナからホストの X Server に画面を出すのは Web に結構情報があるのでそれは良いとして、SELinux Enforcing な環境だと Socket へのアクセスが Permission Denied になってちょっとだけハマったので自分のためのメモ。

docker run のときに以下オプションをつけるとうまく行った。
  --security-opt label=type:container_runtime_t

2018年7月23日月曜日

Fedora 28 on Thinkpad X1 Carbon 6th な環境で docker がうまく動かなかった→動いたの個人的メモ

X1 Carbon gen 6th に Fedora 28 をインストールしてるんだけど、どうも docker まわりが不安定になった。が、回復したので適当にメモ。

512GB(SSD) に自動で LVM を切って、普通に dnf install docker したら勝手に
docker-pool なる LV を 178GB もとられてしまった。どうも最近の Fedora の docker は root パーティションがある VG に空きがあると、自動で Storage Driver を devicemapper にしてくれる模様。これはこれで良いのだが、このときの LV のサイズが空き容量の 40% がデフォルトらしい。

これは /usr/share/container-storage-setup/container-storage-setup に以下の定義があることでわかる。
DATA_SIZE=40%FREE

どうも Thin provisioning のようなので、実際に利用されているディスク量しか消費されないのだと思うのだが、vgdisplay で見ると残量が単純に 178GB を引き算された値になってる。何か気持ち悪いので docker を一回アンインストールしてインストール後、 /etc/sysconfig/docker-storage-setup に以下を記述して docker デーモンを起動した。
DATA_SIZE=20G
lvdisplay で docker-pool が 20GB になってることを確認。まぁこれくらいのサイズでいいだろう。

しかし、今度は docker デーモンは立ち上がるものの、試しに docker run -it --rm fedora:28 /bin/bash などとしてもコンテナがすぐ終わっちゃう。/var/log/audit/audit.log になんだか denied がたくさん出てるので、setools を入れて audit2allow でごまかそうと企む。

 とりあえず、tail -f /var/log/audit/audit.log としておいて docker run ... を実行する。吐かれたログをコピペして別ファイルに保存。で、以下のように audit2allow にかませる。
audit2allow -M docker < /tmp/docker-audit

出来た docker.pp ファイルを semodule にかませる
semodule -i docker.pp

これを 2 回繰り返したら docker run ... 出来るようになった。ちなみに追加した許可は以下。

allow container_t container_file_t:chr_file { read write };
allow container_t container_file_t:chr_file { getattr ioctl open };
うーーん、docker をアンインストールしたときに何やら外れたんだろう。もっとスマートな直し方がありそうなもんだけど、まぁいいや。

2018年7月21日土曜日

X1 Carbon 6th Fedora でマウス動かない

現在 Fedora 28 を X1 Carbon 6th にインストール中。
GUI インストーラでマウスが動かない。

カーネルパラメータに以下を追加でおけ。

psmouse.synaptics_intertouch=1 

もしかして茨の道なのかも。

2018年7月8日日曜日

Android Studio で java.lang.ClassNotFoundException: android.view.View$OnUnhandledKeyEventListener

Android Studio の Design がまともに動かずコンポーネントを配置してもそれが Blueprint 上で見えない...んで以下のエラーが発生してる状態。

java.lang.ClassNotFoundException: android.view.View$OnUnhandledKeyEventListener

どうも SDK 28 の問題らしく 27 にしたらエラーが無くなった。以下の情報参照。

https://stackoverflow.com/questions/50856622/failed-to-find-style-coordinatorlayoutstyle-in-current-theme-in-android-studio

Change the android{ in "build.gradle" in app file
compileSdkVersion 28 to compileSdkVersion 27
targetSdkVersion 28 to targetSdkVersion 27
also, try to change implementations like
implementation 'com.android.support:appcompat-v7:28.0.0-alpha3' to
implementation 'com.android.support:appcompat-v7:27.1.1'

2018年6月21日木曜日

2018年5月17日木曜日

OID が英字って

とある 389 Directory Server 系の LDAP サーバの中を調査しているのだが、どうも OID が英文字列で構成されているパターンがある模様。スキーマ定義を見るとこんな感じ。

attributeTypes: ( foo-oid NAME 'foo' DESC ....)
objectClasses: ( bar-oid NAME 'bar' SUP top STRUCTURAL...)
名前に「-oid」とかついている。

OpenLDAP では OID Macro で oid のマクロを定義できるので 389 でもそういうのがあるんだろうと探し回ったが今のところ見当たらない。古いが以下のドキュメントを発見。

https://www.centos.org/docs/5/html/CDS/ag/8.0/Extending_the_Directory_Schema-Managing_Object_Classes.html

The object identifier of the attribute. An OID is a string, usually of dotted decimal numbers, that uniquely identifies an object, such as an object class or an attribute. If an OID is not specified, the Directory Server automatically uses object-class_name-oid. For example, if the object division is created without supplying an OID, the Directory Server automatically uses division-oid as the OID.
どうも OID が指定されていないと勝手に名前に -oid をつけてそれで良しにしてしまうらしい。OID が無い時点でエラーにして欲しいんだが... 管理 GUI でスキーマ作ったりするとそうなってしまうんだろうか?とりあえず以下のようなお勧めできない系の警告も記されていた。もしかしたら今はそんな仕様は廃止されているのかもしれない。

Using an alphanumeric OID such as division-oid is deprecated and strongly discouraged because it will lead to interoperability problems. Red Hat strongly encourages that you request your own OID prefix from IANA (Internet Assigned Number Authority).
 


2018年4月16日月曜日

libvirt の仮想マシン(qcow2)で root パスワードがわからなくて苦しんでる人へ

libvirt (KVM 利用)上で複数台の CentOS7 仮想マシンのインストールをスクリプトで自動化したのはいいのだが、動的にキックスタート定義ファイルの ks.cfg を作るところで root のパスワードがグチャグチャになって virsh console からもログインできない状態に...
virt-viewer を使えない環境なのがさらに致命的。

まぁスクリプトだから最初からまるごと仮想マシンを作り直せば良いんだけど、せっかく作ってあるのでそれを直すことにした。

single user mode でパスワードをリセットしちゃえばいいやと簡単に考えてたら、virsh console から Grub に入るのが結構面倒。時間もあまり無く、virt-viewer も使えない環境ということで、仕方ないので qcow2 のイメージをホストでマウントして /etc/shadow を直すという荒業?を行うことにした。とりあえず仮想マシンは virsh destroy でも何でもいいので停止しておく。

 http://blogger.fastriver.net/2014/06/qcow2.html に書いたがおさらいしておく。 guestmount というコマンドで qcow2 がローカルマウントできる。これを使うためにホストに libguestfs-tools を yum でインストール。
# yum install libguestfs-tools
したらホストで以下コマンドで、qcow2 ファイルをマウント。今回仮想マシンのホスト名が「client2」というやつの復旧をしたかったので以下のようなコマンドになってるけど、まぁ環境に合わせて適宜修正を。あ、あと以下ではマウントポイントが /mnt/tmp ってことで。


guestmount -a /var/lib/libvirt/images/client2.qcow2 -m /dev/centos_client2/root /mnt/tmp

マウントしたら /mnt/tmp/etc/shadow を修正する。具体的には root の 2 フィールド目を $6$ (crypt-sha512)のハッシュに変換。このハッシュは別のマシンのパスワードがわかってるユーザのやつそのまま持ってきてもいいし、以下の python ワンライナーでも作れる。
python -c 'import crypt; print crypt.crypt("適当なパスワード", "$6$適当なsalt")'
あとは、/mnt/tmp/etc/selinux/config も修正して SELinux を一時的に無効にする(これやらないと初回ログインできない)。終わったらアンマウント umount /mnt/tmp/ 。

最後に仮想マシンを起動して、virsh console からアクセスして root の ID/パスワードを入力すると正常にログインできるはず。/etc/selinux/config で「SELINUX=enforcing」に戻すのを忘れずに。




2018年3月22日木曜日

389 Directory Server Admin コンソールからの Start/Stop Directory Server

個人的には全く無問題なのだが、ちょっとワケありで標題の件についてうまく行かない場合があることに気付いた。

389 Directory Server Admin コンソールから「Start Directory Server」または「Stop Directory Server」のボタンをクリックして dirsrv のデーモンをコントロールしようとすると、SELinux Enforcing な環境で以下のエラーが /var/log/dirsrv/admin-serv/error に記録される。

Failed to get load state of dirsrv@xxxxx.service: Access denied
Failed to stop dirsrv@xxxxx.service: Access denied
See system logs and 'systemctl status dirsrv@xxxxx.service' for details.
Failed to get load state of dirsrv@xxxxxx.service: Access denied

以下の URL によれば、どうも既知の問題らしい。SELinux をチョチョイといじれば治るってものでも無いらしい。



The issue is that to do this, we need to give apache (httpd_t, dirsrv_admin_t) control of the initrc_t, which is basically root on the system. We can't do that just to allow communication to systemd, especially when this is an old java based console.
The alternate is to allow dbus_t and policykit access, but this is extremely complex and time consuming to integrate. We feel our energy is better spent elsewhere, as server restarts can be conducted in other ways.
We have previously decided not to fix this issue, advising either the use of specific permissive contexts (semanage permissive -a dirsrvadmin_script_t), or through out-of-band restart.
Red Hat Directory Server 10.1 の Release Note には、known issue として Admin Server の起動だけ失敗するとあるが、上記 URL によれば Directory Server の方もだよと。まぁ複雑だってことで勘弁してもらおう。



2018年3月3日土曜日

TLP on Thinkpad

TLP 入れたって日記を書いたばかりだけど、Thinkpad の場合は追加のパッケージを入れるべきっぽい。tlp stat したら以下の出力に気付いた。

 +++ ThinkPad Battery Features
tp-smapi   = inactive (unsupported hardware)
tpacpi-bat = inactive (kernel module 'acpi_call' not installed)
     : (snip)
 +++ Suggestions
* Install acpi-call kernel module for ThinkPad battery features
* Install smartmontools for disk drive health info

Suggestions とか親切だなと。acpi-call ってのを入れろと。これに関連した情報は以下の TLP 本家にあり。

http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html#fedora

ThinkPads only

ThinkPad specific components for advanced battery functions are not available from the official Fedora repositories. Instead you need the RPM Fusion and TLP repositories (in a root shell):

ということで書かれている通りに dnf


dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
dnf install http://repo.linrunner.de/fedora/tlp/repos/releases/tlp-release.fc$(rpm -E %fedora).noarch.rpm
dnf install akmod-tp_smapi akmod-acpi_call

ちなみに最新版は  tlp-updates-testing リポジトリにあるとのこと。たまに覗いてみるといいらしい。

この acpi_call を入れたら、tlp stat で以下が出力されるようになった。
tpacpi-bat.BAT0.startThreshold                              =     96 [%]
tpacpi-bat.BAT0.stopThreshold                               =    100 [%]
tpacpi-bat.BAT0.forceDischarge                              =      0


TLP 入れたけど wpa_supplicant が先に起動してないとダメ

5 年経った会社のノート(X1 carbon gen 1)のバッテリーの持ちが悪いので、バッテリーだけ買った(会社の経費)んだけど、新品なのにどうも保ちが悪い感じ。販売店に聞いたら「省電力マネージャを開いて満充電容量が既定値でないなら初期不良」とのこと。

upower で確認すると、「energy-full:  49.06 Wh」ってことで、既定値の「energy-full-design:  47.21 Wh」を超えて満充電されていた模様。超える分には問題無いんだろうなぁ。

しかし、仮にこれが異常だったとして upower の出力を販売店に見せても、サポ外とか言われるよなぁ。あぁあの時 Windows マルチブートにしておけばよかった...

まぁ、新しいバッテリーに換装するまで気にしてなかったのも問題だけど、これを機に TLP 入れることに。

が、私の場合システムが起動してから wpa_supplicant を手動で起動してるんだけど、TLP が先に start してると wpa_supplicant が AP に接続できない。何でか理由は面倒だから調べてない。wpa_supplicant を先に起動してから TLP を start すれば行ける。/usr/lib/systemd/system/tlp.service 見ると「After=multi-user.target bluetooth.service NetworkManager.service」になってて、ネットワークが起動してから tlp init start してる模様。

TLP を手動で起動するのもアレなので、wpa_supplicant との絡みについては今後検討することにする。とりあえずは手動で。

TLP の挙動自体に関してはいい感じで、upower の time to empty の値が以前より増えてる感じ。TLP についてはこのまま様子を見てみることにする。


2018年3月2日金曜日

Suica で東京メトロの回数券買えるじゃん

今日東京メトロの券売機で240円区間の回数券を初めて買ったんだけど、Suicaのチャージ分で買えた@赤羽岩淵自動券売機

まぁ当たり前なのかも知れんが、事前にググってて、現金じゃないとダメみたいな情報もあったので何か得した気分。

VIEW カードのチャージ分ポイントゲッツ&回数券割引ゲッツって感じで。


2018年2月27日火曜日

OpenLDAP でクライアントから Paged Results してるのに制限がかかる

どうも OpenLDAP のデフォルトでは、クライアントから Paged Results でページめくり
して全件持ってこようとしても slizelimit にひっかかり持ってこれない (rootdn でやれば
いいじゃんとかそういう突っ込みはいらない)。

どういうことかというと、ldapsearch で  -E pr=100 とかやって 5 ページ目以降をめく
ろうとしても、結果以下のようにデフォルトの slzelimit 500 にひっかかる。

# search result
search: 5
result: 4 Size limit exceeded

# numResponses: 503
# numEntries: 500

(ちなみに相手が AD なら -E pr=xxx を指定すれば何もしなくても全件取れる)

サーバ側に設定がいることを知らんかった。結論
として olcLimits に size.prtotal を無制限にする設定を入れれば回避できた。
hdb なら以下の LDIF で行ける。

dn: olcDatabase={2}hdb,cn=config
changeType: modify
replace: olcLimits
olcLimits: * size.prtotal=none




2018年1月15日月曜日

OpenSSL で暗号化したファイルが復号できない...

機密が含まれるファイルは openldap enc -aes-128-cbc で暗号化して保存してるんだけど、
Fedora 26 アップデートしたら復号できなくなった。。。

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:569:

↑こんな感じのエラーで復号できない。ググって以下で解決。-md md5 オプションを追加してみた。
openssl enc -d -aes-128-cbc -md md5 -in myfile.enc


2018年1月7日日曜日

fcitx-mozc RPM on Fedora

Fedora 27 にしたら google-chrome で日本語入力が出来ないぞ... 今時 ibus 使ってるのが悪いといえばそれまでだが、歳を取るといろんなことが億劫になるので...

まぁ今の今までアップデートをサボって Fedora 24 だったって方が大問題なんだけどね。

おぉ、fcitx 試したら chrome の問題も解消されるじゃん。と、.xinitrc 書き換えるだけで済むかと思いきや、Fedora に fcitx-mozc 無いじゃんか。anthy 嫌いだしなぁ。

Web 調べると OpenSUSE の fcitx-mozc RPM パッケージを Fedora に流用して使ってる人が多いようで。何か解せないので Fedora 27 用の fcitx-mozc を作ることに。

自分のメインマシンを汚したくなかったので Dockerfile で build するときに RUN で rpmbuild して、docker cp でその RPM パッケージを取り出すことに。流行りに乗って github に Dockerfile と spec ファイルを公開してみた。


明日あたり Docker Hub と連携して automated build するようにしてみようかと。
2018/08/26追記:
Copr で Fedora 28 のみ RPM 公開してみてます。
https://copr.fedorainfracloud.org/coprs/ryohayakawa/fcitx-mozc/

以上、老人のやったことなのでボケてたり時代錯誤だったりすることがあるに違いない。何かお気づきのことでもありましたらコメント欄でも良いので教えておくんなまし。