2017年1月8日日曜日

Debian 8.6 (jessie) に xrdp をインストールする

環境

Debian 8.6 (jessie)
LXDE
(gnome や cinnamon では、起動すらできなかったが、原因は未調査。)


手順

root ユーザで作業する前提とする。

# libxrandr-dev パッケージをインストールするのがミソ
aptitude -y install git libxrandr-dev

# 任意のディレクトリでビルド作業を行う
git clone --depth 1 -b v3.03 https://github.com/scarygliders/X11RDP-o-Matic.git
cd X11RDP-o-Matic
./X11rdp-o-matic.sh --justdoit

# パッケージがインストールされているか確認
dpkg -l xrdp x11rdp

# セッションマネージャを選択(LDXE を選択する)
./RDPsesconfig.sh


# 再起動後、 xrdp で以下のようなエラーが発生した。

Jan  7 22:28:41 record2 xrdp-sesman[583]: (583)(140136194672384)[ERROR] error opening pid file[/var/run/xrdp/xrdp-sesman.pid]: No such file or directory

# /var/run は、/run のシンボリックリンクとなっている。
# /run は、tmpfs で作成されるため、起動時に初期化されてしまう。
# したがって、起動時に作成するように設定を行う必要がある。

# PID ファイルの格納先を作成
tee /etc/tmpfiles.d/xrdp.conf <<'EOT'
d /run/xrdp 0755 root root
EOT


# xrdp を起動すると、さらに以下のようなエラーが発生する。
# これは、pid ファイルの作成先が、異なっているため。

Jan 08 11:06:30 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] starting xrdp-sesman with pid 11225
Jan 08 11:06:30 record2 systemd[1]: PID file /var/run/xrdp-sesman.pid not readable (yet?) after start.
Jan 08 11:06:30 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] listening to port 3350 on 127.0.0.1
Jan 08 11:08:00 record2 systemd[1]: xrdp-sesman.service start operation timed out. Terminating.
Jan 08 11:08:00 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] shutting down sesman 1
Jan 08 11:08:00 record2 xrdp-sesman[11225]: (11225)(140003619026688)[DEBUG] Closed socket 7 (AF_INET 127.0.0.1:3350)
Jan 08 11:08:00 record2 systemd[1]: Failed to start xrdp session manager.

# /lib/systemd/system/xrdp.service ファイルを以下のように修正
#   pid ファイルの場所を修正
#   存在しないディレクトリの読み込み行をコメントアウト

PIDFile=/var/run/xrdp/xrdp.pid
#EnvironmentFile=-/etc/sysconfig/xrdp
#EnvironmentFile=-/etc/default/xrdp


# /lib/systemd/system/xrdp-sesman.service ファイルを以下のように修正
#   pid ファイルの場所を修正
#   存在しないディレクトリの読み込み行をコメントアウト

PIDFile=/var/run/xrdp/xrdp-sesman.pid
#EnvironmentFile=-/etc/sysconfig/xrdp
#EnvironmentFile=-/etc/default/xrdp


systemctl daemon-reload
systemctl enable xrdp
systemctl start xrdp

# xrdp が起動したことを確認
systemctl status xrdp

# 再起動し、正常に xrdp が起動することを確認する。
reboot



2016年11月27日日曜日

pyenv で構築した Ansible 実行環境で apt モジュールを利用するとエラーとなる事象を解決する

はじめに


この解決方法が正しいのかは、疑問が残る。
その内、正当な方法が見つかるかもしれない。

今回は、自分自身をプロビジョニングする場合に発生した事象となる。


環境


Debian 8.6 (jessie)
pyenv 1.0.2
Python 2.7.12
ansible 2.2.0.0


Ansible 実行環境の構築


ユーザは、 user1 で作業
ansible2 という名称で、python 2.7.12 の環境を定義している。
pyenv のインストール方法は、割愛。

