Организация решения задачи сейсморазведки на параллельных ресурсах
Решение задачи сейсморазведки на параллельных ресурсах для нормального падения для плоскопараллельных сред реализуется на вычислительной архитектуре семейства SKIF, на которой используется операционная система на основе ядра linux CentOS. Доступ к кластеру с такой системой организуется через протокол SSH. Для организации такого доступа используется библиотека
libssh 0.3.
Библиотека libssh предназначена для интеграции поддержки SSH в программы на языке Си. Библиотека позволяет выполнять программы на удаленном сервере, копировать файлы через защищенное соединение, при этом осуществляется поддержка как стандартного scp механизма, так и поддержка sftp, которая реализована без задействования внешних библиотек, таких как libcrypto (из OpenSSL) или libgcrypt.
Libssh реализует серверные и клиентские функции, поддерживает протоколы SSH1 и SSH2, режимы шифрования AES-128, AES-192, AES-256, Blowfish, 3DES в CBC, возможность работы с серверами публичных ключей RSA и DSS, поддерживает сжатие данных, работу совместно с ssh-agent и организацию работы нескольких сеансов в рамках одного соединения.
Исходные тексты библиотеки распространяются под лицензией LGPL. Отсутствие зависимостей от внешних приложений и библиотек, позволяет использовать libssh для встраиваемых устройств. Из программ, использующих libssh можно отметить утилиту для двухсторонней синхронизации файлов csync.
Для взаимодействия планшетов с этой библиотекой реализован класс QSshSocket. Он предназначен для создания асинхронного программного интерфейса обмена данными (сокета) по протоколам ssh и scp. Класс реализован для использования с библиотекой Qt, которая является кроссплатформенной и соответствует логике программной реализации планшетов. Класс эффективно использует функции библиотеки libSSH, в результате чего имеет несколько недостатков, например, он скрывает криптографические ключи на прохождение данных, обеспечивает ответы на команды в одном потоке, не используя сигналы «readyRead», но в случае необходимости эти недостатки можно доработать. Для того чтобы получить эту работу для потока, данный файл должен обязательно быть включен в тело проекта.
Стандартный класс QThread из библиотеки QT является прародителем класса QSshSocket, который помимо стандартных возможностей включает в себя следующий набор констант и функций:
· Набор констант SshError описывает ошибки соединения и включает в себя следующие состояния:
§ SocketError - возникла проблема создания сокета, что, скорее всего, связано с отсутствием подключения к Интернету;
§ SessionCreationError – SH-сеанс не может быть создан из-за невозможности найти удаленный хост;
§ ChannelCreationError – канал SSH не может быть создан для предыдущей операции;
§ ScpChannelCreationError – канал scp не может быть создан для предыдущей операции передачи файлов;
§ ScpPullRequestError – возникла ошибка запроса передачи файла через pull;
§ ScpPushRequestError – возникла ошибка запроса передачи файла через push;
§ ScpFileNotCreatedError – файл назначения для предыдущей передачи не существует;
§ ScpReadError – возникла ошибка при чтении удаленного файла. Возможно, это связано с правами пользователя;
§ ScpWriteError – возникла ошибка записи в удаленный файл. Возможно, это связано с правами пользователя;
§ PasswordAuthenticationFailedError – полномочия пользователя на удаленном хосте не проходят проверкой подлинности;
· explicit QSshSocket(QObject * parent = 0) – конструктор класса;
· ~ QSshSocket() – деструктор класса;
· void connectToHost(QString host, int port =22) – эта функция соединяет данный сокет с указанным узлом через указанный порт. В случае успеха, сигнал подключен и испускается, иначе формируется ошибка;
· void disconnectFromHost() – эта функция отключает соединение от текущего хоста (если таковой имеется). В случае успеха, создается сигнал отсоединения, иначе формируется ошибка;
· void executeCommand(QString command) – эта функция выполняет команду удаленного управления на подключенном хосте. Если нет подключения к удаленному узлу, то команда не выполняется. В случае успеха, формируется сигнал commandExecuted, иначе формируется ошибка;
· QString host() – возвращает краткое имя хоста удаленной машины, к которому есть соединение. Если нет подключения к удаленному узлу, то функция возвращает пустую строку;
· bool isLoggedIn() – возвращает значение о том, был ли пользователь внесен в журнал на удаленном хосте;
· bool isConnected() – возвращает значение о подключении сокета в данный момент к удаленному узлу;
· void login(QString user, QString password) – эта функция подключения пользователя в данный момент по учетным данным. В случае успеха, создается сигнал подлинности, иначе формируется ошибка;
· int port() – возвращает порт текущего соединения. Если не подключен к удаленному узлу, это возвращает -1;
· void pullFile(QString localPath, QString remotePath) – эта функция пытается перенести удаленный файл с подключенного хоста в локальное хранилище. Локальный файл не должен быть создан заранее. В случае успеха создается сигнал pullSuccessful, иначе формируется ошибка. Если нет подключения к удаленному хосту или если передача была неудачной, формируется сигнал ошибки. Параметрами функции являются путь к файлу хранится на локальном компьютере и путь к файлу, хранящемуся на удаленном компьютере;
· void setWorkingDirectory(QString path) – эта функция пытается установить рабочий каталог подключения к пути и формирует сигнал workingDirectorySet после завершения. Если workingDirectorySet указывает на отсутствие изменений в рабочем каталоге, путь не может быть найден. Если нет подключения к удаленному хосту или если передача была неудачной, формируется сигнал ошибки. Функция имеет параметр, в котором указан относительный или абсолютный путь к каталогу на удаленном хосте;
· QString user() – возвращает краткое имя текущего пользователя, прошедшего аутентификацию на удаленном хосте. Если нет подключения к удаленному хосту, или если пользователь не прошел проверку подлинности, функция возвращает пустую строку.
Для управления класс имеет набор сигналов и слотов, которые привязываются к соответствующим событиям, происходящим в программной среде. Класс включает следующие сигналы:
· void connected() – данный сигнал посылается, когда удаленный хост был подключен к соединению;
· void disconnected() – данный сигнал испускается, когда этот класс был правильно отключен от удаленного хоста;
· void error(QSshSocket::SshError error) – данный сигнал испускается при возникновении ошибки. В качестве параметра указывается тип ошибки;
· void commandExecuted(QString command,QString response) – данный сигнал посылается, когда ответ от удаленного хоста принимается относительно команды. Параметром сигнала является ответ на команду, которая была выполнена;
· void loginSuccessful() – данный сигнал посылается, когда пользователь был зарегистрирован и подключен на удаленном хосте. Параметрами сигнала являются путь к локальному файлу, что удаленный файл был отправлен в очередь и путь к файлу добытого из удаленного хоста;
· void pushSuccessful(QString localFile, QString remoteFile) – данный сигнал посылается, когда локальный файл успешно перенесен на удаленный файл. Параметрами сигнала являются путь к локальному файлу отправленного на удаленный хост и путь к удаленному файлу, который локальный файл был отправлен;
· void workingDirectorySet(QString cwd) – данный сигнал посылается, когда устанавливается текущий рабочий каталог, который задан в виде параметра.
Класс использует слот запуска run().
Дополнительно класс содержит ряд частных констант и переменных, которые обеспечивают его работу.
Таким образом, класс обеспечивает работу планшета с кластером семейства СКИФ посредством использования протоколов SSH, как указано на рисунке 3.12.
Рисунок 3.12. – Схема взаимодействия планшета интерактивного моделирования с кластером семейства СКИФ, через класс QSshSocket