18 августа 2014 г.

Починка Skype 4.3 в linux

Последнее обновление клиента Skype для Linux получилось особо удачным. После обновления скайп поработал с недельку, а потом внезапно устал. Перезапуск клиента не помогал, а гугление результатов не давало. Такая же проблема наблюдалась не только у меня, но и у многих других пользователей linux.

Решение проблемы нашлось позже. Видимо разработчики Skype Microsoft переусердствовали при запрете протоколов старых клиентов, и скайп начал падать при приеме файлов от пользователей со старой версией skype. А поскольку Skype Microsoft худо-бедно наладили синхронизацию истории сообщений, даже полное удаление профиля ~/.Skype/<yourname>  не помогает, поскольку с созданием нового профиля подтягиваются старые сообщения, в том числе о передаче файлов.
Предупреждаю! Для починки нужно обладать недюжинным терпением.
Итак решение:

  1. Бэкапим базу данных вашего профиля, которая лежит в ~/.Skype/<yourskypelogin>/main.db
  2. Запускаем скайп и ждем когда он упадет
  3. открываем базу данных вашего профиля:
    sqlite3 .Skype/<yourskypelogin>/main.db
  4. Выполняем скрипт
    >UPDATE messages
       SET body_xml =(
             SELECT SUBSTR( body_xml, files_start, alt_end - files_start ) ||
                    SUBSTR( body_xml, 0, files_start ) ||
                    SUBSTR( body_xml, alt_end )
               FROM (
                 SELECT msg.body_xml,
                        instr( msg.body_xml, '<files' )  files_start,
                        instr( msg.body_xml, 'alt="' ) + 5 alt_end
                   FROM messages msg
                  WHERE msg.id = messages.id
               )
           )
     WHERE type = 68
       AND body_xml NOT LIKE '<file%';

    > .quit
  5. Возвращаемся к шагу 2
После нескольких попыток вся история синхронизируется, "вредные сообщения" удаляются и скайп работает нормально. Но есть одно "но": история скайпа синхронизируется достаточно нетривиальным образом, в формате peer-to-peer,  то есть синхронизация истории происходит только с для контактов которые в сети. Если у вас в контакт-листе есть человек который когда-то слал вам файлы, и он выходит в сеть - ждите беды.



Для решения этой проблемы был написан небольшой shell-скрипт, который выполняет очистку истории и перезапускпри падении в автоматическом режиме.

#!/bin/bash
for (( ; ; ))
    do
    skype
    if ["$?" eq 134] #134 - с таким кодом возврата падает скайп
        then sqlite3 .Skype/<yourskypename>/main.db < skype.sql #sql-скрипт выше
    fi
done


не забываем добавить бит выполнения.
терминал у меня открыт всегда поэтому команда ./skype.sh & отлично справляется (можно и в .xinitrc добавить).

Комментариев нет:

Отправить комментарий