Let’s Encryptの無料SSL証明書で常時HTTPS化

会社でLet’s Encryptというものを教えてもらった(というか、お前が試せって感じだけど)ので、うちのFreeBSD+Apache2.2なサーバーに導入してみた記録。例によってこの記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

追記(2017/01/11)

「証明書の更新」のコマンド例が間違っていたので修正。(オプションに追加:”–webroot -w”)

追記(2016/07/01)

Let’s Encryptコマンド(Let’s Encryptクライアント)の名称がCertbotクライアントとなり、FreeBSDのパッケージ名、コマンド名も変更となった。変更点は下記の通り。

パッケージ名

py27-letsencrypt から py27-certbot に変更された。パッケージは一度削除してインストールした。

# pkg delete py27-letsencrypt
# pkg install py27-certbot

コマンド名

/usr/local/bin/letsencrypt から /usr/local/bin/certbot に変更になった。

環境

  • FreeBSD 10.3-RELEASE
  • Apache 2.2系
  • 既にhttpで使っているサイトを対象に導入する。

FreeBSD用のCertbotクライアントのパッケージの導入

pkgで導入可能。

# pkg install py27-certbot

証明書の発行

certbotコマンドにcertonlyとつけて実行する。証明書の発行のみ行われる。

# certbot certonly --webroot -w [DocumentRootのパス] -d [ドメイン名] -m [メールアドレス] --agree-tos

ドメイン名へのアクセスチェックが行われるため、DocumentRootに一時的なファイルなどが作成され、letsencryptのサーバーから一時的なファイルへのアクセスが行われる模様。要アクセス権限。

/usr/local/etc/letsencrypt/live/[ドメイン名] 以下に証明書のファイルが生成される。シンボリックリンクになっていて、更新の度にリンク先が新しいファイルになるが、常にこのパスで参照できる。

プラグインが対応しているapache2.4系などは自動的に設定までしてくれるそうだが、apache2.4の環境で試してみたけど使い方がよくわからず、おとなしく証明書の発行を行って、設定は自分で行った。

証明書のインストール

apacheのVirtualHost設定等に下記を設定する。

  • SSLCertificateFile:cert.pem
  • SSLCertificateKeyFile:privkey.pem
  • SSLCertificateChainFile:chain.pem

apacheを再起動してhttpsでのアクセスを確認する。

証明書の更新

よくあるSSL証明書は有効期限が1年などの単位になっているが、この証明書の有効期限は3カ月なので、定期的に更新が必要。

# certbot certonly --webroot -w [DocumentRootのパス] -d [ドメイン名] -m [メールアドレス] --renew-by-default

証明書の発行にも書いたとおり、証明書へのパスの変更はないので、更新が済んだらapacheの再起動でOK。cronで毎月1日に更新するよう設定して様子見中。

httpでのアクセスをhttpsに強制リダイレクト

お手軽に.htaccessにて実施。WordPressのサイトの場合、「BEGIN WordPress」の前に書き加えた。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

mod_rewriteには明るくないが、同じ.htaccess内にRewriteEngine onが2行あっても問題ないらしい。

1つのIPアドレスで、複数のHTTPSサイトを運用する際の注意点

当サーバーの様にIPアドレスの割り当てが1つしかなく、名前ベースのバーチャルホストでHTTPS対応をしようとするとServer Name Indicationの利用が必要となる。サーバー、クライアントの双方て対応が必要だが、当サイトのサーバー(Apache 2.2系)は対応している。

クライアント側は、Windows XP以前のInternet Explorerなどで非対応となっているが、現時点でサポート継続中なOS・ブラウザではそれ程問題ない様に思われる。そのため、当ドメインも常時HTTPS強制としてみた。Windows XPなどを使っている人はせめてWindows 7あたりに更新を。

nsdでDNSサーバー(セカンダリーサーバー編)

(プライマリーサーバー編)

流行りにのってbindを捨ててみた記録。例によってこの記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

環境

  • FreeBSD 9.2-STABLE r258412
  • nsd-4.0.0
  • /usr/local/etc/nsd 以下に設定ファイル等を設置し、/usr/local/etc/nsdにchrootして利用する。(ログだけは/var/log)
  • 各ドメイン(ゾーン)は動的に追加する。(静的にconfigファイル内に記述は行わない)

nsdのインストール

portsを利用する

# portinstall dns/nsd

nsdユーザー / nsdグループ作成

