diff --git a/config/redis_slave.conf b/config/redis_slave.conf index b6581b6c5..d6e21a287 100644 --- a/config/redis_slave.conf +++ b/config/redis_slave.conf @@ -1 +1 @@ -slaveof db_redis_story 6379 \ No newline at end of file +slaveof db_redis 6379 \ No newline at end of file diff --git a/fabfile.py b/fabfile.py index 2ad71a0a8..e7eaca802 100644 --- a/fabfile.py +++ b/fabfile.py @@ -260,8 +260,10 @@ def setup_db(engine=None, skip_common=False): elif engine == "redis": setup_redis() setup_redis_backups() + setup_redis_monitor() elif engine == "redis_slave": setup_redis(slave=True) + setup_redis_monitor() elif engine == "elasticsearch": setup_elasticsearch() setup_db_search() @@ -1104,6 +1106,11 @@ def setup_usage_monitor(): sudo('ln -fs %s/utils/monitor_disk_usage.py /etc/cron.daily/monitor_disk_usage' % env.NEWSBLUR_PATH) sudo('/etc/cron.daily/monitor_disk_usage') +@parallel +def setup_redis_monitor(): + sudo('ln -fs %s/utils/monitor_redis_bgsave.py /etc/cron.daily/monitor_redis_bgsave' % env.NEWSBLUR_PATH) + sudo('/etc/cron.daily/monitor_redis_bgsave') + # ================ # = Setup - Task = # ================ diff --git a/media/css/reader.css b/media/css/reader.css index f48feb5c4..a77348269 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -9004,9 +9004,6 @@ form.opml_import_form input { .NB-modal-feedchooser .feed.NB-highlighted .feed_counts .unread_count_negative { display: none; } -.NB-modal-feedchooser .NB-feedlist .folder_title { - cursor: default; -} .NB-modal-feedchooser .NB-feedlist .folder_title .feed_counts_floater { display: none; } diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js index 8b67e56f5..7f13b5bd3 100644 --- a/media/js/newsblur/reader/reader.js +++ b/media/js/newsblur/reader/reader.js @@ -4396,6 +4396,17 @@ this.slide_intelligence_slider(value); }, + toggle_read_filter: function() { + var read_filter = NEWSBLUR.assets.view_setting(this.active_feed, 'read_filter'); + var setting = { + 'read_filter': (read_filter == 'unread' ? 'all' : 'unread') + }; + var changed = NEWSBLUR.assets.view_setting(this.active_feed, setting); + if (!changed) return; + + NEWSBLUR.reader.reload_feed(setting); + }, + switch_feed_view_unread_view: function(unread_view) { if (!_.isNumber(unread_view)) unread_view = this.get_unread_view_score(); var $sidebar = this.$s.$sidebar; @@ -6438,6 +6449,10 @@ e.preventDefault(); self.move_intelligence_slider(-1); }); + $document.bind('keypress', 'shift+l', function(e) { + e.preventDefault(); + self.toggle_read_filter(); + }); $document.bind('keypress', 'shift+d', function(e) { e.preventDefault(); self.show_splash_page(); diff --git a/media/js/newsblur/reader/reader_keyboard.js b/media/js/newsblur/reader/reader_keyboard.js index f270f8e0f..a3b3b443e 100644 --- a/media/js/newsblur/reader/reader_keyboard.js +++ b/media/js/newsblur/reader/reader_keyboard.js @@ -57,7 +57,7 @@ _.extend(NEWSBLUR.ReaderKeyboard.prototype, { ]), $.make('div', { className: 'NB-keyboard-group' }, [ $.make('div', { className: 'NB-keyboard-shortcut' }, [ - $.make('div', { className: 'NB-keyboard-shortcut-explanation' }, 'Return to dashboard'), + $.make('div', { className: 'NB-keyboard-shortcut-explanation' }, 'Dashboard'), $.make('div', { className: 'NB-keyboard-shortcut-key' }, [ 'esc' ]), @@ -201,6 +201,16 @@ _.extend(NEWSBLUR.ReaderKeyboard.prototype, { '/' ]) ]) + ]), + $.make('div', { className: 'NB-keyboard-group' }, [ + $.make('div', { className: 'NB-keyboard-shortcut' }, [ + $.make('div', { className: 'NB-keyboard-shortcut-explanation' }, 'Toggle unread/all'), + $.make('div', { className: 'NB-keyboard-shortcut-key' }, [ + 'shift', + $.make('span', '+'), + 'L' + ]) + ]) ]) ]), diff --git a/utils/hostname_ssh.py b/utils/hostname_ssh.py index f61fb1507..6cd150910 100644 --- a/utils/hostname_ssh.py +++ b/utils/hostname_ssh.py @@ -11,7 +11,6 @@ if __name__ == '__main__': doapi = dop.client.Client(settings.DO_CLIENT_KEY, settings.DO_API_KEY) droplets = doapi.show_active_droplets() for droplet in droplets: - if sys.argv[1] in droplet.name: + if sys.argv[1] == droplet.name: print droplet.ip_address break - diff --git a/utils/monitor_redis_bgsave.py b/utils/monitor_redis_bgsave.py new file mode 100755 index 000000000..bf2b376f8 --- /dev/null +++ b/utils/monitor_redis_bgsave.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import sys +sys.path.append('/srv/newsblur') + +import os +import datetime +import requests +import settings +import socket + +def main(): + t = os.popen('stat -c%Y /var/lib/redis/dump.rdb') + timestamp = t.read().split('\n')[0] + modified = datetime.datetime.fromtimestamp(int(timestamp)) + ten_min_ago = datetime.datetime.now() - datetime.timedelta(minutes=10) + hostname = socket.gethostname() + modified_minutes = datetime.datetime.now() - modified + log_tail = os.popen('tail -n 100 /var/log/redis.log').read() + + if modified < ten_min_ago: + requests.post( + "https://api.mailgun.net/v2/%s/messages" % settings.MAILGUN_SERVER_NAME, + auth=("api", settings.MAILGUN_ACCESS_KEY), + data={"from": "NewsBlur Redis Monitor: %s " % (hostname, hostname), + "to": [settings.ADMINS[0][1]], + "subject": "%s hasn't bgsave'd redis in %s!" % (hostname, modified_minutes), + "text": "Last modified %s: %s ago\n\n----\n\n%s" % (hostname, modified_minutes, log_tail)}) + else: + print " ---> Redis bgsave fine: %s / %s ago" % (hostname, modified_minutes) + +if __name__ == '__main__': + main() diff --git a/utils/zgrep.py b/utils/zgrep.py index 55971d696..763bf8876 100755 --- a/utils/zgrep.py +++ b/utils/zgrep.py @@ -95,9 +95,11 @@ if __name__ == "__main__": parser = OptionParser() parser.add_option("-f", "--find", dest="find") parser.add_option("-p", "--path", dest="path") + parser.add_option("-r", "--role", dest="role") (options, args) = parser.parse_args() path = options.path find = options.find + role = options.role or 'app' command = "zgrep \"%s\"" % find - main(role="app", command=command, path=path) + main(role=role, command=command, path=path)