root / trunk / twisted / scripts / tap2rpm.py

Revision 15092, 7.4 kB (checked in by exarkun, 4 years ago)

Remove unused imports; fix NameErrors?

Notes: twisted.runner.inetdtap.py is a mess
Notes: old cred really needs to go
Notes: lore is a mess
Notes: more notes later

  • Property svn:executable set to *
Line 
1 #  based off the tap2deb.py file
2 #  tap2rpm.py built by Sean Reifschneider, <jafo@tummy.com>
3
4 #  TODO: need to implement log-file rotation
5
6 import sys, os, shutil, time, glob
7
8 from twisted.python import usage
9 from twisted.scripts import tap2deb
10
11
12 #################################
13 #  data that goes in /etc/inittab
14 initFileData = '''\
15 #!/bin/sh
16 #
17 #  Startup script for a Twisted service.
18 #
19 #  chkconfig: - 85 15
20 #  description: Start-up script for the Twisted service "%(tap_file)s".
21
22 PATH=/usr/bin:/bin:/usr/sbin:/sbin
23
24 pidfile=/var/run/%(rpm_file)s.pid
25 rundir=/var/lib/twisted-taps/%(rpm_file)s/
26 file=/etc/twisted-taps/%(tap_file)s
27 logfile=/var/log/%(rpm_file)s.log
28
29 #  load init function library
30 . /etc/init.d/functions
31
32 [ -r /etc/default/%(rpm_file)s ] && . /etc/default/%(rpm_file)s
33
34 #  check for required files
35 if [ ! -x /usr/bin/twistd ]
36 then
37         echo "$0: Aborting, no /usr/bin/twistd found"
38         exit 0
39 fi
40 if [ ! -r "$file" ]
41 then
42         echo "$0: Aborting, no file $file found."
43         exit 0
44 fi
45
46 #  set up run directory if necessary
47 if [ ! -d "${rundir}" ]
48 then
49         mkdir -p "${rundir}"
50 fi
51
52
53 case "$1" in
54         start)
55                 echo -n "Starting %(rpm_file)s: twistd"
56                 daemon twistd  \\
57                                 --pidfile=$pidfile \\
58                                 --rundir=$rundir \\
59                                 --%(twistd_option)s=$file \\
60                                 --logfile=$logfile
61                 status %(rpm_file)s
62                 ;;
63
64         stop)
65                 echo -n "Stopping %(rpm_file)s: twistd"
66                 kill `cat "${pidfile}"`
67                 status %(rpm_file)s
68                 ;;
69
70         restart)
71                 "${0}" stop
72                 "${0}" start
73                 ;;
74
75     *)
76                 echo "Usage: ${0} {start|stop|restart|}" >&2
77                 exit 1
78                 ;;
79 esac
80
81 exit 0
82 '''
83
84 #######################################
85 #  the data for creating the spec file
86 specFileData = '''\
87 Summary:    %(description)s
88 Name:       %(rpm_file)s
89 Version:    %(version)s
90 Release:    1
91 Copyright:  Unknown
92 Group:      Networking/Daemons
93 Source:     %(tarfile_basename)s
94 BuildRoot:  /var/tmp/%%{name}-%%{version}-root
95 Requires:   /usr/bin/twistd
96 BuildArch:  noarch
97
98 %%description
99 %(long_description)s
100
101 %%prep
102 %%setup
103 %%build
104
105 %%install
106 [ ! -z "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != '/' ] \
107                 && rm -rf "$RPM_BUILD_ROOT"
108 mkdir -p "$RPM_BUILD_ROOT"/etc/twisted-taps
109 mkdir -p "$RPM_BUILD_ROOT"/etc/init.d
110 mkdir -p "$RPM_BUILD_ROOT"/var/lib/twisted-taps
111 cp "%(tap_file)s" "$RPM_BUILD_ROOT"/etc/twisted-taps/
112 cp "%(rpm_file)s.init" "$RPM_BUILD_ROOT"/etc/init.d/"%(rpm_file)s"
113
114 %%clean
115 [ ! -z "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != '/' ] \
116                 && rm -rf "$RPM_BUILD_ROOT"
117
118 %%post
119 /sbin/chkconfig --add %(rpm_file)s
120 /sbin/chkconfig --level 35 %(rpm_file)s
121 /etc/init.d/%(rpm_file)s start
122
123 %%preun
124 /etc/init.d/%(rpm_file)s stop
125 /sbin/chkconfig --del %(rpm_file)s
126
127 %%files
128 %%defattr(-,root,root)
129 %%attr(0755,root,root) /etc/init.d/%(rpm_file)s
130 %%attr(0660,root,root) /etc/twisted-taps/%(tap_file)s
131
132 %%changelog
133 * %(date)s %(maintainer)s
134 - Created by tap2rpm: %(rpm_file)s (%(version)s)
135 '''
136
137 ###############################
138 class MyOptions(usage.Options):
139     optFlags = [["unsigned", "u"]]
140     optParameters = [
141                      ["tapfile", "t", "twistd.tap"],
142                      ["maintainer", "m", ""],
143                      ["protocol", "p", ""],
144                      ["description", "e", ""],
145                      ["long_description", "l", ""],
146                      ["set-version", "V", "1.0"],
147                      ["rpmfile", "r", None],
148                      ["type", "y", "tap", "type of configuration: 'tap', 'xml, "
149                       "'source' or 'python'"],
150                     ]
151
152     #zsh_altArgDescr = {"foo":"use this description for foo instead"}
153     #zsh_multiUse = ["foo", "bar"]
154     #zsh_mutuallyExclusive = [("foo", "bar"), ("bar", "baz")]
155     zsh_actions = {"type":"(tap xml source python)",
156                    "rpmfile":'_files -g "*.rpm"'}
157     #zsh_actionDescr = {"logfile":"log file name", "random":"random seed"}
158
159
160 type_dict = {
161     'tap': 'file',
162     'python': 'python',
163     'source': 'source',
164     'xml': 'xml',
165 }
166
167
168 ##########################
169 def makeBuildDir(baseDir):
170     '''Set up the temporary directory for building RPMs.
171     Returns: Tuple: ( buildDir, rpmrcFile )
172     '''
173     import random, string
174
175     #  make top directory
176     oldMask = os.umask(0077)
177     while 1:
178         tmpDir = os.path.join(baseDir, 'tap2rpm-%s-%s' % ( os.getpid(),
179                                         random.randint(0, 999999999) ))
180         if not os.path.exists(tmpDir):
181             os.makedirs(tmpDir)
182             break
183     os.umask(oldMask)
184
185     #  set up initial directory contents
186     os.makedirs(os.path.join(tmpDir, 'RPMS', 'noarch'))
187     os.makedirs(os.path.join(tmpDir, 'SPECS'))
188     os.makedirs(os.path.join(tmpDir, 'BUILD'))
189     os.makedirs(os.path.join(tmpDir, 'SOURCES'))
190     os.makedirs(os.path.join(tmpDir, 'SRPMS'))
191
192     #  set up rpmmacros file
193     macroFile = os.path.join(tmpDir, 'rpmmacros')
194     rcFile = os.path.join(tmpDir, 'rpmrc')
195     rpmrcData = open('/usr/lib/rpm/rpmrc', 'r').read()
196     rpmrcData = string.replace(rpmrcData, '~/.rpmmacros', macroFile)
197     fp = open(macroFile, 'w')
198     fp.write('%%_topdir %s\n' % tmpDir)
199     fp.close()
200
201     #  set up the rpmrc file
202     fp = open(rcFile, 'w')
203     fp.write(rpmrcData)
204     fp.close()
205
206     return(( tmpDir, rcFile ))
207
208
209 ##########
210 def run():
211     #  parse options
212     try:
213         config = MyOptions()
214         config.parseOptions()
215     except usage.error, ue:
216          sys.exit("%s: %s" % (sys.argv[0], ue))
217
218     #  set up some useful local variables
219     tap_file = config['tapfile']
220     base_tap_file = os.path.basename(config['tapfile'])
221     protocol = (config['protocol'] or os.path.splitext(base_tap_file)[0])
222     rpm_file = config['rpmfile'] or 'twisted-'+protocol
223     version = config['set-version']
224     maintainer = config['maintainer']
225     description = config['description'] or ('A TCP server for %(protocol)s' %
226                                             vars())
227     long_description = (config['long_description']
228                         or 'Automatically created by tap2deb')
229     twistd_option = type_dict[config['type']]
230     date = time.strftime('%a %b %d %Y', time.localtime(time.time()))
231     directory = rpm_file + '-' + version
232     python_version = '%s.%s' % sys.version_info[:2]
233
234     #  set up a blank maintainer if not present
235     if not maintainer:
236         maintainer = 'tap2rpm'
237
238     #  create source archive directory
239     tmp_dir, rpmrc_file = makeBuildDir('/var/tmp')
240     source_dir = os.path.join(tmp_dir, directory)
241     os.makedirs(source_dir)
242
243     #  populate source directory
244     tarfile_name = source_dir + '.tar.gz'
245     tarfile_basename = os.path.basename(tarfile_name)
246     tap2deb.save_to_file(os.path.join(source_dir, '%s.spec' % rpm_file),
247                                       specFileData % vars())
248     tap2deb.save_to_file(os.path.join(source_dir, '%s.init' % rpm_file),
249                                       initFileData % vars())
250     shutil.copy(tap_file, source_dir)
251
252     #  create source tar
253     os.system('cd "%(tmp_dir)s"; tar cfz "%(tarfile_name)s" "%(directory)s"'
254               % vars())
255    
256     #  build rpm
257     print 'Starting build...'
258     print '=' * 70
259     sys.stdout.flush()
260     os.system('rpmbuild -ta --rcfile "%s" %s' % ( rpmrc_file, tarfile_name ))
261     print 'Done with build...'
262     print '=' * 70
263    
264     #  copy the RPMs to the local directory
265     rpm_path = glob.glob(os.path.join(tmp_dir, 'RPMS', 'noarch', '*'))[0]
266     srpm_path = glob.glob(os.path.join(tmp_dir, 'SRPMS', '*'))[0]
267     print 'Writing "%s"...' % os.path.basename(rpm_path)
268     shutil.copy(rpm_path, '.')
269     print 'Writing "%s"...' % os.path.basename(srpm_path)
270     shutil.copy(srpm_path, '.')
271    
272     #  remove the build directory
273     shutil.rmtree(tmp_dir)
Note: See TracBrowser for help on using the browser.