+  die "cannot find user $login"            unless %::myconfig = $::auth->read_user(login => $login);
+  die "cannot find locale for user $login" unless $::locale   = Locale->new($::myconfig{countrycode} || $::lx_office_conf{system}->{language});
+}
+
+sub cleanup_kivitendo {
+  eval { SL::DB->client->dbh->rollback; };
+
+  $::auth->save_session;
+  $::auth->expire_sessions;
+  $::auth->reset;
+
+  $::form     = undef;
+  $::myconfig = ();
+  $::request  = undef;
+  $::auth     = undef;
+}
+
+sub clean_before_sleeping {
+  SL::DBConnect::Cache->disconnect_all_and_clear;
+  SL::DB->db_cache->clear;
+
+  File::Temp::cleanup();
+}
+
+sub drop_privileges {
+  my $user = $lx_office_conf{task_server}->{run_as};
+  return unless $user;
+
+  my ($uid, $gid);
+  while (my @details = getpwent()) {
+    next unless $details[0] eq $user;
+    ($uid, $gid) = @details[2, 3];
+    last;
+  }
+  endpwent();
+
+  if (!$uid) {
+    print "Error: Cannot drop privileges to ${user}: user does not exist\n";
+    exit 1;
+  }
+
+  if (!setgid($gid)) {
+    print "Error: Cannot drop group privileges to ${user} (group ID $gid): $!\n";
+    exit 1;
+  }
+
+  if (!setuid($uid)) {
+    print "Error: Cannot drop user privileges to ${user} (user ID $uid): $!\n";
+    exit 1;
+  }
+}
+
+sub notify_on_failure {
+  my (%params) = @_;
+
+  my $cfg = $lx_office_conf{'task_server/notify_on_failure'} || {};
+
+  return if any { !$cfg->{$_} } qw(send_email_to email_from email_subject email_template);
+
+  chdir $exe_dir;
+
+  return debug("Template " . $cfg->{email_template} . " missing!") unless -f $cfg->{email_template};
+
+  my $email_to = $cfg->{send_email_to};
+  if ($email_to !~ m{\@}) {
+    my %user = $::auth->read_user(login => $email_to);
+    return debug("cannot find user for notification $email_to") unless %user;
+
+    $email_to = $user{email};
+    return debug("user for notification " . $user{login} . " doesn't have a valid email address") unless $email_to =~ m{\@};
+  }
+
+  my $template  = Template->new({
+    INTERPOLATE => 0,
+    EVAL_PERL   => 0,
+    ABSOLUTE    => 1,
+    CACHE_SIZE  => 0,
+    ENCODING    => 'utf8',
+  });
+
+  return debug("Could not create Template instance") unless $template;
+
+  $params{client} = $::auth->client;
+
+  eval {
+    my $body;
+    $template->process($cfg->{email_template}, \%params, \$body);
+
+    Mailer->new(
+      from         => $cfg->{email_from},
+      to           => $email_to,
+      subject      => $cfg->{email_subject},
+      content_type => 'text/plain',
+      charset      => 'utf-8',
+      message      => $body,
+    )->send;
+
+    1;
+  } or do {
+    debug("Sending a failure notification failed with an exception: $@");
+  };