#!/bin/bash #Создан: Пт 23 авг 2013 19:57:29 #Изменён: Чт 29 авг 2013 13:10:28 # # (c) 2013, Maxim Lihachev, # # Скрипт создания ссылок на файлы настроек. # # Список файлов содержится в RCLIST и заполняется по правилам: # # # Строка комментария, который нужно вывести # : Строка комментария, который не будет выведен # # + установить_файл /куда/устанавливать # - не_устанавливать_файл /куда/устанавливать # любая другая строка будет исполнена как команда оболочки # # Пустые строки выводятся. # # ИСПОЛЬЗОВАНИЕ: installrc.sh --install-all - установка всех файлов # --uninstall-all - удаление всех ссылок # --check-rc-files - проверка доступности файлов настроек # # При установке имеющиеся ссылки и файлы будут переименованы в файл.<дата>. # #Директория для установки RCDIR=$(pwd) RCLIST=$RCDIR/rc.$OSTYPE ROOTDIR=$HOME #Настройка цветовых кодов rstc="\033[00m" yellow="\033[1;33m" red="\033[1;31m" green="\033[1;32m" white="\033[1;1m" #Вывод [цветного] сообщения с заполнением строки до 30 колонки знаком "." # msg1 msg2 ?color? report() { len=$((30 - $(echo -e -n $2 | wc -m))) echo -e -n " ${3:-$rstc} $1 $2 $rstc" eval printf "%-.s-" {1..$len} } #Проверка доступности файла настроек # file check() { report Поиск $(basename $1) if [ -a $RCDIR/$1 ]; then echo OK else echo -e "$red ФАЙЛ НАСТРОЕК НЕ СУЩЕСТВУЕТ: $RCDIR/$1 $rstc" >&2 fi } #Резервирование файла # file backup() { report Сохранение $(basename $filename) $yellow date=$(\date "+%Y.%m.%e_%H.%M") \mv "$link"{,.$date} && \ echo -e "${green}Резервная копия: $link.$date ${rstc}" } #Скрытие ссылки, если она расположена в ROOTDIR # # Если в правилах указано место установки ~, а ROOTDIR=$HOME, # то ссылка будет расположена в ~/.link. # # Если указать иную директорию, то ссылка не будет скрыта: # mc ~/.config ---> ~/.config/mc # # file dotfile() { if [[ "$(dirname $1)" == $ROOTDIR ]]; then echo "$(dirname $1)/.$(basename $1)" else echo $1 fi } #Создание ссылки на конфигурационный файл # source destination mklink() { SRC=$1 DST=$2 #Файл существует? if [ -a $RCDIR/$SRC ]; then filename=$(basename $SRC) report Установка $filename link=$(dotfile "$DST/${filename//\.$(uname -i)}") #Файл существует? if [ -a $link ]; then #Файл -- ссылка? if [ -L $link ]; then ref=$(readlink $link) if [ $ref == $RCDIR/$SRC ]; then echo -e "Установка не требуется" return else echo -e "$redНайденная ссылка указывает на другой файл: $ref$rstc" fi else echo -e "$redНайден конфигурационный файл$rstc" fi backup $link && \ mklink $SRC $DST else #Ссылка на файл-источник ln -s $RCDIR/$SRC $(dotfile $DST/${filename//\.$(uname -i)}) 2>&- && \ echo -e "${green}OK${rstc}" fi else echo -e "$red ФАЙЛ НАСТРОЕК НЕ СУЩЕСТВУЕТ: $RCDIR/$SRC $rstc" >&2 fi } #Удаление ссылки на файл # sourcefile link rmlink() { FILE=$(basename $1) LINK=$(dotfile $2/${FILE//\.$(uname -i)}) if [[ ( -a $LINK ) && (-L $LINK)]]; then report Удаление $FILE $red \rm "$LINK" && echo -e "${green}OK${rstc}" || echo -e "Ошибка удаления" fi } #Установка настроек installrc() { while read line; do if [[ "$line" =~ ^\s*\+\s*.*$ ]]; then #Установить файл eval $(echo -e "$line" | sed 's/^+/mklink /') elif [[ "$line" =~ ^\s*-\s*.*$ ]]; then #Не устанавливать файл eval $(echo -e "$line" | sed 's/^-/rmlink /') elif [[ ("$line" =~ ^\#.*) || ("$line" =~ ^\s*$) ]]; then #Вывод комментариев и пустых строк echo -e "${white}$line${rstc}" | tr '#' ' ' else #Выполнение строки eval $line fi done < $1 } #Разбор аргументов командной строки и выполнение скрипта case "$1" in --install-all) alias rmlink=mklink;; --uninstall-all) alias mklink=rmlink;; --check-rc-files) alias mklink=check; alias rmlink=check;; *) : ;; esac installrc $RCLIST