def main(): logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M') logging.getLogger("requests").propagate = False logging.getLogger("sh").propagate = False log = logging.getLogger("chaosbot") if exists("voters.json"): log.info("Moving voters,json to server directory!") shutil.move("./voters.json", "./server/voters.json") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) log.info("starting up and entering event loop") os.system("pkill chaos_server") server_dir = join(dirname(abspath(__file__)), "server") subprocess.Popen([sys.executable, "server.py"], cwd=server_dir) # Schedule all cron jobs to be run cron.schedule_jobs() log.info("Setting description to {desc}".format(desc=settings.REPO_DESCRIPTION)) github_api.repos.set_desc(api, settings.URN, settings.REPO_DESCRIPTION) while True: # Run any scheduled jobs on the next second. schedule.run_pending() time.sleep(1)
def main(): logging.basicConfig(level=logging.DEBUG) logging.getLogger("requests").propagate = False logging.getLogger("sh").propagate = False log = logging.getLogger("chaosbot") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) log.info("starting up and entering event loop") os.system("pkill chaos_server") server_dir = join(dirname(abspath(__file__)), "server") subprocess.Popen([sys.executable, "server.py"], cwd=server_dir) #log.info("starting http server") #start_http_server() # Schedule all cron jobs to be run cron.schedule_jobs() while True: # Run any scheduled jobs on the next second. schedule.run_pending() time.sleep(1)
def main(): # Set up logging stuff logging_handler_out = logging.StreamHandler(sys.stdout) logging_handler_out.setLevel(settings.LOG_LEVEL_OUT) logging_handler_out.addFilter(LessThanFilter(settings.LOG_LEVEL_ERR)) logging_handler_err = logging.StreamHandler(sys.stderr) logging_handler_err.setLevel(settings.LOG_LEVEL_ERR) logging.basicConfig( level=logging.NOTSET, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', handlers=[logging_handler_out, logging_handler_err]) logging.getLogger("requests").propagate = False logging.getLogger("sh").propagate = False logging.getLogger("peewee").propagate = False log = logging.getLogger("chaosbot") if exists("voters.json"): log.info("Moving voters.json to server directory!") shutil.move("./voters.json", "./server/voters.json") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) log.info("checking if I crashed before...") # check if chaosbot is not on the tip of the master branch check_for_prev_crash(api, log) log.info("starting up and entering event loop") os.system("pkill uwsgi") subprocess.Popen([ "/root/.virtualenvs/chaos/bin/uwsgi", "--socket", "127.0.0.1:8085", "--wsgi-file", "webserver.py", "--callable", "__hug_wsgi__", "--check-static", "/root/workspace/Chaos/server/", "--daemonize", "/root/workspace/Chaos/log/uwsgi.log" ]) # Schedule all cron jobs to be run cron.schedule_jobs(api) log.info( "Setting description to {desc}".format(desc=settings.REPO_DESCRIPTION)) github_api.repos.set_desc(api, settings.URN, settings.REPO_DESCRIPTION) log.info("Ensure creation of issue/PR labels") for label, color in settings.REPO_LABELS.items(): github_api.repos.create_label(api, settings.URN, label, color) while True: # Run any scheduled jobs on the next second. schedule.run_pending() time.sleep(1)
def poll_pull_requests(): __log.info("looking for PRs") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) now = arrow.utcnow() voting_window = gh.voting.get_voting_window(now) prs = gh.prs.get_ready_prs(api, settings.URN, voting_window) needs_update = False for pr in prs: pr_num = pr["number"] __log.info("processing PR #%d", pr_num) votes = gh.voting.get_votes(api, settings.URN, pr) # is our PR approved or rejected? vote_total = gh.voting.get_vote_sum(api, votes) threshold = gh.voting.get_approval_threshold(api, settings.URN) is_approved = vote_total >= threshold if is_approved: __log.info("PR %d approved for merging!", pr_num) try: gh.prs.merge_pr(api, settings.URN, pr, votes, vote_total, threshold) # some error, like suddenly there's a merge conflict, or some # new commits were introduced between findint this ready pr and # merging it except gh.exceptions.CouldntMerge: __log.info("couldn't merge PR %d for some reason, skipping", pr_num) gh.prs.label_pr(api, settings.URN, pr_num, ["can't merge"]) continue gh.prs.label_pr(api, settings.URN, pr_num, ["accepted"]) # chaosbot rewards merge owners with a follow pr_owner = pr["user"]["login"] gh.users.follow_user(api, pr_owner) needs_update = True else: __log.info("PR %d rejected, closing", pr_num) gh.comments.leave_reject_comment(api, settings.URN, pr_num) gh.prs.label_pr(api, settings.URN, pr_num, ["rejected"]) gh.prs.close_pr(api, settings.URN, pr) # we approved a PR, restart if needs_update: __log.info("updating code and requirements and restarting self") startup_path = join(THIS_DIR, "..", "startup.sh") os.execl(startup_path, startup_path) __log.info("Waiting %d seconds until next scheduled PR polling event", settings.PULL_REQUEST_POLLING_INTERVAL_SECONDS)
def main(): # Set up logging stuff logging_handler_out = logging.StreamHandler(sys.stdout) logging_handler_out.setLevel(settings.LOG_LEVEL_OUT) logging_handler_out.addFilter(LessThanFilter(settings.LOG_LEVEL_ERR)) logging_handler_err = logging.StreamHandler(sys.stderr) logging_handler_err.setLevel(settings.LOG_LEVEL_ERR) logging.basicConfig( level=logging.NOTSET, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', handlers=[logging_handler_out, logging_handler_err]) logging.getLogger("requests").propagate = False logging.getLogger("sh").propagate = False log = logging.getLogger("chaosbot") if exists("voters.json"): log.info("Moving voters.json to server directory!") shutil.move("./voters.json", "./server/voters.json") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) log.info("checking if I crashed before...") # check if chaosbot is not on the tip of the master branch check_for_prev_crash(api, log) log.info("starting up and entering event loop") os.system("pkill chaos_server") server_dir = join(dirname(abspath(__file__)), "server") subprocess.Popen([sys.executable, "server.py"], cwd=server_dir) # Schedule all cron jobs to be run cron.schedule_jobs(api) log.info( "Setting description to {desc}".format(desc=settings.REPO_DESCRIPTION)) github_api.repos.set_desc(api, settings.URN, settings.REPO_DESCRIPTION) log.info("Ensure creation of issue/PR labels") for label, color in settings.REPO_LABELS.items(): github_api.repos.create_label(api, settings.URN, label, color) while True: # Run any scheduled jobs on the next second. schedule.run_pending() time.sleep(1)
def poll_read_issue_comments(): __log.info("looking for issue comments") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) issue_comments = gh.comments.get_all_issue_comments(api, settings.URN) for issue_comment in issue_comments: handle_comment(api, issue_comment) __log.info("Waiting %d seconds until next scheduled Issue comment polling", settings.ISSUE_COMMENT_POLLING_INTERVAL_SECONDS)
def poll_pull_requests(): __log.info("looking for PRs") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) # get voting window now = arrow.utcnow() voting_window = gh.voting.get_voting_window(now) # get all ready prs (disregarding of the voting window) prs = gh.prs.get_ready_prs(api, settings.URN, 0) needs_update = False for pr in prs: pr_num = pr["number"] __log.info("processing PR #%d", pr_num) # gather all current votes votes = gh.voting.get_votes(api, settings.URN, pr) # is our PR approved or rejected? vote_total = gh.voting.get_vote_sum(api, votes) threshold = gh.voting.get_approval_threshold(api, settings.URN) is_approved = vote_total >= threshold # is our PR in voting window? in_window = gh.prs.is_pr_in_voting_window(pr, voting_window) if is_approved: __log.info("PR %d status: will be approved", pr_num) gh.prs.post_accepted_status(api, settings.URN, pr, voting_window, votes, vote_total, threshold) if in_window: __log.info("PR %d approved for merging!", pr_num) try: sha = gh.prs.merge_pr(api, settings.URN, pr, votes, vote_total, threshold) # some error, like suddenly there's a merge conflict, or some # new commits were introduced between findint this ready pr and # merging it except gh.exceptions.CouldntMerge: __log.info( "couldn't merge PR %d for some reason, skipping", pr_num) gh.prs.label_pr(api, settings.URN, pr_num, ["can't merge"]) continue gh.comments.leave_accept_comment(api, settings.URN, pr_num, sha, votes, vote_total, threshold) gh.prs.label_pr(api, settings.URN, pr_num, ["accepted"]) # chaosbot rewards merge owners with a follow pr_owner = pr["user"]["login"] gh.users.follow_user(api, pr_owner) needs_update = True else: __log.info("PR %d status: will be rejected", pr_num) if in_window: gh.prs.post_rejected_status(api, settings.URN, pr, voting_window, votes, vote_total, threshold) __log.info("PR %d rejected, closing", pr_num) gh.comments.leave_reject_comment(api, settings.URN, pr_num, votes, vote_total, threshold) gh.prs.label_pr(api, settings.URN, pr_num, ["rejected"]) gh.prs.close_pr(api, settings.URN, pr) elif vote_total < 0: gh.prs.post_rejected_status(api, settings.URN, pr, voting_window, votes, vote_total, threshold) else: gh.prs.post_pending_status(api, settings.URN, pr, voting_window, votes, vote_total, threshold) # This sets up a voting record, with each user having a count of votes # that they have cast. try: fp = open('voters.json', 'x') fp.close() except: # file already exists, which is what we want pass with open('voters.json', 'r+') as fp: old_votes = {} fs = fp.read() if fs: # if the voting record exists, read it in old_votes = json.loads(fs) # then prepare for overwriting fp.seek(0) fp.truncate() for user in votes: if user in old_votes: old_votes[user] += 1 else: old_votes[user] = 1 json.dump(old_votes, fp) # we approved a PR, restart if needs_update: __log.info("updating code and requirements and restarting self") startup_path = join(THIS_DIR, "..", "startup.sh") os.execl(startup_path, startup_path) __log.info("Waiting %d seconds until next scheduled PR polling event", settings.PULL_REQUEST_POLLING_INTERVAL_SECONDS)
import github_api.voting import github_api.repos import github_api.comments from github_api import exceptions as gh_exc import patch THIS_DIR = dirname(abspath(__file__)) logging.basicConfig(level=logging.DEBUG) logging.getLogger("requests").propagate = False logging.getLogger("sh").propagate = False log = logging.getLogger("chaosbot") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) fortunes = [] with open("fortunes.txt", "r", encoding="utf8") as f: fortunes = f.read().split("\n%\n") class HTTPServerRequestHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(random.choice(fortunes).encode("utf8"))
def main(): logging.basicConfig(level=logging.DEBUG) logging.getLogger("requests").propagate = False logging.getLogger("sh").propagate = False log = logging.getLogger("chaosbot") api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET) logging.info("starting up and entering event loop") os.system("pkill chaos_server") server_dir = join(dirname(abspath(__file__)), "server") subprocess.Popen([sys.executable, "server.py"], cwd=server_dir) log.info("starting http server") start_http_server() while True: log.info("looking for PRs") now = arrow.utcnow() voting_window = gh.voting.get_voting_window(now) prs = gh.prs.get_ready_prs(api, settings.URN, voting_window) needs_update = False for pr in prs: pr_num = pr["number"] logging.info("processing PR #%d", pr_num) votes = gh.voting.get_votes(api, settings.URN, pr) # is our PR approved or rejected? vote_total = gh.voting.get_vote_sum(api, votes) threshold = gh.voting.get_approval_threshold(api, settings.URN) is_approved = vote_total >= threshold if is_approved: log.info("PR %d approved for merging!", pr_num) try: gh.prs.merge_pr(api, settings.URN, pr, votes, vote_total, threshold) # some error, like suddenly there's a merge conflict, or some # new commits were introduced between findint this ready pr and # merging it except gh_exc.CouldntMerge: log.info("couldn't merge PR %d for some reason, skipping", pr_num) gh.prs.label_pr(api, settings.URN, pr_num, ["can't merge"]) continue gh.prs.label_pr(api, settings.URN, pr_num, ["accepted"]) needs_update = True else: log.info("PR %d rejected, closing", pr_num) gh.comments.leave_reject_comment(api, settings.URN, pr_num) gh.prs.label_pr(api, settings.URN, pr_num, ["rejected"]) gh.prs.close_pr(api, settings.URN, pr) # we approved a PR, restart if needs_update: logging.info("updating code and requirements and restarting self") restart_self() logging.info("sleeping for %d seconds", settings.SLEEP_TIME) time.sleep(settings.SLEEP_TIME)