В версии 2.6.2 (использую исполняемый образ) проблема решена, работает непосредственно с облачного диска.
Пока так и оставлю, скрипт синхронизации получается ненужным.
Пользователь добавил сообщение 02 Декабря 2020, 11:19:34:
Поправка, в 2.6.2 все еще хуже, намного.
Подключаю (через Наутилус) облачный диск, запускаю KeePassXC, открываю с него файл, допустим password.kdbx.
Файл открывается, но имя базы в заголовке меняется с password на что-то вроде ACvLca2oUHdEmR9hcdP1Ml_P5iMD5RYeG (как я понимаю, это какой-то внутренний идентификатор файла в облаке).
С базой можно работать, но при сохранении она сохраняется в облако уже с именем ACvLca2oUHdEmR9hcdP1Ml_P5iMD5RYeG.
И если облачный диск размонтировать, а потом снова подключить (например после перезагрузки), то KeePassXC уже не может открыть базу паролей, потому что не находит файл password.kdbx. И другие клиенты KeePass (например на смартфоне и другом десктопе) так же не могут открыть эту базу.
Пользователь добавил сообщение 02 Декабря 2020, 11:55:55:
Вообщем вернул обратно версию 2.4.3 и скрипт синхронизации.
Помогите сделать стартер к этому скрипту, чтобы его можно было запускать с рабочего стола или панели быстрого запуска.
Если я делаю симлинк, то при запуске выдается запрос, что делать - запустить или просмотреть.
Если сделать desktop-файл, то он не запускается.
Вот содержимое desktop-файла:
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon=keepassxc
Exec=sh $HOME/scripts/keepass.sh
Name=KeePassSync
И еще вопрос - можно ли консольное окно сделать скрытым?
Пользователь добавил сообщение 02 Декабря 2020, 12:19:42:
Написал так: Exec=/home/user/scripts/keepass.sh
Теперь работает. Причем именно так, как мне надо - с невидимым терминалом.
Это баг или фича?
Раньше путь указывал через ~ и $HOME - не работало.
С тильдой понятно, не должно работать.
А почему не работало с $HOME?
Пользователь добавил сообщение 02 Декабря 2020, 12:49:24:
Финальные версии.
Скрипт-стартер:
#!/bin/sh
CLOUD="gd:"
LOCAL="$HOME/Clouds/keepass"
FILE="passwords.kdbx"
FILE_TIMESTAMP=
LOG="$0.log"
RCLONE="/usr/bin/rclone"
RCLONE_OPTS="-q --auto-confirm"
KEEPASS="/usr/bin/keepassxc"
KEEPASS_OPTS=""
# Запись в журнал
log ()
{
[ -t 1 ] && echo "$*"
if [ -z "$*" ]; then
echo >> "$LOG"
else
echo "`date "+%Y-%m-%d %H:%M:%S"` [pid $$]: $*" >> "$LOG"
fi
}
# Проверка и подготовка
proc_prepare ()
{
if [ ! -f "${LOCAL}/${FILE}" ]; then
echo "* Database not exists, download from cloud store..."
proc_get
fi
}
# Запуск KeePassXC
proc_start ()
{
echo "* Check cloud store..."
proc_sync
FILE_TIMESTAMP=`date -r "${LOCAL}/${FILE}" +'%s'`
echo "* Database timestamp: $FILE_TIMESTAMP"
echo "* Start KeePassXC..."
$KEEPASS $KEEPASS_OPTS "${LOCAL}/${FILE}"
NEW_TIMESTAMP=`date -r "${LOCAL}/${FILE}" +'%s'`
if [ $FILE_TIMESTAMP -ne $NEW_TIMESTAMP ]; then
echo "* Database changed, update cloud"
proc_put
fi
}
# Автоматическая синхронизация файла данных
proc_sync ()
{
echo "* Check cloud timestamp..."
CLOUD_TS=`$RCLONE $RCLONE_OPTS lsjson ${CLOUD}${FILE} 2> /dev/null`
RC=$?
if [ $RC != 0 ]; then
echo "! Remote access error!"
exit 1
fi
CLOUD_ID=`echo $CLOUD_TS | jq -r '.[0].ID'`
CLOUD_TS=`echo $CLOUD_TS | jq -r '.[0].ModTime'`
CLOUD_TS=`date --date="$CLOUD_TS" +'%s'`
echo "* Cloud timestamp: $CLOUD_TS (`date --date="@$CLOUD_TS" --rfc-3339=seconds`)"
echo "* Cloud ID: $CLOUD_ID"
log "INFO: ID [$CLOUD_ID], timestamp `date --date="@$CLOUD_TS" --rfc-3339=seconds`"
echo "* Check local timestamp..."
if [ ! -d "${LOCAL}" ]; then
mkdir -p "${LOCAL}"
fi
if [ -f "${LOCAL}/${FILE}" ]; then
LOCAL_TS=`date -r "${LOCAL}/${FILE}" +'%s'`
echo "* Local timestamp: $LOCAL_TS (`date --date="@$LOCAL_TS" --rfc-3339=seconds`)"
else
LOCAL_TS=0
echo "* Local timestamp: none"
fi
echo "* Compare databases..."
if [ $LOCAL_TS -eq $CLOUD_TS ]; then
RCLONE_SRC=
elif [ $LOCAL_TS -gt $CLOUD_TS ]; then
RCLONE_SRC=LOCAL
elif [ $LOCAL_TS -lt $CLOUD_TS ]; then
RCLONE_SRC=CLOUD
else
RCLONE_SRC=ERROR
fi
if [ -n "$RCLONE_SRC" ]; then
if [ "ERROR" = "$RCLONE_SRC" ]; then
echo "! Comparsion fail"
RC=-1
elif [ "CLOUD" = "$RCLONE_SRC" ]; then
echo "* SYNC: CLOUD -> LOCAL"
$RCLONE $RCLONE_OPTS copy "${CLOUD}${FILE}" "${LOCAL}"
RC=$?
log "SYNC: CLOUD -> LOCAL, RC=$RC"
elif [ "LOCAL" = "$RCLONE_SRC" ]; then
echo "* SYNC: LOCAL -> CLOUD"
$RCLONE $RCLONE_OPTS copy "${LOCAL}${FILE}" "${CLOUD}"
RC=$?
log "SYNC: LOCAL -> CLOUD, RC=$RC"
else
RC=0
fi
fi
}
# Загрузка файла данных из облака в локальное хранилище
proc_get ()
{
if [ ! -d "${LOCAL}" ]; then
echo "* Create local store"
mkdir -p "${LOCAL}"
fi
$RCLONE $RCLONE_OPTS copy "${CLOUD}${FILE}" "${LOCAL}"
RC=$?
log "GET: CLOUD -> LOCAL, RC=$RC"
}
# Загрузка файла данных из локального хранилища в облако
proc_put ()
{
if [ ! -d "${LOCAL}" ]; then
echo "! Local store not exists, fail"
exit 1
fi
if [ ! -f "${LOCAL}/${FILE}" ]; then
echo "! Local database not exists, fail"
exit 1
fi
$RCLONE $RCLONE_OPTS copy "${LOCAL}/${FILE}" "${CLOUD}"
RC=$?
log "PUT: LOCAL -> CLOUD, RC=$RC"
}
proc_prepare
proc_start
desktop-файл:
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon=keepassxc
Exec=/home/user/scripts/keepass.sh
Name=KeePassSync