# python のビルドに必要なパッケージをインストール
sudo aptitude install libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev libffi-dev
pyenv install 2.7.12
pyenv global 2.7.12
pip install --upgrade pip
pyenv virtualenv 2.7.12 ansible2
pyenv global ansible2
pip install ansible


python のパッケージ状態


(ansible2) user1@record2:~$ pip list --format=columns
Package                      Version
---------------------------- --------
ansible                      2.2.0.0
backports.ssl-match-hostname 3.5.0.1
cffi                         1.8.3
cryptography                 1.5.2
enum34                       1.1.6
idna                         2.1  
ipaddress                    1.0.17
Jinja2                       2.8  
MarkupSafe                   0.23  
paramiko                     2.0.2
pip                          9.0.1
pyasn1                       0.1.9
pycparser                    2.17  
pycrypto                     2.6.1
PyYAML                       3.12  
requests                     2.12.1
setuptools                   29.0.0
six                          1.10.0
websocket-client             0.37.0
wheel                        0.30.0a0



Ansible インベントリファイル


[localhost]
localhost
[localhost:vars]
ansible_python_interpreter=/home/user1/.pyenv/versions/ansible2/bin/python
ansible_connection=local


ansible を実行する場合に、pyenv で設定した python をデフォルトでは、利用しない。
したがって、ansible_python_interpreter に、指定する必要がある。
システム標準の python には、色々とパッケージがデフォルトでインストールされているが、pyenv の python を利用する場合には、別途パッケージをインストールする必要がある。

今回は、pip search で、見つからないパッケージが必要となったため、ソースファイルを pip に指定してインストールしているものがある。


事象


Ansible プレイブックを実行


上記状態で、apt モジュールを使用した Ansible プレイブックを実行
以下のようなエラーが発生。

failed: [localhost] (item=[u'pkg-config', u'autoconf', u'automake']) => {"failed": true, "item": ["pkg-config", "autoconf", "automake"], "msg": "Could not import python modules: apt, apt_pkg. Please install python-apt package."}


python-apt パッケージが必要だと怒られる。そりゃそうだ。

python-apt をインストール(失敗)


pip でインストールを試すが・・・

(ansible2) user1@record2:~/selfprov$ pip install python-apt
Collecting python-apt
  Using cached python-apt-0.7.8.tar.bz2
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in
      File "/tmp/pip-build-UZriTI/python-apt/setup.py", line 6, in
        from DistUtilsExtra.command import *
    ImportError: No module named DistUtilsExtra.command
 
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-UZriTI/python-apt/


DistUtilsExtra.command などというモジュールは無いわっ!と怒られる。

このモジュールは、どうやら python-distutils-extra パッケージをインストールすると利用できるようになるようだ。


python-distutils-extra のインストール


pip search で探すも、それらしいものがない。
aptitude search python-distutils-extra で探すと、ある。
でも、これでインストールしても、システム標準の python にインストールされるため、pyenv 環境の python にインストールすることは、できない。

しょうがないので、直接ソースファイルからインストールする。

pip install https://launchpad.net/python-distutils-extra/trunk/2.39/+download/python-distutils-extra-2.39.tar.gz


インストールに成功した。

python-apt をインストール(また失敗)


では、気を取り直して、再び python-apt をインストールしてみる。

(ansible2) user1@record2:~/selfprov$ pip install python-apt
Collecting python-apt
  Using cached python-apt-0.7.8.tar.bz2
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in
      File "/tmp/pip-build-RTVyKx/python-apt/setup.py", line 11, in
        string.split(parse_makefile("python/makefile")["APT_PKG_SRC"]))
      File "/home/user1/.pyenv/versions/2.7.12/lib/python2.7/distutils/sysconfig.py", line 293, in parse_makefile
        fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
      File "/home/user1/.pyenv/versions/2.7.12/lib/python2.7/distutils/text_file.py", line 103, in __init__
        self.open (filename)
      File "/home/user1/.pyenv/versions/2.7.12/lib/python2.7/distutils/text_file.py", line 120, in open
        self.file = open (self.filename, 'r')
    IOError: [Errno 2] No such file or directory: 'python/makefile'
 
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-RTVyKx/python-apt/


