5 Simple singleton class for storing info about Holding directory
7 @contact: Debian FTP Master <ftpmaster@debian.org>
8 @copyright: 2001 - 2006 James Troup <james@nocrew.org>
9 @copyright: 2009 Joerg Jaspert <joerg@debian.org>
10 @license: GNU General Public License version 2 or later
13 # This program is free software; you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation; either version 2 of the License, or
16 # (at your option) any later version.
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 ###############################################################################
30 from errno import ENOENT, EEXIST, EACCES
33 from config import Config
34 from utils import fubar
36 ###############################################################################
38 class Holding(object):
41 def __init__(self, *args, **kwargs):
42 self.__dict__ = self.__shared_state
44 if not getattr(self, 'initialised', False):
45 self.initialised = True
48 self.holding_dir = Config()["Dir::Holding"]
49 # ftptrainees haven't access to holding, use a temp directory instead
50 if not os.access(self.holding_dir, os.W_OK):
51 self.holding_dir = Config()["Dir::TempPath"]
53 def chdir_to_holding(self):
54 os.chdir(self.holding_dir)
56 def copy_to_holding(self, filename):
57 base_filename = os.path.basename(filename)
59 dest = os.path.join(self.holding_dir, base_filename)
61 fd = os.open(dest, os.O_RDWR | os.O_CREAT | os.O_EXCL, 0o640)
64 # Shouldn't happen, but will if, for example, someone lists a
65 # file twice in the .changes.
67 return "%s: already exists in holding area; can not overwrite." % (base_filename)
70 shutil.copy(filename, dest)
72 # In either case (ENOENT or EACCES) we want to remove the
73 # O_CREAT | O_EXCLed ghost file, so add the file to the list
74 # of 'in holding' even if it's not the real file.
77 return "%s: can not copy to holding area: file not found." % (base_filename)
79 elif e.errno == EACCES:
81 return "%s: can not copy to holding area: read permission denied." % (base_filename)
83 self.in_holding[base_filename] = ""
89 os.chdir(self.holding_dir)
90 for f in self.in_holding.keys():
91 # TODO: Sanitize path in a much better manner...
94 fubar("WTF? clean_holding() got a file ('%s') with / in it!" % (f))