/[smeserver]/rpms/qpsmtpd/sme8/qpsmtpd.spec
ViewVC logotype

Contents of /rpms/qpsmtpd/sme8/qpsmtpd.spec

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.36 - (show annotations) (download)
Sun Jun 30 22:14:52 2013 UTC (11 years, 4 months ago) by wellsi
Branch: MAIN
CVS Tags: qpsmtpd-0_84-6_el5_sme
Changes since 1.35: +7 -2 lines
* Sat Jun 29 2013 Ian Wells <esmith@wellsi.com> 0.84-6.sme
- Accept messages with no body and no trailing \n after headers [SME: 6870]

1 # $Id: qpsmtpd.spec,v 1.35 2013/04/30 02:36:21 wellsi Exp $
2
3 Name: qpsmtpd
4 Version: 0.84
5 Release: 6%{?dist}
6 Summary: qpsmtpd + qpsmtpd-apache + qpsmtpd-async
7 License: MIT
8 Group: System Environment/Daemons
9 URL: http://smtpd.develooper.com/
10 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
11 BuildRequires: perl >= 0:5.00503
12 BuildArch: noarch
13 Requires: perl(Mail::Header), perl(Net::DNS) perl(Net::IP)
14 Requires(pre): coreutils, shadow-utils, perl
15
16 Source0: %{name}-%{version}.tar.gz
17 Source1: qpsmtpd-forkserver.rc
18 Source2: qpsmtpd-forkserver.sysconfig
19 Source3: qpsmtpd-plugin-file_connection
20 Source4: qpsmtpd-xinetd
21 Source5: in.qpsmtpd
22 Source6: qpsmtpd.conf
23 Source7: README.selinux
24
25 Patch1: 0001-Misc-documentation-updates.patch
26 Patch2: 0002-added-ClamAV-version-to-the-X-Virus-Checked-header.patch
27 Patch3: 0003-new-plugin-check_bogus_bounce.patch
28 Patch4: 0004-microoptimizations-replace-regex-with-lc-eq.patch
29 Patch5: 0005-remove-vestiges-of-a-bygone-RCS.patch
30 Patch6: 0006-added-definedness-test-to-local_port-as-it-was-emitt.patch
31 Patch7: 0007-Add-guidelines-for-commit-messages.patch
32 Patch8: 0008-added-auth_checkpassword-plugin.patch
33 Patch9: 0009-updates-to-auth_vpopmail_sql-module.patch
34 Patch10: 0010-new-plugin-auth_vpopmaild.patch
35 Patch11: 0011-start-working-on-Changes-file-for-0.84-next.patch
36 Patch12: 0012-fix-copy-paste-error-in-auth_flat_file.patch
37 Patch13: 0013-added-auth_vpopmail-plugin.patch
38 Patch14: 0014-rewrote-sender_permitted_from.patch
39 Patch15: 0015-add-TCPLOCAL-variables-to-qp-connection.patch
40 Patch16: 0016-added-local_ip-option-to-p0f-plugin.patch
41 Patch17: 0017-added-p0f-support-to-greylist-plugin.patch
42 Patch18: 0018-packaging-updates.patch
43 Patch19: 0019-Check-for-the-exact-string-resonses-from-vpopmaild-r.patch
44 Patch20: 0020-new-plugin-check_badmailfrom_patterns.patch
45 Patch21: 0021-ignore-search-path-in-DNS-lookups.patch
46 Patch22: 0022-don-t-create-homedir-in-RPM.patch
47 Patch23: 0023-corrected-email-address.patch
48 Patch24: 0024-increased-default-TLS-security-setting.patch
49 Patch25: 0025-give-badrcptto-a-reasonable-name.patch
50 Patch26: 0026-add-test-name-to-test-output.patch
51 Patch27: 0027-renamed-test-from-foo-to-rcpt_ok.patch
52 Patch28: 0028-Shorten-clarify-Connection-and-Transaction-notes.patch
53 Patch29: 0029-Run-hook_reset_transaction-after-all-connections.patch
54 Patch30: 0030-Add-support-for-multiple-postfix-cleanup-sockets.patch
55 Patch31: 0031-Adds-the-ability-to-have-multiple-instances-each-wit.patch
56 Patch32: 0032-I-forgot-to-sync-the-code-that-calls-the-original-co.patch
57 Patch33: 0033-new-plugin-rcpt_map.patch
58 Patch34: 0034-plugins-rcpt_map-cleanup.patch
59 Patch35: 0035-Fix-for-plugins-returning-DONE-from-HELO-EHLO.patch
60 Patch36: 0036-prefork-use-new-instance-instead-of-cloning.patch
61 Patch37: 0037-Revert-Spool-body-when-transaction-body_fh-is-called.patch
62 Patch38: 0038-Patch-FATAL-PLUGIN-ERROR-check_basicheaders.patch
63 Patch39: 0039-qpsmtpd-0.84-spamassassin_size_limit.patch
64 Patch40: 0040-qpsmtpd-forkserver_fix_Net_DNS_update_breaks_qpsmtpd.patch
65
66 Patch100: qpsmtpd-0.40-badrcptto_allowrelay.patch
67 Patch101: qpsmtpd-0.83-peer_hooks.patch
68 Patch102: qpsmtpd-0.83-loginit.patch
69 Patch103: qpsmtpd-forkserver-keepalive.patch
70 Patch104: qpsmtpd-0.84-accept-empty-email.patch
71
72 %description
73 qpsmtpd is a flexible smtpd daemon written in Perl. Apart from the core
74 SMTP features, all functionality is implemented in small "extension
75 plugins" using the easy to use object oriented plugin API.
76
77 qpsmtpd was originally written as a drop-in qmail-smtpd replacement, but
78 now it also includes a smtp forward and a postfix "backend".
79
80 %package apache
81 Requires: perl(mod_perl2)
82 Summary: mod_perl-2 connection handler for qpsmtpd
83 Group: System Environment/Daemons
84
85 %package async
86 Summary: qpsmtpd using async I/O in a single process
87 Group: System Environment/Daemons
88
89 %description apache
90
91 This module implements a mod_perl/apache 2.0 connection handler
92 that turns Apache into an SMTP server using Qpsmtpd.
93
94 %description async
95 This package contains the Qpsmtpd::PollServer module, which allows
96 qpsmtd to handle many connections in a single process and the
97 qpsmpd-async which uses it.
98
99 %prep
100 %setup -q
101 %patch1 -p1
102 %patch2 -p1
103 %patch3 -p1
104 %patch4 -p1
105 %patch5 -p1
106 %patch6 -p1
107 %patch7 -p1
108 %patch8 -p1
109 %patch9 -p1
110 %patch10 -p1
111 %patch11 -p1
112 %patch12 -p1
113 %patch13 -p1
114 %patch14 -p1
115 %patch15 -p1
116 %patch16 -p1
117 %patch17 -p1
118 %patch18 -p1
119 %patch19 -p1
120 %patch20 -p1
121 %patch21 -p1
122 #%patch22 -p1
123 %patch23 -p1
124 %patch24 -p1
125 %patch25 -p1
126 %patch26 -p1
127 %patch27 -p1
128 %patch28 -p1
129 %patch29 -p1
130 %patch30 -p1
131 %patch31 -p1
132 %patch32 -p1
133 %patch33 -p1
134 %patch34 -p1
135 %patch35 -p1
136 %patch36 -p1
137 %patch37 -p1
138 %patch38 -p1
139 %patch39 -p1
140 %patch40 -p1
141
142 %patch100 -p1
143 %patch101 -p1
144 %patch102 -p1
145 %patch103 -p0
146 %patch104 -p1
147
148 %build
149 CFLAGS="$RPM_OPT_FLAGS" perl Makefile.PL INSTALLSITELIB=%{_prefix}/lib/perl5/site_perl
150 make
151
152 %clean
153 rm -rf $RPM_BUILD_ROOT
154 %install
155
156 rm -rf $RPM_BUILD_ROOT
157 eval `perl '-V:installarchlib'`
158 mkdir -p $RPM_BUILD_ROOT/$installarchlib
159 if grep -q DESTDIR Makefile
160 then
161 make DESTDIR=$RPM_BUILD_ROOT
162 find blib/lib -name '*.pm.*' -exec rm -f {} \;
163 make DESTDIR=$RPM_BUILD_ROOT install
164
165 else
166 make PREFIX=$RPM_BUILD_ROOT/usr
167 find blib/lib -name '*.pm.*' -exec rm -f {} \;
168 make PREFIX=$RPM_BUILD_ROOT/usr install
169 fi
170 mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}
171 rm -f ${RPM_BUILD_ROOT}%{_datadir}/%{name}/plugins/*.*
172 cp -r plugins ${RPM_BUILD_ROOT}%{_datadir}/%{name}/plugins
173 mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}
174 rm -f ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/*.*
175 cp -r config.sample/* ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/
176 echo %{_datadir}/%{name}/plugins > ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/plugin_dirs
177 echo %{_localstatedir}/spool/qpsmtpd > ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/spool_dir
178 echo logging/file_connection loglevel LOGINFO %{_localstatedir}/log/qpsmtpd/%Y-%m-%d > ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/logging
179 mkdir -p ${RPM_BUILD_ROOT}%{_initrddir}
180 cp %{SOURCE1} ${RPM_BUILD_ROOT}%{_initrddir}/qpsmtpd-forkserver
181 mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig
182 cp %{SOURCE2} ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/qpsmtpd-forkserver
183 cp %{SOURCE3} ${RPM_BUILD_ROOT}%{_datadir}/%{name}/plugins/logging/file_connection
184 mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/spool/qpsmtpd
185 mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/qpsmtpd
186 mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/xinetd.d
187 cp %{SOURCE4} ${RPM_BUILD_ROOT}%{_sysconfdir}/xinetd.d/smtp
188 mkdir -p ${RPM_BUILD_ROOT}%{_sbindir}
189 cp %{SOURCE5} ${RPM_BUILD_ROOT}%{_sbindir}/in.smtp
190 mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/httpd/conf.d
191 cp %{SOURCE6} ${RPM_BUILD_ROOT}%{_sysconfdir}/httpd/conf.d
192 mkdir -p $RPM_BUILD_ROOT%{_docdir}/%{name}-apache-%{version}
193 cp %{SOURCE7} $RPM_BUILD_ROOT%{_docdir}/%{name}-apache-%{version}
194
195 [ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress
196
197 find ${RPM_BUILD_ROOT}%{_prefix} \( -name perllocal.pod -o -name .packlist \) -exec rm {} \;
198 find ${RPM_BUILD_ROOT}%{_prefix} -type f -print | \
199 sed "s@^$RPM_BUILD_ROOT@@g" | \
200 grep -v [Aa]sync | \
201 grep -v packaging | \
202 grep -v README.selinux | \
203 grep -v /Apache | \
204 grep -v /Danga | \
205 grep -v Qpsmtpd/ConfigServer.pm | \
206 grep -v Qpsmtpd/PollServer.pm > %{name}-%{version}-%{release}-filelist
207 if [ "$(cat %{name}-%{version}-%{release}-filelist)X" = "X" ] ; then
208 echo "ERROR: EMPTY FILE LIST"
209 exit -1
210 fi
211
212 %files -f %{name}-%{version}-%{release}-filelist
213 %defattr(-,root,root)
214 %doc CREDITS Changes LICENSE README README.plugins STATUS
215 %{_initrddir}/qpsmtpd-forkserver
216 %config(noreplace) %{_sysconfdir}/qpsmtpd/*
217 %config(noreplace) %{_sysconfdir}/xinetd.d/smtp
218 %config(noreplace) %{_sysconfdir}/sysconfig/qpsmtpd-forkserver
219
220 %files apache
221 %defattr(-,root,root)
222 %{_prefix}/lib/perl5/site_perl/Apache/Qpsmtpd.pm
223 %{_mandir}/man3/Apache::Qpsmtpd.3pm.gz
224 %config(noreplace) %{_sysconfdir}/httpd/conf.d/*
225 %doc %{_docdir}/%{name}-apache-%{version}/README.selinux
226
227 %files async
228 %defattr(-,root,root)
229 %{_bindir}/qpsmtpd-async
230 %{_prefix}/lib/perl5/site_perl/Danga/Client.pm
231 %{_prefix}/lib/perl5/site_perl/Danga/TimeoutSocket.pm
232 %{_prefix}/lib/perl5/site_perl/Qpsmtpd/ConfigServer.pm
233 %{_prefix}/lib/perl5/site_perl/Qpsmtpd/Plugin/Async/DNSBLBase.pm
234 %{_prefix}/lib/perl5/site_perl/Qpsmtpd/PollServer.pm
235 %{_mandir}/man1/qpsmtpd-async.1.gz
236 %{_datadir}/%{name}/plugins/async/*
237
238 %pre
239
240 %changelog
241 * Sat Jun 29 2013 Ian Wells <esmith@wellsi.com> 0.84-6.sme
242 - Accept messages with no body and no trailing \n after headers [SME: 6870]
243
244 * Thu Apr 25 2013 chris burnat <devlist@burnat.com> 0.84-5.sme
245 - Fix Net::DNS update breaks qpsmtpd, codes suggested by Ian [SME: 7194]
246
247 * Tue Apr 23 2013 chris burnat <devlist@burnat.com> 0.84-4.sme
248 - qpsmtpd allows the spamassassin plugin to read the size limit
249 from its arguments, patch by Daniel [SME: 7541]
250
251 * Fri May 04 2012 Charlie Brady <charlie_brady@mitel.com> 0.84-3.sme
252 - Set SO_KEEPALIVE option on client socket - to detect dead
253 connections. [SME: 6924]
254
255 * Sun Nov 14 2010 <slords@mail.com> 0.84-2.sme
256 - Sync with upstream git repo.
257 - Fix require_resolvable_fromhost doesn't work [SME: 6369]
258 - Fix TLS security defaults [SME: 6241]
259 - Fix fatal errors when mail has no headers [SME: 6345]
260
261 * Wed Apr 14 2010 <slords@mail.com> 0.84-0.1.sme
262 - Update to 0.84
263 - add sme specific patches
264
265 * Wed Mar 3 2010 <filippo.carletti@gmail.com> 0.83-0.7.sme
266 - Remove spool and log dir from package (in smeserver-qpsmtpd)
267 - Don't create smtpd user (unused in sme) [SME: 5815]
268
269 * Thu Nov 5 2009 <smeserver-contribs@snetram.nl> 0.83-0.6.sme
270 - Apply qpsmtpd git changesets to implement custom SPAM
271 subject prefix [SME: 5031]
272
273 * Tue Nov 3 2009 <slords@mail.com> 0.83-0.5.sme
274 - Update pre requires so scripts don't fail on install [SME: 5558]
275
276 * Sat Oct 31 2009 <slords@mail.com> 0.83-0.4.sme
277 - Rebase bad_rcptto patch to remove orig file [SME: 5548]
278 - Change logging in tls init to prevent warnings [SME: 5551]
279
280 * Thu Oct 29 2009 <slords@mail.com> 0.83-0.3.sme
281 - Only run/initialize plugins once [SME: 5533]
282
283 * Mon Oct 26 2009 <filippo.carletti@gmail.com> 0.83-0.2.sme
284 - Change spool dir permissions and owner to qpsmtpd:clamav
285 - Change log dir permissions and owner to smelog:smelog
286
287 * Tue Sep 22 2009 <filippo.carletti@gmail.com> 0.83-0.1.sme
288 - add sme specific patches
289
290 * Fri Sep 18 2009 <rpmbuild@robinbowes.com> 0.83-0.1
291 - Update to 0.83
292
293 * Sun Jul 12 2009 <rpmbuild@robinbowes.com> 0.82-0.1
294 - Update to latest release
295 - don't add qpsmtpd to start-up by default
296 - add apache config file to qpsmtpd-apache package
297 - remove all patches
298 - use rpm macros for dirs
299 - use a filelist for main package instead of a long list of files
300
301 * Tue Jul 15 2008 <rpmbuild@robinbowes.com> 0.43-0.7
302 - Removed SelectServer.pm from .spec file
303
304 * Tue Mar 18 2008 <rpmbuild@robinbowes.com> 0.43-0.6
305 - moved config files back to /etc/qpsmtpd following some changes
306 to the qpsmtpd src
307
308 * Tue Mar 18 2008 <rpmbuild@robinbowes.com> 0.43-0.5
309 - moved config files to /etc/qpsmtpd/config
310
311 * Tue Mar 18 2008 <rpmbuild@robinbowes.com> 0.43-0.4
312 - Moved qpsmtpd-async to /usr/bin
313 - Added qpsmtpd-async man page to async package
314 - Added async smtproute plugin to async package
315
316 * Wed Mar 12 2008 <rpmbuild@robinbowes.com> 0.43-0.3
317 - Makefile.PL now updated in svn, so remove hack
318
319 * Wed Mar 12 2008 <rpmbuild@robinbowes.com> 0.43-0.2
320 - Added qpsmtpd-prefork to qpsmtpd RPM, inc. hack to work round
321 deficiency in Makefile.PL
322
323 * Mon Mar 10 2008 <rpmbuild@robinbowes.com> 0.43-0.1
324 - Updated to work with Makefile to build from svn
325
326 * Wed Sep 12 2007 <rpmbuild@robinbowes.com> 0.40-2.0
327 - Updated to build trunk-r790
328
329 * Tue Jun 12 2007 <hjp@hjp.at> 0.40-1.0
330 - updated to 0.40 - no code change.
331
332 * Thu Jun 07 2007 <hjp@hjp.at> 0.40-0.2
333 - unset environment variables which are normally tainted in perl.
334 - updated to 0.40rc1
335 - added dependency on Net::IP (needed by some plugins)
336
337 * Sat May 05 2007 <hjp@hjp.at> 0.33-0.5
338 - moved environment cleanup into start() function, otherwise
339 LANG just gets reinitialized.
340
341 * Sat May 05 2007 <hjp@hjp.at> 0.33-0.4
342 - split qpsmtpd-async into a separate package to avoid dependency
343 on ParaDNS.
344
345 * Sat May 05 2007 <hjp@hjp.at> 0.33-0.3
346 - also unset LANG, LC_ALL and LC_TIME in startup script to prevent
347 locale specific Received headers (bug reported by Dominik Meyer)
348
349 * Sun Feb 25 2007 <hjp@hjp.at> 0.33-0.2
350 - 0.3x branch has been merged back to trunk.
351 Got current snapshot (r715) from trunk.
352
353 * Sun Feb 25 2007 <hjp@hjp.at> 0.33-0.1
354 - Start forkserver via "daemon" (Gavin Carr)
355 - Fixed 'service qpsmtpd-forkserver status' (Gavin Carr)
356 - Changed policy for config files to noreplace (Gavin Carr)
357
358 * Sun Nov 05 2006 <hjp@hjp.at> 0.33-0.0
359 - Upgraded to current snapshot from 0.3x branch (which should become
360 0.33 soon-ish)
361 - included xinetd-support again.
362
363 * Sat Mar 18 2006 <hjp@hjp.at> 0.32-2
364 - fix dnsbl to check whether answer fits query.
365 - randomize Net::DNS ids for qpsmtpd-forkserver child processes.
366
367 * Wed Mar 08 2006 <hjp@hjp.at> 0.32-1
368 - New upstream 0.32
369 - rc-file unsets PERL_UNICODE (bug #38397)
370
371 * Sat Jan 28 2006 <hjp@hjp.at> 0.31.1-3
372 - Use ${SOURCE*} macros to refer to source files
373 - Avoid invoking rpm and other cleanup in %pre section
374 - Invoke chkconfig in %post.
375 - (Thanks to Josko Plazonic for the reporting these problems and
376 suggesting fixes)
377
378 * Tue Nov 30 2005 <hjp@hjp.at> 0.31.1-2
379 - Revision 170 of plugins/loggin/file_connection:
380 Return DECLINED from open_log.
381 Open log in write_log if it isn't already open.
382
383 * Tue Nov 29 2005 <hjp@hjp.at> 0.31.1-1
384 - Commented out queue plugins from sample config
385 - Added dependencies
386 - Create smtpd user if it doesn't exist
387 - Added /var/log/qpsmtpd and /var/spool/qpsmtpd
388
389 * Sat Nov 26 2005 <hjp@hjp.at>
390 - Added file_connection plugin
391 - Startup file for qpsmtpd-forkserver now uses --detach and assumes that
392 a suitable logging module is configured (file_connection by default)
393
394 * Wed Nov 23 2005 <hjp@hjp.at>
395 - Forkserver drops privileges before loading plugins now.
396
397 * Sun Nov 20 2005 <hjp@hjp.at>
398 - New upstream 0.31.1
399
400 * Mon Nov 14 2005 <hjp@hjp.at> 0.31-8
401 - New upstream 0.31rc3.
402 - pre-connection patch slightly simplified since upstream fixed one of
403 the bugs.
404
405 * Tue Aug 23 2005 <hjp@hjp.at>
406 - forced INSTALLSITELIB=/usr/lib/perl5/site_perl as suggested by
407 Charlie Brady.
408
409 * Sat Aug 20 2005 <hjp@hjp.at> 0.31-7
410 - RC2 from upstream.
411 - Removed patches which aren't applied from spec file.
412
413 * Fri Jul 22 2005 <hjp@hjp.at> 0.31-6
414 - New upstream snapshot from 0.31 branch: svn revision 509.
415
416 * Sun Jul 17 2005 <hjp@hjp.at> 0.31-5
417 - include only /etc/init.d/qpsmtpd-forkserver, not /etc/init.d
418 it conflicts with old initscripts packages.
419
420 * Sun Jul 17 2005 <hjp@hjp.at> 0.31-4
421 - removed tabs from forkserver
422
423 * Sun Jul 17 2005 <hjp@hjp.at> 0.31-3
424 - added startup script for forkserver
425 - changed BuildArchitectures to noarch.
426
427 * Sat Jul 16 2005 <hjp@hjp.at> 0.31-2
428 - pre-connection hook is now actually called, not just defined.
429
430 * Fri Jul 15 2005 <hjp@hjp.at> 0.31-1
431 - merged with 0.31. Most of my patches are now in the official release.
432 - merged Gavin's per-user-config patch with my dirs patch, since the
433 latter needs a way to turn off logging.
434 - added /etc/qpsmtpd/plugin_dir to package.
435
436 * Mon Jun 13 2005 <hjp@hjp.at> 0.29-6
437 - fixed removal of patch backup files
438 - fixed option --pid-file
439
440 * Sun Jun 12 2005 <hjp@hjp.at>
441 - avoid installing patch backup files
442 - split Apache::Qpsmtpd into separate package to avoid dependency hell.
443 - fixed URL
444 - changed group to Daemons.
445 - Fixed installation for newer versions of ExtUtils::MakeMaker
446
447 * Wed Jun 1 2005 <hjp@hjp.at> 0.29-5
448 - Really don't reap children in signal handler.
449
450 * Tue May 31 2005 <hjp@hjp.at> 0.29-4
451 - Return 421 for DENYSOFT_DISCONNECT
452 - Don't reap children in signal handler.
453
454 * Thu May 19 2005 <hjp@hjp.at> 0.29-3
455 - removed code to accept paths without <>.
456
457 * Thu May 19 2005 <hjp@hjp.at> 0.29-2
458 - added QPSMTPD_CONFIG env variable and plugin_dir config.
459 - added supplemental groups and support for pid file
460 - added shared_connect hook
461 - changed log level for SMTP dialog from DEBUG to INFO
462
463 * Thu Apr 21 2005 hjp@hjp.at
464 - added plugins, /etc and docs.
465
466 * Mon Apr 18 2005 hjp@hjp.at
467 - Specfile autogenerated
468

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed