diff --git a/ublinux/rc.local.d/43-repository b/ublinux/rc.local.d/43-repository index 4cecca8..aaabd19 100755 --- a/ublinux/rc.local.d/43-repository +++ b/ublinux/rc.local.d/43-repository @@ -589,24 +589,58 @@ live_autoupdate(){ fi } -## Удалить старые версии дубликато пакетов в базе pacman +## Удалить версии дубликатов пакетов в базе pacman exec_remove_duplicated_pacman(){ - PATH_PACMAN_DB="/var/lib/pacman/local/" - # Из всех дубликатов приложений в базе pacman удалить старые версии - cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #' - - # Ситуация для которой нет обработки - # Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет верхний слой - # т.е. по факту прилложения останутся старыми. Новые файлы из модуля будут видны, и далее могут не дать обновить на новые пакеты. Поэтому старые пакеты из базы pacman удаляем - # т.е. в базе pacman будут новые пакеты, а по факту файлы/бинарники старые - # Одно из решений - после установки модулей проверять какие пакеты в базе дублируются и эти файлы этих приложений из модуля переписать в корень - #sudo rsync -hrlptgoDHAXEU --existing --update --exclude ".wh.*" --progress /memory/bundles/010-core-2204-2-x86_64.ubm/ / + ## Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет приориетный низкий слой + ## т.е. по факту приложения останутся старыми. В БД пакетов будут новые имена из модуля видны, и далее могут не дать обновить на новые пакеты. + ## т.е. в базе pacman будут новые пакеты, а по факту файлы/бинарники старые + local PATH_PACMAN_DB="/var/lib/pacman/local/" + local PKG_PACMAN_DB_OLD=() + local PKG_PACMAN_DB_NEW=() + # Из всех дубликатов приложений в базе pacman удалить старые версии + #cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #' + readarray -t PKG_PACMAN_DB_OLD < <(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #' + readarray -t PKG_PACMAN_DB_NEW < <(ls -1v ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #' + # Индексы позиций имени пакетов в массиве одинаковые, только разные версии + for PKG_PACMAN_DB in ${!PKG_PACMAN_DB_OLD[@]}; do + # Старые пакеты ${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]} + # Новые пакеты ${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]} + if [[ -d "/memory/changes/${PATH_PACMAN_DB}/${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}" ]]; then + # Если новые пакет находится в самом низком слое /changes/, то значит и файлы данных пакеты будут новые + # Следует удалить старое имя пакета из корня + rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}" + elif [[ -d "/memory/changes/${PATH_PACMAN_DB}/${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}" ]]; then + # Если старый пакет находится в самом низком слое /changes/, то значит и файлы данных пакеты будут старые, не смотря на новизну модуля + # Следует удалить новое имя пакета из корня + rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}" + else + # В нижнем слое /changes/ нет пакета, значит оба пакета и старый и новый находятся в модулях + # Сравниваем номера слоёв старого и нового пакета и удяляем имя пакета в более высоком слое, который перекрывается более низким слоем + local AUFS_BUNDLE=$(aufs-n --raw '$n $bname_bundle') + AUFS_BUNDLE_PKG_NEW=$(find /memory/bundles/*/var/lib/pacman/local/ -maxdepth 1 -type d -name "${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}" | cut -d/ -f4 | head -1) + AUFS_BUNDLE_PKG_OLD=$(find /memory/bundles/*/var/lib/pacman/local/ -maxdepth 1 -type d -name "${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}" | cut -d/ -f4 | head -1) + local AUFS_BUNDLE_PKG_NEW_NUM= + local AUFS_BUNDLE_PKG_OLD_NUM= + [[ ${AUFS_BUNDLE} =~ (^|$'\n')([[:digit:]]+)' '${AUFS_BUNDLE_PKG_NEW}($'\n'|$) ]] && AUFS_BUNDLE_PKG_NEW_NUM="${BASH_REMATCH[2]}" + [[ ${AUFS_BUNDLE} =~ (^|$'\n')([[:digit:]]+)' '${AUFS_BUNDLE_PKG_OLD}($'\n'|$) ]] && AUFS_BUNDLE_PKG_OLD_NUM="${BASH_REMATCH[2]}" + if [[ -n ${AUFS_BUNDLE_PKG_NEW_NUM} && -n ${AUFS_BUNDLE_PKG_OLD_NUM} ]]; then + if [[ ${AUFS_BUNDLE_PKG_NEW_NUM} -lt ${AUFS_BUNDLE_PKG_OLD_NUM} ]]; then + rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_OLD[${PKG_PACMAN_DB}]}" + else + rm -rdf "${PATH_PACMAN_DB}/${PKG_PACMAN_DB_NEW[${PKG_PACMAN_DB}]}" + fi + fi + fi + done + # Ситуация для которой не нужно обработки, т.к. манипулировать данными не нужно + # Одно из решений - после установки модулей проверять какие пакеты в базе дублируются и эти файлы этих приложений из модуля переписать в корень + #sudo rsync -hrlptgoDHAXEU --existing --update --exclude ".wh.*" --progress /memory/bundles/010-core-2204-2-x86_64.ubm/ / } ################ ##### MAIN ##### ################ - + # Если файл подключен как ресурс с функциями, то выйти return 0 2>/dev/null && return 0 if [[ -z $@ ]]; then