nsdを動作させるユーザーにする。uidとgidは、sendmail(25)に対してFreeBSD portsからpostfixをインストールした際に作成されるユーザー:postfixが125という感じで、bind(53)に対して153を指定した。(既にuid, gidで153を使っている場合は変更すること)

# pw groupadd -g 153 -n nsd
# pw useradd -u 153 -n nsd -g nsd -c "nsd Sandbox" -d / -s /usr/sbin/nologin

nsd-controlを使うための準備

rndcのnsd版の様なもの。鍵の作成などが行われる様だ。

# nsd-control-setup

nsdの設定

/usr/local/etc/nsd/nsd.conf

server:
	username: nsd
	chroot: "/usr/local/etc/nsd"
	zonesdir: "/usr/local/etc/nsd/zones"
	zonelistfile: "/usr/local/etc/nsd/zone.list"
	database: "/usr/local/etc/nsd/nsd.db"
	logfile: "/var/log/nsd.log"
	pidfile: "/usr/local/etc/nsd/nsd.pid"
	xfrdfile: "/usr/local/etc/nsd/xfrd.state"
	xfrdir: "/usr/local/etc/nsd/tmp"
	hide-version: yes

remote-control:
	control-enable: yes
	control-interface: 127.0.0.1
	control-port: 8952
	server-key-file: "/usr/local/etc/nsd/nsd_server.key"
	server-cert-file: "/usr/local/etc/nsd/nsd_server.pem"
	control-key-file: "/usr/local/etc/nsd/nsd_control.key"
	control-cert-file: "/usr/local/etc/nsd/nsd_control.pem"

pattern:
	name: "slavezone"
	zonefile: "%s.zone"
	allow-notify: (プライマリーDNSサーバーのIPアドレス) NOKEY
	request-xfr: (プライマリーDNSサーバーのIPアドレス) NOKEY
	allow-axfr-fallback: yes

serverセクション:主に全体の設定

username
nsdを動作させるユーザー名。最初に作ったnsdユーザーを利用
chroot
chrootするディレクトリを指定する。chroot指定の場合、pidfile, database で指定した項目はchroot先ディレクトリ配下に設置の事。
zonesdir
zoneファイルの保存場所
zonelistfile
動的に追加されたゾーン情報リスト
database
データベース、どうやらzoneファイル等の内容はDB化されてnsdから利用される模様、chrootする場合はchroot先配下を指定の事
logfile
ログファイル
pidfile
プロセスIDが記録されたファイル、chrootする場合はchroot先配下を指定の事
xfrdfile
ゾーン転送に必要なファイル、らしい
xfrdir
ゾーン転送処理に使われるディレクトリ、らしい
hide-version
バージョン情報の応答を行わない様にする(隠す)場合はyes

remote-controlセクション:nsd-controlによるリモートコントロールの設定

control-enable
リモートコントロールを有効にする場合はyes
control-interface
リモートコントロールを待ち受けるためにnsdが待ち受けるIPアドレスを指定する、ここでは127.0.0.1を指定しているが、デフォルト値も127.0.0.1。
control-port
リモートコントロールを待ち受けるためにnsdが待ち受けるポート番号を指定する、ここでは8952を指定しているが、デフォルト値も8952。
server-key-file
server-cert-file
nsd-control-setupによって生成される、サーバーのプライベート鍵と自己署名証明書のパス
control-key-file
control-cert-file
nsd-control-setupによって生成される、リモートコントロールクライアントのプライベート鍵と自己署名証明書のパス

patternセクション:パターンマッチしたゾーンに一括でオプション設定する

name
パターン名、ここで指定したパターン名に対してダイナミックにドメイン追加や削除ができる
zonefile
ゾーンファイルのパス指定、%sはドメイン名に置き換わる(セカンダリー運用だと使わない?)
allow-notify
指定されたIPアドレスからの更新通知の許可設定、ここではプライマリーDNSサーバーのIPアドレスを許可する
request-xfr
指定されたIPアドレスにゾーン転送要求する
allow-axfr-fallback
yesの場合、ゾーン転送時プライマリーサーバーがIXFR(差分転送)に対応してなければAXFR(全文転送)にフォールバックすることを許可する

細かい設定は日本Unboundユーザー会が提供しているnsd.conf(5)の日本語マニュアルも参照の事。
nsd.conf(5) | 日本Unboundユーザー会

必要なディレクトリ、ファイルの作成とchown

