Решил в начале Нового Года, что надо разгрести каталог с полезными скриптами, которые используются годами «в хозяйстве» едва ли не на рефлексах, документировать их и закинуть в блог, а лишние снести к чертям. И начну, пожалуй, со скрипта, которым собираю тяжелый софт на «большом» сервере, где много памяти, быстрый SSD и прочие радости жизни. (О том, как я выбирал и настраивал для этого железо, пожалуй, я напишу в другом посте).

Итак, у нас есть такая система:
- Ноутбук, на котором обычно работаю,
- Домашний сервер с Intel Xeon, быстрым SSD, кучей оперативной памяти и контейнером с нужным окружением
Хотим работая на ноутбуке (Уж точно не через VNC!), собирать софт удаленно. Каталог сборки я монтирую по NFS. Можно, конечно, извратиться и с SSH, но в домашней сети NFS банально быстрее. Постоянно держать смонтированным каталог сборки не хочется. Так вот и родился вот такой вот костыль:
#!/bin/bash
NFSPATH=192.168.143.2:/srv/sanctuary/build
LOCALPATH=/srv/build
REMOTEPATH=/srv
SSHCMD="ssh buildblade.home -t"
checkmount() {
MCL=`mount | grep "$LOCALPATH" | wc -l`
if [ "$MCL" -lt "1" ]; then
echo "[W] Staging area not mounted, mounting"
sudo mount -t nfs -o vers=3 $NFSPATH $LOCALPATH
else
echo "[I] Staging area already mounted, skipping"
fi
}
unmount() {
sudo umount -l $LOCALPATH
}
cmd() {
checkmount
CMD="$*"
CMD=${CMD/${LOCALPATH}/${REMOTEPATH}}
PWD="`pwd`"
PWD=${PWD/${LOCALPATH}/${REMOTEPATH}}
echo "[I] Executing transformed cmd: ${CMD} in ${PWD}"
$SSHCMD "cd ${PWD} && ${CMD}"
}
case "$1" in
"--mount")
checkmount
;;
"--unmount")
unmount
;;
"--help")
echo "Usage: bb [--mount | --unmount]"
echo "Usage: bb cmd"
;;
*)
cmd $*
;;
esac
Этот скрипт кладется в какой-нибудь каталог, который есть в PATH. (У меня он называется bb). Использовать его предельно просто:
- bb —mount — подмонтировать каталог сборки
- bb —unmount — размонтировать каталог сборки
- bb command — выполнить команду в этом же каталоге, но на сервере.
Особенность этой штуки в том, что он сам динамически меняет пути. Каталог сборки может быть примонтирован по одному пути на сервере, и по другому на пользовательской машине. Именно поэтому перед выполнением команды происходит подмена путей.
Для чего-то простого оно годится, а более сложное проще закинуть в скрипт, и вызывать через bb его. Таким вот замысловатым образом я периодически собираю LibreElec, OpenIPC, OpenWRT, crosstool-ng и другие опенсорсные проекты, которые требуют много процессорного времени.