sbuild
1.5.3
|
00001 /* Copyright © 2005-2008 Roger Leigh <rleigh@debian.org> 00002 * 00003 * schroot is free software: you can redistribute it and/or modify it 00004 * under the terms of the GNU General Public License as published by 00005 * the Free Software Foundation, either version 3 of the License, or 00006 * (at your option) any later version. 00007 * 00008 * schroot is distributed in the hope that it will be useful, but 00009 * WITHOUT ANY WARRANTY; without even the implied warranty of 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 * General Public License for more details. 00012 * 00013 * You should have received a copy of the GNU General Public License 00014 * along with this program. If not, see 00015 * <http://www.gnu.org/licenses/>. 00016 * 00017 *********************************************************************/ 00018 00019 #ifndef SBUILD_CHROOT_H 00020 #define SBUILD_CHROOT_H 00021 00022 #include <sbuild/sbuild-custom-error.h> 00023 #include <sbuild/sbuild-environment.h> 00024 #include <sbuild/sbuild-format-detail.h> 00025 #include <sbuild/sbuild-keyfile.h> 00026 #include <sbuild/sbuild-regex.h> 00027 #include <sbuild/sbuild-tr1types.h> 00028 00029 #include <list> 00030 #include <ostream> 00031 #include <string> 00032 00033 namespace sbuild 00034 { 00035 00036 class chroot_facet; 00037 00045 class chroot 00046 { 00047 public: 00049 enum setup_type 00050 { 00051 SETUP_START, 00052 SETUP_RECOVER, 00053 SETUP_STOP 00054 }; 00055 00057 enum session_flags 00058 { 00059 SESSION_NOFLAGS = 0, 00060 SESSION_CREATE = 1 << 0, 00061 SESSION_CLONE = 1 << 1, 00062 SESSION_PURGE = 1 << 2 00063 }; 00064 00066 enum verbosity 00067 { 00068 VERBOSITY_QUIET, 00069 VERBOSITY_NORMAL, 00070 VERBOSITY_VERBOSE 00071 }; 00072 00074 enum error_code 00075 { 00076 CHROOT_CREATE, 00077 CHROOT_DEVICE, 00078 CHROOT_TYPE, 00079 DEVICE_ABS, 00080 DEVICE_LOCK, 00081 DEVICE_NOTBLOCK, 00082 DEVICE_UNLOCK, 00083 DIRECTORY_ABS, 00084 FACET_INVALID, 00085 FACET_PRESENT, 00086 FILE_ABS, 00087 FILE_LOCK, 00088 FILE_NOTREG, 00089 FILE_OWNER, 00090 FILE_PERMS, 00091 FILE_UNLOCK, 00092 LOCATION_ABS, 00093 NAME_INVALID, 00094 SCRIPT_CONFIG_CV, 00095 SESSION_UNLINK, 00096 SESSION_WRITE, 00097 VERBOSITY_INVALID 00098 }; 00099 00101 typedef custom_error<error_code> error; 00102 00104 typedef std::shared_ptr<chroot> ptr; 00105 00107 typedef std::shared_ptr<const chroot> const_ptr; 00108 00109 protected: 00111 chroot (); 00112 00114 chroot (const chroot& rhs); 00115 00116 public: 00118 virtual ~chroot (); 00119 00126 static ptr 00127 create (std::string const& type); 00128 00134 virtual ptr 00135 clone () const = 0; 00136 00146 virtual chroot::ptr 00147 clone_session (std::string const& session_id, 00148 std::string const& alias, 00149 std::string const& user, 00150 bool root) const = 0; 00151 00157 virtual chroot::ptr 00158 clone_source () const = 0; 00159 00165 std::string const& 00166 get_name () const; 00167 00173 void 00174 set_name (std::string const& name); 00175 00181 std::string const& 00182 get_description () const; 00183 00189 void 00190 set_description (std::string const& description); 00191 00197 std::string const& 00198 get_mount_location () const; 00199 00205 void 00206 set_mount_location (std::string const& location); 00207 00208 public: 00217 virtual std::string 00218 get_path () const = 0; 00219 00225 string_list const& 00226 get_users () const; 00227 00233 void 00234 set_users (string_list const& users); 00235 00241 string_list const& 00242 get_groups () const; 00243 00249 void 00250 set_groups (string_list const& groups); 00251 00259 string_list const& 00260 get_root_users () const; 00261 00269 void 00270 set_root_users (string_list const& users); 00271 00279 string_list const& 00280 get_root_groups () const; 00281 00289 void 00290 set_root_groups (string_list const& groups); 00291 00298 string_list const& 00299 get_aliases () const; 00300 00307 void 00308 set_aliases (string_list const& aliases); 00309 00315 bool 00316 get_preserve_environment () const; 00317 00323 void 00324 set_preserve_environment (bool preserve_environment); 00325 00331 std::string const& 00332 get_default_shell () const; 00333 00339 void 00340 set_default_shell (std::string const& default_shell); 00341 00349 regex const& 00350 get_environment_filter () const; 00351 00359 void 00360 set_environment_filter (regex const& environment_filter); 00361 00368 bool 00369 get_active () const; 00370 00376 bool 00377 get_original () const; 00378 00384 void 00385 set_original (bool original); 00386 00392 bool 00393 get_run_setup_scripts () const; 00394 00395 protected: 00402 void 00403 set_run_setup_scripts (bool run_setup_scripts); 00404 00405 public: 00413 std::string const& 00414 get_script_config () const; 00415 00423 void 00424 set_script_config (std::string const& script_config); 00425 00433 std::string const& 00434 get_profile () const; 00435 00443 void 00444 set_profile (std::string const& profile); 00445 00452 string_list const& 00453 get_command_prefix () const; 00454 00461 void 00462 set_command_prefix (string_list const& command_prefix); 00463 00469 verbosity 00470 get_verbosity () const; 00471 00477 const char * 00478 get_verbosity_string () const; 00479 00485 void 00486 set_verbosity (verbosity verbosity); 00487 00493 void 00494 set_verbosity (std::string const& verbosity); 00495 00501 virtual std::string const& 00502 get_chroot_type () const = 0; 00503 00510 void 00511 setup_env (environment& env) const; 00512 00520 virtual void 00521 setup_env (chroot const& chroot, 00522 environment& env) const = 0; 00523 00535 void 00536 lock (setup_type type); 00537 00551 void 00552 unlock (setup_type type, 00553 int status); 00554 00555 protected: 00561 virtual void 00562 setup_session_info (bool start); 00563 00578 virtual void 00579 setup_lock(setup_type type, 00580 bool lock, 00581 int status) = 0; 00582 00583 public: 00591 template <typename T> 00592 std::shared_ptr<T> 00593 get_facet (); 00594 00602 template <typename T> 00603 const std::shared_ptr<const T> 00604 get_facet () const; 00605 00611 template <typename T> 00612 void 00613 add_facet (std::shared_ptr<T> facet); 00614 00619 template <typename T> 00620 void 00621 remove_facet (); 00622 00628 template <typename T> 00629 void 00630 remove_facet (std::shared_ptr<T> facet); 00631 00637 template <typename T> 00638 void 00639 replace_facet (std::shared_ptr<T> facet); 00640 00646 string_list 00647 list_facets () const; 00648 00655 session_flags 00656 get_session_flags () const; 00657 00665 virtual chroot::session_flags 00666 get_session_flags (chroot const& chroot) const = 0; 00667 00677 friend std::ostream& 00678 operator << (std::ostream& stream, 00679 ptr const& rhs) 00680 { 00681 rhs->print_details(stream); 00682 return stream; 00683 } 00684 00692 friend 00693 keyfile const& 00694 operator >> (keyfile const& keyfile, 00695 ptr& rhs) 00696 { 00697 rhs->set_keyfile(keyfile); 00698 return keyfile; 00699 } 00700 00708 friend 00709 keyfile& 00710 operator << (keyfile& keyfile, 00711 ptr const& rhs) 00712 { 00713 rhs->get_keyfile(keyfile); 00714 return keyfile; 00715 } 00716 00722 void 00723 get_details (format_detail& detail) const; 00724 00731 virtual void 00732 get_details (chroot const& chroot, 00733 format_detail& detail) const = 0; 00734 00742 void 00743 print_details (std::ostream& stream) const; 00744 00752 void 00753 get_keyfile (keyfile& keyfile) const; 00754 00755 protected: 00764 virtual void 00765 get_keyfile (chroot const& chroot, 00766 keyfile& keyfile) const = 0; 00767 00768 public: 00776 void 00777 set_keyfile (keyfile const& keyfile); 00778 00779 protected: 00789 virtual void 00790 set_keyfile (chroot& chroot, 00791 keyfile const& keyfile, 00792 string_list& used_keys) = 0; 00793 00794 private: 00796 std::string name; 00798 std::string description; 00800 string_list users; 00802 string_list groups; 00804 string_list root_users; 00806 string_list root_groups; 00808 string_list aliases; 00810 bool preserve_environment; 00812 std::string default_shell; 00814 regex environment_filter; 00816 std::string mount_location; 00818 bool original; 00820 bool run_setup_scripts; 00822 std::string script_config; 00824 std::string profile; 00826 string_list command_prefix; 00828 verbosity message_verbosity; 00829 00831 typedef std::shared_ptr<chroot_facet> facet_ptr; 00833 typedef std::list<facet_ptr> facet_list; 00835 facet_list facets; 00836 }; 00837 00844 chroot::session_flags 00845 inline operator | (chroot::session_flags const& lhs, 00846 chroot::session_flags const& rhs) 00847 { 00848 return static_cast<chroot::session_flags> 00849 (static_cast<int>(lhs) | static_cast<int>(rhs)); 00850 } 00851 00858 chroot::session_flags 00859 inline operator & (chroot::session_flags const& lhs, 00860 chroot::session_flags const& rhs) 00861 { 00862 return static_cast<chroot::session_flags> 00863 (static_cast<int>(lhs) & static_cast<int>(rhs)); 00864 } 00865 00866 } 00867 00868 #include <sbuild/sbuild-chroot-facet.h> 00869 00870 namespace sbuild 00871 { 00872 00873 template <typename T> 00874 std::shared_ptr<T> 00875 chroot::get_facet () 00876 { 00877 std::shared_ptr<T> ret; 00878 00879 for (facet_list::const_iterator pos = facets.begin(); 00880 pos != facets.end(); 00881 ++pos) 00882 { 00883 if (ret = std::dynamic_pointer_cast<T>(*pos)) 00884 break; 00885 } 00886 00887 return ret; 00888 } 00889 00890 template <typename T> 00891 const std::shared_ptr<const T> 00892 chroot::get_facet () const 00893 { 00894 std::shared_ptr<T> ret; 00895 00896 for (facet_list::const_iterator pos = facets.begin(); 00897 pos != facets.end(); 00898 ++pos) 00899 { 00900 if (ret = std::dynamic_pointer_cast<T>(*pos)) 00901 break; 00902 } 00903 00904 return std::const_pointer_cast<T>(ret); 00905 } 00906 00907 template <typename T> 00908 void 00909 chroot::add_facet (std::shared_ptr<T> facet) 00910 { 00911 facet_ptr new_facet = std::dynamic_pointer_cast<chroot_facet>(facet); 00912 if (!new_facet) 00913 throw error(FACET_INVALID); 00914 00915 for (facet_list::const_iterator pos = facets.begin(); 00916 pos != facets.end(); 00917 ++pos) 00918 { 00919 if (std::dynamic_pointer_cast<T>(*pos)) 00920 throw error(FACET_PRESENT); 00921 } 00922 00923 new_facet->set_chroot(*this); 00924 facets.push_back(new_facet); 00925 } 00926 00927 template <typename T> 00928 void 00929 chroot::remove_facet () 00930 { 00931 for (facet_list::iterator pos = facets.begin(); 00932 pos != facets.end(); 00933 ++pos) 00934 { 00935 if (std::dynamic_pointer_cast<T>(*pos)) 00936 { 00937 facets.erase(pos); 00938 break; 00939 } 00940 } 00941 } 00942 00943 template <typename T> 00944 void 00945 chroot::remove_facet (std::shared_ptr<T> facet) 00946 { 00947 remove_facet<T>(); 00948 } 00949 00950 template <typename T> 00951 void 00952 chroot::replace_facet (std::shared_ptr<T> facet) 00953 { 00954 remove_facet<T>(); 00955 add_facet(facet); 00956 } 00957 00958 } 00959 00960 #endif /* SBUILD_CHROOT_H */ 00961 00962 /* 00963 * Local Variables: 00964 * mode:C++ 00965 * End: 00966 */