というわけで、お約束のように失敗。
ファイルが無いという、よくわからないエラー。バグだろ・・・

ググッてもよくわからず、最新版を入れると大丈夫だという問答を見つけたので、最新版をソースからインストールしてみる。


pip install https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz


(ansible2) user1@record2:~/selfprov$ pip install https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Collecting https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
  Using cached https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Building wheels for collected packages: python-apt
  Running setup.py bdist_wheel for python-apt ... error
  Complete output from command /home/user1/.pyenv/versions/2.7.12/envs/ansible2/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-ev3yAq-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpV9Cq77pip-wheel- --python-tag cp27:
  W: [python2.7] Sphinx import error.

<中略>

  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/user1/.pyenv/versions/2.7.12/include/python2.7 -c python/acquire.cc -o build/temp.linux-x86_64-2.7/python/acquire.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  In file included from python/acquire.cc:26:0:
  python/apt_pkgmodule.h:14:28: fatal error: apt-pkg/hashes.h: No such file or directory
   #include <apt-pkg/hashes.h>

<中略>

    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/user1/.pyenv/versions/2.7.12/include/python2.7 -c python/acquire.cc -o build/temp.linux-x86_64-2.7/python/acquire.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    In file included from python/acquire.cc:26:0:
    python/apt_pkgmodule.h:14:28: fatal error: apt-pkg/hashes.h: No such file or directory
     #include <apt-pkg/hashes.h>
                                ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1


エラーが出た。
よく見ると、apt-pkg 関連のヘッダが無いのが原因のようだ。


libapt-pkg-dev をインストール


sudo aptitude install libapt-pkg-dev


python-apt をインストール(ようやく成功)


(ansible2) user1@record2:~/selfprov$ pip install https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Collecting https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
  Using cached https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Building wheels for collected packages: python-apt
  Running setup.py bdist_wheel for python-apt ... done
  Stored in directory: /home/user1/.cache/pip/wheels/83/8c/5e/d3b5bc92348f4a5c88c8b5903d8fcdb7404cbaa4618bd79049
Successfully built python-apt
Installing collected packages: python-apt
Successfully installed python-apt-0.0.0


よし、インストール成功した。
が、バージョンが、0.0.0 になっとる。リリース前バージョンだから?
まあ、実害はなさそうなので、放置する方向で。


再び、Ansible プレイブックを実行すると、めでたく apt モジュールの実行が出来るようになる。

最初に Ansible の実行環境を作成してるときには、実は、pyenv で設定している python を利用せずに実行していることに気付かなかった。
docker モジュールを Ansible で操作しようとした時に、ようやく気づき、ansible_python_interpreter で python を切り替えたら、この現象が起こって、悶絶したものの、解決できた。

意外と難儀したが、これでようやく先に進める・・・





2015年10月17日土曜日

RLogin ターミナルソフトを使用した、ポートフォワーディングによる踏み台サーバ越しの、多段 SSH 接続設定方法について

