Git-сервер в локальной сети 3. Вeб-интерфейс.
Эта статья является продолжением статей:
Git-сервер в локальной сети 2. Синхронизация
С ростом количества репозиториев в локальной папке поиск нужного становится все труднее. Для удобства поиска и копирования пути было решено написать простой скрипт для генерации HTML-страницы с названием, путем к репозиторию и его описанием.
Для начала установим Apache2 сервер который будет отображать нашу страницу.
Установка Apache2
sudo apt install apache2
sudo service apache2 start
sudo service apache2 stop
sudo service apache2 reload
После запуска, демо страница "Apache2 Default Page" будет доступна по адресу 192.168.1.73 (в моем случае).
Создание скрипта
Сам bash-скрипт разместим в папке с репозиториями (у меня это /home/repos):
vim /home/repos/indexgen.sh
Полный код скрипта тут https://pastebin.com/uCQwsW3Z
#!/bin/bash
USERNAME='git'
HOSTNAME=$(hostname -I | xargs | awk '{print $1;}')
SERVER=$USERNAME'@'$HOSTNAME
WORKDIR='repos'
WORKDIRPATH='/home/repos'
INDEXDIR='/var/www/html/'$WORKDIR
INDEX_HTML=$INDEXDIR'/index.html'
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME"
TITLE="Local Git Repo"
function readme_listing () {
cd $1
READMEBLOB=$(su -c "git ls-tree -r HEAD 2>/dev/null | grep -i README.md" $USERNAME)
if test -z "$READMEBLOB"
then
#echo "\$README is NULL"
CONTENT='NO README FILE'
else
#echo "\$README is NOT NULL"
READMEHASH=$(echo $READMEBLOB | awk '{print $3}')
CONTENT=$(su -c "git cat-file -p $READMEHASH 2>/dev/null | sed -n '3p'" $USERNAME)
fi
echo $CONTENT
return
}
function repos_listing () {
cd $WORKDIRPATH
for FILE in *; do
RML='This is not a repo'
if [[ -d $FILE ]]
then
RML=$(readme_listing "$FILE")
fi
cat << __EOF__
<tr><td onclick="c2cb('$FILE')">$FILE</td>
<td onclick="c2cb('$SERVER:$WORKDIRPATH/$FILE')"> $WORKDIRPATH/$FILE</td>
<td>$RML</td></tr>
__EOF__
done
return
}
function create_indexdir () {
$(sudo mkdir -p $INDEXDIR && sudo chmod 777 $INDEXDIR)
$(mkdir -p $INDEXDIR/css $INDEXDIR/js)
cat <<CSS > "$INDEXDIR/css/style.css"
@charset "utf-8";
body{
margin: 0px;
color: #f5f0e1;
background-color: #1e3d59;
font-size: 100%;
}
table, td, th{
font-size: 100%;
border: 1px solid #12a4d9;
border-collapse: collapse;
}
table.center{
margin-left: auto;
margin-right: auto;
}
h1, p{
text-align: center;
}
CSS
cat <<JS > "$INDEXDIR/js/script.js"
function c2cb(ele){
var tempTxt=document.createElement("input");
tempTxt.value=ele;
document.body.appendChild(tempTxt);
tempTxt.select();
document.execCommand("copy");
document.body.removeChild(tempTxt);
//alert("Copied: "+tempTxt.value);
}
JS
return
}
function generate_html () {
cd $WORKDIRPATH
cat << __EOF__ > $INDEX_HTML
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>$TITLE</title>
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
<h1>$TITLE</h1>
<p>$TIME_STAMP</p>
<div>
<table class="center">
$(repos_listing)
</table>
</div>
<script src="js/script.js"></script>
</body>
</html>
__EOF__
return
}
if [[ -d "$INDEXDIR" ]]; then
cd $WORKDIRPATH
$(generate_html)
else
cd $WORKDIRPATH
$(create_indexdir)
$(generate_html)
fiПрокомментирую отдельные моменты:
WORKDIRPATH='/home/repos'
INDEXDIR='/var/www/html/'$WORKDIR
CONTENT='NO README FILE'
- Если README.md присутствует в репозитории проекта, то из него будет скопирована третья строка с описанием проекта (во всех моих README.md описание находится в 3 строке):
READMEHASH=$(echo $READMEBLOB | awk '{print $3}'if [[ -d "$INDEXDIR" ]]
если директория отсутствует - создает ее (а также поддиректории css и js)
"$INDEXDIR/js/script.js"
chmod +x indexgen.sh
sudo ln -s /home/repos/indexgen.sh /usr/bin/indexgen
sudo vim /etc/cron.allow
root git
sudo crontab -e
в конец добавляем задание (15 мин 01 час = 01:15)
# m h dom mon dow command 15 01 * * * indexgen
sudo indexgen.sh
Зайдя на страницу 192.168.1.73/repos (в моем случае) получаем список репозитоиев с описанием.