[#2889] Fixes for 'Too many files open' error

* Ensure all file descriptors are closed. Using the with statement ensures
   closure.
 * The main problem was with thousands of unclosed file desciptors from
   tracker_icons mkstemp.
 * Use a prefix 'deluge_ticon.' to identify created tracker_icon tmp files.
This commit is contained in:
Calum Lind 2016-10-11 11:26:52 +01:00
parent 58835eeb2e
commit 9dd3b1617d
31 changed files with 237 additions and 193 deletions

View File

@ -874,10 +874,9 @@ def create_auth_file():
auth_file = deluge.configmanager.get_config_dir("auth")
# Check for auth file and create if necessary
if not os.path.exists(auth_file):
fd = open(auth_file, "w")
fd.flush()
os.fsync(fd.fileno())
fd.close()
with open(auth_file, "w") as _file:
_file.flush()
os.fsync(_file.fileno())
# Change the permissions on the file so only this user can read/write it
os.chmod(auth_file, stat.S_IREAD | stat.S_IWRITE)
@ -891,15 +890,14 @@ def create_localclient_account(append=False):
if not os.path.exists(auth_file):
create_auth_file()
fd = open(auth_file, "a" if append else "w")
fd.write(":".join([
"localclient",
sha(str(random.random())).hexdigest(),
str(AUTH_LEVEL_ADMIN)
]) + '\n')
fd.flush()
os.fsync(fd.fileno())
fd.close()
with open(auth_file, "a" if append else "w") as _file:
_file.write(":".join([
"localclient",
sha(str(random.random())).hexdigest(),
str(AUTH_LEVEL_ADMIN)
]) + '\n')
_file.flush()
os.fsync(_file.fileno())
def set_env_variable(name, value):

View File

@ -391,7 +391,8 @@ what is currently in the config and it could not convert the value
filename = self.__config_file
try:
data = open(filename, "rb").read()
with open(filename, "rb") as _file:
data = _file.read()
except IOError as ex:
log.warning("Unable to open config file %s: %s", filename, ex)
return
@ -439,7 +440,8 @@ what is currently in the config and it could not convert the value
# Check to see if the current config differs from the one on disk
# We will only write a new config file if there is a difference
try:
data = open(filename, "rb").read()
with open(filename, "rb") as _file:
data = _file.read()
objects = find_json_objects(data)
start, end = objects[0]
version = json.loads(data[start:end])
@ -456,12 +458,11 @@ what is currently in the config and it could not convert the value
# Save the new config and make sure it's written to disk
try:
log.debug("Saving new config file %s", filename + ".new")
f = open(filename + ".new", "wb")
json.dump(self.__version, f, indent=2)
json.dump(self.__config, f, indent=2)
f.flush()
os.fsync(f.fileno())
f.close()
with open(filename + ".new", "wb") as _file:
json.dump(self.__version, _file, indent=2)
json.dump(self.__config, _file, indent=2)
_file.flush()
os.fsync(_file.fileno())
except IOError as ex:
log.error("Error writing new config file: %s", ex)
return False

View File

@ -284,9 +284,8 @@ class Core(component.Component):
def on_download_success(filename):
# We got the file, so add it to the session
f = open(filename, "rb")
data = f.read()
f.close()
with open(filename, "rb") as _file:
data = _file.read()
try:
os.remove(filename)
except OSError as ex:
@ -298,9 +297,9 @@ class Core(component.Component):
log.error("Failed to add torrent from url %s", url)
return failure
d = download_file(
url, tempfile.mkstemp()[1], headers=headers, force_filename=True
)
tmp_fd, tmp_file = tempfile.mkstemp(prefix='deluge_url.', suffix='.torrent')
os.close(tmp_fd)
d = download_file(url, tmp_file, headers=headers, force_filename=True)
d.addCallbacks(on_download_success, on_download_fail)
return d
@ -744,7 +743,8 @@ class Core(component.Component):
if add_to_session:
options = {}
options["download_location"] = os.path.split(path)[0]
self.add_torrent_file(os.path.split(target)[1], open(target, "rb").read(), options)
with open(target, "rb") as _file:
self.add_torrent_file(os.path.split(target)[1], _file.read(), options)
@export
def upload_plugin(self, filename, filedump):
@ -760,9 +760,8 @@ class Core(component.Component):
log.exception(ex)
return
f = open(os.path.join(get_config_dir(), "plugins", filename), "wb")
f.write(filedump)
f.close()
with open(os.path.join(get_config_dir(), "plugins", filename), "wb") as _file:
_file.write(filedump)
component.get("CorePluginManager").scan_for_plugins()
@export

View File

@ -579,12 +579,10 @@ def generate_ssl_keys():
# Write out files
ssl_dir = deluge.configmanager.get_config_dir("ssl")
open(os.path.join(ssl_dir, "daemon.pkey"), "w").write(
crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)
)
open(os.path.join(ssl_dir, "daemon.cert"), "w").write(
crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
)
with open(os.path.join(ssl_dir, "daemon.pkey"), "w") as _file:
_file.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey))
with open(os.path.join(ssl_dir, "daemon.cert"), "w") as _file:
_file.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
# Make the files only readable by this user
for f in ("daemon.pkey", "daemon.cert"):
os.chmod(os.path.join(ssl_dir, f), stat.S_IREAD | stat.S_IWRITE)

