コード例 #1
0
def imap_to_campfire(imap_login, campfire_login):
    """
    Checks IMAP inbox and posts info to Campfire.
    
    """
    # connect to IMAP
    i = imaplib.IMAP4_SSL(imap_login['server'])
    i.login(imap_login['user'], imap_login['password'])

    # connect to Campfire
    c = Campfire(campfire_login['subdomain'])
    c.login(campfire_login['user'], campfire_login['password'])
    room = c.find_room_by_name(campfire_login['room'])

    typ, data = i.select("INBOX")
    msg_total = int(data[0])
    #import pdb; pdb.set_trace()
    for msg_id in range(1, msg_total+1):
        typ, data = i.fetch(msg_id, "(BODY[HEADER.FIELDS (TO SUBJECT)])")
        #retrieve relative part of message
        msg_info = data[0][1]
        #archive message
        i.store(msg_id, "+FLAGS", r'(\Deleted)')
    
        #post to Campfire
        room.paste("*New Message*\r\n%s" % msg_info)
    
    i.close()
    i.logout()
    c.logout()
コード例 #2
0
ファイル: bob.py プロジェクト: SeanOC/bob
class Bob(object):
    room = None
    campfire = None
    stdin_path = '/dev/null'
    stdout_path = settings.LOG_FILE
    stderr_path = settings.ERROR_FILE
    pidfile_path = settings.LOCK_FILE
    pidfile_timeout = settings.LOCK_TIMEOUT
    files_preserve = [settings.DB_FILE, ]
        
    def startup(self):
        self.campfire = Campfire(
            settings.CAMPFIRE_DOMAIN,
            ssl=settings.CAMPFIRE_SSL
        )
        self.campfire.login(settings.CAMPFIRE_LOGIN, settings.CAMPFIRE_PASSWORD)
        self.room = self.campfire.find_room_by_name(settings.CAMPFIRE_ROOM)
        self.room.join()
        self.room.speak("I'm alive!")

    # Main function
    def run(self):
        if self.is_reset_mode():
            self.reset_db()
        else:
            self.startup()
            self.db = self.get_db_cursor()
            while True:
                entry = self.get_next_entry()
                while entry:
                    self.room.ping()
                    if self.is_entry_interesting(entry):
                        self.report_entry(entry)
                    self.record_processed(entry)
                    entry = self.get_next_entry()
                time.sleep(30)
            
    def stop(self, *args, **kwargs):
        print args
        print kwargs
        self.room.speak("I'm going down!")
        self.room.leave()
        self.campfire.logout()
                    
    # Campfire Fuctions
    def report_entry(self, entry):
        msg = self.gen_message(entry)
        self.room.speak(msg)

    # SVN Functions
    def get_next_entry(self):
        last_rev = self.get_last_entry()
        if last_rev:
            next = last_rev + 1
            target_rev = pysvn.Revision(pysvn.opt_revision_kind.number, next)
        else:    
            target_rev = pysvn.Revision(pysvn.opt_revision_kind.head)

        try:
            client = pysvn.Client()
            entries = client.log(
                settings.SVN_SERVER,
                revision_start = target_rev,
                discover_changed_paths = True,
                limit = 1
            )
            entry = entries[0]
        except pysvn.ClientError:
            entry = None

        return entry

    def get_last_entry(self):
        query = "SELECT rev FROM svn_log ORDER BY processed DESC LIMIT 1"
        result = self.db.execute(query)
        rev = result.fetchone()
    
        if rev:
            rev = rev[0]
    
        return rev

    def is_entry_interesting(self, entry):
        interesting = False
        for change in entry.changed_paths:
            for prefix in settings.SVN_WATCH_PATHS:
                if change.path.startswith(prefix):
                    interesting = True
                    break

        return interesting
    
    def gen_message(self, entry):
        rev = entry.revision.number
        url = settings.COMMIT_URL % rev
        msg = '[%d] %s - "%s" (%s)' % (rev, entry.author, entry.message, url)

        return msg
    
    def record_processed(self, entry):
        rev = entry.revision.number
        now = datetime.now().isoformat()
        query = "INSERT OR IGNORE INTO svn_log (rev, processed) VALUES (:rev, :now)"
        result = self.db.execute(query, {'rev': rev, 'now': now})
        self.db.connection.commit()

    # Database Functions
    def reset_db(self):
        if os.path.exists(settings.DB_FILE):
            os.remove(settings.DB_FILE)

        db = self.get_db_cursor()
        query = "CREATE TABLE svn_log (rev INTEGER PRIMARY KEY, processed);"
        result = db.execute(query)
        db.connection.commit()
        print query

    def get_db_cursor(self):
        conn = sqlite3.connect(settings.DB_FILE)
        db = conn.cursor()

        return db


    def is_reset_mode(self):
        parser = OptionParser()
        parser.add_option("-R", "--resetdb",
                          action="store_true", dest="reset_db", default=False,
                          help="Reset the db file.")
        (options, args) = parser.parse_args()

        return options.reset_db