February 20, 2023

Git-сервер в локальной сети 3. Вeб-интерфейс.

ТехнологииБольше по теме

Эта статья является продолжением статей:

Git-сервер в локальной сети.

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

Прокомментирую отдельные моменты:

  • Скрипт обходит все папки в рабочей директории /home/repos:
WORKDIRPATH='/home/repos'
  • Генерированная html-страница помещается в директорию /var/www/html/repos:
INDEXDIR='/var/www/html/'$WORKDIR
  • Если README.md не найден в репозитории проекта, то будет отображаться NO README FILE:
CONTENT='NO README FILE'
  • Если README.md присутствует в репозитории проекта, то из него будет скопирована третья строка с описанием проекта (во всех моих README.md описание находится в 3 строке):
READMEHASH=$(echo $READMEBLOB | awk '{print $3}'
  • Скрипт проверяет наличие директории итгерерирует в ней html.
if [[ -d "$INDEXDIR" ]]

если директория отсутствует - создает ее (а также поддиректории css и js)

  • JS функция позволяет копировать в буфер обмена полный адрес к репозиторию по клику на ее названии:
"$INDEXDIR/js/script.js"
  • Добавляем права на выполнение скрипта:
chmod +x indexgen.sh
  • Создаем символьную ссылку:
sudo ln -s /home/repos/indexgen.sh /usr/bin/indexgen
  • Добавляем пользователей cron:
sudo vim /etc/cron.allow
root
git
  • Добавляем задание cron от root:
sudo crontab -e

в конец добавляем задание (15 мин 01 час = 01:15)

# m h dom mon dow command
15 01 * * * indexgen
  • Проверяем работу скрипта
sudo indexgen.sh

Зайдя на страницу 192.168.1.73/repos (в моем случае) получаем список репозитоиев с описанием.

Странца домашнего Git-репозитория.

Готово!

ТехнологииБольше по теме