View File

@ -203,15 +203,16 @@ def tweak_logging_levels():
log = logging.getLogger(__name__)
log.warn("logging.conf found! tweaking logging levels from %s",
logging_config_file)
for line in open(logging_config_file, "r").readlines():
if line.strip().startswith("#"):
continue
name, level = line.strip().split(":")
if level not in levels:
continue
with open(logging_config_file, "r") as _file:
for line in _file:
if line.strip().startswith("#"):
continue
name, level = line.strip().split(":")
if level not in levels:
continue
log.warn("Setting logger \"%s\" to logging level \"%s\"", name, level)
set_logger_level(level, name)
log.warn("Setting logger \"%s\" to logging level \"%s\"", name, level)
set_logger_level(level, name)
def set_logger_level(level, logger_name=None):

View File

@ -155,20 +155,19 @@ class TorrentMetadata(object):
buf = ""
fs[-1]["attr"] = "p"
else:
fd = open(os.path.join(self.data_path, *path), "rb")
r = fd.read(piece_size - len(buf))
while r:
buf += r
if len(buf) == piece_size:
pieces.append(sha(buf).digest())
# Run the progress function if necessary
if progress:
progress(len(pieces), num_pieces)
buf = ""
else:
break
r = fd.read(piece_size - len(buf))
fd.close()
with open(os.path.join(self.data_path, *path), "rb") as _file:
r = _file.read(piece_size - len(buf))
while r:
buf += r
if len(buf) == piece_size:
pieces.append(sha(buf).digest())
# Run the progress function if necessary
if progress:
progress(len(pieces), num_pieces)
buf = ""
else:
break
r = _file.read(piece_size - len(buf))
if buf:
pieces.append(sha(buf).digest())
@ -184,19 +183,20 @@ class TorrentMetadata(object):
torrent["info"]["length"] = get_path_size(self.data_path)
pieces = []
fd = open(self.data_path, "rb")
r = fd.read(piece_size)
while r:
pieces.append(sha(r).digest())
if progress:
progress(len(pieces), num_pieces)
with open(self.data_path, "rb") as _file:
r = _file.read(piece_size)
while r:
pieces.append(sha(r).digest())
if progress:
progress(len(pieces), num_pieces)
r = fd.read(piece_size)
r = _file.read(piece_size)
torrent["info"]["pieces"] = "".join(pieces)
# Write out the torrent file
open(torrent_path, "wb").write(bencode(torrent))
with open(torrent_path, "wb") as _file:
_file.write(bencode(torrent))
def get_data_path(self):
"""Get the path to the files that the torrent will contain.

View File

@ -150,14 +150,14 @@ class Core(CorePluginBase):
try:
log.debug("Attempting to open %s for add.", filename)
if magnet:
_file = open(filename, "r")
with open(filename, "r") as _file:
filedump = _file.read()
else:
_file = open(filename, "rb")
with open(filename, "rb") as _file:
filedump = _file.read()
filedump = _file.read()
if not filedump:
raise RuntimeError("Torrent is 0 bytes!")
_file.close()
except IOError as ex:
log.warning("Unable to open %s: %s", filename, ex)
raise ex

View File

@ -34,9 +34,8 @@ class UnknownFormatError(Exception):
def detect_compression(filename):
f = open(filename, "rb")
magic_number = f.read(2)
f.close()
with open(filename, "rb") as _file:
magic_number = _file.read(2)
return COMPRESSION_TYPES.get(magic_number, "")

View File

@ -27,7 +27,8 @@ class PGReader(object):
log.debug("PGReader loading: %s", filename)
try:
self.fd = gzip.open(filename, "rb")
with gzip.open(filename, "rb") as _file:
self.fd = _file
except IOError:
log.debug("Blocklist: PGReader: Incorrect file type or list is corrupt")

View File

@ -110,6 +110,5 @@ class StatsTestCase(BaseTestCase):
file_like = FakeFile()
surface.write_to_png(file_like)
data = "".join(file_like.data)
f = open("file_like.png", "wb")
f.write(data)
f.close()
with open("file_like.png", "wb") as _file:
_file.write(data)

View File

@ -74,11 +74,10 @@ def create_plugin():
}
filename = os.path.join(path, filename)
f = open(filename, "w")
if filename.endswith(".py") and include_gpl:
f.write(GPL % plugin_args)
f.write(template % plugin_args)
f.close()
with open(filename, "w") as _file:
if filename.endswith(".py") and include_gpl:
_file.write(GPL % plugin_args)
_file.write(template % plugin_args)
print("creating folders..")
os.mkdir(plugin_base)

View File

@ -83,32 +83,32 @@ class ConfigTestCase(unittest.TestCase):
# Test loading an old config from 1.1.x
import pickle
pickle.dump(DEFAULTS, open(os.path.join(self.config_dir, "test.conf"), "wb"))
with open(os.path.join(self.config_dir, "test.conf"), "wb") as _file:
pickle.dump(DEFAULTS, _file)
check_config()
# Test opening a previous 1.2 config file of just a json object
import json
json.dump(DEFAULTS, open(os.path.join(self.config_dir, "test.conf"), "wb"), indent=2)
with open(os.path.join(self.config_dir, "test.conf"), "wb") as _file:
json.dump(DEFAULTS, _file, indent=2)
check_config()
# Test opening a previous 1.2 config file of having the format versions
# as ints
f = open(os.path.join(self.config_dir, "test.conf"), "wb")
f.write(str(1) + "\n")
f.write(str(1) + "\n")
json.dump(DEFAULTS, f, indent=2)
f.close()
with open(os.path.join(self.config_dir, "test.conf"), "wb") as _file:
_file.write(str(1) + "\n")
_file.write(str(1) + "\n")
json.dump(DEFAULTS, _file, indent=2)
check_config()
# Test the 1.2 config format
v = {"format": 1, "file": 1}
f = open(os.path.join(self.config_dir, "test.conf"), "wb")
json.dump(v, f, indent=2)
json.dump(DEFAULTS, f, indent=2)
f.close()
version = {"format": 1, "file": 1}
with open(os.path.join(self.config_dir, "test.conf"), "wb") as _file:
json.dump(version, _file, indent=2)
json.dump(DEFAULTS, _file, indent=2)
check_config()

View File

@ -35,13 +35,16 @@ class CookieResource(Resource):
return
request.setHeader("Content-Type", "application/x-bittorrent")
return open(rpath("ubuntu-9.04-desktop-i386.iso.torrent")).read()
with open(rpath("ubuntu-9.04-desktop-i386.iso.torrent")) as _file:
data = _file.read()
return data
class PartialDownload(Resource):
def render(self, request):
data = open(rpath("ubuntu-9.04-desktop-i386.iso.torrent")).read()
with open(rpath("ubuntu-9.04-desktop-i386.iso.torrent")) as _file:
data = _file.read()
request.setHeader("Content-Type", len(data))
request.setHeader("Content-Type", "application/x-bittorrent")
if request.requestHeaders.hasHeader("accept-encoding"):
@ -109,7 +112,8 @@ class CoreTestCase(BaseTestCase):
files_to_add = []
for f in filenames:
filename = os.path.join(os.path.dirname(__file__), f)
filedump = base64.encodestring(open(filename).read())
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
files_to_add.append((filename, filedump, options))
errors = yield self.core.add_torrent_files(files_to_add)
self.assertEquals(len(errors), 0)
@ -121,7 +125,8 @@ class CoreTestCase(BaseTestCase):
files_to_add = []
for f in filenames:
filename = os.path.join(os.path.dirname(__file__), f)
filedump = base64.encodestring(open(filename).read())
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
files_to_add.append((filename, filedump, options))
errors = yield self.core.add_torrent_files(files_to_add)
self.assertEquals(len(errors), 1)
@ -131,11 +136,14 @@ class CoreTestCase(BaseTestCase):
def test_add_torrent_file(self):
options = {}
filename = os.path.join(os.path.dirname(__file__), "test.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), options)
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, options)
# Get the info hash from the test.torrent
from deluge.bencode import bdecode, bencode
info_hash = sha(bencode(bdecode(open(filename).read())["info"])).hexdigest()
with open(filename) as _file:
info_hash = sha(bencode(bdecode(_file.read())["info"])).hexdigest()
self.assertEquals(torrent_id, info_hash)
def test_add_torrent_file_invalid_filedump(self):
@ -196,7 +204,9 @@ class CoreTestCase(BaseTestCase):
def test_remove_torrent(self):
options = {}
filename = os.path.join(os.path.dirname(__file__), "test.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), options)
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, options)
removed = self.core.remove_torrent(torrent_id, True)
self.assertTrue(removed)
self.assertEquals(len(self.core.get_session_state()), 0)
@ -208,9 +218,14 @@ class CoreTestCase(BaseTestCase):
def test_remove_torrents(self):
options = {}
filename = os.path.join(os.path.dirname(__file__), "test.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), options)
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, options)
filename2 = os.path.join(os.path.dirname(__file__), "unicode_filenames.torrent")
torrent_id2 = yield self.core.add_torrent_file(filename2, base64.encodestring(open(filename2).read()), options)
with open(filename2) as _file:
filedump = base64.encodestring(_file.read())
torrent_id2 = yield self.core.add_torrent_file(filename2, filedump, options)
d = self.core.remove_torrents([torrent_id, torrent_id2], True)
def test_ret(val):
@ -226,7 +241,9 @@ class CoreTestCase(BaseTestCase):
def test_remove_torrents_invalid(self):
options = {}
filename = os.path.join(os.path.dirname(__file__), "test.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), options)
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, options)
val = yield self.core.remove_torrents(["invalidid1", "invalidid2", torrent_id], False)
self.assertEqual(len(val), 2)
self.assertEqual(val[0], ('invalidid1', "torrent_id 'invalidid1' not in session."))

View File

@ -137,23 +137,19 @@ class DownloadFileTestCase(unittest.TestCase):
return self.webserver.stopListening()
def assertContains(self, filename, contents): # NOQA
f = open(filename)
try:
self.assertEqual(f.read(), contents)
except Exception as ex:
self.fail(ex)
finally:
f.close()
with open(filename) as _file:
try:
self.assertEqual(_file.read(), contents)
except Exception as ex:
self.fail(ex)
return filename
def failIfContains(self, filename, contents): # NOQA
f = open(filename)
try:
self.failIfEqual(f.read(), contents)
except Exception as ex:
self.fail(ex)
finally:
f.close()
with open(filename) as _file:
try:
self.failIfEqual(_file.read(), contents)
except Exception as ex:
self.fail(ex)
return filename
def test_download(self):

View File

@ -20,13 +20,16 @@ class MakeTorrentTestCase(unittest.TestCase):
def test_save_multifile(self):
# Create a temporary folder for torrent creation
tmp_path = tempfile.mkdtemp()
open(os.path.join(tmp_path, "file_A"), "wb").write("a" * (312 * 1024))
open(os.path.join(tmp_path, "file_B"), "wb").write("b" * (2354 * 1024))
open(os.path.join(tmp_path, "file_C"), "wb").write("c" * (11 * 1024))
with open(os.path.join(tmp_path, "file_A"), "wb") as _file:
_file.write("a" * (312 * 1024))
with open(os.path.join(tmp_path, "file_B"), "wb") as _file:
_file.write("b" * (2354 * 1024))
with open(os.path.join(tmp_path, "file_C"), "wb") as _file:
_file.write("c" * (11 * 1024))
t = maketorrent.TorrentMetadata()
t.data_path = tmp_path
tmp_file = tempfile.mkstemp(".torrent")[1]
tmp_fd, tmp_file = tempfile.mkstemp(".torrent")
t.save(tmp_file)
check_torrent(tmp_file)
@ -35,32 +38,38 @@ class MakeTorrentTestCase(unittest.TestCase):
os.remove(os.path.join(tmp_path, "file_B"))
os.remove(os.path.join(tmp_path, "file_C"))
os.rmdir(tmp_path)
os.close(tmp_fd)
os.remove(tmp_file)
def test_save_singlefile(self):
tmp_data = tempfile.mkstemp("testdata")[1]
open(tmp_data, "wb").write("a" * (2314 * 1024))
with open(tmp_data, "wb") as _file:
_file.write("a" * (2314 * 1024))
t = maketorrent.TorrentMetadata()
t.data_path = tmp_data
tmp_file = tempfile.mkstemp(".torrent")[1]
tmp_fd, tmp_file = tempfile.mkstemp(".torrent")
t.save(tmp_file)
check_torrent(tmp_file)
os.remove(tmp_data)
os.close(tmp_fd)
os.remove(tmp_file)
def test_save_multifile_padded(self):
# Create a temporary folder for torrent creation
tmp_path = tempfile.mkdtemp()
open(os.path.join(tmp_path, "file_A"), "wb").write("a" * (312 * 1024))
open(os.path.join(tmp_path, "file_B"), "wb").write("b" * (2354 * 1024))
open(os.path.join(tmp_path, "file_C"), "wb").write("c" * (11 * 1024))
with open(os.path.join(tmp_path, "file_A"), "wb") as _file:
_file.write("a" * (312 * 1024))
with open(os.path.join(tmp_path, "file_B"), "wb") as _file:
_file.write("b" * (2354 * 1024))
with open(os.path.join(tmp_path, "file_C"), "wb") as _file:
_file.write("c" * (11 * 1024))
t = maketorrent.TorrentMetadata()
t.data_path = tmp_path
t.pad_files = True
tmp_file = tempfile.mkstemp(".torrent")[1]
tmp_fd, tmp_file = tempfile.mkstemp(".torrent")
t.save(tmp_file)
check_torrent(tmp_file)
@ -69,4 +78,5 @@ class MakeTorrentTestCase(unittest.TestCase):
os.remove(os.path.join(tmp_path, "file_B"))
os.remove(os.path.join(tmp_path, "file_C"))
os.rmdir(tmp_path)
os.close(tmp_fd)
os.remove(tmp_file)

View File

@ -53,8 +53,8 @@ class TorrentTestCase(BaseTestCase):
def get_torrent_atp(self, filename):
filename = os.path.join(os.path.dirname(__file__), filename)
e = lt.bdecode(open(filename, 'rb').read())
info = lt.torrent_info(e)
with open(filename, 'rb') as _file:
info = lt.torrent_info(lt.bdecode(_file.read()))
atp = {"ti": info}
atp["save_path"] = os.getcwd()
atp["storage_mode"] = lt.storage_mode_t.storage_mode_sparse
@ -118,7 +118,9 @@ class TorrentTestCase(BaseTestCase):
def test_torrent_error_data_missing(self):
options = {"seed_mode": True}
filename = os.path.join(os.path.dirname(__file__), "test_torrent.file.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), options)
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, options)
torrent = self.core.torrentmanager.torrents[torrent_id]
self.assert_state(torrent, "Seeding")
@ -132,7 +134,9 @@ class TorrentTestCase(BaseTestCase):
def test_torrent_error_resume_original_state(self):
options = {"seed_mode": True, "add_paused": True}
filename = os.path.join(os.path.dirname(__file__), "test_torrent.file.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), options)
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, options)
torrent = self.core.torrentmanager.torrents[torrent_id]
orig_state = "Paused"
@ -175,7 +179,8 @@ class TorrentTestCase(BaseTestCase):
)
filename = os.path.join(os.path.dirname(__file__), "test_torrent.file.torrent")
filedump = open(filename).read()
with open(filename) as _file:
filedump = _file.read()
torrent_id = yield self.core.torrentmanager.add(state=torrent_state, filedump=filedump,
resume_data=lt.bencode(resume_data))
torrent = self.core.torrentmanager.torrents[torrent_id]

View File

@ -31,7 +31,9 @@ class TorrentmanagerTestCase(BaseTestCase):
@defer.inlineCallbacks
def test_remove_torrent(self):
filename = os.path.join(os.path.dirname(__file__), "test.torrent")
torrent_id = yield self.core.add_torrent_file(filename, base64.encodestring(open(filename).read()), {})
with open(filename) as _file:
filedump = base64.encodestring(_file.read())
torrent_id = yield self.core.add_torrent_file(filename, filedump, {})
self.assertTrue(self.core.torrentmanager.remove(torrent_id, False))
@pytest.mark.todo

View File

@ -71,7 +71,8 @@ class TorrentInfo(object):
# Get the torrent data from the torrent file
try:
log.debug("Attempting to open %s.", filename)
self.__m_filedata = open(filename, "rb").read()
with open(filename, "rb") as _file:
self.__m_filedata = _file.read()
self.__m_metadata = bencode.bdecode(self.__m_filedata)
except Exception as ex:
log.warning("Unable to open %s: %s", filename, ex)

View File

@ -71,7 +71,8 @@ class Command(BaseCommand):
continue
self.console.write("{!info!}Attempting to add torrent: %s" % path)
filename = os.path.split(path)[-1]
filedump = base64.encodestring(open(path, "rb").read())
with open(path, "rb") as _file:
filedump = base64.encodestring(_file.read())
deferreds.append(client.core.add_torrent_file(filename, filedump, t_options).addCallback(
on_success).addErrback(on_fail))

View File

@ -92,7 +92,8 @@ class Command(BaseCommand):
if not client.is_localhost():
# We need to send this plugin to the daemon
filedump = base64.encodestring(open(filepath, "rb").read())
with open(filepath, "rb") as _file:
filedump = base64.encodestring(_file.read())
try:
client.core.upload_plugin(filename, filedump)
client.core.rescan_plugins()

View File

@ -75,7 +75,8 @@ def add_torrent(t_file, options, success_cb, fail_cb, ress):
continue
filename = os.path.split(f)[-1]
filedump = base64.encodestring(open(f).read())
with open(f) as _file:
filedump = base64.encodestring(_file.read())
client.core.add_torrent_file(
filename, filedump, t_options).addCallback(success_cb, f, ress).addErrback(fail_cb, f, ress)

View File

@ -410,7 +410,8 @@ class AddTorrents(BaseMode, component.Component):
filename = m
directory = os.path.join(*self.path_stack[:self.path_stack_pos])
path = os.path.join(directory, filename)
filedump = base64.encodestring(open(path).read())
with open(path) as _file:
filedump = base64.encodestring(_file.read())
t_options = {}
if result["location"]:
t_options["download_location"] = result["location"]

View File

@ -142,14 +142,16 @@ class Legacy(BaseMode, Commander, component.Component):
if self.console_config["save_legacy_history"]:
try:
lines1 = open(self.history_file[0], "r").read().splitlines()
with open(self.history_file[0], "r") as _file:
lines1 = _file.read().splitlines()
self._hf_lines[0] = len(lines1)
except IOError:
lines1 = []
self._hf_lines[0] = 0
try:
lines2 = open(self.history_file[1], "r").read().splitlines()
with open(self.history_file[1], "r") as _file:
lines2 = _file.read().splitlines()
self._hf_lines[1] = len(lines2)
except IOError:
lines2 = []
@ -476,13 +478,11 @@ class Legacy(BaseMode, Commander, component.Component):
active_file = 0
# Write the line
f = open(self.history_file[active_file], "a")
if isinstance(text, unicode):
text = text.encode(self.encoding)
f.write(text)
f.write(os.linesep)
with open(self.history_file[active_file], "a") as _file:
if isinstance(text, unicode):
text = text.encode(self.encoding)
_file.write(text)
_file.write(os.linesep)
# And increment line counter
self._hf_lines[active_file] += 1
@ -491,8 +491,8 @@ class Legacy(BaseMode, Commander, component.Component):
# therefore swapping the currently active file
if self._hf_lines[active_file] == MAX_HISTFILE_SIZE:
self._hf_lines[1 - active_file] = 0
f = open(self.history_file[1 - active_file], "w")
f.truncate(0)
with open(self.history_file[1 - active_file], "w") as _file:
_file.truncate(0)
def get_line_chunks(line):
"""

