アレコレ・ティプス

これ便利だな〜と思ったことなど

HAproxy で Basic 認証を使う際の パスワード文字列 エンコード

 
HAproxy における Basic認証のパスワード設定で、” insecure-password “ オプション を使いたくないとき。
パスワード を ハッシュ化する必要がある。
 
その手順 を書き留めておく。
 
 

 
環境:
 
Ubuntu "18.04.4 LTS (Bionic Beaver)"
HA-Proxy version 1.8.8-1ubuntu0.11 2020/06/22
HAproxy docker コンテナ version 2.6.7
 

 
生成手順
 
 
$ sudo apt-get install whois
 
これで ハッシュ化されたパスワードを生成できます。
 

 
 DESを使った 例
 
$ printf  "password12345" | mkpasswd --stdin --method=sha-256
$5$oPP0ueuなんちゃら
 
他にも  MD5, SHA-256 or SHA-512 に HAproxy は、対応しているようです。
HAproxy ver. 2.6.7 デフォルトでは、sha-256 でした。
 

 
 
上記で エンコードした パスワード は  HAproxy の 設定 cfg ファイル の Basic 認証 用 で使用できます。
 
エンコードしない場合は、 insecure-password  オプションを使うことで 対応可能です。
 
haproxy.cfg 内の ユーザーリスト部 ( なければ自分で 記述してOK )
 
以下では is-admin という グループ定義もしています。
 
  userlist basic-auth-list
  group is-admin
 
  user admin  password $5$oPP0ueuなんちゃら             groups is-admin
  user guest  insecure-password guestpassword
 
 
 
参考:こちら より詳細に紹介されています。英文です。

blog.sleeplessbeastie.eu

 

記事更新 : 2023/2/20

ラズパイ MJPG streamer サービスデーモン化

Webカメラ として ラズパイ & MJPG streamer の組み合わせは AIカメラとしても使いやすいし、超便利。
 
そんな中、サービス化・デーモン化 で Permission denied ( パーミッション エラー ) 。
少し躓いた。
UNIT ファイル の挙動、整理のため、メモ。
 
 

f:id:asuki_y:20200514173655p:plain

MJPG-streamer
 

 
 

< 動作前提環境メモ >

 
Raspberry Pi 3 Model B Plus Rev 1.3
・Raspbian GNU/Linux 10 (buster)
・mjpg-streamer が通常動作する環境
・( v4l2-ctl コマンドが 普通に使える状況 )
・普通に使えるUSBカメラ
vim を使っています。 適宜 お好みの テキストエディタで。
 
 

 

手順

 

接続したUSBカメラデバイスIDを取得 
v4l2-ctl --list-devices
 
USB2.0 PC CAMERA (usb-3f980000.usb-1.2):
    /dev/video0
    /dev/video1
 
 
" usb-3f980000.usb-1.2 "
 
これを記録しておく
 
sudo systemctl list-units -t device
 
 
以上の結果より  USBアドレス に該当する行から デバイスID を取得
 
以下  1行、カメラのデバイスID を メモっておいた。
 
sys-devices-*****usb-3f980000.usb-****
 
 
vim /etc/systemd/system/mjpgStreamer.service
 
 

 
UNIT ファイル編集内容
 
[Unit]
# たてるサービスの説明
Description=MJPEG-Streamer
 
After=udev.target
After=sound.target
After=syslog.target
 
# 上記で取得したカメラのデバイスIDをこちらへ反映する
BindsTo=sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.1-1\x2d1.1.1-1\x2d1.1.1:1.0-net-eth0.device
After=sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.1-1\x2d1.1.1-1\x2d1.1.1:1.0-net-eth0.device
 
[Service]
type=simple
# mjpg ストリーマー 起動コマンド。パスワードなど オプションはお好みで変更
ExecStart=/usr/local/bin/mjpg_streamer -i 'input_uvc.so -f 20 -d /dev/video0 -r 640x480 -n -y' -o 'output_http.so -w /var/www -p 18880'
 
[Install]
WantedBy=multi-user.target
WantedBy=sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.1-1\x2d1.1.1-1\x2d1.1.1:1.0-net-eth0.device
# 末尾のこの項目も一応 デバイスIDを反映しておく
 
 

 
(今日の つまずき ポイント)
ただし、service UNITファイルにたいして root権限のままでは、動作できないので注意。(状況によって)
 
生成した UNITファイルの 権限変更を行う。
たとえば mstuser に 権限を与えたければ、
 
sudo chown mstuser:mstuser /etc/systemd/system/mjpgStreamer.service
 
 
( pi ユーザーがよければ、上記 ユーザー名 グループ名は適宜修正してください )
 
 
最後に サービスデーモン化
 
systemctl enable mjpgStreamer.service
 
これで sudo しなくても  MJPG - streamer サーバー が起動・ 実行できた!
 
 

 

参考

 
 
