Ticket #2931: arielb-new_repo.py

File arielb-new_repo.py, 8.0 KB (added by toshio, 2 years ago)

new_repo script from arielb

Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3''' Creates a new repo for users '''
4#
5# Copyright ???? 2010 Red Hat, Inc. All rights reserved.
6#
7# This copyrighted material is made available to anyone wishing to use, modify,
8# copy, or redistribute it subject to the terms and conditions of the GNU
9# General Public License v.2.  This program is distributed in the hope that it
10# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
11# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12# See the GNU General Public License for more details.  You should have
13# received a copy of the GNU General Public License along with this program;
14# if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
15# Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat trademarks that are
16# incorporated in the source code or documentation are not subject to the GNU
17# General Public License and may only be used or replicated with the express
18# permission of Red Hat, Inc.
19#
20# Red Hat Author(s): Mike McGrath <mmcgrath@redhat.com>
21import re
22import os
23import sys
24import grp
25
26VALID_RELEASES = ['fedora-15', 'fedora-16', 'fedora-17', 'epel-4',
27                             'epel-5', 'epel-6']
28       
29BASE_DIR = '/srv/repos'
30REPO_BASE_URL = 'http://repos.fedorapeople.org/repos'
31DEFAULT_ARCHS = ['i386', 'x86_64', 'SRPMS']
32
33def getNameGroup():
34   return grp.getgrgid(os.getgid()).gr_name
35
36def searchGroup(nameGroupFind):
37   try:
38      grp.getgrnam(nameGroupFind)
39      return True
40   except KeyError:
41      return False
42
43def verifyGroup(nameGroup):
44   if (searchGroup(nameGroup) == False):
45     return 1
46   elif (getNameGroup()!= nameGroup) :
47     return 2
48   else:
49     return 0
50
51def check_license():
52            ''' Notify people of license requirements '''
53       
54            print
55            print "Will all software stored in this repo be released in one of the"
56            print "following licenses?"
57            print
58            print "     http://fedoraproject.org/wiki/Licensing:Main"
59       
60            error = 1
61            while error:
62                answer = raw_input('(yes/no): ')
63                if answer.lower() == "no":
64                    print "Sorry, we only allow hosting of those licenses"
65                    sys.exit()
66                if answer.lower() == "yes":
67                    error = 0
68                else:
69                    print "'yes' or 'no' only please"
70       
71def get_group():
72            ''' Prompt for group name '''
73            error = 1
74            while error:
75                group = raw_input('group/user name: ')
76                if re.match(r'^[A-Za-z0-9_]*$', group) and group:
77                    error = 0
78                else:
79                    print "Alpha numeric only please. no spaces, _ is ok (A-Za-z0-9_)"
80            return group
81       
82def get_repo_name():
83            ''' Prompt for package name '''
84            error = 1
85            while error:
86                repo_name = raw_input('package name: ')
87                if re.match('[A-Za-z0-9_\-\%\{\}\.]*$', repo_name) and repo_name:
88                    error = 0
89            return repo_name
90       
91def get_releases():
92            ''' Prompt for release name '''
93            error = 1
94            while error:
95                releases = raw_input('releases: '
96                            ).strip().split(' ')
97                for release in releases:
98                    if release not in VALID_RELEASES:
99                        print "%s is not a valid release" % release
100                        print "Please pick one of %s" % " ".join(VALID_RELEASES)
101                        break
102                else:
103                    error = 0
104            return releases
105       
106def get_description():
107            ''' Prompt for releases '''
108            error = 1
109            while error:
110                description = raw_input('Description: ')
111                if len(description) <= 80:
112                    error = 0
113                else:
114                    print "Less then 80 characters please"
115            return description
116       
117def create_repo_dirs(group, repo_name, releases):
118            ''' Make directories for new repos '''
119       
120            error = 0
121       
122            for release in releases:
123                for arch in DEFAULT_ARCHS:
124                    print " Creating %s/%s/%s/%s/%s" % (REPO_BASE_URL, group, repo_name,
125                                                            release, arch)
126                    try:
127                        os.makedirs("%s/%s/%s/%s/%s" % (BASE_DIR, group, repo_name,
128                                                            release, arch))
129                    except OSError, error:
130                        print "     Could not create %s - %s" % (release, error.strerror)
131                        error = 1
132       
133            if error:
134                print "Some repos could not be created.  They means your new repos may"
135                print "not work."
136       
137def create_repo_files(group, repo_name, releases, description):
138            ''' Create repo files '''
139            for release in releases:
140                for repo_type in ['fedora', 'epel']:
141                    if release.startswith(repo_type):
142                        file_name = "%s/%s/%s/%s-%s.repo" % (BASE_DIR, group,
143                                                        repo_name, repo_type, repo_name)
144                        print "creating %s repo" % repo_type
145                        try:
146                            file = open(file_name, "w")
147                        except IOError, error:
148                            print "     Could not create %s - %s" % (file_name,
149                                                                error.strerror)
150                        file.write('''# Place this file in your /etc/yum.repos.d/ directory
151       
152        [%(repo_type)s-%(repo_name)s]
153        name=%(description)s
154        baseurl=%(repo_base_url)s/%(group)s/%(repo_name)s/%(repo_type)s-$releasever/$basearch/
155        enabled=1
156        skip_if_unavailable=1
157        gpgcheck=0
158       
159        [%(repo_type)s-%(repo_name)s-source]
160        name=%(description)s - Source
161        baseurl=%(repo_base_url)s/%(group)s/%(repo_name)s/%(repo_type)s-$releasever/SRPMS
162        enabled=0
163        skip_if_unavailable=1
164        gpgcheck=0
165        ''' % { 'repo_name' : repo_name,
166                'repo_type' : repo_type,
167                'description' : description,
168                'group' : group,
169                'repo_base_url': REPO_BASE_URL })
170                file.close()
171if __name__ == '__main__':
172            print
173            print
174            print "This script will help you create a new repo at "
175            print "%s/group/packagename/release/arch/" % REPO_BASE_URL
176            print "Before you continue.  Make sure you have the following information"
177            print "     Group/user/team name - Owner of repo"
178            print "     package name - name of the package"
179            print "     Releases - Which releases will be built"
180            print "     Brief description - Of the repo."
181            print "     License - Know the license of all software to be stored here"
182            print
183           
184            check_license()
185       
186            print
187            print "Please list the name of the group, username or team that will be "
188            print "maintaining this repository.  Alpha numeric only"
189            print
190       
191            GROUP = get_group()
192           
193            result=verifyGroup(GROUP)
194            if (result==1):
195                print "The group does not exist"
196            elif (result==2):
197                print "You are not owner of the group"
198            else:
199
200                    print 
201                    print "Thanks, working from:"
202                    print "     %s/%s/" % (REPO_BASE_URL, GROUP)
203                    print
204                    print "Next, we need the name of the repo for example 'chromium' or 'firefox'"
205                    print
206       
207                    repo_name = get_repo_name()
208       
209                    print
210                    print "Thanks, working from:"
211                    print "     %s/%s/%s/" % (REPO_BASE_URL, GROUP, repo_name)
212                    print
213                    print "Next we need to know what Fedora release this repo is for"
214                    print "Please enter or more of the following separated by space:"
215                    print "     %s" % " ".join(VALID_RELEASES)
216                    print
217       
218                    RELEASES = get_releases()
219       
220                    print 
221                    print "Thanks, working from:"
222                    print "     %s/%s/%s/[%s]" % (REPO_BASE_URL, GROUP, repo_name,
223                                                                        ",".join(RELEASES))
224                    print "Please give a brief (80 characters or less) description."
225                    print
226       
227                    DESCRIPTION = get_description()
228       
229                    print
230                    print "Creating repo directory structure"
231                    print
232               
233                    create_repo_dirs(GROUP, repo_name, RELEASES)
234       
235                    print
236                    print "creating repo files"
237                    print
238       
239                    create_repo_files(GROUP, repo_name, RELEASES, DESCRIPTION)
240       
241                    print
242                    print "DONE!  You can now upload your repo"
243                    print "Use the following paths as your REPO_PATH: "
244                    for release in RELEASES:
245                        print "     %s/%s/%s/%s" % (BASE_DIR, GROUP, repo_name, release)