View File

@ -623,7 +623,7 @@ class AddTorrentDialog(component.Component):
# Create a tmp file path
import tempfile
(tmp_handle, tmp_file) = tempfile.mkstemp()
tmp_fd, tmp_file = tempfile.mkstemp(prefix='deluge_url.', suffix='.torrent')
def on_part(data, current_length, total_length):
if total_length:
@ -651,6 +651,7 @@ class AddTorrentDialog(component.Component):
return result
d = download_file(url, tmp_file, on_part)
os.close(tmp_fd)
d.addCallbacks(on_download_success, on_download_fail)
def _on_button_hash_clicked(self, widget):

View File

@ -370,10 +370,10 @@ class CreateTorrentDialog(object):
trackers=trackers)
if add_to_session:
client.core.add_torrent_file(
os.path.split(target)[-1],
base64.encodestring(open(target, "rb").read()),
{"download_location": os.path.split(path)[0]})
with open(target, "rb") as _file:
filedump = base64.encodestring(_file.read())
client.core.add_torrent_file(os.path.split(target)[-1], filedump,
{"download_location": os.path.split(path)[0]})
def _on_create_torrent_progress(self, value, num_pieces):
percent = float(value) / float(num_pieces)

View File

@ -94,12 +94,14 @@ class IPCInterface(component.Component):
port = random.randrange(20000, 65535)
self.listener = reactor.listenTCP(port, self.factory)
# Store the port number in the socket file
open(socket, "w").write(str(port))
with open(socket, "w") as _file:
_file.write(str(port))
# We need to process any args when starting this process
process_args(args)
else:
# Send to existing deluge process
port = int(open(socket, "r").readline())
with open(socket) as _file:
port = int(_file.readline())
self.factory = ClientFactory()
self.factory.args = args
self.factory.protocol = IPCProtocolClient
@ -108,7 +110,7 @@ class IPCInterface(component.Component):
sys.exit(0)
else:
# Find and remove any restart tempfiles
restart_tempfile = glob(os.path.join(ipc_dir, 'tmp*deluge'))
restart_tempfile = glob(os.path.join(ipc_dir, 'restart.*'))
for f in restart_tempfile:
os.remove(f)
lockfile = socket + ".lock"
@ -152,7 +154,7 @@ class IPCInterface(component.Component):
else:
log.warning('Restarting Deluge... (%s)', ex)
# Create a tempfile to keep track of restart
mkstemp('deluge', dir=ipc_dir)
mkstemp(prefix='restart.', dir=ipc_dir)
os.execv(sys.argv[0], sys.argv)
else:
process_args(args)
@ -212,5 +214,6 @@ def process_args(args):
component.get("AddTorrentDialog").add_from_files([path])
component.get("AddTorrentDialog").show(config["focus_add_dialog"])
else:
client.core.add_torrent_file(os.path.split(path)[-1],
base64.encodestring(open(path, "rb").read()), None)
with open(path, "rb") as _file:
filedump = base64.encodestring(_file.read())
client.core.add_torrent_file(os.path.split(path)[-1], filedump, None)