# cd /usr/local/etc/nsd
# mkdir zones tmp
# chown -R nsd:nsd /usr/local/etc/nsd
# touch /var/log/nsd.log
# chown nsd:nsd /var/log/nsd.log

起動

# vi /etc/rc.conf
---
nsd_enable="YES"
---
# service nsd start

ドメイン追加

# nsd-control addzone (ドメイン名) slavezone

以下ドメイン分繰り返し。

nsdでDNSサーバー(プライマリーサーバー編)

(セカンダリーサーバー編)

流行りにのってbindを捨ててみた記録。例によってこの記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

環境

  • FreeBSD 9.2-STABLE r258412
  • nsd-4.0.0
  • /usr/local/etc/nsd 以下に設定ファイルやゾーンファイルを設置し、/usr/local/etc/nsdにchrootして利用する。(ログだけは/var/log)
  • 各ドメイン(ゾーン)は動的に追加する。(静的にconfigファイル内に記述は行わない)

nsdのインストール

portsを利用する

# portinstall dns/nsd

nsdユーザー / nsdグループ作成

nsdを動作させるユーザーにする。uidとgidは、sendmail(25)に対してFreeBSD portsからpostfixをインストールした際に作成されるユーザー:postfixが125という感じで、bind(53)に対して153を指定した。(既にuid, gidで153を使っている場合は変更すること)

# pw groupadd -g 153 -n nsd
# pw useradd -u 153 -n nsd -g nsd -c "nsd Sandbox" -d / -s /usr/sbin/nologin

nsd-controlを使うための準備

rndcのnsd版の様なもの。鍵の作成などが行われる様だ。

# nsd-control-setup

nsdの設定

/usr/local/etc/nsd/nsd.conf

server:
	username: nsd
	chroot: "/usr/local/etc/nsd"
	zonesdir: "/usr/local/etc/nsd/zones"
	zonelistfile: "/usr/local/etc/nsd/zone.list"
	database: "/usr/local/etc/nsd/nsd.db"
	logfile: "/var/log/nsd.log"
	pidfile: "/usr/local/etc/nsd/nsd.pid"
	xfrdfile: "/usr/local/etc/nsd/xfrd.state"
	xfrdir: "/usr/local/etc/nsd/tmp"
	hide-version: yes

remote-control:
	control-enable: yes
	control-interface: 127.0.0.1
	control-port: 8952
	server-key-file: "/usr/local/etc/nsd/nsd_server.key"
	server-cert-file: "/usr/local/etc/nsd/nsd_server.pem"
	control-key-file: "/usr/local/etc/nsd/nsd_control.key"
	control-cert-file: "/usr/local/etc/nsd/nsd_control.pem"

pattern:
	name: "masterzone"
	zonefile: "%s.zone"
	notify: (セカンダリーDNSサーバーのIPアドレス) NOKEY
	notify-retry: 5
	provide-xfr: (セカンダリーDNSサーバーのIPアドレス) NOKEY

serverセクション:主に全体の設定

username
nsdを動作させるユーザー名。最初に作ったnsdユーザーを利用
chroot
chrootするディレクトリを指定する。chroot指定の場合、pidfile, database で指定した項目はchroot先ディレクトリ配下に設置の事。
zonesdir
zoneファイルの保存場所
zonelistfile
動的に追加されたゾーン情報リスト
database
データベース、どうやらzoneファイル等の内容はDB化されてnsdから利用される模様、chrootする場合はchroot先配下を指定の事
logfile
ログファイル
pidfile
プロセスIDが記録されたファイル、chrootする場合はchroot先配下を指定の事
xfrdfile
ゾーン転送に必要なファイル、らしい
xfrdir
ゾーン転送処理に使われるディレクトリ、らしい
hide-version
バージョン情報の応答を行わない様にする(隠す)場合はyes

remote-controlセクション:nsd-controlによるリモートコントロールの設定

control-enable
リモートコントロールを有効にする場合はyes
control-interface
リモートコントロールを待ち受けるためにnsdが待ち受けるIPアドレスを指定する、ここでは127.0.0.1を指定しているが、デフォルト値も127.0.0.1。
control-port
リモートコントロールを待ち受けるためにnsdが待ち受けるポート番号を指定する、ここでは8952を指定しているが、デフォルト値も8952。
server-key-file
server-cert-file
nsd-control-setupによって生成される、サーバーのプライベート鍵と自己署名証明書のパス
control-key-file
control-cert-file
nsd-control-setupによって生成される、リモートコントロールクライアントのプライベート鍵と自己署名証明書のパス