Raspberry PiでUSB Web CAMの動画を配信する ~mjpg-streamer自動化編~
 
 
 
 
 

ラズパイ chromium  を自動起動する

 
目的
 
Raspberry Pi 起動時 chromium自動起動させたい。
 
目次

メインメニュー

Raspberry Pi の設定 "
“ システム "タブ

f:id:asuki_y:20200423123313p:plain

ラズパイ設定
 
“ 自動ログイン “ の ところで  “ 現在のユーザーとしてログインする”  にチェック     しておけば 

f:id:asuki_y:20200423123407p:plain

自動ログイン設定
 

crontab に 1行 追記

起動時に 不要 となるファイルを消しておきます。
 

f:id:asuki_y:20200423123504p:plain

crontab に起動時コマンドを追記
 
 

autostart の 設定・登録

 
$ vi /etc/xdg/lxsession/LXDE-pi/autostart
 
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
 
# 以下追記 #
 
@xset s off
@xset -dpms
@xset s noblank
@chromium-browser --noerrdialogs --kiosk  --incognito  
 
 
 

あとがき: autostart の 場所が変わった

 
昔は ここにあったファイル
vi ~/.config/lxssion/LXDE-pi/autostart
 
こちらに引っ越しになったそう ようですね。
 /etc/xdg/lxsession/LXDE-pi/autostart
 

 
 
詳細は以下参照です。
 
参考  自動 chromum 起動
 
ここ autostart 引っ越し先 について
 
参考:  crontab 起動時 自動 実行
 

Docker 使っていて タブ補完 が不十分だったので 補完機能を強化

 
 
 
docker inspect コンテナ名
 
 
って 入力したいときなどに、OSの環境によっては、 コンテナ名 まで Tab キーで 補完 されません。
 
 
bash-completion  をインストールしているのに、、
 
いまいち 補完 が 不十分 、、
 
というとき、以下で 補完機能を強化できます。
 
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
 
 
これで docker コマンドが快適になった!
 
docker タブ
docker  補完 
 
bash complete , completion で検索してもなかなか 欲しい情報にたどり着かなかったのでメモ。
 

 
 
環境メモ
 
Ubuntu 18.04.4 LTS (Bionic Beaver)
Docker version 19.03.8, build afacb8b7f0
docker-compose version 1.25.4, build 8d51620a
 
参照 : 公式
 
 

Docker インストール ubuntu 18

☐ 目的

サクっと ubuntu 18 に Docker ( CE ) をインストールしたい。
 

☐ 動作環境 確認

 
Ubuntu 18.04.4 LTS (Bionic Beaver)
 
x86_64 / amd64
 
目次
 
 
 

 
まず いつもの。
新しいパッケージ情報にリーチできるようにします。
 
sudo apt-get update
 

☐ リポジトリ 設定

 
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
 
Docker 公式 GPG キー 追加。
 
 
必要に応じてフィンガープリントチェック
 
sudo apt-key fingerprint 0EBFCD88
 
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
 
sudo add-apt-repository \
   $(lsb_release -cs) \
   stable"
 
x86_64 / amd64 の ケース
 
その他は公式を要チェック
 
 
Docker エンジンをインストール
 
sudo apt-get install docker-ce docker-ce-cli containerd.io
 
細かくバージョン 指定してインストールしたい場合も公式をチェックしてから install だ:
 
 
sudo apt-get install docker-ce docker-ce-cli containerd.io
 
インストール完了しました。
 
 
sudo docker --version
 

Docker version 19.03.8, build afacb8b7f0

 

 ☐ 簡易動作確認

sudo docker run hello-world
 
1b930d010525: Pull complete 
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Downloaded newer image for hello-world:latest
 
 
sudo docker ps -a
 

 
 
 
このように hello-world イメージができていれば インストール  OK だと思います。
 
Docker バージョン 17 みたいに 一部 Volume 動作でバグが。。。 とか まではさすが にこれで確認できないですね🤔
 
ーー
 
参照:公式 インストール方法
 
 

 
余談:
 
 昨今 windows OS 管理が面倒で Mac ユーザーになって久しい 今日この頃 ですが、 WSL2 の登場により、
 windows 関連のニュースで最も衝撃 を受けて、Windows 10 Pro が欲しくなりました。 サンドボックス めちゃくちゃいいな。。 サンドボックスに保存機能がついたら Windows 最強では、、、
Windows で 煩わしいと思ってたこと の多くが ふっ飛ぶ 勢い。
 

 
 
 

Node-RED Node-gen で 作ったパーツ を 別の環境で 動作させる

 
 目的
 
nodered-node-gen で作った ノード パーツ モジュール を 作ったところとは別の環境で動作させる。
 
 
( 前回の記事 に合わせた例です )

asuki-yt.hatenablog.jp

この記事で作った ものを 環境移行して動かしてみます。
 
 
 環境メモ
 
