00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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:
00050 typedef std::vector<chroot::ptr> chroot_list;
00051
00053 enum operation
00054 {
00055 OPERATION_AUTOMATIC,
00056 OPERATION_BEGIN,
00057 OPERATION_RECOVER,
00058 OPERATION_END,
00059 OPERATION_RUN
00060 };
00061
00063 enum error_code
00064 {
00065 CHDIR,
00066 CHDIR_FB,
00067 CHILD_CORE,
00068 CHILD_FAIL,
00069 CHILD_FORK,
00070 CHILD_SIGNAL,
00071 CHILD_WAIT,
00072 CHROOT,
00073 CHROOT_ALIAS,
00074 CHROOT_LOCK,
00075 CHROOT_NOTFOUND,
00076 CHROOT_SETUP,
00077 CHROOT_UNLOCK,
00078 COMMAND_ABS,
00079 EXEC,
00080 GROUP_GET_SUP,
00081 GROUP_GET_SUPC,
00082 GROUP_SET,
00083 GROUP_SET_SUP,
00084 GROUP_UNKNOWN,
00085 PAM,
00086 ROOT_DROP,
00087 SET_SESSION_ID,
00088 SHELL,
00089 SHELL_FB,
00090 SIGNAL_CATCH,
00091 SIGNAL_SET,
00092 USER_SET,
00093 USER_SWITCH
00094 };
00095
00097 typedef custom_error<error_code> error;
00098
00100 typedef std::tr1::shared_ptr<session> ptr;
00101
00109 session (std::string const& service,
00110 operation operation,
00111 chroot_list const& chroots);
00112
00114 virtual ~session ();
00115
00121 auth::ptr const&
00122 get_auth () const;
00123
00129 void
00130 set_auth (auth::ptr& auth);
00131
00137 chroot_list const&
00138 get_chroots () const;
00139
00145 void
00146 set_chroots (chroot_list const& chroots);
00147
00153 operation
00154 get_operation () const;
00155
00161 void
00162 set_operation (operation operation);
00163
00170 std::string const&
00171 get_session_id () const;
00172
00179 void
00180 set_session_id (std::string const& session_id);
00181
00187 std::string const&
00188 get_verbosity () const;
00189
00196 void
00197 set_verbosity (std::string const& verbosity);
00198
00204 bool
00205 get_preserve_environment () const;
00206
00212 void
00213 set_preserve_environment (bool preserve_environment);
00214
00220 bool
00221 get_force () const;
00222
00228 void
00229 set_force (bool force);
00230
00234 void
00235 save_termios ();
00236
00240 void
00241 restore_termios ();
00242
00249 int
00250 get_child_status () const;
00251
00258 bool
00259 is_group_member (std::string const& groupname) const;
00260
00261 protected:
00265 void
00266 get_chroot_membership (chroot::ptr const& chroot,
00267 bool& in_users,
00268 bool& in_root_users,
00269 bool& in_groups,
00270 bool& in_root_groups) const;
00271
00277 virtual auth::status
00278 get_chroot_auth_status (auth::status status,
00279 chroot::ptr const& chroot) const;
00280
00281 public:
00287 virtual sbuild::auth::status
00288 get_auth_status () const;
00289
00296 void
00297 run ();
00298
00299 protected:
00307 virtual void
00308 run_impl ();
00309
00318 virtual string_list
00319 get_login_directories (sbuild::chroot::ptr& session_chroot,
00320 environment const& env) const;
00321
00330 virtual string_list
00331 get_command_directories (sbuild::chroot::ptr& session_chroot,
00332 environment const& env) const;
00333
00341 virtual std::string
00342 get_shell () const;
00343
00352 virtual void
00353 get_command (chroot::ptr& session_chroot,
00354 std::string& file,
00355 string_list& command,
00356 environment const& env) const;
00357
00365 virtual void
00366 get_login_command (chroot::ptr& session_chroot,
00367 std::string& file,
00368 string_list& command) const;
00369
00378 virtual void
00379 get_user_command (chroot::ptr& session_chroot,
00380 std::string& file,
00381 string_list& command,
00382 environment const& env) const;
00383
00384 private:
00397 void
00398 setup_chroot (chroot::ptr& session_chroot,
00399 chroot::setup_type setup_type);
00400
00408 void
00409 run_chroot (chroot::ptr& session_chroot);
00410
00418 void
00419 run_child (chroot::ptr& session_chroot);
00420
00429 void
00430 wait_for_child (pid_t pid,
00431 int& child_status);
00432
00438 void
00439 set_sighup_handler ();
00440
00444 void
00445 clear_sighup_handler ();
00446
00452 void
00453 set_sigint_handler ();
00454
00458 void
00459 clear_sigint_handler ();
00460
00466 void
00467 set_sigterm_handler ();
00468
00472 void
00473 clear_sigterm_handler ();
00474
00483 void
00484 set_signal_handler (int signal,
00485 struct sigaction *saved_signal,
00486 void (*handler)(int));
00487
00495 void
00496 clear_signal_handler (int signal,
00497 struct sigaction *saved_signal);
00498
00500 auth::ptr authstat;
00502 chroot_list chroots;
00504 int chroot_status;
00506 bool lock_status;
00508 int child_status;
00510 operation session_operation;
00512 std::string session_id;
00514 bool force;
00516 struct sigaction saved_sighup_signal;
00518 struct sigaction saved_sigint_signal;
00520 struct sigaction saved_sigterm_signal;
00522 struct termios saved_termios;
00524 bool termios_ok;
00526 std::string verbosity;
00528 bool preserve_environment;
00529
00530 protected:
00532 std::string cwd;
00533 };
00534
00535 }
00536
00537 #endif
00538
00539
00540
00541
00542
00543