Yura YuLife

ITエンジニアの覚え書き。

シェルスクリプトで日付が有効かをチェックし、開始・終了日間でループする

シェルスクリプトで、特定の日付間のログのみを抽出する等の処理をする際に、日付でループするコードの例です。

サンプルコード

loop_date.sh

#!/bin/bash

# 有効な日付ではない場合は終了する関数
function check_date() {
    date -d "$1" || exit 1
    return 0
}

# 引数の数をチェック
if [ $# -ne 2 ]; then
    echo "使い方: ./loop_date.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]"
    exit 1
fi

# 日付が有効かをチェック
check_date $1
check_date $2

# 開始日 < 終了日になっているかをチェック
if [ $1 -gt $2 ]; then
    echo "開始日は終了日よりも前にしてください"
    exit 1
fi

BEGIN=$1
END=$2
CURRENT=$BEGIN

# 開始日〜終了日までループ
while true; do
    # ここに日付毎の処理を書く
    echo "処理: $CURRENT"

    if [ "$CURRENT" = "$END" ]
    then
    break
    fi

    # 日付を1日インクリメント
    CURRENT=$(date -d "$CURRENT 1day" "+%Y%m%d")
done

動作例

$ ./loop_date.sh 20151201 20151205
2015年 12月  1日 火曜日 00:00:00 JST
2015年 12月  5日 土曜日 00:00:00 JST
処理: 20151201
処理: 20151202
処理: 20151203
処理: 20151204
処理: 20151205

$ ./loop_date.sh 20151130 20151201
2015年 11月 30日 月曜日 00:00:00 JST
2015年 12月  1日 火曜日 00:00:00 JST
処理: 20151130
処理: 20151201

$ ./loop_date.sh 20151131 20151205
date: `20151131' は無効な日付です

$ ./loop_date.sh 20151205 20151201
2015年 12月  5日 土曜日 00:00:00 JST
2015年 12月  1日 火曜日 00:00:00 JST
開始日は終了日よりも前にしてください

$ ./loop_date.sh
使い方: ./date_loop.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]

参考URL

CSSで等幅フォントの指定

ウェブサイトやブログ記事でソースコードなどを掲載する場合の、等幅フォントの設定例です。

はてなブログ<pre class="code"></pre>に適用されるCSSに、日本語にも強いソースコード向けの等幅フォントRicty Diminishedを追加しています。

pre.code {
  font-family: 'Ricty Diminished', 'Monaco', 'Consolas', 'Courier New', Courier, monospace, sans-serif;
}
<pre class="code">
  def main():
      print "ABCDEFGH"
      print "おはよう"
</pre>

参考URL

シェルスクリプトで正規表現マッチ

シェルスクリプトで引数による条件分岐をする際にif文の列挙やcase文を利用する場合は多々あると思いますが、 単純に引数のチェックのみを行いたいときはbash正規表現マッチで調べるのが簡単です。

bashでの正規表現マッチ

例えば、第一引数が正規表現^h.+ge$とマッチしているかを調べる場合には、以下のように記述します。

if [[ "$1" =~ ^h.+ge$ ]]; then

if文内で=~で比較すると正規表現比較になります。 このとき、正規表現はダブルクォートで囲わない点に注意。囲ってしまうと普通の文字列比較になってしまいます。

#!/bin/bash
# 第一引数は start, stop, restartのいずれか

if [ $# -ne 1 ];then
    echo "Usage: $ ./hoge.sh (start|stop|restart)"
elif [[ "$1" =~ ^(start|stop|restart)$ ]]; then
    /path/to/hoge $1
else
    echo "不明な引数です: $1"
    exit 1
fi

参考URL

Rundeckでユーザの追加とプロジェクトへのアクセス権限の設定

Rundeckのデフォルトユーザはadminのみです。管理者が1人の場合はadminのみで十分ですが、複数人で管理する場合は適切な権限を付与するべきです。

そこで、特定のプロジェクトのみ閲覧・編集できるユーザを作成する場合は、設定ファイルを追加・編集することで対応できます。

この記事ではdeveloperというユーザを作成し、SomeProjectOtherProjectに対して全権限を設定する場合の手順を説明します。

動作環境

  • Ubuntu 14.04 LTS
  • Rundeck 2.6.2

ユーザの追加

developユーザを追加し、ログインできるようにします。

$ sudo vi /etc/rundeck/realm.properties

#
# This sets the default user accounts for the Rundeck app
#
admin:admin,user,admin,architect,deploy,build
# 以下の行を追記
# ID: developer, PW: devpass の一般ユーザを作成
developer:devpass,user

上記設定ではパスワードが平文になっていますが、以下の手順でMD5のハッシュにすることも可能です。

$ sudo java -cp /var/lib/rundeck/bootstrap/jetty-all-7.6.0.v20120127.jar org.eclipse.jetty.util.security.Password developer devpass
devpass
OBF:1vn41vu91vo41xfj1vmy1vv11vny
MD5:dc067f8a150df19383bc33d7ac9032f7
CRYPT:de6e61/yPOdQg

$ sudo vi /etc/rundeck/realm.properties

# 平文ではなくハッシュ値のパスワードを登録
developer: MD5:dc067f8a150df19383bc33d7ac9032f7,user

特定プロジェクトへのアクセスを許可

Rundeckは/etc/rundeck/以下の*.aclpolicyファイルを読んでいるので、今回はdeveloperユーザ用のaclpolicyファイルを追加します。

$ sudo vi /etc/rundeck/developer.aclpolicy

# developerユーザのプロジェクト毎のアクセス権限の設定
description: Project settings for developer user
context:
  project: 'SomeProject|OtherProject' # SomeProjectとOtherProjectの2プロジェクトに対する権限の設定
# 上記プロジェクトに関する全権限を許可
for:
  resource:
    - allow: '*'
  adhoc:
    - allow: '*'
  job:
    - allow: '*'
  node:
    - allow: '*'
by:
    username: developer

---

# developerユーザのrundeck全般のアクセス権限
description: Rundeck settings for developer user
context:
  application: 'rundeck'
for:
  resource:
    - equals:
        kind: project
      deny: [create]  # プロジェクトの作成は禁止
    - equals:
        kind: system
      deny: [read]    # システム情報の閲覧禁止
    - equals:
        kind: user
      deny: [admin]   # ユーザ情報の編集禁止
  project:
    - match:
        name: 'SomeProject|OtherProject'  # SomeProjectとOtherProjectの2プロジェクトのみ設定の閲覧可能
      allow: [read]
by:
  username: developer

ブラウザからdeveloperユーザでRundeckにログインし、SomeProjectOtherProjectの2つが表示されたら成功です。

参考URL

Redmineのトップメニューにリンクを追加する

検証環境

Redmineのトップメニューにリンクを追加

Redmineの上部には、ホーム、マイページ、プロジェクト等のメニューが並んでいますが、ここに任意のメニューを追加する方法です。 プラグインを用いる方法が一般的だと思われますが、今回は手っ取り早くredmineのファイルを直接編集してしまいます。

Redmineのディレクトリに移動してredmine.rbをバックアップ

$ cd /path/to/redmine/lib/
$ cp redmine.rb redmine.rb-backup

redmine.rbを編集

$ vi redmine.rb
Redmine::MenuManager.map :top_menu do |menu|
  menu.push :home, :home_path
  menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? }
  menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural
  menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true
  menu.push :help, Redmine::Info.help_url, :last => true
  # トップメニューにリンクを追加
  menu.push :link1, "http://example.com/"
  menu.push :link2, "http://example.net/"
end

これでWebサーバをリロードしてページを更新すると、トップメニューのプロジェクトとヘルプの間あたりにリンクが表示されます。

紹介しておいてなんですが、かなり横着な方法なので、参考URLの記事のようにプラグインを利用したほうがいいですね。

参考URL