View File

@ -996,7 +996,8 @@ class Preferences(component.Component):
if not client.is_localhost():
# We need to send this plugin to the daemon
filedump = base64.encodestring(open(filepath, "rb").read())
with open(filepath, "rb") as _file:
filedump = base64.encodestring(_file.read())
client.core.upload_plugin(filename, filedump)
client.core.rescan_plugins()

View File

@ -85,9 +85,8 @@ class TrackerIcon(object):
:rtype: string
"""
if not self.data:
f = open(self.filename, "rb")
self.data = f.read()
f.close()
with open(self.filename, "rb") as _file:
self.data = _file.read()
return self.data
def get_filename(self, full=True):
@ -235,7 +234,9 @@ class TrackerIcons(Component):
if not url:
url = self.host_to_url(host)
log.debug("Downloading %s %s", host, url)
return download_file(url, mkstemp()[1], force_filename=True, handle_redirects=False)
tmp_fd, tmp_file = mkstemp(prefix='deluge_ticon.')
os.close(tmp_fd)
return download_file(url, tmp_file, force_filename=True, handle_redirects=False)
def on_download_page_complete(self, page):
"""
@ -284,14 +285,13 @@ class TrackerIcons(Component):
:returns: a Deferred which callbacks a list of available favicons (url, type)
:rtype: Deferred
"""
f = open(page, "r")
parser = FaviconParser()
for line in f:
parser.feed(line)
if parser.left_head:
break
parser.close()
f.close()
with open(page, "r") as _file:
parser = FaviconParser()
for line in _file:
parser.feed(line)
if parser.left_head:
break
parser.close()
try:
os.remove(page)
except OSError as ex:
@ -364,7 +364,8 @@ class TrackerIcons(Component):
if PIL_INSTALLED:
try:
Image.open(icon_name)
with Image.open(icon_name):
pass
except IOError as ex:
raise InvalidIconError(ex)
else:
@ -441,14 +442,14 @@ class TrackerIcons(Component):
"""
if icon:
filename = icon.get_filename()
img = Image.open(filename)
if img.size > (16, 16):
new_filename = filename.rpartition(".")[0] + ".png"
img = img.resize((16, 16), Image.ANTIALIAS)
img.save(new_filename)
if new_filename != filename:
os.remove(filename)
icon = TrackerIcon(new_filename)
with Image.open(filename) as img:
if img.size > (16, 16):
new_filename = filename.rpartition(".")[0] + ".png"
img = img.resize((16, 16), Image.ANTIALIAS)
img.save(new_filename)
if new_filename != filename:
os.remove(filename)
icon = TrackerIcon(new_filename)
return icon
def store_icon(self, icon, host):