patternセクション:パターンマッチしたゾーンに一括でオプション設定する

name
パターン名、ここで指定したパターン名に対してダイナミックにドメイン追加や削除ができる
zonefile
ゾーンファイルのパス指定、%sはドメイン名に置き換わる
notify
ゾーン情報の更新を通知するサーバーのIPアドレスを指定する。ここではセカンダリーDNSサーバーのIPアドレスを指定する。セカンダリーサーバーを使わない場合は不要
notify-retry
更新通知のリトライ回数指定
provide-xfr
指定したIPアドレスへのゾーン転送の可否を指定するリスト。ここではセカンダリーDNSサーバーのIPアドレスを指定する

細かい設定は日本Unboundユーザー会が提供しているnsd.conf(5)の日本語マニュアルも参照の事。
nsd.conf(5) | 日本Unboundユーザー会

必要なディレクトリ、ファイルの作成とchown

# cd /usr/local/etc/nsd
# mkdir zones tmp
# chown -R nsd:nsd /usr/local/etc/nsd
# touch /var/log/nsd.log
# chown nsd:nsd /var/log/nsd.log

ゾーンファイルの準備

zonesdirで指定した/usr/local/etc/nsd/zones 以下に「ドメイン名.zone」(例:example.jpの場合 example.jp.zone)を用意する。bindのゾーンファイルがそのまま利用できた。

起動

# vi /etc/rc.conf
---
nsd_enable="YES"
---
# service nsd start

ドメイン追加

# nsd-control addzone (ドメイン名) masterzone

以下ドメイン分繰り返し。

ゾーンファイルを更新した場合

SOAレコード等も更新した上で

# nsd-control reload (ドメイン名)

FreeBSD 9.1-STABLEでVIMAGEなJailを構築する

現在自宅では主にNASの為に構築したFreeBSD stable/9環境のマシンが常時起動しているが、オールインワンなホストにせず各機能毎にjailを作成し構築したので、jail構築の記録。
jailゲスト上でSambaを動かしたかったので、ネットワークはVIMAGEを利用している。
なお、この記録は個人的なものであり、本記録を真似・参考にされるなどした際に問題が起きても当方はいかなる責任も負わない。

