コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
ファイル: chaos.py プロジェクト: rlee287/Chaos
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)
コード例 #4
0
ファイル: poll_pull_requests.py プロジェクト: qgustavor/chaos
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)
コード例 #5
0
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)
コード例 #6
0
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)
コード例 #7
0
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)
コード例 #8
0
ファイル: chaos.py プロジェクト: russellpierce/chaos
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"))

コード例 #9
0
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)