sbuild
1.5.3
|
00001 /* Copyright © 2005-2007 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_SESSION_H 00020 #define SBUILD_SESSION_H 00021 00022 #include <sbuild/sbuild-auth.h> 00023 #include <sbuild/sbuild-chroot.h> 00024 #include <sbuild/sbuild-custom-error.h> 00025 00026 #include <string> 00027 00028 #include <signal.h> 00029 #include <sys/types.h> 00030 #include <termios.h> 00031 #include <unistd.h> 00032 00033 namespace sbuild 00034 { 00035 00046 class session 00047 { 00048 public: 00049 struct chroot_list_entry 00050 { 00052 std::string alias; 00054 sbuild::chroot::ptr chroot; 00055 }; 00056 00058 typedef std::vector<chroot_list_entry> chroot_list; 00059 00061 enum operation 00062 { 00063 OPERATION_AUTOMATIC, 00064 OPERATION_BEGIN, 00065 OPERATION_RECOVER, 00066 OPERATION_END, 00067 OPERATION_RUN 00068 }; 00069 00071 enum error_code 00072 { 00073 CHDIR, 00074 CHDIR_FB, 00075 CHILD_CORE, 00076 CHILD_FAIL, 00077 CHILD_FORK, 00078 CHILD_SIGNAL, 00079 CHILD_WAIT, 00080 CHROOT, 00081 CHROOT_ALIAS, 00082 CHROOT_LOCK, 00083 CHROOT_NOTFOUND, 00084 CHROOT_SETUP, 00085 CHROOT_UNLOCK, 00086 COMMAND_ABS, 00087 EXEC, 00088 GROUP_GET_SUP, 00089 GROUP_GET_SUPC, 00090 GROUP_SET, 00091 GROUP_SET_SUP, 00092 GROUP_UNKNOWN, 00093 PAM, 00094 ROOT_DROP, 00095 SET_SESSION_ID, 00096 SHELL, 00097 SHELL_FB, 00098 SIGNAL_CATCH, 00099 SIGNAL_SET, 00100 USER_SET, 00101 USER_SWITCH 00102 }; 00103 00105 typedef custom_error<error_code> error; 00106 00108 typedef std::shared_ptr<session> ptr; 00109 00117 session (std::string const& service, 00118 operation operation, 00119 chroot_list const& chroots); 00120 00122 virtual ~session (); 00123 00129 auth::ptr const& 00130 get_auth () const; 00131 00137 void 00138 set_auth (auth::ptr& auth); 00139 00145 chroot_list const& 00146 get_chroots () const; 00147 00153 void 00154 set_chroots (chroot_list const& chroots); 00155 00161 operation 00162 get_operation () const; 00163 00169 void 00170 set_operation (operation operation); 00171 00178 std::string const& 00179 get_session_id () const; 00180 00187 void 00188 set_session_id (std::string const& session_id); 00189 00195 std::string const& 00196 get_verbosity () const; 00197 00204 void 00205 set_verbosity (std::string const& verbosity); 00206 00212 bool 00213 get_preserve_environment () const; 00214 00220 void 00221 set_preserve_environment (bool preserve_environment); 00222 00228 std::string const& 00229 get_shell_override () const; 00230 00236 void 00237 set_shell_override (std::string const& shell); 00238 00244 string_map const& 00245 get_user_options () const; 00246 00252 void 00253 set_user_options (string_map const& user_options); 00254 00260 bool 00261 get_force () const; 00262 00268 void 00269 set_force (bool force); 00270 00274 void 00275 save_termios (); 00276 00280 void 00281 restore_termios (); 00282 00289 int 00290 get_child_status () const; 00291 00298 bool 00299 is_group_member (std::string const& groupname) const; 00300 00301 protected: 00305 void 00306 get_chroot_membership (chroot::ptr const& chroot, 00307 bool& in_users, 00308 bool& in_root_users, 00309 bool& in_groups, 00310 bool& in_root_groups) const; 00311 00317 virtual auth::status 00318 get_chroot_auth_status (auth::status status, 00319 chroot::ptr const& chroot) const; 00320 00321 public: 00327 virtual sbuild::auth::status 00328 get_auth_status () const; 00329 00336 void 00337 run (); 00338 00339 protected: 00347 virtual void 00348 run_impl (); 00349 00358 virtual string_list 00359 get_login_directories (sbuild::chroot::ptr& session_chroot, 00360 environment const& env) const; 00361 00370 virtual string_list 00371 get_command_directories (sbuild::chroot::ptr& session_chroot, 00372 environment const& env) const; 00373 00382 virtual string_list 00383 get_shells (sbuild::chroot::ptr& session_chroot) const; 00384 00393 virtual std::string 00394 get_shell (sbuild::chroot::ptr& session_chroot) const; 00395 00404 virtual void 00405 get_command (chroot::ptr& session_chroot, 00406 std::string& file, 00407 string_list& command, 00408 environment& env) const; 00409 00418 virtual void 00419 get_login_command (chroot::ptr& session_chroot, 00420 std::string& file, 00421 string_list& command, 00422 environment& env) const; 00423 00432 virtual void 00433 get_user_command (chroot::ptr& session_chroot, 00434 std::string& file, 00435 string_list& command, 00436 environment const& env) const; 00437 00438 private: 00451 void 00452 setup_chroot (chroot::ptr& session_chroot, 00453 chroot::setup_type setup_type); 00454 00462 void 00463 run_chroot (chroot::ptr& session_chroot); 00464 00472 void 00473 run_child (chroot::ptr& session_chroot); 00474 00483 void 00484 wait_for_child (pid_t pid, 00485 int& child_status); 00486 00492 void 00493 set_sighup_handler (); 00494 00498 void 00499 clear_sighup_handler (); 00500 00506 void 00507 set_sigint_handler (); 00508 00512 void 00513 clear_sigint_handler (); 00514 00520 void 00521 set_sigterm_handler (); 00522 00526 void 00527 clear_sigterm_handler (); 00528 00537 void 00538 set_signal_handler (int signal, 00539 struct sigaction *saved_signal, 00540 void (*handler)(int)); 00541 00549 void 00550 clear_signal_handler (int signal, 00551 struct sigaction *saved_signal); 00552 00554 auth::ptr authstat; 00556 chroot_list chroots; 00558 int chroot_status; 00560 bool lock_status; 00562 int child_status; 00564 operation session_operation; 00566 std::string session_id; 00568 bool force; 00570 struct sigaction saved_sighup_signal; 00572 struct sigaction saved_sigint_signal; 00574 struct sigaction saved_sigterm_signal; 00576 struct termios saved_termios; 00578 bool termios_ok; 00580 std::string verbosity; 00582 bool preserve_environment; 00584 std::string shell; 00586 string_map user_options; 00587 00588 protected: 00590 std::string cwd; 00591 }; 00592 00593 } 00594 00595 #endif /* SBUILD_SESSION_H */ 00596 00597 /* 00598 * Local Variables: 00599 * mode:C++ 00600 * End: 00601 */