2016-04-07 15:03:22 +02:00
|
|
|
#!/usr/bin/env python
|
2013-02-05 15:58:27 +01:00
|
|
|
import sys
|
2013-10-28 15:54:32 +01:00
|
|
|
import os
|
2013-02-05 15:58:27 +01:00
|
|
|
import logging
|
2017-03-20 20:14:38 +01:00
|
|
|
import optparse
|
2013-02-05 15:58:27 +01:00
|
|
|
import time
|
|
|
|
import simplejson
|
|
|
|
import subprocess
|
|
|
|
import unicodedata
|
|
|
|
|
2013-10-28 15:54:32 +01:00
|
|
|
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'api'))
|
2013-08-07 17:51:03 +02:00
|
|
|
import zulip
|
2013-02-05 15:58:27 +01:00
|
|
|
|
2016-10-16 07:34:14 +02:00
|
|
|
from typing import Set
|
|
|
|
|
2013-02-05 15:58:27 +01:00
|
|
|
def fetch_public_streams():
|
2017-05-23 01:34:29 +02:00
|
|
|
# type: () -> Set[bytes]
|
2013-02-05 15:58:27 +01:00
|
|
|
public_streams = set()
|
|
|
|
|
|
|
|
try:
|
2013-08-22 17:37:02 +02:00
|
|
|
res = zulip_client.get_streams(include_all_active=True)
|
2013-02-05 15:58:27 +01:00
|
|
|
if res.get("result") == "success":
|
|
|
|
streams = res["streams"]
|
|
|
|
else:
|
2013-01-14 19:08:33 +01:00
|
|
|
logging.error("Error getting public streams:\n%s" % (res,))
|
2013-02-05 15:58:27 +01:00
|
|
|
return None
|
|
|
|
except Exception:
|
|
|
|
logging.exception("Error getting public streams:")
|
|
|
|
return None
|
|
|
|
|
|
|
|
for stream in streams:
|
2013-06-24 21:15:33 +02:00
|
|
|
stream_name = stream["name"]
|
2013-02-05 15:58:27 +01:00
|
|
|
# Zephyr class names are canonicalized by first applying NFKC
|
|
|
|
# normalization and then lower-casing server-side
|
2013-06-24 21:15:33 +02:00
|
|
|
canonical_cls = unicodedata.normalize("NFKC", stream_name).lower().encode("utf-8")
|
2017-05-23 01:34:29 +02:00
|
|
|
if canonical_cls in [b'security', b'login', b'network', b'ops', b'user_locate',
|
|
|
|
b'mit', b'moof', b'wsmonitor', b'wg_ctl', b'winlogger',
|
|
|
|
b'hm_ctl', b'hm_stat', b'zephyr_admin', b'zephyr_ctl']:
|
2013-02-05 15:58:27 +01:00
|
|
|
# These zephyr classes cannot be subscribed to by us, due
|
|
|
|
# to MIT's Zephyr access control settings
|
|
|
|
continue
|
|
|
|
|
|
|
|
public_streams.add(canonical_cls)
|
|
|
|
|
|
|
|
return public_streams
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2013-10-04 19:19:57 +02:00
|
|
|
log_file = "/home/zulip/sync_public_streams.log"
|
2013-02-05 15:58:27 +01:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
log_format = "%(asctime)s: %(message)s"
|
|
|
|
logging.basicConfig(format=log_format)
|
|
|
|
formatter = logging.Formatter(log_format)
|
|
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
file_handler = logging.FileHandler(log_file)
|
|
|
|
file_handler.setFormatter(formatter)
|
|
|
|
logger.addHandler(file_handler)
|
|
|
|
|
2017-03-20 20:14:38 +01:00
|
|
|
parser = optparse.OptionParser()
|
|
|
|
parser.add_option_group(zulip.generate_option_group(parser))
|
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
|
|
|
|
zulip_client = zulip.Client(client="ZulipSyncPublicStreamsBot/0.1")
|
|
|
|
|
2013-02-05 15:58:27 +01:00
|
|
|
while True:
|
|
|
|
time.sleep(15)
|
|
|
|
public_streams = fetch_public_streams()
|
|
|
|
if public_streams is None:
|
|
|
|
continue
|
|
|
|
|
2016-03-10 18:18:37 +01:00
|
|
|
f = open("/home/zulip/public_streams.tmp", "w")
|
2013-02-05 15:58:27 +01:00
|
|
|
f.write(simplejson.dumps(list(public_streams)) + "\n")
|
|
|
|
f.close()
|
|
|
|
|
2013-10-04 19:19:57 +02:00
|
|
|
subprocess.call(["mv", "/home/zulip/public_streams.tmp", "/home/zulip/public_streams"])
|