180 lines
5.0 KiB
Python
180 lines
5.0 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Locations plugin for Deluge - keep different settings for each location.
|
||
|
# Copyright (C) 2007 - Kristoffer Lundén <kristoffer.lunden@gmail.com>
|
||
|
#
|
||
|
# This program is free software: you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation, either version 3 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
import os, re
|
||
|
import deluge.common, deluge.pref
|
||
|
|
||
|
LOCATION_KEYS = [
|
||
|
"listen_on",
|
||
|
"random_port",
|
||
|
"max_active_torrents",
|
||
|
"proxy_type",
|
||
|
"peer_proxy",
|
||
|
"tracker_proxy",
|
||
|
"dht_proxy",
|
||
|
"proxy_hostname",
|
||
|
"proxy_username",
|
||
|
"proxy_password",
|
||
|
"proxy_port",
|
||
|
"auto_end_seeding",
|
||
|
"auto_seed_ratio",
|
||
|
"end_seed_ratio",
|
||
|
"max_connections",
|
||
|
"max_download_rate",
|
||
|
"max_download_rate_bps",
|
||
|
"max_number_downloads",
|
||
|
"max_number_uploads",
|
||
|
"max_upload_rate",
|
||
|
"max_upload_rate_bps",
|
||
|
"max_uploads",
|
||
|
"max_upload_speed",
|
||
|
"max_download_speed",
|
||
|
"use_natpmp",
|
||
|
"use_upnp",
|
||
|
"use_utpex",
|
||
|
"web_proxy_type",
|
||
|
"peer_proxy_type",
|
||
|
"dht_proxy_type",
|
||
|
"tracker_proxy_type",
|
||
|
"peer_proxy",
|
||
|
"tracker_proxy",
|
||
|
"dht_proxy",
|
||
|
"peer_proxy_hostname",
|
||
|
"peer_proxy_username",
|
||
|
"peer_proxy_password",
|
||
|
"peer_proxy_port",
|
||
|
"dht_proxy_hostname",
|
||
|
"dht_proxy_username",
|
||
|
"dht_proxy_password",
|
||
|
"dht_proxy_port",
|
||
|
"web_proxy_hostname",
|
||
|
"web_proxy_username",
|
||
|
"web_proxy_password",
|
||
|
"web_proxy_port",
|
||
|
"tracker_proxy_hostname",
|
||
|
"tracker_proxy_username",
|
||
|
"tracker_proxy_password",
|
||
|
"tracker_proxy_port"
|
||
|
]
|
||
|
|
||
|
|
||
|
class plugin_Locations:
|
||
|
|
||
|
def __init__(self, path, deluge_core, deluge_interface):
|
||
|
|
||
|
self.path = path
|
||
|
self.core = deluge_core
|
||
|
self.interface = deluge_interface
|
||
|
|
||
|
#self.do_debug = True
|
||
|
self.do_debug = False
|
||
|
|
||
|
self.current_mac = None
|
||
|
self.timeout = 0
|
||
|
|
||
|
self.pref = self.core.get_config()
|
||
|
|
||
|
self.config_dir = deluge.common.CONFIG_DIR + "/Locations"
|
||
|
if not os.path.exists(self.config_dir):
|
||
|
os.mkdir(self.config_dir)
|
||
|
|
||
|
# update will be called every UPDATE_INTERVAL (usually about 1 second)
|
||
|
# we use a timeout to listen every minute instead
|
||
|
def update(self):
|
||
|
self.timeout = self.timeout - 1
|
||
|
#self.debug(self.timeout)
|
||
|
|
||
|
if self.timeout > 0:
|
||
|
return
|
||
|
|
||
|
self.debug("Time to check for MAC")
|
||
|
self.timeout = 60
|
||
|
|
||
|
self.update_mac()
|
||
|
|
||
|
def update_mac(self):
|
||
|
mac = self.find_gateway_mac()
|
||
|
|
||
|
if mac is not None:
|
||
|
if mac != self.current_mac:
|
||
|
# MAC address have changed (possibly from None)
|
||
|
self.save_prefs(self.current_mac)
|
||
|
self.load_prefs(mac)
|
||
|
self.current_mac = mac
|
||
|
|
||
|
# unload is called when the plugin is removed or Deluge is shut down
|
||
|
# save preferences for current MAC
|
||
|
def unload(self):
|
||
|
self.save_prefs(self.current_mac)
|
||
|
|
||
|
# Find out MAC address of Gateway via standard files. Needs testing.
|
||
|
def find_gateway_mac(self):
|
||
|
try:
|
||
|
routes = open('/proc/net/route')
|
||
|
for ln in routes:
|
||
|
gateway = ln.split()[2]
|
||
|
#self.debug(gateway)
|
||
|
if gateway != "00000000" and re.match(r"[0-9a-fA-F]{8}", gateway):
|
||
|
ip = str(int(gateway[6:8],16)) + '.'
|
||
|
ip += str(int(gateway[4:6],16)) + '.'
|
||
|
ip += str(int(gateway[2:4],16)) + '.'
|
||
|
ip += str(int(gateway[0:2],16))
|
||
|
self.debug("Gateway found: " + ip)
|
||
|
arp = open('/proc/net/arp', 'rb')
|
||
|
for line in arp:
|
||
|
split = line.split()
|
||
|
if split[0] == ip and split[3] != "00:00:00:00:00:00" and re.match(r"((?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})", split[3]):
|
||
|
mac = split[3]
|
||
|
self.debug("MAC found: " + mac)
|
||
|
return mac
|
||
|
arp.close()
|
||
|
routes.close()
|
||
|
except IOError:
|
||
|
pass
|
||
|
return None
|
||
|
|
||
|
# Save preferences to MAC specific file
|
||
|
def save_prefs(self, mac):
|
||
|
if mac is None:
|
||
|
return
|
||
|
self.debug("Saving prefs for %s" % (mac))
|
||
|
config_file = self.config_filename(mac)
|
||
|
conf = deluge.pref.Preferences(config_file, False)
|
||
|
for key in LOCATION_KEYS:
|
||
|
if self.pref.has_key(key):
|
||
|
conf.set(key, self.pref.get(key))
|
||
|
conf.save()
|
||
|
|
||
|
# Load preferences from MAC specific file
|
||
|
def load_prefs(self, mac):
|
||
|
if mac is None:
|
||
|
return
|
||
|
self.debug("Loading prefs for %s" % (mac))
|
||
|
config_file = self.config_filename(mac)
|
||
|
conf = deluge.pref.Preferences(config_file, False)
|
||
|
for key in LOCATION_KEYS:
|
||
|
if conf.has_key(key):
|
||
|
self.pref.set(key, conf.get(key))
|
||
|
|
||
|
def config_filename(self, mac):
|
||
|
mac_esc = re.sub(":","_",mac)
|
||
|
return "%s/%s.conf" % (self.config_dir, mac_esc)
|
||
|
|
||
|
def debug(self, text):
|
||
|
if self.do_debug:
|
||
|
print "Locations: %s" % (text)
|