#!/usr/bin/python # Copyright 2007 Ryan Kavanagh import sys import os import deb822 import subprocess import string import gzip import shutil ### START SETTING VARIABLES ### home = '/home/ryan/' incomming = home + 'pbuilder/incomming/' queued = home + 'pbuilder/queued/' processed = home + 'pbuilder/processed/' log_file = processed + 'log/' logs = '/var/www/blog.ryanak.ca/web/logs/' pid = home + 'pbuilder/.checkinc.pid' ### END CONFIG ### def get_filenames(f): """ Produces a list of the three required files to build a debian source package, takes either a '.dsc' or a '.changes' as input """ base = os.path.dirname(f) if f.endswith('.dsc'): d = deb822.Dsc(file(f)) elif f.endswith('.changes'): d = deb822.Changes(file(f)) return [os.path.join(base, elt['name']) for elt in d['Files']] + [f] def number_directory(queued_directory): """ Number the queued sumdirectories, takes the Queues directory as input. """ # What are the existing queued directories? existing_directories = os.listdir(queued_directory) # Let's sort them so we can find the most recent one existing_directories.sort() # What was the number of the most recent directory? latest_dir = existing_directories[-1].split('-')[0] # Let's add one to the most recent directory's number so that the # upcomming directory is processed afterwards. return int(latest_dir) + 1 def check_and_create_queued(queued_directory, filename): """ Checks 'queued_dir' to see if the subdirectory exists. Create the subdirectory following format if it doesn't: QueueNumber-package/ example: 3-aoeui/ """ # Let's start off saying that the subdirectory doesn't exist, because # because it shouldn't! exists = False # Let's get the name of the source package. base = filename.split('_')[0] # Let's assign the number to the subdirectory since we will be using it # several times numbered_directory = str(number_directory(queued_directory)) + '-' + base # Let's iterate threw the existing subdirectories and check if the # one we want to create already exists. for item in os.listdir(queued_directory): if item == numbered_directory: exists = True # If it doesn't exist, let's create it if exists == False: new_dir = queued + numbered_directory os.mkdir(new_dir) def determine_upcomming_build(queued_directory): """ Checks 'queued_directory' and returns the upcomming file to be built """ subdirectories = os.listdir(queued_directory) subdirectories.sort() upcomming_subdirectory = subdirectory[0] # Let's return upcomming's .dsc for file in os.listdir(upcomming_subdirectory): if file.endswith('.dsc'): upcomming_dsc = queued + subdirectory[0] + file return upcomming_dsc def check_if_we_are_building(pid): """ Checks 'pid' to see if it exists. If it does, we are running and return True. """ return os.access(pid, 1) def done_building(subdirectory, distro): """ Moves the subdirectory from queued to processed once built, It also moves the build log to the webserver. """ os.rename(log_file, log + log_file) os.rename(subdirectory, processed + subdirectory) result = home + 'pbuilder/' + distro + '/result/' base = subdirectory.split('-', 1)[-1] os.rename(result + base + '*', processed + subdirectory) os.remove def build_if_not_running(upcomming_build): """ Build the upcomming dsc if we are not already running """ # Create the pid file open(pid, 'a').close() distro = get_distro(upcomming_build) log_file += p = subprocess.Popen('pbuilder-' + distro + ' build' + dsc, stdout=subprocess.PIPE) p.wait() print p.stdout.readlines() def get_distro(dsc): "Runs sed on the .diff.gz to find what pbuilder to run." diff_filename = dsc.rsplit('.', 1)[0] + '.diff.gz' changes_file = diff_filename.gzip.open(file, 'r') for line in changes_file.readlines(): if line.split(';')[0].split()[-1] == True: return line.split(';')[0].split()[-1] # What files do we have in the incomming directory? incomming_files = os.listdir(incomming) files_to_move_to_queue = [] # Let's find the .dsc file, and create a list of files to move into # it's respective queued subdirectory for filename in incomming_files: if filename.endswith('.dsc'): files_to_move_to_queue = get_filenames(filename) # We haven't done anything yet, so the subdirectory doesn't exist. exists = False for file in files_to_move_to_queue: # Move files to subdirectory in queued incomming_file = incomming + file # The directory doesn't exist yet, we don't think, but we'll check anyways if exists != True: check_and_create_queued(queued, file) # Logic dictates that it now exists exists = True # What are the current subdirectories queued_dir_list = os.listdir(queued) # What's the subdirectory? It will be queued_dir_list[-1] queued_dir_list.sort() # We will move the file from incomming to the following: queued_file = queued + queued_dir_list[-1] + '/' + file # And let's finally move the file os.rename(incomming_file, queued_file) #p = subprocess.Popen('pbuilder-' + distro + ' build' + dsc, stdout=subprocess.PIPE) #p.wait() #print p.stdout.readlines()