00001
00002
00003
00004
00005
00006
00007
00008
00012 #include "zypp/source/yum/YUMScriptImpl.h"
00013 #include "zypp/Arch.h"
00014 #include "zypp/Edition.h"
00015 #include "zypp/base/Gettext.h"
00016
00017 #include "zypp/source/yum/YUMSourceImpl.h"
00018
00019 #include <fstream>
00020
00021
00022 using namespace std;
00023 using namespace zypp::detail;
00024
00026 namespace zypp
00027 {
00028
00029 namespace source
00030 {
00031 namespace yum
00032 {
00033
00035
00036
00037
00039
00042 YUMScriptImpl::YUMScriptImpl(
00043 Source_Ref source_r,
00044 const zypp::parser::yum::YUMPatchScript & parsed
00045 )
00046 : _do_script(parsed.do_script)
00047 , _undo_script(parsed.undo_script)
00048 , _do_location(parsed.do_location)
00049 , _undo_location(parsed.undo_location)
00050 , _do_media(1)
00051 , _undo_media(1)
00052 , _do_checksum(parsed.do_checksum_type, parsed.do_checksum)
00053 , _undo_checksum(parsed.undo_checksum_type, parsed.undo_checksum)
00054 , _source(source_r)
00055 {
00056 unsigned do_media = strtol(parsed.do_media.c_str(), 0, 10);
00057 if (do_media > 0)
00058 _do_media = do_media;
00059 unsigned undo_media = strtol(parsed.undo_media.c_str(), 0, 10);
00060 if (undo_media > 0)
00061 _undo_media = undo_media;
00062 }
00063
00064 Pathname YUMScriptImpl::do_script() const {
00065 if (_do_script != "")
00066 {
00067 _tmp_file = filesystem::TmpFile();
00068 Pathname pth = _tmp_file.path();
00069 ofstream st(pth.asString().c_str());
00070 st << _do_script << endl;
00071 return pth;
00072 }
00073 else if (_do_location != "" && _do_location != "/")
00074 {
00075 Pathname script = source().provideFile(_do_location, _do_media);
00076 if (! YUMSourceImpl::checkCheckSum(script, _do_checksum.type(), _do_checksum.checksum()))
00077 {
00078 ZYPP_THROW(Exception(N_("Failed check for the script file check sum")));
00079 }
00080 return script;
00081 }
00082 else
00083 {
00084 return Pathname();
00085 }
00086 }
00088 Pathname YUMScriptImpl::undo_script() const {
00089 if (_undo_script != "")
00090 {
00091 _tmp_file = filesystem::TmpFile();
00092 Pathname pth = _tmp_file.path();
00093 ofstream st(pth.asString().c_str());
00094 st << _undo_script << endl;
00095 return pth;
00096 }
00097 else if (_undo_location != "" && _undo_location != "/")
00098 {
00099 Pathname script = source().provideFile(_undo_location, _undo_media);
00100 if (! YUMSourceImpl::checkCheckSum(script, _undo_checksum.type(), _undo_checksum.checksum()))
00101 {
00102 ZYPP_THROW(Exception(N_("Failed check for the script file check sum")));
00103 }
00104 return script;
00105 }
00106 else return Pathname();
00107 }
00109 bool YUMScriptImpl::undo_available() const {
00110 return _undo_script != ""
00111 || (_undo_location != "" && _undo_location != "/");
00112 }
00113
00114 Source_Ref YUMScriptImpl::source() const
00115 { return _source; }
00116
00117
00118
00119 }
00121 }
00124 }