環境

  • FreeBSD 9.1-STABLE amd64
  • 各jailゲストは /vps/(jail) に設置する。jail名であって、ホスト名ではない。(スクリプトを少し変更すれば、ディレクトリパスをホスト名にすることも可能。
  • カーネルでVIMAGEを有効にする。
  • jailの設定はrc.conf(5)ではなく、jail.conf(5)で行う。
  • 起動スクリプトは sysutils/jail2 を利用する。
  • VIMAGE対応の部分に絞って記載する方向、カーネル再構築方法や基本的なjailゲストの作成は記載しない。

昔話をすると、最初に構築した頃は9-CURRENTを使っていた。当時はVIMAGE(vnet)用のepairデバイスをifconfigでdestroyするとOSが固まることが良くあったが、いつの間にか安定していた。

VIMAGE対応(ホスト)

カーネルコンフィギュレーションファイルにてVIMAGEを有効にし、再構築する。

(追加項目)
options         VIMAGE

ident等も適宜変更の事。当方は安直にVIMAGEとしている。

ネットワーク設定(ホスト)

ブリッジデバイス(bridge0)を作成し、物理NIC(今回はem0)をブリッジのメンバーに追加する設定。IPアドレスはbridge0に振る(今回は10.0.0.33/24)。

cloned_interfaces="bridge0"
ifconfig_bridge0="inet 10.0.0.3 netmask 255.255.255.0 addm em0"
ifconfig_em0="up"

ネットワーク設定(ゲスト)

基本的なjailだとホスト名はホスト側のrc.confで指定するが、今回はゲスト側のrc.confで指定する。また、ホスト側とネットワークが独立しているので、デフォルトゲートウェイ設定(今回は10.0.0.1)もrc.confで行う。

hostname="guest"
defaultrouter="10.0.0.1"

devfs設定(ホスト側)

netstatで/dev/memや/dev/kmemが存在しないとエラーが表示されるので、jailゲストのデフォルトルールセット(4番)にmem, kmemを追加した5番を作成した。

# vi /etc/devfs.rules
---
[devfsrules_jail2=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path zfs unhide
add path mem unhide
add path kmem unhide
---

デフォルト設定は /etc/defaults/devfs.rules に存在する。今時点のルールセット4番の内容:

# Devices usually found in a jail.
#
[devfsrules_jail=4]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path zfs unhide

jail.conf作成(ホスト側)

詳細は jail.conf(5) や jail(8) のmanを参照。要するにjail -c するときのオプション等をjail.confにずらずら並べているが、変数的な概念があるので便利に使える。

# vi /etc/jail.conf
---
exec.prestart  = "ifconfig epair${if} create up >/dev/null";
exec.prestart += "ifconfig bridge0 addm epair${if}a";
exec.start     = "ifconfig lo0 up 127.0.0.1";
exec.start    += "ifconfig epair${if}b up $ipaddr";
exec.start    += "sh /etc/rc";
exec.stop      = "sh /etc/rc.shutdown";
exec.poststop  = "ifconfig epair${if}a destroy";
mount.devfs;
devfs_ruleset = 5;
vnet;
vnet.interface = "epair${if}b";
path = "/vps/${name}";
persist;

j0 { 
	$if = 0;
	$ipaddr = 10.0.0.34;
}

j1 { 
	$if = 1;
	$ipaddr = 10.0.0.35;
}
j2 { 
	$if = 2;
	$ipaddr = 10.0.0.36;
}
j3 { 
	$if = 3;
	$ipaddr = 10.0.0.37;
}
---

exec.prestart〜persistまでが共通の処理、j0〜j3の各セクションでゲスト毎の設定を行う。

exec.prestart
ゲスト起動前にホスト上で実行するコマンド。ゲスト毎にepairデバイス(番号は各ゲストの$ifで指定)をcreateし、bridge0に追加する。
exec.start
ゲスト起動時にゲスト上で実行するコマンド。ループバックデバイスとepairデバイスを起動してIPアドレス割り当てし、/etc/rcを実行する。
exec.stop
ゲスト終了時にゲスト上で実行するコマンド。/etc/rc.shutdownを実行する。
exec.poststop
ゲスト終了後にホスト上で実行するコマンド。epairデバイスをdestroyする。
mount.devfs
devfsのマウント設定
devfs_ruleset
devfsがマウントするルールセット指定。ここでは上記の5番(devfsrules_jail2)を指定。
vnet
ゲストのネットワークに VIMAGE を使用する。
vnet.interface
ゲストに割り当てるvnet用デバイス名。epairNbを指定している。
path
ゲストのルートディレクトリ。$name = j0, j1, j2, j3 等なので、/vps/j0 等がルートディレクトリになる。
persist
ゲストを永続させて起動する。(指定しないとすぐ終了してしまう)
$if
ここではepairデバイスの番号として利用している。$if = 0; なら、exec.prestartやexec.start、exec.poststop のepairデバイスが epair0 等として置き換わる。
$ipaddr
ここではゲストのIPアドレスを指定している。(exec.start の2行目で使われている)

jail.confを作成したら、jail -c j0 等として起動を確認する。

(j0を起動/終了する)
# jail -c j0 (起動)
# jail -r j0 (終了)

起動スクリプトの準備と自動起動設定

portsより、sysutils/jail2 をインストールする。(/usr/local/etc/rc.d/jail2 という、起動スクリプトのみの小さなports)

インストールできたら、自動起動設定を行う。

# vi /etc/rc.conf
---
jail2_enable="YES"
jail2_list="j0 j1 j2 j3"
---

jail2_listで指定した、j0, j1, j2, j3が自動起動の対象になる。

起動・終了

# service jail2 start (起動)
# service jail2 stop (終了)

startやstopの後にjail名(j0等)を指定し、個別に起動・終了も可能。

※追記(2013/10/30)

CURRENTの/etc/rc.d/jailに、2013/10/10(UTC)付でjail.conf対応の修正が入った。
参考:Log of /stable/10/etc/rc.d/jail

上記の通りstable/10にも引き継がれたため、今度リリースされる FreeBSD 10.0-RELEASE からは、sysutils/jail2 を利用する事なく、jail.conf の設定を利用したjailの自動起動ができるようになると思われる。sysutils/jail2は、jailのバックグラウンド起動(rc.confでのjail_parallel_start=”YES”指定に相当)の機能がないため、当方の様に複数を立ち上げると順番に処理するため非常に時間がかかっていたが、/etc/rc.d/jailはjail_parallel_startの指定にも対応するため、高速化が望めるのではないかと想像する。

FreeBSD 10.0-RELEASEがリリースされ次第、10.0-STABLE環境にて試す予定。

AirVideoServer FreeBSD用起動スクリプト

CentOS用の起動スクリプトやFreeBSD用の色々な起動スクリプトを参考にAirVideoServerの起動スクリプトを作成したので、需要はともかくとして公開する。
あまりFreeBSDの起動スクリプトのお作法を知らない状態な上に、動けばいい精神で作成しているので、無保証であり、本スクリプトを使用した際に何か起きても当方はいかなる責任も負わない。

使い方

スクリプトの設置

/usr/local/etc/rc.d 等に設置し、実行権限を与えてください。

# cd /usr/local/etc/rc.d
# fetch http://www.funi2.jp/files/airvideoserver
# chmod 700 airvideoserver

自動起動設定

/etc/rc.conf.local等に下記の様に記述します。

airvideoserver_enable="YES"
airvideoserver_dir="/usr/local/airvideo"
airvideoserver_conf="test.properties"
  • airvideoserver_enable: YESにすることで自動起動を有効にする
  • airvideoserver_dir: AirVideoServerが設置されているディレクトリを指定する。ここで指定したディレクトリに本体(AirVideoServerLinux.jar)と設定ファイルが設置されている事。
  • airvideoserver_conf: 設定ファイル名を指定。上記例の場合、/usr/local/airvideo/test.properties が使用される。
  • 起動スクリプトを使う

    # service airvideoserver start (起動)
    # service airvideoserver status (起動確認)
    # service airvideoserver stop (終了)

    このスクリプトについて

    • 動かなかった:残念ですね。
    • ○○をこのように変えるともっと良くなるよ:ご指摘いただければ大変助かります。

    参考サイト

    スクリプト

    http://www.funi2.jp/files/airvideoserver

    #!/bin/sh
    #
    # PROVIDE: airvideoserver
    # REQUIRE: LOGIN DAEMON NETWORKING mountcritlocal
    # KEYWORD: shutdown
    #
    # Add the following lines to /etc/rc.conf.local to enable the AirVideo Server:
    #
    # airvideoserver_enable="YES"
    # airvideoserver_dir="<path to AirBideoServer directory>"
    # airvideoserver_conf="<path to conf/properties file>"
    #
    
    . /etc/rc.subr
    
    name="airvideoserver"
    rcvar=`set_rcvar`
    
    load_rc_config ${name}
    
    java="/usr/local/bin/java"
    grep="/usr/bin/grep"
    awk="/usr/bin/awk"
    xargs="/usr/bin/xargs"
    kill="/bin/kill"
    
    pidfile="/var/run/${name}.pid"
    logfile="/var/log/${name}.log"
    
    extra_commands="status"
    start_cmd="${name}_start"
    stop_cmd="${name}_stop"
    status_cmd="${name}_status"
    
    : ${airvideoserver_enable="NO"}
    : ${airvideoserver_dir="/usr/local/airvideo"}
    : ${airvideoserver_conf="test.properties"}
    
    airvideoserver_start() {
        echo -n "Starting ${name}"
        if airvideoserver_running; then
    	echo ": already running?"
        else
    	${java} -jar ${airvideoserver_dir}/AirVideoServerLinux.jar ${airvideoserver_dir}/${airvideoserver_conf} >>$logfile 2>&1 &
    	if [ $? -eq 0 ]; then
    	    ps -ww | ${grep} ${airvideoserver_dir}/${airvideoserver_conf} | ${grep} -v grep | ${awk} '{print $1}' > $pidfile
    	    echo "."
    	else
    	    echo ": Error!"
    	fi
        fi
    }
    
    airvideoserver_stop() {
        echo -n "Stopping ${name}"
        ps -ww | ${grep} ${airvideoserver_dir}/${airvideoserver_conf} | ${grep} -v grep | ${awk} '{print $1}' | ${xargs} ${kill} -9 >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            rm -f $pidfile
            echo "."
        else
            echo ": Error!"
        fi
    }
    airvideoserver_status() {
        if airvideoserver_running; then
    	echo "${name} is running."
        else
    	echo "${name} is not running."
        fi
    }
    
    airvideoserver_running() {
        local running
        running=`ps -ww | ${grep} ${airvideoserver_dir}/${airvideoserver_conf} | ${grep} -v grep | ${awk} '{print $1}'`
        if [ $running ]; then
            return 0
        else
            return 1
        fi
        return 1
    }
    
    run_rc_command $1