有効期限付きで仮想マシンを配布したい

プロジェクトN有効期限付きの仮想マシンを配布したい プロジェクトN
この記事は約10分で読めます。

序章

ナマケモノの回想シーン

暗転からゆっくりとスポットライトが一点、中央のナマケモノに当たる。
ナマケモノは思い悩むように頭を抱えている。

ああ、この悩み…。
WorkWaveDriveShieldExmentベースで作成したアプリ…
どうすれば、皆に使ってもらえるのだろう。

突然、ナマケモノが頭を持ち上げる。
目には閃いたばかりのアイデアの光が

そうだ!仮想環境だ!
OracleのVirtualBoxにExmentを構築し、
パッケージ化してダウンロード出来れば…。

しかし、再び顔を曇らせる

でも、Linuxで動くシェルが書けない…
どうすればいい?

ナマケモノ君の周りが暗くなり
孤独と絶望が漂う!

シェル作ってもらえないかなぁ…?
しかも、無料で?

No!
そんな時間ないし、
しかも、タダでなんて(怒)!

ごめんなさい。
そこまで、シェルに精通してないわ。

ああ、やはり答えはNoか。
タダで作成するのは、無理があるよね…。

その時、神からのお告げが

aiに手伝ってもらいなさい。今は無料のaiが豊富にあるはずじゃ。
例えば、GeminiとかChatGPTとか…


頑張れ!幸運を祈る!

そうか、その手があったか!

必死にネットを検索するナマケモノ君

そして、僕は「wrtn(リートン)」を見つけた。
無料でGPT-4 Turboを使えるんだ!

よし、これでVirtualBoxの仮想環境を有効期限付きで作成できる!
ありがとう、リートン。
君のおかげで僕のアイデアは形になるはずだ!

ChatGTPとの対話

あなたは、優秀なプログラマーです。

下記の前提条件を踏まえ動作内容を実行するスクリプトを作成して下さい。

前提条件
 ①GUI要素の実装にはzenityを使用
 ②同じ階層にconfigファイルを設ける
 ③configファイルに記載されている有効期限を使用する


動作内容
 ①ゲストOS上で起動
 ②有効期限が表示される
 ③有効期限を過ぎていない場合は、そのまま正常起動する
 ④有効期限が過ぎている場合は、システムをシャットダウンする

こんな感じでチャットを始めれば、GTPは答えてくれるハズだが?

以下のバッシュスクリプトは、指定された前提条件と動作内容に基づいて作成されています。

このスクリプトは、同じ階層にあるconfigファイルから有効期限を読み込み、
その有効期限に基づいてシステムを起動またはシャットダウンします。

configファイルは、EXPIRATION_DATE=YYYY-MM-DDという形式で
有効期限を設定する必要があります。

#!/bin/bash

# configファイルの読み込み
source ./config

# 現在の日付を取得
CURRENT_DATE=$(date +%Y-%m-%d)

# 有効期限の表示
zenity --info --text="有効期限: $EXPIRATION_DATE"

# 有効期限を過ぎているかどうかを確認
if [[ "$CURRENT_DATE" > "$EXPIRATION_DATE" ]]; then
    # 有効期限が過ぎている場合、システムをシャットダウン
    zenity --warning --text="有効期限が過ぎています。システムをシャットダウンします。"
    shutdown now
else
    # 有効期限内の場合、通常起動
    zenity --info --text="有効期限内です。システムを起動します。"
fi

このスクリプトを実行する前に、
実行権限を与える必要がある場合があります。
これは、以下のコマンドを使用して行うことができます。

script_name.shは、スクリプトのファイル名に置き換えてください。

chmod +x script_name.sh

configファイルは以下のように設定されている必要があります。

EXPIRATION_DATE=2024-12-31

このスクリプトは、システムの有効期限が過ぎているかどうかに基づいて、
ユーザーに情報を提供し、適切なアクションを取ります。

有効期限が過ぎている場合は、システムを安全にシャットダウンすることで、
不正なアクセスや使用を防ぎます。

このコードの内容だと、
即時シャットダウンしてしまう。

警告を表示した後、60秒くらいでシャットダウンしないと
有効期限を変更する方法がなくなるな!

即時シャットダウンから60秒後に変更してもらおう。

即時シャットダウンではなく、
60秒後にシャットダウンするように変更して下さい

指定された要件に合わせてスクリプトを修正しました。

このスクリプトは、configファイルから有効期限を読み取り、
その有効期限に基づきシステムをシャットダウンするか正常に起動するかを決定します。

有効期限が過ぎている場合、
ユーザーに通知した後、60秒後にシステムをシャットダウンします。

#!/bin/bash

# configファイルから有効期限の読み込み
source ./config

# 現在日付の取得
CURRENT_DATE=$(date +%Y-%m-%d)

# 有効期限の表示
zenity --info --text="有効期限: $EXPIRATION_DATE"

# 有効期限が過ぎているかの確認
if [[ "$CURRENT_DATE" > "$EXPIRATION_DATE" ]]; then
  # 有効期限が過ぎている場合、60秒後にシステムをシャットダウン
  zenity --info --text="有効期限が過ぎています。60秒後にシステムをシャットダウンします。"
  sleep 60
  shutdown now
else
  # 有効期限内の場合、正常起動
  zenity --info --text="有効期限内です。システムを起動します。"
fi

このスクリプトは、
configファイルに指定された有効期限を読み込み、現在の日付と比較します。

