diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index f369fcce3a37c313daf47f2ada7de6494f0d47df..682614802d7d3383a5699c7b3d88ad1211db3968 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -431,6 +431,16 @@ </label> </div> + <div class="field-pair"> + <label for="notify_on_login"> + <span class="component-title">Notify on login</span> + <span class="component-desc"> + <input type="checkbox" name="notify_on_login" class="enabler" id="notify_on_login" ${('', 'checked="checked"')[bool(sickbeard.NOTIFY_ON_LOGIN)]}/> + <p>enable to be notified when a new login happens in webserver</p> + </span> + </label> + </div> + <div class="field-pair"> <label for="web_ipv6"> <span class="component-title">Listen on IPv6</span> diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index dfe627411d080e9f83c723ac66eb2f431cf319cd..8cd96b162a23a70ae3ea6a43ee265096bdce6767 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -180,6 +180,7 @@ API_KEY = None API_ROOT = None ENABLE_HTTPS = False +NOTIFY_ON_LOGIN = False HTTPS_CERT = None HTTPS_KEY = None @@ -575,7 +576,7 @@ def initialize(consoleLogging=True): with INIT_LOCK: global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, GIT_NEWVER, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, ENCRYPTION_SECRET, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, WEB_COOKIE_SECRET, WEB_USE_GZIP, API_KEY, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \ - HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, SAB_FORCED, TORRENT_METHOD, \ + HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, SAB_FORCED, TORRENT_METHOD, NOTIFY_ON_LOGIN, \ SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, SAB_CATEGORY_BACKLOG, SAB_CATEGORY_ANIME, SAB_CATEGORY_ANIME_BACKLOG, SAB_HOST, \ NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_CATEGORY_BACKLOG, NZBGET_CATEGORY_ANIME, NZBGET_CATEGORY_ANIME_BACKLOG, NZBGET_PRIORITY, NZBGET_HOST, NZBGET_USE_HTTPS, backlogSearchScheduler, \ TORRENT_USERNAME, TORRENT_PASSWORD, TORRENT_HOST, TORRENT_PATH, TORRENT_SEED_TIME, TORRENT_PAUSED, TORRENT_HIGH_BANDWIDTH, TORRENT_LABEL, TORRENT_LABEL_ANIME, TORRENT_VERIFY_CERT, TORRENT_RPCURL, TORRENT_AUTH_TYPE, \ @@ -815,6 +816,8 @@ def initialize(consoleLogging=True): ENABLE_HTTPS = bool(check_setting_int(CFG, 'General', 'enable_https', 0)) + NOTIFY_ON_LOGIN = bool(check_setting_int(CFG, 'General', 'notify_on_login', 0)) + HTTPS_CERT = check_setting_str(CFG, 'General', 'https_cert', 'server.crt') HTTPS_KEY = check_setting_str(CFG, 'General', 'https_key', 'server.key') @@ -1688,6 +1691,7 @@ def save_config(): new_config['General']['debug'] = int(DEBUG) new_config['General']['default_page'] = DEFAULT_PAGE new_config['General']['enable_https'] = int(ENABLE_HTTPS) + new_config['General']['notify_on_login'] = int(NOTIFY_ON_LOGIN) new_config['General']['https_cert'] = HTTPS_CERT new_config['General']['https_key'] = HTTPS_KEY new_config['General']['handle_reverse_proxy'] = int(HANDLE_REVERSE_PROXY) diff --git a/sickbeard/common.py b/sickbeard/common.py index 731aaa84896b266d875e8d8e09217072db5e7e74..3af49f8ce9b90fdd20e242bf125a79fdeb900255 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -78,13 +78,17 @@ NOTIFY_DOWNLOAD = 2 NOTIFY_SUBTITLE_DOWNLOAD = 3 NOTIFY_GIT_UPDATE = 4 NOTIFY_GIT_UPDATE_TEXT = 5 +NOTIFY_LOGIN = 6 +NOTIFY_LOGIN_TEXT = 7 notifyStrings = NumDict({ NOTIFY_SNATCH: "Started Download", NOTIFY_DOWNLOAD: "Download Finished", NOTIFY_SUBTITLE_DOWNLOAD: "Subtitle Download Finished", NOTIFY_GIT_UPDATE: "SickRage Updated", - NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: " + NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: ", + NOTIFY_LOGIN : "SickRage new login", + NOTIFY_LOGIN_TEXT : "New login from IP: {0}. http://geomaplookup.net/?ip={0}" }) # Episode statuses diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 5aa6f95c16b8d189b00fe7e199a2166c110f6769..4d86695a3450e09029aa603aaf8d3f43c9ed2814 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1757,3 +1757,10 @@ def getTVDBFromID(indexer_id, indexer): return tvdb_id else: return tvdb_id + +def is_ip_private(ip): + priv_lo = re.compile("^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$") + priv_24 = re.compile("^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$") + priv_20 = re.compile("^192\.168\.\d{1,3}.\d{1,3}$") + priv_16 = re.compile("^172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{1,3}.[0-9]{1,3}$") + return priv_lo.match(ip) or priv_24.match(ip) or priv_20.match(ip) or priv_16.match(ip) diff --git a/sickbeard/notifiers/__init__.py b/sickbeard/notifiers/__init__.py index 4ed59e1f7c62e9933dd781af5811876840d012fc..ab4472ec4acc4b3d791af006584f468f8dbb7867 100644 --- a/sickbeard/notifiers/__init__.py +++ b/sickbeard/notifiers/__init__.py @@ -107,3 +107,8 @@ def notify_snatch(ep_name): def notify_git_update(new_version=""): for n in notifiers: n.notify_git_update(new_version) + + +def notify_login(ipaddress): + for n in notifiers: + n.notify_login(ipaddress) diff --git a/sickbeard/notifiers/boxcar2.py b/sickbeard/notifiers/boxcar2.py index 5bb79cd7490b93b79eeed2c5f87c1094d73a5506..28fadc43eade167bfc260bf47748d60e4abb7272 100644 --- a/sickbeard/notifiers/boxcar2.py +++ b/sickbeard/notifiers/boxcar2.py @@ -104,6 +104,12 @@ class Boxcar2Notifier(object): title = notifyStrings[NOTIFY_GIT_UPDATE] self._notifyBoxcar2(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_BOXCAR2: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyBoxcar2(title, update_text.format(ipaddress)) + def _notifyBoxcar2(self, title, message, accesstoken=None): """ Sends a boxcar2 notification based on the provided info or SB config diff --git a/sickbeard/notifiers/emailnotify.py b/sickbeard/notifiers/emailnotify.py index 34249c92de064129a725b9fcab8a7d0e73b216ab..ce8d4ead9d3e3935946f8e9dcbb20cf63b963be1 100644 --- a/sickbeard/notifiers/emailnotify.py +++ b/sickbeard/notifiers/emailnotify.py @@ -170,6 +170,9 @@ class EmailNotifier(object): def notify_git_update(self, new_version="??"): pass + def notify_login(self, ipaddress=""): + pass + def _generate_recipients(self, show): addrs = [] myDB = db.DBConnection() diff --git a/sickbeard/notifiers/freemobile.py b/sickbeard/notifiers/freemobile.py index dc040d819291291f3f54d8ba86ec3b74484ad209..bf9ac00b4bb0ae5a85aaad1c0adb145ec60a281d 100644 --- a/sickbeard/notifiers/freemobile.py +++ b/sickbeard/notifiers/freemobile.py @@ -102,6 +102,12 @@ class FreeMobileNotifier(object): title = notifyStrings[NOTIFY_GIT_UPDATE] self._notifyFreeMobile(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_FREEMOBILE: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyFreeMobile(title, update_text.format(ipaddress)) + def _notifyFreeMobile(self, title, message, cust_id=None, apiKey=None, force=False): """ Sends a SMS notification diff --git a/sickbeard/notifiers/growl.py b/sickbeard/notifiers/growl.py index a1a234c4442c59e3622d34d3b686b253136be8af..aa86c8aa6ec2672083679d0a1471d0920427f08a 100644 --- a/sickbeard/notifiers/growl.py +++ b/sickbeard/notifiers/growl.py @@ -52,6 +52,12 @@ class GrowlNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._sendGrowl(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_GROWL: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._sendGrowl(title, update_text.format(ipaddress)) + def _send_growl(self, options, message=None): # Send Notification diff --git a/sickbeard/notifiers/kodi.py b/sickbeard/notifiers/kodi.py index aeb35c7a872a497a25d6c0280a0ecd20fdc2a150..2e9f36b022b508a27d5c2d6e43b1e88865ec5a13 100644 --- a/sickbeard/notifiers/kodi.py +++ b/sickbeard/notifiers/kodi.py @@ -531,6 +531,12 @@ class KODINotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._notify_kodi(update_text + new_version, title) + def notify_login(self, ipaddress=""): + if sickbeard.USE_KODI: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notify_kodi(update_text.format(ipaddress), title) + def test_notify(self, host, username, password): return self._notify_kodi("Testing KODI notifications from SickRage", "Test Notification", host, username, password, force=True) diff --git a/sickbeard/notifiers/libnotify.py b/sickbeard/notifiers/libnotify.py index ab4efff673a9e51ba30a22db6e920d880d56381a..40a6c1c69ba63425362a224bcc35fec518412fd2 100644 --- a/sickbeard/notifiers/libnotify.py +++ b/sickbeard/notifiers/libnotify.py @@ -102,6 +102,12 @@ class LibnotifyNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._notify(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_LIBNOTIFY: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notify(title, update_text.format(ipaddress)) + def test_notify(self): return self._notify('Test notification', "This is a test notification from SickRage", force=True) diff --git a/sickbeard/notifiers/nma.py b/sickbeard/notifiers/nma.py index d34e11089a139663901d93a400f925ac72fa9037..ad5ea24d4cfdcd898d544d47065864d318aecd68 100644 --- a/sickbeard/notifiers/nma.py +++ b/sickbeard/notifiers/nma.py @@ -32,6 +32,14 @@ class NMA_Notifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._sendNMA(nma_api=None, nma_priority=None, event=title, message=update_text + new_version) + + def notify_login(self, ipaddress=""): + if sickbeard.USE_NMA: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._sendNMA(nma_api=None, nma_priority=None, event=title, message=update_text.format(ipaddress)) + + def _sendNMA(self, nma_api=None, nma_priority=None, event=None, message=None, force=False): title = 'SickRage' diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py index 8b8be514480d0b8fb88c74c0f13c0eedc46e414d..47e8309f1b927d96704f6edc19861ad5802f958e 100644 --- a/sickbeard/notifiers/nmj.py +++ b/sickbeard/notifiers/nmj.py @@ -101,6 +101,9 @@ class NMJNotifier(object): return False # Not implemented, no reason to start scanner. + def notify_login(self, ipaddress=""): + return False + def test_notify(self, host, database, mount): return self._sendNMJ(host, database, mount) diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py index a99b8c92fc9fb7d8700eac05d0037d64d95b4871..9a4d57fddefb1db3d5d630cb4acb4f8faee31954 100644 --- a/sickbeard/notifiers/nmjv2.py +++ b/sickbeard/notifiers/nmjv2.py @@ -47,6 +47,9 @@ class NMJv2Notifier(object): return False # Not implemented, no reason to start scanner. + def notify_login(self, ipaddress=""): + return False + def test_notify(self, host): return self._sendNMJ(host) diff --git a/sickbeard/notifiers/plex.py b/sickbeard/notifiers/plex.py index 941b8223c309f1905310e365b14003e7bec31d51..e0e0987b182e3d554b5dd2faeef01e9e085e9b1d 100644 --- a/sickbeard/notifiers/plex.py +++ b/sickbeard/notifiers/plex.py @@ -156,6 +156,13 @@ class PLEXNotifier(object): if update_text and title and new_version: self._notify_pmc(update_text + new_version, title) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PLEX: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + if update_text and title and new_version: + self._notify_pmc(update_text.format(ipaddress), title) + def test_notify_pmc(self, host, username, password): return self._notify_pmc('This is a test notification from SickRage', 'Test Notification', host, username, password, force=True) diff --git a/sickbeard/notifiers/prowl.py b/sickbeard/notifiers/prowl.py index 8f1bde7513000c7c962459a29398ba97c36bfb4c..fd47d5a6387c875c17c8ed619d8ec0953d8dcdc4 100644 --- a/sickbeard/notifiers/prowl.py +++ b/sickbeard/notifiers/prowl.py @@ -86,6 +86,12 @@ class ProwlNotifier(object): self._send_prowl(prowl_api=None, prowl_priority=None, event=title, message=update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PROWL: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._send_prowl(prowl_api=None, prowl_priority=None, + event=title, message=update_text.format(ipaddress)) @staticmethod def _generate_recipients(show=None): diff --git a/sickbeard/notifiers/pushalot.py b/sickbeard/notifiers/pushalot.py index 77c0ea71488c139c4542624a242e298341002cea..6a3c82b02a0c457172d6ea3cbee246f93e18c0f6 100644 --- a/sickbeard/notifiers/pushalot.py +++ b/sickbeard/notifiers/pushalot.py @@ -57,6 +57,14 @@ class PushalotNotifier(object): event=title, message=update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PUSHALOT: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._sendPushalot(pushalot_authorizationtoken=None, + event=title, + message=update_text.format(ipaddress)) + def _sendPushalot(self, pushalot_authorizationtoken=None, event=None, message=None, force=False): if not sickbeard.USE_PUSHALOT and not force: diff --git a/sickbeard/notifiers/pushbullet.py b/sickbeard/notifiers/pushbullet.py index 0e633b81eacbcce37ae3c80cb32b5b5c2ed380dc..2a218ba8661791b4f8c1dfe76472fac613b0fdb3 100644 --- a/sickbeard/notifiers/pushbullet.py +++ b/sickbeard/notifiers/pushbullet.py @@ -63,6 +63,10 @@ class PushbulletNotifier(object): if sickbeard.USE_PUSHBULLET: self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_GIT_UPDATE], message=notifyStrings[NOTIFY_GIT_UPDATE_TEXT] + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PUSHBULLET: + self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_LOGIN], message=notifyStrings[NOTIFY_LOGIN_TEXT].format(ipaddress)) + def _sendPushbullet(self, pushbullet_api=None, pushbullet_device=None, event=None, message=None): if not (sickbeard.USE_PUSHBULLET or event == 'Test' or event is None): diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py index 3d6ca648ccca34c78f88c5729502d2e9cc3c7eb1..a0914e7dd4b392738c51899a0f3d6b1c0952d70a 100644 --- a/sickbeard/notifiers/pushover.py +++ b/sickbeard/notifiers/pushover.py @@ -151,6 +151,12 @@ class PushoverNotifier(object): title = notifyStrings[NOTIFY_GIT_UPDATE] self._notifyPushover(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PUSHOVER: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyPushover(title, update_text.format(ipaddress)) + def _notifyPushover(self, title, message, sound=None, userKey=None, apiKey=None, force=False): """ Sends a pushover notification based on the provided info or SR config diff --git a/sickbeard/notifiers/pytivo.py b/sickbeard/notifiers/pytivo.py index dfdc8ab8991d663b9ae8ce2398ef156aefc65d96..c6fd68d6151ee4757a02edfc4cef7b58e9483d92 100644 --- a/sickbeard/notifiers/pytivo.py +++ b/sickbeard/notifiers/pytivo.py @@ -42,6 +42,9 @@ class pyTivoNotifier(object): def notify_git_update(self, new_version): pass + def notify_login(self, ipaddress=""): + pass + def update_library(self, ep_obj): # Values from config diff --git a/sickbeard/notifiers/synoindex.py b/sickbeard/notifiers/synoindex.py index b1275ce95b942699ec03eef9e121b5e6ef10261d..30c844feb5af6443a79466015a5bc64c986412ee 100644 --- a/sickbeard/notifiers/synoindex.py +++ b/sickbeard/notifiers/synoindex.py @@ -41,6 +41,9 @@ class synoIndexNotifier(object): def notify_git_update(self, new_version): pass + def notify_login(self, ipaddress=""): + pass + def moveFolder(self, old_path, new_path): self.moveObject(old_path, new_path) diff --git a/sickbeard/notifiers/synologynotifier.py b/sickbeard/notifiers/synologynotifier.py index 2f3f62d26f8d7871f782e421f844e628ec1110f6..cadac287d19021cbd7402695b9fc88fac1d9a191 100644 --- a/sickbeard/notifiers/synologynotifier.py +++ b/sickbeard/notifiers/synologynotifier.py @@ -47,6 +47,12 @@ class synologyNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._send_synologyNotifier(update_text + new_version, title) + def notify_login(self, ipaddress=""): + if sickbeard.USE_SYNOLOGYNOTIFIER: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._send_synologyNotifier(update_text.format(ipaddress), title) + def _send_synologyNotifier(self, message, title): synodsmnotify_cmd = ["/usr/syno/bin/synodsmnotify", "@administrators", title, message] logger.log(u"Executing command " + str(synodsmnotify_cmd)) diff --git a/sickbeard/notifiers/trakt.py b/sickbeard/notifiers/trakt.py index 6733c5d1b38eb0e360a55fb88f9b4a89752e9b25..33c4a2873bdebb2bc3a5328ab56ae5dc8e04ed31 100644 --- a/sickbeard/notifiers/trakt.py +++ b/sickbeard/notifiers/trakt.py @@ -43,6 +43,9 @@ class TraktNotifier(object): def notify_git_update(self, new_version): pass + def notify_login(self, ipaddress=""): + pass + def update_library(self, ep_obj): """ Sends a request to trakt indicating that the given episode is part of our library. diff --git a/sickbeard/notifiers/tweet.py b/sickbeard/notifiers/tweet.py index 99f6554c098cbbe06431197eb0d2870b09bef144..0f114758019cda43527390b51191f5e54a28bfe3 100644 --- a/sickbeard/notifiers/tweet.py +++ b/sickbeard/notifiers/tweet.py @@ -60,6 +60,12 @@ class TwitterNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._notifyTwitter(title + " - " + update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_TWITTER: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyTwitter(title + " - " + update_text.format(ipaddress)) + def test_notify(self): return self._notifyTwitter("This is a test notification from SickRage", force=True) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 30f166731ebf74e7927daf61e6294bceb5eab6f2..4dd00180c5b4c52a09cd75fc8647fbbb80f4afbb 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -298,6 +298,9 @@ class LoginHandler(BaseHandler): and (self.get_argument('password') == password or not password): api_key = sickbeard.API_KEY + if sickbeard.NOTIFY_ON_LOGIN and not helpers.is_ip_private(self.request.remote_ip): + notifiers.notify_login(self.request.remote_ip) + if api_key: remember_me = int(self.get_argument('remember_me', default=0) or 0) self.set_secure_cookie('sickrage_user', api_key, expires_days=30 if remember_me > 0 else None) @@ -3756,7 +3759,7 @@ class ConfigGeneral(Config): sickbeard.save_config() - def saveGeneral(self, log_dir=None, log_nr=5, log_size=1048576, web_port=None, web_log=None, encryption_version=None, web_ipv6=None, + def saveGeneral(self, log_dir=None, log_nr=5, log_size=1048576, web_port=None, notify_on_login=None, web_log=None, encryption_version=None, web_ipv6=None, trash_remove_show=None, trash_rotate_logs=None, update_frequency=None, skip_removed_files=None, indexerDefaultLang='en', ep_default_deleted_status=None, launch_browser=None, showupdate_hour=3, web_username=None, api_key=None, indexer_default=None, timezone_display=None, cpu_preset='NORMAL', @@ -3809,7 +3812,7 @@ class ConfigGeneral(Config): # sickbeard.LOG_DIR is set in config.change_LOG_DIR() sickbeard.COMING_EPS_MISSED_RANGE = try_int(coming_eps_missed_range, 7) sickbeard.DISPLAY_ALL_SEASONS = config.checkbox_to_value(display_all_seasons) - + sickbeard.NOTIFY_ON_LOGIN = config.checkbox_to_value(notify_on_login) sickbeard.WEB_PORT = try_int(web_port) sickbeard.WEB_IPV6 = config.checkbox_to_value(web_ipv6) # sickbeard.WEB_LOG is set in config.change_LOG_DIR()