X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fscp_dcp_job.cc;h=3d941888e76585350f461417893d9bd4daab32dd;hb=32fc1ddb0ee004d18c36155ddcf4d9b3998a7061;hp=94e403816ee36fd073c6d1a06f21fe63f44b9e6b;hpb=bb767c7e338414beee132af3e96829c1448e214b;p=dcpomatic.git diff --git a/src/lib/scp_dcp_job.cc b/src/lib/scp_dcp_job.cc index 94e403816..3d941888e 100644 --- a/src/lib/scp_dcp_job.cc +++ b/src/lib/scp_dcp_job.cc @@ -27,14 +27,17 @@ #include #include #include +#include "compose.hpp" #include "scp_dcp_job.h" #include "exceptions.h" #include "config.h" #include "log.h" -#include "film_state.h" +#include "film.h" -using namespace std; -using namespace boost; +using std::string; +using std::stringstream; +using std::min; +using boost::shared_ptr; class SSHSession { @@ -78,9 +81,7 @@ public: { scp = ssh_scp_new (s, SSH_SCP_WRITE | SSH_SCP_RECURSIVE, Config::instance()->tms_path().c_str ()); if (!scp) { - stringstream s; - s << "Could not start SCP session (" << ssh_get_error (s) << ")"; - throw NetworkError (s.str ()); + throw NetworkError (String::compose ("Could not start SCP session (%1)", ssh_get_error (s))); } } @@ -93,8 +94,8 @@ public: }; -SCPDCPJob::SCPDCPJob (shared_ptr s, Log* l) - : Job (s, shared_ptr (), l) +SCPDCPJob::SCPDCPJob (shared_ptr f, shared_ptr req) + : Job (f, req) , _status ("Waiting") { @@ -103,134 +104,110 @@ SCPDCPJob::SCPDCPJob (shared_ptr s, Log* l) string SCPDCPJob::name () const { - stringstream s; - s << "Copy DCP to TMS"; - return s.str (); + return "Copy DCP to TMS"; } void SCPDCPJob::run () { - 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); - - 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 ()); - } + _film->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) { + throw NetworkError (String::compose ("Could not connect to server %1 (%2)", Config::instance()->tms_ip(), ssh_get_error (ss.session))); + } + + int const state = ssh_is_server_known (ss.session); + if (state == SSH_SERVER_ERROR) { + throw NetworkError (String::compose ("SSH error (%1)", ssh_get_error (ss.session))); + } + + r = ssh_userauth_password (ss.session, 0, Config::instance()->tms_password().c_str ()); + if (r != SSH_AUTH_SUCCESS) { + throw NetworkError (String::compose ("Failed to authenticate with server (%1)", ssh_get_error (ss.session))); + } + + SSHSCP sc (ss.session); + + r = ssh_scp_init (sc.scp); + if (r != SSH_OK) { + throw NetworkError (String::compose ("Could not start SCP session (%1)", ssh_get_error (ss.session))); + } + + r = ssh_scp_push_directory (sc.scp, _film->dcp_name().c_str(), S_IRWXU); + if (r != SSH_OK) { + throw NetworkError (String::compose ("Could not create remote directory %1 (%2)", _film->dcp_name(), ssh_get_error (ss.session))); + } + + string const dcp_dir = _film->dir (_film->dcp_name()); + + boost::uintmax_t bytes_to_transfer = 0; + for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (dcp_dir); i != boost::filesystem::directory_iterator(); ++i) { + bytes_to_transfer += boost::filesystem::file_size (*i); + } + + boost::uintmax_t buffer_size = 64 * 1024; + char buffer[buffer_size]; + boost::uintmax_t bytes_transferred = 0; + + for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (dcp_dir); i != boost::filesystem::directory_iterator(); ++i) { - 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); - } + string const leaf = boost::filesystem::path(*i).leaf().generic_string (); - int buffer_size = 64 * 1024; - char buffer[buffer_size]; - int bytes_transferred = 0; + set_status ("copying " + leaf); - for (filesystem::directory_iterator i = filesystem::directory_iterator (dcp_dir); i != filesystem::directory_iterator(); ++i) { + boost::uintmax_t to_do = boost::filesystem::file_size (*i); + ssh_scp_push_file (sc.scp, leaf.c_str(), to_do, S_IRUSR | S_IWUSR); - /* Aah, the sweet smell of progress */ -#if BOOST_FILESYSTEM_VERSION == 3 - string const leaf = filesystem::path(*i).leaf().generic_string (); -#else - string const leaf = i->leaf (); -#endif - - set_status ("Copying " + leaf); - - int to_do = filesystem::file_size (*i); - ssh_scp_push_file (sc.scp, leaf.c_str(), to_do, S_IRUSR | S_IWUSR); + FILE* f = fopen (boost::filesystem::path (*i).string().c_str(), "rb"); + if (f == 0) { + throw NetworkError (String::compose ("Could not open %1 to send", *i)); + } - int fd = open (filesystem::path (*i).string().c_str(), O_RDONLY); - if (fd == 0) { - stringstream s; - s << "Could not open " << *i << " to send"; - throw NetworkError (s.str ()); + while (to_do > 0) { + int const t = min (to_do, buffer_size); + size_t const read = fread (buffer, 1, t, f); + if (read != size_t (t)) { + throw ReadFileError (boost::filesystem::path (*i).string()); } - - while (to_do > 0) { - int const t = min (to_do, buffer_size); - read (fd, buffer, t); - r = ssh_scp_write (sc.scp, buffer, t); - if (r != SSH_OK) { - stringstream s; - s << "Could not write to remote file (" << ssh_get_error (ss.session) << ")"; - throw NetworkError (s.str ()); - } - to_do -= t; - bytes_transferred += t; - - set_progress ((double) bytes_transferred / bytes_to_transfer); + + r = ssh_scp_write (sc.scp, buffer, t); + if (r != SSH_OK) { + throw NetworkError (String::compose ("Could not write to remote file (%1)", ssh_get_error (ss.session))); } + to_do -= t; + bytes_transferred += t; + + set_progress ((double) bytes_transferred / bytes_to_transfer); } - set_progress (1); - set_status ("OK"); - set_state (FINISHED_OK); - - } catch (std::exception& e) { - - stringstream s; - set_progress (1); - set_state (FINISHED_ERROR); - set_status (e.what ()); - - s << "SCP DCP job failed (" << e.what() << ")"; - _log->log (s.str ()); - - throw; + fclose (f); } + + set_progress (1); + set_status (""); + set_state (FINISHED_OK); } string SCPDCPJob::status () const { boost::mutex::scoped_lock lm (_status_mutex); - return _status; + stringstream s; + s << Job::status (); + if (!_status.empty ()) { + s << "; " << _status; + } + return s.str (); } void