View File

@ -714,7 +714,8 @@ class WebApi(JSONComponent):
deferreds.append(d)
else:
filename = os.path.basename(torrent["path"])
fdump = base64.encodestring(open(torrent["path"], "rb").read())
with open(torrent["path"], "rb") as _file:
fdump = base64.encodestring(_file.read())
log.info("Adding torrent from file `%s` with options `%r`",
filename, torrent["options"])
d = client.core.add_torrent_file(filename, fdump, torrent["options"])
@ -933,8 +934,8 @@ class WebApi(JSONComponent):
if client.is_localhost():
client.core.rescan_plugins()
return True
plugin_data = base64.encodestring(open(path, "rb").read())
with open(path, "rb") as _file:
plugin_data = base64.encodestring(_file.read())
def on_upload_complete(*args):
client.core.rescan_plugins()

View File

@ -183,9 +183,10 @@ class Flag(resource.Resource):
request.setHeader("cache-control",
"public, must-revalidate, max-age=86400")
request.setHeader("content-type", "image/png")
data = open(filename, "rb")
with open(filename, "rb") as _file:
data = _file.read()
request.setResponseCode(http.OK)
return data.read()
return data
else:
request.setResponseCode(http.NOT_FOUND)
return ""
@ -232,7 +233,9 @@ class LookupResource(resource.Resource, component.Component):
log.debug("Serving path: '%s'", path)
mime_type = mimetypes.guess_type(path)
request.setHeader("content-type", mime_type[0])
return compress(open(path, "rb").read(), request)
with open(path, "rb") as _file:
data = _file.read()
return compress(data, request)
request.setResponseCode(http.NOT_FOUND)
return "<h1>404 - Not Found</h1>"
@ -390,7 +393,9 @@ class ScriptResource(resource.Resource, component.Component):
log.debug("Serving path: '%s'", path)
mime_type = mimetypes.guess_type(path)
request.setHeader("content-type", mime_type[0])
return compress(open(path, "rb").read(), request)
with open(path, "rb") as _file:
data = _file.read()
return compress(data, request)
request.setResponseCode(http.NOT_FOUND)
return "<h1>404 - Not Found</h1>"

View File

@ -114,7 +114,8 @@ def make(filename, outfile):
outfile = os.path.splitext(infile)[0] + '.mo'
try:
lines = open(infile).readlines()
with open(infile) as _file:
lines = _file.readlines()
except IOError, msg:
print >> sys.stderr, msg
sys.exit(1)
@ -181,7 +182,8 @@ def make(filename, outfile):
output = generate()
try:
open(outfile, "wb").write(output)
with open(outfile, "wb") as _file:
_file.write(output)
except IOError, msg:
print >> sys.stderr, msg