RLogin (http://nanno.dip.jp/softlib/man/rlogin/)というターミナルソフトを利用して、踏み台サーバーを越える、多段 SSH 接続方法を備忘録として残しておく。

無知ゆえに、多段 SSH 接続設定を、すっきりできずに悶々としていたが、やっとそれらしい設定方法が分かった。

ただし、私自身がよく分かっていないため、正しい設定方法かどうかは不明。よって、自己責任でどうぞ。

今回の環境は、AWS の VPC 上に環境があり、パブリック IP が付与されているサーバは、踏み台のみで、他のサーバは、プライベート IP のみとする。

踏み台サーバ IP:1.2.3.4
プライベートサーバ:10.0.0.1

RLogin の接続設定は、2つ作成する。
1つは、ローカルマシンで SOCKS プロキシとして動作する設定。
もう1つは、上記プロキシ経由で、目的のプライベート IP マシンへ接続する設定。


では、設定方法の説明をする。

踏み台サーバ接続設定


サーバ設定を新規追加。


エントリー名:「aws_bastion」
Server Address:「1.2.3.4」
Socket Port:「ssh(22)」
User Name:「ec2-user」
SSH Identity Key の参照ボタンを押下し、踏み台サーバへログインするための秘密鍵を設定する。


左のツリーから「プロトコル」を選択
「ポートフォワードだけ行う」をチェック
「エージェント転送を有効にする」をチェック


「ポートフォワード」ボタンを押下


「新規」ボタンを押下


Listened の「Local Socks」を選択
Host Name:「localhost」
Port:「10022」

「OK」ボタン押下
「閉じる」ボタン押下
「OK」ボタン押下
で、踏み台サーバへの接続設定は完了。




プライベートサーバ接続設定


サーバ設定を新規追加。

エントリー名:「aws_private」
前接続先:「aws_bastion」
  ※ 前接続先は、この接続を行うときに、自動的に指定した接続が行われる設定。
Server Address:「10.0.0.1」
Socket Port:「ssh(22)」
User Name:「ec2-user」
SSH Identity Key の参照ボタンを押下し、踏み台サーバへログインするための秘密鍵を設定す


「Proxy Server」の「設定」ボタンを押下
Select Proxy Protocol :「SOCKS5」
Over SSL :「使用しない」
Server Option
  Proxy Server Address:「localhost」
  Socket Port:「10022」  ※踏み台サーバのポートフォワード設定で指定したポート

「OK」ボタン押下
左側のツリーでプロトコルを選択
「エージェント転送を有効にする」をチェック

「OK」ボタン押下

以上で、設定完了。

aws_private を接続すると、自動的にaws_bastion の接続も行われ、無事に目的のプライベートサーバーに接続できる。



今回の設定方法以外でも、Chat Script などを使えば、多段 SSH 接続は行える。
がしかし、以下で説明する接続方法の場合に都合が良い。


  • プロトコルハンドラ経由での呼び出し
  • コマンドラインからの呼び出し

接続先ホストが異なるだけの場合、上記方法であれば、RLogin 側の設定を、増やす必要がない。
コマンドラインの場合は、もう少し自由度がある。

では、実際の接続例を記述しておく。

プロトコルハンドラでの接続

プロトコルハンドラとは、「ssh://hostname などの URL リンクで起動・接続できるようにハンドラを登録する」機能である。
HTML などで、サーバ接続 URL をリンクで作成しておけば、それをクリックすることで RLogin が起動し、サーバに接続できる。
RLogin の Server Select 画面で、「aws_private」を右クリックし、「プロトコルハンドラに登録」を選択


デフォルト値のまま、「OK」ボタンを押下

次に、HTML で接続先リンクを作成

link.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hosts</title>
</head>
<body>
  <h1>サーバ一覧</h1>
  <ul>
    <li><a href="ssh://10.0.0.1">プライベートサーバ</a></li>
  </ul>
</body>
</html>



Chrome などで、link.html ファイルを表示して、サーバのリンクをクリックすると、ダイアログが表示されるので、「アプリケーションの起動」をクリックすると、RLogin が起動し、サーバに接続される。


コマンドラインからの呼び出し

コマンドラインからの呼び出しは、もう少し自由度がある。
プロトコルハンドラでは、RLogin で登録した設定でのみ起動できないが、コマンドラインでは、それも変更できる。

今回は、趣向を凝らし、ディレクトリ名が設定名(エントリ名)で、ファイル名がサーバ名として接続されるような、バッチファイルを作成した。
ファイルは、以下のような構成とした。

├ aws_private/
│ └ 10.0.0.1.bat
└ env.bat

env.bat は、RLogin のパスを設定している。
path D:\appli\rlogin;%PATH%

10.0.0.1.bat の内容は、全ファイル共通であり、ディレクトリ名とファイル名を解析し、RLogin に渡している。現在は、エントリ名とホストのみ設定できる。工夫しだいで、プロトコル、ユーザ、パスワードや、ポートなども渡すことが出来る。

@echo off
setlocal
call "%~dp0..\env.bat"
set HOST=%~n0
set PDIR=%~p0
call :GETENTRY "%PDIR:~0,-1%"

start /b RLogin.exe /inuse /entry %ENTRY% /ip %HOST%
goto :EOF

:GETENTRY
set ENTRY=%~n1
exit /b


2014年10月5日日曜日

gitolite3 で、hook スクリプトを設定する

git リポジトリで、hook スクリプトを設定したくなったので、調べてみたら、gitolite3 の設定で、同様のことが出来るようだ。
しかも、リポジトリ毎のスクリプト実行設定はもちろん、スクリプト自体も、gitolite 管理用リポジトリ(gitolite-admin)に、ファイルを追加すると、サーバーサイドで実行してくれるようだ。
仕組みは、管理用リポジトリの push を行った時点で、対象リポジトリの hooks に、設定したシェルのリンクを作成するようだ。gitolite 3.5.3.1-2 時点では、同一フック種に複数のシェルを指定することはできない。3.6 以降では、複数のシェルを設定できるようだが、未確認。

前提条件

  • gitolite3 や git は、インストールおよび設定済みとする。
  • gitolite3 の基本的な設定や利用方法は、習得済みとする。
  • gitolite3 ユーザーのホームディレクトリは、/var/lib/gitolite3 とする。
  • gitolite3 のリポジトリは、gitolite3 ユーザーのホームディレクトリに設定してあるものとする。

update フックの設定

1.gitolite3 のサーバー上の設定ファイルを変更する。

sudo vi /var/lib/gitolite3/.gitolite.rc
以下の行を、コメントインする。
# LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",
LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

これで、gitolite 管理用リポジトリに登録した hook スクリプトが、利用可能になる。

2.gitolite 管理用リポジトリ(gitolite-admin)に update フックファイルを登録

以下のファイルを作成。LF 改行にすること。
gitolite-admin/local/VREF/hello

ファイルの内容は、以下のようにする。
#!/bin/bash
echo "Hello update"

hello ファイルを git add する
ファイルのパーミッションを設定する。ここ重要。
git update-index --chmod=+x hello

TortoiseGit の場合は、hello ファイルを右クリック⇒プロパティ
Git タブを選択⇒実行可能(+x) チェックボックスをチェックで、上記のコマンド入力と同等の状態となる。

コミットおよびサーバーへプッシュする。

3.各リポジトリに update フック設定を行う。

以下のファイルを修正し、最後の行を追加する。
gitolite-admin/conf/gitolite.conf

@admin = admin shpad
repo public/program/HelloClosureLibrary
    RW+     =   @admin
    R       =   @all
    -   VREF/hello = @all

コミットおよびサーバーへプッシュする。

4.動作確認

前述の設定を行ったリポジトリに対して、コミットを行ってみる。

git.exe push -v --progress  "origin" master:master

Pushing to ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 378 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Hello update
remote: From /var/lib/gitolite3/repositories/public/program/HelloClosureLibrary
remote:    7a5bd94..2af6ecd  master     -> origin/master
remote: Updating 7a5bd94..2af6ecd
remote: Fast-forward
remote:  js/src/common.js | 4 ++++
remote:  1 file changed, 4 insertions(+)
To ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
7a5bd94..2af6ecd  master -> master
updating local tracking ref 'refs/remotes/origin/master'

成功 (2839 ms @ 2014/10/05 16:20:12)


うまく動いているようだ。
サーバー側のスクリプトの実行結果は、remote: の行に出力されている。
エラー時もここに表示される。便利。

その他フック設定

1.gitolite3 のサーバー上の設定ファイルを変更する。

sudo vi /var/lib/gitolite3/.gitolite.rc
以下の行を、コメントインする。
# LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",
LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

# 'repo-specific-hooks',
'repo-specific-hooks',

2.gitolite 管理用リポジトリ(gitolite-admin)にその他フックファイルを登録

以下のファイルを作成。LF 改行にすること。
gitolite-admin/local/hooks/repo-specific/hello

ファイルの内容は、以下のようにする。
#!/bin/bash
echo "Hello post-receive"

hello ファイルを git add する
ファイルのパーミッションを設定する。ここ重要。
git update-index --chmod=+x hello

TortoiseGit の場合は、hello ファイルを右クリック⇒プロパティ
Git タブを選択⇒実行可能(+x) チェックボックスをチェックで、上記のコマンド入力と同等の状態となる。

コミットおよびサーバーへプッシュする。

3.各リポジトリにその他フック設定を行う。

以下のファイルを修正し、最後の行を追加する。
フックの動作タイミング = 前述のフックスクリプト。
gitolite-admin/conf/gitolite.conf

@admin = admin shpad
repo public/program/HelloClosureLibrary
    RW+     =   @admin
    R       =   @all
    -   VREF/hello = @all
    option hook.post-receive = hello


コミットおよびサーバーへプッシュする。

4.動作確認

前述の設定を行ったリポジトリに対して、コミットを行ってみる。

git.exe push --progress  "origin" master:master

Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 375 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Hello update
remote: Hello post-receive
To ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
79615f9..a209006  master -> master

成功 (2433 ms @ 2014/10/05 17:13:39)


2014年8月16日土曜日

GitWeb で、リポジトリを参照できるように、設定してみる。

概要

GitWeb を利用して、以下のような条件で、リポジトリを Web で参照できるように、設定してみた。

  • Gitolite3 管理用リポジトリは、公開対象から除外する。
  • Gitolite3 管理用リポジトリで、公開設定が行える。

参考サイト




利用ソフト

  • Apache2 (2.4.7-1ubuntu4.1)
  • git (1:1.9.1-1)
  • Gitolite3 (3.5.3.1-2)
  • GitWeb (1:1.9.1-1)


前提条件

Ubuntu 14.04 上で、設定を行った。
Apache2 および git は、インストール済みとする。

Gitolite

Gitolite3 のインストールおよび設定は、以下のサイトを参考に行った。
Gitolite3 パッケージ名は、gitolite3 と、指定する必要があるので注意。gitolite は、バージョン2.3で古かった。
Gitolite3 ユーザーは、パッケージインストール時、/var/lib/gitolite3 に自動的に作成される。

Git管理の神ツール「Gitolite」なら、ここまでできる! (1/2)


GitWeb

インストール

sudo aptitude install gitweb
sudo a2enmod cgi

Apache2 の設定

まず、Apache の設定で、/etc/apache2/conf.d/gitweb がインストールされているが、場所もファイル名も間違っている。
sites-available に gitweb.conf とリネームして移動して、conf.d ディレクトリを削除する。
gitweb.conf の中身は、変更なし。

GitWeb の設定

次に、/etc/gitweb.conf を修正。
$projectroot には、Gitolite3 のリポジトリを指定。その他は、コメントインするだけ。
sudo vi /etc/gitweb.conf

$projectroot = "/var/lib/gitolite3/repositories";
$git_temp = "/tmp";
$home_text = "indextext.html";
$projects_list = $projectroot;
@stylesheets = ("static/gitweb.css");
$javascript = "static/gitweb.js";
$logo = "static/git-logo.png";
$favicon = "static/git-favicon.png";
@diff_opts = ();

リポジトリパーミッションの設定

このままでは、www-data ユーザで、Gitolite3 のリポジトリにアクセスする権限が無いので、その設定を行う。
sudo gpasswd -a www-data gitolite3
sudo chmod g+rx /var/lib/gitolite3
sudo chmod g+r /var/lib/gitolite3/projects.list
sudo chmod -R g+r /var/lib/gitolite3/repositories
sudo find /var/lib/gitolite3/repositories -type d -exec chmod g+x {} +


新規にリポジトリを追加する場合に、グループ読み取り可になるようパーミッションを設定。
sudo vi /var/lib/gitolite3/.gitolite.rc
    UMASK                           =>  0077,
                                                 ↓ 変更
    UMASK                           =>  0027,


Apache2 をリスタート
sudo apache2ctl restart


以上の設定で、すべてのリポジトリが公開できる。

公開リポジトリ設定

このままでは、管理用リポジトリも一覧に出てしまうので、指定したものだけリストアップされるように設定。

sudo vi /etc/gitweb.conf

$projects_list = $projectroot;
  ↓ 変更
$projects_list = "/var/lib/gitolite3/projects.list";

以下追加。一覧にあるリポジトリ以外は、直接 URL を指定しても表示されなくなる。
$strict_export = "true";


上記で指定した project.list ファイルには、Gitolite3 で @all または、gitweb に参照権限を付与したプロジェクトが、リストアップされる。
Gitolite3 管理リポジトリの gitolite-admin/conf/gitolite.conf ファイルを、以下のように変更して push すると、project.list ファイルに、公開リポジトリが書き込まれる。

repo  foobar
    R    =    gitweb

2014年6月15日日曜日

【備忘録】eclipse の JUnit や DDMS などでコネクションエラーが発生する問題

eclipse で JUnit を実行した場合や、DDMS のログに、コネクションエラーが出力されるようになってしまった。

発端は、ネットワークアダプタのドライバを、アンインストールして、インストールしたこと、もしくは、不要な”ローカル エリア接続”を、レジストリから削除して、名前を変更したからかもしれない。

もちろん、それまでは、普通に動作していたし、変更後も同じ条件で動作させた。

Google 先生に聞いたところ、どうやら JavaVM が、IPV6 で通信を行ってしまうかららしい。
ちなみに、現在の環境では、IPV6 は、設定で無効にしている。

しかし、何を基準に切り替えているのか不明・・・

以下のオプションを Java の実行時パラメータに追加すると、現象が発生しなくなった。

-Djava.net.preferIPv4Stack=true


追加する箇所は、Java を起動している、以下のような場所。
・eclipse.ini
・「Window」⇒「Preferences」⇒「Java」⇒「Installed JREs」で、インストールされている Java を選択して、「Edit」ボタンを押下。「Default VM arguments」
・プラグインや、プロジェクト毎に、java の環境を設定している場合の VM オプション。
等々。


最後に、起きた現象を記載しておく。

DDMS は、「Failed to initialize Monitor Thread: Unable to establish loopback connection」というダイアログが開く。
後は、Console ビューに、
[2014-06-15 14:55:21 - DeviceMonitor] Connection attempts: 1
[2014-06-15 14:55:23 - DeviceMonitor] Connection attempts: 2
[2014-06-15 14:55:24 - DeviceMonitor] Connection attempts: 3
・・・
など、ずっとエラー表示され続ける。

JUnit の場合は、テストケースを実行すると、しばらくしてから、以下のようなエラーがでる。
Could not connect to:  : 64389
java.net.SocketException: Invalid argument: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.connect(RemoteTestRunner.java:570)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:381)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


2014年5月25日日曜日

【超個人的備忘録】読んでも意味無いよ。タブン・・・

POM

コンパイラーバージョン設定

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.1</version>
  <configuration>
    <source>1.7</source>
    <target>1.7</target>
  </configuration>
</plugin>

文字コード設定

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

ソースディレクトリ設定

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <id>add-source</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>add-source</goal>
      </goals>
      <configuration>
        <sources>
          <source>src/main/java</source>
        </sources>
      </configuration>
    </execution>
  </executions>
</plugin>