有効期限を超えている場合は、
ユーザーに60秒後にシステムがシャットダウンされることを通知し、
sleep 60コマンドを使用して60秒間待機した後、
shutdown nowコマンドでシステムをシャットダウンします。

有効期限内の場合は、システムが正常に起動します。

ついでに、このスクリプトの名前を考えてもらおう。

実行されるスクリプトの内容を加味したファイル名を考えて下さい。

スクリプトの機能に基づき、
ファイル名を「expire_check_shutdown.sh」とします。

この名前は、
「有効期限をチェックし、期限切れの場合にシャットダウンする」
というスクリプトの動作を適切に反映しています。

あっ そうだ!
このスクリプトは、どこに保存すればいいんだ?
これも聞いてみよう!

作成されたシェルは、
どの階層のディレクトリーに置けばいいですか?

このスクリプトは、
configファイルと同じ階層のディレクトリに置く必要があります。

スクリプト内で source ./config というコマンドを使用しており、
これは現在の作業ディレクトリにある configファイルを読み込むことを意味します。

したがって、スクリプトと configファイルは同じフォルダ内に配置してください。

また、スクリプトを実行する前に、
スクリプトファイルに実行権限を与える必要があります。

これは、ターミナルで以下のコマンドを使用して行います

※script_name.sh は、スクリプトの実際のファイル名に置き換えてください

chmod +x script_name.sh

この手順により、スクリプトは実行可能になります。

そして、スクリプトを実行する際には、
スクリプトが存在するディレクトリに移動するか、
もしくはスクリプトのフルパスを使用して実行してください。

まてよ。
このままでは、電源投入後にシェルが実行されないぞ!
どうすればいいんだろう?

そんなときは

電源投入時に自動的に、このスクリプトが実行する方法を教えて。

電源投入時に自動的にスクリプトを実行させるには、
いくつかの方法がありますが、

CentOS 7の場合、
一般的にはsystemdサービスを使用する方法と
cronの@reboot機能を使用する方法があります。

ここでは、systemdサービスを作成する方法を説明します。

1.systemd サービスファイルの作成

/etc/systemd/system/ディレクトリに
.service拡張子を持つサービスファイルを作成します。

例えば、script_service.serviceという名前でファイルを作成します。

以下の内容をファイルに記述します。

※ExecStartのパスは、
スクリプトの実際のパスに置き換えてください。

vim /etc/systemd/system/script_service.service
 [Unit]
 Description=My startup script service
 After=network.target

 [Service]
 Type=simple
 ExecStart=/path/to/your/script_name.sh

 [Install]
 WantedBy=multi-user.target

2.systemd サービスの有効化

サービスファイルを作成した後、
新しいサービスをリロードしてsystemdに認識させます。

systemctl daemon-reload

作成したサービスを有効化し、自動起動を設定します。

systemctl enable script_service.service

サービスをすぐに開始するには、以下のコマンドを実行します。

systemctl start script_service.service

これで、システムの起動時に指定したスクリプトが自動的に実行されるようになります。

スクリプトが期待通りに動作するか確認するために、
システムを再起動してテストすることをお勧めします。

そもそも、実行するシェルは、どこに保存するのがベターなんだ?
これも聞いてみよう!

スクリプトの名前は「expire_check_shutdown.sh」として、
systemd サービスを使用してシェルを実行する場合に、
「expire_check_shutdown.sh」は、どこのディレクトリーに保存すればいいですか?

systemdサービスを使用してスクリプトexpire_check_shutdown.shを実行する場合、スクリプトの保存場所は厳密に決まっているわけではありませんが、
管理しやすいように標準的なディレクトリに保存することが推奨されます。

Linux システムでは、カスタムスクリプトやシステム用のスクリプトを
以下のディレクトリに配置するのが一般的です。

/usr/local/bin/

このディレクトリは、
システムが管理するパッケージ管理システムによってインストールされたプログラム以外の、ユーザーが追加したプログラムやスクリプトに使用されることが多いです。

システム全体で利用されるスクリプトに適しています。

/opt/

特に大規模なソフトウェアやアプリケーションを
インストールする場合に使用されることが多いディレクトリです。

スクリプトに関連する他のファイルや設定が多数ある場合は、/opt/以下に専用のディレクトリを作成して管理することができます。

そのため、expire_check_shutdown.shスクリプトを
/usr/local/bin/に保存することをお勧めします。

これにより、スクリプトはシステム全体で容易に実行可能となり、管理もしやすくなります。

スクリプトの配置と権限設定

1.スクリプトを/usr/local/bin/にコピーまたは移動します。
2.スクリプトに実行権限を与えます。

mv /path/to/expire_check_shutdown.sh /usr/local/bin/
※ /path/to/は、現在のスクリプトの場所を指します。
chmod +x /usr/local/bin/expire_check_shutdown.sh

このように配置し権限を設定した後、
systemdサービスファイル内でExecStartパラメータに、
このパス/usr/local/bin/expire_check_shutdown.shを指定することで、

システム起動時に自動的にスクリプトが実行されるようになります。

よし!これで完成した。

さっ 実際に上手くいくかテストするぞ!

実際に動作確認が取れているソースはこちらまで!
ここをクリック

実際には、動作確認が取れたソースが出来上がるまでには、多くの試練が待ち受けていました。

その後のストーリーを知りたい方は、次のページに進んで下さい。

※使用する際は、自己責任でお願い致します。

コメント

タイトルとURLをコピーしました