- try {
- _log->log ("SCP DCP job starting");
-
- SSHSession ss;
-
- set_status ("Connecting");
-
- ssh_options_set (ss.session, SSH_OPTIONS_HOST, Config::instance()->tms_ip().c_str ());
- ssh_options_set (ss.session, SSH_OPTIONS_USER, Config::instance()->tms_user().c_str ());
- int const port = 22;
- ssh_options_set (ss.session, SSH_OPTIONS_PORT, &port);
+ _log->log ("SCP DCP job starting");
+
+ SSHSession ss;
+
+ set_status ("Connecting");
+
+ ssh_options_set (ss.session, SSH_OPTIONS_HOST, Config::instance()->tms_ip().c_str ());
+ ssh_options_set (ss.session, SSH_OPTIONS_USER, Config::instance()->tms_user().c_str ());
+ int const port = 22;
+ ssh_options_set (ss.session, SSH_OPTIONS_PORT, &port);
+
+ int r = ss.connect ();
+ if (r != SSH_OK) {
+ stringstream s;
+ s << "Could not connect to server " << Config::instance()->tms_ip() << " (" << ssh_get_error (ss.session) << ")";
+ throw NetworkError (s.str ());
+ }
+
+ int const state = ssh_is_server_known (ss.session);
+ if (state == SSH_SERVER_ERROR) {
+ stringstream s;
+ s << "SSH error (" << ssh_get_error (ss.session) << ")";
+ throw NetworkError (s.str ());
+ }
+
+ r = ssh_userauth_password (ss.session, 0, Config::instance()->tms_password().c_str ());
+ if (r != SSH_AUTH_SUCCESS) {
+ stringstream s;
+ s << "Failed to authenticate with server (" << ssh_get_error (ss.session) << ")";
+ throw NetworkError (s.str ());
+ }
+
+ SSHSCP sc (ss.session);
+
+ r = ssh_scp_init (sc.scp);
+ if (r != SSH_OK) {
+ stringstream s;
+ s << "Could not start SCP session (" << ssh_get_error (ss.session) << ")";
+ throw NetworkError (s.str ());
+ }
+
+ r = ssh_scp_push_directory (sc.scp, _fs->name.c_str(), S_IRWXU);
+ if (r != SSH_OK) {
+ stringstream s;
+ s << "Could not create remote directory " << _fs->name << "(" << ssh_get_error (ss.session) << ")";
+ throw NetworkError (s.str ());
+ }
+
+ string const dcp_dir = _fs->dir (_fs->name);
+
+ int bytes_to_transfer = 0;
+ for (filesystem::directory_iterator i = filesystem::directory_iterator (dcp_dir); i != filesystem::directory_iterator(); ++i) {
+ bytes_to_transfer += filesystem::file_size (*i);
+ }
+
+ int buffer_size = 64 * 1024;
+ char buffer[buffer_size];
+ int bytes_transferred = 0;
+
+ for (filesystem::directory_iterator i = filesystem::directory_iterator (dcp_dir); i != filesystem::directory_iterator(); ++i) {