移行元 : MacOS High Sierra 10.13.6
node-red-nodegen 0.1.0 コマンドの インストール済み
Nodejs v12.16.1
Node-RED v1.0.4
 
移行先 : Raspberry Pi  - Raspbian GNU/Linux 9 (stretch) ( debian 9.11 )
Nodejs v12.16.1
Node-RED v1.0.4
( node-red-nodegen インストール不要でした )
 

 
 
移行元
~/.node-red/lib/functions/
そこで 作成した 該当する js ファイルと、それに該当するディレクトリを 移行先へコピーする
scp など。
( Format-date.js と node-red-contrib-format-date/配下全て )
 
 
 
 
移行先 の例
~/.node-red/lib/functions
 
 
 
必要な nodejs モジュールなど 準備を先に行っておく
cd ~/.node-red
 
npm install (Node-REDノードで使うNodejsモジュールなど)
 
以後は、前回の記事で作成した node-red-contrib-format-date を例にコマンド 例を かきます。
 
移行コピーしたディレクトリへ移動
必要な nodejs モジュールなど 準備を先に行っておく
cd ~/.node-red/lib/functions/node-red-contrib-format-date
 
リンク引っ張り
sudo npm link
 
リンク生成
cd ~/.node-red/
npm link node-red-contrib-format-date
 
Node-RED を再起動
Raspberry Piなら 例えば 
sudo service nodered restart
 
 
移行できました!
 

 
 私のは動きましたが、 動作確認もしっかりと👍
 
 

NodeRED nodegen における require を使う Nodejs モジュール ( ライブラリ ) 込みのケース

 
 
 目的
 
Nodejs のモジュールを使った Node-RED ノードジェネレータ ( node-red-nodegen ) による ノード 生成方法 を 知る
 
 
< 環境メモ >
 
Nodejs v12.16.1
Node-RED v1.0.4
MacOS High Sierra 10.13.6
 
node-red-nodegen 0.1.0 コマンドの 通常インストール済み
 

 
時間を出力するだけのオリジナルノードを生成してみる。
 
 環境準備
 
( nodejs で使える moment モジュール ( ライブラリ )  を使った Node-gen )
 
Nodejs でつかう モジュール の require 記述
ここでは moment モジュール の require 
 
 
vi ~/.node-red/settings.js
 
221行目前後の " functionGlobalContext " の項目を変更
 
 functionGlobalContext: {
        // os:require('os'),
        // jfive:require("johnny-five"),
        // j5board:require("johnny-five").Board({repl:false})
        moment: require('moment’)    // 外部モジュールの定義を追加
    },
 
コア機能に使うモジュールをインストール。
ここでは、Nodejs モジュール moment を インストール。
 
cd ~/.node-red/
npm install moment
cd
 
これでまず 手元の node-red 上で上記モジュールを使う準備は整った。
 
 
 目的となる function ノードの生成
 
node-red を起動
 
以下 パーツを配置接続
 
真ん中は 普通の function 
 

 
 

 
 
function に記述。
このパーツに 名前をつける
名前: Format date
 
・ コード
var moment = global.get('moment');
msg.payload = moment().format('MMMM Do YYYY:mm:ss a');
return msg;
 
 

 
そして デプロイ。
 
 
 動作確認
 

 
ちゃんと動作している。
 
 
 function ノードの ライブラリ 出力
 

 
“ ライブラリへ保存 "

 
js ファイルとして保存します。
 

 
こうすると 通常 の保存先は、こちら でした。
 
{ ホームディレクトリ }/.node-red/lib/functions/
 
( GUI 上では、 function 。
  CUI 上では、functions となっているのが若干 気になる。。 )
 
ls
 
Format-date.js  ->  保存できている
 
 
 
ここで node-red-nodegen コマンド を実行 !
 
node-red-nodegen ~/.node-red/lib/functions/Format-date.js
 
Success: node-red-contrib-format-date
 
と表示されました。
 
 
ls
Format-date.js                node-red-contrib-format-date/
 
 
jsファイルに定義を追加します
 
vi node-red-contrib-format-date/node.js
 
 
vm.createContext()  の前に定義を追加します。

 
package.jsonファイル の 編集。依存関係を 明記します。
 
vi node-red-contrib-format-date/package.json
 
 
"keywords”   要素の次にでも。
 

 
追記しました。

 
 
cd ~/.node-red/lib/functions/node-red-contrib-format-date
 
sudo npm link
 
( 上記 cd の コマンド 、公式に  誤記? で 存在してなかったので 若干 迷った )
 
 シンボリックリンク を生成します
 
cd ~/.node-red/
 
npm link node-red-contrib-format-date
 
 
これで 生成したノードが使用できるようになりました。
 

 
 
ノードジェネレータ の弱点を鑑みて 生成したノードが  使用できるか否かは、以下公式をチェックです👍
 
 
 
 

 
参照: Node-RED-Node-Gen 公式
素晴らしいツール作りと丁寧なドキュメントに感謝🙏