シンプルなアプリケーションランチャー by directory

前回作成したアプリケーションランチャーは登録形のランチャーですが特定のディレクトリを対象とするランチャーを作成してみました。

ディレクトリを対象

chdirに対象のディレクトリを指定 os.chdir(chdir)

import os
# --- default ---
sub_file = "sub_master.py"
chdir = "/home/hoge/bin/app_menu/" # full path

左は自己登録形、右はディレクトリ指定、ファイルをコピーするとリストに反映されます。
リストはlsコマンドを実行、ファイル名で並ぶので多少増えても選択しやすい
サブメニューを呼び出すサブマスターはディレクトリ指定が使いやすい
対象ファイル subファイルを対象

menu = ("ls sub* | grep -v sub*_")

 
前回のcertbot certificates

プログラム中はコピーしながらターミナルから実行します。rangerではyy(ヤンク)pp(コピー)
メニューから実行確認、またひとつ前のプログラム確認

# Listbox (menu)
os.chdir(chdir)
#menu = ("ls ")
menu = ("ls | grep -v *py_ | grep -v *sh_")  # edit
menu = (subprocess.Popen(menu, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')


実行するファイルがひとつのディレクトリにまとまっていればいろいろ便利に使えると思います。

参考
sub_default_dir.py
sub_master_dir.py

 
 

Raspberry Pi 2 web server 更新(certbot renew)

Let’s EncryptのSSL証明書更新がエラーを吐いて更新できなくなってしまいました。debian 11 bullseyeのリリースも間もなくとあって安定版のRasPiOS(May 7th 2021)で再構築してみました。

Timeout during connect

これまではgitのcertbotスクリプトで更新していたのですがなにか仕様変更があるとやはりエラーを吐いて更新に失敗します。それでも修正をしながらなんとか更新できていたのですが今回はどうもうまくいきません。

Timeout during connect (likely firewall problem)

検索するとよくあるようですがパスもfirewallも特に問題ない。

Raspberry Pi2 web server nginx

Raspberry Pi OS Lite May 7th 2021
nginx   1.21.1-1~buster(コンパイル)
php7.3   7.3.29-1~deb10u1
mariadb  1:10.3.29-0+deb10u1
各設定ファイルはそのまま移行

certbot

現在のRasPiOSではパッケージとしてcertbotがあります。python3-certbot-nginxをインストールすることでwebrootで実行可

# apt install certbot python3-certbot-nginx

基本の設定が出来たところで–dry-run 実行。ssh clientはpi zero 母艦のPi4とはvnc接続

# certbot renew –dry-run

特に問題ないようです。続いて本番

# certbot renew

無事更新できました。gitのcertbotスクリプトに比べて断然早い、またLet’s Encryptの仕様変更に対してもcertbotのupgradeで対応することが期待できます。

python3-certbot-nginx

python3-certbot-nginxを導入することでcertbot.timer(自動更新)がデーモンとして起動します。

$ systemctl status certbot.timer


/etc/cron.d/certbotには以下の記載があります。毎日0時と12時にcertbot -q renewを実行しています
/var/log/syslogではcronの実行を確認できますがletsencrypt.logには記載されないようです。

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

certbot certificates

今までは週に1回cronを回してrenewを実行、結果をメールで確認していたのですがcertbot.timerによる自動更新が正常かどうか注意して見ようと思います。
もし更新エラーがあれば早めに把握していれば対策も立てやすいと思います。
有効期限の確認方法はいろいろありますがcertbot certificatesコマンドがシンプル

xterm + ssh

サーバー側で実行するためssh公開鍵認証(空パスワード)を設定、毎回コマンドを打つのも面倒なのでxdotoolに代打ちをお願いします
メニューに登録実行
~bin/app_menu/letsencrypt/certificates.sh

#!/bin/sh
xterm -g 80x25+1124+25 -e ssh xyz81 &
sleep 1
xdotool mousemove 1500 100
xdotool type --delay 70 'sudo certbot certificates'
xdotool key Return

python3(tkinter)
上記で実行した結果を母艦のPi4に取り込めればもっと見やすく加工できます。
サーバー側でスクリプトを1日1回適当な時間に実行(cronを回す)

~/bin/certbot_certificates.sh (chmod 755)
#!/bin/sh
rm ~/*certbot
sudo certbot certificates > $(date +%Y%m%d_%H%M%S).certbot
$ crontab -e
35 06 * * * ~/bin/certbot_certificates.sh

user hogeのホームディレクトリに日付時間.certbotを作成
20210719_063001.certbot
母艦のPi4はこのファイルをプログラム起動時にscpして表示(起動は5秒位かかる)

ラベル欄に読み込んだファイル名表示 daysボタンで終了
通常は1日1回確認でOKですが敢えて最新の情報が必要な時はRETRYボタンを実行
xtermが起動してスクリプトを実行、サーバーのcertbot_certificates.shを実行 pythonプログラムを再起動


プログラムのボタン欄で赤ボタンにするdaysを変更(当サイトは31に設定)30日を切って更新エラーがあると緊迫感がより一層高まるものです。

参考 certificates.py

xdotool実行中はxtermからフォーカスが外れると打ち込みに失敗するのでそっと待ちます(起動まで約10秒)
sleepは環境によって調整

~/bin/app_menu/letsencrypt/certificates_save.sh
#!/bin/sh
xterm -g 80x12+1124+205 &
xdotool key Return
sleep 0.4
xdotool mousemove 1300 300
xdotool type --delay 70 'ssh xyz81'
xdotool key Return
sleep 1
xdotool type --delay 70 '~/bin/certbot_certificates.sh'
xdotool key Return
sleep 5
xdotool type --delay 70 'exit'
xdotool key Return
sleep 0.4
xdotool type --delay 70 '~/bin/app_menu/letsencrypt/certificates.py &'
xdotool key Return
sleep 5
xdotool mousemove 1300 300
xdotool click 1
xdotool key Return
xdotool type --delay 70 'exit'
xdotool key Return

次回の更新は9月14日 6:28(JST)以降からrenew実行可、certbot.timer12時に自動実行される予定です。気を付けて置きたいと思います。

追記 7月23日
更新開始(renew)の期日が気になっていたのでdateコマンドで確認してみました。

$ date -d '2021-10-12 21:28:23 UTC 30 day ago'
2021年  9月 13日 月曜日 06:28:23 JST


多分9月 13日が正解と思います。
終了時messageboxに表示するようにしました。

# quit
def quit_click():
    # renew days
    with open(save_dir+r_file, 'r') as f:
        certificates = f.read()
        d = certificates.find('Date')
        d = (certificates[d+6:d+25])
        cert_renew = ("date -d '" + d + " UTC 30 days ago'")
        cert_renew = (subprocess.Popen(cert_renew, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
        cert_renew = cert_renew.strip()
    # renew days
    if days_renew >= str(30):
        root.option_add('*Dialog.msg.font', 'Helvetica 11')
        messagebox.showinfo('certbot certificates', 'certbot renew \n\n' + cert_renew)
    root.quit()

moOde audio 7.3.0

moOde audio 7.3.0をインストールしました。
登録したサイマルラジオの画像データを少し整理しています。

moOde audio 7.3.0

720 –> 721ではいつからかアルバムの1枚が行方不明になっていたのですが見えるようになりました。バグ修正があったのかもしれません。

moOde audio730はMPDなどupdateされていますが当サイトの環境では特に目立った変化はないようです。
ラジオ関係についてはフォーラムのリリース情報で特に触れていないので720同様マニュアルでラジオデータをインポート

サイマルラジオ

テレビの無い当サイトは基本ラジオ生活を送っています。moOde audio + サイマルラジオを如何に使いやすくするかが鍵
moOde audioではラジオ局名を変更するには一旦削除、再登録が必要ですがロゴ画像は簡単に差し替え可能です。

調布FM
朝の情報番組など聞いていますがイメージに合ったロゴ画像が無い。ホームページの画像イメージを切り取って作成
サイズは300×300


湘南ビーチFM
富士山が小さく見える位置にロゴ貼り付け


こしがやFM
ホームページには女子画像が大きく載っています


コマラジ
ホームページのタイトルロゴと画像を合体

ここのところコミニュティFM放送局は年間数局新規開局しているようです。またCSRA(ListenRadio)からJCBA,FM++に移行、CSRAサーバー(?)からListenRadio配信などいろいろ動きがあります。少し整理しようと考えています。

 

シンプルなアプリケーションランチャー for Raspberry Pi

テキスト表示のシンプルなアプリケーションランチャーです。できるだけ簡単に設置、登録などできるようにしてみました。

アプリケーションメニュー

当サイト(Raspberry Pi)のアプリケーションメニューはpython3/tkinterで作成しています。 メインのボタンメニューは視認性、操作性とも良くダイレクトに実行、またカテゴリボタンは更にサブメニューを実行します。サブメニューは自前のツールやスクリプトを実行することも多くアイコンボタンメニューを作成することは困難になることからリストボックスによるテキスト形式で手軽に登録、再登録可能なサブメニューを作成

任意のディレクトリでファイラー(ranger)を起動

サブメニュー

雛形のサブメニューを作成
~/bin/app_menu/sub_default.py
雛形の”xxx”は変更しない
# — default — sub_file = “xxx”

雛形が決まったらコピー sub_menu.py
このときsub_file = “sub_menu.py”に変更
プログラム変更が可能になります 取り敢えずラベルカラーとボタンカラーを変更
デフォルトは’TButton’

メニュー項目はコマンドechoを実行してリストボックスから読み込みます。リストボックスは空白(space)があると分割してリスト表示 menu_listのechoコマンドは逆スラッシュで繋いで打ち込みやすくします。各文字列にspaceを含めることは出来ません。 select_selectionはリストの文字列から先頭2文字を取得 program_selectionで識別して実行

メニュー内で実行する際は関数を実行すると見やすくなります

sub_menuを呼び出すsub_master.py

devilspie2

Raspberry Pi(LightDM)は空いているスペースにウインドウを起動します。特に小さいウインドウは使いにくくなるので任意の位置に固定します。

$ sudo apt install devilspie2

http://git.savannah.gnu.org/cgit/devilspie2.git/plain/README

当サイトで使っているオプションを記載しています(– はコメント)

~/.config/devilspie2/applications.lua

----------------------------------------------------
-- devilspie2 - Lua-based window matching utility --
----------------------------------------------------
-- get_window_name()
-- get_application_name()
-- get_class_instance_name()
-- pin_window()
-- shade()
-- minimize()
-- make_always_on_top()
-- set_window_workspace(1)
-- undecorate_window()
-----------------------------------------------------

if (get_window_name()=="menu master") then
  set_window_geometry2 (1460,220,226,205)
end
if (get_window_name()=="menu sub") then
  set_window_geometry2 (1233,220,226,205)
end

ウインドウの取得はget_window_name()が扱いやすいと思います。(ウインドウタイトル)
pythonプログラムではroot.title(‘menu sub’)

ターミナルから$ xwininfo で取得できます。
位置、サイズの並びが違うので注意
+値を記載

devilspie2は自動で起動しないので~/.config/autostartに新規作成
~/bin/app_menu/sub_master.pyはLXPanelなど使いやすいところから起動、もしくは同様に作成
~/.config/autostart/devilspie2.desktop

[Desktop Entry]
Type=Application
Name=Devilspie2
Exec=devilspie2

参考

sub_default.py
sub_master.py
sub_menu.py
sub_system.py

 

 

dd tools(archives tool) 続き

前回より引き続きテストを続行、現在は各ボタンの挙動もほぼ問題ないレベルになっていると思います(ほぼです)。deComp Toolはunarとunpigzをひとつのボタンにして拡張子で判断するようにしました。
Compression ToolはParallel Implementation系をメインとしてatoolは控え選手とすることにします。カレントディレクトリ変更の際などリスタートするのは仕様です。

Archives deComp Tool


unarをデフォルトの展開ツールとしてunpigzをひとつのボタンにした
aunpack unpは取り敢えずそのまま
Compボタンは同じディレクトリでCompression Tool起動

unar + unpigz
pigzの展開コマンド(unpigz)はgzip zipの展開に対応、展開に関しては大幅な短縮は期待できませんが各コマンドに対して30%〜40%の展開時間短縮が見込めます。容量の大きいファイルについては一定のメリットがありますがアーカイブファイルは圧縮時同様工夫(tar)が必要になります。
unpigzは単一ファイルのみ実行させることにして拡張子だけでは判断できないzipはlsarを実行3行目にデータが無い場合単一ファイルとみなしてunpigzを実行します。
通常アーカイブファイル(gzip)は(“.tar.gz”)または(“.tgz”)になっていると思います。
変数aにはリストで選択したファイル(ディレクトリ)名が入っています。末尾7文字が(“.tar.gz”)ならunar、以下3文字(“.gz”)はunpigz、以外はunar
拡張子が(“.zip”)でlsarの出力がnotならunpigz、以外はunar
送り先のunar_click() unpigz_click()のselect_selection()はコメント

def unar_unpi_click():
    global mark
    b = ""
    select_selection()
    if mark == 1:
        return
    else:
        ext = a[-7:]
        if ext == ".tar.gz":
            unar_click()
        else:
            ext = a[-4:]
            if ext == ".zip":
                b = ("lsar " + a + " | awk 'NR==3'")
                b = (subprocess.Popen(b, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
                b = b.strip()
                if not b:
                    unpigz_click()
                else:
                    unar_click()
            else:
                ext = a[-3:]
                if ext == ".gz":
                    unpigz_click()
                else:
                    unar_click()

テスト

$ lsar moode-r721-iso.zip
moode-r721-iso.zip: Zip
moode-r721-iso.img


tar.gz
unar


img.gz
unpigz


zip
unpigz


zip
unpigz


zip
unar


7z
unar

Compression Tool


コマンドボタンはParallel Implementationをメインにしてapackボタンを1つ残しています。プログラムはそのままあるのでボタンプログラムのコメントを入れ替えるだけで変更可能
リストボックスはリンクファイル、実行ファイルを非表示にした
file_dir_list
— | grep -v ‘@$’ | grep -v ‘*$’ | sort”)

テスト
サイズの小さいアーカイブファイルでテスト deComp Toolで展開

unarからrarファイルOK

展開したディレクトリ(projects)を各形式で圧縮


pixxとapackの出力は同じファイル名になるのでリネーム


apackから実行した各コマンドはpixxより少し小さくなっています
pbzip2は差が大きかったので圧縮率(-6 から -9)に変更
xz 7z形式もある程度のサイズまでストレス無く圧縮できます

イメージファイル
旧バージョンになったmoode audio720をイメージファイルにした(moode720-210506.img)を圧縮


zipの13m25sに対してpigzは4m33sといい結果が出ています。
圧縮率
pigz -6
pixz -6
pbzip2 -9

Pi4のCPUパワーでは大きいサイズのファイル圧縮はpigzがベスト。
圧縮速度の兼ね合いになりますが一定サイズ以内であればpbzip2 pixzも充分メリットが得られると思います。

参考
dd_archives.py.20210623
dd_comp.py.20210623

Top