From 945721f48f74d5cfffef7c7cf3a3d6bc2521f5dd Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 15 Jul 2003 13:16:32 +0000 Subject: [PATCH] import of rt 3.0.4 --- rt/Changelog | 1286 ++++ rt/HOWTO/README | 14 + rt/HOWTO/change.txt | 67 + rt/HOWTO/release.txt | 124 + rt/HOWTO/version-control.txt | 41 + rt/Makefile | 517 +- rt/Makefile.in | 485 ++ rt/README | 402 +- rt/aclocal.m4 | 158 + rt/autom4te.cache/output.0 | 2747 +++++++++ rt/autom4te.cache/requests | 94 + rt/autom4te.cache/traces.0 | 156 + rt/bin/mason_handler.fcgi | 255 +- rt/bin/mason_handler.fcgi.in | 54 + rt/bin/mason_handler.scgi | 218 +- rt/bin/mason_handler.scgi.in | 41 + rt/bin/mason_handler.svc | 234 + rt/bin/mason_handler.svc.in | 234 + rt/bin/rt-commit-handler | 846 +++ rt/bin/rt-commit-handler.in | 846 +++ rt/bin/rt-crontool | 210 + rt/bin/rt-crontool.in | 210 + rt/bin/rt-mailgate | 842 ++- rt/bin/rt-mailgate.in | 587 ++ rt/bin/webmux.pl | 248 +- rt/bin/webmux.pl.in | 125 + rt/config | 256 + rt/config.layout | 83 + rt/config.log | 117 + rt/config.pld | 19 + rt/config.status | 711 +++ rt/configure | 2747 +++++++++ rt/configure.ac | 209 + rt/docs/design_docs/acls | 228 +- rt/docs/design_docs/approval_notices | 8 + rt/docs/design_docs/approval_template | 25 + rt/docs/design_docs/cf_search | 72 + rt/docs/design_docs/cli_spec | 361 +- rt/docs/design_docs/delegation | 115 + rt/docs/design_docs/evil_plans | 9 +- rt/docs/design_docs/groups_notes | 88 + .../recursive_group_membership_algorithm | 109 + rt/docs/design_docs/rql_parser_machine.graphviz | 32 + rt/docs/design_docs/string-extraction-guide.txt | 100 + rt/docs/design_docs/ticket_templates | 16 + rt/etc/RT_Config.pm | 349 ++ rt/etc/RT_Config.pm.in | 349 ++ rt/etc/RT_SiteConfig.pm | 1 + rt/etc/acl.Oracle | 19 +- rt/etc/acl.Pg | 96 +- rt/etc/acl.mysql | 12 +- rt/etc/constraints.mysql | 52 + rt/etc/initialdata | 569 ++ rt/etc/schema.Pg | 747 ++- rt/etc/schema.SQLite | 384 ++ rt/etc/schema.mysql | 429 +- rt/etc/upgrade/2.1.71 | 211 + rt/html/Admin/Elements/AddCustomFieldValue | 44 + rt/html/Admin/Elements/CreateUserCalled | 26 + rt/html/Admin/Elements/EditCustomField | 127 + rt/html/Admin/Elements/EditCustomFieldValues | 42 + rt/html/Admin/Elements/EditCustomFields | 214 + rt/html/Admin/Elements/EditQueueWatchers | 55 + rt/html/Admin/Elements/EditScrip | 149 + rt/html/Admin/Elements/EditScrips | 97 + rt/html/Admin/Elements/EditTemplates | 104 + rt/html/Admin/Elements/EditUserComments | 32 + rt/html/Admin/Elements/GroupTabs | 76 + rt/html/Admin/Elements/Header | 28 + rt/html/Admin/Elements/ListGlobalCustomFields | 37 + rt/html/Admin/Elements/ListGlobalScrips | 37 + rt/html/Admin/Elements/ModifyQueue | 78 + rt/html/Admin/Elements/ModifyTemplate | 60 + rt/html/Admin/Elements/ModifyUser | 99 + rt/html/Admin/Elements/QueueRightsForUser | 40 + rt/html/Admin/Elements/QueueTabs | 93 + rt/html/Admin/Elements/SelectCustomFieldType | 36 + rt/html/Admin/Elements/SelectGroups | 37 + rt/html/Admin/Elements/SelectModifyGroup | 33 + rt/html/Admin/Elements/SelectModifyQueue | 33 + rt/html/Admin/Elements/SelectModifyUser | 49 + rt/html/Admin/Elements/SelectNewGroupMembers | 61 + rt/html/Admin/Elements/SelectRights | 90 + rt/html/Admin/Elements/SelectScrip | 48 + rt/html/Admin/Elements/SelectScripAction | 48 + rt/html/Admin/Elements/SelectScripCondition | 48 + rt/html/Admin/Elements/SelectSingleOrMultiple | 43 + rt/html/Admin/Elements/SelectTemplate | 61 + rt/html/Admin/Elements/SelectUsers | 40 + rt/html/Admin/Elements/SystemTabs | 70 + rt/html/Admin/Elements/Tabs | 63 + rt/html/Admin/Elements/UserTabs | 74 + rt/html/Admin/Global/CustomField.html | 61 + rt/html/Admin/Global/CustomFields.html | 47 + rt/html/Admin/Global/GroupRights.html | 99 + rt/html/Admin/Global/Scrip.html | 56 + rt/html/Admin/Global/Scrips.html | 53 + rt/html/Admin/Global/Template.html | 101 + rt/html/Admin/Global/Templates.html | 53 + rt/html/Admin/Global/UserRights.html | 77 + rt/html/Admin/Global/index.html | 64 + rt/html/Admin/Groups/GroupRights.html | 95 + rt/html/Admin/Groups/Members.html | 134 + rt/html/Admin/Groups/Modify.html | 134 + rt/html/Admin/Groups/UserRights.html | 92 + rt/html/Admin/Groups/index.html | 43 + rt/html/Admin/Queues/CustomField.html | 60 + rt/html/Admin/Queues/CustomFields.html | 48 + rt/html/Admin/Queues/GroupRights.html | 110 + rt/html/Admin/Queues/Modify.html | 163 + rt/html/Admin/Queues/People.html | 186 + rt/html/Admin/Queues/Scrip.html | 67 + rt/html/Admin/Queues/Scrips.html | 63 + rt/html/Admin/Queues/Template.html | 101 + rt/html/Admin/Queues/Templates.html | 57 + rt/html/Admin/Queues/UserRights.html | 90 + rt/html/Admin/Queues/index.html | 61 + rt/html/Admin/Users/Modify.html | 347 ++ rt/html/Admin/Users/Prefs.html | 122 + rt/html/Admin/Users/index.html | 81 + rt/html/Admin/index.html | 40 + rt/html/Approvals/Display.html | 50 + rt/html/Approvals/Elements/Approve | 56 + rt/html/Approvals/Elements/PendingMyApproval | 87 + rt/html/Approvals/Elements/ShowDependency | 85 + rt/html/Approvals/Elements/Tabs | 34 + rt/html/Approvals/index.html | 66 + rt/html/Elements/BevelBoxRaisedEnd | 26 + rt/html/Elements/BevelBoxRaisedStart | 26 + rt/html/Elements/Callback | 65 + rt/html/Elements/Checkbox | 39 + rt/html/Elements/CreateTicket | 26 + rt/html/Elements/Error | 62 + rt/html/Elements/Footer | 60 + rt/html/Elements/GotoTicket | 24 + rt/html/Elements/Header | 82 + rt/html/Elements/ListActions | 43 + rt/html/Elements/Login | 101 + rt/html/Elements/Menu | 84 + rt/html/Elements/MessageBox | 47 + rt/html/Elements/MyRequests | 78 + rt/html/Elements/MyTickets | 81 + rt/html/Elements/PageLayout | 99 + rt/html/Elements/Quicksearch | 61 + rt/html/Elements/Refresh | 45 + rt/html/Elements/Section | 34 + rt/html/Elements/SelectAttachmentField | 31 + rt/html/Elements/SelectBoolean | 46 + rt/html/Elements/SelectCustomFieldOperator | 40 + rt/html/Elements/SelectCustomFieldValue | 41 + rt/html/Elements/SelectDate | 48 + rt/html/Elements/SelectDateRelation | 36 + rt/html/Elements/SelectDateType | 36 + rt/html/Elements/SelectEqualityOperator | 40 + rt/html/Elements/SelectGroups | 29 + rt/html/Elements/SelectLinkType | 37 + rt/html/Elements/SelectMatch | 53 + rt/html/Elements/SelectNewTicketQueue | 56 + rt/html/Elements/SelectOwner | 59 + rt/html/Elements/SelectQueue | 59 + rt/html/Elements/SelectResultsPerPage | 43 + rt/html/Elements/SelectSortOrder | 41 + rt/html/Elements/SelectStatus | 37 + rt/html/Elements/SelectTicketSortBy | 38 + rt/html/Elements/SelectTicketTypes | 34 + rt/html/Elements/SelectUsers | 31 + rt/html/Elements/SelectWatcherType | 44 + rt/html/Elements/SetupSessionCookie | 77 + rt/html/Elements/ShadedBox | 33 + rt/html/Elements/ShadedInputRow | 35 + rt/html/Elements/ShadedRow | 31 + rt/html/Elements/SimpleSearch | 27 + rt/html/Elements/Submit | 62 + rt/html/Elements/Tabs | 82 + rt/html/Elements/TitleBoxEnd | 31 + rt/html/Elements/TitleBoxStart | 60 + rt/html/Elements/ViewUser | 51 + rt/html/NoAuth/Logout.html | 46 + rt/html/NoAuth/Reminder.html | 26 + rt/html/NoAuth/images/back_home.gif | Bin 0 -> 330 bytes rt/html/NoAuth/images/bplogo.gif | Bin 0 -> 825 bytes rt/html/NoAuth/images/favicon.png | Bin 0 -> 335 bytes rt/html/NoAuth/images/head_requestracker.gif | Bin 0 -> 1233 bytes rt/html/NoAuth/images/rt.jpg | Bin 0 -> 917 bytes rt/html/NoAuth/images/space.gif | Bin 0 -> 43 bytes rt/html/NoAuth/images/spacer.gif | Bin 0 -> 43 bytes rt/html/NoAuth/images/squares_blue.gif | Bin 0 -> 219 bytes rt/html/NoAuth/webrt.css | 338 ++ rt/html/REST/1.0/NoAuth/mail-gateway | 49 + rt/html/Search/Bulk.html | 217 + rt/html/Search/Elements/PickRestriction | 141 + rt/html/Search/Elements/TicketHeader | 40 + rt/html/Search/Elements/TicketHeaderCell | 55 + rt/html/Search/Elements/TicketRow | 55 + rt/html/Search/Listing.html | 112 + rt/html/SelfService/Attachment/dhandler | 27 + rt/html/SelfService/Closed.html | 27 + rt/html/SelfService/Create.html | 80 + rt/html/SelfService/Display.html | 141 + rt/html/SelfService/Elements/GotoTicket | 24 + rt/html/SelfService/Elements/Header | 25 + rt/html/SelfService/Elements/MyRequests | 62 + rt/html/SelfService/Elements/Tabs | 64 + rt/html/SelfService/Error.html | 46 + rt/html/SelfService/Prefs.html | 68 + rt/html/SelfService/Update.html | 61 + rt/html/SelfService/index.html | 26 + rt/html/Ticket/Attachment/dhandler | 68 + rt/html/Ticket/Create.html | 257 + rt/html/Ticket/Display.html | 116 + rt/html/Ticket/Elements/AddWatchers | 97 + rt/html/Ticket/Elements/BulkLinks | 53 + rt/html/Ticket/Elements/EditBasics | 79 + rt/html/Ticket/Elements/EditCustomField | 70 + rt/html/Ticket/Elements/EditCustomFields | 74 + rt/html/Ticket/Elements/EditDates | 53 + rt/html/Ticket/Elements/EditLinks | 150 + rt/html/Ticket/Elements/EditPeople | 68 + rt/html/Ticket/Elements/EditWatchers | 52 + rt/html/Ticket/Elements/ShowAttachments | 76 + rt/html/Ticket/Elements/ShowBasics | 54 + rt/html/Ticket/Elements/ShowCustomFields | 46 + rt/html/Ticket/Elements/ShowDates | 56 + rt/html/Ticket/Elements/ShowDependencies | 41 + rt/html/Ticket/Elements/ShowHistory | 86 + rt/html/Ticket/Elements/ShowLink | 40 + rt/html/Ticket/Elements/ShowLinks | 87 + rt/html/Ticket/Elements/ShowMemberOf | 35 + rt/html/Ticket/Elements/ShowMembers | 45 + rt/html/Ticket/Elements/ShowMessageHeaders | 32 + rt/html/Ticket/Elements/ShowMessageStanza | 51 + rt/html/Ticket/Elements/ShowPeople | 45 + rt/html/Ticket/Elements/ShowReferences | 50 + rt/html/Ticket/Elements/ShowRequestor | 59 + rt/html/Ticket/Elements/ShowSummary | 82 + rt/html/Ticket/Elements/ShowTransaction | 169 + rt/html/Ticket/Elements/Tabs | 170 + rt/html/Ticket/History.html | 52 + rt/html/Ticket/Modify.html | 63 + rt/html/Ticket/ModifyAll.html | 158 + rt/html/Ticket/ModifyDates.html | 52 + rt/html/Ticket/ModifyLinks.html | 54 + rt/html/Ticket/ModifyPeople.html | 67 + rt/html/Ticket/Update.html | 205 + rt/html/User/Delegation.html | 83 + rt/html/User/Elements/DelegateRights | 85 + rt/html/User/Elements/GroupTabs | 60 + rt/html/User/Elements/Tabs | 56 + rt/html/User/Groups/Members.html | 136 + rt/html/User/Groups/Modify.html | 133 + rt/html/User/Groups/index.html | 43 + rt/html/User/Prefs.html | 218 + rt/html/autohandler | 178 + rt/html/index.html | 84 + rt/html/l | 26 + rt/install-sh | 251 + rt/lib/RT.pm | 191 +- rt/lib/RT.pm.in | 304 + rt/lib/RT/ACE.pm | 806 +-- rt/lib/RT/ACE_Overlay.pm | 907 +++ rt/lib/RT/ACL.pm | 329 +- rt/lib/RT/ACL_Overlay.pm | 295 + rt/lib/RT/Action/AutoOpen.pm | 86 + rt/lib/RT/Action/Autoreply.pm | 40 +- rt/lib/RT/Action/CreateTickets.pm | 564 ++ rt/lib/RT/Action/EscalatePriority.pm | 142 + rt/lib/RT/Action/Generic.pm | 56 +- rt/lib/RT/Action/Notify.pm | 83 +- rt/lib/RT/Action/NotifyAsComment.pm | 34 +- rt/lib/RT/Action/ResolveMembers.pm | 35 +- rt/lib/RT/Action/SendEmail.pm | 699 ++- rt/lib/RT/Action/SetPriority.pm | 61 + rt/lib/RT/Action/UserDefined.pm | 71 + rt/lib/RT/Attachment.pm | 601 +- rt/lib/RT/Attachment_Overlay.pm | 571 ++ rt/lib/RT/Attachments.pm | 136 +- rt/lib/RT/Attachments_Overlay.pm | 116 + rt/lib/RT/Base.pm | 97 + rt/lib/RT/CachedGroupMember.pm | 258 + rt/lib/RT/CachedGroupMember_Overlay.pm | 323 + rt/lib/RT/CachedGroupMembers.pm | 115 + rt/lib/RT/CachedGroupMembers_Overlay.pm | 148 + rt/lib/RT/Condition/AnyTransaction.pm | 34 +- rt/lib/RT/Condition/BeforeDue.pm | 64 + rt/lib/RT/Condition/Generic.pm | 55 +- rt/lib/RT/Condition/Overdue.pm | 68 + rt/lib/RT/Condition/OwnerChange.pm | 102 + rt/lib/RT/Condition/PriorityExceeds.pm | 57 + rt/lib/RT/Condition/QueueChange.pm | 57 + rt/lib/RT/Condition/StatusChange.pm | 35 +- rt/lib/RT/Condition/UserDefined.pm | 57 + rt/lib/RT/CurrentUser.pm | 166 +- rt/lib/RT/CustomField.pm | 340 ++ rt/lib/RT/CustomFieldValue.pm | 294 + rt/lib/RT/CustomFieldValues.pm | 121 + rt/lib/RT/CustomFieldValues_Overlay.pm | 47 + rt/lib/RT/CustomField_Overlay.pm | 560 ++ rt/lib/RT/CustomFields.pm | 121 + rt/lib/RT/CustomFields_Overlay.pm | 135 + rt/lib/RT/Date.pm | 335 +- rt/lib/RT/EmailParser.pm | 784 +++ rt/lib/RT/Group.pm | 430 +- rt/lib/RT/GroupMember.pm | 231 +- rt/lib/RT/GroupMember_Overlay.pm | 351 ++ rt/lib/RT/GroupMembers.pm | 124 +- rt/lib/RT/GroupMembers_Overlay.pm | 126 + rt/lib/RT/Group_Overlay.pm | 1260 ++++ rt/lib/RT/Groups.pm | 135 +- rt/lib/RT/Groups_Overlay.pm | 298 + rt/lib/RT/Handle.pm | 62 +- rt/lib/RT/I18N.pm | 430 ++ rt/lib/RT/I18N/cs.pm | 68 + rt/lib/RT/I18N/cs.po | 4496 ++++++++++++++ rt/lib/RT/I18N/de.po | 4500 ++++++++++++++ rt/lib/RT/I18N/en.po | 88 + rt/lib/RT/I18N/es.po | 4749 +++++++++++++++ rt/lib/RT/I18N/fi.po | 4750 +++++++++++++++ rt/lib/RT/I18N/fr.po | 4959 +++++++++++++++ rt/lib/RT/I18N/he.po | 4871 +++++++++++++++ rt/lib/RT/I18N/i_default.pm | 86 + rt/lib/RT/I18N/ja.po | 4822 +++++++++++++++ rt/lib/RT/I18N/nl.po | 4819 +++++++++++++++ rt/lib/RT/I18N/no.po | 4879 +++++++++++++++ rt/lib/RT/I18N/pt_br.po | 4829 +++++++++++++++ rt/lib/RT/I18N/ru.po | 4826 +++++++++++++++ rt/lib/RT/I18N/zh_cn.po | 6384 +++++++++++++++++++ rt/lib/RT/I18N/zh_tw.po | 6416 ++++++++++++++++++++ rt/lib/RT/Interface/CLI.pm | 112 +- rt/lib/RT/Interface/Email.pm | 683 ++- rt/lib/RT/Interface/Email/Auth/MailFrom.pm | 131 + rt/lib/RT/Interface/Email/Filter/SpamAssassin.pm | 63 + rt/lib/RT/Interface/Web.pm | 1124 ++-- rt/lib/RT/Link.pm | 487 +- rt/lib/RT/Link_Overlay.pm | 360 ++ rt/lib/RT/Links.pm | 153 +- rt/lib/RT/Links_Overlay.pm | 125 + rt/lib/RT/Principal.pm | 212 + rt/lib/RT/Principal_Overlay.pm | 557 ++ rt/lib/RT/Principals.pm | 115 + rt/lib/RT/Principals_Overlay.pm | 52 + rt/lib/RT/Queue.pm | 961 +-- rt/lib/RT/Queue_Overlay.pm | 1012 +++ rt/lib/RT/Queues.pm | 162 +- rt/lib/RT/Queues_Overlay.pm | 130 + rt/lib/RT/Record.pm | 400 +- rt/lib/RT/Scrip.pm | 654 +- rt/lib/RT/ScripAction.pm | 385 +- rt/lib/RT/ScripAction_Overlay.pm | 217 + rt/lib/RT/ScripActions.pm | 137 +- rt/lib/RT/ScripActions_Overlay.pm | 87 + rt/lib/RT/ScripCondition.pm | 366 +- rt/lib/RT/ScripCondition_Overlay.pm | 210 + rt/lib/RT/ScripConditions.pm | 142 +- rt/lib/RT/ScripConditions_Overlay.pm | 87 + rt/lib/RT/Scrip_Overlay.pm | 507 ++ rt/lib/RT/Scrips.pm | 162 +- rt/lib/RT/Scrips_Overlay.pm | 133 + rt/lib/RT/Search/ActiveTicketsInQueue.pm | 78 + rt/lib/RT/Search/Generic.pm | 128 + rt/lib/RT/SearchBuilder.pm | 200 + rt/lib/RT/System.pm | 165 + rt/lib/RT/Template.pm | 512 +- rt/lib/RT/Template_Overlay.pm | 411 ++ rt/lib/RT/Templates.pm | 143 +- rt/lib/RT/Templates_Overlay.pm | 141 + rt/lib/RT/Ticket.pm | 3026 ++------- rt/lib/RT/TicketCustomFieldValue.pm | 286 + rt/lib/RT/TicketCustomFieldValue_Overlay.pm | 52 + rt/lib/RT/TicketCustomFieldValues.pm | 115 + rt/lib/RT/TicketCustomFieldValues_Overlay.pm | 86 + rt/lib/RT/Ticket_Overlay.pm | 4040 ++++++++++++ rt/lib/RT/Tickets.pm | 1806 +----- rt/lib/RT/Tickets_Overlay.pm | 2055 +++++++ rt/lib/RT/Tickets_Overlay_SQL.pm | 382 ++ rt/lib/RT/Transaction.pm | 895 +-- rt/lib/RT/Transaction_Overlay.pm | 817 +++ rt/lib/RT/Transactions.pm | 129 +- rt/lib/RT/Transactions_Overlay.pm | 86 + rt/lib/RT/URI.pm | 244 + rt/lib/RT/URI/base.pm | 129 + rt/lib/RT/URI/fsck_com_rt.pm | 247 + rt/lib/RT/User.pm | 1696 ++---- rt/lib/RT/User_Overlay.pm | 1589 +++++ rt/lib/RT/Users.pm | 298 +- rt/lib/RT/Users_Overlay.pm | 290 + rt/lib/t/00smoke.t | 14 + rt/lib/t/00smoke.t.in | 14 + rt/lib/t/01harness.t | 12 + rt/lib/t/01harness.t.in | 12 + rt/lib/t/02regression.t | 44 + rt/lib/t/02regression.t.in | 44 + rt/lib/t/03web.pl | 62 + rt/lib/t/03web.pl.in | 62 + rt/lib/t/04_send_email.pl | 389 ++ rt/lib/t/04_send_email.pl.in | 389 ++ rt/lib/t/data/8859-15-message-series/dir | 356 ++ rt/lib/t/data/8859-15-message-series/msg1 | 36 + rt/lib/t/data/8859-15-message-series/msg2 | 36 + rt/lib/t/data/8859-15-message-series/msg3 | 35 + rt/lib/t/data/8859-15-message-series/msg4 | 35 + rt/lib/t/data/8859-15-message-series/msg5 | 35 + rt/lib/t/data/8859-15-message-series/msg6 | 35 + rt/lib/t/data/8859-15-message-series/msg7 | 36 + rt/lib/t/data/multipart-alternative-with-umlaut | 62 + rt/lib/t/data/nested-mime-sample | 396 ++ rt/lib/t/data/nested-rfc-822 | 253 + rt/lib/t/data/new-ticket-from-iso-8859-1 | 31 + rt/lib/t/data/new-ticket-from-iso-8859-1-full | 38 + rt/lib/t/data/russian-subject-no-content-type | 42 + rt/lib/t/data/text-html-in-russian | 87 + rt/lib/t/data/text-html-with-umlaut | 35 + rt/lib/t/regression/00placeholder | 1 + rt/lib/t/regression/mime_tests | 19 + rt/m4/rt_enable_layout.m4 | 36 + rt/m4/rt_expand_var.m4 | 18 + rt/m4/rt_layout.m4 | 74 + rt/m4/rt_subst_expanded_arg.m4 | 14 + rt/sbin/extract-message-catalog | 246 + rt/sbin/extract_pod_tests | 129 + rt/sbin/factory | 427 ++ rt/sbin/license_tag | 196 + rt/sbin/regression_harness | 33 + rt/sbin/rt-setup-database | 585 ++ rt/sbin/rt-setup-database.in | 585 ++ rt/sbin/rt-test-dependencies | 246 + rt/sbin/rt-test-dependencies.in | 246 + 426 files changed, 134245 insertions(+), 14126 deletions(-) create mode 100644 rt/Changelog create mode 100644 rt/HOWTO/README create mode 100644 rt/HOWTO/change.txt create mode 100644 rt/HOWTO/release.txt create mode 100644 rt/HOWTO/version-control.txt create mode 100644 rt/Makefile.in create mode 100644 rt/aclocal.m4 create mode 100644 rt/autom4te.cache/output.0 create mode 100644 rt/autom4te.cache/requests create mode 100644 rt/autom4te.cache/traces.0 create mode 100644 rt/bin/mason_handler.fcgi.in create mode 100644 rt/bin/mason_handler.scgi.in create mode 100644 rt/bin/mason_handler.svc create mode 100644 rt/bin/mason_handler.svc.in create mode 100644 rt/bin/rt-commit-handler create mode 100644 rt/bin/rt-commit-handler.in create mode 100644 rt/bin/rt-crontool create mode 100644 rt/bin/rt-crontool.in create mode 100644 rt/bin/rt-mailgate.in create mode 100644 rt/bin/webmux.pl.in create mode 100644 rt/config create mode 100644 rt/config.layout create mode 100644 rt/config.log create mode 100644 rt/config.pld create mode 100755 rt/config.status create mode 100755 rt/configure create mode 100644 rt/configure.ac create mode 100644 rt/docs/design_docs/approval_notices create mode 100644 rt/docs/design_docs/approval_template create mode 100644 rt/docs/design_docs/cf_search create mode 100644 rt/docs/design_docs/delegation create mode 100644 rt/docs/design_docs/groups_notes create mode 100644 rt/docs/design_docs/recursive_group_membership_algorithm create mode 100644 rt/docs/design_docs/rql_parser_machine.graphviz create mode 100644 rt/docs/design_docs/string-extraction-guide.txt create mode 100644 rt/docs/design_docs/ticket_templates create mode 100644 rt/etc/RT_Config.pm create mode 100644 rt/etc/RT_Config.pm.in create mode 100644 rt/etc/RT_SiteConfig.pm create mode 100644 rt/etc/constraints.mysql create mode 100644 rt/etc/initialdata create mode 100644 rt/etc/schema.SQLite create mode 100644 rt/etc/upgrade/2.1.71 create mode 100644 rt/html/Admin/Elements/AddCustomFieldValue create mode 100644 rt/html/Admin/Elements/CreateUserCalled create mode 100644 rt/html/Admin/Elements/EditCustomField create mode 100644 rt/html/Admin/Elements/EditCustomFieldValues create mode 100644 rt/html/Admin/Elements/EditCustomFields create mode 100644 rt/html/Admin/Elements/EditQueueWatchers create mode 100644 rt/html/Admin/Elements/EditScrip create mode 100644 rt/html/Admin/Elements/EditScrips create mode 100644 rt/html/Admin/Elements/EditTemplates create mode 100644 rt/html/Admin/Elements/EditUserComments create mode 100644 rt/html/Admin/Elements/GroupTabs create mode 100644 rt/html/Admin/Elements/Header create mode 100644 rt/html/Admin/Elements/ListGlobalCustomFields create mode 100644 rt/html/Admin/Elements/ListGlobalScrips create mode 100644 rt/html/Admin/Elements/ModifyQueue create mode 100644 rt/html/Admin/Elements/ModifyTemplate create mode 100644 rt/html/Admin/Elements/ModifyUser create mode 100644 rt/html/Admin/Elements/QueueRightsForUser create mode 100644 rt/html/Admin/Elements/QueueTabs create mode 100644 rt/html/Admin/Elements/SelectCustomFieldType create mode 100644 rt/html/Admin/Elements/SelectGroups create mode 100644 rt/html/Admin/Elements/SelectModifyGroup create mode 100644 rt/html/Admin/Elements/SelectModifyQueue create mode 100644 rt/html/Admin/Elements/SelectModifyUser create mode 100644 rt/html/Admin/Elements/SelectNewGroupMembers create mode 100644 rt/html/Admin/Elements/SelectRights create mode 100644 rt/html/Admin/Elements/SelectScrip create mode 100644 rt/html/Admin/Elements/SelectScripAction create mode 100644 rt/html/Admin/Elements/SelectScripCondition create mode 100644 rt/html/Admin/Elements/SelectSingleOrMultiple create mode 100644 rt/html/Admin/Elements/SelectTemplate create mode 100644 rt/html/Admin/Elements/SelectUsers create mode 100644 rt/html/Admin/Elements/SystemTabs create mode 100644 rt/html/Admin/Elements/Tabs create mode 100644 rt/html/Admin/Elements/UserTabs create mode 100644 rt/html/Admin/Global/CustomField.html create mode 100644 rt/html/Admin/Global/CustomFields.html create mode 100644 rt/html/Admin/Global/GroupRights.html create mode 100644 rt/html/Admin/Global/Scrip.html create mode 100644 rt/html/Admin/Global/Scrips.html create mode 100644 rt/html/Admin/Global/Template.html create mode 100644 rt/html/Admin/Global/Templates.html create mode 100644 rt/html/Admin/Global/UserRights.html create mode 100644 rt/html/Admin/Global/index.html create mode 100644 rt/html/Admin/Groups/GroupRights.html create mode 100644 rt/html/Admin/Groups/Members.html create mode 100644 rt/html/Admin/Groups/Modify.html create mode 100644 rt/html/Admin/Groups/UserRights.html create mode 100644 rt/html/Admin/Groups/index.html create mode 100644 rt/html/Admin/Queues/CustomField.html create mode 100644 rt/html/Admin/Queues/CustomFields.html create mode 100644 rt/html/Admin/Queues/GroupRights.html create mode 100644 rt/html/Admin/Queues/Modify.html create mode 100644 rt/html/Admin/Queues/People.html create mode 100644 rt/html/Admin/Queues/Scrip.html create mode 100644 rt/html/Admin/Queues/Scrips.html create mode 100644 rt/html/Admin/Queues/Template.html create mode 100644 rt/html/Admin/Queues/Templates.html create mode 100644 rt/html/Admin/Queues/UserRights.html create mode 100644 rt/html/Admin/Queues/index.html create mode 100644 rt/html/Admin/Users/Modify.html create mode 100644 rt/html/Admin/Users/Prefs.html create mode 100644 rt/html/Admin/Users/index.html create mode 100644 rt/html/Admin/index.html create mode 100644 rt/html/Approvals/Display.html create mode 100644 rt/html/Approvals/Elements/Approve create mode 100644 rt/html/Approvals/Elements/PendingMyApproval create mode 100644 rt/html/Approvals/Elements/ShowDependency create mode 100644 rt/html/Approvals/Elements/Tabs create mode 100644 rt/html/Approvals/index.html create mode 100644 rt/html/Elements/BevelBoxRaisedEnd create mode 100644 rt/html/Elements/BevelBoxRaisedStart create mode 100644 rt/html/Elements/Callback create mode 100644 rt/html/Elements/Checkbox create mode 100644 rt/html/Elements/CreateTicket create mode 100644 rt/html/Elements/Error create mode 100644 rt/html/Elements/Footer create mode 100644 rt/html/Elements/GotoTicket create mode 100644 rt/html/Elements/Header create mode 100644 rt/html/Elements/ListActions create mode 100644 rt/html/Elements/Login create mode 100644 rt/html/Elements/Menu create mode 100644 rt/html/Elements/MessageBox create mode 100644 rt/html/Elements/MyRequests create mode 100644 rt/html/Elements/MyTickets create mode 100644 rt/html/Elements/PageLayout create mode 100644 rt/html/Elements/Quicksearch create mode 100644 rt/html/Elements/Refresh create mode 100644 rt/html/Elements/Section create mode 100644 rt/html/Elements/SelectAttachmentField create mode 100644 rt/html/Elements/SelectBoolean create mode 100644 rt/html/Elements/SelectCustomFieldOperator create mode 100644 rt/html/Elements/SelectCustomFieldValue create mode 100644 rt/html/Elements/SelectDate create mode 100644 rt/html/Elements/SelectDateRelation create mode 100644 rt/html/Elements/SelectDateType create mode 100644 rt/html/Elements/SelectEqualityOperator create mode 100644 rt/html/Elements/SelectGroups create mode 100644 rt/html/Elements/SelectLinkType create mode 100644 rt/html/Elements/SelectMatch create mode 100644 rt/html/Elements/SelectNewTicketQueue create mode 100644 rt/html/Elements/SelectOwner create mode 100644 rt/html/Elements/SelectQueue create mode 100644 rt/html/Elements/SelectResultsPerPage create mode 100644 rt/html/Elements/SelectSortOrder create mode 100644 rt/html/Elements/SelectStatus create mode 100644 rt/html/Elements/SelectTicketSortBy create mode 100644 rt/html/Elements/SelectTicketTypes create mode 100644 rt/html/Elements/SelectUsers create mode 100644 rt/html/Elements/SelectWatcherType create mode 100644 rt/html/Elements/SetupSessionCookie create mode 100644 rt/html/Elements/ShadedBox create mode 100644 rt/html/Elements/ShadedInputRow create mode 100644 rt/html/Elements/ShadedRow create mode 100644 rt/html/Elements/SimpleSearch create mode 100644 rt/html/Elements/Submit create mode 100644 rt/html/Elements/Tabs create mode 100644 rt/html/Elements/TitleBoxEnd create mode 100644 rt/html/Elements/TitleBoxStart create mode 100644 rt/html/Elements/ViewUser create mode 100644 rt/html/NoAuth/Logout.html create mode 100644 rt/html/NoAuth/Reminder.html create mode 100644 rt/html/NoAuth/images/back_home.gif create mode 100644 rt/html/NoAuth/images/bplogo.gif create mode 100644 rt/html/NoAuth/images/favicon.png create mode 100644 rt/html/NoAuth/images/head_requestracker.gif create mode 100644 rt/html/NoAuth/images/rt.jpg create mode 100644 rt/html/NoAuth/images/space.gif create mode 100644 rt/html/NoAuth/images/spacer.gif create mode 100644 rt/html/NoAuth/images/squares_blue.gif create mode 100644 rt/html/NoAuth/webrt.css create mode 100644 rt/html/REST/1.0/NoAuth/mail-gateway create mode 100644 rt/html/Search/Bulk.html create mode 100644 rt/html/Search/Elements/PickRestriction create mode 100644 rt/html/Search/Elements/TicketHeader create mode 100644 rt/html/Search/Elements/TicketHeaderCell create mode 100644 rt/html/Search/Elements/TicketRow create mode 100644 rt/html/Search/Listing.html create mode 100644 rt/html/SelfService/Attachment/dhandler create mode 100644 rt/html/SelfService/Closed.html create mode 100644 rt/html/SelfService/Create.html create mode 100644 rt/html/SelfService/Display.html create mode 100644 rt/html/SelfService/Elements/GotoTicket create mode 100644 rt/html/SelfService/Elements/Header create mode 100644 rt/html/SelfService/Elements/MyRequests create mode 100644 rt/html/SelfService/Elements/Tabs create mode 100644 rt/html/SelfService/Error.html create mode 100644 rt/html/SelfService/Prefs.html create mode 100644 rt/html/SelfService/Update.html create mode 100644 rt/html/SelfService/index.html create mode 100644 rt/html/Ticket/Attachment/dhandler create mode 100644 rt/html/Ticket/Create.html create mode 100644 rt/html/Ticket/Display.html create mode 100644 rt/html/Ticket/Elements/AddWatchers create mode 100644 rt/html/Ticket/Elements/BulkLinks create mode 100644 rt/html/Ticket/Elements/EditBasics create mode 100644 rt/html/Ticket/Elements/EditCustomField create mode 100644 rt/html/Ticket/Elements/EditCustomFields create mode 100644 rt/html/Ticket/Elements/EditDates create mode 100644 rt/html/Ticket/Elements/EditLinks create mode 100644 rt/html/Ticket/Elements/EditPeople create mode 100644 rt/html/Ticket/Elements/EditWatchers create mode 100644 rt/html/Ticket/Elements/ShowAttachments create mode 100644 rt/html/Ticket/Elements/ShowBasics create mode 100644 rt/html/Ticket/Elements/ShowCustomFields create mode 100644 rt/html/Ticket/Elements/ShowDates create mode 100644 rt/html/Ticket/Elements/ShowDependencies create mode 100644 rt/html/Ticket/Elements/ShowHistory create mode 100644 rt/html/Ticket/Elements/ShowLink create mode 100644 rt/html/Ticket/Elements/ShowLinks create mode 100644 rt/html/Ticket/Elements/ShowMemberOf create mode 100644 rt/html/Ticket/Elements/ShowMembers create mode 100644 rt/html/Ticket/Elements/ShowMessageHeaders create mode 100644 rt/html/Ticket/Elements/ShowMessageStanza create mode 100644 rt/html/Ticket/Elements/ShowPeople create mode 100644 rt/html/Ticket/Elements/ShowReferences create mode 100644 rt/html/Ticket/Elements/ShowRequestor create mode 100644 rt/html/Ticket/Elements/ShowSummary create mode 100644 rt/html/Ticket/Elements/ShowTransaction create mode 100644 rt/html/Ticket/Elements/Tabs create mode 100644 rt/html/Ticket/History.html create mode 100644 rt/html/Ticket/Modify.html create mode 100644 rt/html/Ticket/ModifyAll.html create mode 100644 rt/html/Ticket/ModifyDates.html create mode 100644 rt/html/Ticket/ModifyLinks.html create mode 100644 rt/html/Ticket/ModifyPeople.html create mode 100644 rt/html/Ticket/Update.html create mode 100644 rt/html/User/Delegation.html create mode 100644 rt/html/User/Elements/DelegateRights create mode 100644 rt/html/User/Elements/GroupTabs create mode 100644 rt/html/User/Elements/Tabs create mode 100644 rt/html/User/Groups/Members.html create mode 100644 rt/html/User/Groups/Modify.html create mode 100644 rt/html/User/Groups/index.html create mode 100644 rt/html/User/Prefs.html create mode 100644 rt/html/autohandler create mode 100644 rt/html/index.html create mode 100644 rt/html/l create mode 100644 rt/install-sh create mode 100644 rt/lib/RT.pm.in create mode 100644 rt/lib/RT/ACE_Overlay.pm create mode 100644 rt/lib/RT/ACL_Overlay.pm create mode 100644 rt/lib/RT/Action/AutoOpen.pm create mode 100644 rt/lib/RT/Action/CreateTickets.pm create mode 100644 rt/lib/RT/Action/EscalatePriority.pm create mode 100644 rt/lib/RT/Action/SetPriority.pm create mode 100644 rt/lib/RT/Action/UserDefined.pm create mode 100644 rt/lib/RT/Attachment_Overlay.pm create mode 100644 rt/lib/RT/Attachments_Overlay.pm create mode 100644 rt/lib/RT/Base.pm create mode 100644 rt/lib/RT/CachedGroupMember.pm create mode 100644 rt/lib/RT/CachedGroupMember_Overlay.pm create mode 100644 rt/lib/RT/CachedGroupMembers.pm create mode 100644 rt/lib/RT/CachedGroupMembers_Overlay.pm create mode 100644 rt/lib/RT/Condition/BeforeDue.pm create mode 100644 rt/lib/RT/Condition/Overdue.pm create mode 100644 rt/lib/RT/Condition/OwnerChange.pm create mode 100644 rt/lib/RT/Condition/PriorityExceeds.pm create mode 100644 rt/lib/RT/Condition/QueueChange.pm create mode 100644 rt/lib/RT/Condition/UserDefined.pm create mode 100644 rt/lib/RT/CustomField.pm create mode 100644 rt/lib/RT/CustomFieldValue.pm create mode 100644 rt/lib/RT/CustomFieldValues.pm create mode 100644 rt/lib/RT/CustomFieldValues_Overlay.pm create mode 100644 rt/lib/RT/CustomField_Overlay.pm create mode 100644 rt/lib/RT/CustomFields.pm create mode 100644 rt/lib/RT/CustomFields_Overlay.pm create mode 100644 rt/lib/RT/EmailParser.pm create mode 100644 rt/lib/RT/GroupMember_Overlay.pm create mode 100644 rt/lib/RT/GroupMembers_Overlay.pm create mode 100644 rt/lib/RT/Group_Overlay.pm create mode 100644 rt/lib/RT/Groups_Overlay.pm create mode 100644 rt/lib/RT/I18N.pm create mode 100644 rt/lib/RT/I18N/cs.pm create mode 100644 rt/lib/RT/I18N/cs.po create mode 100644 rt/lib/RT/I18N/de.po create mode 100644 rt/lib/RT/I18N/en.po create mode 100644 rt/lib/RT/I18N/es.po create mode 100644 rt/lib/RT/I18N/fi.po create mode 100644 rt/lib/RT/I18N/fr.po create mode 100644 rt/lib/RT/I18N/he.po create mode 100644 rt/lib/RT/I18N/i_default.pm create mode 100644 rt/lib/RT/I18N/ja.po create mode 100644 rt/lib/RT/I18N/nl.po create mode 100644 rt/lib/RT/I18N/no.po create mode 100644 rt/lib/RT/I18N/pt_br.po create mode 100644 rt/lib/RT/I18N/ru.po create mode 100644 rt/lib/RT/I18N/zh_cn.po create mode 100644 rt/lib/RT/I18N/zh_tw.po create mode 100644 rt/lib/RT/Interface/Email/Auth/MailFrom.pm create mode 100644 rt/lib/RT/Interface/Email/Filter/SpamAssassin.pm create mode 100644 rt/lib/RT/Link_Overlay.pm create mode 100644 rt/lib/RT/Links_Overlay.pm create mode 100644 rt/lib/RT/Principal.pm create mode 100644 rt/lib/RT/Principal_Overlay.pm create mode 100644 rt/lib/RT/Principals.pm create mode 100644 rt/lib/RT/Principals_Overlay.pm create mode 100644 rt/lib/RT/Queue_Overlay.pm create mode 100644 rt/lib/RT/Queues_Overlay.pm create mode 100644 rt/lib/RT/ScripAction_Overlay.pm create mode 100644 rt/lib/RT/ScripActions_Overlay.pm create mode 100644 rt/lib/RT/ScripCondition_Overlay.pm create mode 100644 rt/lib/RT/ScripConditions_Overlay.pm create mode 100644 rt/lib/RT/Scrip_Overlay.pm create mode 100644 rt/lib/RT/Scrips_Overlay.pm create mode 100644 rt/lib/RT/Search/ActiveTicketsInQueue.pm create mode 100644 rt/lib/RT/Search/Generic.pm create mode 100644 rt/lib/RT/SearchBuilder.pm create mode 100644 rt/lib/RT/System.pm create mode 100644 rt/lib/RT/Template_Overlay.pm create mode 100644 rt/lib/RT/Templates_Overlay.pm create mode 100644 rt/lib/RT/TicketCustomFieldValue.pm create mode 100644 rt/lib/RT/TicketCustomFieldValue_Overlay.pm create mode 100644 rt/lib/RT/TicketCustomFieldValues.pm create mode 100644 rt/lib/RT/TicketCustomFieldValues_Overlay.pm create mode 100644 rt/lib/RT/Ticket_Overlay.pm create mode 100644 rt/lib/RT/Tickets_Overlay.pm create mode 100644 rt/lib/RT/Tickets_Overlay_SQL.pm create mode 100644 rt/lib/RT/Transaction_Overlay.pm create mode 100644 rt/lib/RT/Transactions_Overlay.pm create mode 100644 rt/lib/RT/URI.pm create mode 100644 rt/lib/RT/URI/base.pm create mode 100644 rt/lib/RT/URI/fsck_com_rt.pm create mode 100644 rt/lib/RT/User_Overlay.pm create mode 100644 rt/lib/RT/Users_Overlay.pm create mode 100644 rt/lib/t/00smoke.t create mode 100644 rt/lib/t/00smoke.t.in create mode 100644 rt/lib/t/01harness.t create mode 100644 rt/lib/t/01harness.t.in create mode 100644 rt/lib/t/02regression.t create mode 100644 rt/lib/t/02regression.t.in create mode 100644 rt/lib/t/03web.pl create mode 100644 rt/lib/t/03web.pl.in create mode 100644 rt/lib/t/04_send_email.pl create mode 100644 rt/lib/t/04_send_email.pl.in create mode 100644 rt/lib/t/data/8859-15-message-series/dir create mode 100644 rt/lib/t/data/8859-15-message-series/msg1 create mode 100644 rt/lib/t/data/8859-15-message-series/msg2 create mode 100644 rt/lib/t/data/8859-15-message-series/msg3 create mode 100644 rt/lib/t/data/8859-15-message-series/msg4 create mode 100644 rt/lib/t/data/8859-15-message-series/msg5 create mode 100644 rt/lib/t/data/8859-15-message-series/msg6 create mode 100644 rt/lib/t/data/8859-15-message-series/msg7 create mode 100644 rt/lib/t/data/multipart-alternative-with-umlaut create mode 100644 rt/lib/t/data/nested-mime-sample create mode 100644 rt/lib/t/data/nested-rfc-822 create mode 100644 rt/lib/t/data/new-ticket-from-iso-8859-1 create mode 100644 rt/lib/t/data/new-ticket-from-iso-8859-1-full create mode 100644 rt/lib/t/data/russian-subject-no-content-type create mode 100644 rt/lib/t/data/text-html-in-russian create mode 100644 rt/lib/t/data/text-html-with-umlaut create mode 100644 rt/lib/t/regression/00placeholder create mode 100644 rt/lib/t/regression/mime_tests create mode 100644 rt/m4/rt_enable_layout.m4 create mode 100644 rt/m4/rt_expand_var.m4 create mode 100644 rt/m4/rt_layout.m4 create mode 100644 rt/m4/rt_subst_expanded_arg.m4 create mode 100644 rt/sbin/extract-message-catalog create mode 100644 rt/sbin/extract_pod_tests create mode 100644 rt/sbin/factory create mode 100644 rt/sbin/license_tag create mode 100644 rt/sbin/regression_harness create mode 100644 rt/sbin/rt-setup-database create mode 100644 rt/sbin/rt-setup-database.in create mode 100644 rt/sbin/rt-test-dependencies create mode 100644 rt/sbin/rt-test-dependencies.in diff --git a/rt/Changelog b/rt/Changelog new file mode 100644 index 000000000..d8d73fd6d --- /dev/null +++ b/rt/Changelog @@ -0,0 +1,1286 @@ + + + +Project "rt.3", Branch 0 Page 1 +Change Log Sat Jul 12 04:24:41 2003 + +rt.3.D000, C0, jesse, Thu Mar 13 20:43:23 2003, RT: Request Tracker, branch 3.0. + RT: Request Tracker, branch 3.0. + + Change Delta Brief Description + 10 1 Bumping the version to rt.3.0.0rc0 + 11 2 Minor CSS update. rollback fix; new database indices; + copyright update + 15 3 removing the old REST API + 16 4 Performance work on 'WhoHaveRight'; bumping to 3.0.0rc2 + 12 5 fixing indices for postgres + 17 6 fixing fastcgi's ability to load webmux.pl on some platforms + 18 7 More performance work; backing out 'enhancements' that killed + system performance + 19 8 Caving in to the masses and making 'notify sender' + configurable + 20 9 finishing the notify stuff + 22 10 Bumping to RC3; fixing the display of 'This user's n highest + priority tix' + 23 11 New french translation + 25 12 Brazilian Portuguese translation + 26 13 Postgres fixes + 27 14 Postgres schema tweak + 28 15 Further postgres tweaks and fixes + 29 16 RT should now be less overzealous about opening and then + marking a ticket 'new' again + 30 17 Bumping to 3.0.0rc4 + 31 18 Minor fixes - Bumped to 3.0.0; + 2266 - postgres scrip creation bug + 2267 - Tickets not reopened after being stalled + 2265 - Fixed css nits from blaise + Unreported - Fixed quick-search bug + 32 19 Added better error checking for failed ticket creation + 33 20 A tiny bit of extra data passing for some callbacks + 35 21 New czech translation + 37 22 Updated dependencies + 36 23 Updated Spanish translation + 38 24 Updates for RT RPC interface from AMS + 39 25 Many users should be able to have a blank address; neew test + suite to ensure this + 50 26 Integrating rafael's failing test suite and proposed fix from + autrijus + 51 27 Changing address used in example to not send mail to author + 52 28 More I18N testing for rafael + 53 29 Added preliminary left to right hebrew translation + 55 30 #2365 Removing outdated Mason setup parameter + 56 31 Testing fixes for mail authentication/authorization + 57 32 Testing and fixing binary attachment corruption + 58 33 Better binary attachment handling fix from autrijus + 59 34 Bumping to RT 3.0.1pre2 + 60 35 SMTP and I18N fixes from autrijus tang. Updated chinese + translations + 61 36 New speedycgi support from vivek khera + 62 37 Bumping to version 3.0.1 + 63 38 Fixing a showmessagestanza bug found in RTIR + 65 39 Fixing an untainting bug in 3.0.1 + 66 40 Quicksearch bug fix from Stan + 67 41 updating autrijus' autohandler patch. seems to break lots of + stuff + 68 42 Bumping to 3.0.2pre1 + 69 43 make ids clicky + 70 44 fixing utf8 tainting issue in autohandler; bumped to 3.0.2pre2 + 71 45 Another go at fixing the ARRAY() issue; bumping to 3.0.2pre3 + 72 46 bulk links + 73 47 I18N patches from autrijus; bouncing to 3.0.2pre4 + 75 48 bumped version to 3.0.2pre5; attachments performance fixes; + utf-8 mailgateway fixes; more extension hooks; template + updates for approvals + 76 49 [#2437] CanonicalizeEmailAddress fixes; [# 2449] html fixes + for right editing; [# 2457] email addresses weren't always + being canonicalized + 77 50 Fixing bogus anchor tags + 78 51 More performance work on WhoHaveRight; removing an extra join + 79 52 Cleaning up RT tag processing + 80 53 Importing utf8 fixes, _Vendor overlay support from ourinternet + 81 54 Bumping the version to 3.0.2pre6 + 82 55 Bumping the version to RT 3.0.2 + 83 56 merge from ourinternet; one CreateTickets fix and some utf8 + updates + 85 57 Robert's updated search stuff + 86 58 Fix for #2602 - make test fails on _Config.pm + 87 59 Including norwegian bokmal translation + 14 60 #2539: Re: [rt-users] unexpected usage: change sort order with + column headers in search window + 88 61 Fix to honor '$LogDir' for LogToFile + 89 62 #2603: /opt/rt3/share/doc should not be a file. + 90 63 Merging utf8 fixes from autrijus tang + 91 64 Fixing an upgrade bug from 3.0.2->3.0.3 + 92 65 MIME::Words encoding fixes for mail sending + 93 66 Additional work on the SQLite port + 95 67 Merge from ourinternet: UTF8 fixes; more configurable apache + sessions; + 96 68 ACL HasRight system replaced with an algorithm that does more + looking ahead + 97 69 A fix to Tickets_Overlay.pm to make the 'Count' methods + actually do a count, not a full SELECT + 98 70 Further UTF8-fixed from autrijus + 99 71 Bumping the version to 3.0.3pre1 + 100 72 update layout fix + 101 73 #2662 Fixing an overly restrictive ACL check on group creation + 102 74 #2657 Web UI Scrip creation bug + 103 75 #2652 - de.po updates + 105 76 #2658 Cosmetic issue with Scrip menu listing + 106 77 fix for FastCGI and SpeedyCGI setgidness with weird + environments + 107 78 Continued performance improvements for caching + 108 79 Log path enhancment to deal more gracefully with absolutely + specified logfile paths + 109 80 CF defaults; fix Starts set + 110 81 ACL cache made postgres safe + 111 82 Fixing an acl bug in Principal_Overlay introduced after 3.0.2 + and a possible 'Deep' transaction issue. now requires + DBIx::SearchBuilder 0.83_05 or newer + 112 83 #2678 Fixing crit messages in RT::User + 113 84 Bumping DBIx::SearchBuilder requirement to 0.84 + 115 85 The "rt" program, branch 3.0. + 117 86 pass title to Header + 116 87 Better testing for internationalization of outoging messages; + slight refactoring to SendEmail to be more testable; added + missing deps to EmailParser + 118 88 Bump to 3.0.3pre2; fix a misspelled right in Queue.pm (#2686) + 119 89 #2721 - 'id' attribute had mixed casing. this bothers certain + databases (Sybase) + 120 90 Header & Logout take URL + 121 91 Fixes for: Bogus message headers containing high-bit + characters; database handle reconnections; postgres test suite + failures + 123 92 support group & queue acl setting from rt-setup-database + 125 93 add TakeTicket, StealTicket rights + 122 94 Bumping version to 3.0.3pre3, bumping searchbuilder dependency + 126 95 Really bumping the version to 3.0.3pre3 + 129 96 Various fixes from a pull-up of the ourinternet branch + 128 97 #2605 - SpamAssassin Filter returns the wrong codes on + success/failure + 127 98 Fixes the cascading style sheet to properly reference message + bodies + 130 99 Attempting to be smarter about guessing encodings for outgoing + mail + 131 100 Fixing search navigation links (they were made to disappear) + 132 101 #2776 - 'new' ACL cache had bad behaviour. rolled back to + older cache and added tests + 133 102 On postgres, RT didn't previously cope well with multipart + messages including non-plain parts containing non-ascii + 135 103 Efficiency tweaks for WhoHaveRight + 136 104 Bumping version to RT 3.0.3pre4 + 137 105 #2813 Duplicate tickets created at the same time could cause a + user creation race condition + 138 106 Importing minor bugfixes from ourinternet + 139 107 #2816 new callback to ShowLinks + 150 108 #2799: Display URIs instead of HREFs in ticket display + 151 109 #2797 Clean up automatich chmodding on installation + 152 110 ShowRequestor takes path + 153 111 SystemInternal group ACLs in setup + 155 112 Better encoding and error checking for message headers + 156 113 better handle notification messages containing only text/html + content. + 157 114 Bumping to 3.0.3pre5 + 158 115 More I18N fixes from ourinternet + 159 116 Bumping version to RC-1 + 160 117 Another shot at the header encoding fix + 161 118 Mitya's failing processing of html email + 162 119 Bumping to 3.0.3rc2 + 163 120 Anonymizing addresses in mitya's submitted testcases + 165 121 Better handling of malformed email messages + 166 122 Bumping version to 3.0rc3 + 167 123 #2850 - With some configurations, users could not create new + tickets with 'new' requestors - Bumped to 3.0 RC 4 + 168 124 Scrip data updates weren't propagating to parent Ticket + objects; Bumping to 3.0.3 + 169 125 CustomField rights checking was overly restrictive for users + without queue-specific rights + 170 126 I18N mail testing was was being cavalier with the state of + acls after its testing. (clone of 3.0.C167) + 171 127 Ticket Update.html fix to not doubly load content + 172 128 Fixing postgres sortorder bug unmased by searchbuilder fix + 176 129 Applying POD patches from ourinternet (clone of 3.0.C173) + 177 130 UTF8, Custom Field and text message rendering fixes from + ourinternet + 178 131 #2843 Date relations were too strict in RT::Tickets searches + 179 132 #2847: allow URI Resolver to render itself + 173 133 ShowMessageHeaders; make headers clicky + 180 134 use RTIR callbacks + 175 135 Updating rt-setup-database to take acl and schema file names + on the commandline + 181 136 Refactored Users::WhoHaveRight from Chris Audley at Blackrock + 182 137 Download link in ShowTransaction + 185 138 Fix for speedycgi disappearing database connections + 183 139 #2873: Fix for insufficently agressive loop culling + 186 140 Fix for nested email message parsing + 187 141 Split the HasRight ACL query into two parts. It's now two + small and light SQL queries, instead of one big one that + overwhelmed databases + 188 142 Stylistic cleanups for HasRight optimizations + 189 143 Relationship transactions are recorded and displayed more + robustly + 190 144 Bumping the version to 3.0.4pre1 + 191 145 Updated french translation from Blaise Thauvin + 13 146 Bumping to 3.0.4RC1 + 192 147 Attachment display bug fix from autrijus tang + 193 148 Bumping the version to 3.0.4RC2 + 198 149 ShowAttachments had a relative path which hurt extensions + 199 150 README updates to indicate deprecated dependencies + 200 151 Debugging framework cleanup + 201 152 Bumping version to 3.0.4 + + rt.3.0.D152, C201, jesse, Sat Jul 12 02:41:34 2003, Bumping version to 3.0.4 + From: Jesse Vincent + Date: Fri Jul 11 23:35:03 2003 + + none + + rt.3.0.D151, C200, jesse, Sat Jul 12 01:34:41 2003, Debugging framework + cleanup + From: Jesse Vincent + Date: Fri Jul 11 22:31:37 2003 + + none + + rt.3.0.D150, C199, jesse, Sat Jul 12 01:17:57 2003, README updates to indicate + deprecated dependencies + From: Jesse Vincent + Date: Fri Jul 11 22:14:37 2003 + + none + + rt.3.0.D149, C198, leira, Sat Jul 12 01:17:08 2003, ShowAttachments had a + relative path which hurt extensions + From: Linda L. Julien + Date: Wed Jul 9 23:33:21 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D148, C193, jesse, Sat Jul 5 17:34:46 2003, Bumping the version to + 3.0.4RC2 + From: Jesse Vincent + Date: Sat Jul 5 17:22:07 2003 + + none + + rt.3.0.D147, C192, jesse, Sat Jul 5 17:11:25 2003, Attachment display bug fix + from autrijus tang + From: Jesse Vincent + Date: Sat Jul 5 17:09:07 2003 + + none + + rt.3.0.D146, C13, jesse, Fri Jul 4 14:54:43 2003, Bumping to 3.0.4RC1 + From: Jesse Vincent + Date: Fri Jul 4 14:52:56 2003 + + none + + rt.3.0.D145, C191, jesse, Fri Jul 4 14:50:26 2003, Updated french translation + from Blaise Thauvin + From: Jesse Vincent + Date: Fri Jul 4 14:48:56 2003 + + none + + rt.3.0.D144, C190, jesse, Thu Jul 3 01:48:45 2003, Bumping the version to + 3.0.4pre1 + From: Jesse Vincent + Date: Thu Jul 3 01:47:25 2003 + + none + + rt.3.0.D143, C189, jesse, Thu Jul 3 01:44:51 2003, Relationship transactions + are recorded and displayed more robustly + From: Jesse Vincent + Date: Thu Jul 3 01:44:08 2003 + + none + + rt.3.0.D142, C188, jesse, Wed Jul 2 21:01:44 2003, Stylistic cleanups for + HasRight optimizations + From: Jesse Vincent + Date: Wed Jul 2 20:58:51 2003 + + none + + rt.3.0.D141, C187, jesse, Wed Jul 2 02:48:21 2003, Split the HasRight ACL + query into two parts. It's now two small and light SQL queries, instead of one + big one that overwhelmed databases + From: Jesse Vincent + Date: Wed Jul 2 02:45:49 2003 + + none + + rt.3.0.D140, C186, jesse, Wed Jul 2 02:19:47 2003, Fix for nested email + message parsing + From: Jesse Vincent + Date: Wed Jul 2 02:17:38 2003 + + none + + rt.3.0.D139, C183, jesse, Tue Jul 1 23:18:28 2003, #2873: Fix for + insufficently agressive loop culling + From: Jesse Vincent + Date: Mon Jun 30 21:12:50 2003 + + none + + rt.3.0.D138, C185, jesse, Tue Jul 1 19:08:47 2003, Fix for speedycgi + disappearing database connections + From: Jesse Vincent + Date: Tue Jul 1 19:05:19 2003 + + none + + rt.3.0.D137, C182, leira, Tue Jul 1 16:10:33 2003, Download link in + ShowTransaction + From: Linda L. Julien + Date: Mon Jun 30 18:04:52 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D136, C181, jesse, Mon Jun 30 15:25:46 2003, Refactored + Users::WhoHaveRight from Chris Audley at Blackrock + From: Jesse Vincent + Date: Mon Jun 30 15:23:18 2003 + + none + + rt.3.0.D135, C175, jesse, Mon Jun 30 15:24:56 2003, Updating rt-setup-database + to take acl and schema file names on the commandline + From: Jesse Vincent + Date: Mon Jun 30 13:41:12 2003 + + none + + rt.3.0.D134, C180, leira, Mon Jun 30 02:19:05 2003, use RTIR callbacks + From: Linda Julien + Date: Mon Jun 30 02:11:25 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D133, C173, leira, Mon Jun 30 02:17:05 2003, ShowMessageHeaders; make + headers clicky + From: Linda Julien + Date: Sun Jun 29 23:31:39 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D132, C179, jesse, Sun Jun 29 03:06:36 2003, #2847: allow URI Resolver + to render itself + From: Jesse Vincent + Date: Sun Jun 29 03:04:30 2003 + + none + + rt.3.0.D131, C178, jesse, Sun Jun 29 02:59:13 2003, #2843 Date relations were + too strict in RT::Tickets searches + From: Jesse Vincent + Date: Sun Jun 29 02:57:53 2003 + + none + + rt.3.0.D130, C177, jesse, Sat Jun 28 18:17:28 2003, UTF8, Custom Field and + text message rendering fixes from ourinternet + From: Jesse Vincent + Date: Sat Jun 28 18:15:09 2003 + + none + + rt.3.0.D129, C176, jesse, Sat Jun 28 17:23:01 2003, Applying POD patches from + ourinternet (clone of 3.0.C173) + From: Jesse Vincent + Date: Sat Jun 28 17:15:38 2003 + + none + + rt.3.0.D128, C172, jesse, Sat Jun 28 17:17:53 2003, Fixing postgres sortorder + bug unmased by searchbuilder fix + From: Jesse Vincent + Date: Fri Jun 27 01:12:13 2003 + + none + + rt.3.0.D127, C171, jesse, Tue Jun 24 16:42:07 2003, Ticket Update.html fix to + not doubly load content + From: Jesse Vincent + Date: Tue Jun 24 16:28:49 2003 + + none + + rt.3.0.D126, C170, jesse, Tue Jun 24 16:23:49 2003, I18N mail testing was was + being cavalier with the state of acls after its testing. (clone of 3.0.C167) + From: Jesse Vincent + Date: Tue Jun 24 16:22:16 2003 + + none + + rt.3.0.D125, C169, jesse, Tue Jun 24 16:23:37 2003, CustomField rights + checking was overly restrictive for users without queue-specific rights + From: Jesse Vincent + Date: Tue Jun 24 16:18:05 2003 + + none + + rt.3.0.D124, C168, jesse, Sat Jun 21 13:01:18 2003, Scrip data updates weren't + propagating to parent Ticket objects; Bumping to 3.0.3 + From: Jesse Vincent + Date: Sat Jun 21 12:55:04 2003 + + none + + rt.3.0.D123, C167, jesse, Thu Jun 19 22:23:01 2003, #2850 - With some + configurations, users could not create new tickets with 'new' requestors - + Bumped to 3.0 RC 4 + From: Jesse Vincent + Date: Thu Jun 19 22:22:20 2003 + + none + + rt.3.0.D122, C166, jesse, Thu Jun 19 14:25:03 2003, Bumping version to 3.0rc3 + From: Jesse Vincent + Date: Thu Jun 19 14:18:19 2003 + + none + + rt.3.0.D121, C165, jesse, Thu Jun 19 12:25:20 2003, Better handling of + malformed email messages + From: Jesse Vincent + Date: Thu Jun 19 12:21:56 2003 + + none + + rt.3.0.D120, C163, jesse, Thu Jun 19 03:17:20 2003, Anonymizing addresses in + mitya's submitted testcases + From: Jesse Vincent + Date: Thu Jun 19 03:16:47 2003 + + none + + rt.3.0.D119, C162, jesse, Thu Jun 19 03:03:16 2003, Bumping to 3.0.3rc2 + From: Jesse Vincent + Date: Thu Jun 19 03:01:10 2003 + + none + + rt.3.0.D118, C161, jesse, Thu Jun 19 02:58:24 2003, Mitya's failing processing + of html email + From: Jesse Vincent + Date: Thu Jun 19 02:56:48 2003 + + none + + rt.3.0.D117, C160, jesse, Wed Jun 18 17:58:34 2003, Another shot at the header + encoding fix + From: Jesse Vincent + Date: Wed Jun 18 17:58:01 2003 + + none + + rt.3.0.D116, C159, jesse, Wed Jun 18 01:27:03 2003, Bumping version to RC-1 + From: Jesse Vincent + Date: Wed Jun 18 01:25:13 2003 + + none + + rt.3.0.D115, C158, jesse, Wed Jun 18 01:01:22 2003, More I18N fixes from + ourinternet + From: Jesse Vincent + Date: Wed Jun 18 01:00:11 2003 + + none + + rt.3.0.D114, C157, jesse, Tue Jun 17 22:24:03 2003, Bumping to 3.0.3pre5 + From: Jesse Vincent + Date: Tue Jun 17 22:20:51 2003 + + none + + rt.3.0.D113, C156, jesse, Tue Jun 17 22:14:35 2003, better handle notification + messages containing only text/html content. + From: Jesse Vincent + Date: Tue Jun 17 21:55:06 2003 + + none + + rt.3.0.D112, C155, jesse, Tue Jun 17 21:55:16 2003, Better encoding and error + checking for message headers + From: Jesse Vincent + Date: Tue Jun 17 21:26:27 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D111, C153, leira, Tue Jun 17 17:47:18 2003, SystemInternal group ACLs + in setup + From: Linda L. Julien + Date: Tue Jun 17 18:19:58 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D110, C152, leira, Tue Jun 17 16:46:34 2003, ShowRequestor takes path + From: Linda L. Julien + Date: Tue Jun 17 12:53:35 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D109, C151, jesse, Mon Jun 16 23:48:53 2003, #2797 Clean up automatich + chmodding on installation + From: Jesse Vincent + Date: Mon Jun 16 23:48:19 2003 + + none + + rt.3.0.D108, C150, jesse, Mon Jun 16 23:36:29 2003, #2799: Display URIs + instead of HREFs in ticket display + From: Jesse Vincent + Date: Mon Jun 16 23:35:00 2003 + + none + + rt.3.0.D107, C139, jesse, Mon Jun 16 23:16:45 2003, #2816 new callback to + ShowLinks + From: Jesse Vincent + Date: Mon Jun 16 23:14:05 2003 + + none + + rt.3.0.D106, C138, jesse, Mon Jun 16 23:16:29 2003, Importing minor bugfixes + from ourinternet + From: Jesse Vincent + Date: Mon Jun 16 23:06:00 2003 + + none + + rt.3.0.D105, C137, jesse, Mon Jun 16 19:41:13 2003, #2813 Duplicate tickets + created at the same time could cause a user creation race condition + From: Jesse Vincent + Date: Mon Jun 16 19:39:57 2003 + + none + + rt.3.0.D104, C136, jesse, Fri Jun 13 18:27:11 2003, Bumping version to RT + 3.0.3pre4 + From: Jesse Vincent + Date: Fri Jun 13 18:25:57 2003 + + none + + rt.3.0.D103, C135, jesse, Fri Jun 13 18:22:33 2003, Efficiency tweaks for + WhoHaveRight + From: Jesse Vincent + Date: Fri Jun 13 18:19:02 2003 + + none + + rt.3.0.D102, C133, jesse, Fri Jun 13 18:18:32 2003, On postgres, RT didn't + previously cope well with multipart messages including non-plain parts + containing non-ascii + From: Jesse Vincent + Date: Fri Jun 13 18:17:37 2003 + + none + + rt.3.0.D101, C132, jesse, Fri Jun 13 01:41:24 2003, #2776 - 'new' ACL cache + had bad behaviour. rolled back to older cache and added tests + From: Jesse Vincent + Date: Fri Jun 13 01:40:26 2003 + + none + + rt.3.0.D100, C131, jesse, Thu Jun 12 13:22:10 2003, Fixing search navigation + links (they were made to disappear) + From: Jesse Vincent + Date: Thu Jun 12 13:19:37 2003 + + none + + rt.3.0.D099, C130, jesse, Wed Jun 11 16:44:16 2003, Attempting to be smarter + about guessing encodings for outgoing mail + From: Jesse Vincent + Date: Wed Jun 11 16:42:50 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D098, C127, jesse, Wed Jun 11 16:39:39 2003, Fixes the cascading style + sheet to properly reference message bodies + From: Jesse Vincent + Date: Wed Jun 11 15:43:39 2003 + Warning: the original change was in the 'being_developed' state + + rt.3.0.D097, C128, jesse, Wed Jun 11 16:37:38 2003, #2605 - SpamAssassin + Filter returns the wrong codes on success/failure + From: Jesse Vincent + Date: Wed Jun 11 15:53:58 2003 + + none + + rt.3.0.D096, C129, jesse, Wed Jun 11 16:36:53 2003, Various fixes from a pull- + up of the ourinternet branch + From: Jesse Vincent + Date: Wed Jun 11 16:17:44 2003 + + none + + rt.3.0.D095, C126, jesse, Tue Jun 10 16:17:50 2003, Really bumping the version + to 3.0.3pre3 + From: Jesse Vincent + Date: Tue Jun 10 16:17:08 2003 + + none + + rt.3.0.D094, C122, jesse, Tue Jun 10 15:58:32 2003, Bumping version to + 3.0.3pre3, bumping searchbuilder dependency + From: Jesse Vincent + Date: Tue Jun 10 15:56:41 2003 + + none + + rt.3.0.D093, C125, jesse, Tue Jun 10 15:54:52 2003, add TakeTicket, + StealTicket rights + From: Jesse Vincent + Date: Tue Jun 10 15:41:43 2003 + Warning: the original change was in the 'being_developed' state + + From: Jesse + Date: Tue Jun 10 11:01:04 2003 + Warning: the original change was in the 'being_reviewed' state + + From: Linda L. Julien + Date: Tue Jun 10 11:58:03 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D092, C123, leira, Tue Jun 10 15:54:10 2003, support group & queue acl + setting from rt-setup-database + From: Linda L. Julien + Date: Tue Jun 10 14:13:46 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D091, C121, jesse, Sun Jun 8 00:41:47 2003, Fixes for: Bogus message + headers containing high-bit characters; database handle reconnections; + postgres test suite failures + From: Jesse Vincent + Date: Sun Jun 8 00:32:40 2003 + + none + + rt.3.0.D090, C120, leira, Sun Jun 8 00:34:40 2003, Header & Logout take URL + From: Linda L. Julien + Date: Fri Jun 6 19:06:41 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D089, C119, jesse, Fri Jun 6 17:33:37 2003, #2721 - 'id' attribute had + mixed casing. this bothers certain databases (Sybase) + From: Jesse Vincent + Date: Fri Jun 6 17:32:16 2003 + + none + + rt.3.0.D088, C118, jesse, Wed Jun 4 17:21:24 2003, Bump to 3.0.3pre2; fix a + misspelled right in Queue.pm (#2686) + From: Jesse Vincent + Date: Wed Jun 4 17:19:39 2003 + Warning: the original change was in the 'being_developed' state + + The "rt" program, branch 3.0. + + rt.3.0.D087, C116, jesse, Wed Jun 4 17:17:08 2003, Better testing for + internationalization of outoging messages; slight refactoring to SendEmail to + be more testable; added missing deps to EmailParser + From: Jesse Vincent + Date: Wed Jun 4 16:53:07 2003 + + none + + rt.3.0.D086, C117, leira, Wed Jun 4 00:23:20 2003, pass title to Header + From: Linda L. Julien + Date: Tue Jun 3 18:09:39 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D085, C115, jesse, Tue Jun 3 00:45:12 2003, The "rt" program, branch + 3.0. + From: Jesse Vincent + Date: Tue Jun 3 00:43:15 2003 + Warning: the original change was in the 'being_developed' state + + The "rt" program, branch 3.0. + + rt.3.0.D084, C113, jesse, Tue Jun 3 00:20:07 2003, Bumping + DBIx::SearchBuilder requirement to 0.84 + From: Jesse Vincent + Date: Tue Jun 3 00:19:50 2003 + + none + + rt.3.0.D083, C112, jesse, Tue Jun 3 00:18:43 2003, #2678 Fixing crit messages + in RT::User + From: Jesse Vincent + Date: Tue Jun 3 00:18:12 2003 + + none + + rt.3.0.D082, C111, jesse, Tue Jun 3 00:04:45 2003, Fixing an acl bug in + Principal_Overlay introduced after 3.0.2 and a possible 'Deep' transaction + issue. now requires DBIx::SearchBuilder 0.83_05 or newer + From: Jesse Vincent + Date: Tue Jun 3 00:02:23 2003 + + none + + rt.3.0.D081, C110, jesse, Mon Jun 2 22:40:34 2003, ACL cache made postgres + safe + From: Jesse Vincent + Date: Mon Jun 2 22:39:03 2003 + + none + + rt.3.0.D080, C109, leira, Mon Jun 2 17:10:05 2003, CF defaults; fix Starts + set + From: Linda L. Julien + Date: Mon Jun 2 17:32:11 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D079, C108, jesse, Sat May 31 00:28:37 2003, Log path enhancment to + deal more gracefully with absolutely specified logfile paths + From: Jesse Vincent + Date: Sat May 31 00:27:38 2003 + + none + + rt.3.0.D078, C107, jesse, Sat May 31 00:20:53 2003, Continued performance + improvements for caching + From: Jesse Vincent + Date: Sat May 31 00:19:32 2003 + + none + + rt.3.0.D077, C106, jesse, Sat May 31 00:20:32 2003, fix for FastCGI and + SpeedyCGI setgidness with weird environments + From: Jesse Vincent + Date: Sat May 31 00:19:15 2003 + + none + + rt.3.0.D076, C105, jesse, Fri May 30 16:21:14 2003, #2658 Cosmetic issue with + Scrip menu listing + From: Jesse Vincent + Date: Fri May 30 16:14:02 2003 + + none + + rt.3.0.D075, C103, jesse, Fri May 30 16:20:57 2003, #2652 - de.po updates + From: Jesse Vincent + Date: Fri May 30 15:57:44 2003 + + none + + rt.3.0.D074, C102, jesse, Fri May 30 16:18:57 2003, #2657 Web UI Scrip + creation bug + From: Jesse Vincent + Date: Fri May 30 15:50:16 2003 + + none + + rt.3.0.D073, C101, jesse, Fri May 30 16:17:43 2003, #2662 Fixing an overly + restrictive ACL check on group creation + From: Jesse Vincent + Date: Fri May 30 15:46:22 2003 + + none + + rt.3.0.D072, C100, leira, Fri May 30 16:17:05 2003, update layout fix + From: Linda L. Julien + Date: Thu May 29 14:30:01 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D071, C99, jesse, Wed May 28 17:54:48 2003, Bumping the version to + 3.0.3pre1 + From: Jesse Vincent + Date: Wed May 28 17:52:51 2003 + + none + + rt.3.0.D070, C98, jesse, Wed May 28 17:54:40 2003, Further UTF8-fixed from + autrijus + From: Jesse Vincent + Date: Wed May 28 17:49:32 2003 + + none + + rt.3.0.D069, C97, jesse, Wed May 28 17:07:10 2003, A fix to Tickets_Overlay.pm + to make the 'Count' methods actually do a count, not a full SELECT + From: Jesse Vincent + Date: Wed May 28 17:04:50 2003 + + none + + rt.3.0.D068, C96, jesse, Wed May 28 17:06:43 2003, ACL HasRight system + replaced with an algorithm that does more looking ahead + From: Jesse Vincent + Date: Wed May 28 16:36:10 2003 + + none + + rt.3.0.D067, C95, jesse, Tue May 27 13:22:19 2003, Merge from ourinternet: + UTF8 fixes; more configurable apache sessions; + From: Jesse Vincent + Date: Tue May 27 13:07:41 2003 + + none + + rt.3.0.D066, C93, jesse, Sat May 24 18:05:36 2003, Additional work on the + SQLite port + From: Jesse Vincent + Date: Sat May 24 18:04:50 2003 + + none + + rt.3.0.D065, C92, jesse, Fri May 23 16:45:23 2003, MIME::Words encoding fixes + for mail sending + From: Jesse Vincent + Date: Fri May 23 16:44:28 2003 + + none + + rt.3.0.D064, C91, jesse, Fri May 23 16:12:26 2003, Fixing an upgrade bug from + 3.0.2->3.0.3 + From: Jesse Vincent + Date: Fri May 23 15:57:50 2003 + + none + + rt.3.0.D063, C90, jesse, Fri May 23 15:27:47 2003, Merging utf8 fixes from + autrijus tang + From: Jesse Vincent + Date: Fri May 23 15:25:23 2003 + + none + + rt.3.0.D062, C89, jesse, Wed May 21 00:58:34 2003, #2603: /opt/rt3/share/doc + should not be a file. + From: Jesse Vincent + Date: Wed May 21 00:29:55 2003 + + none + + rt.3.0.D061, C88, jesse, Wed May 21 00:57:45 2003, Fix to honor '$LogDir' for + LogToFile + From: Jesse Vincent + Date: Wed May 21 00:17:18 2003 + + none + + rt.3.0.D060, C14, jesse, Wed May 21 00:56:31 2003, #2539: Re: [rt-users] + unexpected usage: change sort order with column headers in search window + From: Jesse Vincent + Date: Tue May 20 23:19:46 2003 + + none + + rt.3.0.D059, C87, jesse, Wed May 21 00:55:08 2003, Including norwegian bokmal + translation + From: Jesse Vincent + Date: Tue May 20 23:05:17 2003 + + none + + rt.3.0.D058, C86, jesse, Wed May 21 00:54:06 2003, Fix for #2602 - make test + fails on _Config.pm + From: Jesse Vincent + Date: Tue May 20 22:32:52 2003 + + none + + rt.3.0.D057, C85, leira, Tue May 20 12:15:11 2003, Robert's updated search + stuff + From: Linda L. Julien + Date: Mon May 19 18:19:14 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D056, C83, jesse, Sat May 17 17:34:32 2003, merge from ourinternet; one + CreateTickets fix and some utf8 updates + From: Jesse Vincent + Date: Sat May 17 17:31:43 2003 + + none + + rt.3.0.D055, C82, jesse, Mon May 12 20:30:45 2003, Bumping the version to RT + 3.0.2 + From: Jesse Vincent + Date: Tue May 13 02:29:44 2003 + + none + + rt.3.0.D054, C81, jesse, Wed May 7 09:18:28 2003, Bumping the version to + 3.0.2pre6 + From: Jesse Vincent + Date: Wed May 7 15:16:55 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D053, C80, jesse, Wed May 7 09:02:24 2003, Importing utf8 fixes, _ + Vendor overlay support from ourinternet + From: Jesse Vincent + Date: Wed May 7 14:52:58 2003 + + none + + rt.3.0.D052, C79, jesse, Wed May 7 07:05:14 2003, Cleaning up RT tag + processing + From: Jesse Vincent + Date: Wed May 7 13:04:17 2003 + + none + + rt.3.0.D051, C78, jesse, Wed May 7 07:03:27 2003, More performance work on + WhoHaveRight; removing an extra join + From: Jesse Vincent + Date: Wed May 7 13:00:43 2003 + + none + + rt.3.0.D050, C77, jesse, Fri May 2 11:23:23 2003, Fixing bogus anchor tags + From: Jesse Vincent + Date: Fri May 2 17:19:54 2003 + + none + + rt.3.0.D049, C76, jesse, Fri May 2 10:26:30 2003, [#2437] + CanonicalizeEmailAddress fixes; [# 2449] html fixes for right editing; [# + 2457] email addresses weren't always being canonicalized + From: Jesse Vincent + Date: Fri May 2 16:24:40 2003 + + none + + rt.3.0.D048, C75, jesse, Fri May 2 08:35:38 2003, bumped version to + 3.0.2pre5; attachments performance fixes; utf-8 mailgateway fixes; more + extension hooks; template updates for approvals + From: Jesse Vincent + Date: Fri May 2 14:32:57 2003 + + none + + rt.3.0.D047, C73, jesse, Sun Apr 27 19:06:46 2003, I18N patches from autrijus; + bouncing to 3.0.2pre4 + From: Jesse Vincent + Date: Mon Apr 28 01:02:18 2003 + + none + + rt.3.0.D046, C72, leira, Sun Apr 27 19:06:04 2003, bulk links + From: Linda L. Julien + Date: Thu Apr 24 01:23:01 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D045, C71, jesse, Sat Apr 19 03:42:39 2003, Another go at fixing the + ARRAY() issue; bumping to 3.0.2pre3 + From: Jesse Vincent + Date: Sat Apr 19 08:39:19 2003 + + none + + rt.3.0.D044, C70, jesse, Fri Apr 18 16:37:00 2003, fixing utf8 tainting issue + in autohandler; bumped to 3.0.2pre2 + From: Jesse Vincent + Date: Fri Apr 18 21:32:04 2003 + + none + + rt.3.0.D043, C69, leira, Thu Apr 17 18:51:41 2003, make ids clicky + From: Linda L. Julien + Date: Thu Apr 17 18:31:40 2003 + Warning: the original change was in the 'awaiting_integration' state + + none + + rt.3.0.D042, C68, jesse, Thu Apr 17 18:39:54 2003, Bumping to 3.0.2pre1 + From: Jesse Vincent + Date: Thu Apr 17 23:37:59 2003 + + none + + rt.3.0.D041, C67, jesse, Thu Apr 17 18:33:15 2003, updating autrijus' + autohandler patch. seems to break lots of stuff + From: Jesse Vincent + Date: Thu Apr 17 23:21:02 2003 + + none + + rt.3.0.D040, C66, jesse, Thu Apr 17 18:32:24 2003, Quicksearch bug fix from + Stan + From: Jesse Vincent + Date: Thu Apr 17 23:16:58 2003 + + none + + rt.3.0.D039, C65, jesse, Thu Apr 17 18:29:31 2003, Fixing an untainting bug in + 3.0.1 + From: Jesse Vincent + Date: Thu Apr 17 23:15:01 2003 + Warning: the original change was in the 'being_developed' state + + none + + rt.3.0.D038, C63, jesse, Thu Apr 17 04:46:42 2003, Fixing a showmessagestanza + bug found in RTIR + From: Jesse Vincent + Date: Thu Apr 17 09:45:48 2003 + + none + + rt.3.0.D037, C62, jesse, Tue Apr 15 11:53:58 2003, Bumping to version 3.0.1 + From: Jesse Vincent + Date: Tue Apr 15 11:52:00 2003 + + none + + rt.3.0.D036, C61, jesse, Mon Apr 14 18:18:03 2003, New speedycgi support from + vivek khera + From: Jesse Vincent + Date: Mon Apr 14 14:49:49 2003 + + none + + rt.3.0.D035, C60, jesse, Sun Apr 13 21:43:32 2003, SMTP and I18N fixes from + autrijus tang. Updated chinese translations + From: Jesse Vincent + Date: Sun Apr 13 21:32:55 2003 + + none + + rt.3.0.D034, C59, jesse, Fri Apr 11 21:58:36 2003, Bumping to RT 3.0.1pre2 + From: Jesse Vincent + Date: Fri Apr 11 21:58:06 2003 + + none + + rt.3.0.D033, C58, jesse, Fri Apr 11 21:56:11 2003, Better binary attachment + handling fix from autrijus + From: Jesse Vincent + Date: Fri Apr 11 21:52:12 2003 + + none + + rt.3.0.D032, C57, jesse, Fri Apr 11 21:35:17 2003, Testing and fixing binary + attachment corruption + From: Jesse Vincent + Date: Fri Apr 11 21:34:28 2003 + + none + + rt.3.0.D031, C56, jesse, Fri Apr 11 21:34:56 2003, Testing fixes for mail + authentication/authorization + From: Jesse Vincent + Date: Thu Apr 10 00:08:29 2003 + + none + + rt.3.0.D030, C55, jesse, Wed Apr 9 13:55:18 2003, #2365 Removing outdated + Mason setup parameter + From: Jesse Vincent + Date: Wed Apr 9 13:54:43 2003 + + none + + rt.3.0.D029, C53, jesse, Wed Apr 9 13:22:35 2003, Added preliminary left to + right hebrew translation + From: Jesse Vincent + Date: Wed Apr 9 13:18:16 2003 + + none + + rt.3.0.D028, C52, jesse, Fri Apr 4 02:10:01 2003, More I18N testing for + rafael + From: Jesse Vincent + Date: Fri Apr 4 02:08:49 2003 + + none + + rt.3.0.D027, C51, jesse, Thu Apr 3 19:33:34 2003, Changing address used in + example to not send mail to author + From: Jesse Vincent + Date: Thu Apr 3 19:29:02 2003 + Warning: the original change was in the 'being_integrated' state + + none + + rt.3.0.D026, C50, jesse, Thu Apr 3 19:16:37 2003, Integrating rafael's + failing test suite and proposed fix from autrijus + From: Jesse Vincent + Date: Thu Apr 3 19:15:03 2003 + + none + + rt.3.0.D025, C39, jesse, Thu Apr 3 19:16:15 2003, Many users should be able + to have a blank address; neew test suite to ensure this + From: Jesse Vincent + Date: Thu Apr 3 13:27:36 2003 + + none + + rt.3.0.D024, C38, jesse, Thu Apr 3 13:30:37 2003, Updates for RT RPC + interface from AMS + From: Jesse Vincent + Date: Wed Apr 2 15:32:15 2003 + + none + + rt.3.0.D023, C36, jesse, Wed Apr 2 14:14:07 2003, Updated Spanish translation + From: Jesse Vincent + Date: Tue Apr 1 14:02:36 2003 + + none + + rt.3.0.D022, C37, jesse, Wed Apr 2 14:13:55 2003, Updated dependencies + From: Jesse Vincent + Date: Wed Apr 2 14:09:41 2003 + + none + + rt.3.0.D021, C35, jesse, Tue Apr 1 13:00:22 2003, New czech translation + From: Jesse Vincent + Date: Tue Apr 1 12:58:57 2003 + + none + + rt.3.0.D020, C33, jesse, Fri Mar 28 14:48:20 2003, A tiny bit of extra data + passing for some callbacks + From: Jesse Vincent + Date: Fri Mar 28 14:43:28 2003 + + none + + rt.3.0.D019, C32, jesse, Fri Mar 28 14:35:10 2003, Added better error checking + for failed ticket creation + From: Jesse Vincent + Date: Fri Mar 28 14:32:52 2003 + + none + + rt.3.0.D018, C31, jesse, Sun Mar 23 17:21:45 2003, Minor fixes - Bumped to + 3.0.0; + 2266 - postgres scrip creation bug + 2267 - Tickets not reopened after being stalled + 2265 - Fixed css nits from blaise + Unreported - Fixed quick-search bug + From: Jesse Vincent + Date: Sun Mar 23 17:17:55 2003 + + none + + rt.3.0.D017, C30, jesse, Thu Mar 20 21:38:30 2003, Bumping to 3.0.0rc4 + From: Jesse Vincent + Date: Thu Mar 20 21:28:01 2003 + + none + + rt.3.0.D016, C29, jesse, Thu Mar 20 21:18:27 2003, RT should now be less + overzealous about opening and then marking a ticket 'new' again + From: Jesse Vincent + Date: Thu Mar 20 21:14:47 2003 + + none + + rt.3.0.D015, C28, jesse, Thu Mar 20 15:21:49 2003, Further postgres tweaks and + fixes + From: Jesse Vincent + Date: Thu Mar 20 15:20:21 2003 + + none + + rt.3.0.D014, C27, jesse, Thu Mar 20 01:48:42 2003, Postgres schema tweak + From: Jesse Vincent + Date: Thu Mar 20 01:47:20 2003 + + none + + rt.3.0.D013, C26, jesse, Wed Mar 19 21:26:47 2003, Postgres fixes + From: Jesse Vincent + Date: Wed Mar 19 21:26:24 2003 + + none + + rt.3.0.D012, C25, jesse, Wed Mar 19 16:27:29 2003, Brazilian Portuguese + translation + From: Jesse Vincent + Date: Wed Mar 19 16:25:48 2003 + + none + + rt.3.0.D011, C23, jesse, Wed Mar 19 13:03:15 2003, New french translation + From: Jesse Vincent + Date: Wed Mar 19 13:02:47 2003 + + none + + rt.3.0.D010, C22, jesse, Wed Mar 19 01:01:24 2003, Bumping to RC3; fixing the + display of 'This user's n highest priority tix' + From: Jesse Vincent + Date: Wed Mar 19 01:00:33 2003 + + none + + rt.3.0.D009, C20, jesse, Wed Mar 19 00:46:17 2003, finishing the notify stuff + From: Jesse Vincent + Date: Wed Mar 19 00:45:09 2003 + + none + + rt.3.0.D008, C19, jesse, Wed Mar 19 00:40:45 2003, Caving in to the masses and + making 'notify sender' configurable + From: Jesse Vincent + Date: Wed Mar 19 00:38:50 2003 + + none + + rt.3.0.D007, C18, jesse, Tue Mar 18 16:29:45 2003, More performance work; + backing out 'enhancements' that killed system performance + From: Jesse Vincent + Date: Tue Mar 18 16:26:07 2003 + + none + + rt.3.0.D006, C17, jesse, Tue Mar 18 11:29:28 2003, fixing fastcgi's ability to + load webmux.pl on some platforms + From: Jesse Vincent + Date: Tue Mar 18 11:28:11 2003 + + none + + rt.3.0.D005, C12, jesse, Tue Mar 18 00:58:52 2003, fixing indices for postgres + From: Jesse Vincent + Date: Tue Mar 18 00:53:06 2003 + + none + + rt.3.0.D004, C16, jesse, Tue Mar 18 00:41:26 2003, Performance work on + 'WhoHaveRight'; bumping to 3.0.0rc2 + From: Jesse Vincent + Date: Tue Mar 18 00:37:30 2003 + + none + + rt.3.0.D003, C15, jesse, Fri Mar 14 17:07:28 2003, removing the old REST API + From: Jesse Vincent + Date: Fri Mar 14 16:50:38 2003 + + none + + rt.3.0.D002, C11, jesse, Fri Mar 14 16:42:46 2003, Minor CSS update. rollback + fix; new database indices; copyright update + From: Jesse Vincent + Date: Fri Mar 14 16:35:01 2003 + + none + + rt.3.0.D001, C10, jesse, Fri Mar 14 01:26:22 2003, Bumping the version to + rt.3.0.0rc0 + From: Jesse Vincent + Date: Fri Mar 14 01:25:51 2003 + + none diff --git a/rt/HOWTO/README b/rt/HOWTO/README new file mode 100644 index 000000000..942096b0a --- /dev/null +++ b/rt/HOWTO/README @@ -0,0 +1,14 @@ +Here you'll find plain text documentation of how to handle various +project procedures. Files contained herein: + +change.txt + How changes are integrated, including generating and + distributing aedist change sets, and updating the CVS repository. + +release.txt + Steps to go through when releasing a new version of RT. + + +These procedures are based on documentation from the scons project +as http://www.scons.org/ + diff --git a/rt/HOWTO/change.txt b/rt/HOWTO/change.txt new file mode 100644 index 000000000..de316450c --- /dev/null +++ b/rt/HOWTO/change.txt @@ -0,0 +1,67 @@ +Handling a change set: + + -- Start the change: + + aedist -r [if it's a remote submission] + + -or- + + aedb {cnum} [if it's initiated locally] + + -- Normal development cycle: + + aecd -c {cnum} + aecp . # Copy the baseline to your working dir + # work on your change + aenf {new file names} + + aecpu -unch # Remove unchanged files, for faster diffs + aeb # Currently does nothing + aet # Currently does nothing + aed # Diff your change + aede # End the change + + -- As the reviewer: + + aerpass {cnum} + + -- As the integrator: + + aeib {cnum} + aeb + aet + aed + cd ~ # Get out of the current working directory + aeipass + + + + + -- Update the aedist baseline on the web site: + + aedist -s -bl -p rt.2.1 > rt.2.1.ae + scp rt.2.1.ae jesse@fsck.com:/home/ftp/pub/rt/devel/rt.2.1.ae + rm rt.2.1.ae + + [This will eventually be automated.] + + -- Distribute the change to CVS: + + WARNING. DOES NOT YET WORK + + export CVS_RSH=ssh + ae2cvs -n -aegis -p rt.2.1 -c {cnum} -u ~/SCons/scons + ae2cvs -X -aegis -p rt.2.1 -c {cnum} -u ~/SCons/scons + + If you need the "ae2cvs" Perl script, you can find a copy + checked in to the bin/subdirectory. + + [This may eventually be automated.] + + + + -- Grabbing the latest dev sources over ssh + + ssh fsck.com "aedist -s -p rt.2.1 -naa -bl -entire-source" | aedist -r + + diff --git a/rt/HOWTO/release.txt b/rt/HOWTO/release.txt new file mode 100644 index 000000000..285041c5b --- /dev/null +++ b/rt/HOWTO/release.txt @@ -0,0 +1,124 @@ +Things to do to release a new version of rt: + + Build and test candidate packages + + Read through the README and src/README.txt files for any updates + + Prepare ChangeLog + + date -R the latest release + + should be current if this has been updated as each + change went in. + + [ Should be automated ] + + + TODO: nothing below this line is accurate for RT + + END THE BRANCH + + ae_p rt.2 + aede {5} + aerpass {5} + aeib {5} + aeb + aet + aet -reg + aed + aeipass + + START THE NEW BRANCH + + aenbr -p rt.2 {6} + aenc -p rt.2.{6} + + Call it something like, "Initialize the new + branch." Cause = internal_enhancement. Exempt + it from all tests (*_exempt = true). + + ae_p rt.2.{6} + + aedb 100 + + aecd + + # Change the hard-coded package version numbers + # in the following files. + aecp rttruct debian/changelog rpm/rt.spec + + vi rttruct debian/changelog rpm/rt.spec + + # Optionally, do the same in the following: + [optional] aecp HOWTO/change.txt + [optional] aecp HOWTO/release.txt + [optional] aecp debian/rt.postinst + + [optional] vi HOWTO/change.txt + [optional] vi HOWTO/release.txt + [optional] vi debian/rt.postinst + + aeb + + aet -reg + + aed + + aede + + etc. + + + Read through the FAQ for any updates + + Test downloading from the web site download page + + + In the Bugs Tracker, add a Group for the new release (0.05) + + Announce to the following mailing lists (template below): + + rt-announce@lists.fsck.com + + + Notify www.cmtoday.com/contribute.html + + [This guy wants an announcement no more frequently than + once a month, so save it for a future release if it's + been too soon since the previous one.] + + Notify freshmeat.net + + [Wait until the morning so the announcement hits the + main freshmeat.net page while people in the U.S. are + awake and working] + + + + +======================= + +Template release announcement: + + + +Version 2.1.XXX of rt has been released and is available for download +from the rt web site: + + http://bestpractical.com/rt/ + + + +WHAT'S NEW IN THIS RELEASE? + +Version 2.1.XXX of rt contains the following important changes: + + - XXX + +For a complete list of changes in version 2.1.XXX, see the CHANGES.txt +file in the release itself. + + +WHAT IS RT? + + FILL THIS IN diff --git a/rt/HOWTO/version-control.txt b/rt/HOWTO/version-control.txt new file mode 100644 index 000000000..06babfdf1 --- /dev/null +++ b/rt/HOWTO/version-control.txt @@ -0,0 +1,41 @@ +Using Aegis for RT development + + 1. The main line of RT development will be under the control + of the Aegis change management system, as administered by + Best Practical Solutions, LLC + + 2. We will use aedist to generate change sets for each change + checked in to the main Aegis repository. These change sets will be + either distributed by a mailing list or made available via the web, + or both. + + 3. Remote developers using Aegis will send aedist output for + their changes to rt-patches@bestpractical.com for review and + integration. + + 4. The aedist output should be sent to rt-patches@bestpractical.com + after the change has completed its local aede, but before aerpass. + + 5. If the change is rejected, the developer can aedeu to reopen + the change and fix whatever problems caused the review to not pass. + + 6. A baseline snapshot (aedist -bl) of the main Aegis repository + will be generated at least daily and made available via http + to provide a central location for synchronizing remote Aegis + repositories. + + 7. Changes to the main Aegis repository will also be propagated + automatically to the tracking CVS repository. + +Using CVS for RT development + + 1. CVS is accessed via anonymous cvs with the following CVSROOT: + + :pserver:anoncvs@cvs.fsck.com:/raid/cvsroot/rt-2-1 + + 2. Remote developers using CVS will send patches (cvs -diff + output) to rt-patches@bestpractical.com for integration into the + main Aegis repository. This allows anonymous CVS access to be used + for RT development by developers who are unable to use Aegis. + + diff --git a/rt/Makefile b/rt/Makefile index fe01b71c1..644722109 100644 --- a/rt/Makefile +++ b/rt/Makefile @@ -1,18 +1,49 @@ -# $Header: /home/cvs/cvsroot/freeside/rt/Makefile,v 1.1 2002-08-12 06:17:06 ivan Exp $ -# RT is Copyright 1996-2002 Jesse Vincent -# It is distributed under the terms of the GNU General Public License, version 2 +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2002 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + + +# +# DO NOT HAND-EDIT the file named 'Makefile'. This file is autogenerated. +# Have a look at "configure" and "Makefile.in" instead +# + PERL = /usr/bin/perl -RT_VERSION_MAJOR = 2 -RT_VERSION_MINOR = 0 -RT_VERSION_PATCH = 14 +CONFIG_FILE_PATH = /opt/rt3/etc +CONFIG_FILE = $(CONFIG_FILE_PATH)/RT_Config.pm +SITE_CONFIG_FILE = $(CONFIG_FILE_PATH)/RT_SiteConfig.pm +RT_VERSION_MAJOR = 3 +RT_VERSION_MINOR = 0 +RT_VERSION_PATCH = 4 + RT_VERSION = $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH) TAG = rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH) -BRANCH = HEAD # This is the group that all of the installed files will be chgrp'ed to. RTGROUP = rt @@ -27,7 +58,8 @@ LIBS_OWNER = root # Group that should own all of RT's libraries, generally root. LIBS_GROUP = bin - +WEB_USER = www +WEB_GROUP = www # {{{ Files and directories @@ -37,33 +69,22 @@ LIBS_GROUP = bin DESTDIR = -# RT_PATH is the name of the directory you want make to install RT in -# RT must be installed in its own directory (don't set this to /usr/local) - -RT_PATH = /opt/rt2 - -# The rest of these paths are all configurable, but you probably don't want to -# put them elsewhere - -RT_LIB_PATH = $(RT_PATH)/lib -RT_ETC_PATH = $(RT_PATH)/etc -RT_CONFIG_PATH = $(RT_ETC_PATH) -RT_BIN_PATH = $(RT_PATH)/bin -RT_MAN_PATH = $(RT_PATH)/man -MASON_HTML_PATH = $(RT_PATH)/WebRT/html - - -# RT allows sites to overlay the default web ui with -# local customizations Those files can be placed in MASON_LOCAL_HTML_PATH - -MASON_LOCAL_HTML_PATH = $(RT_PATH)/local/WebRT/html - -# RT needs to be able to write to MASON_DATA_PATH and MASON_SESSION_PATH -# RT will create and chown these directories. Don't just set them to /tmp -MASON_DATA_PATH = $(RT_PATH)/WebRT/data -MASON_SESSION_PATH = $(RT_PATH)/WebRT/sessiondata - -RT_LOG_PATH = /tmp +RT_PATH = /opt/rt3 +RT_ETC_PATH = /opt/rt3/etc +RT_BIN_PATH = /opt/rt3/bin +RT_SBIN_PATH = /opt/rt3/sbin +RT_LIB_PATH = /opt/rt3/lib +RT_MAN_PATH = /opt/rt3/man +RT_VAR_PATH = /opt/rt3/var +RT_DOC_PATH = /opt/rt3/share/doc +RT_LOCAL_PATH = /opt/rt3/local +LOCAL_ETC_PATH = /opt/rt3/local/etc +LOCAL_LEXICON_PATH = /opt/rt3/local/po +MASON_HTML_PATH = /opt/rt3/share/html +MASON_LOCAL_HTML_PATH = /opt/rt3/local/html +MASON_DATA_PATH = /opt/rt3/var/mason_data +MASON_SESSION_PATH = /opt/rt3/var/session_data +RT_LOG_PATH = /opt/rt3/var/log # RT_READABLE_DIR_MODE is the mode of directories that are generally meant # to be accessable @@ -71,25 +92,33 @@ RT_READABLE_DIR_MODE = 0755 -# The location of your rt configuration file -RT_CONFIG = $(RT_CONFIG_PATH)/config.pm + +# {{{ all these define the places that RT's binaries should get installed # RT_MODPERL_HANDLER is the mason handler script for mod_perl RT_MODPERL_HANDLER = $(RT_BIN_PATH)/webmux.pl - # RT_FASTCGI_HANDLER is the mason handler script for FastCGI -# THIS HANDLER IS NOT CURRENTLY SUPPORTED RT_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.fcgi +# RT_WIN32_FASTCGI_HANDLER is the mason handler script for FastCGI +RT_WIN32_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.svc +# RT's admin CLI +RT_CLI_ADMIN_BIN = $(RT_BIN_PATH)/rtadmin +# RT's mail gateway +RT_MAILGATE_BIN = $(RT_BIN_PATH)/rt-mailgate +# RT's cron tool +RT_CRON_BIN = $(RT_BIN_PATH)/rt-crontool -# RT_SPEEDYCGI_HANDLER is the mason handler script for SpeedyCGI -# THIS HANDLER IS NOT CURRENTLY SUPPORTED -RT_SPEEDYCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.scgi +# }}} -# The following are the names of the various binaries which make up RT +SETGID_BINARIES = $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ + $(DESTDIR)/$(RT_WIN32_FASTCGI_HANDLER) + +BINARIES = $(DESTDIR)/$(RT_MODPERL_HANDLER) \ + $(DESTDIR)/$(RT_MAILGATE_BIN) \ + $(DESTDIR)/$(RT_CRON_BIN) \ + $(SETGID_BINARIES) +SYSTEM_BINARIES = $(DESTDIR)/$(RT_SBIN_PATH)/ -RT_CLI_BIN = $(RT_BIN_PATH)/rt -RT_CLI_ADMIN_BIN = $(RT_BIN_PATH)/rtadmin -RT_MAILGATE_BIN = $(RT_BIN_PATH)/rt-mailgate # }}} @@ -99,34 +128,19 @@ RT_MAILGATE_BIN = $(RT_BIN_PATH)/rt-mailgate # DB_TYPE defines what sort of database RT trys to talk to # "mysql" is known to work. # "Pg" is known to work -# "Oracle" is in the early stages of working. DB_TYPE = mysql -# DB_HOME is where the Database's commandline tools live. $DB_HOME/bin -# should contain the binaries themselves, e.g. if "which mysql" gives -# "/usr/local/mysql/bin/mysql", $DB_HOME should be "/usr/local/mysql" - -DB_HOME = /usr - # Set DBA to the name of a unix account with the proper permissions and -# environment to run your commandline SQL tools +# environment to run your commandline SQL sbin # Set DB_DBA to the name of a DB user with permission to create new databases -# Set DB_DBA_PASSWORD to that user's password (if you don't, you'll be prompted -# later) # For mysql, you probably want 'root' # For Pg, you probably want 'postgres' # For oracle, you want 'system' DB_DBA = root -DB_DBA_PASSWORD = - -# -# Set this to the Fully Qualified Domain Name of your database server. -# If the database is local, rather than on a remote host, using "localhost" -# will greatly enhance performance. DB_HOST = localhost @@ -136,6 +150,9 @@ DB_HOST = localhost DB_PORT = + + + # # Set this to the canonical name of the interface RT will be talking to the # database on. If you said that the RT_DB_HOST above was "localhost," this @@ -149,81 +166,72 @@ DB_RT_HOST = localhost # set this to the name you want to give to the RT database in # your database server. For Oracle, this should be the name of your sid -DB_DATABASE = rt2 - -# Set this to the name of the rt database user - +DB_DATABASE = rt3 DB_RT_USER = rt_user - -# Set this to the password used by the rt database user -# *** Change This Before Installation*** - DB_RT_PASS = rt_pass # }}} -# {{{ Web configuration - -# The user your webserver runs as. needed so that webrt can cache mason -# objectcode -WEB_USER = www -WEB_GROUP = rt - -# }}} - - -#################################################################### -# No user servicable parts below this line. Frob at your own risk # #################################################################### +all: default + default: @echo "Please read RT's readme before installing. Not doing so could" @echo "be dangerous." -install: dirs initialize.$(DB_TYPE) upgrade insert instruct + instruct: @echo "Congratulations. RT has been installed. " - @echo "You must now configure it by editing $(RT_CONFIG)." - @echo "From here on in, you should refer to the users guide." + @echo "" + @echo "" + @echo "You must now configure RT by editing $(SITE_CONFIG_FILE)." + @echo "" + @echo "(You will definitely need to set RT's database password before continuing." + @echo " Not doing so could be very dangerous)" + @echo "" + @echo "After that, you need to initialize RT's database by running" + @echo " 'make initialize-database'" +# @echo " or by executing " +# @echo " '$(RT_SBIN_PATH)/rt-setup-database --action init \ " +# @echo " --dba $(DB_DBA) --prompt-for-dba-password'" -insert: insert-install - $(PERL) -I$(DESTDIR)/$(RT_ETC_PATH) -I$(DESTDIR)/$(RT_LIB_PATH) $(DESTDIR)/$(RT_ETC_PATH)/insertdata -upgrade: dirs config-replace upgrade-noclobber upgrade-instruct upgrade-instruct: @echo "Congratulations. RT has been upgraded. You should now check-over" - @echo "$(RT_CONFIG) for any necessary site customization. Additionally," + @echo "$(CONFIG_FILE) for any necessary site customization. Additionally," @echo "you should update RT's system database objects by running " - @echo " $(RT_ETC_PATH)/insertdata " - @echo "where is the version of RT you're upgrading from." + @echo " ls etc/upgrade" + @echo "For each file in that directory whose name is greater than" + @echo "your previously installed RT version, run:" + @echo " $(RT_SBIN_PATH)/rt-setup-database --action insert --datafile etc/upgrade/" -upgrade-noclobber: insert-install libs-install html-install bin-install nondestruct -nondestruct: fixperms +upgrade: dirs upgrade-noclobber upgrade-instruct -testdeps: - $(PERL) ./tools/testdeps -warn $(DB_TYPE) +upgrade-noclobber: config-install libs-install html-install bin-install local-install doc-install fixperms -fixdeps: - $(PERL) ./tools/testdeps -fix $(DB_TYPE) +# {{{ dependencies +testdeps: + $(PERL) ./sbin/rt-test-dependencies --with-$(DB_TYPE) +fixdeps: + $(PERL) ./sbin/rt-test-dependencies --install --with-$(DB_TYPE) -all: - @echo "Read the readme." +#}}} +# {{{ fixperms fixperms: # Make the libraries readable - chmod -R $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_PATH) + chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_PATH) chown -R $(LIBS_OWNER) $(DESTDIR)/$(RT_LIB_PATH) chgrp -R $(LIBS_GROUP) $(DESTDIR)/$(RT_LIB_PATH) - - chown -R $(BIN_OWNER) $(DESTDIR)/$(RT_BIN_PATH) - chgrp -R $(RTGROUP) $(DESTDIR)/$(RT_BIN_PATH) + chmod -R u+rwX,go-w,go+rX $(DESTDIR)/$(RT_LIB_PATH) chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_BIN_PATH) @@ -237,36 +245,19 @@ fixperms: chown -R $(BIN_OWNER) $(DESTDIR)/$(RT_ETC_PATH) chgrp -R $(RTGROUP) $(DESTDIR)/$(RT_ETC_PATH) - chmod 0550 $(DESTDIR)/$(RT_CONFIG) + chmod 0550 $(DESTDIR)/$(CONFIG_FILE) + chmod 0550 $(DESTDIR)/$(SITE_CONFIG_FILE) # Make the interfaces executable and setgid rt - chown $(BIN_OWNER) $(DESTDIR)/$(RT_MAILGATE_BIN) \ - $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ - $(DESTDIR)/$(RT_SPEEDYCGI_HANDLER) \ - $(DESTDIR)/$(RT_CLI_BIN) \ - $(DESTDIR)/$(RT_CLI_ADMIN_BIN) - - chgrp $(RTGROUP) $(DESTDIR)/$(RT_MAILGATE_BIN) \ - $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ - $(DESTDIR)/$(RT_SPEEDYCGI_HANDLER) \ - $(DESTDIR)/$(RT_CLI_BIN) \ - $(DESTDIR)/$(RT_CLI_ADMIN_BIN) - - chmod 0755 $(DESTDIR)/$(RT_MAILGATE_BIN) \ - $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ - $(DESTDIR)/$(RT_SPEEDYCGI_HANDLER) \ - $(DESTDIR)/$(RT_CLI_BIN) \ - $(DESTDIR)/$(RT_CLI_ADMIN_BIN) - - chmod g+s $(DESTDIR)/$(RT_MAILGATE_BIN) \ - $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ - $(DESTDIR)/$(RT_SPEEDYCGI_HANDLER) \ - $(DESTDIR)/$(RT_CLI_BIN) \ - $(DESTDIR)/$(RT_CLI_ADMIN_BIN) + chown $(BIN_OWNER) $(BINARIES) + chgrp $(RTGROUP) $(BINARIES) + chmod 0755 $(BINARIES) + chmod g+s $(SETGID_BINARIES) # Make the web ui readable by all. chmod -R u+rwX,go-w,go+rX $(DESTDIR)/$(MASON_HTML_PATH) \ - $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) \ + $(DESTDIR)/$(LOCAL_LEXICON_PATH) chown -R $(LIBS_OWNER) $(DESTDIR)/$(MASON_HTML_PATH) \ $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) chgrp -R $(LIBS_GROUP) $(DESTDIR)/$(MASON_HTML_PATH) \ @@ -279,140 +270,216 @@ fixperms: $(DESTDIR)/$(MASON_SESSION_PATH) chgrp -R $(WEB_GROUP) $(DESTDIR)/$(MASON_DATA_PATH) \ $(DESTDIR)/$(MASON_SESSION_PATH) +# }}} + +fixperms-nosetgid: fixperms + @echo "You should never be running RT this way. it's unsafe" + chmod 0555 $(SETGID_BINARIES) + chmod 0555 $(DESTDIR)/$(CONFIG_FILE) + chmod 0555 $(DESTDIR)/$(SITE_CONFIG_FILE) + +# {{{ dirs dirs: - mkdir -p $(DESTDIR)/$(RT_BIN_PATH) + mkdir -p $(DESTDIR)/$(RT_LOG_PATH) mkdir -p $(DESTDIR)/$(MASON_DATA_PATH) + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/cache + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/etc + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/obj mkdir -p $(DESTDIR)/$(MASON_SESSION_PATH) - mkdir -p $(DESTDIR)/$(RT_ETC_PATH) - mkdir -p $(DESTDIR)/$(RT_LIB_PATH) mkdir -p $(DESTDIR)/$(MASON_HTML_PATH) mkdir -p $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + mkdir -p $(DESTDIR)/$(LOCAL_ETC_PATH) + mkdir -p $(DESTDIR)/$(LOCAL_LEXICON_PATH) +# }}} -libs-install: - [ -d $(DESTDIR)/$(RT_LIB_PATH) ] || mkdir $(DESTDIR)/$(RT_LIB_PATH) - chown -R $(LIBS_OWNER) $(DESTDIR)/$(RT_LIB_PATH) - chgrp -R $(LIBS_GROUP) $(DESTDIR)/$(RT_LIB_PATH) - chmod -R $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_LIB_PATH) - ( cd ./lib; \ - $(PERL) Makefile.PL INSTALLSITELIB=$(DESTDIR)/$(RT_LIB_PATH) \ - INSTALLMAN1DIR=$(DESTDIR)/$(RT_MAN_PATH)/man1 \ - INSTALLMAN3DIR=$(DESTDIR)/$(RT_MAN_PATH)/man3 \ - && make \ - && make test \ - && $(PERL) -p -i -e " s'!!RT_VERSION!!'$(RT_VERSION)'g;" blib/lib/RT.pm ;\ - make install \ - INSTALLSITEMAN1DIR=$(DESTDIR)/$(RT_MAN_PATH)/man1 \ - INSTALLSITEMAN3DIR=$(DESTDIR)/$(RT_MAN_PATH)/man3 \ - ) +install: config-install dirs files-install fixperms instruct -html-install: - cp -rp ./webrt/* $(DESTDIR)/$(MASON_HTML_PATH) +files-install: libs-install etc-install bin-install sbin-install html-install local-install doc-install + +config-install: + mkdir -p $(DESTDIR)/$(CONFIG_FILE_PATH) + cp etc/RT_Config.pm $(DESTDIR)/$(CONFIG_FILE) + [ -f $(DESTDIR)/$(SITE_CONFIG_FILE) ] || cp etc/RT_SiteConfig.pm $(DESTDIR)/$(SITE_CONFIG_FILE) + + chgrp $(RTGROUP) $(DESTDIR)/$(CONFIG_FILE) + chown $(BIN_OWNER) $(DESTDIR)/$(CONFIG_FILE) + chgrp $(RTGROUP) $(DESTDIR)/$(SITE_CONFIG_FILE) + chown $(BIN_OWNER) $(DESTDIR)/$(SITE_CONFIG_FILE) + @echo "Installed configuration. about to install rt in $(RT_PATH)" -genschema: - $(PERL) tools/initdb '$(DB_TYPE)' '$(DB_HOME)' '$(DB_HOST)' '$(DB_PORT)' '$(DB_DBA)' '$(DB_DATABASE)' generate +test: + $(PERL) -Ilib lib/t/00smoke.t +regression-nosetgid-quiet: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl + $(PERL) sbin/regression_harness -initialize.Pg: createdb initdb.dba acls +regression-nosetgid: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl + $(PERL) lib/t/02regression.t -initialize.mysql: createdb acls initdb.rtuser +regression: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods apachectl + $(PERL) lib/t/02regression.t -initialize.Oracle: acls initdb.rtuser +regression-quiet: + $(PERL) sbin/regression_harness -acls: - cp etc/acl.$(DB_TYPE) '$(DESTDIR)/$(RT_ETC_PATH)/acl.$(DB_TYPE)' - $(PERL) -p -i -e " s'!!DB_TYPE!!'"$(DB_TYPE)"'g;\ - s'!!DB_HOST!!'"$(DB_HOST)"'g;\ - s'!!DB_RT_PASS!!'"$(DB_RT_PASS)"'g;\ - s'!!DB_RT_HOST!!'"$(DB_RT_HOST)"'g;\ - s'!!DB_RT_USER!!'"$(DB_RT_USER)"'g;\ - s'!!DB_DATABASE!!'"$(DB_DATABASE)"'g;" $(DESTDIR)/$(RT_ETC_PATH)/acl.$(DB_TYPE) - bin/initacls.$(DB_TYPE) '$(DB_HOME)' '$(DB_HOST)' '$(DB_PORT)' '$(DB_DBA)' '$(DB_DBA_PASSWORD)' '$(DB_DATABASE)' '$(DESTDIR)/$(RT_ETC_PATH)/acl.$(DB_TYPE)' +regression-instruct: + @echo "About to wipe your database for a regression test. ABORT NOW with Control-C" +# {{{ database-installation + +regression-reset-db: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action drop --dba $(DB_DBA) --dba-password '' + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action init --dba $(DB_DBA) --dba-password '' + +initialize-database: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action init --dba $(DB_DBA) --prompt-for-dba-password dropdb: - $(PERL) tools/initdb '$(DB_TYPE)' '$(DB_HOME)' '$(DB_HOST)' '$(DB_PORT)' '$(DB_DBA)' '$(DB_DATABASE)' drop + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action drop --dba $(DB_DBA) --prompt-for-dba-password + +insert-approval-data: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/insert_approval_scrips +# }}} + +# {{{ libs-install +libs-install: + [ -d $(DESTDIR)/$(RT_LIB_PATH) ] || mkdir $(DESTDIR)/$(RT_LIB_PATH) + -cp -rp lib/* $(DESTDIR)/$(RT_LIB_PATH) +# }}} + +# {{{ html-install +html-install: + [ -d $(DESTDIR)/$(MASON_HTML_PATH) ] || mkdir $(DESTDIR)/$(MASON_HTML_PATH) + -cp -rp ./html/* $(DESTDIR)/$(MASON_HTML_PATH) +# }}} + +# {{{ doc-install +doc-install: + # RT 3.0.0 - RT 3.0.2 would accidentally create a file instead of a dir + -[ -f $(DESTDIR)/$(RT_DOC_PATH) ] && rm $(DESTDIR)/$(RT_DOC_PATH) + [ -d $(DESTDIR)/$(RT_DOC_PATH) ] || mkdir $(DESTDIR)/$(RT_DOC_PATH) + -cp -rp ./README $(DESTDIR)/$(RT_DOC_PATH) +# }}} +# {{{ etc-install -createdb: - $(PERL) tools/initdb '$(DB_TYPE)' '$(DB_HOME)' '$(DB_HOST)' '$(DB_PORT)' '$(DB_DBA)' '$(DB_DATABASE)' create -initdb.dba: - $(PERL) tools/initdb '$(DB_TYPE)' '$(DB_HOME)' '$(DB_HOST)' '$(DB_PORT)' '$(DB_DBA)' '$(DB_DATABASE)' insert +etc-install: + mkdir -p $(DESTDIR)/$(RT_ETC_PATH) + -cp -rp \ + etc/acl.* \ + etc/initialdata \ + etc/schema.* \ + $(DESTDIR)/$(RT_ETC_PATH) +# }}} -initdb.rtuser: - $(PERL) tools/initdb '$(DB_TYPE)' '$(DB_HOME)' '$(DB_HOST)' '$(DB_PORT)' '$(DB_RT_USER)' '$(DB_DATABASE)' insert +# {{{ sbin-install +sbin-install: + mkdir -p $(DESTDIR)/$(RT_SBIN_PATH) + chmod +x sbin/rt-setup-database \ + sbin/rt-test-dependencies + -cp -rp \ + sbin/rt-setup-database \ + sbin/rt-test-dependencies \ + $(DESTDIR)/$(RT_SBIN_PATH) +# }}} -insert-install: - cp -rp ./tools/insertdata \ - $(DESTDIR)/$(RT_ETC_PATH) - $(PERL) -p -i -e " s'!!RT_ETC_PATH!!'$(RT_ETC_PATH)'g;\ - s'!!RT_LIB_PATH!!'$(RT_LIB_PATH)'g;"\ - $(DESTDIR)/$(RT_ETC_PATH)/insertdata +# {{{ bin-install bin-install: - cp -p ./bin/webmux.pl $(DESTDIR)/$(RT_MODPERL_HANDLER) - cp -p ./bin/rt-mailgate $(DESTDIR)/$(RT_MAILGATE_BIN) - cp -p ./bin/rtadmin $(DESTDIR)/$(RT_CLI_ADMIN_BIN) - cp -p ./bin/rt $(DESTDIR)/$(RT_CLI_BIN) - cp -p ./bin/mason_handler.fcgi $(DESTDIR)/$(RT_FASTCGI_HANDLER) - cp -p ./bin/mason_handler.scgi $(DESTDIR)/$(RT_SPEEDYCGI_HANDLER) - - $(PERL) -p -i -e "s'!!RT_PATH!!'"$(RT_PATH)"'g;\ - s'!!PERL!!'"$(PERL)"'g;\ - s'!!RT_VERSION!!'"$(RT_VERSION)"'g;\ - s'!!RT_ETC_PATH!!'"$(RT_CONFIG_PATH)"'g;\ - s'!!RT_LIB_PATH!!'"$(RT_LIB_PATH)"'g;"\ - $(DESTDIR)/$(RT_MODPERL_HANDLER) \ - $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ - $(DESTDIR)/$(RT_SPEEDYCGI_HANDLER) \ - $(DESTDIR)/$(RT_CLI_BIN) \ - $(DESTDIR)/$(RT_CLI_ADMIN_BIN) \ - $(DESTDIR)/$(RT_MAILGATE_BIN) - - -config-replace: - -[ -f $(DESTDIR)/$(RT_CONFIG) ] && \ - mv $(DESTDIR)/$(RT_CONFIG) $(DESTDIR)/$(RT_CONFIG).old && \ - chmod 000 $(DESTDIR)/$(RT_CONFIG).old - cp -rp ./etc/config.pm $(DESTDIR)/$(RT_CONFIG) - $(PERL) -p -i -e "\ - s'!!DB_TYPE!!'"$(DB_TYPE)"'g;\ - s'!!DB_HOST!!'"$(DB_HOST)"'g;\ - s'!!DB_PORT!!'"$(DB_PORT)"'g;\ - s'!!DB_RT_PASS!!'"$(DB_RT_PASS)"'g;\ - s'!!DB_RT_USER!!'"$(DB_RT_USER)"'g;\ - s'!!DB_DATABASE!!'"$(DB_DATABASE)"'g;\ - s'!!MASON_HTML_PATH!!'"$(MASON_HTML_PATH)"'g;\ - s'!!MASON_LOCAL_HTML_PATH!!'"$(MASON_LOCAL_HTML_PATH)"'g;\ - s'!!MASON_SESSION_PATH!!'"$(MASON_SESSION_PATH)"'g;\ - s'!!MASON_DATA_PATH!!'"$(MASON_DATA_PATH)"'g;\ - s'!!RT_LOG_PATH!!'"$(RT_LOG_PATH)"'g;\ - s'!!RT_VERSION!!'"$(RT_VERSION)"'g;\ - " $(DESTDIR)/$(RT_CONFIG) + mkdir -p $(DESTDIR)/$(RT_BIN_PATH) + chmod +x bin/rt-mailgate \ + bin/rt-crontool + -cp -rp \ + bin/rt-mailgate \ + bin/mason_handler.fcgi \ + bin/mason_handler.svc \ + bin/webmux.pl \ + bin/rt-crontool \ + $(DESTDIR)/$(RT_BIN_PATH) +# }}} + +# {{{ local-install +local-install: + -cp -rp ./local/html/* $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + -cp -rp ./local/po/* $(DESTDIR)/$(LOCAL_LEXICON_PATH) + -cp -rp ./local/etc/* $(DESTDIR)/$(LOCAL_ETC_PATH) +# }}} + +# {{{ Best Practical Build targets -- no user servicable parts inside + + +POD2TEST_EXE = sbin/extract_pod_tests + +testify-pods: + [ -d lib/t/autogen ] || mkdir lib/t/autogen + find lib -name \*pm |grep -v \*.in |xargs -n 1 $(PERL) $(POD2TEST_EXE) + find bin -type f |grep -v \~ | grep -v "\.in" | xargs -n 1 $(PERL) $(POD2TEST_EXE) + +regenerate-catalogs: + $(PERL) sbin/extract-message-catalog + +license-tag: + $(PERL) sbin/license_tag + +factory: initialize-database + cd lib; $(PERL) ../sbin/factory $(DB_DATABASE) RT + commit: - cvs commit + aegis -build ; aegis -diff ; aegis -test; aegis -develop_end + +integrate: + aegis -integrate_begin; aegis -build; aegis -diff; aegis -test ; aegis -integrate_pass + +predist: commit tag-and-tar + +tag-and-release-baseline: + aegis -cp -ind Makefile -output /tmp/Makefile.tagandrelease; \ + $(MAKE) -f /tmp/Makefile.tagandrelease tag-and-release-never-by-hand -predist: commit - cvs tag -r $(BRANCH) -F $(TAG) + +# Running this target in a working directory is +# WRONG WRONG WRONG. +# it will tag the current baseline with the version of RT defined +# in the currently-being-worked-on makefile. which is wrong. +# you want tag-and-release-baseline + +tag-and-release-never-by-hand: + aegis --delta-name $(TAG) rm -rf /tmp/$(TAG) - cvs co -d /tmp/$(TAG) -r $(TAG) rt - cd /tmp/$(TAG); chmod 600 Makefile; /usr/local/bin/cvs2cl.pl \ - --no-wrap --separate-header \ - --window 120 + mkdir /tmp/$(TAG) + cd /tmp/$(TAG); \ + aegis -cp -ind -delta $(TAG) . ;\ + make reconfigure;\ + chmod 600 Makefile;\ + aegis --report --project rt.$(RT_VERSION_MAJOR) \ + --page_width 80 \ + --page_length 9999 \ + --change $(RT_VERSION_MINOR) --output Changelog Change_Log + cd /tmp; tar czvf /home/ftp/pub/rt/devel/$(TAG).tar.gz $(TAG)/ chmod 644 /home/ftp/pub/rt/devel/$(TAG).tar.gz -dist: commit predist - rm -rf /home/ftp/pub/rt/devel/rt.tar.gz - ln -s ./$(TAG).tar.gz /home/ftp/pub/rt/devel/rt.tar.gz +reconfigure: + aclocal -I m4 + autoconf + chmod 755 ./configure + ./configure rpm: (cd ..; tar czvf /usr/src/redhat/SOURCES/rt.tar.gz rt) rpm -ba etc/rt.spec + + +apachectl: + apachectl stop + sleep 3 + apachectl start +# }}} diff --git a/rt/Makefile.in b/rt/Makefile.in new file mode 100644 index 000000000..245ec5ed3 --- /dev/null +++ b/rt/Makefile.in @@ -0,0 +1,485 @@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2002 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + + +# +# DO NOT HAND-EDIT the file named 'Makefile'. This file is autogenerated. +# Have a look at "configure" and "Makefile.in" instead +# + + +PERL = @PERL@ + +CONFIG_FILE_PATH = @CONFIG_FILE_PATH@ +CONFIG_FILE = $(CONFIG_FILE_PATH)/RT_Config.pm +SITE_CONFIG_FILE = $(CONFIG_FILE_PATH)/RT_SiteConfig.pm + + +RT_VERSION_MAJOR = @RT_VERSION_MAJOR@ +RT_VERSION_MINOR = @RT_VERSION_MINOR@ +RT_VERSION_PATCH = @RT_VERSION_PATCH@ + +RT_VERSION = $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH) +TAG = rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH) + + +# This is the group that all of the installed files will be chgrp'ed to. +RTGROUP = @RTGROUP@ + + +# User which should own rt binaries. +BIN_OWNER = @BIN_OWNER@ + +# User that should own all of RT's libraries, generally root. +LIBS_OWNER = @LIBS_OWNER@ + +# Group that should own all of RT's libraries, generally root. +LIBS_GROUP = @LIBS_GROUP@ + +WEB_USER = @WEB_USER@ +WEB_GROUP = @WEB_GROUP@ + +# {{{ Files and directories + +# DESTDIR allows you to specify that RT be installed somewhere other than +# where it will eventually reside + +DESTDIR = + + +RT_PATH = @RT_PATH@ +RT_ETC_PATH = @RT_ETC_PATH@ +RT_BIN_PATH = @RT_BIN_PATH@ +RT_SBIN_PATH = @RT_SBIN_PATH@ +RT_LIB_PATH = @RT_LIB_PATH@ +RT_MAN_PATH = @RT_MAN_PATH@ +RT_VAR_PATH = @RT_VAR_PATH@ +RT_DOC_PATH = @RT_DOC_PATH@ +RT_LOCAL_PATH = @RT_LOCAL_PATH@ +LOCAL_ETC_PATH = @LOCAL_ETC_PATH@ +LOCAL_LEXICON_PATH = @LOCAL_LEXICON_PATH@ +MASON_HTML_PATH = @MASON_HTML_PATH@ +MASON_LOCAL_HTML_PATH = @MASON_LOCAL_HTML_PATH@ +MASON_DATA_PATH = @MASON_DATA_PATH@ +MASON_SESSION_PATH = @MASON_SESSION_PATH@ +RT_LOG_PATH = @RT_LOG_PATH@ + +# RT_READABLE_DIR_MODE is the mode of directories that are generally meant +# to be accessable +RT_READABLE_DIR_MODE = 0755 + + + + +# {{{ all these define the places that RT's binaries should get installed + +# RT_MODPERL_HANDLER is the mason handler script for mod_perl +RT_MODPERL_HANDLER = $(RT_BIN_PATH)/webmux.pl +# RT_FASTCGI_HANDLER is the mason handler script for FastCGI +RT_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.fcgi +# RT_WIN32_FASTCGI_HANDLER is the mason handler script for FastCGI +RT_WIN32_FASTCGI_HANDLER = $(RT_BIN_PATH)/mason_handler.svc +# RT's admin CLI +RT_CLI_ADMIN_BIN = $(RT_BIN_PATH)/rtadmin +# RT's mail gateway +RT_MAILGATE_BIN = $(RT_BIN_PATH)/rt-mailgate +# RT's cron tool +RT_CRON_BIN = $(RT_BIN_PATH)/rt-crontool + +# }}} + +SETGID_BINARIES = $(DESTDIR)/$(RT_FASTCGI_HANDLER) \ + $(DESTDIR)/$(RT_WIN32_FASTCGI_HANDLER) + +BINARIES = $(DESTDIR)/$(RT_MODPERL_HANDLER) \ + $(DESTDIR)/$(RT_MAILGATE_BIN) \ + $(DESTDIR)/$(RT_CRON_BIN) \ + $(SETGID_BINARIES) +SYSTEM_BINARIES = $(DESTDIR)/$(RT_SBIN_PATH)/ + + +# }}} + +# {{{ Database setup + +# +# DB_TYPE defines what sort of database RT trys to talk to +# "mysql" is known to work. +# "Pg" is known to work + +DB_TYPE = @DB_TYPE@ + +# Set DBA to the name of a unix account with the proper permissions and +# environment to run your commandline SQL sbin + +# Set DB_DBA to the name of a DB user with permission to create new databases + +# For mysql, you probably want 'root' +# For Pg, you probably want 'postgres' +# For oracle, you want 'system' + +DB_DBA = @DB_DBA@ + +DB_HOST = @DB_HOST@ + +# If you're not running your database server on its default port, +# specifiy the port the database server is running on below. +# It's generally safe to leave this blank + +DB_PORT = @DB_PORT@ + + + + +# +# Set this to the canonical name of the interface RT will be talking to the +# database on. If you said that the RT_DB_HOST above was "localhost," this +# should be too. This value will be used to grant rt access to the database. +# If you want to access the RT database from multiple hosts, you'll need +# to grant those database rights by hand. +# + +DB_RT_HOST = @DB_RT_HOST@ + +# set this to the name you want to give to the RT database in +# your database server. For Oracle, this should be the name of your sid + +DB_DATABASE = @DB_DATABASE@ +DB_RT_USER = @DB_RT_USER@ +DB_RT_PASS = @DB_RT_PASS@ + +# }}} + + +#################################################################### + +all: default + +default: + @echo "Please read RT's readme before installing. Not doing so could" + @echo "be dangerous." + + + +instruct: + @echo "Congratulations. RT has been installed. " + @echo "" + @echo "" + @echo "You must now configure RT by editing $(SITE_CONFIG_FILE)." + @echo "" + @echo "(You will definitely need to set RT's database password before continuing." + @echo " Not doing so could be very dangerous)" + @echo "" + @echo "After that, you need to initialize RT's database by running" + @echo " 'make initialize-database'" + +# @echo " or by executing " +# @echo " '$(RT_SBIN_PATH)/rt-setup-database --action init \ " +# @echo " --dba $(DB_DBA) --prompt-for-dba-password'" + + + +upgrade-instruct: + @echo "Congratulations. RT has been upgraded. You should now check-over" + @echo "$(CONFIG_FILE) for any necessary site customization. Additionally," + @echo "you should update RT's system database objects by running " + @echo " ls etc/upgrade" + @echo "For each file in that directory whose name is greater than" + @echo "your previously installed RT version, run:" + @echo " $(RT_SBIN_PATH)/rt-setup-database --action insert --datafile etc/upgrade/" + + +upgrade: dirs upgrade-noclobber upgrade-instruct + +upgrade-noclobber: config-install libs-install html-install bin-install local-install doc-install fixperms + + +# {{{ dependencies +testdeps: + $(PERL) ./sbin/rt-test-dependencies --with-$(DB_TYPE) + +fixdeps: + $(PERL) ./sbin/rt-test-dependencies --install --with-$(DB_TYPE) + +#}}} + +# {{{ fixperms +fixperms: + # Make the libraries readable + chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_PATH) + chown -R $(LIBS_OWNER) $(DESTDIR)/$(RT_LIB_PATH) + chgrp -R $(LIBS_GROUP) $(DESTDIR)/$(RT_LIB_PATH) + chmod -R u+rwX,go-w,go+rX $(DESTDIR)/$(RT_LIB_PATH) + + + chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_BIN_PATH) + chmod $(RT_READABLE_DIR_MODE) $(DESTDIR)/$(RT_BIN_PATH) + + chmod 0755 $(DESTDIR)/$(RT_ETC_PATH) + chmod 0500 $(DESTDIR)/$(RT_ETC_PATH)/* + + #TODO: the config file should probably be able to have its + # owner set seperately from the binaries. + chown -R $(BIN_OWNER) $(DESTDIR)/$(RT_ETC_PATH) + chgrp -R $(RTGROUP) $(DESTDIR)/$(RT_ETC_PATH) + + chmod 0550 $(DESTDIR)/$(CONFIG_FILE) + chmod 0550 $(DESTDIR)/$(SITE_CONFIG_FILE) + + # Make the interfaces executable and setgid rt + chown $(BIN_OWNER) $(BINARIES) + chgrp $(RTGROUP) $(BINARIES) + chmod 0755 $(BINARIES) + chmod g+s $(SETGID_BINARIES) + + # Make the web ui readable by all. + chmod -R u+rwX,go-w,go+rX $(DESTDIR)/$(MASON_HTML_PATH) \ + $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) \ + $(DESTDIR)/$(LOCAL_LEXICON_PATH) + chown -R $(LIBS_OWNER) $(DESTDIR)/$(MASON_HTML_PATH) \ + $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + chgrp -R $(LIBS_GROUP) $(DESTDIR)/$(MASON_HTML_PATH) \ + $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + + # Make the web ui's data dir writable + chmod 0770 $(DESTDIR)/$(MASON_DATA_PATH) \ + $(DESTDIR)/$(MASON_SESSION_PATH) + chown -R $(WEB_USER) $(DESTDIR)/$(MASON_DATA_PATH) \ + $(DESTDIR)/$(MASON_SESSION_PATH) + chgrp -R $(WEB_GROUP) $(DESTDIR)/$(MASON_DATA_PATH) \ + $(DESTDIR)/$(MASON_SESSION_PATH) +# }}} + +fixperms-nosetgid: fixperms + @echo "You should never be running RT this way. it's unsafe" + chmod 0555 $(SETGID_BINARIES) + chmod 0555 $(DESTDIR)/$(CONFIG_FILE) + chmod 0555 $(DESTDIR)/$(SITE_CONFIG_FILE) + +# {{{ dirs +dirs: + mkdir -p $(DESTDIR)/$(RT_LOG_PATH) + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH) + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/cache + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/etc + mkdir -p $(DESTDIR)/$(MASON_DATA_PATH)/obj + mkdir -p $(DESTDIR)/$(MASON_SESSION_PATH) + mkdir -p $(DESTDIR)/$(MASON_HTML_PATH) + mkdir -p $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + mkdir -p $(DESTDIR)/$(LOCAL_ETC_PATH) + mkdir -p $(DESTDIR)/$(LOCAL_LEXICON_PATH) +# }}} + +install: config-install dirs files-install fixperms instruct + +files-install: libs-install etc-install bin-install sbin-install html-install local-install doc-install + +config-install: + mkdir -p $(DESTDIR)/$(CONFIG_FILE_PATH) + cp etc/RT_Config.pm $(DESTDIR)/$(CONFIG_FILE) + [ -f $(DESTDIR)/$(SITE_CONFIG_FILE) ] || cp etc/RT_SiteConfig.pm $(DESTDIR)/$(SITE_CONFIG_FILE) + + chgrp $(RTGROUP) $(DESTDIR)/$(CONFIG_FILE) + chown $(BIN_OWNER) $(DESTDIR)/$(CONFIG_FILE) + + chgrp $(RTGROUP) $(DESTDIR)/$(SITE_CONFIG_FILE) + chown $(BIN_OWNER) $(DESTDIR)/$(SITE_CONFIG_FILE) + + @echo "Installed configuration. about to install rt in $(RT_PATH)" + +test: + $(PERL) -Ilib lib/t/00smoke.t + +regression-nosetgid-quiet: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl + $(PERL) sbin/regression_harness + +regression-nosetgid: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods fixperms-nosetgid apachectl + $(PERL) lib/t/02regression.t + +regression: config-install dirs files-install libs-install sbin-install bin-install regression-instruct regression-reset-db testify-pods apachectl + $(PERL) lib/t/02regression.t + +regression-quiet: + $(PERL) sbin/regression_harness + +regression-instruct: + @echo "About to wipe your database for a regression test. ABORT NOW with Control-C" + + +# {{{ database-installation + +regression-reset-db: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action drop --dba $(DB_DBA) --dba-password '' + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action init --dba $(DB_DBA) --dba-password '' + +initialize-database: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action init --dba $(DB_DBA) --prompt-for-dba-password + +dropdb: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/rt-setup-database --action drop --dba $(DB_DBA) --prompt-for-dba-password + +insert-approval-data: + $(PERL) $(DESTDIR)/$(RT_SBIN_PATH)/insert_approval_scrips +# }}} + +# {{{ libs-install +libs-install: + [ -d $(DESTDIR)/$(RT_LIB_PATH) ] || mkdir $(DESTDIR)/$(RT_LIB_PATH) + -cp -rp lib/* $(DESTDIR)/$(RT_LIB_PATH) +# }}} + +# {{{ html-install +html-install: + [ -d $(DESTDIR)/$(MASON_HTML_PATH) ] || mkdir $(DESTDIR)/$(MASON_HTML_PATH) + -cp -rp ./html/* $(DESTDIR)/$(MASON_HTML_PATH) +# }}} + +# {{{ doc-install +doc-install: + # RT 3.0.0 - RT 3.0.2 would accidentally create a file instead of a dir + -[ -f $(DESTDIR)/$(RT_DOC_PATH) ] && rm $(DESTDIR)/$(RT_DOC_PATH) + [ -d $(DESTDIR)/$(RT_DOC_PATH) ] || mkdir $(DESTDIR)/$(RT_DOC_PATH) + -cp -rp ./README $(DESTDIR)/$(RT_DOC_PATH) +# }}} + +# {{{ etc-install + +etc-install: + mkdir -p $(DESTDIR)/$(RT_ETC_PATH) + -cp -rp \ + etc/acl.* \ + etc/initialdata \ + etc/schema.* \ + $(DESTDIR)/$(RT_ETC_PATH) +# }}} + +# {{{ sbin-install + +sbin-install: + mkdir -p $(DESTDIR)/$(RT_SBIN_PATH) + chmod +x sbin/rt-setup-database \ + sbin/rt-test-dependencies + -cp -rp \ + sbin/rt-setup-database \ + sbin/rt-test-dependencies \ + $(DESTDIR)/$(RT_SBIN_PATH) + +# }}} + +# {{{ bin-install + +bin-install: + mkdir -p $(DESTDIR)/$(RT_BIN_PATH) + chmod +x bin/rt-mailgate \ + bin/rt-crontool + -cp -rp \ + bin/rt-mailgate \ + bin/mason_handler.fcgi \ + bin/mason_handler.svc \ + bin/webmux.pl \ + bin/rt-crontool \ + $(DESTDIR)/$(RT_BIN_PATH) +# }}} + +# {{{ local-install +local-install: + -cp -rp ./local/html/* $(DESTDIR)/$(MASON_LOCAL_HTML_PATH) + -cp -rp ./local/po/* $(DESTDIR)/$(LOCAL_LEXICON_PATH) + -cp -rp ./local/etc/* $(DESTDIR)/$(LOCAL_ETC_PATH) +# }}} + +# {{{ Best Practical Build targets -- no user servicable parts inside + + +POD2TEST_EXE = sbin/extract_pod_tests + +testify-pods: + [ -d lib/t/autogen ] || mkdir lib/t/autogen + find lib -name \*pm |grep -v \*.in |xargs -n 1 $(PERL) $(POD2TEST_EXE) + find bin -type f |grep -v \~ | grep -v "\.in" | xargs -n 1 $(PERL) $(POD2TEST_EXE) + + + +regenerate-catalogs: + $(PERL) sbin/extract-message-catalog + +license-tag: + $(PERL) sbin/license_tag + +factory: initialize-database + cd lib; $(PERL) ../sbin/factory $(DB_DATABASE) RT + +commit: + aegis -build ; aegis -diff ; aegis -test; aegis -develop_end + +integrate: + aegis -integrate_begin; aegis -build; aegis -diff; aegis -test ; aegis -integrate_pass + +predist: commit tag-and-tar + +tag-and-release-baseline: + aegis -cp -ind Makefile -output /tmp/Makefile.tagandrelease; \ + $(MAKE) -f /tmp/Makefile.tagandrelease tag-and-release-never-by-hand + + +# Running this target in a working directory is +# WRONG WRONG WRONG. +# it will tag the current baseline with the version of RT defined +# in the currently-being-worked-on makefile. which is wrong. +# you want tag-and-release-baseline + +tag-and-release-never-by-hand: + aegis --delta-name $(TAG) + rm -rf /tmp/$(TAG) + mkdir /tmp/$(TAG) + cd /tmp/$(TAG); \ + aegis -cp -ind -delta $(TAG) . ;\ + make reconfigure;\ + chmod 600 Makefile;\ + aegis --report --project rt.$(RT_VERSION_MAJOR) \ + --page_width 80 \ + --page_length 9999 \ + --change $(RT_VERSION_MINOR) --output Changelog Change_Log + + cd /tmp; tar czvf /home/ftp/pub/rt/devel/$(TAG).tar.gz $(TAG)/ + chmod 644 /home/ftp/pub/rt/devel/$(TAG).tar.gz + + +reconfigure: + aclocal -I m4 + autoconf + chmod 755 ./configure + ./configure + +rpm: + (cd ..; tar czvf /usr/src/redhat/SOURCES/rt.tar.gz rt) + rpm -ba etc/rt.spec + + +apachectl: + apachectl stop + sleep 3 + apachectl start +# }}} diff --git a/rt/README b/rt/README index d16100c5f..7c5e4d47a 100755 --- a/rt/README +++ b/rt/README @@ -1,139 +1,167 @@ -$Header: /home/cvs/cvsroot/freeside/rt/README,v 1.1 2002-08-12 06:17:06 ivan Exp $ -RT is (c) 1996-2002 by Jesse Vincent +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK +RT is an enterprise-grade issue tracking system. It allows +organizations to keep track of their to-do lists, who is working +on which tasks, what's already been done, and when tasks were +completed. It is available under the terms of version 2 of the GNU +General Public License (GPL), so it doesn't cost anything to set +up and use. -RT is licensed to you under the terms of version 2 of the GNU General -Public License. -If you don't have a copy of the GPL, you've been living in a cave, -but one should be included in this distribution. - - -INSTALLATION INSTRUCTIONS -------------------------- - -These instructions are a summary of those at http://www.fsck.com/rtfm/ -The docs on the web at www.fsck.com/rtfm/ are likely to be more up to -date and complete than this document. You should consult them before -proceeding. + Jesse Vincent + Best Practical Solutions, LLC + March 2003 REQUIRED PACKAGES: ------------------ -o Perl5.005_03 or later with support for setgid perl scripts - RT's command line and mail gateway tools run setgid to the 'rt' group - to protect RT's database password. You may need to install a special - "suidperl" package or reconfigure your perl setup to support - "setuid scripts". +o Perl 5.8.0 or later (http://www.perl.com). + + (If you intend to use the FastCGI or SpeedyCGI support, you + need to make sure that perl has been built with support for + setgid perl scripts.)` + + Perl 5.6.1 is currently deprecated and will be officially desupported + in a future release o A DB backend; MySQL is recommended ( http://www.mysql.com ) - Currently supported: Mysql 3.23.38 or newer. - (Some older releases had crippling SQL bugs) - Postgres 7.1 or newer. + Currently supported: Mysql 4.0.13 or later. + Postgres 7.2 or later. + + Mysql 3.23.46 or newer with support for InnoDB + is currently deprecated and will be officially + desupported in a future release. + +o Apache version 1.3.x or 2.x (http://httpd.apache.org) + with mod_perl -- (http://perl.apache.org ) + or a webserver with FastCGI support (www.fastcgi.com) + + mod_perl 2.0 isn't quite ready for prime_time just yet; + Best Practical Solutions strongly recommends that sites use + Apache 1.3 or FastCGI. + + Compiling mod_perl on Apache 1.3.x as a DSO has been known + to have massive stability problems and is not recommended. + + mod_perl 1.x must be build with EVERYTHING=1 + + RT's FastCGI handler runs setgid to the 'rt' group to + protect RT's database password. You may need to install + a special "suidperl" package or reconfigure your perl + setup to support "setuid scripts" if you intend to use RT + with FastCGI. + + Debian GNU/* 3.0+: the package which installs suidperl is + called perl-suid, and should work without any tweaking. + + FreeBSD 4.2+: the package is called sperl, and should + install a suidperl that just works + + Conectiva Linux 6.0+: suidperl is installed by default when + perl is installed, but the program /bin/suidperl is not setuid. + You must use chmod to make it setuid. -o Apache + mod_perl -- ( http://perl.apache.org) - or A webserver with FastCGI support (www.fastcgi.com) - If you compile mod_perl as a DSO, you're on your own. It's known - to have massive stability problems. - mod_perl must be build with EVERYTHING=1 o Various and sundry perl modules - RT takes care of the installation of most of these automatically - during the "make testdeps" and "make fixdeps" stages below + A tool included with RT takes care of the installation of + most of these automatically during the install process. + + The tool supplied with RT uses Perl's CPAN system + (http://www.cpan.org) to install modules. Some operating + systems package all or some of the modules required and + you may be better off installing the modules that way. GENERAL INSTALLATION -------------------- +This is a rough guide to installing RT. For more detail, you'll want +to read 'Chapter 2: Installing' in RT's manual, available at +http://www.bestpractical.com/rt + 1 Unpack this distribution SOMWHERE OTHER THAN where you want to install RT Granted, you've already got it open. To do this cleanly: - tar xzvf rt.tar.gz -C /tmp + tar xzvf rt.tar.gz -C /tmp -2 Check over /tmp/rt/Makefile +2 Run the "configure" script. - There are many variables you NEED to customize for your site. - Even if you are just upgrading, you must set ALL variables. + ./configure --help to see the list of options + ./configure (with the flags you want) -3 Satisfy RT's myriad dependencies. There's a perl script in rt/tools - called testdeps that uses CPAN to automate all of this. +3 Satisfy RT's myriad dependencies. 3.1 Check for compliance: - make testdeps + + perl sbin/rt-test-dependencies \ + --with- --with- + + databasename is one of: mysql, postgres + web-environment is one of: fastcgi, modperl1, modperl2 -3.2 If there are unsatisfied dependencies, install them by hand or run - make fixdeps - - (You may need to install Apache::Session and Apache::DBI by hand. +3.2 If there are unsatisfied dependencies, install them by hand or run: - You might need to install Msql-Mysql-Modules by hand. - perl -MCPAN -e'install DBD::mysql::Install' should do it for you. - ) + perl sbin/rt-test-dependencies \ + --with- --with- --install + 3.3 Check to make sure everything was installed properly: - make testdeps + + perl sbin/rt-test-dependencies \ + --with- --with- 4 Create a group called 'rt' 5a FOR A NEW INSTALLATION: As root, type: - make install (replace "make" with the local name for - Make, if you need to) + make install (replace "make" with the local name for + Make, if you need to) - If the make fails, type: - make dropdb - and start over from step 5a + + make initialize-database -5b FOR UPGRADING: (Within the RT 2.0.x series) - Make a backup of /path/to/rt/etc/config.pm - - As root, type: - make upgrade (replace "make" with the local name for - Make, if you need to) + If the make fails, type: + make dropdb + and start over from step 5a - This will build new binaries, config files and libraries without - overwriting your RT database. +5b FOR UPGRADING: (Within the RT 3.0.x series) - WARNING: This WILL clobber your existing configuration file! - - The install process will then instruct you to update your RT system - database objects by running rt/etc/insertdata where - is the version of RT you're upgrading from. + As root, type: + make upgrade (replace "make" with the local name for + Make, if you need to) + This will build new binaries, config files and libraries without + overwriting your RT database. - -5c FOR UPGRADING (From 1.0.x): - - Follow the instructions for installing RT 2.0. + It may then instruct you to update your RT system database objects - Once you have installed RT 2.0, download import-1.0-to-2.0 - from http://www.fsck.com/pub/rt/contrib/2.0/rt-addons - - Edit the configuration defaults in import-1.0-to-2.0 - - If you don't set $DEFAULTQUEUE to the name of one of your - RT 1.0 queues, THE IMPORT WILL FAIL. - - perl ./import-1.0-to-2.0 - - The import tool will do its thing. If you're using postgres, you'll - need to execute the following SQL statement within your RT2 database: - - select setval('tickets_id_seq', (select max(id) from tickets)); - - It imports: - Queues, Areas, Users, Acls, Mailing Rules, Queue Members, - Tickets and Transactions. - - It DOES NOT IMPORT: - Attachments removed by stripmime or Templates. - -6 Edit etc/config.pm in your RT installation directory. In many - cases sensible defaults have been included. In others, you MUST - supply a value. +6 Edit etc/RT_SiteConfig.pm in your RT installation directory, by specifying + any values you need to change from the defaults in etc/RT_Config.pm 7 Configure the email and web gateways, as described below. @@ -142,97 +170,81 @@ GENERAL INSTALLATION NOTE: root's password for the web interface is "password" (without the quotes.) Not changing this is a SECURITY risk -9 Configure RT per the instructions at http://www.fsck.com/rtfm/ +9 Configure RT per the instructions in RT's manual. - Until you do this, RT will not be able to send or recieve email, + Until you do this, RT will not be able to send or receive email, nor will it be more than marginally functional. This is not an optional step. -SETTING UP THE MAIL GATEWAY ---------------------------- +THE WEB INTERFACE +----------------- -An alias for the initial queue will need to be made in either your -global mail aliases file (if you are using NIS) or locally on your -machine. - -Add the following lines to /etc/aliases (or your local equivalent) : - -rt: "|/path/to/rt2/bin/rt-mailgate --queue general --action correspond" -rt-comment: "|/path/to/rt2/bin/rt-mailgate --queue general --action comment" - | | - ----/ | - | - ---/ - - - -THE WEB UI ----------- - -RT's web ui is based around HTML::Mason, which works well with the mod_perl -perl interpreter within Apache httpd as well as with a webserver which -supports FastCGI. (Instructions for configuring RT for use with FastCGI -are available at http://www.fsck.com/rtfm/ ) +RT's web interface is based around HTML::Mason, which works best with the mod_perl +perl interpreter within Apache httpd. Alternatively, support for the FastCGI +(and plain CGI) interface is also provided as 'bin/mason_handler.fcgi'. Apache - RT Uses HTML::Mason. You'll need to add a few lines to your - httpd.conf telling it to use rt's web ui. If you have mod-perl - (you should, the perl scripts will go quite a bit faster around with - it), you can do something like this: - + You'll need to add a few lines to your httpd.conf telling it about RT: -DocumentRoot /path/to/rt2/WebRT/html -ServerName your.rt.server.hostname -PerlModule Apache::DBI -PerlFreshRestart On -PerlRequire /path/to/rt2/bin/webmux.pl - - SetHandler perl-script - PerlHandler RT::Mason - + ServerName your.rt.server.hostname + DocumentRoot /opt/rt3/share/html + AddDefaultCharset UTF-8 + + # this line applies to Apache2+mod_perl2 only + PerlModule Apache2 Apache::compat + + PerlModule Apache::DBI + PerlRequire /opt/rt3/bin/webmux.pl + + # this section applies to Apache 1 only + + SetHandler perl-script + PerlHandler RT::Mason + + + # this section applies to Apache2+mod_perl2 only + + SetHandler perl-script + PerlHandler RT::Mason + + + SetHandler perl-script + PerlHandler RT::Mason + + + SetHandler perl-script + PerlHandler RT::Mason + -Additionally, you should set up a cron job to remove stale session data. - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - WARNING: Don't install this cron job or run this find command if your - MASON_SESSION_PATH (known in config.pm as $MasonSessionDir) - points to a directory that could EVER contain any file that's not - a Apache::Session datafile. -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -# Every hour, nuke session files and lockfiles that haven't been -# touched in 10 hours - -0 * * * * find /path/to/rt2/WebRT/sessiondata -type f -amin +600 -exec rm {} \; -THE CLI -------- - Binaries for the CLI are located in rt/bin - You've got: +SETTING UP THE MAIL GATEWAY +--------------------------- - "rt" (manipulate or display requests) - "rtadmin" (modify queues, users and acls) +An alias for the initial queue will need to be made in either your +global mail aliases file (if you are using NIS) or locally on your +machine. + +Add the following lines to /etc/aliases (or your local equivalent) : - Both of these programs take --help as an option. +rt: "|/opt/rt3/bin/rt-mailgate --queue general --action correspond --url http://localhost/" +rt-comment: "|/opt/rt3/bin/rt-mailgate --queue general --action comment --url http://localhost/" + | | | + ----/ | | + | | + ---/ | + | + ---/ BUGS ---- -Known issues with releases of RT2 are listed at -. This includes every bug known -to exist in each release of RT. (When prompted, login as guest/guest) - -To find out more about currently open bugs, check out the live -Buglist at . -(When prompted, login as guest/guest) - -To report a bug, send an email to rt-2.0-bugs@fsck.com. +To report a bug, send email to rt-3.0-bugs@fsck.com. GETTING HELP ------------ @@ -249,8 +261,8 @@ information about commercial support options, please send email to RT-USERS MAILINGLIST -------------------- -To keep up to date on the latest RT tips, techniques and extections, -you probably want to join the rt-users mailinglist. Send a message to: +To keep up to date on the latest RT tips, techniques and extensions, +you probably want to join the rt-users mailing list. Send a message to: rt-users-request@lists.fsck.com @@ -258,79 +270,31 @@ With the body of the message consisting of only the word: subscribe -If you're interested in hacking on rt, you'll want to subscribe to +If you're interested in hacking on RT, you'll want to subscribe to rt-devel@lists.fsck.com. Subscribe to it with instructions similar to those above. Address questions about the stable release to the rt-users list, and questions about the development version to the rt-devel list. If you feel -your questions are best not asked publically, send them personally to +your questions are best not asked publicly, send them personally to . -If you want to be informed of every commit to the CVS repository, -subscribe to rt-commit@fsck.com using similar instructions to those above. - RT WEBSITE ---------- For current information about RT, check out the RT website at -http://www.bestpractical.com/rt You'll find screenshots, a pointer -to the current version of rt, contributed patches and lots of other great -stuff. + http://www.bestpractical.com/ + +You'll find screenshots, a pointer to the current version of RT, contributed +patches, and lots of other great stuff. TROUBLESHOOTING --------------- -All errors will be appended to a logfile, which lives in /tmp/rt.log.* unless -you've reconfigured it. Check etc/config.pm for details. - If the solution to the problem you're running into isn't obvious and you've -checked the FAQ, feel free to send mail to rt-users@fsck.com (for release +checked the FAQ, feel free to send mail to rt-users@fsck.com (for released versions of RT) or rt-devel@fsck.com (for development versions). -GIVING SOMETHING BACK ---------------------- - -RT is free software. You are not obligated to pay for it. You should be -aware, however, that bestpractical.com's sole source of revenue is commercial -work related to RT. If you are able, either a contract to extend RT in some -way that would be useful to your organization, a financial contribution, or -even something off the author's amazon wishlist - ( http://www.amazon.com/exec/obidos/wishlist/2GMHUDAFBT2XR/ ) -would be much appreciated. - Thanks! - - -CREDITS -------- - -A lot of people are responsible for making RT a better program. Many -thanks to Lauren Burka, who originally tasked me with writing this beast. -She forced me to use a database backend. I've thanked her for it every -day since. Rich West rewrote this readme and did some UI hacking. Adam -Hirsch, Kit Kraysha, Robin Garner, Jens Glaser, John Adams, Trey Belew, -Sean Dague, Nathan Mehl, Kee Hinckley, Rich West, Dale Bewley, Serge Zhuk, -John Lengeling, Elmar Knipp, Gerald Abshez, Dave Hull, Dave Schenet, -Dave Walton, Jan Okrouhly, Tobias Brox, Lamont Lucas, Charlie Brady, -Robin Shostack, Eric Mumpower, Jerrod Wiesman, Adam Hammer, Ivan Kohler, Alex -Pilosov, Mary Alderdice, Deborah Kaplan, Jens von Bülow, Tristan Horn, -Lee Ann Goldstein, Karel P Kerezman, Feargal Reilly, Christian Steger, -Christian Kurz, JD Falk, Arthur de Jong, Ben Carter, Mark Vevers -and many others -have all contributed bug reports, code or ideas that have helped RT along. - -Arepa, Inc, Utopia Inc, Wesleyan University and The Leftbank Operation -have paid me to maintain RT and release it to the public. Without their -support RT would not exist. - -If I've left you out, please drop me a line ....it wasn't intentional. - - - Enjoy - - Jesse Vincent - - Best Practical Solutions, LLC diff --git a/rt/aclocal.m4 b/rt/aclocal.m4 new file mode 100644 index 000000000..475b3890d --- /dev/null +++ b/rt/aclocal.m4 @@ -0,0 +1,158 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p4 + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +dnl +dnl @synopsis RT_ENABLE_LAYOUT() +dnl +dnl Enable a specific directory layout for the installation to use. +dnl This configures a command-line parameter that can be specified +dnl at ./configure invocation. +dnl +dnl The use of this feature in this way is a little hackish, but +dnl better than a heap of options for every directory. +dnl +dnl This code is heavily borrowed *cough* from the Apache 2 code. +dnl + +AC_DEFUN([RT_ENABLE_LAYOUT],[ +AC_ARG_ENABLE(layout, + AC_HELP_STRING([--enable-layout=LAYOUT], + [Use a specific directory layout (Default: RT3)]), + LAYOUT=$enableval) + +if test "x$LAYOUT" = "x"; then + LAYOUT="RT3" +fi +RT_LAYOUT($srcdir/config.layout, $LAYOUT) +AC_MSG_CHECKING(for chosen layout) +if test "x$rt_layout_name" = "xno"; then + if test "x$LAYOUT" = "xno"; then + AC_MSG_RESULT(none) + else + AC_MSG_RESULT($LAYOUT) + fi + AC_MSG_ERROR([a valid layout must be specified (or the default used)]) +else + AC_SUBST(rt_layout_name) + AC_MSG_RESULT($rt_layout_name) +fi +]) + +dnl +dnl @synopsis RT_LAYOUT(configlayout, layoutname) +dnl +dnl This macro reads an Apache-style layout file (specified as the +dnl configlayout parameter), and searches for a specific layout +dnl (named using the layoutname parameter). +dnl +dnl The entries for a given layout are then inserted into the +dnl environment such that they become available as substitution +dnl variables. In addition, the rt_layout_name variable is set +dnl (but not exported) if the layout is valid. +dnl +dnl This code is heavily borrowed *cough* from the Apache 2 codebase. +dnl + +AC_DEFUN([RT_LAYOUT],[ + if test ! -f $srcdir/config.layout; then + AC_MSG_WARN([Layout file $srcdir/config.layout not found]) + rt_layout_name=no + else + pldconf=./config.pld + $PERL -0777 -p -e "\$layout = '$2';" -e ' + s/.*//gims; + s/\<\/Layout\>.*//s; + s/^#.*$//m; + s/^\s+//gim; + s/\s+$/\n/gim; + s/\+$/\/rt3/gim; + # m4 will not let us just use $1, we need @S|@1 + s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/@S|@1=@S|@2/gim; + s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\@S|@@S|@1" = "xNONE" || test "x\@S|@@S|@1" = "x") && @S|@1=@S|@2/gim; + ' < $1 > $pldconf + + if test -s $pldconf; then + rt_layout_name=$2 + . $pldconf + changequote({,}) + for var in prefix exec_prefix bindir sbindir \ + sysconfdir mandir libdir datadir htmldir \ + localstatedir logfiledir masonstatedir \ + sessionstatedir customdir custometcdir customhtmldir \ + customlexdir customlibdir manualdir; do + eval "val=\"\$$var\"" + val=`echo $val | sed -e 's:\(.\)/*$:\1:'` + val=`echo $val | + sed -e 's:[\$]\([a-z_]*\):${\1}:g'` + eval "$var='$val'" + done + changequote([,]) + else + rt_layout_name=no + fi + #rm $pldconf + fi + RT_SUBST_EXPANDED_ARG(prefix) + RT_SUBST_EXPANDED_ARG(exec_prefix) + RT_SUBST_EXPANDED_ARG(bindir) + RT_SUBST_EXPANDED_ARG(sbindir) + RT_SUBST_EXPANDED_ARG(sysconfdir) + RT_SUBST_EXPANDED_ARG(mandir) + RT_SUBST_EXPANDED_ARG(libdir) + RT_SUBST_EXPANDED_ARG(datadir) + RT_SUBST_EXPANDED_ARG(htmldir) + RT_SUBST_EXPANDED_ARG(manualdir) + RT_SUBST_EXPANDED_ARG(localstatedir) + RT_SUBST_EXPANDED_ARG(logfiledir) + RT_SUBST_EXPANDED_ARG(masonstatedir) + RT_SUBST_EXPANDED_ARG(sessionstatedir) + RT_SUBST_EXPANDED_ARG(customdir) + RT_SUBST_EXPANDED_ARG(custometcdir) + RT_SUBST_EXPANDED_ARG(customhtmldir) + RT_SUBST_EXPANDED_ARG(customlexdir) + RT_SUBST_EXPANDED_ARG(customlibdir) +])dnl + +dnl +dnl @synopsis RT_SUBST_EXPANDED_ARG(var) +dnl +dnl Export (via AC_SUBST) a given variable, along with an expanded +dnl version of the variable (same name, but with exp_ prefix). +dnl +dnl This code is heavily borrowed *cough* from the Apache 2 source. +dnl + +AC_DEFUN([RT_SUBST_EXPANDED_ARG],[ + RT_EXPAND_VAR(exp_$1, [$]$1) + AC_SUBST($1) + AC_SUBST(exp_$1) +]) + +dnl +dnl @synopsis RT_EXPAND_VAR(baz, $fraz) +dnl +dnl Iteratively expands the second parameter, until successive iterations +dnl yield no change. The result is then assigned to the first parameter. +dnl +dnl This code is heavily borrowed from the Apache 2 codebase. +dnl + +AC_DEFUN([RT_EXPAND_VAR],[ + ap_last='' + ap_cur='$2' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + $1="${ap_cur}" +]) + diff --git a/rt/autom4te.cache/output.0 b/rt/autom4te.cache/output.0 new file mode 100644 index 000000000..51a8aaf63 --- /dev/null +++ b/rt/autom4te.cache/output.0 @@ -0,0 +1,2747 @@ +@%:@! /bin/sh +@%:@ From configure.ac Revision: 1.1 . +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.53 for RT 3.0.4. +@%:@ +@%:@ Report bugs to . +@%:@ +@%:@ Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +@%:@ Free Software Foundation, Inc. +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='RT' +PACKAGE_TARNAME='rt' +PACKAGE_VERSION='3.0.4' +PACKAGE_STRING='RT 3.0.4' +PACKAGE_BUGREPORT='rt-3.0-bugs@fsck.com' + +ac_unique_file="lib/RT.pm.in" +ac_default_prefix=/opt/rt3 + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_PERL_set=${PERL+set} +ac_env_PERL_value=$PERL +ac_cv_env_PERL_set=${PERL+set} +ac_cv_env_PERL_value=$PERL + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures RT 3.0.4 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of RT 3.0.4:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-layout=LAYOUT Use a specific directory layout (Default: RT3) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-speedycgi=/path/to/speedy + path to your speedycgi binary, if it exists + --with-rt-group=GROUP group to own all files (default: rt) + --with-bin-owner=OWNER user that will own rt binaries (default root) + --with-libs-owner=OWNER user that will own RT libraries (default root) + --with-libs-group=GROUP group that will own rt binaries (default bin) + --with-db-type=TYPE sort of database RT will use (default: mysql) (mysql + and Pg are valid) + --with-db-host=HOSTNAME FQDN of database server (default: localhost) + --with-db-port=PORT port on which the database listens on + --with-db-rt-host=HOSTNAME + FQDN of RT server which talks to the database server + (default: localhost) + --with-db-dba=DBA name of database administrator (default: root) + --with-db-database=DBNAME + name of the database to use (default: rt3) + --with-db-rt-user=DBUSER + name of database user (default: rt_user) + --with-db-rt-pass=PASSWORD + password for database user (default: rt_pass) + --with-web-user=USER user the web server runs as (default: www) + --with-web-group=GROUP group the web server runs as (default: www) + +Some influential environment variables: + PERL Perl interpreter command + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +RT configure 3.0.4 +generated by GNU Autoconf 2.53 + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by RT $as_me 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +@%:@@%:@ --------- @%:@@%:@ +@%:@@%:@ Platform. @%:@@%:@ +@%:@@%:@ --------- @%:@@%:@ + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +@%:@@%:@ ----------- @%:@@%:@ +@%:@@%:@ Core tests. @%:@@%:@ +@%:@@%:@ ----------- @%:@@%:@ + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell meta-characters. +ac_configure_args= +ac_sep= +for ac_arg +do + case $ac_arg in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n ) continue ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + cat <<\_ASBOX +@%:@@%:@ ---------------- @%:@@%:@ +@%:@@%:@ Cache variables. @%:@@%:@ +@%:@@%:@ ---------------- @%:@@%:@ +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + if test -s confdefs.h; then + cat <<\_ASBOX +@%:@@%:@ ----------- @%:@@%:@ +@%:@@%:@ confdefs.h. @%:@@%:@ +@%:@@%:@ ----------- @%:@@%:@ +_ASBOX + echo + sed "/^$/d" confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + + +rt_version_major=3 + +rt_version_minor=0 + +rt_version_patch=4 + +test "x$rt_version_major" = 'x' && rt_version_major=0 +test "x$rt_version_minor" = 'x' && rt_version_minor=0 +test "x$rt_version_patch" = 'x' && rt_version_patch=0 + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PERL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL="$PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="not found" + ;; +esac +fi +PERL=$ac_cv_path_PERL + +if test -n "$PERL"; then + echo "$as_me:$LINENO: result: $PERL" >&5 +echo "${ECHO_T}$PERL" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$PERL" = 'not found'; then + { { echo "$as_me:$LINENO: error: cannot use $PACKAGE_NAME without perl" >&5 +echo "$as_me: error: cannot use $PACKAGE_NAME without perl" >&2;} + { (exit 1); exit 1; }; } +fi + +# Check whether --with-speedycgi or --without-speedycgi was given. +if test "${with_speedycgi+set}" = set; then + withval="$with_speedycgi" + SPEEDY_BIN=$withval +else + SPEEDY_BIN=/usr/local/bin/speedy +fi; + + + + + +# Check whether --enable-layout or --disable-layout was given. +if test "${enable_layout+set}" = set; then + enableval="$enable_layout" + LAYOUT=$enableval +fi; + +if test "x$LAYOUT" = "x"; then + LAYOUT="RT3" +fi + + if test ! -f $srcdir/config.layout; then + { echo "$as_me:$LINENO: WARNING: Layout file $srcdir/config.layout not found" >&5 +echo "$as_me: WARNING: Layout file $srcdir/config.layout not found" >&2;} + rt_layout_name=no + else + pldconf=./config.pld + $PERL -0777 -p -e "\$layout = '$LAYOUT';" -e ' + s/.*//gims; + s/\<\/Layout\>.*//s; + s/^#.*$//m; + s/^\s+//gim; + s/\s+$/\n/gim; + s/\+$/\/rt3/gim; + # m4 will not let us just use $srcdir/config.layout, we need @S|@1 + s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/@S|@1=@S|@2/gim; + s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\@S|@@S|@1" = "xNONE" || test "x\@S|@@S|@1" = "x") && @S|@1=@S|@2/gim; + ' < $srcdir/config.layout > $pldconf + + if test -s $pldconf; then + rt_layout_name=$LAYOUT + . $pldconf + + for var in prefix exec_prefix bindir sbindir \ + sysconfdir mandir libdir datadir htmldir \ + localstatedir logfiledir masonstatedir \ + sessionstatedir customdir custometcdir customhtmldir \ + customlexdir customlibdir manualdir; do + eval "val=\"\$$var\"" + val=`echo $val | sed -e 's:\(.\)/*$:\1:'` + val=`echo $val | + sed -e 's:[\$]\([a-z_]*\):$\1:g'` + eval "$var='$val'" + done + + else + rt_layout_name=no + fi + #rm $pldconf + fi + + + ap_last='' + ap_cur='$prefix' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_prefix="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$exec_prefix' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_exec_prefix="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$bindir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_bindir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$sbindir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_sbindir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$sysconfdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_sysconfdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$mandir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_mandir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$libdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_libdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$datadir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_datadir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$htmldir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_htmldir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$manualdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_manualdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$localstatedir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_localstatedir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$logfiledir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_logfiledir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$masonstatedir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_masonstatedir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$sessionstatedir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_sessionstatedir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$custometcdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_custometcdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customhtmldir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customhtmldir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customlexdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customlexdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customlibdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customlibdir="${ap_cur}" + + + + + +echo "$as_me:$LINENO: checking for chosen layout" >&5 +echo $ECHO_N "checking for chosen layout... $ECHO_C" >&6 +if test "x$rt_layout_name" = "xno"; then + if test "x$LAYOUT" = "xno"; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 + else + echo "$as_me:$LINENO: result: $LAYOUT" >&5 +echo "${ECHO_T}$LAYOUT" >&6 + fi + { { echo "$as_me:$LINENO: error: a valid layout must be specified (or the default used)" >&5 +echo "$as_me: error: a valid layout must be specified (or the default used)" >&2;} + { (exit 1); exit 1; }; } +else + + echo "$as_me:$LINENO: result: $rt_layout_name" >&5 +echo "${ECHO_T}$rt_layout_name" >&6 +fi + + + +# Check whether --with-rt-group or --without-rt-group was given. +if test "${with_rt_group+set}" = set; then + withval="$with_rt_group" + RTGROUP=$withval +else + RTGROUP=rt +fi; + + + +# Check whether --with-bin-owner or --without-bin-owner was given. +if test "${with_bin_owner+set}" = set; then + withval="$with_bin_owner" + BIN_OWNER=$withval +else + BIN_OWNER=root +fi; + + + +# Check whether --with-libs-owner or --without-libs-owner was given. +if test "${with_libs_owner+set}" = set; then + withval="$with_libs_owner" + LIBS_OWNER=$withval +else + LIBS_OWNER=root +fi; + + + +# Check whether --with-libs-group or --without-libs-group was given. +if test "${with_libs_group+set}" = set; then + withval="$with_libs_group" + LIBS_GROUP=$withval +else + LIBS_GROUP=bin +fi; + + + +# Check whether --with-db-type or --without-db-type was given. +if test "${with_db_type+set}" = set; then + withval="$with_db_type" + DB_TYPE=$withval +else + DB_TYPE=mysql +fi; +if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite'; then + { { echo "$as_me:$LINENO: error: Only Pg and mysql are valid db types" >&5 +echo "$as_me: error: Only Pg and mysql are valid db types" >&2;} + { (exit 1); exit 1; }; } +fi + + + +# Check whether --with-db-host or --without-db-host was given. +if test "${with_db_host+set}" = set; then + withval="$with_db_host" + DB_HOST=$withval +else + DB_HOST=localhost +fi; + + + +# Check whether --with-db-port or --without-db-port was given. +if test "${with_db_port+set}" = set; then + withval="$with_db_port" + DB_PORT=$withval +else + DB_PORT= +fi; + + + +# Check whether --with-db-rt-host or --without-db-rt-host was given. +if test "${with_db_rt_host+set}" = set; then + withval="$with_db_rt_host" + DB_RT_HOST=$withval +else + DB_RT_HOST=localhost +fi; + + + +# Check whether --with-db-dba or --without-db-dba was given. +if test "${with_db_dba+set}" = set; then + withval="$with_db_dba" + DB_DBA=$withval +else + DB_DBA=root +fi; + + + +# Check whether --with-db-database or --without-db-database was given. +if test "${with_db_database+set}" = set; then + withval="$with_db_database" + DB_DATABASE=$withval +else + DB_DATABASE=rt3 +fi; + + + +# Check whether --with-db-rt-user or --without-db-rt-user was given. +if test "${with_db_rt_user+set}" = set; then + withval="$with_db_rt_user" + DB_RT_USER=$withval +else + DB_RT_USER=rt_user +fi; + + + +# Check whether --with-db-rt-pass or --without-db-rt-pass was given. +if test "${with_db_rt_pass+set}" = set; then + withval="$with_db_rt_pass" + DB_RT_PASS=$withval +else + DB_RT_PASS=rt_pass +fi; + + + +# Check whether --with-web-user or --without-web-user was given. +if test "${with_web_user+set}" = set; then + withval="$with_web_user" + WEB_USER=$withval +else + WEB_USER=www +fi; + + + +# Check whether --with-web-group or --without-web-group was given. +if test "${with_web_group+set}" = set; then + withval="$with_web_group" + WEB_GROUP=$withval +else + WEB_GROUP=www +fi; + + + +RT_VERSION_MAJOR=${rt_version_major} + +RT_VERSION_MINOR=${rt_version_minor} + +RT_VERSION_PATCH=${rt_version_patch} + + +RT_PATH=${exp_prefix} + +RT_DOC_PATH=${exp_manualdir} + +RT_LOCAL_PATH=${exp_customdir} + +RT_LIB_PATH=${exp_libdir} + +RT_ETC_PATH=${exp_sysconfdir} + +CONFIG_FILE_PATH=${exp_sysconfdir} + +RT_BIN_PATH=${exp_bindir} + +RT_SBIN_PATH=${exp_sbindir} + +RT_VAR_PATH=${exp_localstatedir} + +RT_MAN_PATH=${exp_mandir} + +MASON_DATA_PATH=${exp_masonstatedir} + +MASON_SESSION_PATH=${exp_sessionstatedir} + +MASON_HTML_PATH=${exp_htmldir} + +LOCAL_ETC_PATH=${exp_custometcdir} + +MASON_LOCAL_HTML_PATH=${exp_customhtmldir} + +LOCAL_LEXICON_PATH=${exp_customlexdir} + +LOCAL_LIB_PATH=${exp_customlibdir} + +DESTDIR=${exp_prefix} + +RT_LOG_PATH=${exp_logfiledir} + + + +ac_config_files="$ac_config_files sbin/rt-setup-database sbin/rt-test-dependencies Makefile etc/RT_Config.pm lib/RT.pm lib/t/00smoke.t lib/t/01harness.t lib/t/02regression.t lib/t/03web.pl lib/t/04_send_email.pl bin/mason_handler.fcgi bin/mason_handler.scgi bin/mason_handler.svc bin/rt-commit-handler bin/rt-crontool bin/rt-mailgate bin/webmux.pl" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overriden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by RT $as_me 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +RT config.status 3.0.4 +configured by $0, generated by GNU Autoconf 2.53, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" + exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "sbin/rt-setup-database" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-setup-database" ;; + "sbin/rt-test-dependencies" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-test-dependencies" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "etc/RT_Config.pm" ) CONFIG_FILES="$CONFIG_FILES etc/RT_Config.pm" ;; + "lib/RT.pm" ) CONFIG_FILES="$CONFIG_FILES lib/RT.pm" ;; + "lib/t/00smoke.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/00smoke.t" ;; + "lib/t/01harness.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/01harness.t" ;; + "lib/t/02regression.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/02regression.t" ;; + "lib/t/03web.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/03web.pl" ;; + "lib/t/04_send_email.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/04_send_email.pl" ;; + "bin/mason_handler.fcgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.fcgi" ;; + "bin/mason_handler.scgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.scgi" ;; + "bin/mason_handler.svc" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.svc" ;; + "bin/rt-commit-handler" ) CONFIG_FILES="$CONFIG_FILES bin/rt-commit-handler" ;; + "bin/rt-crontool" ) CONFIG_FILES="$CONFIG_FILES bin/rt-crontool" ;; + "bin/rt-mailgate" ) CONFIG_FILES="$CONFIG_FILES bin/rt-mailgate" ;; + "bin/webmux.pl" ) CONFIG_FILES="$CONFIG_FILES bin/webmux.pl" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@rt_version_major@,$rt_version_major,;t t +s,@rt_version_minor@,$rt_version_minor,;t t +s,@rt_version_patch@,$rt_version_patch,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PERL@,$PERL,;t t +s,@SPEEDY_BIN@,$SPEEDY_BIN,;t t +s,@exp_prefix@,$exp_prefix,;t t +s,@exp_exec_prefix@,$exp_exec_prefix,;t t +s,@exp_bindir@,$exp_bindir,;t t +s,@exp_sbindir@,$exp_sbindir,;t t +s,@exp_sysconfdir@,$exp_sysconfdir,;t t +s,@exp_mandir@,$exp_mandir,;t t +s,@exp_libdir@,$exp_libdir,;t t +s,@exp_datadir@,$exp_datadir,;t t +s,@htmldir@,$htmldir,;t t +s,@exp_htmldir@,$exp_htmldir,;t t +s,@manualdir@,$manualdir,;t t +s,@exp_manualdir@,$exp_manualdir,;t t +s,@exp_localstatedir@,$exp_localstatedir,;t t +s,@logfiledir@,$logfiledir,;t t +s,@exp_logfiledir@,$exp_logfiledir,;t t +s,@masonstatedir@,$masonstatedir,;t t +s,@exp_masonstatedir@,$exp_masonstatedir,;t t +s,@sessionstatedir@,$sessionstatedir,;t t +s,@exp_sessionstatedir@,$exp_sessionstatedir,;t t +s,@customdir@,$customdir,;t t +s,@exp_customdir@,$exp_customdir,;t t +s,@custometcdir@,$custometcdir,;t t +s,@exp_custometcdir@,$exp_custometcdir,;t t +s,@customhtmldir@,$customhtmldir,;t t +s,@exp_customhtmldir@,$exp_customhtmldir,;t t +s,@customlexdir@,$customlexdir,;t t +s,@exp_customlexdir@,$exp_customlexdir,;t t +s,@customlibdir@,$customlibdir,;t t +s,@exp_customlibdir@,$exp_customlibdir,;t t +s,@rt_layout_name@,$rt_layout_name,;t t +s,@RTGROUP@,$RTGROUP,;t t +s,@BIN_OWNER@,$BIN_OWNER,;t t +s,@LIBS_OWNER@,$LIBS_OWNER,;t t +s,@LIBS_GROUP@,$LIBS_GROUP,;t t +s,@DB_TYPE@,$DB_TYPE,;t t +s,@DB_HOST@,$DB_HOST,;t t +s,@DB_PORT@,$DB_PORT,;t t +s,@DB_RT_HOST@,$DB_RT_HOST,;t t +s,@DB_DBA@,$DB_DBA,;t t +s,@DB_DATABASE@,$DB_DATABASE,;t t +s,@DB_RT_USER@,$DB_RT_USER,;t t +s,@DB_RT_PASS@,$DB_RT_PASS,;t t +s,@WEB_USER@,$WEB_USER,;t t +s,@WEB_GROUP@,$WEB_GROUP,;t t +s,@RT_VERSION_MAJOR@,$RT_VERSION_MAJOR,;t t +s,@RT_VERSION_MINOR@,$RT_VERSION_MINOR,;t t +s,@RT_VERSION_PATCH@,$RT_VERSION_PATCH,;t t +s,@RT_PATH@,$RT_PATH,;t t +s,@RT_DOC_PATH@,$RT_DOC_PATH,;t t +s,@RT_LOCAL_PATH@,$RT_LOCAL_PATH,;t t +s,@RT_LIB_PATH@,$RT_LIB_PATH,;t t +s,@RT_ETC_PATH@,$RT_ETC_PATH,;t t +s,@CONFIG_FILE_PATH@,$CONFIG_FILE_PATH,;t t +s,@RT_BIN_PATH@,$RT_BIN_PATH,;t t +s,@RT_SBIN_PATH@,$RT_SBIN_PATH,;t t +s,@RT_VAR_PATH@,$RT_VAR_PATH,;t t +s,@RT_MAN_PATH@,$RT_MAN_PATH,;t t +s,@MASON_DATA_PATH@,$MASON_DATA_PATH,;t t +s,@MASON_SESSION_PATH@,$MASON_SESSION_PATH,;t t +s,@MASON_HTML_PATH@,$MASON_HTML_PATH,;t t +s,@LOCAL_ETC_PATH@,$LOCAL_ETC_PATH,;t t +s,@MASON_LOCAL_HTML_PATH@,$MASON_LOCAL_HTML_PATH,;t t +s,@LOCAL_LEXICON_PATH@,$LOCAL_LEXICON_PATH,;t t +s,@LOCAL_LIB_PATH@,$LOCAL_LIB_PATH,;t t +s,@DESTDIR@,$DESTDIR,;t t +s,@RT_LOG_PATH@,$RT_LOG_PATH,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || + mkdir "$as_incr_dir" || + { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +done; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/rt/autom4te.cache/requests b/rt/autom4te.cache/requests new file mode 100644 index 000000000..fad7b54f5 --- /dev/null +++ b/rt/autom4te.cache/requests @@ -0,0 +1,94 @@ +# This file was created by autom4te. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '--reload-state=/usr/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.ac' + ], + { + 'AC_HEADER_STAT' => 1, + 'AC_FUNC_STRFTIME' => 1, + 'AC_PROG_RANLIB' => 1, + 'AC_FUNC_WAIT3' => 1, + 'AC_FUNC_SETPGRP' => 1, + 'AC_HEADER_TIME' => 1, + 'AC_FUNC_SETVBUF_REVERSED' => 1, + 'AC_HEADER_SYS_WAIT' => 1, + 'AC_TYPE_UID_T' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CHECK_LIB' => 1, + 'AC_PROG_LN_S' => 1, + 'AC_FUNC_MEMCMP' => 1, + 'AC_FUNC_FORK' => 1, + 'AC_FUNC_GETGROUPS' => 1, + 'AC_HEADER_MAJOR' => 1, + 'AC_FUNC_STRTOD' => 1, + 'AC_HEADER_DIRENT' => 1, + 'AC_FUNC_UTIME_NULL' => 1, + 'AC_CONFIG_FILES' => 1, + 'AC_FUNC_ALLOCA' => 1, + 'AC_C_CONST' => 1, + 'include' => 1, + 'AC_FUNC_OBSTACK' => 1, + 'AC_FUNC_LSTAT' => 1, + 'AC_STRUCT_TIMEZONE' => 1, + 'AC_FUNC_GETPGRP' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AC_CHECK_HEADERS' => 1, + 'AC_TYPE_MODE_T' => 1, + 'AC_CHECK_TYPES' => 1, + 'AC_PROG_YACC' => 1, + 'AC_TYPE_PID_T' => 1, + 'AC_FUNC_STRERROR_R' => 1, + 'AC_STRUCT_ST_BLOCKS' => 1, + 'AC_PROG_GCC_TRADITIONAL' => 1, + 'AC_TYPE_SIGNAL' => 1, + 'AC_FUNC_FNMATCH' => 1, + 'AC_PROG_CPP' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'AC_FUNC_STAT' => 1, + 'AC_PROG_INSTALL' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_FUNC_STRCOLL' => 1, + 'AC_LIBSOURCE' => 1, + 'AC_C_INLINE' => 1, + 'AC_FUNC_CHOWN' => 1, + 'AC_PROG_LEX' => 1, + 'AH_OUTPUT' => 1, + 'AC_HEADER_STDC' => 1, + 'AC_FUNC_GETLOADAVG' => 1, + 'AC_CHECK_FUNCS' => 1, + 'AC_TYPE_SIZE_T' => 1, + 'AC_DECL_SYS_SIGLIST' => 1, + 'AC_FUNC_MKTIME' => 1, + 'AC_PROG_MAKE_SET' => 1, + 'AC_PROG_CXX' => 1, + 'm4_pattern_allow' => 1, + 'm4_include' => 1, + 'm4_pattern_forbid' => 1, + 'AC_PROG_AWK' => 1, + 'AC_FUNC_VPRINTF' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_PATH_X' => 1, + 'AC_TYPE_OFF_T' => 1, + 'AC_FUNC_MALLOC' => 1, + 'AC_FUNC_ERROR_AT_LINE' => 1, + 'AC_FUNC_FSEEKO' => 1, + 'AC_FUNC_MMAP' => 1, + 'AC_STRUCT_TM' => 1, + 'AC_SUBST' => 1, + 'AC_PROG_CC' => 1, + 'AC_PROG_LIBTOOL' => 1 + } + ], 'Request' ) + ); + diff --git a/rt/autom4te.cache/traces.0 b/rt/autom4te.cache/traces.0 new file mode 100644 index 000000000..962f400e7 --- /dev/null +++ b/rt/autom4te.cache/traces.0 @@ -0,0 +1,156 @@ +m4trace:configure.ac:9: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:9: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:9: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs. LIBOBJS']) +m4trace:configure.ac:9: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:9: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:9: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:9: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:9: -1- AC_SUBST([SHELL], [${CONFIG_SHELL-/bin/sh}]) +m4trace:configure.ac:9: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.ac:9: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.ac:9: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.ac:9: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.ac:9: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.ac:9: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.ac:9: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.ac:9: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.ac:9: -1- AC_SUBST([datadir], ['${prefix}/share']) +m4trace:configure.ac:9: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.ac:9: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.ac:9: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.ac:9: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.ac:9: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.ac:9: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.ac:9: -1- AC_SUBST([infodir], ['${prefix}/info']) +m4trace:configure.ac:9: -1- AC_SUBST([mandir], ['${prefix}/man']) +m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +#undef PACKAGE_NAME]) +m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME]) +m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +#undef PACKAGE_VERSION]) +m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING]) +m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.ac:9: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT]) +m4trace:configure.ac:9: -1- AC_SUBST([build_alias]) +m4trace:configure.ac:9: -1- AC_SUBST([host_alias]) +m4trace:configure.ac:9: -1- AC_SUBST([target_alias]) +m4trace:configure.ac:9: -1- AC_SUBST([DEFS]) +m4trace:configure.ac:9: -1- AC_SUBST([ECHO_C]) +m4trace:configure.ac:9: -1- AC_SUBST([ECHO_N]) +m4trace:configure.ac:9: -1- AC_SUBST([ECHO_T]) +m4trace:configure.ac:9: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:14: -1- AC_SUBST([rt_version_major], [3]) +m4trace:configure.ac:16: -1- AC_SUBST([rt_version_minor], [0]) +m4trace:configure.ac:18: -1- AC_SUBST([rt_version_patch], [4]) +m4trace:configure.ac:24: -1- AC_PROG_INSTALL +m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.ac:24: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.ac:25: -1- AC_SUBST([PERL]) +m4trace:configure.ac:26: -1- AC_SUBST([PERL], [$ac_cv_path_PERL]) +m4trace:configure.ac:36: -1- AC_SUBST([SPEEDY_BIN]) +m4trace:configure.ac:41: -1- AC_SUBST([prefix]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_prefix]) +m4trace:configure.ac:41: -1- AC_SUBST([exec_prefix]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_exec_prefix]) +m4trace:configure.ac:41: -1- AC_SUBST([bindir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_bindir]) +m4trace:configure.ac:41: -1- AC_SUBST([sbindir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_sbindir]) +m4trace:configure.ac:41: -1- AC_SUBST([sysconfdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_sysconfdir]) +m4trace:configure.ac:41: -1- AC_SUBST([mandir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_mandir]) +m4trace:configure.ac:41: -1- AC_SUBST([libdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_libdir]) +m4trace:configure.ac:41: -1- AC_SUBST([datadir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_datadir]) +m4trace:configure.ac:41: -1- AC_SUBST([htmldir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_htmldir]) +m4trace:configure.ac:41: -1- AC_SUBST([manualdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_manualdir]) +m4trace:configure.ac:41: -1- AC_SUBST([localstatedir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_localstatedir]) +m4trace:configure.ac:41: -1- AC_SUBST([logfiledir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_logfiledir]) +m4trace:configure.ac:41: -1- AC_SUBST([masonstatedir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_masonstatedir]) +m4trace:configure.ac:41: -1- AC_SUBST([sessionstatedir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_sessionstatedir]) +m4trace:configure.ac:41: -1- AC_SUBST([customdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_customdir]) +m4trace:configure.ac:41: -1- AC_SUBST([custometcdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_custometcdir]) +m4trace:configure.ac:41: -1- AC_SUBST([customhtmldir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_customhtmldir]) +m4trace:configure.ac:41: -1- AC_SUBST([customlexdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_customlexdir]) +m4trace:configure.ac:41: -1- AC_SUBST([customlibdir]) +m4trace:configure.ac:41: -1- AC_SUBST([exp_customlibdir]) +m4trace:configure.ac:41: -1- AC_SUBST([rt_layout_name]) +m4trace:configure.ac:49: -1- AC_SUBST([RTGROUP]) +m4trace:configure.ac:57: -1- AC_SUBST([BIN_OWNER]) +m4trace:configure.ac:65: -1- AC_SUBST([LIBS_OWNER]) +m4trace:configure.ac:73: -1- AC_SUBST([LIBS_GROUP]) +m4trace:configure.ac:84: -1- AC_SUBST([DB_TYPE]) +m4trace:configure.ac:92: -1- AC_SUBST([DB_HOST]) +m4trace:configure.ac:100: -1- AC_SUBST([DB_PORT]) +m4trace:configure.ac:108: -1- AC_SUBST([DB_RT_HOST]) +m4trace:configure.ac:116: -1- AC_SUBST([DB_DBA]) +m4trace:configure.ac:124: -1- AC_SUBST([DB_DATABASE]) +m4trace:configure.ac:132: -1- AC_SUBST([DB_RT_USER]) +m4trace:configure.ac:140: -1- AC_SUBST([DB_RT_PASS]) +m4trace:configure.ac:148: -1- AC_SUBST([WEB_USER]) +m4trace:configure.ac:156: -1- AC_SUBST([WEB_GROUP]) +m4trace:configure.ac:163: -1- AC_SUBST([RT_VERSION_MAJOR], [${rt_version_major}]) +m4trace:configure.ac:164: -1- AC_SUBST([RT_VERSION_MINOR], [${rt_version_minor}]) +m4trace:configure.ac:165: -1- AC_SUBST([RT_VERSION_PATCH], [${rt_version_patch}]) +m4trace:configure.ac:168: -1- AC_SUBST([RT_PATH], [${exp_prefix}]) +m4trace:configure.ac:169: -1- AC_SUBST([RT_DOC_PATH], [${exp_manualdir}]) +m4trace:configure.ac:170: -1- AC_SUBST([RT_LOCAL_PATH], [${exp_customdir}]) +m4trace:configure.ac:171: -1- AC_SUBST([RT_LIB_PATH], [${exp_libdir}]) +m4trace:configure.ac:172: -1- AC_SUBST([RT_ETC_PATH], [${exp_sysconfdir}]) +m4trace:configure.ac:173: -1- AC_SUBST([CONFIG_FILE_PATH], [${exp_sysconfdir}]) +m4trace:configure.ac:174: -1- AC_SUBST([RT_BIN_PATH], [${exp_bindir}]) +m4trace:configure.ac:175: -1- AC_SUBST([RT_SBIN_PATH], [${exp_sbindir}]) +m4trace:configure.ac:176: -1- AC_SUBST([RT_VAR_PATH], [${exp_localstatedir}]) +m4trace:configure.ac:177: -1- AC_SUBST([RT_MAN_PATH], [${exp_mandir}]) +m4trace:configure.ac:178: -1- AC_SUBST([MASON_DATA_PATH], [${exp_masonstatedir}]) +m4trace:configure.ac:179: -1- AC_SUBST([MASON_SESSION_PATH], [${exp_sessionstatedir}]) +m4trace:configure.ac:180: -1- AC_SUBST([MASON_HTML_PATH], [${exp_htmldir}]) +m4trace:configure.ac:181: -1- AC_SUBST([LOCAL_ETC_PATH], [${exp_custometcdir}]) +m4trace:configure.ac:182: -1- AC_SUBST([MASON_LOCAL_HTML_PATH], [${exp_customhtmldir}]) +m4trace:configure.ac:183: -1- AC_SUBST([LOCAL_LEXICON_PATH], [${exp_customlexdir}]) +m4trace:configure.ac:184: -1- AC_SUBST([LOCAL_LIB_PATH], [${exp_customlibdir}]) +m4trace:configure.ac:185: -1- AC_SUBST([DESTDIR], [${exp_prefix}]) +m4trace:configure.ac:186: -1- AC_SUBST([RT_LOG_PATH], [${exp_logfiledir}]) +m4trace:configure.ac:208: -1- AC_CONFIG_FILES([ + sbin/rt-setup-database + sbin/rt-test-dependencies + Makefile + etc/RT_Config.pm + lib/RT.pm + lib/t/00smoke.t + lib/t/01harness.t + lib/t/02regression.t + lib/t/03web.pl + lib/t/04_send_email.pl + bin/mason_handler.fcgi + bin/mason_handler.scgi + bin/mason_handler.svc + bin/rt-commit-handler + bin/rt-crontool + bin/rt-mailgate + bin/webmux.pl + ]) diff --git a/rt/bin/mason_handler.fcgi b/rt/bin/mason_handler.fcgi index e8a4e128f..431eccbd3 100755 --- a/rt/bin/mason_handler.fcgi +++ b/rt/bin/mason_handler.fcgi @@ -1,221 +1,54 @@ -#!!!PERL!! -# $Header: /home/cvs/cvsroot/freeside/rt/bin/mason_handler.fcgi,v 1.1 2002-08-12 06:17:07 ivan Exp $ -# RT is (c) 1996-2001 Jesse Vincent (jesse@fsck.com); +#!/usr/bin/perl +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK use strict; -$ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need -$ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; -$ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; -$ENV{'ENV'} = '' if defined $ENV{'ENV'}; -$ENV{'IFS'} = '' if defined $ENV{'IFS'}; +use File::Basename; +require ('/opt/rt3/bin/webmux.pl'); +my $h = &RT::Interface::Web::NewCGIHandler(); -# We really don't want apache to try to eat all vm -# see http://perl.apache.org/guide/control.html#Preventing_mod_perl_Processes_Fr - - -package RT::Mason; -#use CGI qw(-private_tempfiles); # pull in CGI with the private tempfiles - #option predefined -use HTML::Mason; # brings in subpackages: Parser, Interp, etc. - -use vars qw($VERSION %session $Nobody $SystemUser $cgi); - -# List of modules that you want to use from components (see Admin -# manual for details) - -#Clean up our umask...so that the session files aren't world readable, writable or executable -umask(0077); - - - -$VERSION="!!RT_VERSION!!"; - -use lib "!!RT_LIB_PATH!!"; -use lib "!!RT_ETC_PATH!!"; - -#This drags in RT's config.pm -use config; -use Carp; - -{ - package HTML::Mason::Commands; - use vars qw(%session $ContentType); - - use RT; - use RT::Ticket; - use RT::Tickets; - use RT::Transaction; - use RT::Transactions; - use RT::User; - use RT::Users; - use RT::CurrentUser; - use RT::Template; - use RT::Templates; - use RT::Queue; - use RT::Queues; - use RT::ScripAction; - use RT::ScripActions; - use RT::ScripCondition; - use RT::ScripConditions; - use RT::Scrip; - use RT::Scrips; - use RT::Group; - use RT::Groups; - use RT::Keyword; - use RT::Keywords; - use RT::ObjectKeyword; - use RT::ObjectKeywords; - use RT::KeywordSelect; - use RT::KeywordSelects; - use RT::GroupMember; - use RT::GroupMembers; - use RT::Watcher; - use RT::Watchers; - use RT::Handle; - use RT::Interface::Web; - use MIME::Entity; - use CGI::Cookie; - use Date::Parse; - use HTML::Entities; - use Text::Wrapper; - - #TODO: make this use DBI - use Apache::Session::File; - use CGI::Fast; - - # set the page's content type. - # In this case, just save it to a variable that we can pull later; - sub SetContentType { - $ContentType = shift; - } - sub CGIObject { - return $RT::Mason::cgi; - } -} - - -my ($output, $parser, $interp); -if ($HTML::Mason::VERSION < 1.0902) { - require HTML::Mason::ApacheHandler; - - $parser = &RT::Interface::Web::NewParser(allow_globals => [%session]); - - $interp = &RT::Interface::Web::NewInterp(parser=>$parser, - allow_recursive_autohandlers => 1, - out_method => \$output); -} -else { - $interp = &RT::Interface::Web::NewInterp( - allow_globals => [%session], - default_escape_flags => 'h', - - out_method => \$output); -} -# Die if WebSessionDir doesn't exist or we can't write to it - -stat ($RT::MasonSessionDir); -die "Can't read and write $RT::MasonSessionDir" - unless (( -d _ ) and ( -r _ ) and ( -w _ )); - +# Enter CGI::Fast mode, which should also work as a vanilla CGI script. +require CGI::Fast; RT::Init(); # Response loop -while ($RT::Mason::cgi = new CGI::Fast) { - - $HTML::Mason::Commands::ContentType = 'text/html'; - - # This routine comes from ApacheHandler.pm: - my (%args, $cookie); - foreach my $key ( $cgi->param ) { - foreach my $value ( $cgi->param($key) ) { - if (exists($args{$key})) { - if (ref($args{$key})) { - $args{$key} = [@{$args{$key}}, $value]; - } else { - $args{$key} = [$args{$key}, $value]; - } - } else { - $args{$key} = $value; - } - - } - - } - - - my $comp = $ENV{'PATH_INFO'}; - - if ($comp =~ /^(.*)$/) { # untaint the path info. apache should - # never hand us a bogus path. - # We should be more careful here. - $comp = $1; - } - - if ($comp =~ /\/$/) { - $comp .= "index.html"; - } - - #This is all largely cut and pasted from mason's session_handler.pl - - # {{{ Cookies - my %cookies = fetch CGI::Cookie(); - - eval { - my $session_id = undef; - - #Get the session id and untaint it - if ($cookies{'AF_SID'} && $cookies{'AF_SID'}->value() =~ /^(.*)$/) { - $session_id = $1; - } - - tie %HTML::Mason::Commands::session, 'Apache::Session::File', - $session_id, - { Directory => $RT::MasonSessionDir, - LockDirectory => $RT::MasonSessionDir, - } ; - }; - - if ( $@ ) { - # If the session is invalid, create a new session. - if ( $@ =~ m#^Object does not exist in the data store# ) { - tie %HTML::Mason::Commands::session, 'Apache::Session::File', undef, - { Directory => $RT::MasonSessionDir, - LockDirectory => $RT::MasonSessionDir, - }; - undef $cookies{'AF_SID'}; - } - else { - die "$@ \nProbably means that RT Couldn't write to session directory '$RT::MasonSessionDir'. Check that this directory's permissions are correct."; - } +while ( my $cgi = CGI::Fast->new ) { + # the whole point of fastcgi requires the env to get reset here.. + # So we must squash it again + $ENV{'PATH'} = '/bin:/usr/bin'; + $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; + $ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; + $ENV{'ENV'} = '' if defined $ENV{'ENV'}; + $ENV{'IFS'} = '' if defined $ENV{'IFS'}; + + unless ($h->interp->comp_exists($cgi->path_info)) { + $cgi->path_info($cgi->path_info . "/index.html"); } - - if ( !$cookies{'AF_SID'} ) { - $cookie = new CGI::Cookie - (-name=>'AF_SID', - -value=>$HTML::Mason::Commands::session{_session_id}, - -path => '/',); - - } else { - $cookie = undef; - } - - # }}} - - $output = ''; - eval { - my $status = $interp->exec($comp, %args); - }; - - if ($@) { - $output = "
$@
"; - } - - print "Content-Type: $HTML::Mason::Commands::ContentType\r\n"; - print "Set-Cookie: $cookie\r\n" if ($cookie); - print "\r\n"; - print $output; - untie %HTML::Mason::Commands::session; - + $h->handle_cgi_object($cgi); + # _should_ always be tied } + +1; diff --git a/rt/bin/mason_handler.fcgi.in b/rt/bin/mason_handler.fcgi.in new file mode 100644 index 000000000..e932bfc29 --- /dev/null +++ b/rt/bin/mason_handler.fcgi.in @@ -0,0 +1,54 @@ +#!@PERL@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +use strict; +use File::Basename; +require ('@RT_BIN_PATH@/webmux.pl'); + +my $h = &RT::Interface::Web::NewCGIHandler(); + +# Enter CGI::Fast mode, which should also work as a vanilla CGI script. +require CGI::Fast; + +RT::Init(); + +# Response loop +while ( my $cgi = CGI::Fast->new ) { + # the whole point of fastcgi requires the env to get reset here.. + # So we must squash it again + $ENV{'PATH'} = '/bin:/usr/bin'; + $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; + $ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; + $ENV{'ENV'} = '' if defined $ENV{'ENV'}; + $ENV{'IFS'} = '' if defined $ENV{'IFS'}; + + unless ($h->interp->comp_exists($cgi->path_info)) { + $cgi->path_info($cgi->path_info . "/index.html"); + } + $h->handle_cgi_object($cgi); + # _should_ always be tied +} + +1; diff --git a/rt/bin/mason_handler.scgi b/rt/bin/mason_handler.scgi index b9846c898..8e1135c2f 100755 --- a/rt/bin/mason_handler.scgi +++ b/rt/bin/mason_handler.scgi @@ -1,193 +1,41 @@ -#!!!PERL!! -w - -#!/usr/bin/speedy -- -t600 -M8 -# $Header: /home/cvs/cvsroot/freeside/rt/bin/mason_handler.scgi,v 1.1 2002-08-12 06:17:07 ivan Exp $ -# RT is (c) 1996-2001 Jesse Vincent (jesse@fsck.com); -# -# Contains code derived from mason.cgi -# mason.cgi is Copyright December 2000 Joshua Kronengold (mneme@io.com, -# mneme@cyberspace.org). All Rights Reserved. +#!/usr/local/bin/speedy +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK use strict; -# {{{ Clean out the environment a little bit -$ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need -$ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; -$ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; -$ENV{'ENV'} = '' if defined $ENV{'ENV'}; -$ENV{'IFS'} = '' if defined $ENV{'IFS'}; -# }}} - -package RT::Mason; -use HTML::Mason; # brings in subpackages: Parser, Interp, etc. -use vars qw($VERSION %session $Nobody $SystemUser); - -# List of modules that you want to use from components (see Admin -# manual for details) - -$VERSION="!!RT_VERSION!!"; - -use lib "!!RT_LIB_PATH!!"; -use lib "!!RT_ETC_PATH!!"; - - -#This drags in RT's config.pm -use config; -use Carp; - -use HTML::Mason::FakeApache; -use CGI; - -# {{{ Set up CGI environment and grab CGI params: +require ('/opt/rt3/bin/webmux.pl'); -my $r=new HTML::Mason::FakeApache; +my $h = &RT::Interface::Web::NewCGIHandler(); -$|=1; # set output to non-buffered. +require CGI; -my %cgi; -CGI::ReadParse(\%cgi); # %cgi is now a tied hash containing our params. +RT::Init(); -my $q=$cgi{CGI}; # $q now contains the object tied to %cgi. -# }}} - -# {{{ require what we need -{ - package HTML::Mason::Commands; - - use vars qw(%session); - - use RT::Ticket; - use RT::Tickets; - use RT::Transaction; - use RT::Transactions; - use RT::User; - use RT::Users; - use RT::CurrentUser; - use RT::Template; - use RT::Templates; - use RT::Queue; - use RT::Queues; - use RT::ScripAction; - use RT::ScripActions; - use RT::ScripCondition; - use RT::ScripConditions; - use RT::Scrip; - use RT::Scrips; - use RT::Group; - use RT::Groups; - use RT::Keyword; - use RT::Keywords; - use RT::ObjectKeyword; - use RT::ObjectKeywords; - use RT::KeywordSelect; - use RT::KeywordSelects; - use RT::GroupMember; - use RT::GroupMembers; - use RT::Watcher; - use RT::Watchers; - use RT::Handle; - use RT::Interface::Web; - use MIME::Entity; - use CGI::Cookie; - use Date::Parse; - use HTML::Entities; - - - use Apache::Session::File; - - +my $cgi = CGI->new; +unless ($h->interp->comp_exists($cgi->path_info)) { + $cgi->path_info($cgi->path_info . "/index.html"); } -# }}} - -# {{{ RT Database setup - $RT::Handle = new RT::Handle; - - $RT::Handle->Connect; - - use RT::CurrentUser; - - #RT's system user is a genuine database user. its id lives here - $RT::SystemUser = new RT::CurrentUser(); - $RT::SystemUser->LoadByName('RT_System'); - - #RT's "nobody user" is a genuine database user. its ID lives here. - $RT::Nobody = new RT::CurrentUser(); - $RT::Nobody->LoadByName('Nobody'); - - -# }}} - - - - -# {{{ Deal with cookies - -my %cookies = fetch CGI::Cookie(); -eval { - tie %HTML::Mason::Commands::session, 'Apache::Session::File', - ( $cookies{'AF_SID'} ? $cookies{'AF_SID'}->value() : undef ); -}; - -if ( $@ ) { - # If the session is invalid, create a new session. - if ( $@ =~ m#^Object does not exist in the data store# ) { - tie %HTML::Mason::Commands::session, 'Apache::Session::File', undef; - undef $cookies{'AF_SID'}; - } -} - -if ( !$cookies{'AF_SID'} ) { - my $cookie = new CGI::Cookie( - -name=>'AF_SID', - -value=>$HTML::Mason::Commands::session{_session_id}, - -path => '/'); - print 'Set-Cookie: '. $cookie."\r\n"; -} - -# }}} - -my $path=$ENV{PATH_INFO} || "/"; $path=~s/\'/\\\'/g; - -my $type=`/usr/bin/file '$RT::MasonComponentRoot/$path'`; - -# {{{ if it's a text file, handle it with mason. -if($type=~/text|directory/) { - my ($out, %mason_params); - my $parser = RT::Interface::Web::NewParser(allow_globals=>[qw($r)]); - $mason_params{parser}=$parser; - $r->content_type('text/html'); - # (get cookies line) ... - $r->access_hash('headers_in','Cookie',$ENV{HTTP_COOKIE}); - $r->{'args@'}=[]; - $mason_params{out_method}=\$out; - - my $interp = RT::Interface::Web::NewInterp(%mason_params); - - $interp->set_global(r=>$r); - $interp->exec($path,%cgi); - $r->send_http_header(); - print $out; -} -# }}} - -# {{{ if it's not a text file, just stream it out. - -else { # file is binary, damn it - my $mime_type; - if ( $mime_type= - eval{ use MIME::Types; - my($type,$encoding)=MIME::Types::by_suffix($path); - $type; }) { - print $q->header($mime_type); - $path=~s/[\|\>\<\&]//g; - open F,"$RT::MasonComponentRoot/$path" or - die "couldn't open $path -- $!"; - print while ; - close F; - } else { - die "couldn't resolve type of non-text file (!@; $type) -- install Mime::Types\n"; - } - } - -# }}} +$h->handle_cgi_object($cgi); -untie %HTML::Mason::Commands::session; +1; diff --git a/rt/bin/mason_handler.scgi.in b/rt/bin/mason_handler.scgi.in new file mode 100644 index 000000000..37d8380c2 --- /dev/null +++ b/rt/bin/mason_handler.scgi.in @@ -0,0 +1,41 @@ +#!@SPEEDY_BIN@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +use strict; +require ('@RT_BIN_PATH@/webmux.pl'); + +my $h = &RT::Interface::Web::NewCGIHandler(); + +require CGI; + +RT::Init(); + +my $cgi = CGI->new; +unless ($h->interp->comp_exists($cgi->path_info)) { + $cgi->path_info($cgi->path_info . "/index.html"); +} +$h->handle_cgi_object($cgi); + +1; diff --git a/rt/bin/mason_handler.svc b/rt/bin/mason_handler.svc new file mode 100644 index 000000000..e6d83784c --- /dev/null +++ b/rt/bin/mason_handler.svc @@ -0,0 +1,234 @@ +#!/usr/bin/perl +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +=head1 NAME + +mason_handler.svc - Win32 IIS Service handler for RT + +=head1 SYNOPSIS + + perl mason_handler.svc --install # install as service + perl mason_handler.svc --deinstall # deinstall this service + perl mason_handler.svc --help # show this help + perl mason_handler.svc # launch handler from command line + +=head1 DESCRIPTION + +This script manages a stand-alone FastCGI server, and populates the necessary +registry settings to run it with Microsoft IIS Server 4.0 or above. + +Before running it, you need to install the B module from CPAN, as well as +B from L if you want to install +itself as a service. + +This script will automatically create a virtual directory under the IIS root; +its name is taken from C<$WebPath> in the F file. Additionally, +please install the ISAPI binary from L and set +up an ISAPI Script Map that maps F<.html> files to F. + +Once the service is launched (either via C or by running +C), a FCGI server will start and bind to port C<8284> +(mnemonics: the ASCII value of C and C); the ISAPI handler's C +registry setting will also be automatically populated. + +=cut + +use strict; +use File::Basename; +require (dirname(__FILE__) . '/webmux.pl'); + +use Cwd; +use File::Spec; + +use Win32; +use Win32::Process; +use Win32::Service; +use Win32::TieRegistry; + +my $ProcessObj; + +BEGIN { + my $runsvc = sub { + Win32::Process::Create( + $ProcessObj, $^X, "$^X $0 --run", 0, NORMAL_PRIORITY_CLASS, "." + ) or do { + die Win32::FormatMessage( Win32::GetLastError() ); + }; + + chdir File::Basename::dirname($0); + my $path = Cwd::cwd(); + $path =~ s|/|\\|g; + $path =~ s|bin$|share\\html|; + + $Win32::TieRegistry::Registry->{ + 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\\'. + 'W3SVC\Parameters\Virtual Roots\\' + }->{$RT::WebPath || '/'} = "$path,,205"; + + $Win32::TieRegistry::Registry->{ + 'HKEY_LOCAL_MACHINE\Software\FASTCGI\.html\\' + }->{'BindPath'} = $ENV{'FCGI_SOCKET_PATH'}; + + Win32::Service::StartService(Win32::NodeName, 'W3SVC'); + }; + + if ($ARGV[0] eq '--deinstall') { + chdir File::Basename::dirname($0); + my $path = Cwd::cwd(); + $path =~ s|/|\\|g; + + require Win32::Daemon; + Win32::Daemon::DeleteService('RTFastCGI'); + warn "Service 'RTFastCGI' successfully deleted.\n"; + exit; + } + elsif ($ARGV[0] eq '--install') { + chdir File::Basename::dirname($0); + my $path = Cwd::cwd(); + $path =~ s|/|\\|g; + + require Win32::Daemon; + Win32::Daemon::DeleteService('RTFastCGI'); + + my $rv = Win32::Daemon::CreateService( { + machine => '', + name => 'RTFastCGI', + display => 'RT FastCGI Handler', + path => $^X, + user => '', + pwd => $path, + description => 'Enables port 8284 as the RT FastCGI handler.', + parameters => File::Spec->catfile( + $path, File::Basename::basename($0) + ) . ' --service', + } ); + + if ($rv) { + warn "Service 'RTFastCGI' successfully created.\n"; + } + else { + warn "Failed to add service: " . Win32::FormatMessage( + Win32::Daemon::GetLastError() + ) . "\n"; + } + exit; + } + elsif ($ARGV[0] eq '--service') { + require Win32::Daemon; + + my $PrevState = Win32::Daemon::SERVICE_START_PENDING(); + Win32::Daemon::StartService() or die $^E; + + while ( 1 ) { + my $State = Win32::Daemon::State(); + last if $State == Win32::Daemon::SERVICE_STOPPED(); + + if ( $State == Win32::Daemon::SERVICE_START_PENDING() ) { + $runsvc->(); + Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() ); + $PrevState = Win32::Daemon::SERVICE_RUNNING(); + } + elsif ( $State == Win32::Daemon::SERVICE_CONTINUE_PENDING() ) { + $ProcessObj->Resume; + Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() ); + $PrevState = Win32::Daemon::SERVICE_RUNNING(); + } + elsif ( $State == Win32::Daemon::SERVICE_STOP_PENDING() ) { + $ProcessObj->Kill(0); + Win32::Daemon::State( Win32::Daemon::SERVICE_STOPPED() ); + $PrevState = Win32::Daemon::SERVICE_STOPPED(); + } + elsif ( $State == Win32::Daemon::SERVICE_RUNNING() ) { + my $Message = Win32::Daemon::QueryLastMessage(1); + if ( $Message == Win32::Daemon::SERVICE_CONTROL_INTERROGATE() ) { + Win32::Daemon::State( $PrevState ); + } + elsif ( $Message == Win32::Daemon::SERVICE_CONTROL_SHUTDOWN() ) { + Win32::Daemon::State( Win32::Daemon::SERVICE_STOP_PENDING(), 15000 ); + } + elsif ( $Message != Win32::Daemon::SERVICE_CONTROL_NONE() ) { + Win32::Daemon::State( $PrevState ); + } + } + + Win32::Sleep( 1000 ); + } + + Win32::Daemon::StopService(); + exit; + } + elsif ($ARGV[0] eq '--help') { + system("perldoc $0"); + exit; + } + elsif ($ARGV[0] ne '--run') { + $SIG{__DIE__} = sub { $ProcessObj->Kill(0) if $ProcessObj }; + $runsvc->(); + warn "RT FastCGI Handler launched. Press [Enter] to terminate...\n"; + ; + exit; + } +} + +############################################################################### + +warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n"; + +require CGI::Fast; +my $h = &RT::Interface::Web::NewCGIHandler(); + +RT::Init(); + +# Response loop +while( my $cgi = CGI::Fast->new ) { + my $comp = $ENV{'PATH_INFO'}; + + $comp = $1 if ($comp =~ /^(.*)$/); + $comp =~ s|^$RT::WebPath\b||i; + $comp .= "index.html" if ($comp =~ /\/$/); + $comp =~ s/.pl$/.html/g; + + warn "Serving $comp\n"; + + $h->handle_cgi($comp); + # _should_ always be tied +} + +1; + +=head1 AUTHORS + +Autrijus Tang Eautrijus@autrijus.orgE + +=head1 COPYRIGHT + +Copyright 2002 by Autrijus Tang Eautrijus@autrijus.orgE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See L + +=cut diff --git a/rt/bin/mason_handler.svc.in b/rt/bin/mason_handler.svc.in new file mode 100644 index 000000000..cc12c0ef0 --- /dev/null +++ b/rt/bin/mason_handler.svc.in @@ -0,0 +1,234 @@ +#!@PERL@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +=head1 NAME + +mason_handler.svc - Win32 IIS Service handler for RT + +=head1 SYNOPSIS + + perl mason_handler.svc --install # install as service + perl mason_handler.svc --deinstall # deinstall this service + perl mason_handler.svc --help # show this help + perl mason_handler.svc # launch handler from command line + +=head1 DESCRIPTION + +This script manages a stand-alone FastCGI server, and populates the necessary +registry settings to run it with Microsoft IIS Server 4.0 or above. + +Before running it, you need to install the B module from CPAN, as well as +B from L if you want to install +itself as a service. + +This script will automatically create a virtual directory under the IIS root; +its name is taken from C<$WebPath> in the F file. Additionally, +please install the ISAPI binary from L and set +up an ISAPI Script Map that maps F<.html> files to F. + +Once the service is launched (either via C or by running +C), a FCGI server will start and bind to port C<8284> +(mnemonics: the ASCII value of C and C); the ISAPI handler's C +registry setting will also be automatically populated. + +=cut + +use strict; +use File::Basename; +require (dirname(__FILE__) . '/webmux.pl'); + +use Cwd; +use File::Spec; + +use Win32; +use Win32::Process; +use Win32::Service; +use Win32::TieRegistry; + +my $ProcessObj; + +BEGIN { + my $runsvc = sub { + Win32::Process::Create( + $ProcessObj, $^X, "$^X $0 --run", 0, NORMAL_PRIORITY_CLASS, "." + ) or do { + die Win32::FormatMessage( Win32::GetLastError() ); + }; + + chdir File::Basename::dirname($0); + my $path = Cwd::cwd(); + $path =~ s|/|\\|g; + $path =~ s|bin$|share\\html|; + + $Win32::TieRegistry::Registry->{ + 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\\'. + 'W3SVC\Parameters\Virtual Roots\\' + }->{$RT::WebPath || '/'} = "$path,,205"; + + $Win32::TieRegistry::Registry->{ + 'HKEY_LOCAL_MACHINE\Software\FASTCGI\.html\\' + }->{'BindPath'} = $ENV{'FCGI_SOCKET_PATH'}; + + Win32::Service::StartService(Win32::NodeName, 'W3SVC'); + }; + + if ($ARGV[0] eq '--deinstall') { + chdir File::Basename::dirname($0); + my $path = Cwd::cwd(); + $path =~ s|/|\\|g; + + require Win32::Daemon; + Win32::Daemon::DeleteService('RTFastCGI'); + warn "Service 'RTFastCGI' successfully deleted.\n"; + exit; + } + elsif ($ARGV[0] eq '--install') { + chdir File::Basename::dirname($0); + my $path = Cwd::cwd(); + $path =~ s|/|\\|g; + + require Win32::Daemon; + Win32::Daemon::DeleteService('RTFastCGI'); + + my $rv = Win32::Daemon::CreateService( { + machine => '', + name => 'RTFastCGI', + display => 'RT FastCGI Handler', + path => $^X, + user => '', + pwd => $path, + description => 'Enables port 8284 as the RT FastCGI handler.', + parameters => File::Spec->catfile( + $path, File::Basename::basename($0) + ) . ' --service', + } ); + + if ($rv) { + warn "Service 'RTFastCGI' successfully created.\n"; + } + else { + warn "Failed to add service: " . Win32::FormatMessage( + Win32::Daemon::GetLastError() + ) . "\n"; + } + exit; + } + elsif ($ARGV[0] eq '--service') { + require Win32::Daemon; + + my $PrevState = Win32::Daemon::SERVICE_START_PENDING(); + Win32::Daemon::StartService() or die $^E; + + while ( 1 ) { + my $State = Win32::Daemon::State(); + last if $State == Win32::Daemon::SERVICE_STOPPED(); + + if ( $State == Win32::Daemon::SERVICE_START_PENDING() ) { + $runsvc->(); + Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() ); + $PrevState = Win32::Daemon::SERVICE_RUNNING(); + } + elsif ( $State == Win32::Daemon::SERVICE_CONTINUE_PENDING() ) { + $ProcessObj->Resume; + Win32::Daemon::State( Win32::Daemon::SERVICE_RUNNING() ); + $PrevState = Win32::Daemon::SERVICE_RUNNING(); + } + elsif ( $State == Win32::Daemon::SERVICE_STOP_PENDING() ) { + $ProcessObj->Kill(0); + Win32::Daemon::State( Win32::Daemon::SERVICE_STOPPED() ); + $PrevState = Win32::Daemon::SERVICE_STOPPED(); + } + elsif ( $State == Win32::Daemon::SERVICE_RUNNING() ) { + my $Message = Win32::Daemon::QueryLastMessage(1); + if ( $Message == Win32::Daemon::SERVICE_CONTROL_INTERROGATE() ) { + Win32::Daemon::State( $PrevState ); + } + elsif ( $Message == Win32::Daemon::SERVICE_CONTROL_SHUTDOWN() ) { + Win32::Daemon::State( Win32::Daemon::SERVICE_STOP_PENDING(), 15000 ); + } + elsif ( $Message != Win32::Daemon::SERVICE_CONTROL_NONE() ) { + Win32::Daemon::State( $PrevState ); + } + } + + Win32::Sleep( 1000 ); + } + + Win32::Daemon::StopService(); + exit; + } + elsif ($ARGV[0] eq '--help') { + system("perldoc $0"); + exit; + } + elsif ($ARGV[0] ne '--run') { + $SIG{__DIE__} = sub { $ProcessObj->Kill(0) if $ProcessObj }; + $runsvc->(); + warn "RT FastCGI Handler launched. Press [Enter] to terminate...\n"; + ; + exit; + } +} + +############################################################################### + +warn "Begin listening on $ENV{'FCGI_SOCKET_PATH'}\n"; + +require CGI::Fast; +my $h = &RT::Interface::Web::NewCGIHandler(); + +RT::Init(); + +# Response loop +while( my $cgi = CGI::Fast->new ) { + my $comp = $ENV{'PATH_INFO'}; + + $comp = $1 if ($comp =~ /^(.*)$/); + $comp =~ s|^$RT::WebPath\b||i; + $comp .= "index.html" if ($comp =~ /\/$/); + $comp =~ s/.pl$/.html/g; + + warn "Serving $comp\n"; + + $h->handle_cgi($comp); + # _should_ always be tied +} + +1; + +=head1 AUTHORS + +Autrijus Tang Eautrijus@autrijus.orgE + +=head1 COPYRIGHT + +Copyright 2002 by Autrijus Tang Eautrijus@autrijus.orgE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See L + +=cut diff --git a/rt/bin/rt-commit-handler b/rt/bin/rt-commit-handler new file mode 100644 index 000000000..29e443ebd --- /dev/null +++ b/rt/bin/rt-commit-handler @@ -0,0 +1,846 @@ +#!/usr/bin/perl -w +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +# {{{ Docs +# -*-Perl-*- +# +#ident "@(#)ccvs/contrib:$Name: $:$Id: rt-commit-handler,v 1.1 2003-07-15 13:16:15 ivan Exp $" +# +# Perl filter to handle the log messages from the checkin of files in multiple +# directories. This script will group the lists of files by log message, and +# send one piece of mail per unique message, no matter how many files are +# committed. + +=head1 NAME rt-commit-handler + +=head1 USAGE + + + +=head2 Regular use + +Stick the following in in CVSROOT/commitinfo + + ALL /opt/rt3/bin/rt-commit-handler --record-last-dir + +Stick the following in CVSROOT/loginfo + + ALL /opt/rt3/bin/rt-commit-handler --cvs-root /pathtocvs/root --rt %{Vvts} + +=head2 Invocation (advanced use) + +rt-commit-handler --cvs-root /path/to/cvs/root [-d] [-D] [-r] [-M module] \ + [[-m mailto] ...] [[-R replyto] ...] [-f logfile] + + + -d - turn on debugging + -m mailto - send mail to "mailto" (multiple) + -R replyto - set the "Reply-To:" to "replyto" (multiple) + -M modulename - set module name to "modulename" + -f logfile - write commit messages to logfile too + -D - generate diff commands + --rt - invoke RT commit handler + --cvs-root - specify your CVS root + + --record-last-dir - Record the last directory with changes in + pre-commit (commitinfo) mode + + +=cut + +# }}} + +use strict; +use Carp; +use Getopt::Long; +use Text::Wrap; +use Digest::MD5; +use MIME::Entity; + +use lib ("/opt/rt3/lib", "/opt/rt3/local/lib"); + +use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); + +use vars + qw(@MAILER $TMPDIR $FILE_PREFIX $LASTDIR_FILE $HASH_FILE $VERSION_FILE $MESSAGE_FILE $MAIL_FILE $DEBUG $MAILTO $REPLYTO $id $MODULE_NAME + $LOGIN $COMMITLOG $CVS_ROOT $RT_HANDLER); + +#Clean out all the nasties from the environment +CleanEnv(); + +#Load etc/config.pm and drop privs +RT::LoadConfig(); + +#Drop setgid permissions +RT::DropSetGIDPermissions(); + +# {{{ Variable setup +$TMPDIR = '/tmp'; +$FILE_PREFIX = $TMPDIR . '/#cvs.'; + +# The root of your CVS install. we should get this from some smarter place. +# It needs a trailing / + +$LASTDIR_FILE = $FILE_PREFIX . "lastdir"; +$HASH_FILE = $FILE_PREFIX . "hash"; +$VERSION_FILE = $FILE_PREFIX . "version"; +$MESSAGE_FILE = $FILE_PREFIX . "message"; +$MAIL_FILE = $FILE_PREFIX . "mail"; + +$DEBUG = 0; +$RT_HANDLER = 1; + +$MAILTO = ''; + +my @files = (); +my (@log_lines); +my $do_diff = 0; +my $id = getpgrp(); # note, you *must* use a shell which does setpgrp() +$LOGIN = getpwuid($<); + +# }}} + +die "User could not be found" unless ($LOGIN); + +# {{{ parse command line arguments (file list is seen as one arg) +# +while ( my $arg = shift @ARGV ) { + + if ( $arg eq '-d' ) { + $DEBUG = 1; + warn "Debug turned on...\n"; + } + elsif ( $arg =~ /^--record-last-dir$/i ) { + record_last_dir( $id, $ARGV[0] ); + exit(0); + } + elsif ( $arg eq '-m' ) { + $MAILTO .= ", " if $MAILTO; + $MAILTO .= shift @ARGV; + } + elsif ( $arg eq '--rt' ) { + $RT_HANDLER = 1; + } + elsif ( $arg eq '-R' ) { + $REPLYTO .= ", " if $REPLYTO; + $REPLYTO .= shift @ARGV; + } + elsif ( $arg eq '-M' ) { + die ("too many '-M' args\n") if $MODULE_NAME; + $MODULE_NAME = shift @ARGV; + } + elsif ( $arg eq '--cvs-root' ) { + $CVS_ROOT = shift @ARGV; + $CVS_ROOT .= "/" unless ( $CVS_ROOT =~ /\/$/ ); + } + elsif ( $arg eq '-f' ) { + die ("too many '-f' args\n") if $COMMITLOG; + $COMMITLOG = shift @ARGV; + + # This is a disgusting hack to untaint $COMMITLOG if we're running from + # setgid cvs. + $COMMITLOG = untaint($COMMITLOG); + } + elsif ( $arg eq '-D' ) { + $do_diff = 1; + } + else { + @files = split ( ' ', $arg ); + last; + } +} + +# }}} + +$REPLYTO = $LOGIN unless ($REPLYTO); + +# for now, the first "file" is the repository directory being committed, +# relative to the $CVSROOT location +# +my $dir = shift @files; + +# XXX there are some ugly assumptions in here about module names and +# XXX directories relative to the $CVSROOT location -- really should +# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since +# XXX we have to parse it backwards. +# +# XXX For now we set the `module' name to the top-level directory name. +# +unless ($MODULE_NAME) { + ($MODULE_NAME) = split ( '/', $dir, 2 ); +} + +if ($DEBUG) { + warn "module - ", $MODULE_NAME, "\n"; + warn "dir - ", $dir, "\n"; + warn "files - ", join ( " ", @files ), "\n"; + warn "id - ", $id, "\n"; +} + +# {{{ Check for a new directory or an import command. + +# +# files[0] - "-" +# files[1] - "New" +# files[2] - "directory" +# +# files[0] - "-" +# files[1] - "Imported" +# files[2] - "sources" +# +if ( $files[0] eq "-" ) { + + #we just don't care about New Directory notes + unless ( $files[1] eq "New" && $files[2] eq "directory" ) { + + my @text = (); + + push @text, build_header(); + push @text, ""; + + while ( my $line = ) { + chop $line; # Drop the newline + push @text, $line; + } + + append_logfile( $COMMITLOG, @text ) if ($COMMITLOG); + + mail_notification( $id, @text ); + } + + exit 0; +} + +# }}} + +# {{{ Collect just the log message from stdin. +# + +while ( my $line = ) { + chop $line; # strip the newline + last if ( $line =~ /^Log Message:$/ ); +} +while ( my $line = ) { + chop $line; # strip the newline + $line =~ s/\s+$//; # strip trailing white space + push @log_lines, $line; +} + +my $md5 = Digest::MD5->new(); +foreach my $line (@log_lines) { + $md5->add( $line . "\n" ); +} +my $hash = $md5->hexdigest(); + +warn "hash = $hash\n" if ($DEBUG); + +if ( !-e "$MESSAGE_FILE.$id.$hash" ) { + append_logfile( "$HASH_FILE.$id", $hash ); + write_file( "$MESSAGE_FILE.$id.$hash", @log_lines ); +} + +# }}} + +# Spit out the information gathered in this pass. + +append_logfile( "$VERSION_FILE.$id.$hash", $dir . '/', @files ); + +# {{{ Check whether this is the last directory. If not, quit. + +warn "Checking current dir against last dir $LASTDIR_FILE.$id\n" if ($DEBUG); + +my @last_dir = read_file("$LASTDIR_FILE.$id"); + +unless ($CVS_ROOT) { + die "No cvs root specified with --cvs-root. Can't continue."; +} + +if ( $last_dir[0] ne $CVS_ROOT . $dir ) { + warn "Current directory $CVS_ROOT$dir is not last directory $last_dir[0].\n" + if ($DEBUG); + exit 0; +} + +# }}} + +# {{{ End Of Commits! +# + +# This is it. The commits are all finished. Lump everything together +# into a single message, fire a copy off to the mailing list, and drop +# it on the end of the Changes file. +# + +# +# Produce the final compilation of the log messages +# + +my @hashes = read_file("$HASH_FILE.$id"); +my (@text); + +push @text, build_header(); +push @text, ""; + +my ( @added_files, @modified_files, @removed_files ); + +foreach my $hash (@hashes) { + + # In case we're running setgid, make sure the hash file hasn't been hacked. + $hash =~ m/([a-z0-9]*)/ || die "*** Hacking attempt detected\n"; + $hash = $1; + + my @files = read_file("$VERSION_FILE.$id.$hash"); + my @log_lines = read_file("$MESSAGE_FILE.$id.$hash"); + + my $working_on_dir; # gets set as we iterate through the files. + foreach my $file (@files) { + + #If we've entered a new directory, make a note of that and remove the trailing / + + if ( $file =~ s'\/$'' ) { + $working_on_dir = $file; + next; + } + + my @file_entry = ( split ( ',', $file, 4 ), $working_on_dir ); + + # file_entry looks like ths: + + # 0 1 2 3 4 + # Old rev : new rev : tag: file :directory + my $entry = {}; + $entry->{'old'} = $file_entry[0]; + $entry->{'new'} = $file_entry[1]; + $entry->{'tag'} = $file_entry[2]; + $entry->{'file'} = $file_entry[3]; + $entry->{'dir'} = $file_entry[4]; + + if ( $file_entry[0] eq 'NONE' ) { + $entry->{'old'} = '0'; + push @added_files, $entry; + } + elsif ( $file_entry[1] eq 'NONE' ) { + $entry->{'new'} = '0'; + push @removed_files, $entry; + } + else { + push @modified_files, $entry; + } + } +} + +# }}} + +# {{{ start building up the body + +# Strip leading and trailing blank lines from the log message. Also +# compress multiple blank lines in the body of the message down to a +# single blank line. +# + +my $blank = 1; +@log_lines = map { + my $wasblank = $blank; + $blank = $_ eq ''; + $blank && $wasblank ? () : $_; +} @log_lines; + +pop @log_lines if $blank; + +@modified_files = order_and_summarize_diffs(@modified_files); +@added_files = order_and_summarize_diffs(@added_files); +@removed_files = order_and_summarize_diffs(@removed_files); + +push @text, "Modified Files:", format_lists(@modified_files) + if (@modified_files); + +push @text, "Added Files:", format_lists(@added_files) if (@added_files); + +push @text, "Removed Files:", format_lists(@removed_files) if (@removed_files); + +push @text, "", "Log Message", @log_lines if (@log_lines); + +push @text, ""; + +if ($RT_HANDLER) { + rt_handler( + @log_lines, "\n", + loc("To generate a diff of this commit:\n"), "\n", + format_diffs( @modified_files, @added_files, @removed_files ) + ); +} + +if ($COMMITLOG) { + append_logfile( $COMMITLOG, @text ); +} + +if ($do_diff) { + push @text, ""; + push @text, loc("To generate a diff of this commit:"); + push @text, format_diffs( @modified_files, @added_files, @removed_files ); + push @text, ""; +} + +# }}} + +# {{{ Mail out the notification. + +mail_notification( $id, @text ); + +# }}} + +# {{{ clean up + +unless ($DEBUG) { + $hash = untaint($hash); + $id = untaint($id); + unlink "$VERSION_FILE.$id.$hash"; + unlink "$MESSAGE_FILE.$id.$hash"; + unlink "$MAIL_FILE.$id"; + unlink "$LASTDIR_FILE.$id"; + unlink "$HASH_FILE.$id"; +} + +# }}} + +exit 0; + +# {{{ Subroutines +# + +# {{{ append_logfile +sub append_logfile { + my $filename = shift; + my (@lines) = @_; + + $filename = untaint($filename); + + open( FILE, ">>$filename" ) + || die ("Cannot open file $filename for append.\n"); + foreach my $line (@lines) { + print FILE $line . "\n"; + } + close(FILE); +} + +# }}} + +# {{{ write_file +sub write_file { + my $filename = shift; + my (@lines) = @_; + + $filename = untaint($filename); + + open( FILE, ">$filename" ) + || die ("Cannot open file $filename for write.\n"); + foreach my $line (@lines) { + print FILE $line . "\n"; + } + close(FILE); +} + +# }}} + +# {{{ read_file +sub read_file { + my $filename = shift; + my (@lines); + + open( FILE, "<$filename" ) + || die ("Cannot open file $filename for read.\n"); + while ( my $line = ) { + chop $line; + push @lines, $line; + } + close(FILE); + + return (@lines); +} + +# }}} + +# {{{ sub format_lists + +sub format_lists { + my @items = (@_); + + my $files = ""; + map { + $_->{'files'} && ( $files .= ' ' . join ( ' ', @{ $_->{'files'} } ) ); + } @items; + + my @lines = wrap( "\t", "\t\t", $files ); + return (@lines); + +} + +# }}} + +# {{{ sub format_diffs + +sub format_diffs { + my @items = (@_); + + my @lines; + foreach my $item (@items) { + next unless ( $item->{'files'} ); + push ( @lines, + "cvs diff -r" + . $item->{'old'} . " -r" + . $item->{'new'} . " " + . join ( " ", @{ $item->{'files'} } ) . "\n" ); + + } + + @lines = fill( "\t", "\t\t", @lines ); + + return (@lines); +} + +# }}} + +# {{{ sub order_and_summarize_diffs { + +# takes an array of file items +# returns a sorted array of fileset items, which are like file items, except they can have an array of files, rather than +# a singleton file. + +sub order_and_summarize_diffs { + + my @files = (@_); + + # Sort by tag, dir, file. + @files = sort { + $a->{'tag'} cmp $b->{'tag'} + || $a->{'dir'} cmp $b->{'dir'} + || $a->{'file'} cmp $b->{'file'}; + } @files; + + # Combine adjacent rows that are the same modulo the file name. + + my @items = (undef); + + foreach my $file (@files) { + if ( $#items == -1 #if it's empty + || ( !defined $items[-1]->{'old'} + || $items[-1]->{'old'} ne $file->{'old'} ) + || ( !defined $items[-1]->{'new'} + || $items[-1]->{'new'} ne $file->{'new'} ) + || ( !defined $items[-1]->{'tag'} + || $items[-1]->{'tag'} ne $file->{'tag'} ) ) + { + + push ( @items, $file ); + } + push ( @{ $items[-1]->{'files'} }, + $file->{'dir'} . "/" . $file->{'file'} ); + } + + return (@items); +} + +# }}} + +# {{{ build_header + +sub build_header { + my $now = gmtime; + my $header = + sprintf( "Module Name:\t%s\nCommitted By:\t%s\nDate:\t\t%s %s %s", + $MODULE_NAME, $LOGIN, substr( $now, 0, 19 ), "UTC", + substr( $now, 20, 4 ) ); + return ($header); +} + +# }}} + +# {{{ mail_notification +sub mail_notification { + my $id = shift; + my (@text) = @_; + write_file( "$MAIL_FILE.$id", "From: " . $LOGIN, + "Subject: CVS commit: " . $MODULE_NAME, "To: " . $MAILTO, + "Reply-To: " . $REPLYTO, "", "", @text ); + + my $entity = MIME::Entity->build( + From => $LOGIN, + To => $MAILTO, + Subject => "CVS commit: " . $MODULE_NAME, + 'Reply-To' => $REPLYTO, + Data => join ( "\n", @text ) + ); + if ( $RT::MailCommand eq 'sendmailpipe' ) { + open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ) + || die "Couldn't send mail: " . $@ . "\n"; + print MAIL $entity->as_string; + close(MAIL); + } + else { + $entity->send( $RT::MailCommand, $RT::MailParams ); + } + +} + +# }}} + +# {{{ sub record_last_dir + +sub record_last_dir { + my $id = shift; + my $dir = shift; + + # make a note of this directory. later, we'll use this to + # figure out if we've gone through the whole commit, + # for something that is a bad mockery of attomic commits. + + warn "about to write $dir to $LASTDIR_FILE.$id" if ($DEBUG); + + write_file( "$LASTDIR_FILE.$id", $dir ); +} + +# }}} + +# {{{ Get the RT stuff set up + +# {{{ sub rt_handler + +sub rt_handler { + my (@LogMessage) = (@_); + + #Connect to the database and get RT::SystemUser and RT::Nobody loaded + RT::Init; + + require RT::Ticket; + + #Get the current user all loaded + my $CurrentUser = GetCurrentUser(); + + if ( !$CurrentUser->Id ) { + print +loc("No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\n"); + return; + } + + my (@commands) = find_commands( \@LogMessage ); + + my ( @tickets, @errors ); + + # Get the list of tickets we're working with out of commands + grep { $_ =~ /^RT-Ticket:\s*(.*?)$/i && push ( @tickets, $1 ) } @commands; + + my $message = new MIME::Entity; + $message->build( + From => $CurrentUser->EmailAddress, + Subject => 'CVS Commit', + Data => \@LogMessage + ); + + # {{{ comment or correspond, as needed + + foreach my $ticket (@tickets) { + my $TicketObj = RT::Ticket->new($CurrentUser); + $TicketObj->Load($ticket); + my ( $id, $msg ); + unless ( $TicketObj->Id ) { + push ( @errors, +"Couldn't load ticket #$ticket. Not adding commit log to ticket history.\n" + ); + } + + if ( $LogMessage[0] =~ /^(comment|private)$/ ) { + ( $id, $msg ) = $TicketObj->Comment( MIMEObj => $message ); + + } + else { + ( $id, $msg ) = $TicketObj->Correspond( MIMEObj => $message ); + } + + push ( @errors, ">> Log message", + "Ticket #" . $TicketObj->Id . ": " . $msg ); + + } + + # }}} + + my ($reply) = ActOnPseudoHeaders( $CurrentUser, @commands ); + print "$reply\n" if ($reply); + print join ( "\n", @errors ); + print "\n"; + +} + +# }}} + +# {{{ sub find_commands + +sub find_commands { + my $lines = shift; + my (@pseudoheaders); + + while ( my $line = shift @{$lines} ) { + next if $line =~ /^\s*?$/; + if ( $line =~ /^RT-/i ) { + + push ( @pseudoheaders, $line ); + } + + #If we find a line that's not a command, get out. + else { + unshift ( @{$lines}, $line ); + last; + } + } + + return (@pseudoheaders); + +} + +# }}} + +# {{{ sub ActOnPseudoHeaders + +=item ActOnPseudoHeaders $PseudoHeaders + +Takes a string of pseudo-headers, iterates through them and does what they tell it to. + +=cut + +sub ActOnPseudoHeaders { + my $CurrentUser = shift; + my (@actions) = (@_); + + my $ResultsMessage = ''; + my $Ticket = RT::Ticket->new($CurrentUser); + + foreach my $action (@actions) { + my ($val); + my $msg = ''; + + $ResultsMessage .= ">>> $action\n"; + + if ( $action =~ /^RT-(.*?):\s*(.*)$/i ) { + my $command = $1; + my $args = $2; + + if ( $command =~ /^ticket$/i ) { + + $val = $Ticket->Load($args); + unless ($val) { + $ResultsMessage .= + loc("ERROR: Couldn't load ticket '[_1]': [_2].\n", $1, $msg); + . loc("Aborting to avoid unintended ticket modifications.\n") + . loc("The following commands were not proccessed:\n\n") + . join ( "\n", @actions ); + return ($ResultsMessage); + } + $ResultsMessage .= loc("Ticket [_1] loaded\n", $Ticket->Id); + } + else { + unless ( $Ticket->Id ) { + $ResultsMessage .= loc("No Ticket specified. Aborting ticket ") + . loc("modifications\n\n") + . loc("The following commands were not proccessed:\n\n") + . join ( "\n", @actions ); + return ($ResultsMessage); + } + + # Deal with the basics + if ( $command =~ /^(Subject|Owner|Status|Queue)$/i ) { + my $method = 'Set' . ucfirst( lc($1) ); + ( $val, $msg ) = $Ticket->$method($args); + } + + # Deal with the dates + elsif ( $command =~ /^(due|starts|started|resolved)$/i ) { + my $method = 'Set' . ucfirst( lc($1) ); + my $date = new RT::Date($CurrentUser); + $date->Set( Format => 'unknown', Value => $args ); + ( $val, $msg ) = $Ticket->$method( $date->ISO ); + } + + # Deal with the watchers + elsif ( $command =~ /^(requestor|requestors|cc|admincc)$/i ) { + my $operator = "+"; + my ($type); + if ( $args =~ /^(\+|\-)(.*)$/ ) { + $operator = $1; + $args = $2; + } + $type = 'Requestor' if ( $command =~ /^requestor/i ); + $type = 'Cc' if ( $command =~ /^cc/i ); + $type = 'AdminCc' if ( $command =~ /^admincc/i ); + + my $user = RT::User->new($CurrentUser); + $user->Load($args); + + if ($operator eq '+') { + ($val, $msg) = $Ticket->AddWatcher( Type => $type, + PrincipalId => $user->PrincipalId); + } elsif ($operator eq '-') { + ($val, $msg) = $Ticket->DeleteWatcher( Type => $type, + PrincipalId => $user->PrincipalId); + } + + } + $ResultsMessage .= $msg . "\n"; + } + + } + return ($ResultsMessage); + +} + +# }}} + +# {{{ sub untaint +sub untaint { + my $val = shift; + + if ( $val =~ /^([-\#\/\w.]+)$/ ) { + $val = $1; # $data now untainted + } + else { + die loc("Bad data in [_1]", $val); # log this somewhere + } + return ($val); +} + +# }}} + +=head1 AUTHOR + + + + rt-commit-handler is a rewritten version of the NetBSD commit handler, + which was placed in the public domain by Charles Hannum. It bore the following + authors statement: + + Contributed by David Hampton + Hacked greatly by Greg A. Woods + Rewritten by Charles M. Hannum + +=cut + diff --git a/rt/bin/rt-commit-handler.in b/rt/bin/rt-commit-handler.in new file mode 100644 index 000000000..02b01abff --- /dev/null +++ b/rt/bin/rt-commit-handler.in @@ -0,0 +1,846 @@ +#!@PERL@ -w +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +# {{{ Docs +# -*-Perl-*- +# +#ident "@(#)ccvs/contrib:$Name: $:$Id: rt-commit-handler.in,v 1.1 2003-07-15 13:16:15 ivan Exp $" +# +# Perl filter to handle the log messages from the checkin of files in multiple +# directories. This script will group the lists of files by log message, and +# send one piece of mail per unique message, no matter how many files are +# committed. + +=head1 NAME rt-commit-handler + +=head1 USAGE + + + +=head2 Regular use + +Stick the following in in CVSROOT/commitinfo + + ALL @RT_BIN_PATH@/rt-commit-handler --record-last-dir + +Stick the following in CVSROOT/loginfo + + ALL @RT_BIN_PATH@/rt-commit-handler --cvs-root /pathtocvs/root --rt %{Vvts} + +=head2 Invocation (advanced use) + +rt-commit-handler --cvs-root /path/to/cvs/root [-d] [-D] [-r] [-M module] \ + [[-m mailto] ...] [[-R replyto] ...] [-f logfile] + + + -d - turn on debugging + -m mailto - send mail to "mailto" (multiple) + -R replyto - set the "Reply-To:" to "replyto" (multiple) + -M modulename - set module name to "modulename" + -f logfile - write commit messages to logfile too + -D - generate diff commands + --rt - invoke RT commit handler + --cvs-root - specify your CVS root + + --record-last-dir - Record the last directory with changes in + pre-commit (commitinfo) mode + + +=cut + +# }}} + +use strict; +use Carp; +use Getopt::Long; +use Text::Wrap; +use Digest::MD5; +use MIME::Entity; + +use lib ("@RT_LIB_PATH@", "@LOCAL_LIB_PATH@"); + +use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); + +use vars + qw(@MAILER $TMPDIR $FILE_PREFIX $LASTDIR_FILE $HASH_FILE $VERSION_FILE $MESSAGE_FILE $MAIL_FILE $DEBUG $MAILTO $REPLYTO $id $MODULE_NAME + $LOGIN $COMMITLOG $CVS_ROOT $RT_HANDLER); + +#Clean out all the nasties from the environment +CleanEnv(); + +#Load etc/config.pm and drop privs +RT::LoadConfig(); + +#Drop setgid permissions +RT::DropSetGIDPermissions(); + +# {{{ Variable setup +$TMPDIR = '/tmp'; +$FILE_PREFIX = $TMPDIR . '/#cvs.'; + +# The root of your CVS install. we should get this from some smarter place. +# It needs a trailing / + +$LASTDIR_FILE = $FILE_PREFIX . "lastdir"; +$HASH_FILE = $FILE_PREFIX . "hash"; +$VERSION_FILE = $FILE_PREFIX . "version"; +$MESSAGE_FILE = $FILE_PREFIX . "message"; +$MAIL_FILE = $FILE_PREFIX . "mail"; + +$DEBUG = 0; +$RT_HANDLER = 1; + +$MAILTO = ''; + +my @files = (); +my (@log_lines); +my $do_diff = 0; +my $id = getpgrp(); # note, you *must* use a shell which does setpgrp() +$LOGIN = getpwuid($<); + +# }}} + +die "User could not be found" unless ($LOGIN); + +# {{{ parse command line arguments (file list is seen as one arg) +# +while ( my $arg = shift @ARGV ) { + + if ( $arg eq '-d' ) { + $DEBUG = 1; + warn "Debug turned on...\n"; + } + elsif ( $arg =~ /^--record-last-dir$/i ) { + record_last_dir( $id, $ARGV[0] ); + exit(0); + } + elsif ( $arg eq '-m' ) { + $MAILTO .= ", " if $MAILTO; + $MAILTO .= shift @ARGV; + } + elsif ( $arg eq '--rt' ) { + $RT_HANDLER = 1; + } + elsif ( $arg eq '-R' ) { + $REPLYTO .= ", " if $REPLYTO; + $REPLYTO .= shift @ARGV; + } + elsif ( $arg eq '-M' ) { + die ("too many '-M' args\n") if $MODULE_NAME; + $MODULE_NAME = shift @ARGV; + } + elsif ( $arg eq '--cvs-root' ) { + $CVS_ROOT = shift @ARGV; + $CVS_ROOT .= "/" unless ( $CVS_ROOT =~ /\/$/ ); + } + elsif ( $arg eq '-f' ) { + die ("too many '-f' args\n") if $COMMITLOG; + $COMMITLOG = shift @ARGV; + + # This is a disgusting hack to untaint $COMMITLOG if we're running from + # setgid cvs. + $COMMITLOG = untaint($COMMITLOG); + } + elsif ( $arg eq '-D' ) { + $do_diff = 1; + } + else { + @files = split ( ' ', $arg ); + last; + } +} + +# }}} + +$REPLYTO = $LOGIN unless ($REPLYTO); + +# for now, the first "file" is the repository directory being committed, +# relative to the $CVSROOT location +# +my $dir = shift @files; + +# XXX there are some ugly assumptions in here about module names and +# XXX directories relative to the $CVSROOT location -- really should +# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since +# XXX we have to parse it backwards. +# +# XXX For now we set the `module' name to the top-level directory name. +# +unless ($MODULE_NAME) { + ($MODULE_NAME) = split ( '/', $dir, 2 ); +} + +if ($DEBUG) { + warn "module - ", $MODULE_NAME, "\n"; + warn "dir - ", $dir, "\n"; + warn "files - ", join ( " ", @files ), "\n"; + warn "id - ", $id, "\n"; +} + +# {{{ Check for a new directory or an import command. + +# +# files[0] - "-" +# files[1] - "New" +# files[2] - "directory" +# +# files[0] - "-" +# files[1] - "Imported" +# files[2] - "sources" +# +if ( $files[0] eq "-" ) { + + #we just don't care about New Directory notes + unless ( $files[1] eq "New" && $files[2] eq "directory" ) { + + my @text = (); + + push @text, build_header(); + push @text, ""; + + while ( my $line = ) { + chop $line; # Drop the newline + push @text, $line; + } + + append_logfile( $COMMITLOG, @text ) if ($COMMITLOG); + + mail_notification( $id, @text ); + } + + exit 0; +} + +# }}} + +# {{{ Collect just the log message from stdin. +# + +while ( my $line = ) { + chop $line; # strip the newline + last if ( $line =~ /^Log Message:$/ ); +} +while ( my $line = ) { + chop $line; # strip the newline + $line =~ s/\s+$//; # strip trailing white space + push @log_lines, $line; +} + +my $md5 = Digest::MD5->new(); +foreach my $line (@log_lines) { + $md5->add( $line . "\n" ); +} +my $hash = $md5->hexdigest(); + +warn "hash = $hash\n" if ($DEBUG); + +if ( !-e "$MESSAGE_FILE.$id.$hash" ) { + append_logfile( "$HASH_FILE.$id", $hash ); + write_file( "$MESSAGE_FILE.$id.$hash", @log_lines ); +} + +# }}} + +# Spit out the information gathered in this pass. + +append_logfile( "$VERSION_FILE.$id.$hash", $dir . '/', @files ); + +# {{{ Check whether this is the last directory. If not, quit. + +warn "Checking current dir against last dir $LASTDIR_FILE.$id\n" if ($DEBUG); + +my @last_dir = read_file("$LASTDIR_FILE.$id"); + +unless ($CVS_ROOT) { + die "No cvs root specified with --cvs-root. Can't continue."; +} + +if ( $last_dir[0] ne $CVS_ROOT . $dir ) { + warn "Current directory $CVS_ROOT$dir is not last directory $last_dir[0].\n" + if ($DEBUG); + exit 0; +} + +# }}} + +# {{{ End Of Commits! +# + +# This is it. The commits are all finished. Lump everything together +# into a single message, fire a copy off to the mailing list, and drop +# it on the end of the Changes file. +# + +# +# Produce the final compilation of the log messages +# + +my @hashes = read_file("$HASH_FILE.$id"); +my (@text); + +push @text, build_header(); +push @text, ""; + +my ( @added_files, @modified_files, @removed_files ); + +foreach my $hash (@hashes) { + + # In case we're running setgid, make sure the hash file hasn't been hacked. + $hash =~ m/([a-z0-9]*)/ || die "*** Hacking attempt detected\n"; + $hash = $1; + + my @files = read_file("$VERSION_FILE.$id.$hash"); + my @log_lines = read_file("$MESSAGE_FILE.$id.$hash"); + + my $working_on_dir; # gets set as we iterate through the files. + foreach my $file (@files) { + + #If we've entered a new directory, make a note of that and remove the trailing / + + if ( $file =~ s'\/$'' ) { + $working_on_dir = $file; + next; + } + + my @file_entry = ( split ( ',', $file, 4 ), $working_on_dir ); + + # file_entry looks like ths: + + # 0 1 2 3 4 + # Old rev : new rev : tag: file :directory + my $entry = {}; + $entry->{'old'} = $file_entry[0]; + $entry->{'new'} = $file_entry[1]; + $entry->{'tag'} = $file_entry[2]; + $entry->{'file'} = $file_entry[3]; + $entry->{'dir'} = $file_entry[4]; + + if ( $file_entry[0] eq 'NONE' ) { + $entry->{'old'} = '0'; + push @added_files, $entry; + } + elsif ( $file_entry[1] eq 'NONE' ) { + $entry->{'new'} = '0'; + push @removed_files, $entry; + } + else { + push @modified_files, $entry; + } + } +} + +# }}} + +# {{{ start building up the body + +# Strip leading and trailing blank lines from the log message. Also +# compress multiple blank lines in the body of the message down to a +# single blank line. +# + +my $blank = 1; +@log_lines = map { + my $wasblank = $blank; + $blank = $_ eq ''; + $blank && $wasblank ? () : $_; +} @log_lines; + +pop @log_lines if $blank; + +@modified_files = order_and_summarize_diffs(@modified_files); +@added_files = order_and_summarize_diffs(@added_files); +@removed_files = order_and_summarize_diffs(@removed_files); + +push @text, "Modified Files:", format_lists(@modified_files) + if (@modified_files); + +push @text, "Added Files:", format_lists(@added_files) if (@added_files); + +push @text, "Removed Files:", format_lists(@removed_files) if (@removed_files); + +push @text, "", "Log Message", @log_lines if (@log_lines); + +push @text, ""; + +if ($RT_HANDLER) { + rt_handler( + @log_lines, "\n", + loc("To generate a diff of this commit:\n"), "\n", + format_diffs( @modified_files, @added_files, @removed_files ) + ); +} + +if ($COMMITLOG) { + append_logfile( $COMMITLOG, @text ); +} + +if ($do_diff) { + push @text, ""; + push @text, loc("To generate a diff of this commit:"); + push @text, format_diffs( @modified_files, @added_files, @removed_files ); + push @text, ""; +} + +# }}} + +# {{{ Mail out the notification. + +mail_notification( $id, @text ); + +# }}} + +# {{{ clean up + +unless ($DEBUG) { + $hash = untaint($hash); + $id = untaint($id); + unlink "$VERSION_FILE.$id.$hash"; + unlink "$MESSAGE_FILE.$id.$hash"; + unlink "$MAIL_FILE.$id"; + unlink "$LASTDIR_FILE.$id"; + unlink "$HASH_FILE.$id"; +} + +# }}} + +exit 0; + +# {{{ Subroutines +# + +# {{{ append_logfile +sub append_logfile { + my $filename = shift; + my (@lines) = @_; + + $filename = untaint($filename); + + open( FILE, ">>$filename" ) + || die ("Cannot open file $filename for append.\n"); + foreach my $line (@lines) { + print FILE $line . "\n"; + } + close(FILE); +} + +# }}} + +# {{{ write_file +sub write_file { + my $filename = shift; + my (@lines) = @_; + + $filename = untaint($filename); + + open( FILE, ">$filename" ) + || die ("Cannot open file $filename for write.\n"); + foreach my $line (@lines) { + print FILE $line . "\n"; + } + close(FILE); +} + +# }}} + +# {{{ read_file +sub read_file { + my $filename = shift; + my (@lines); + + open( FILE, "<$filename" ) + || die ("Cannot open file $filename for read.\n"); + while ( my $line = ) { + chop $line; + push @lines, $line; + } + close(FILE); + + return (@lines); +} + +# }}} + +# {{{ sub format_lists + +sub format_lists { + my @items = (@_); + + my $files = ""; + map { + $_->{'files'} && ( $files .= ' ' . join ( ' ', @{ $_->{'files'} } ) ); + } @items; + + my @lines = wrap( "\t", "\t\t", $files ); + return (@lines); + +} + +# }}} + +# {{{ sub format_diffs + +sub format_diffs { + my @items = (@_); + + my @lines; + foreach my $item (@items) { + next unless ( $item->{'files'} ); + push ( @lines, + "cvs diff -r" + . $item->{'old'} . " -r" + . $item->{'new'} . " " + . join ( " ", @{ $item->{'files'} } ) . "\n" ); + + } + + @lines = fill( "\t", "\t\t", @lines ); + + return (@lines); +} + +# }}} + +# {{{ sub order_and_summarize_diffs { + +# takes an array of file items +# returns a sorted array of fileset items, which are like file items, except they can have an array of files, rather than +# a singleton file. + +sub order_and_summarize_diffs { + + my @files = (@_); + + # Sort by tag, dir, file. + @files = sort { + $a->{'tag'} cmp $b->{'tag'} + || $a->{'dir'} cmp $b->{'dir'} + || $a->{'file'} cmp $b->{'file'}; + } @files; + + # Combine adjacent rows that are the same modulo the file name. + + my @items = (undef); + + foreach my $file (@files) { + if ( $#items == -1 #if it's empty + || ( !defined $items[-1]->{'old'} + || $items[-1]->{'old'} ne $file->{'old'} ) + || ( !defined $items[-1]->{'new'} + || $items[-1]->{'new'} ne $file->{'new'} ) + || ( !defined $items[-1]->{'tag'} + || $items[-1]->{'tag'} ne $file->{'tag'} ) ) + { + + push ( @items, $file ); + } + push ( @{ $items[-1]->{'files'} }, + $file->{'dir'} . "/" . $file->{'file'} ); + } + + return (@items); +} + +# }}} + +# {{{ build_header + +sub build_header { + my $now = gmtime; + my $header = + sprintf( "Module Name:\t%s\nCommitted By:\t%s\nDate:\t\t%s %s %s", + $MODULE_NAME, $LOGIN, substr( $now, 0, 19 ), "UTC", + substr( $now, 20, 4 ) ); + return ($header); +} + +# }}} + +# {{{ mail_notification +sub mail_notification { + my $id = shift; + my (@text) = @_; + write_file( "$MAIL_FILE.$id", "From: " . $LOGIN, + "Subject: CVS commit: " . $MODULE_NAME, "To: " . $MAILTO, + "Reply-To: " . $REPLYTO, "", "", @text ); + + my $entity = MIME::Entity->build( + From => $LOGIN, + To => $MAILTO, + Subject => "CVS commit: " . $MODULE_NAME, + 'Reply-To' => $REPLYTO, + Data => join ( "\n", @text ) + ); + if ( $RT::MailCommand eq 'sendmailpipe' ) { + open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ) + || die "Couldn't send mail: " . $@ . "\n"; + print MAIL $entity->as_string; + close(MAIL); + } + else { + $entity->send( $RT::MailCommand, $RT::MailParams ); + } + +} + +# }}} + +# {{{ sub record_last_dir + +sub record_last_dir { + my $id = shift; + my $dir = shift; + + # make a note of this directory. later, we'll use this to + # figure out if we've gone through the whole commit, + # for something that is a bad mockery of attomic commits. + + warn "about to write $dir to $LASTDIR_FILE.$id" if ($DEBUG); + + write_file( "$LASTDIR_FILE.$id", $dir ); +} + +# }}} + +# {{{ Get the RT stuff set up + +# {{{ sub rt_handler + +sub rt_handler { + my (@LogMessage) = (@_); + + #Connect to the database and get RT::SystemUser and RT::Nobody loaded + RT::Init; + + require RT::Ticket; + + #Get the current user all loaded + my $CurrentUser = GetCurrentUser(); + + if ( !$CurrentUser->Id ) { + print +loc("No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\n"); + return; + } + + my (@commands) = find_commands( \@LogMessage ); + + my ( @tickets, @errors ); + + # Get the list of tickets we're working with out of commands + grep { $_ =~ /^RT-Ticket:\s*(.*?)$/i && push ( @tickets, $1 ) } @commands; + + my $message = new MIME::Entity; + $message->build( + From => $CurrentUser->EmailAddress, + Subject => 'CVS Commit', + Data => \@LogMessage + ); + + # {{{ comment or correspond, as needed + + foreach my $ticket (@tickets) { + my $TicketObj = RT::Ticket->new($CurrentUser); + $TicketObj->Load($ticket); + my ( $id, $msg ); + unless ( $TicketObj->Id ) { + push ( @errors, +"Couldn't load ticket #$ticket. Not adding commit log to ticket history.\n" + ); + } + + if ( $LogMessage[0] =~ /^(comment|private)$/ ) { + ( $id, $msg ) = $TicketObj->Comment( MIMEObj => $message ); + + } + else { + ( $id, $msg ) = $TicketObj->Correspond( MIMEObj => $message ); + } + + push ( @errors, ">> Log message", + "Ticket #" . $TicketObj->Id . ": " . $msg ); + + } + + # }}} + + my ($reply) = ActOnPseudoHeaders( $CurrentUser, @commands ); + print "$reply\n" if ($reply); + print join ( "\n", @errors ); + print "\n"; + +} + +# }}} + +# {{{ sub find_commands + +sub find_commands { + my $lines = shift; + my (@pseudoheaders); + + while ( my $line = shift @{$lines} ) { + next if $line =~ /^\s*?$/; + if ( $line =~ /^RT-/i ) { + + push ( @pseudoheaders, $line ); + } + + #If we find a line that's not a command, get out. + else { + unshift ( @{$lines}, $line ); + last; + } + } + + return (@pseudoheaders); + +} + +# }}} + +# {{{ sub ActOnPseudoHeaders + +=item ActOnPseudoHeaders $PseudoHeaders + +Takes a string of pseudo-headers, iterates through them and does what they tell it to. + +=cut + +sub ActOnPseudoHeaders { + my $CurrentUser = shift; + my (@actions) = (@_); + + my $ResultsMessage = ''; + my $Ticket = RT::Ticket->new($CurrentUser); + + foreach my $action (@actions) { + my ($val); + my $msg = ''; + + $ResultsMessage .= ">>> $action\n"; + + if ( $action =~ /^RT-(.*?):\s*(.*)$/i ) { + my $command = $1; + my $args = $2; + + if ( $command =~ /^ticket$/i ) { + + $val = $Ticket->Load($args); + unless ($val) { + $ResultsMessage .= + loc("ERROR: Couldn't load ticket '[_1]': [_2].\n", $1, $msg); + . loc("Aborting to avoid unintended ticket modifications.\n") + . loc("The following commands were not proccessed:\n\n") + . join ( "\n", @actions ); + return ($ResultsMessage); + } + $ResultsMessage .= loc("Ticket [_1] loaded\n", $Ticket->Id); + } + else { + unless ( $Ticket->Id ) { + $ResultsMessage .= loc("No Ticket specified. Aborting ticket ") + . loc("modifications\n\n") + . loc("The following commands were not proccessed:\n\n") + . join ( "\n", @actions ); + return ($ResultsMessage); + } + + # Deal with the basics + if ( $command =~ /^(Subject|Owner|Status|Queue)$/i ) { + my $method = 'Set' . ucfirst( lc($1) ); + ( $val, $msg ) = $Ticket->$method($args); + } + + # Deal with the dates + elsif ( $command =~ /^(due|starts|started|resolved)$/i ) { + my $method = 'Set' . ucfirst( lc($1) ); + my $date = new RT::Date($CurrentUser); + $date->Set( Format => 'unknown', Value => $args ); + ( $val, $msg ) = $Ticket->$method( $date->ISO ); + } + + # Deal with the watchers + elsif ( $command =~ /^(requestor|requestors|cc|admincc)$/i ) { + my $operator = "+"; + my ($type); + if ( $args =~ /^(\+|\-)(.*)$/ ) { + $operator = $1; + $args = $2; + } + $type = 'Requestor' if ( $command =~ /^requestor/i ); + $type = 'Cc' if ( $command =~ /^cc/i ); + $type = 'AdminCc' if ( $command =~ /^admincc/i ); + + my $user = RT::User->new($CurrentUser); + $user->Load($args); + + if ($operator eq '+') { + ($val, $msg) = $Ticket->AddWatcher( Type => $type, + PrincipalId => $user->PrincipalId); + } elsif ($operator eq '-') { + ($val, $msg) = $Ticket->DeleteWatcher( Type => $type, + PrincipalId => $user->PrincipalId); + } + + } + $ResultsMessage .= $msg . "\n"; + } + + } + return ($ResultsMessage); + +} + +# }}} + +# {{{ sub untaint +sub untaint { + my $val = shift; + + if ( $val =~ /^([-\#\/\w.]+)$/ ) { + $val = $1; # $data now untainted + } + else { + die loc("Bad data in [_1]", $val); # log this somewhere + } + return ($val); +} + +# }}} + +=head1 AUTHOR + + + + rt-commit-handler is a rewritten version of the NetBSD commit handler, + which was placed in the public domain by Charles Hannum. It bore the following + authors statement: + + Contributed by David Hampton + Hacked greatly by Greg A. Woods + Rewritten by Charles M. Hannum + +=cut + diff --git a/rt/bin/rt-crontool b/rt/bin/rt-crontool new file mode 100644 index 000000000..ede874a0c --- /dev/null +++ b/rt/bin/rt-crontool @@ -0,0 +1,210 @@ +#!/usr/bin/perl +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +use strict; +use Carp; + +use lib ("/opt/rt3/lib", "/opt/rt3/local/lib"); + +package RT; + +use Getopt::Long; + +use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); +use RT::Tickets; +use RT::Template; + +#Clean out all the nasties from the environment +CleanEnv(); + +# Load the config file +RT::LoadConfig(); + +#Connect to the database and get RT::SystemUser and RT::Nobody loaded +RT::Init(); + +#Drop setgid permissions +RT::DropSetGIDPermissions(); + +#Get the current user all loaded +my $CurrentUser = GetCurrentUser(); + +unless ( $CurrentUser->Id ) { + print loc("No RT user found. Please consult your RT administrator.\n"); + exit(1); +} + +my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg, + $template_id, $help, $verbose ); +GetOptions( "search=s" => \$search, + "search-arg=s" => \$search_arg, + "condition=s" => \$condition, + "condition-arg=s" => \$condition_arg, + "action-arg=s" => \$action_arg, + "action=s" => \$action, + "template-id=s" => \$template_id, + "help" => \$help, + "verbose|v" => \$verbose ); + +help() if $help; + +# We _must_ have a search object +load_module($search); +load_module($action) if ($action); +load_module($condition) if ($condition); + +# load template if specified +my $template_obj; +if ($template_id) { + $template_obj = RT::Template->new($RT::Nobody); + $template_obj->LoadById($template_id); +} + +#At the appointed time: + +#find a bunch of tickets +my $tickets = RT::Tickets->new($CurrentUser); +my $search = $search->new( TicketsObj => $tickets, Argument => $search_arg ); + +$search->Prepare(); + +# TicketsFound is an RT::Tickets object +my $tickets = $search->TicketsObj; + +#for each ticket we've found +while ( my $ticket = $tickets->Next() ) { + print "\n" . $ticket->Id() . ": " if ($verbose); + + # perform some more advanced check + if ($condition) { + my $condition_obj = $condition->new( TicketObj => $ticket, + Argument => $condition_arg ); + + # if the condition doesn't apply, get out of here + + next unless ( $condition_obj->IsApplicable ); + print loc("Condition matches...") if ($verbose); + } + + #prepare our action + my $action_obj = $action->new( TicketObj => $ticket, + TemplateObj => $template_obj, + Argument => $action_arg ); + + #if our preparation, move onto the next ticket + next unless ( $action_obj->Prepare ); + print loc("Action prepared...") if ($verbose); + + #commit our action. + next unless ( $action_obj->Commit ); + print loc("Action committed.") if ($verbose); +} + +# {{{ load_module + +=head2 load_module + +Loads a perl module, dying nicely if it can't find it. + +=cut + +sub load_module { + my $modname = shift; + eval "require $modname"; + if ($@) { + die loc( "Failed to load module [_1]. ([_2])", $modname, $@ ); + } + +} + +# }}} + +# {{{ loc + +=head2 loc LIST + +Localize this string, with the current user's currentuser object + +=cut + +sub loc { + $CurrentUser->loc(@_); +} + +# }}} + +sub help { + + print loc( "[_1] is a tool to act on tickets from an external scheduling tool, such as cron.", $0 ) + . "\n"; + print loc("It takes several arguments:") . "\n\n"; + + print " " + . loc( "[_1] - Specify the search module you want to use", "--search" ) + . "\n"; + print " " + . loc( "[_1] - An argument to pass to [_2]", "--search-argument", "--search" ) + . "\n"; + + print " " + . loc( "[_1] - Specify the condition module you want to use", "--condition" ) + . "\n"; + print " " + . loc( "[_1] - An argument to pass to [_2]", "--condition-argument", "--condition" ) + . "\n"; + print " " + . loc( "[_1] - Specify the action module you want to use", "--action" ) + . "\n"; + print " " + . loc( "[_1] - An argument to pass to [_2]", "--action-argument", "--action" ) + . "\n"; + print " " + . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n"; + print "\n"; + print "\n"; + print loc("Security:")."\n"; + print loc("This tool allows the user to run arbitrary perl modules from within RT.")." ". + loc("If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT.")." ". + loc("It is incredibly important that nonprivileged users not be allowed to run this tool."). " " . + loc("It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool.")."\n"; + print "\n"; + print loc("Example:"); + print "\n"; + print " " + . loc( "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:" + ) + . "\n\n"; + + print " sbin/cron_shim \\\n"; + print + " --search RT::Search::ActiveTicketsInQueue --search-arg general \\\n"; + print + " --condition RT::Condition::UntouchedInHours --condition-arg 4 \\\n"; + print " --action RT::Action::SetPriority --action-arg 99 \\\n"; + print " --verbose\n"; + + + exit(0); +} diff --git a/rt/bin/rt-crontool.in b/rt/bin/rt-crontool.in new file mode 100644 index 000000000..73b80aa90 --- /dev/null +++ b/rt/bin/rt-crontool.in @@ -0,0 +1,210 @@ +#!@PERL@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +use strict; +use Carp; + +use lib ("@RT_LIB_PATH@", "@LOCAL_LIB_PATH@"); + +package RT; + +use Getopt::Long; + +use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); +use RT::Tickets; +use RT::Template; + +#Clean out all the nasties from the environment +CleanEnv(); + +# Load the config file +RT::LoadConfig(); + +#Connect to the database and get RT::SystemUser and RT::Nobody loaded +RT::Init(); + +#Drop setgid permissions +RT::DropSetGIDPermissions(); + +#Get the current user all loaded +my $CurrentUser = GetCurrentUser(); + +unless ( $CurrentUser->Id ) { + print loc("No RT user found. Please consult your RT administrator.\n"); + exit(1); +} + +my ( $search, $condition, $action, $search_arg, $condition_arg, $action_arg, + $template_id, $help, $verbose ); +GetOptions( "search=s" => \$search, + "search-arg=s" => \$search_arg, + "condition=s" => \$condition, + "condition-arg=s" => \$condition_arg, + "action-arg=s" => \$action_arg, + "action=s" => \$action, + "template-id=s" => \$template_id, + "help" => \$help, + "verbose|v" => \$verbose ); + +help() if $help; + +# We _must_ have a search object +load_module($search); +load_module($action) if ($action); +load_module($condition) if ($condition); + +# load template if specified +my $template_obj; +if ($template_id) { + $template_obj = RT::Template->new($RT::Nobody); + $template_obj->LoadById($template_id); +} + +#At the appointed time: + +#find a bunch of tickets +my $tickets = RT::Tickets->new($CurrentUser); +my $search = $search->new( TicketsObj => $tickets, Argument => $search_arg ); + +$search->Prepare(); + +# TicketsFound is an RT::Tickets object +my $tickets = $search->TicketsObj; + +#for each ticket we've found +while ( my $ticket = $tickets->Next() ) { + print "\n" . $ticket->Id() . ": " if ($verbose); + + # perform some more advanced check + if ($condition) { + my $condition_obj = $condition->new( TicketObj => $ticket, + Argument => $condition_arg ); + + # if the condition doesn't apply, get out of here + + next unless ( $condition_obj->IsApplicable ); + print loc("Condition matches...") if ($verbose); + } + + #prepare our action + my $action_obj = $action->new( TicketObj => $ticket, + TemplateObj => $template_obj, + Argument => $action_arg ); + + #if our preparation, move onto the next ticket + next unless ( $action_obj->Prepare ); + print loc("Action prepared...") if ($verbose); + + #commit our action. + next unless ( $action_obj->Commit ); + print loc("Action committed.") if ($verbose); +} + +# {{{ load_module + +=head2 load_module + +Loads a perl module, dying nicely if it can't find it. + +=cut + +sub load_module { + my $modname = shift; + eval "require $modname"; + if ($@) { + die loc( "Failed to load module [_1]. ([_2])", $modname, $@ ); + } + +} + +# }}} + +# {{{ loc + +=head2 loc LIST + +Localize this string, with the current user's currentuser object + +=cut + +sub loc { + $CurrentUser->loc(@_); +} + +# }}} + +sub help { + + print loc( "[_1] is a tool to act on tickets from an external scheduling tool, such as cron.", $0 ) + . "\n"; + print loc("It takes several arguments:") . "\n\n"; + + print " " + . loc( "[_1] - Specify the search module you want to use", "--search" ) + . "\n"; + print " " + . loc( "[_1] - An argument to pass to [_2]", "--search-argument", "--search" ) + . "\n"; + + print " " + . loc( "[_1] - Specify the condition module you want to use", "--condition" ) + . "\n"; + print " " + . loc( "[_1] - An argument to pass to [_2]", "--condition-argument", "--condition" ) + . "\n"; + print " " + . loc( "[_1] - Specify the action module you want to use", "--action" ) + . "\n"; + print " " + . loc( "[_1] - An argument to pass to [_2]", "--action-argument", "--action" ) + . "\n"; + print " " + . loc( "[_1] - Output status updates to STDOUT", "--verbose" ) . "\n"; + print "\n"; + print "\n"; + print loc("Security:")."\n"; + print loc("This tool allows the user to run arbitrary perl modules from within RT.")." ". + loc("If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT.")." ". + loc("It is incredibly important that nonprivileged users not be allowed to run this tool."). " " . + loc("It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool.")."\n"; + print "\n"; + print loc("Example:"); + print "\n"; + print " " + . loc( "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:" + ) + . "\n\n"; + + print " sbin/cron_shim \\\n"; + print + " --search RT::Search::ActiveTicketsInQueue --search-arg general \\\n"; + print + " --condition RT::Condition::UntouchedInHours --condition-arg 4 \\\n"; + print " --action RT::Action::SetPriority --action-arg 99 \\\n"; + print " --verbose\n"; + + + exit(0); +} diff --git a/rt/bin/rt-mailgate b/rt/bin/rt-mailgate index e6f0d95c5..b30443638 100755 --- a/rt/bin/rt-mailgate +++ b/rt/bin/rt-mailgate @@ -1,367 +1,587 @@ -#!!!PERL!! -w +#!/usr/bin/perl -w +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +=head1 NAME + +rt-mailgate - Mail interface to RT3. + +=begin testing + +use RT::I18N; + + +# {{{ Test new ticket creation by root who is privileged and superuser + +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok (UNIVERSAL::isa($tick,'RT::Ticket')); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject eq 'This is a test of new ticket creation', "Created the ticket"); -# $Header: /home/cvs/cvsroot/freeside/rt/bin/rt-mailgate,v 1.1 2002-08-12 06:17:07 ivan Exp $ -# (c) 1996-2001 Jesse Vincent -# This software is redistributable under the terms of the GNU GPL +# }}} -package RT; -use strict; -use vars qw($VERSION $Handle $Nobody $SystemUser); - -$VERSION="!!RT_VERSION!!"; - - -use lib "!!RT_LIB_PATH!!"; -use lib "!!RT_ETC_PATH!!"; - -use RT::Interface::Email qw(CleanEnv LoadConfig DBConnect - GetCurrentUser - GetMessageContent - CheckForLoops - CheckForSuspiciousSender - CheckForAutoGenerated - ParseMIMEEntityFromSTDIN - ParseTicketId - MailError - ParseCcAddressesFromHead - ParseSenderAddressFromHead - ParseErrorsToAddressFromHead - ); - -#Clean out all the nasties from the environment -CleanEnv(); - -#Load etc/config.pm and drop privs -LoadConfig(); - -#Connect to the database and get RT::SystemUser and RT::Nobody loaded -DBConnect(); - -#Drop setgid permissions -RT::DropSetGIDPermissions(); - -use RT::Ticket; -use RT::Queue; -use MIME::Parser; -use File::Temp; -use Mail::Address; - - -#Set some sensible defaults -my $Queue = 1; -my $time = time; -my $Action = "correspond"; - -my ($Verbose, $ReturnTid, $Debug); -my ($From, $TicketId, $Subject,$SquelchReplies); - -# using --owner-from-extension, this will let you set ticket owner on create -my $AssignTicketTo = undef; -my ($status, $msg); - -# {{{ parse commandline - -while (my $flag = shift @ARGV) { - if (($flag eq '-v') or ($flag eq '--verbose')) { - $Verbose = 1; - } - if (($flag eq '-t') or ($flag eq '--ticketid')) { - $ReturnTid = 1; - } - - if (($flag eq '-d') or ($flag eq '--debug')) { - $RT::Logger->debug("Debug mode enabled\n"); - $Debug = 1; - } - - if (($flag eq '-q') or ($flag eq '--queue')) { - $Queue = shift @ARGV; - } - if ($flag eq '--ticket-id-from-extension') { - $TicketId = $ENV{'EXTENSION'}; - } - if ($flag eq '--queue-from-extension') { - $Queue = $ENV{'EXTENSION'}; - } - if ($flag eq '--owner-from-extension') { - $AssignTicketTo = $ENV{'EXTENSION'}; - } - - if (($flag eq '-a') or ($flag eq '--action')) { - $Action = shift @ARGV; - } - - -} +# {{{This is a test of new ticket creation as an unknown user + +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +$tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject ne 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account"); +my $u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist@example.com'); +ok( $u->Id == 0, " user does not exist and was not created by failed ticket submission"); + # }}} -# get the current mime entity from stdin -my ($entity, $head) = ParseMIMEEntityFromSTDIN(); +# {{{ now everybody can create tickets. can a random unkown user create tickets? -#Get someone to send runtime errors to; -my $ErrorsTo = ParseErrorsToAddressFromHead($head); +my $g = RT::Group->new($RT::SystemUser); +$g->LoadSystemInternalGroup('Everyone'); +ok( $g->Id, "Found 'everybody'"); -#Get us a current user object. -my $CurrentUser = GetCurrentUser($head, $entity, $ErrorsTo); +my ($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket'); +ok ($val, "Granted everybody the right to create tickets - $msg"); -# We've already performed a warning and sent the mail off to somewhere safe ($RTOwner). -# this is _exceedingly_ unlikely but we don't want to keep going if we don't have a current user +sleep(60); # gotta sleep so the remote process' ACL cache times out -unless ($CurrentUser->Id) { - exit(1); -} +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <get('Message-Id') || - ""; +Blah! +Foob! +EOF +close (MAIL); -#Pull apart the subject line -$Subject = $head->get('Subject') || "[no subject]"; -chomp $Subject; -# Get the ticket ID unless it's already set -$TicketId = ParseTicketId($Subject) unless ($TicketId); +$tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +$tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject eq 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account"); +my $u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist@example.com'); +ok( $u->Id != 0, " user does not exist and was created by ticket submission"); -#Set up a queue object -my $QueueObj = RT::Queue->new($CurrentUser); -$QueueObj->Load($Queue); -unless ($QueueObj->id ) { +# }}} - MailError(To => $RT::OwnerEmail, - Subject => "RT Bounce: $Subject", - Explanation => "RT couldn't find the queue: $Queue", - MIMEObj => $entity); -} +# {{{ can another random reply to a ticket without being granted privs? answer should be no. -# {{{ Lets check for mail loops of various sorts. -my $IsAutoGenerated = CheckForAutoGenerated($head); +#($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket'); +#ok ($val, "Granted everybody the right to create tickets - $msg"); +#sleep(60); # gotta sleep so the remote process' ACL cache times out -my $IsSuspiciousSender = CheckForSuspiciousSender($head); +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a reply as an unknown user -my $IsALoop = CheckForLoops($head); +Blah! +Foob! +EOF +close (MAIL); +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-2@example.com'); +ok( $u->Id == 0, " user does not exist and was not created by ticket correspondence submission"); +# }}} +# {{{ can another random reply to a ticket after being granted privs? answer should be yes -#If the message is autogenerated, we need to know, so we can not -# send mail to the sender -if ($IsSuspiciousSender || $IsAutoGenerated || $IsALoop) { - $SquelchReplies = 1; - $ErrorsTo = $RT::OwnerEmail; - - #TODO: Is what we want to do here really - # "Make the requestor cease to get mail from RT"? - # This might wreak havoc with vacation-mailing users. - # Maybe have a "disabled for bouncing" state that gets - # turned off when we get a legit incoming message +($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'ReplyToTicket'); +ok ($val, "Granted everybody the right to reply to tickets - $msg"); +sleep(60); # gotta sleep so the remote process' ACL cache times out -} +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a reply as an unknown user +Blah! +Foob! +EOF +close (MAIL); -# {{{ Warn someone if it's a loop - -# Warn someone if it's a loop, before we drop it on the ground -if ($IsALoop) { - $RT::Logger->crit("RT Received mail ($MessageId) from itself."); - - #Should we mail it to RTOwner? - if ($RT::LoopsToRTOwner) { - MailError(To => $RT::OwnerEmail, - Subject => "RT Bounce: $Subject", - Explanation => "RT thinks this message may be a bounce", - MIMEObj => $entity); - - #Do we actually want to store it? - exit unless ($RT::StoreLoops); - } -} + +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-2@example.com'); +ok( $u->Id != 0, " user exists and was created by ticket correspondence submission"); # }}} +# {{{ can another random comment on a ticket without being granted privs? answer should be no. - #Don't let the user stuff the RT-Squelch-Replies-To header. - if ($head->get('RT-Squelch-Replies-To')) { - $head->add('RT-Relocated-Squelch-Replies-To', - $head->get('RT-Squelch-Replies-To')); - $head->delete('RT-Squelch-Replies-To') - } +#($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket'); +#ok ($val, "Granted everybody the right to create tickets - $msg"); +#sleep(60); # gotta sleep so the remote process' ACL cache times out -if ($SquelchReplies) { - ## TODO: This is a hack. It should be some other way to - ## indicate that the transaction should be "silent". +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action comment"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a comment as an unknown user - my ($Sender, $junk) = ParseSenderAddressFromHead($head); - $head->add('RT-Squelch-Replies-To', $Sender); -} +Blah! +Foob! +EOF +close (MAIL); + +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-3@example.com'); +ok( $u->Id == 0, " user does not exist and was not created by ticket comment submission"); # }}} +# {{{ can another random reply to a ticket after being granted privs? answer should be yes -# {{{ If we require that the sender be found in an external DB and they're not -# forward this message to RTOwner +($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CommentOnTicket'); +ok ($val, "Granted everybody the right to reply to tickets - $msg"); +sleep(60); # gotta sleep so the remote process' ACL cache times out +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action comment"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a comment as an unknown user +Blah! +Foob! +EOF +close (MAIL); -if ($RT::LookupSenderInExternalDatabase && - $RT::SenderMustExistInExternalDatabase ) { - MailError(To => $RT::OwnerEmail, - Subject => "RT Bounce: $Subject", - Explanation => "RT couldn't find requestor via its external database lookup", - MIMEObj => $entity); - -} +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-3@example.com'); +ok( $u->Id != 0, " user exists and was created by ticket comment submission"); # }}} -# {{{ elsif we don't have a ticket Id, we're creating a new ticket - - - -elsif (!defined($TicketId)) { - - # {{{ Create a new ticket - if ($Action =~ /correspond/) { - - # open a new ticket - my @Requestors = ($CurrentUser->id); - - my @Cc; - if ($RT::ParseNewMessageForTicketCcs) { - @Cc = ParseCcAddressesFromHead(Head => $head, - CurrentUser => $CurrentUser, - QueueObj => $QueueObj ); - } - - my $Ticket = new RT::Ticket($CurrentUser); - my ($id, $Transaction, $ErrStr) = - $Ticket->Create ( Queue => $Queue, - Subject => $Subject, - Owner => $AssignTicketTo, - Requestor => \@Requestors, - Cc => \@Cc, - MIMEObj => $entity - ); - if ($id == 0 ) { - MailError( To => $ErrorsTo, - Subject => "Ticket creation failed", - Explanation => $ErrStr, - MIMEObj => $entity - ); - $RT::Logger->error("Create failed: $id / $Transaction / $ErrStr "); - } - } - - # }}} - - else { - #TODO Return an error message - MailError( To => $ErrorsTo, - Subject => "No ticket id specified", - Explanation => "$Action aliases require a TicketId to work on", - MIMEObj => $entity - ); - - $RT::Logger->crit("$Action aliases require a TicketId to work on ". - "(from ".$CurrentUser->UserObj->EmailAddress.") ". - $MessageId); - } -} +# {{{ Testing preservation of binary attachments + +# Get a binary blob (Best Practical logo) + +# Create a mime entity with an attachment + +use MIME::Entity; +my $entity = MIME::Entity->build( From => 'root@localhost', + To => 'rt@localhost', + Subject => 'binary attachment test', + Data => ['This is a test of a binary attachment']); + +# currently in lib/t/autogen +$entity->attach(Path => '../../../html/NoAuth/images/spacer.gif', + Type => 'image/gif', + Encoding => 'base64'); + +# Create a ticket with a binary attachment +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); + +$entity->print(\*MAIL); + +close (MAIL); + +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); + $tick = $tickets->First(); +ok (UNIVERSAL::isa($tick,'RT::Ticket')); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject eq 'binary attachment test', "Created the ticket - ".$tick->Id); + +my $file = `cat ../../../html/NoAuth/images/spacer.gif`; +ok ($file, "Read in the logo image"); + + + use Digest::MD5; +warn "for the raw file the content is ".Digest::MD5::md5_base64($file); + + + +# Verify that the binary attachment is valid in the database +my $attachments = RT::Attachments->new($RT::SystemUser); +$attachments->Limit(FIELD => 'ContentType', VALUE => 'image/gif'); +ok ($attachments->Count == 1, 'Found only one gif in the database'); +my $attachment = $attachments->First; +my $acontent = $attachment->Content; + + warn "coming from the database, the content is ".Digest::MD5::md5_base64($acontent); + +is( $acontent, $file, 'The attachment isn\'t screwed up in the database.'); +# Log in as root +use Getopt::Long; +use LWP::UserAgent; + + +# Grab the binary attachment via the web ui +my $ua = LWP::UserAgent->new(); + +my $full_url = "http://localhost/Ticket/Attachment/".$attachment->TransactionId."/".$attachment->id."/spacer.gif?&user=root&pass=password"; +my $r = $ua->get( $full_url); + + +# Verify that the downloaded attachment is the same as what we uploaded. +is($file, $r->content, 'The attachment isn\'t screwed up in download'); + + # }}} -# {{{ If we've got a ticket ID, update the ticket - -else { - - # If the action is comment, add a comment. - if ($Action =~ /comment/i){ - - my $Ticket = new RT::Ticket($CurrentUser); - $Ticket->Load($TicketId); - unless ($Ticket->Id) { - MailError( To => $ErrorsTo, - Subject => "Comment not recorded", - Explanation => "Could not find a ticket with id $TicketId", - MIMEObj => $entity - ); - #Return an error message saying that Ticket "#foo" wasn't found. - } - - ($status, $msg) = $Ticket->Comment(MIMEObj=>$entity); - unless ($status) { - #Warn the sender that we couldn't actually submit the comment. - MailError( To => $ErrorsTo, - Subject => "Comment not recorded", - Explanation => $msg, - MIMEObj => $entity - ); - } - } - - # If the message is correspondence, add it to the ticket - elsif ($Action =~ /correspond/i) { - my $Ticket = RT::Ticket->new($CurrentUser); - $Ticket->Load($TicketId); - - #TODO: Check for error conditions - ($status, $msg) = $Ticket->Correspond(MIMEObj => $entity); - unless ($status) { - - #Return mail to the sender with an error - MailError( To => $ErrorsTo, - Subject => "Correspondence not recorded", - Explanation => $msg, - MIMEObj => $entity - ); - } - } - - else { - #Return mail to the sender with an error - MailError( To => $ErrorsTo, - Subject => "RT Configuration error", - Explanation => "'$Action' not a recognized action.". - " Your RT administrator has misconfigured ". - "the mail aliases which invoke RT" , - MIMEObj => $entity - ); - - $RT::Logger->crit("$Action type unknown for $MessageId"); - - } - -} +# {{{ Simple I18N testing + +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); + +print MAIL <new($RT::SystemUser); +$unitickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$unitickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); +my $unitick = $unitickets->First(); +ok (UNIVERSAL::isa($unitick,'RT::Ticket')); +ok ($unitick->Id, "found ticket ".$unitick->Id); +ok ($unitick->Subject eq 'This is a test of I18N ticket creation', "Created the ticket - ". $unitick->Subject); + + + +my $unistring = "\303\241\303\251\303\255\303\263\303\272"; +Encode::_utf8_on($unistring); +is ($unitick->Transactions->First->Content, $unitick->Transactions->First->Attachments->First->Content, "Content is ". $unitick->Transactions->First->Attachments->First->Content); +ok($unitick->Transactions->First->Attachments->First->Content =~ /$unistring/i, $unitick->Id." appears to be unicode ". $unitick->Transactions->First->Attachments->First->Id); +# supposedly I18N fails on the second message sent in. + +ok(open(MAIL, "|/opt/rt3/bin/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); + +print MAIL <new($RT::SystemUser); +$tickets2->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets2->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); +my $tick2 = $tickets2->First(); +ok (UNIVERSAL::isa($tick2,'RT::Ticket')); +ok ($tick2->Id, "found ticket ".$tick2->Id); +ok ($tick2->Subject eq 'This is a test of I18N ticket creation', "Created the ticket"); + + + +my $unistring = "\303\241\303\251\303\255\303\263\303\272"; +Encode::_utf8_on($unistring); + +ok ($tick2->Transactions->First->Content =~ $unistring, "It appears to be unicode - ".$tick2->Transactions->First->Content); # }}} -$RT::Handle->Disconnect(); +($val,$msg) = $g->PrincipalObj->RevokeRight(Right => 'CreateTicket'); +ok ($val, $msg); + + + +=end testing + +=cut + + +use strict; +use Getopt::Long; +use LWP::UserAgent; + +use constant EX_TEMPFAIL => 75; + +my %opts; +GetOptions( \%opts, "queue=s", "action=s", "url=s", "jar=s", "help", "debug", "extension=s" ); + +if ( $opts{help} ) { + require Pod::Usage; + import Pod::Usage; + pod2usage("RT Mail Gateway\n"); + exit 1; # Don't want to succeed if this is really an email! +} + +for (qw(url)) { + die "$0 invoked improperly\n\nNo $_ provided to mail gateway!\n" unless $opts{$_}; +} + +undef $/; +my $message = <>; +my $ua = LWP::UserAgent->new(); +$ua->cookie_jar( { file => $opts{jar} } ); + +my %args = ( + queue => $opts{queue}, + action => $opts{action}, + message => $message, + SessionType => 'REST', # Surpress login box +); + + +if ($opts{'extension'}) { + $args{$opts{'extension'}} = $ENV{'EXTENSION'}; +} + +# Set up cookie here. + +my $full_url = $opts{'url'}. "/REST/1.0/NoAuth/mail-gateway"; +warn "Connecting to $full_url" if $opts{'debug'}; + + + +my $r = $ua->post( $full_url, {%args} ); +check_failure($r); + +my $content = $r->content; +warn $content if ($opts{debug}); + +if ( $content !~ /^(ok|not ok)/ ) { + + # It's not the server's fault if the mail is bogus. We just want to know that + # *something* came out of the server. + die <is_success(); + + # This ordinarily oughtn't to be able to happen, suggests a bug in RT. + # So only load these heavy modules when they're needed. + require HTML::TreeBuilder; + require HTML::FormatText; + + my $error = $r->error_as_HTML; + my $tree = HTML::TreeBuilder->new->parse($error); + $tree->eof; + + # It'll be a cold day in hell before RT sends out bounces in HTML + my $formatter = HTML::FormatText->new( leftmargin => 0, + rightmargin => 50 ); + warn $formatter->format($tree); + warn "This is $0 exiting because of an undefined server error" if ($opts{debug}); + exit EX_TEMPFAIL; +} + + +=head1 SYNOPSIS + + rt-mailgate --help : this text + +Usual invocation (from MTA): + + rt-mailgate --action (correspond|comment) --queue queuename + --url http://your.rt.server/ + [ --extension (queue|action|ticket) + +See C for more. + +=head1 OPTIONS + +=over 3 + +=item C<--action> + +Specifies whether this is a correspondence or comment address. + +=item C<--queue> + +Reflects which queue this address handles. + +=item C<--url> + +The location of the web server for your RT instance. + + +=item C<--extension> OPTIONAL + +Some MTAs will route mail sent to user-foo@host or user+foo@host to user@host +and present "foo" in the environment variable $EXTENSION. By specifying +the value "queue" for this parameter, the queue this message should be +submitted to will be set to the value of $EXTENSION. By specifying +"ticket", $EXTENSION will be interpreted as the id of the ticket this message +is related to. "action" will allow the user to specify either "comment" or +"correspond" in the address extension. + + +=head1 DESCRIPTION + +The RT mail gateway is the primary mechanism for communicating with RT +via email. This program simply directs the email to the RT web server, +which handles filing correspondence and sending out any required mail. +It is designed to be run as part of the mail delivery process, either +called directly by the MTA or C, or in a F<.forward> or +equivalent. + +=head1 SETUP + +Much of the set up of the mail gateway depends on your MTA and mail +routing configuration. However, you will need first of all to create an +RT user for the mail gateway and assign it a password; this helps to +ensure that mail coming into the web server did originate from the +gateway. + +Next, you need to route mail to C for the queues you're +monitoring. For instance, if you're using F and you have a +"bugs" queue, you will want something like this: + + bugs: "|/opt/rt3/bin/rt-mailgate --queue bugs --action correspond + --url http://rt.mycorp.com/" + + bugs-comment: "|/opt/rt3/bin/rt-mailgate --queue bugs --action comment + --url http://rt.mycorp.com/" + +Note that you don't have to run your RT server on your mail server, as +the mail gateway will happily relay to a different machine. + +=head1 CUSTOMIZATION + +By default, the mail gateway will accept mail from anyone. However, +there are situations in which you will want to authenticate users +before allowing them to communicate with the system. You can do this +via a plug-in mechanism in the RT configuration. + +You can set the array C<@RT::MailPlugins> to be a list of plugins. The +default plugin, if this is not given, is C - that is, +authentication of the person is done based on the C header of the +email. If you have additional filters or authentication mechanisms, you +can list them here and they will be called in order: + + @RT::MailPlugins = ( + "Filter::SpamAssassin", + "Auth::LDAP", + # ... + ); + +See the documentation for any additional plugins you have. + +You may also put Perl subroutines into the C<@RT::MailPlugins> array, if +they behave as described below. + +=head1 WRITING PLUGINS + +What's actually going on in the above is that C<@RT::MailPlugins> is a +list of Perl modules; RT prepends C to the name, +to form a package name, and then C's this module. The module is +expected to provide a C subroutine, which takes a hash of +several parameters: + +=over 4 + +=item Message + +A C object representing the email +=item CurrentUser + +An C object + +=item AuthStat + +The authentication level returned from the previous plugin. + +=item Ticket [OPTIONAL] + +The ticket under discussion + +=item Queue [OPTIONAL] + +If we don't already have a ticket id, we need to know which queue we're talking about + +=item Action -# Everything below this line is a helper sub. most of them will eventually -# move to Interface::Email +The action being performed. At the moment, it's one of "comment" or "correspond" -#When we call die, trap it and log->crit with the value of the die. -$SIG{__DIE__} = sub { - unless ($^S || !defined $^S ) { - $RT::Logger->crit("$_[0]"); - MailError( To => $ErrorsTo, - Bcc => $RT::OwnerEmail, - Subject => "RT Critical error. Message not recorded!", - Explanation => "$_[0]", - MIMEObj => $entity - ); - exit(-1); - } - else { - #Get out of here if we're in an eval - die $_[0]; - } -}; +=back 4 +It returns two values, the new C object, and the new +authentication level. The authentication level can be zero, not allowed +to communicate with RT at all, (a "permission denied" error is mailed to +the correspondent) or one, which is the normal mode of operation. +Additionally, if C<-1> is returned, then the processing of the plug-ins +stops immediately and the message is ignored. +=cut -1; diff --git a/rt/bin/rt-mailgate.in b/rt/bin/rt-mailgate.in new file mode 100644 index 000000000..304fcbcd6 --- /dev/null +++ b/rt/bin/rt-mailgate.in @@ -0,0 +1,587 @@ +#!@PERL@ -w +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +=head1 NAME + +rt-mailgate - Mail interface to RT3. + +=begin testing + +use RT::I18N; + + +# {{{ Test new ticket creation by root who is privileged and superuser + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); +my $tick = $tickets->First(); +ok (UNIVERSAL::isa($tick,'RT::Ticket')); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject eq 'This is a test of new ticket creation', "Created the ticket"); + +# }}} + + +# {{{This is a test of new ticket creation as an unknown user + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +$tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject ne 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account"); +my $u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist@example.com'); +ok( $u->Id == 0, " user does not exist and was not created by failed ticket submission"); + + +# }}} + +# {{{ now everybody can create tickets. can a random unkown user create tickets? + +my $g = RT::Group->new($RT::SystemUser); +$g->LoadSystemInternalGroup('Everyone'); +ok( $g->Id, "Found 'everybody'"); + +my ($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket'); +ok ($val, "Granted everybody the right to create tickets - $msg"); + +sleep(60); # gotta sleep so the remote process' ACL cache times out + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); +$tick = $tickets->First(); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject eq 'This is a test of new ticket creation as an unknown user', "failed to create the new ticket from an unprivileged account"); +my $u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist@example.com'); +ok( $u->Id != 0, " user does not exist and was created by ticket submission"); + +# }}} + + +# {{{ can another random reply to a ticket without being granted privs? answer should be no. + + +#($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket'); +#ok ($val, "Granted everybody the right to create tickets - $msg"); +#sleep(60); # gotta sleep so the remote process' ACL cache times out + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a reply as an unknown user + +Blah! +Foob! +EOF +close (MAIL); + +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-2@example.com'); +ok( $u->Id == 0, " user does not exist and was not created by ticket correspondence submission"); +# }}} +# {{{ can another random reply to a ticket after being granted privs? answer should be yes + + +($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'ReplyToTicket'); +ok ($val, "Granted everybody the right to reply to tickets - $msg"); +sleep(60); # gotta sleep so the remote process' ACL cache times out + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a reply as an unknown user + +Blah! +Foob! +EOF +close (MAIL); + + +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-2@example.com'); +ok( $u->Id != 0, " user exists and was created by ticket correspondence submission"); + +# }}} + +# {{{ can another random comment on a ticket without being granted privs? answer should be no. + + +#($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CreateTicket'); +#ok ($val, "Granted everybody the right to create tickets - $msg"); +#sleep(60); # gotta sleep so the remote process' ACL cache times out + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action comment"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a comment as an unknown user + +Blah! +Foob! +EOF +close (MAIL); + +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-3@example.com'); +ok( $u->Id == 0, " user does not exist and was not created by ticket comment submission"); + +# }}} +# {{{ can another random reply to a ticket after being granted privs? answer should be yes + + +($val,$msg) = $g->PrincipalObj->GrantRight(Right => 'CommentOnTicket'); +ok ($val, "Granted everybody the right to reply to tickets - $msg"); +sleep(60); # gotta sleep so the remote process' ACL cache times out + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action comment"), "Opened the mailgate - $@"); +print MAIL <Id]}] This is a test of a comment as an unknown user + +Blah! +Foob! +EOF +close (MAIL); + + +$u = RT::User->new($RT::SystemUser); +$u->Load('doesnotexist-3@example.com'); +ok( $u->Id != 0, " user exists and was created by ticket comment submission"); + +# }}} + +# {{{ Testing preservation of binary attachments + +# Get a binary blob (Best Practical logo) + +# Create a mime entity with an attachment + +use MIME::Entity; +my $entity = MIME::Entity->build( From => 'root@localhost', + To => 'rt@localhost', + Subject => 'binary attachment test', + Data => ['This is a test of a binary attachment']); + +# currently in lib/t/autogen +$entity->attach(Path => '../../../html/NoAuth/images/spacer.gif', + Type => 'image/gif', + Encoding => 'base64'); + +# Create a ticket with a binary attachment +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); + +$entity->print(\*MAIL); + +close (MAIL); + +my $tickets = RT::Tickets->new($RT::SystemUser); +$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); + $tick = $tickets->First(); +ok (UNIVERSAL::isa($tick,'RT::Ticket')); +ok ($tick->Id, "found ticket ".$tick->Id); +ok ($tick->Subject eq 'binary attachment test', "Created the ticket - ".$tick->Id); + +my $file = `cat ../../../html/NoAuth/images/spacer.gif`; +ok ($file, "Read in the logo image"); + + + use Digest::MD5; +warn "for the raw file the content is ".Digest::MD5::md5_base64($file); + + + +# Verify that the binary attachment is valid in the database +my $attachments = RT::Attachments->new($RT::SystemUser); +$attachments->Limit(FIELD => 'ContentType', VALUE => 'image/gif'); +ok ($attachments->Count == 1, 'Found only one gif in the database'); +my $attachment = $attachments->First; +my $acontent = $attachment->Content; + + warn "coming from the database, the content is ".Digest::MD5::md5_base64($acontent); + +is( $acontent, $file, 'The attachment isn\'t screwed up in the database.'); +# Log in as root +use Getopt::Long; +use LWP::UserAgent; + + +# Grab the binary attachment via the web ui +my $ua = LWP::UserAgent->new(); + +my $full_url = "http://localhost/Ticket/Attachment/".$attachment->TransactionId."/".$attachment->id."/spacer.gif?&user=root&pass=password"; +my $r = $ua->get( $full_url); + + +# Verify that the downloaded attachment is the same as what we uploaded. +is($file, $r->content, 'The attachment isn\'t screwed up in download'); + + + +# }}} + +# {{{ Simple I18N testing + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); + +print MAIL <new($RT::SystemUser); +$unitickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$unitickets->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); +my $unitick = $unitickets->First(); +ok (UNIVERSAL::isa($unitick,'RT::Ticket')); +ok ($unitick->Id, "found ticket ".$unitick->Id); +ok ($unitick->Subject eq 'This is a test of I18N ticket creation', "Created the ticket - ". $unitick->Subject); + + + +my $unistring = "\303\241\303\251\303\255\303\263\303\272"; +Encode::_utf8_on($unistring); +is ($unitick->Transactions->First->Content, $unitick->Transactions->First->Attachments->First->Content, "Content is ". $unitick->Transactions->First->Attachments->First->Content); +ok($unitick->Transactions->First->Attachments->First->Content =~ /$unistring/i, $unitick->Id." appears to be unicode ". $unitick->Transactions->First->Attachments->First->Id); +# supposedly I18N fails on the second message sent in. + +ok(open(MAIL, "|@RT_BIN_PATH@/rt-mailgate --url http://localhost/ --queue general --action correspond"), "Opened the mailgate - $@"); + +print MAIL <new($RT::SystemUser); +$tickets2->OrderBy(FIELD => 'id', ORDER => 'DESC'); +$tickets2->Limit(FIELD => 'id', OPERATOR => '>', VALUE => '0'); +my $tick2 = $tickets2->First(); +ok (UNIVERSAL::isa($tick2,'RT::Ticket')); +ok ($tick2->Id, "found ticket ".$tick2->Id); +ok ($tick2->Subject eq 'This is a test of I18N ticket creation', "Created the ticket"); + + + +my $unistring = "\303\241\303\251\303\255\303\263\303\272"; +Encode::_utf8_on($unistring); + +ok ($tick2->Transactions->First->Content =~ $unistring, "It appears to be unicode - ".$tick2->Transactions->First->Content); + +# }}} + + +($val,$msg) = $g->PrincipalObj->RevokeRight(Right => 'CreateTicket'); +ok ($val, $msg); + + + +=end testing + +=cut + + +use strict; +use Getopt::Long; +use LWP::UserAgent; + +use constant EX_TEMPFAIL => 75; + +my %opts; +GetOptions( \%opts, "queue=s", "action=s", "url=s", "jar=s", "help", "debug", "extension=s" ); + +if ( $opts{help} ) { + require Pod::Usage; + import Pod::Usage; + pod2usage("RT Mail Gateway\n"); + exit 1; # Don't want to succeed if this is really an email! +} + +for (qw(url)) { + die "$0 invoked improperly\n\nNo $_ provided to mail gateway!\n" unless $opts{$_}; +} + +undef $/; +my $message = <>; +my $ua = LWP::UserAgent->new(); +$ua->cookie_jar( { file => $opts{jar} } ); + +my %args = ( + queue => $opts{queue}, + action => $opts{action}, + message => $message, + SessionType => 'REST', # Surpress login box +); + + +if ($opts{'extension'}) { + $args{$opts{'extension'}} = $ENV{'EXTENSION'}; +} + +# Set up cookie here. + +my $full_url = $opts{'url'}. "/REST/1.0/NoAuth/mail-gateway"; +warn "Connecting to $full_url" if $opts{'debug'}; + + + +my $r = $ua->post( $full_url, {%args} ); +check_failure($r); + +my $content = $r->content; +warn $content if ($opts{debug}); + +if ( $content !~ /^(ok|not ok)/ ) { + + # It's not the server's fault if the mail is bogus. We just want to know that + # *something* came out of the server. + die <is_success(); + + # This ordinarily oughtn't to be able to happen, suggests a bug in RT. + # So only load these heavy modules when they're needed. + require HTML::TreeBuilder; + require HTML::FormatText; + + my $error = $r->error_as_HTML; + my $tree = HTML::TreeBuilder->new->parse($error); + $tree->eof; + + # It'll be a cold day in hell before RT sends out bounces in HTML + my $formatter = HTML::FormatText->new( leftmargin => 0, + rightmargin => 50 ); + warn $formatter->format($tree); + warn "This is $0 exiting because of an undefined server error" if ($opts{debug}); + exit EX_TEMPFAIL; +} + + +=head1 SYNOPSIS + + rt-mailgate --help : this text + +Usual invocation (from MTA): + + rt-mailgate --action (correspond|comment) --queue queuename + --url http://your.rt.server/ + [ --extension (queue|action|ticket) + +See C for more. + +=head1 OPTIONS + +=over 3 + +=item C<--action> + +Specifies whether this is a correspondence or comment address. + +=item C<--queue> + +Reflects which queue this address handles. + +=item C<--url> + +The location of the web server for your RT instance. + + +=item C<--extension> OPTIONAL + +Some MTAs will route mail sent to user-foo@host or user+foo@host to user@host +and present "foo" in the environment variable $EXTENSION. By specifying +the value "queue" for this parameter, the queue this message should be +submitted to will be set to the value of $EXTENSION. By specifying +"ticket", $EXTENSION will be interpreted as the id of the ticket this message +is related to. "action" will allow the user to specify either "comment" or +"correspond" in the address extension. + + +=head1 DESCRIPTION + +The RT mail gateway is the primary mechanism for communicating with RT +via email. This program simply directs the email to the RT web server, +which handles filing correspondence and sending out any required mail. +It is designed to be run as part of the mail delivery process, either +called directly by the MTA or C, or in a F<.forward> or +equivalent. + +=head1 SETUP + +Much of the set up of the mail gateway depends on your MTA and mail +routing configuration. However, you will need first of all to create an +RT user for the mail gateway and assign it a password; this helps to +ensure that mail coming into the web server did originate from the +gateway. + +Next, you need to route mail to C for the queues you're +monitoring. For instance, if you're using F and you have a +"bugs" queue, you will want something like this: + + bugs: "|/opt/rt3/bin/rt-mailgate --queue bugs --action correspond + --url http://rt.mycorp.com/" + + bugs-comment: "|/opt/rt3/bin/rt-mailgate --queue bugs --action comment + --url http://rt.mycorp.com/" + +Note that you don't have to run your RT server on your mail server, as +the mail gateway will happily relay to a different machine. + +=head1 CUSTOMIZATION + +By default, the mail gateway will accept mail from anyone. However, +there are situations in which you will want to authenticate users +before allowing them to communicate with the system. You can do this +via a plug-in mechanism in the RT configuration. + +You can set the array C<@RT::MailPlugins> to be a list of plugins. The +default plugin, if this is not given, is C - that is, +authentication of the person is done based on the C header of the +email. If you have additional filters or authentication mechanisms, you +can list them here and they will be called in order: + + @RT::MailPlugins = ( + "Filter::SpamAssassin", + "Auth::LDAP", + # ... + ); + +See the documentation for any additional plugins you have. + +You may also put Perl subroutines into the C<@RT::MailPlugins> array, if +they behave as described below. + +=head1 WRITING PLUGINS + +What's actually going on in the above is that C<@RT::MailPlugins> is a +list of Perl modules; RT prepends C to the name, +to form a package name, and then C's this module. The module is +expected to provide a C subroutine, which takes a hash of +several parameters: + +=over 4 + +=item Message + +A C object representing the email +=item CurrentUser + +An C object + +=item AuthStat + +The authentication level returned from the previous plugin. + +=item Ticket [OPTIONAL] + +The ticket under discussion + +=item Queue [OPTIONAL] + +If we don't already have a ticket id, we need to know which queue we're talking about + +=item Action + +The action being performed. At the moment, it's one of "comment" or "correspond" + +=back 4 + +It returns two values, the new C object, and the new +authentication level. The authentication level can be zero, not allowed +to communicate with RT at all, (a "permission denied" error is mailed to +the correspondent) or one, which is the normal mode of operation. +Additionally, if C<-1> is returned, then the processing of the plug-ins +stops immediately and the message is ignored. + +=cut + diff --git a/rt/bin/webmux.pl b/rt/bin/webmux.pl index 6e1ae06de..21cb83f5e 100755 --- a/rt/bin/webmux.pl +++ b/rt/bin/webmux.pl @@ -1,177 +1,125 @@ -# $Header: /home/cvs/cvsroot/freeside/rt/bin/Attic/webmux.pl,v 1.1 2002-08-12 06:17:07 ivan Exp $ -# RT is (c) 1996-2000 Jesse Vincent (jesse@fsck.com); +#!/usr/bin/perl +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK use strict; -$ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need -$ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; -$ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; -$ENV{'ENV'} = '' if defined $ENV{'ENV'}; -$ENV{'IFS'} = '' if defined $ENV{'IFS'}; +BEGIN { + $ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need + $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; + $ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; + $ENV{'ENV'} = '' if defined $ENV{'ENV'}; + $ENV{'IFS'} = '' if defined $ENV{'IFS'}; +} -# We really don't want apache to try to eat all vm -# see http://perl.apache.org/guide/control.html#Preventing_mod_perl_Processes_Fr - +use lib ("/opt/rt3/local/lib", "/opt/rt3/lib"); +use RT; package RT::Mason; -use CGI qw(-private_tempfiles); #bring this in before mason, to make sure we - #set private_tempfiles -use HTML::Mason::ApacheHandler (args_method => 'CGI'); -use HTML::Mason; # brings in subpackages: Parser, Interp, etc. - -use vars qw($VERSION %session $Nobody $SystemUser $r $m); +use CGI qw(-private_tempfiles); #bring this in before mason, to make sure we + #set private_tempfiles -# List of modules that you want to use from components (see Admin -# manual for details) - -#Clean up our umask...so that the session files aren't world readable, writable or executable -umask(0077); +BEGIN { + if ($CGI::MOD_PERL) { + require HTML::Mason::ApacheHandler; + } + else { + require HTML::Mason::CGIHandler; + } +} +use HTML::Mason; # brings in subpackages: Parser, Interp, etc. - -$VERSION="!!RT_VERSION!!"; +use vars qw($Nobody $SystemUser $r); -use lib "!!RT_LIB_PATH!!"; -use lib "!!RT_ETC_PATH!!"; +#This drags in RT's config.pm +RT::LoadConfig(); -#This drags in RT's config.pm -use config; use Carp; -{ - package HTML::Mason::Commands; - use vars qw(%session $m); - - use RT; - use RT::Ticket; - use RT::Tickets; - use RT::Transaction; - use RT::Transactions; - use RT::User; - use RT::Users; - use RT::CurrentUser; - use RT::Template; - use RT::Templates; - use RT::Queue; - use RT::Queues; - use RT::ScripAction; - use RT::ScripActions; - use RT::ScripCondition; - use RT::ScripConditions; - use RT::Scrip; - use RT::Scrips; - use RT::Group; - use RT::Groups; - use RT::Keyword; - use RT::Keywords; - use RT::ObjectKeyword; - use RT::ObjectKeywords; - use RT::KeywordSelect; - use RT::KeywordSelects; - use RT::GroupMember; - use RT::GroupMembers; - use RT::Watcher; - use RT::Watchers; - use RT::Handle; - use RT::Interface::Web; - use MIME::Entity; - use Text::Wrapper; - use Apache::Cookie; - use Date::Parse; - use HTML::Entities; - - #TODO: make this use DBI - use Apache::Session::File; - - # Set this page's content type to whatever we are called with - sub SetContentType { - my $type = shift; - $RT::Mason::r->content_type($type); - } - - sub CGIObject { - $m->cgi_object(); - } - - } -my ($parser, $interp, $ah); -if ($HTML::Mason::VERSION < 1.0902) { - $parser = &RT::Interface::Web::NewParser(allow_globals => [%session]); - - $interp = &RT::Interface::Web::NewInterp(parser=>$parser, - allow_recursive_autohandlers => 1, - ); - - $ah = &RT::Interface::Web::NewApacheHandler($interp); -} else { - $ah = &RT::Interface::Web::NewMason11ApacheHandler(); +{ + package HTML::Mason::Commands; + use vars qw(%session); + + use RT::Tickets; + use RT::Transactions; + use RT::Users; + use RT::CurrentUser; + use RT::Templates; + use RT::Queues; + use RT::ScripActions; + use RT::ScripConditions; + use RT::Scrips; + use RT::Groups; + use RT::GroupMembers; + use RT::CustomFields; + use RT::CustomFieldValues; + use RT::TicketCustomFieldValues; + + use RT::Interface::Web; + use MIME::Entity; + use Text::Wrapper; + use CGI::Cookie; + use Time::ParseDate; + use HTML::Entities; } -# Activate the following if running httpd as root (the normal case). -# Resets ownership of all files created by Mason at startup. -# -chown (Apache->server->uid, Apache->server->gid, - [$RT::MasonSessionDir]); - - -chown (Apache->server->uid, Apache->server->gid, - $ah->interp->files_written); -# Die if WebSessionDir doesn't exist or we can't write to it -stat ($RT::MasonSessionDir); -die "Can't read and write $RT::MasonSessionDir" - unless (( -d _ ) and ( -r _ ) and ( -w _ )); +# Activate the following if running httpd as root (the normal case). +# Resets ownership of all files created by Mason at startup. +# Note that mysql uses DB for sessions, so there's no need to do this. +unless ($RT::DatabaseType =~ /(mysql|Pg)/) { + # Clean up our umask to protect session files + umask(0077); + +if ( $CGI::MOD_PERL) { + chown( Apache->server->uid, Apache->server->gid, [$RT::MasonSessionDir] ) + if Apache->server->can('uid'); + } + # Die if WebSessionDir doesn't exist or we can't write to it + stat($RT::MasonSessionDir); + die "Can't read and write $RT::MasonSessionDir" + unless ( ( -d _ ) and ( -r _ ) and ( -w _ ) ); +} +my $ah = &RT::Interface::Web::NewApacheHandler() if $CGI::MOD_PERL; sub handler { ($r) = @_; - + RT::Init(); - + # We don't need to handle non-text items - return -1 if defined($r->content_type) && $r->content_type !~ m|^text/|io; - - #This is all largely cut and pasted from mason's session_handler.pl - - my %cookies = Apache::Cookie::parse($r->header_in('Cookie')); - - eval { - tie %HTML::Mason::Commands::session, 'Apache::Session::File', - ( $cookies{'AF_SID'} ? $cookies{'AF_SID'}->value() : undef ), - { Directory => $RT::MasonSessionDir, - LockDirectory => $RT::MasonSessionDir, - } ; - }; - - if ( $@ ) { - # If the session is invalid, create a new session. - if ( $@ =~ m#^Object does not exist in the data store# ) { - tie %HTML::Mason::Commands::session, 'Apache::Session::File', undef, - { Directory => $RT::MasonSessionDir, - LockDirectory => $RT::MasonSessionDir, - }; - undef $cookies{'AF_SID'}; - } - else { - die "RT Couldn't write to session directory '$RT::MasonSessionDir'. Check that this directory's permissions are correct."; - } - } - - if ( !$cookies{'AF_SID'} ) { - my $cookie = new Apache::Cookie - ($r, - -name=>'AF_SID', - -value=>$HTML::Mason::Commands::session{_session_id}, - -path => '/',); - $cookie->bake; + return -1 if defined( $r->content_type ) && $r->content_type !~ m|^text/|io; - } + my %session; my $status = $ah->handle_request($r); - untie %HTML::Mason::Commands::session; - + undef (%session); + + $RT::Logger->crit("Transaction not committed. Usually indicates a software fault. Data loss may have occurred") if $RT::Handle->TransactionDepth; return $status; - - } -1; +} +1; diff --git a/rt/bin/webmux.pl.in b/rt/bin/webmux.pl.in new file mode 100644 index 000000000..12aad85b3 --- /dev/null +++ b/rt/bin/webmux.pl.in @@ -0,0 +1,125 @@ +#!@PERL@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 1996-2003 Jesse Vincent +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +use strict; + +BEGIN { + $ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need + $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; + $ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; + $ENV{'ENV'} = '' if defined $ENV{'ENV'}; + $ENV{'IFS'} = '' if defined $ENV{'IFS'}; +} + +use lib ("@LOCAL_LIB_PATH@", "@RT_LIB_PATH@"); +use RT; + +package RT::Mason; + +use CGI qw(-private_tempfiles); #bring this in before mason, to make sure we + #set private_tempfiles + +BEGIN { + if ($CGI::MOD_PERL) { + require HTML::Mason::ApacheHandler; + } + else { + require HTML::Mason::CGIHandler; + } +} + +use HTML::Mason; # brings in subpackages: Parser, Interp, etc. + +use vars qw($Nobody $SystemUser $r); + +#This drags in RT's config.pm +RT::LoadConfig(); + +use Carp; + +{ + package HTML::Mason::Commands; + use vars qw(%session); + + use RT::Tickets; + use RT::Transactions; + use RT::Users; + use RT::CurrentUser; + use RT::Templates; + use RT::Queues; + use RT::ScripActions; + use RT::ScripConditions; + use RT::Scrips; + use RT::Groups; + use RT::GroupMembers; + use RT::CustomFields; + use RT::CustomFieldValues; + use RT::TicketCustomFieldValues; + + use RT::Interface::Web; + use MIME::Entity; + use Text::Wrapper; + use CGI::Cookie; + use Time::ParseDate; + use HTML::Entities; +} + + +# Activate the following if running httpd as root (the normal case). +# Resets ownership of all files created by Mason at startup. +# Note that mysql uses DB for sessions, so there's no need to do this. +unless ($RT::DatabaseType =~ /(mysql|Pg)/) { + # Clean up our umask to protect session files + umask(0077); + +if ( $CGI::MOD_PERL) { + chown( Apache->server->uid, Apache->server->gid, [$RT::MasonSessionDir] ) + if Apache->server->can('uid'); + } + # Die if WebSessionDir doesn't exist or we can't write to it + stat($RT::MasonSessionDir); + die "Can't read and write $RT::MasonSessionDir" + unless ( ( -d _ ) and ( -r _ ) and ( -w _ ) ); +} + +my $ah = &RT::Interface::Web::NewApacheHandler() if $CGI::MOD_PERL; + +sub handler { + ($r) = @_; + + RT::Init(); + + # We don't need to handle non-text items + return -1 if defined( $r->content_type ) && $r->content_type !~ m|^text/|io; + + my %session; + my $status = $ah->handle_request($r); + undef (%session); + + $RT::Logger->crit("Transaction not committed. Usually indicates a software fault. Data loss may have occurred") if $RT::Handle->TransactionDepth; + return $status; +} + +1; diff --git a/rt/config b/rt/config new file mode 100644 index 000000000..b9418a66d --- /dev/null +++ b/rt/config @@ -0,0 +1,256 @@ +/* + * This is the project ``config'' file. It controls many aspects of + * how Aegis interacts with your project. + * + * There are several sections of this file, each dealing with a different + * aspect of the interaction between Aegis and the tools used to manage + * yout project. + */ + +/* + * ------------------------------------------------------------------------- + * + * The build tool is delegated. + */ + +/* + * The build_command field of the config file is used to invoke the relevant + * build command. The following command tells cook where to find the recipes. + * The ${s Howto.cook} expands to a path into the baseline during development + * if the file is not in the change. Look in aesub(5) for more information + * about command substitutions. + */ +build_command = + ""; + +/* cook -book ${s Howto.cook} search_path=$search_path \ +project=$p change=$c version=$v -star -no-log -action -notouch"; + +/* + * The recipes in the User Guide will all remove their targets before + * constructing them, which qualifies them to use the following entry in the + * config file. The targets MUST be removed first if this field is true, + * otherwise the baseline would cease to be self-consistent. + * + * Fortunately, Cook has a nifty ``set unlink;'' statement which is + * placed at the top of the cookbook. + */ +link_integration_directory = true; + + +/* + * ------------------------------------------------------------------------- + * + * The history tool is delegated. + * + * The fhist program was written by David I. Bell and is admirably + * suited to providing a history mechanism with out the "cruft" that + * SCCS and RCS impose. The fhist program also comes with two other + * utilities, fcomp and fmerge, which use the same minimal difference + * algorithm. + * + * Please note that the [# edit #] feature needs to be avoided, or the + * -Fored_Update (-fu) flag needs to be used in addition to the + * -Conditional_Update (-cu) flag, otherwise updates will complain that + * ``Input file "XXX" contains edit A instead of B for module "YYY"'' + * + * The history_create_command and the history_put_command are + * intentionally identical. This minimizes problems when using + * branches. + * + * The ${quote ...} construct is used to quote filesnames whicg contain + * shell special characters. A minimum of quoting is performed, so if + * the filenames do not contail shell special characters, no quotes will + * be used. + */ + +/* + * This command is used to create a new project history. The command is + * always executed as the project owner. Note he the source is left in + * the baseline. The following substitutions are available: + * + * ${Input} + * absolute path of the source file + * ${History} + * absolute path of the history file + * + * The history_create_command and the history_put_command are + * intentionally identical. This minimizes problems when using + * branches. + */ +history_create_command = + "fhist ${quote ${basename $input}} -cr -cu -i ${quote $input} \ +-p ${quote ${dirname $history}} -r"; + +/* + * This command is used to get a specific edit back from history. The + * command may be executed by developers. The following substitutions + * are available: + * + * ${History} + * absolute path of the history file + * ${Edit} + * edit number, as given by history_query_command + * ${Output} + * absolute path of the destination file + * + * Note that the destination filename will never look anything like the + * history source filename, so the -p is essential. + */ +history_get_command = + "fhist ${quote ${basename $history}} -e ${quote $e} \ +-o ${quote $output} -p ${quote ${dirname $history}}"; + +/* + * This command is used to add a new "top-most" entry to the history + * file. This command is always executed as the project owner. Note + * that the source file is left in the baseline. The following + * substitutions are available: + * + * ${Input} + * absolute path of source file + * ${History} + * absolute path of history file + * + * The history_create_command and the history_put_command are + * intentionally identical. This minimizes problems when using + * branches. + */ +history_put_command = + "fhist ${quote ${basename $input}} -cr -cu -i ${quote $input} \ +-p ${quote ${dirname $history}} -r"; + +/* + * This command is used to query what the history mechanism calls the + * "top-most" edit of a history file. The result may be any arbitrary + * string, it need not be anything like a number, just so long as it + * uniquely identifies the edit for use by the history_get_command at a + * later date. The edit number is to be printed on the standard output. + * This command may be executed by developers. The following + * substitutions are available: + * + * ${History} + * absolute path of the history file + */ +history_query_command = + "fhist ${quote ${basename $history}} -l 0 \ +-p ${quote ${dirname $history}} -q"; + +/* + * ------------------------------------------------------------------------- + * + * The difference and merge tools are delegated. + */ + +/* + * Compare two files using fcomp. The -w option produces an output of + * the entire file, with insertions an deletions marked by "change bars" + * in the left margin. This is superior to context difference, as it + * shows the entire file as context. The -s option could be added to + * compare runs of white space as equal. + * + * This command is used by aed(1) to produce a difference listing when + * file in the development directory was originally copied from the + * current version in the baseline. + * + * All of the command substitutions described in aesub(5) are available. + * In addition, the following substitutions are also available: + * + * ${ORiginal} + * The absolute path name of a file containing the version + * originally copied. Usually in the baseline. + * ${Input} + * The absolute path name of the edited version of the file. + * Usually in the development directory. + * ${Output} + * The absolute path name of the file in which to write the + * difference listing. Usually in the development directory. + * + * An exit status of 0 means successful, even of the files differ (and + * they usually do). An exit status which is non-zero means something + * is wrong. + * + * The non-zero exit status may be used to overload this command with + * extra tests, such as line length limits. The difference files must + * be produced in addition to these extra tests. + */ +diff_command = + "fcomp -w ${quote $original} ${quote $input} -o ${quote $output}"; + +/* + * Compare three files using fmerge. Conflicts are marked in the + * output. + * + * This command is used by aed(1) to produce a difference listing when a + * file in the development directory is out of date compared to the + * current version in the baseline. + * + * All of the command substitutions described in aesub(5) are available. + * In addition, the following substitutions are also available: + * + * ${ORiginal} + * The absolute path name of a file containing the common ancestor + * version of ${MostRecent} and {$Input}. Usually the version + * originally copied into the change. Usually in a temporary file. + * ${Most_Recent} + * The absolute path name of a file containing the most recent + * version. Usually in the baseline. + * ${Input} + * The absolute path name of the edited version of the file. + * Usually in the development directory. + * ${Output} + * The absolute path name of the file in which to write the + * difference listing. Usually in the development directory. + * + * An exit status of 0 means successful, even of the files differ (and + * they usually do). An exit status which is non-zero means something + * is wrong. + */ +merge_command = + "fmerge ${quote $original} ${quote $MostRecent} ${quote $input} \ +-o ${quote $output} -c /dev/null"; + +/* + * ------------------------------------------------------------------------- + * + * The new file templates are very handy. They allow all sorts of things + * to be se automatically. You need to edit them to add your own name, + * and copyright conditions. + */ + +file_template = +[ + { + pattern = [ "*" ]; + body = "${read_file ${source etc/template/generic abs}}"; + + } +]; + +/* ------------------------------------------------------------------------- + * + * The integrate_begin_exceptions are files which are not hard linked + * from the baseline to the integration directory. In this case, this + * is done to ensure the version stmp is updated appropriately. + */ + +integrate_begin_exceptions = [ ]; + + + + +/* ------------------------------------------------------------------------- + * + * The trojan_horse_suspect field is a list of filename patterns which + * indicate files which *could* host a Trojan horse attack. It makes + * aedist --receive more cautions. It is NOT a silver bullet: just + * about ANY file can host a Trojan, one way or the other. + */ + +trojan_horse_suspect = [ ]; + +build_covers_all_architectures = true; + +test_command = "make test"; + +build_time_adjust=dont_adjust; diff --git a/rt/config.layout b/rt/config.layout new file mode 100644 index 000000000..81917f18c --- /dev/null +++ b/rt/config.layout @@ -0,0 +1,83 @@ +## +## config.layout -- Pre-defined Installation Path Layouts +## +## Hints: +## - layouts can be loaded with configure's --enable-layout=ID option +## - when no --enable-layout option is given, the default layout is `RT' +## - a trailing plus character (`+') on paths is replaced with a +## `/' suffix where is currently hardcoded to 'rt3'. +## (This may become a configurable parameter at some point.) +## +## The following variables must _all_ be set: +## prefix exec_prefix bindir sbindir sysconfdir mandir libdir +## datadir htmldir localstatedir logfiledir masonstatedir +## sessionstatedir customdir customhtmldir customlexdir +## (This can be seen in m4/rt_layout.m4.) +## + +# Default RT3 path layout. + + prefix: /opt/rt3 + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + sysconfdir: ${prefix}/etc + mandir: ${prefix}/man + libdir: ${prefix}/lib + datadir: ${prefix}/share + htmldir: ${datadir}/html + manualdir: ${datadir}/doc + localstatedir: ${prefix}/var + logfiledir: ${localstatedir}/log + masonstatedir: ${localstatedir}/mason_data + sessionstatedir: ${localstatedir}/session_data + customdir: ${prefix}/local + custometcdir: ${customdir}/etc + customhtmldir: ${customdir}/html + customlexdir: ${customdir}/po + customlibdir: ${customdir}/lib + + + + prefix: /usr/local + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + sysconfdir: ${prefix}/etc+ + mandir: ${prefix}/man + libdir: ${prefix}/lib+ + datadir: ${prefix}/share+ + htmldir: ${datadir}/html + manualdir: ${prefix}/share/doc+ + logfiledir: /var/log + localstatedir: /var/run+ + masonstatedir: ${localstatedir}/mason_data + sessionstatedir: ${localstatedir}/session_data + customdir: ${prefix}/share+ + custometcdir: ${customdir}/local/etc + customhtmldir: ${customdir}/local/html + customlexdir: ${customdir}/local/po + customlibdir: ${customdir}/local/lib + + + + prefix: C:/Program Files/Request Tracker + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + sysconfdir: ${prefix}/etc + mandir: ${prefix}/man + libdir: ${prefix}/lib + datadir: ${prefix} + htmldir: ${datadir}/html + manualdir: ${datadir}/doc + localstatedir: ${prefix}/var + logfiledir: ${localstatedir}/log + masonstatedir: ${localstatedir}/mason_data + sessionstatedir: ${localstatedir}/session_data + customdir: ${prefix}/local + custometcdir: ${customdir}/etc + customhtmldir: ${customdir}/html + customlexdir: ${customdir}/po + customlibdir: ${customdir}/lib + diff --git a/rt/config.log b/rt/config.log new file mode 100644 index 000000000..f8549485d --- /dev/null +++ b/rt/config.log @@ -0,0 +1,117 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by RT configure 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + $ ./configure + +## --------- ## +## Platform. ## +## --------- ## + +hostname = pallas +uname -m = i686 +uname -r = 2.4.18-686 +uname -s = Linux +uname -v = #1 Sun Apr 14 11:32:47 EST 2002 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = i686 +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /usr/X11R6/bin/ +PATH: /opt/rt/bin +PATH: /usr/athena/bin +PATH: /usr/local/bin +PATH: /bin +PATH: /usr/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /usr/games +PATH: $HOME/bin +PATH: /opt/kerberos/bin +PATH: /opt/StarOffice-4.0/bin +PATH: /opt/mysql/bin/ +PATH: . + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:1217: checking for a BSD-compatible install +configure:1271: result: /usr/bin/install -c +configure:1285: checking for perl +configure:1303: found /usr/bin/perl +configure:1316: result: /usr/bin/perl +configure:1638: checking for chosen layout +configure:1653: result: RT3 +configure:1964: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by RT config.status 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on pallas + +config.status:637: creating sbin/rt-setup-database +config.status:637: creating sbin/rt-test-dependencies +config.status:637: creating Makefile +config.status:637: creating etc/RT_Config.pm +config.status:637: creating lib/RT.pm +config.status:637: creating lib/t/00smoke.t +config.status:637: creating lib/t/01harness.t +config.status:637: creating lib/t/02regression.t +config.status:637: creating lib/t/03web.pl +config.status:637: creating lib/t/04_send_email.pl +config.status:637: creating bin/mason_handler.fcgi +config.status:637: creating bin/mason_handler.scgi +config.status:637: creating bin/mason_handler.svc +config.status:637: creating bin/rt-commit-handler +config.status:637: creating bin/rt-crontool +config.status:637: creating bin/rt-mailgate +config.status:637: creating bin/webmux.pl + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_env_PERL_set= +ac_cv_env_PERL_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_path_PERL=/usr/bin/perl +ac_cv_path_install='/usr/bin/install -c' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_NAME "RT" +#define PACKAGE_TARNAME "rt" +#define PACKAGE_VERSION "3.0.4" +#define PACKAGE_STRING "RT 3.0.4" +#define PACKAGE_BUGREPORT "rt-3.0-bugs@fsck.com" + +configure: exit 0 diff --git a/rt/config.pld b/rt/config.pld new file mode 100644 index 000000000..c71c7bbdd --- /dev/null +++ b/rt/config.pld @@ -0,0 +1,19 @@ +(test "x$prefix" = "xNONE" || test "x$prefix" = "x") && prefix=/opt/rt3 +(test "x$exec_prefix" = "xNONE" || test "x$exec_prefix" = "x") && exec_prefix=${prefix} +bindir=${exec_prefix}/bin +sbindir=${exec_prefix}/sbin +sysconfdir=${prefix}/etc +mandir=${prefix}/man +libdir=${prefix}/lib +datadir=${prefix}/share +(test "x$htmldir" = "xNONE" || test "x$htmldir" = "x") && htmldir=${datadir}/html +(test "x$manualdir" = "xNONE" || test "x$manualdir" = "x") && manualdir=${datadir}/doc +localstatedir=${prefix}/var +(test "x$logfiledir" = "xNONE" || test "x$logfiledir" = "x") && logfiledir=${localstatedir}/log +(test "x$masonstatedir" = "xNONE" || test "x$masonstatedir" = "x") && masonstatedir=${localstatedir}/mason_data +(test "x$sessionstatedir" = "xNONE" || test "x$sessionstatedir" = "x") && sessionstatedir=${localstatedir}/session_data +(test "x$customdir" = "xNONE" || test "x$customdir" = "x") && customdir=${prefix}/local +(test "x$custometcdir" = "xNONE" || test "x$custometcdir" = "x") && custometcdir=${customdir}/etc +(test "x$customhtmldir" = "xNONE" || test "x$customhtmldir" = "x") && customhtmldir=${customdir}/html +(test "x$customlexdir" = "xNONE" || test "x$customlexdir" = "x") && customlexdir=${customdir}/po +(test "x$customlibdir" = "xNONE" || test "x$customlibdir" = "x") && customlibdir=${customdir}/lib diff --git a/rt/config.status b/rt/config.status new file mode 100755 index 000000000..e7d835894 --- /dev/null +++ b/rt/config.status @@ -0,0 +1,711 @@ +#! /bin/sh +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=${CONFIG_SHELL-/bin/sh} + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by RT $as_me 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +config_files=" sbin/rt-setup-database sbin/rt-test-dependencies Makefile etc/RT_Config.pm lib/RT.pm lib/t/00smoke.t lib/t/01harness.t lib/t/02regression.t lib/t/03web.pl lib/t/04_send_email.pl bin/mason_handler.fcgi bin/mason_handler.scgi bin/mason_handler.svc bin/rt-commit-handler bin/rt-crontool bin/rt-mailgate bin/webmux.pl" + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +ac_cs_version="\ +RT config.status 3.0.4 +configured by ./configure, generated by GNU Autoconf 2.53, + with options \"\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=. +INSTALL="/usr/bin/install -c" +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running /bin/sh ./configure " " --no-create --no-recursion" + exec /bin/sh ./configure --no-create --no-recursion ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "sbin/rt-setup-database" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-setup-database" ;; + "sbin/rt-test-dependencies" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-test-dependencies" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "etc/RT_Config.pm" ) CONFIG_FILES="$CONFIG_FILES etc/RT_Config.pm" ;; + "lib/RT.pm" ) CONFIG_FILES="$CONFIG_FILES lib/RT.pm" ;; + "lib/t/00smoke.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/00smoke.t" ;; + "lib/t/01harness.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/01harness.t" ;; + "lib/t/02regression.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/02regression.t" ;; + "lib/t/03web.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/03web.pl" ;; + "lib/t/04_send_email.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/04_send_email.pl" ;; + "bin/mason_handler.fcgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.fcgi" ;; + "bin/mason_handler.scgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.scgi" ;; + "bin/mason_handler.svc" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.svc" ;; + "bin/rt-commit-handler" ) CONFIG_FILES="$CONFIG_FILES bin/rt-commit-handler" ;; + "bin/rt-crontool" ) CONFIG_FILES="$CONFIG_FILES bin/rt-crontool" ;; + "bin/rt-mailgate" ) CONFIG_FILES="$CONFIG_FILES bin/rt-mailgate" ;; + "bin/webmux.pl" ) CONFIG_FILES="$CONFIG_FILES bin/webmux.pl" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF +s,@SHELL@,/bin/sh,;t t +s,@PATH_SEPARATOR@,:,;t t +s,@PACKAGE_NAME@,RT,;t t +s,@PACKAGE_TARNAME@,rt,;t t +s,@PACKAGE_VERSION@,3.0.4,;t t +s,@PACKAGE_STRING@,RT 3.0.4,;t t +s,@PACKAGE_BUGREPORT@,rt-3.0-bugs@fsck.com,;t t +s,@exec_prefix@,/opt/rt3,;t t +s,@prefix@,/opt/rt3,;t t +s,@program_transform_name@,s,x,x,,;t t +s,@bindir@,/opt/rt3/bin,;t t +s,@sbindir@,/opt/rt3/sbin,;t t +s,@libexecdir@,${exec_prefix}/libexec,;t t +s,@datadir@,/opt/rt3/share,;t t +s,@sysconfdir@,/opt/rt3/etc,;t t +s,@sharedstatedir@,${prefix}/com,;t t +s,@localstatedir@,/opt/rt3/var,;t t +s,@libdir@,/opt/rt3/lib,;t t +s,@includedir@,${prefix}/include,;t t +s,@oldincludedir@,/usr/include,;t t +s,@infodir@,${prefix}/info,;t t +s,@mandir@,/opt/rt3/man,;t t +s,@build_alias@,,;t t +s,@host_alias@,,;t t +s,@target_alias@,,;t t +s,@DEFS@,-DPACKAGE_NAME=\"RT\" -DPACKAGE_TARNAME=\"rt\" -DPACKAGE_VERSION=\"3.0.4\" -DPACKAGE_STRING=\"RT\ 3.0.4\" -DPACKAGE_BUGREPORT=\"rt-3.0-bugs@fsck.com\" ,;t t +s,@ECHO_C@,,;t t +s,@ECHO_N@,-n,;t t +s,@ECHO_T@,,;t t +s,@LIBS@,,;t t +s,@rt_version_major@,3,;t t +s,@rt_version_minor@,0,;t t +s,@rt_version_patch@,4,;t t +s,@INSTALL_PROGRAM@,${INSTALL},;t t +s,@INSTALL_SCRIPT@,${INSTALL},;t t +s,@INSTALL_DATA@,${INSTALL} -m 644,;t t +s,@PERL@,/usr/bin/perl,;t t +s,@SPEEDY_BIN@,/usr/local/bin/speedy,;t t +s,@exp_prefix@,/opt/rt3,;t t +s,@exp_exec_prefix@,/opt/rt3,;t t +s,@exp_bindir@,/opt/rt3/bin,;t t +s,@exp_sbindir@,/opt/rt3/sbin,;t t +s,@exp_sysconfdir@,/opt/rt3/etc,;t t +s,@exp_mandir@,/opt/rt3/man,;t t +s,@exp_libdir@,/opt/rt3/lib,;t t +s,@exp_datadir@,/opt/rt3/share,;t t +s,@htmldir@,/opt/rt3/share/html,;t t +s,@exp_htmldir@,/opt/rt3/share/html,;t t +s,@manualdir@,/opt/rt3/share/doc,;t t +s,@exp_manualdir@,/opt/rt3/share/doc,;t t +s,@exp_localstatedir@,/opt/rt3/var,;t t +s,@logfiledir@,/opt/rt3/var/log,;t t +s,@exp_logfiledir@,/opt/rt3/var/log,;t t +s,@masonstatedir@,/opt/rt3/var/mason_data,;t t +s,@exp_masonstatedir@,/opt/rt3/var/mason_data,;t t +s,@sessionstatedir@,/opt/rt3/var/session_data,;t t +s,@exp_sessionstatedir@,/opt/rt3/var/session_data,;t t +s,@customdir@,/opt/rt3/local,;t t +s,@exp_customdir@,/opt/rt3/local,;t t +s,@custometcdir@,/opt/rt3/local/etc,;t t +s,@exp_custometcdir@,/opt/rt3/local/etc,;t t +s,@customhtmldir@,/opt/rt3/local/html,;t t +s,@exp_customhtmldir@,/opt/rt3/local/html,;t t +s,@customlexdir@,/opt/rt3/local/po,;t t +s,@exp_customlexdir@,/opt/rt3/local/po,;t t +s,@customlibdir@,/opt/rt3/local/lib,;t t +s,@exp_customlibdir@,/opt/rt3/local/lib,;t t +s,@rt_layout_name@,RT3,;t t +s,@RTGROUP@,rt,;t t +s,@BIN_OWNER@,root,;t t +s,@LIBS_OWNER@,root,;t t +s,@LIBS_GROUP@,bin,;t t +s,@DB_TYPE@,mysql,;t t +s,@DB_HOST@,localhost,;t t +s,@DB_PORT@,,;t t +s,@DB_RT_HOST@,localhost,;t t +s,@DB_DBA@,root,;t t +s,@DB_DATABASE@,rt3,;t t +s,@DB_RT_USER@,rt_user,;t t +s,@DB_RT_PASS@,rt_pass,;t t +s,@WEB_USER@,www,;t t +s,@WEB_GROUP@,www,;t t +s,@RT_VERSION_MAJOR@,3,;t t +s,@RT_VERSION_MINOR@,0,;t t +s,@RT_VERSION_PATCH@,4,;t t +s,@RT_PATH@,/opt/rt3,;t t +s,@RT_DOC_PATH@,/opt/rt3/share/doc,;t t +s,@RT_LOCAL_PATH@,/opt/rt3/local,;t t +s,@RT_LIB_PATH@,/opt/rt3/lib,;t t +s,@RT_ETC_PATH@,/opt/rt3/etc,;t t +s,@CONFIG_FILE_PATH@,/opt/rt3/etc,;t t +s,@RT_BIN_PATH@,/opt/rt3/bin,;t t +s,@RT_SBIN_PATH@,/opt/rt3/sbin,;t t +s,@RT_VAR_PATH@,/opt/rt3/var,;t t +s,@RT_MAN_PATH@,/opt/rt3/man,;t t +s,@MASON_DATA_PATH@,/opt/rt3/var/mason_data,;t t +s,@MASON_SESSION_PATH@,/opt/rt3/var/session_data,;t t +s,@MASON_HTML_PATH@,/opt/rt3/share/html,;t t +s,@LOCAL_ETC_PATH@,/opt/rt3/local/etc,;t t +s,@MASON_LOCAL_HTML_PATH@,/opt/rt3/local/html,;t t +s,@LOCAL_LEXICON_PATH@,/opt/rt3/local/po,;t t +s,@LOCAL_LIB_PATH@,/opt/rt3/local/lib,;t t +s,@DESTDIR@,/opt/rt3,;t t +s,@RT_LOG_PATH@,/opt/rt3/var/log,;t t +CEOF + + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || + mkdir "$as_incr_dir" || + { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +done; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + sed "/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +} + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done + +{ (exit 0); exit 0; } diff --git a/rt/configure b/rt/configure new file mode 100755 index 000000000..c89d759fd --- /dev/null +++ b/rt/configure @@ -0,0 +1,2747 @@ +#! /bin/sh +# From configure.ac Revision: 1.1 . +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.53 for RT 3.0.4. +# +# Report bugs to . +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='RT' +PACKAGE_TARNAME='rt' +PACKAGE_VERSION='3.0.4' +PACKAGE_STRING='RT 3.0.4' +PACKAGE_BUGREPORT='rt-3.0-bugs@fsck.com' + +ac_unique_file="lib/RT.pm.in" +ac_default_prefix=/opt/rt3 + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_PERL_set=${PERL+set} +ac_env_PERL_value=$PERL +ac_cv_env_PERL_set=${PERL+set} +ac_cv_env_PERL_value=$PERL + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures RT 3.0.4 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of RT 3.0.4:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-layout=LAYOUT Use a specific directory layout (Default: RT3) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-speedycgi=/path/to/speedy + path to your speedycgi binary, if it exists + --with-rt-group=GROUP group to own all files (default: rt) + --with-bin-owner=OWNER user that will own rt binaries (default root) + --with-libs-owner=OWNER user that will own RT libraries (default root) + --with-libs-group=GROUP group that will own rt binaries (default bin) + --with-db-type=TYPE sort of database RT will use (default: mysql) (mysql + and Pg are valid) + --with-db-host=HOSTNAME FQDN of database server (default: localhost) + --with-db-port=PORT port on which the database listens on + --with-db-rt-host=HOSTNAME + FQDN of RT server which talks to the database server + (default: localhost) + --with-db-dba=DBA name of database administrator (default: root) + --with-db-database=DBNAME + name of the database to use (default: rt3) + --with-db-rt-user=DBUSER + name of database user (default: rt_user) + --with-db-rt-pass=PASSWORD + password for database user (default: rt_pass) + --with-web-user=USER user the web server runs as (default: www) + --with-web-group=GROUP group the web server runs as (default: www) + +Some influential environment variables: + PERL Perl interpreter command + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +RT configure 3.0.4 +generated by GNU Autoconf 2.53 + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by RT $as_me 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell meta-characters. +ac_configure_args= +ac_sep= +for ac_arg +do + case $ac_arg in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n ) continue ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + + +rt_version_major=3 + +rt_version_minor=0 + +rt_version_patch=4 + +test "x$rt_version_major" = 'x' && rt_version_major=0 +test "x$rt_version_minor" = 'x' && rt_version_minor=0 +test "x$rt_version_patch" = 'x' && rt_version_patch=0 + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PERL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL="$PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="not found" + ;; +esac +fi +PERL=$ac_cv_path_PERL + +if test -n "$PERL"; then + echo "$as_me:$LINENO: result: $PERL" >&5 +echo "${ECHO_T}$PERL" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$PERL" = 'not found'; then + { { echo "$as_me:$LINENO: error: cannot use $PACKAGE_NAME without perl" >&5 +echo "$as_me: error: cannot use $PACKAGE_NAME without perl" >&2;} + { (exit 1); exit 1; }; } +fi + +# Check whether --with-speedycgi or --without-speedycgi was given. +if test "${with_speedycgi+set}" = set; then + withval="$with_speedycgi" + SPEEDY_BIN=$withval +else + SPEEDY_BIN=/usr/local/bin/speedy +fi; + + + + + +# Check whether --enable-layout or --disable-layout was given. +if test "${enable_layout+set}" = set; then + enableval="$enable_layout" + LAYOUT=$enableval +fi; + +if test "x$LAYOUT" = "x"; then + LAYOUT="RT3" +fi + + if test ! -f $srcdir/config.layout; then + { echo "$as_me:$LINENO: WARNING: Layout file $srcdir/config.layout not found" >&5 +echo "$as_me: WARNING: Layout file $srcdir/config.layout not found" >&2;} + rt_layout_name=no + else + pldconf=./config.pld + $PERL -0777 -p -e "\$layout = '$LAYOUT';" -e ' + s/.*//gims; + s/\<\/Layout\>.*//s; + s/^#.*$//m; + s/^\s+//gim; + s/\s+$/\n/gim; + s/\+$/\/rt3/gim; + # m4 will not let us just use $srcdir/config.layout, we need $1 + s/^\s*((?:bin|sbin|libexec|data|sysconf|sharedstate|localstate|lib|include|oldinclude|info|man)dir)\s*:\s*(.*)$/$1=$2/gim; + s/^\s*(.*?)\s*:\s*(.*)$/\(test "x\$$1" = "xNONE" || test "x\$$1" = "x") && $1=$2/gim; + ' < $srcdir/config.layout > $pldconf + + if test -s $pldconf; then + rt_layout_name=$LAYOUT + . $pldconf + + for var in prefix exec_prefix bindir sbindir \ + sysconfdir mandir libdir datadir htmldir \ + localstatedir logfiledir masonstatedir \ + sessionstatedir customdir custometcdir customhtmldir \ + customlexdir customlibdir manualdir; do + eval "val=\"\$$var\"" + val=`echo $val | sed -e 's:\(.\)/*$:\1:'` + val=`echo $val | + sed -e 's:[\$]\([a-z_]*\):$\1:g'` + eval "$var='$val'" + done + + else + rt_layout_name=no + fi + #rm $pldconf + fi + + + ap_last='' + ap_cur='$prefix' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_prefix="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$exec_prefix' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_exec_prefix="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$bindir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_bindir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$sbindir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_sbindir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$sysconfdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_sysconfdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$mandir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_mandir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$libdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_libdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$datadir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_datadir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$htmldir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_htmldir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$manualdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_manualdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$localstatedir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_localstatedir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$logfiledir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_logfiledir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$masonstatedir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_masonstatedir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$sessionstatedir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_sessionstatedir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$custometcdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_custometcdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customhtmldir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customhtmldir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customlexdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customlexdir="${ap_cur}" + + + + + + + ap_last='' + ap_cur='$customlibdir' + while test "x${ap_cur}" != "x${ap_last}"; do + ap_last="${ap_cur}" + ap_cur=`eval "echo ${ap_cur}"` + done + exp_customlibdir="${ap_cur}" + + + + + +echo "$as_me:$LINENO: checking for chosen layout" >&5 +echo $ECHO_N "checking for chosen layout... $ECHO_C" >&6 +if test "x$rt_layout_name" = "xno"; then + if test "x$LAYOUT" = "xno"; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 + else + echo "$as_me:$LINENO: result: $LAYOUT" >&5 +echo "${ECHO_T}$LAYOUT" >&6 + fi + { { echo "$as_me:$LINENO: error: a valid layout must be specified (or the default used)" >&5 +echo "$as_me: error: a valid layout must be specified (or the default used)" >&2;} + { (exit 1); exit 1; }; } +else + + echo "$as_me:$LINENO: result: $rt_layout_name" >&5 +echo "${ECHO_T}$rt_layout_name" >&6 +fi + + + +# Check whether --with-rt-group or --without-rt-group was given. +if test "${with_rt_group+set}" = set; then + withval="$with_rt_group" + RTGROUP=$withval +else + RTGROUP=rt +fi; + + + +# Check whether --with-bin-owner or --without-bin-owner was given. +if test "${with_bin_owner+set}" = set; then + withval="$with_bin_owner" + BIN_OWNER=$withval +else + BIN_OWNER=root +fi; + + + +# Check whether --with-libs-owner or --without-libs-owner was given. +if test "${with_libs_owner+set}" = set; then + withval="$with_libs_owner" + LIBS_OWNER=$withval +else + LIBS_OWNER=root +fi; + + + +# Check whether --with-libs-group or --without-libs-group was given. +if test "${with_libs_group+set}" = set; then + withval="$with_libs_group" + LIBS_GROUP=$withval +else + LIBS_GROUP=bin +fi; + + + +# Check whether --with-db-type or --without-db-type was given. +if test "${with_db_type+set}" = set; then + withval="$with_db_type" + DB_TYPE=$withval +else + DB_TYPE=mysql +fi; +if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite'; then + { { echo "$as_me:$LINENO: error: Only Pg and mysql are valid db types" >&5 +echo "$as_me: error: Only Pg and mysql are valid db types" >&2;} + { (exit 1); exit 1; }; } +fi + + + +# Check whether --with-db-host or --without-db-host was given. +if test "${with_db_host+set}" = set; then + withval="$with_db_host" + DB_HOST=$withval +else + DB_HOST=localhost +fi; + + + +# Check whether --with-db-port or --without-db-port was given. +if test "${with_db_port+set}" = set; then + withval="$with_db_port" + DB_PORT=$withval +else + DB_PORT= +fi; + + + +# Check whether --with-db-rt-host or --without-db-rt-host was given. +if test "${with_db_rt_host+set}" = set; then + withval="$with_db_rt_host" + DB_RT_HOST=$withval +else + DB_RT_HOST=localhost +fi; + + + +# Check whether --with-db-dba or --without-db-dba was given. +if test "${with_db_dba+set}" = set; then + withval="$with_db_dba" + DB_DBA=$withval +else + DB_DBA=root +fi; + + + +# Check whether --with-db-database or --without-db-database was given. +if test "${with_db_database+set}" = set; then + withval="$with_db_database" + DB_DATABASE=$withval +else + DB_DATABASE=rt3 +fi; + + + +# Check whether --with-db-rt-user or --without-db-rt-user was given. +if test "${with_db_rt_user+set}" = set; then + withval="$with_db_rt_user" + DB_RT_USER=$withval +else + DB_RT_USER=rt_user +fi; + + + +# Check whether --with-db-rt-pass or --without-db-rt-pass was given. +if test "${with_db_rt_pass+set}" = set; then + withval="$with_db_rt_pass" + DB_RT_PASS=$withval +else + DB_RT_PASS=rt_pass +fi; + + + +# Check whether --with-web-user or --without-web-user was given. +if test "${with_web_user+set}" = set; then + withval="$with_web_user" + WEB_USER=$withval +else + WEB_USER=www +fi; + + + +# Check whether --with-web-group or --without-web-group was given. +if test "${with_web_group+set}" = set; then + withval="$with_web_group" + WEB_GROUP=$withval +else + WEB_GROUP=www +fi; + + + +RT_VERSION_MAJOR=${rt_version_major} + +RT_VERSION_MINOR=${rt_version_minor} + +RT_VERSION_PATCH=${rt_version_patch} + + +RT_PATH=${exp_prefix} + +RT_DOC_PATH=${exp_manualdir} + +RT_LOCAL_PATH=${exp_customdir} + +RT_LIB_PATH=${exp_libdir} + +RT_ETC_PATH=${exp_sysconfdir} + +CONFIG_FILE_PATH=${exp_sysconfdir} + +RT_BIN_PATH=${exp_bindir} + +RT_SBIN_PATH=${exp_sbindir} + +RT_VAR_PATH=${exp_localstatedir} + +RT_MAN_PATH=${exp_mandir} + +MASON_DATA_PATH=${exp_masonstatedir} + +MASON_SESSION_PATH=${exp_sessionstatedir} + +MASON_HTML_PATH=${exp_htmldir} + +LOCAL_ETC_PATH=${exp_custometcdir} + +MASON_LOCAL_HTML_PATH=${exp_customhtmldir} + +LOCAL_LEXICON_PATH=${exp_customlexdir} + +LOCAL_LIB_PATH=${exp_customlibdir} + +DESTDIR=${exp_prefix} + +RT_LOG_PATH=${exp_logfiledir} + + + +ac_config_files="$ac_config_files sbin/rt-setup-database sbin/rt-test-dependencies Makefile etc/RT_Config.pm lib/RT.pm lib/t/00smoke.t lib/t/01harness.t lib/t/02regression.t lib/t/03web.pl lib/t/04_send_email.pl bin/mason_handler.fcgi bin/mason_handler.scgi bin/mason_handler.svc bin/rt-commit-handler bin/rt-crontool bin/rt-mailgate bin/webmux.pl" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overriden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by RT $as_me 3.0.4, which was +generated by GNU Autoconf 2.53. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +RT config.status 3.0.4 +configured by $0, generated by GNU Autoconf 2.53, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" + exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "sbin/rt-setup-database" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-setup-database" ;; + "sbin/rt-test-dependencies" ) CONFIG_FILES="$CONFIG_FILES sbin/rt-test-dependencies" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "etc/RT_Config.pm" ) CONFIG_FILES="$CONFIG_FILES etc/RT_Config.pm" ;; + "lib/RT.pm" ) CONFIG_FILES="$CONFIG_FILES lib/RT.pm" ;; + "lib/t/00smoke.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/00smoke.t" ;; + "lib/t/01harness.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/01harness.t" ;; + "lib/t/02regression.t" ) CONFIG_FILES="$CONFIG_FILES lib/t/02regression.t" ;; + "lib/t/03web.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/03web.pl" ;; + "lib/t/04_send_email.pl" ) CONFIG_FILES="$CONFIG_FILES lib/t/04_send_email.pl" ;; + "bin/mason_handler.fcgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.fcgi" ;; + "bin/mason_handler.scgi" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.scgi" ;; + "bin/mason_handler.svc" ) CONFIG_FILES="$CONFIG_FILES bin/mason_handler.svc" ;; + "bin/rt-commit-handler" ) CONFIG_FILES="$CONFIG_FILES bin/rt-commit-handler" ;; + "bin/rt-crontool" ) CONFIG_FILES="$CONFIG_FILES bin/rt-crontool" ;; + "bin/rt-mailgate" ) CONFIG_FILES="$CONFIG_FILES bin/rt-mailgate" ;; + "bin/webmux.pl" ) CONFIG_FILES="$CONFIG_FILES bin/webmux.pl" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@rt_version_major@,$rt_version_major,;t t +s,@rt_version_minor@,$rt_version_minor,;t t +s,@rt_version_patch@,$rt_version_patch,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PERL@,$PERL,;t t +s,@SPEEDY_BIN@,$SPEEDY_BIN,;t t +s,@exp_prefix@,$exp_prefix,;t t +s,@exp_exec_prefix@,$exp_exec_prefix,;t t +s,@exp_bindir@,$exp_bindir,;t t +s,@exp_sbindir@,$exp_sbindir,;t t +s,@exp_sysconfdir@,$exp_sysconfdir,;t t +s,@exp_mandir@,$exp_mandir,;t t +s,@exp_libdir@,$exp_libdir,;t t +s,@exp_datadir@,$exp_datadir,;t t +s,@htmldir@,$htmldir,;t t +s,@exp_htmldir@,$exp_htmldir,;t t +s,@manualdir@,$manualdir,;t t +s,@exp_manualdir@,$exp_manualdir,;t t +s,@exp_localstatedir@,$exp_localstatedir,;t t +s,@logfiledir@,$logfiledir,;t t +s,@exp_logfiledir@,$exp_logfiledir,;t t +s,@masonstatedir@,$masonstatedir,;t t +s,@exp_masonstatedir@,$exp_masonstatedir,;t t +s,@sessionstatedir@,$sessionstatedir,;t t +s,@exp_sessionstatedir@,$exp_sessionstatedir,;t t +s,@customdir@,$customdir,;t t +s,@exp_customdir@,$exp_customdir,;t t +s,@custometcdir@,$custometcdir,;t t +s,@exp_custometcdir@,$exp_custometcdir,;t t +s,@customhtmldir@,$customhtmldir,;t t +s,@exp_customhtmldir@,$exp_customhtmldir,;t t +s,@customlexdir@,$customlexdir,;t t +s,@exp_customlexdir@,$exp_customlexdir,;t t +s,@customlibdir@,$customlibdir,;t t +s,@exp_customlibdir@,$exp_customlibdir,;t t +s,@rt_layout_name@,$rt_layout_name,;t t +s,@RTGROUP@,$RTGROUP,;t t +s,@BIN_OWNER@,$BIN_OWNER,;t t +s,@LIBS_OWNER@,$LIBS_OWNER,;t t +s,@LIBS_GROUP@,$LIBS_GROUP,;t t +s,@DB_TYPE@,$DB_TYPE,;t t +s,@DB_HOST@,$DB_HOST,;t t +s,@DB_PORT@,$DB_PORT,;t t +s,@DB_RT_HOST@,$DB_RT_HOST,;t t +s,@DB_DBA@,$DB_DBA,;t t +s,@DB_DATABASE@,$DB_DATABASE,;t t +s,@DB_RT_USER@,$DB_RT_USER,;t t +s,@DB_RT_PASS@,$DB_RT_PASS,;t t +s,@WEB_USER@,$WEB_USER,;t t +s,@WEB_GROUP@,$WEB_GROUP,;t t +s,@RT_VERSION_MAJOR@,$RT_VERSION_MAJOR,;t t +s,@RT_VERSION_MINOR@,$RT_VERSION_MINOR,;t t +s,@RT_VERSION_PATCH@,$RT_VERSION_PATCH,;t t +s,@RT_PATH@,$RT_PATH,;t t +s,@RT_DOC_PATH@,$RT_DOC_PATH,;t t +s,@RT_LOCAL_PATH@,$RT_LOCAL_PATH,;t t +s,@RT_LIB_PATH@,$RT_LIB_PATH,;t t +s,@RT_ETC_PATH@,$RT_ETC_PATH,;t t +s,@CONFIG_FILE_PATH@,$CONFIG_FILE_PATH,;t t +s,@RT_BIN_PATH@,$RT_BIN_PATH,;t t +s,@RT_SBIN_PATH@,$RT_SBIN_PATH,;t t +s,@RT_VAR_PATH@,$RT_VAR_PATH,;t t +s,@RT_MAN_PATH@,$RT_MAN_PATH,;t t +s,@MASON_DATA_PATH@,$MASON_DATA_PATH,;t t +s,@MASON_SESSION_PATH@,$MASON_SESSION_PATH,;t t +s,@MASON_HTML_PATH@,$MASON_HTML_PATH,;t t +s,@LOCAL_ETC_PATH@,$LOCAL_ETC_PATH,;t t +s,@MASON_LOCAL_HTML_PATH@,$MASON_LOCAL_HTML_PATH,;t t +s,@LOCAL_LEXICON_PATH@,$LOCAL_LEXICON_PATH,;t t +s,@LOCAL_LIB_PATH@,$LOCAL_LIB_PATH,;t t +s,@DESTDIR@,$DESTDIR,;t t +s,@RT_LOG_PATH@,$RT_LOG_PATH,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || + mkdir "$as_incr_dir" || + { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +done; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/rt/configure.ac b/rt/configure.ac new file mode 100644 index 000000000..cd82c4460 --- /dev/null +++ b/rt/configure.ac @@ -0,0 +1,209 @@ +dnl +dnl Process this file with autoconf to produce a configure script +dnl +dnl Embed in generated ./configure script the following CVS info: +AC_REVISION($Revision: 1.1 $)dnl + +dnl Setup autoconf +AC_PREREQ(2.53) +AC_INIT(RT, [3.0.4], [rt-3.0-bugs@fsck.com]) +AC_CONFIG_SRCDIR([lib/RT.pm.in]) + +dnl Extract RT version number components +AC_SUBST([rt_version_major], + m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\)\.\(\w+\)\(\.\(\w+\)\)?],[\1])) +AC_SUBST([rt_version_minor], + m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\)\.\(\w+\)\(\.\(\w+\)\)?],[\2])) +AC_SUBST([rt_version_patch], + m4_bregexp(AC_PACKAGE_VERSION,[^\(\w+\)\.\(\w+\)\(\.\(\w+\)\)?],[\4])) +test "x$rt_version_major" = 'x' && rt_version_major=0 +test "x$rt_version_minor" = 'x' && rt_version_minor=0 +test "x$rt_version_patch" = 'x' && rt_version_patch=0 + +dnl Check for programs +AC_PROG_INSTALL +AC_ARG_VAR([PERL],[Perl interpreter command]) +AC_PATH_PROG([PERL], [perl], [not found]) +if test "$PERL" = 'not found'; then + AC_MSG_ERROR([cannot use $PACKAGE_NAME without perl]) +fi +dnl SPEED_BIN +AC_ARG_WITH(speedycgi, + AC_HELP_STRING([--with-speedycgi=/path/to/speedy], + [path to your speedycgi binary, if it exists]), + SPEEDY_BIN=$withval, + SPEEDY_BIN=/usr/local/bin/speedy) +AC_SUBST(SPEEDY_BIN) + + +dnl Defaults paths for installation +AC_PREFIX_DEFAULT([/opt/rt3]) +RT_ENABLE_LAYOUT + +dnl RTGROUP +AC_ARG_WITH(rt-group, + AC_HELP_STRING([--with-rt-group=GROUP], + [group to own all files (default: rt)]), + RTGROUP=$withval, + RTGROUP=rt) +AC_SUBST(RTGROUP) + +dnl BIN_OWNER +AC_ARG_WITH(bin-owner, + AC_HELP_STRING([--with-bin-owner=OWNER], + [user that will own rt binaries (default root)]), + BIN_OWNER=$withval, + BIN_OWNER=root) +AC_SUBST(BIN_OWNER) + +dnl LIBS_OWNER +AC_ARG_WITH(libs-owner, + AC_HELP_STRING([--with-libs-owner=OWNER], + [user that will own RT libraries (default root)]), + LIBS_OWNER=$withval, + LIBS_OWNER=root) +AC_SUBST(LIBS_OWNER) + +dnl LIBS_GROUP +AC_ARG_WITH(libs-group, + AC_HELP_STRING([--with-libs-group=GROUP], + [group that will own rt binaries (default bin)]), + LIBS_GROUP=$withval, + LIBS_GROUP=bin) +AC_SUBST(LIBS_GROUP) + +dnl DB_TYPE +AC_ARG_WITH(db-type, + AC_HELP_STRING([--with-db-type=TYPE], + [sort of database RT will use (default: mysql) (mysql and Pg are valid)]), + DB_TYPE=$withval, + DB_TYPE=mysql) +if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite'; then + AC_MSG_ERROR([Only Pg and mysql are valid db types]) +fi +AC_SUBST(DB_TYPE) + +dnl DB_HOST +AC_ARG_WITH(db-host, + AC_HELP_STRING([--with-db-host=HOSTNAME], + [FQDN of database server (default: localhost)]), + DB_HOST=$withval, + DB_HOST=localhost) +AC_SUBST(DB_HOST) + +dnl DB_PORT +AC_ARG_WITH(db-port, + AC_HELP_STRING([--with-db-port=PORT], + [port on which the database listens on]), + DB_PORT=$withval, + DB_PORT=) +AC_SUBST(DB_PORT) + +dnl DB_RT_HOST +AC_ARG_WITH(db-rt-host, + AC_HELP_STRING([--with-db-rt-host=HOSTNAME], + [FQDN of RT server which talks to the database server (default: localhost)]), + DB_RT_HOST=$withval, + DB_RT_HOST=localhost) +AC_SUBST(DB_RT_HOST) + +dnl DB_DATABASE_ADMIN +AC_ARG_WITH(db-dba, + AC_HELP_STRING([--with-db-dba=DBA], + [name of database administrator (default: root)]), + DB_DBA=$withval, + DB_DBA=root) +AC_SUBST(DB_DBA) + +dnl DB_DATABASE +AC_ARG_WITH(db-database, + AC_HELP_STRING([--with-db-database=DBNAME], + [name of the database to use (default: rt3)]), + DB_DATABASE=$withval, + DB_DATABASE=rt3) +AC_SUBST(DB_DATABASE) + +dnl DB_RT_USER +AC_ARG_WITH(db-rt-user, + AC_HELP_STRING([--with-db-rt-user=DBUSER], + [name of database user (default: rt_user)]), + DB_RT_USER=$withval, + DB_RT_USER=rt_user) +AC_SUBST(DB_RT_USER) + +dnl DB_RT_PASS +AC_ARG_WITH(db-rt-pass, + AC_HELP_STRING([--with-db-rt-pass=PASSWORD], + [password for database user (default: rt_pass)]), + DB_RT_PASS=$withval, + DB_RT_PASS=rt_pass) +AC_SUBST(DB_RT_PASS) + +dnl WEB_USER +AC_ARG_WITH(web-user, + AC_HELP_STRING([--with-web-user=USER], + [user the web server runs as (default: www)]), + WEB_USER=$withval, + WEB_USER=www) +AC_SUBST(WEB_USER) + +dnl WEB_GROUP +AC_ARG_WITH(web-group, + AC_HELP_STRING([--with-web-group=GROUP], + [group the web server runs as (default: www)]), + WEB_GROUP=$withval, + WEB_GROUP=www) +AC_SUBST(WEB_GROUP) + +dnl This section maps the variable names this script 'natively' generates +dnl to their existing names. They should be removed from here as the .in +dnl files are changed to use the new names. + +dnl version numbers +AC_SUBST(RT_VERSION_MAJOR, ${rt_version_major}) +AC_SUBST(RT_VERSION_MINOR, ${rt_version_minor}) +AC_SUBST(RT_VERSION_PATCH, ${rt_version_patch}) + +dnl layout paths +AC_SUBST([RT_PATH], ${exp_prefix}) +AC_SUBST([RT_DOC_PATH], ${exp_manualdir}) +AC_SUBST([RT_LOCAL_PATH], ${exp_customdir}) +AC_SUBST([RT_LIB_PATH], ${exp_libdir}) +AC_SUBST([RT_ETC_PATH], ${exp_sysconfdir}) +AC_SUBST([CONFIG_FILE_PATH], ${exp_sysconfdir}) +AC_SUBST([RT_BIN_PATH], ${exp_bindir}) +AC_SUBST([RT_SBIN_PATH], ${exp_sbindir}) +AC_SUBST([RT_VAR_PATH], ${exp_localstatedir}) +AC_SUBST([RT_MAN_PATH], ${exp_mandir}) +AC_SUBST([MASON_DATA_PATH], ${exp_masonstatedir}) +AC_SUBST([MASON_SESSION_PATH], ${exp_sessionstatedir}) +AC_SUBST([MASON_HTML_PATH], ${exp_htmldir}) +AC_SUBST([LOCAL_ETC_PATH], ${exp_custometcdir}) +AC_SUBST([MASON_LOCAL_HTML_PATH], ${exp_customhtmldir}) +AC_SUBST([LOCAL_LEXICON_PATH], ${exp_customlexdir}) +AC_SUBST([LOCAL_LIB_PATH], ${exp_customlibdir}) +AC_SUBST([DESTDIR], ${exp_prefix}) +AC_SUBST([RT_LOG_PATH], ${exp_logfiledir}) + +dnl Configure the output files, and generate them. + +AC_CONFIG_FILES([ + sbin/rt-setup-database + sbin/rt-test-dependencies + Makefile + etc/RT_Config.pm + lib/RT.pm + lib/t/00smoke.t + lib/t/01harness.t + lib/t/02regression.t + lib/t/03web.pl + lib/t/04_send_email.pl + bin/mason_handler.fcgi + bin/mason_handler.scgi + bin/mason_handler.svc + bin/rt-commit-handler + bin/rt-crontool + bin/rt-mailgate + bin/webmux.pl] + ) +AC_OUTPUT diff --git a/rt/docs/design_docs/acls b/rt/docs/design_docs/acls index 3b9d8567c..bb093adcb 100644 --- a/rt/docs/design_docs/acls +++ b/rt/docs/design_docs/acls @@ -1,206 +1,50 @@ -$Header: /home/cvs/cvsroot/freeside/rt/docs/design_docs/acls,v 1.1 2002-08-12 06:17:07 ivan Exp $ +Does principal baz have right foo for object bar -# {{{ Requirements +What rights does user baz have for object bar -Here's the rough scheme I was thinking of for RT2 acls. Thoughts? I think -it's a lot more flexible than RT 1.0, but not so crazily complex that -it will be impossible to implement. One of the "interesting" features -is the ability to grant acls based on watcher status. This now lives -in design-docs/acls +# {{{ Which principals have right foo for object bar - jesse -Who can rights be granted to: +if ($args{'ObjectType'} eq 'Ticket') { + $or_check_ticket_roles = " OR ( Groups.Domain = 'TicketRole' AND Groups.Instance = '".$args{'ObjectId'}."') "; + # If we're looking at ticket rights, we also want to look at the associated queue rights. + # this is a little bit hacky, but basically, now that we've done the ticket roles magic, we load the queue object + # and ask all the rest of our questions about the queue. + my $tick = RT::Ticket->new($RT::SystemUser); + $tick->Load($args{'ObjectId'}); + $args{'ObjectType'} = 'Queue'; + $args{'ObjectId'} = $tick->QueueObj->Id(); - users whose id is - users who are watchers of type for - users who are watchers of type for - - -what scope do these rights apply to - queue - system - - -What rights can be granted - Display Ticket - Manipulate Ticket - Only users with manipulate ticket level access will see comments - Maniplulate Ticket Status - Create Ticket - - Admin Queue Watchers - Admin Ticket Watchers - Admin user accounts - Admin scrips - Admin scripscopes - Admin Queue ACLS - Admin System ACLs - -# }}} - - -# {{{ Prinicpals These are the entities in your Access Control Element -# - -Principal: What user does this right apply to - - Made up of: - PrincipalScope, PrincipalType and PrincipalId - - - User: - Scope: User - Type: null - Id: A userid or 0 - - Owner: - Scope: Owner - Type: null - Id: none - - - Watchers: - - Scope: Ticket - Type: Requestors; Cc; AdminCc - Id: A ticket id or 0 for "this ticket" - - Scope: Queue - Type: Cc; AdminCc - Id: A queue id or 0 for "this queue" - - -# }}} - -# {{{ Object: What object does this right apply to - - Object is composed of an ObjectType and an ObjectId - - Type: System - Id: NULL - - Type: Queue - Id: Integer ref to queue id or 0 for all queues - -# }}} - -# {{{ Right: (What does this entry give the principal the right to do) - - - - For the Object System: - System::SetACL - System::AdminScrips - - User::Display - User::Create - User::Destroy - User::Modify - User::SetPassword - - - - For the Object "Queue": - Queue::Admin - Queue::SetACL - Queue::Create - Queue::Display - Queue::Destroy - Queue::ModifyWatchers - Ticket::Create - Ticket::Destory - Ticket::Display - Ticket::Update - Ticket::UpdateRequestors - Ticket::UpdateCc - Ticket::UpdateAdminCc - Ticket::NotifyWatchers - - - DEFERRED - - Ticket::SetStatus: (Values) - Open - Resolved - Stalled - means any - - -# }}} - - -# {{{ Implementation: - -# {{{ SQL Schema -CREATE TABLE ACL ( - id int not null primary_key autoincrement, - PrinicpalId INT(11), - PrincipalType VARCHAR(16), - PrincipalScope VARCHAR(16), - ObjectType VARCHAR(16), - ObjectId INT, - Right VARCHAR(16) -); - -# }}} - -# {{{ perl implementation of rights searches - -sub Principals { -if (defined $Ticket) { - return "($UserPrincipal) OR ($OwnerPrincipal) OR ($WatchersPrincipal)"; - } -else { - return "($UserPrincipal) OR ($WatchersPrincipal)"; - } } - -$Principals = " ($UserPrincipal) OR ($OwnerPrincipal) OR ($WatchersPrincipal)"; - -$UserPrincipal = " ( ACE.PrincipalScope = 'User') AND - ( ACE.PrincipalId = $User OR ACE.PrincipalId = 0)"; - -$OwnerPrincipal = " ( ACE.PrinciaplScope = 'Owner') AND - ( Tickets.Owner = "$User ) AND - ( Tickets.Id = $Ticket)"; - -$WatchersPrincipal = " ( ACE.PrincipalScope = Watchers.Scope ) AND - ( ACE.PrincipalType = Watchers.Type ) AND - ( ACL.PrincipalId = Watchers.Value ) AND - ( Watchers.Owner = $User )"; - -$QueueObject = "( ACE.ObjectType = 'Queue' and (ACE.ObjectId = $Queue OR ACE.ObjectId = 0)"; - -$SystemObject = "( ACE.ObjectType = 'System' )"; - - -# This select statement would figure out if A user has $Right at the queue level - -SELECT ACE.id from ACE, Watchers, Tickets WHERE ( - $QueueObject - AND ( ACE.Right = $Right) - AND ($Principals)) +if ($args{'ObjectType'} eq 'Queue') { + $or_check_roles = " OR ( ( (Groups.Domain = 'QueueRole' AND Groups.Instance = '".$args{'ObjectId'}."') $or_check_ticket_roles ) + AND Groups.Type = ACL.PrincipalType AND Groups.Id = Principals.ObjectId AND Principals.PrincipalType = 'Group') "; +} -# This select statement would figure outif a user has $Right for the "System" +if (defined $args{'ObjectType'} ) { + $or_look_at_object_rights = " OR (ACL.ObjectType = '".$args{'ObjectType'}."' AND ACL.ObjectId = '".$args{'ObjectId'}."') "; -SELECT ACE.id from ACE, Watchers, Tickets WHERE ( - ($SystemObject) AND ( ACE.Right = $Right ) AND ($Principals)) +} -# }}} +my $query = "SELECT Users.* from ACL, Groups, Users, Principals, Principals UserPrinc, CachedGroupMembers WHERE + Users.id = UserPrinc.ObjectId AND UserPrinc.PrincipalType = 'User' AND + Principals.Id = CachedGroupMembers.GroupId AND + CachedGroupMembers.MemberId = UserPrinc.ObjectId AND + UserPrinc.PrincipalType = 'User' AND + (ACL.RightName = 'SuperUser' OR ACL.RightName = '$right') AND + (ACL.ObjectType = 'System' $or_look_at_object_rights) AND + ( + (ACL.PrincipalId = Principals.Id AND + Principals.ObjectId = Groups.Id AND + ACL.PrincipalType = 'Group' AND + (Groups.Domain = 'SystemInternal' OR Groups.Domain = 'UserDefined' OR Groups.Domain = 'ACLEquivalence') + ) + $or_check_roles + )"; # }}} -# {{{ Examples -# - -# }}} - - - -Unaddressed issues: - - There needs to be a more refined method for grouping users, such that members of the customer service department -can't change sysadmins' passwords. +What objects does principal baz have right foo for +; diff --git a/rt/docs/design_docs/approval_notices b/rt/docs/design_docs/approval_notices new file mode 100644 index 000000000..5e7611924 --- /dev/null +++ b/rt/docs/design_docs/approval_notices @@ -0,0 +1,8 @@ +Notification on "your request approved by" +Notification on "your request approved by all approvers" +Notification on "your request denied by" +Reject ticket on rejection of any approval + +"Ticket N is pending your approval" + + diff --git a/rt/docs/design_docs/approval_template b/rt/docs/design_docs/approval_template new file mode 100644 index 000000000..16a988c5d --- /dev/null +++ b/rt/docs/design_docs/approval_template @@ -0,0 +1,25 @@ +===Create-Ticket: approval + { my $name = "HR"; + my $groups = RT::Groups->new($RT::SystemUser); + $groups->LimitToUserDefinedGroups(); + $groups->Limit(FIELD => 'Name', OPERATOR => '=', VALUE => "$name"); + $groups->WithMember($TransactionObj->CreatorObj->Id); + + my $groupid = $groups->First->Id; + + my $adminccs = RT::Users->new($RT::SystemUser); + $adminccs->WhoHaveRight(Right => 'AdminGroup', IncludeSystemRights => undef, IncludeSuperusers => 0, IncludeSubgroupMembers => 0, Object => $groups->First); + + my @admins; + while (my $admin = $adminccs->Next) { + push (@admins, $admin->Name); + } + } + Queue: Approvals + Type: Approval + AdminCcs: {join (", ",@admins) } + Depended-On-By: {$tickets{'TOP'}->Id} + Refers-To: {$tickets{'TOP'}->Id} + Due: {time + 86400} + Content-Type: text/plain + Content: Your approval is requested for the ticket {%$tickets{'TOP'}->Id}: {$tickets{'TOP'}->Subject} diff --git a/rt/docs/design_docs/cf_search b/rt/docs/design_docs/cf_search new file mode 100644 index 000000000..456a9febb --- /dev/null +++ b/rt/docs/design_docs/cf_search @@ -0,0 +1,72 @@ +find all tickets where: + + + CF Foo + Has values (talk or read) AND + Has values (bar and baz) AND + doesn't have values (bing or bong) + + +LimitCustomFieldValues { + my %args = ( CustomField => undef, + ClauseId => 'CustomFields', + OPERATOR => undef, + ENTRYAGGREGATOR => undef, + VALUES => undef, + @_) ; + + unless ( $self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField'} ) { + $self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField'} = $self->NewAlias('CustomFields'); + $self->Join(TABLE1 =>$self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField' }, + FIELD1 => 'QueueId', + TABLE2 => 'main', FIELD2 => 'QueueId'); + + if ($args{'OPERATOR'} =~ /!=|IS/i) { + } + else { + } + +} + # {{{ if it's a keyword + elsif ( $TYPES{ $restriction->{'FIELD'} } eq 'CUSTOMFIELD' ) { + + my $null_columns_ok; + my $TicketCFs = $self->Join( TYPE => 'left', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'TicketCustomFieldValues', + FIELD2 => 'Ticket' ); + + foreach my $value ( @{ $restriction->{'VALUES'} } ) { + $self->SUPER::Limit( ALIAS => $TicketCFs, + FIELD => 'Content', + OPERATOR => $restriction->{'OPERATOR'}, + VALUE => $value, + QUOTEVALUE => $restriction->{'QUOTEVALUE'}, + ENTRYAGGREGATOR => 'AND', ); + } + if ( ( $restriction->{'OPERATOR'} =~ /^IS$/i ) or ( $restriction->{'OPERATOR'} eq '!=' ) ) { + $null_columns_ok = 1; + } + + #If we're trying to find tickets where the keyword isn't somethng, also check ones where it _IS_ null + if ( $restriction->{'OPERATOR'} eq '!=' ) { + $self->SUPER::Limit( ALIAS => $TicketCFs, + FIELD => 'Content', + OPERATOR => 'IS', + VALUE => 'NULL', + QUOTEVALUE => 0, + ENTRYAGGREGATOR => 'OR', ); + } + + $self->SUPER::Limit( LEFTJOIN => $TicketCFs, + FIELD => 'CustomField', + VALUE => $restriction->{'CUSTOMFIELD'}, + ENTRYAGGREGATOR => 'OR' ); + + } + + # }}} + + } + diff --git a/rt/docs/design_docs/cli_spec b/rt/docs/design_docs/cli_spec index 48a7f34e1..ae5f29f76 100644 --- a/rt/docs/design_docs/cli_spec +++ b/rt/docs/design_docs/cli_spec @@ -1,354 +1,31 @@ -Find tickets to operate on: - --id= Find only tickets in the range - synonyms: - --limit-id, --tickets, --limit-tickets - --limit-queue= - --limit-status= - --limit-owner= - --limit-priority= - --limit-requestor= - --limit-subject= (Subject contains) - --limit-body= (body contains) - --limit-created=(before/after) - --limit-due=(before/after) - --limit-starts=(before/after) - --limit-started=(before/after) +Things the cli must do + create ticket + comment + reply + update ticket metadata + search for tickets + update a bunch of tickets. + list tickets + login/logout - --limit-first= Start on the th row returned by the - database - --limit-rows= Find only rows -Display: - --show shows a ticket history - --history ditto +should support multiple rt servers - --summary default option. shows a ticket summary - --format Optional format string. If not specified, - uses the value of ENV{'RT_LISTING_FORMAT'} - or an internal default - +create/edit/update should use EDITOR or take from a file or stdin -Basic ticket editing: +should be able to update ticket sttributes from a commandline without invoking an editor or needing to use stdin. - --status=(open|stall|resolve|kill) - --subject= - --owner= - --queue= - --time-left= +login/logout should store RT session cookies rather than constantly transmitting the username/password combo. -Watcher-related editing: +rtserver and rt username should come from env variables. but should be able to be overridden by commandline options. - --add-requestor= - --del-requestor= - --add-cc= - --del-cc= - --add-admincc= - --del-admincc= +rt password should be able to be specified on the commandline (say from a script) or, failing that be prompted for within the application (as rt's sbin/initdb script does) ...or maybe able to be read from a stash file on disk. -Priority related editing: +must be able to dowaload attachments from cli. + + it might also be cool to be able to generate session-length urls for attavhments so you can use a browser. but that's not necessary. - --priority= - --final-priority= -Date related editing: - - --due=date - --starts=date - --started=date - --contacted=date - - - -Ticket updates: - - --comment - --reply | --respond - - -Links - - --add-link - --type= - needs one of: - --target= - --base= - - --del-link - - - -Condiments: - any update can take: - - --time-taken - - Ticket updates can take: - - --source -- specify a source file to read the content from - --edit = give me an editor to edit the message - --no-edit = don't give me an editor to edit the message. - - - - ------ Forwarded message from deborah kaplan ----- - -Date: Fri, 14 Apr 2000 11:43:18 -0400 (EDT) -From: deborah kaplan -To: Jesse -Subject: Re: [rt-devel] RT Projects list - -Finally, here is the functional spec for the command line -interface. This is for the user interface only; if you think -this is right, I will add the administrative interface as well. -Should I post to rt-devel, add to the ticket, or just modify -based on your kibbitzing? When you are happy with it I'll start -the code. - --deborah - - -RT command line interface functional specification -Author: Deborah Kaplan (Deborah@suberic.net) -Version:0.1 - -Requirements: - -RT needs a CLI for various reasons. If a user is restricted to a -dumb terminal, she needs to be able to access the RT database and -manipulate it fully. The full functionality of both the RT -database and the RT administrative interface should be available -from this CLI. - -There are two possible types of CLI which I will discuss here. -The first is a curses-style interface, which allows the user to -move about a series of menus and choices, usually using arrow -keys. As RT supplies a Web interface, there is no need for this -curses-style interface to be written as part of RT. Instead, the -RT developers should pick one tty-based Web browser (e.g. lynx, -w3m) and make sure that all of the RT pages are easily readable -with that tty based browser. Installation of that browser should -be recommended in the RT installation documentation as a -supported method of accessing RT from a tty. - -The second possible type of CLI is more minimal: a series of -commands which can be run at a UNIX command prompt which provide -full functionality to the RT database and administrative -interface. There are two major benefits to this second type of -CLI. First of all, in order to use this CLI, you need no extra -tools (Web browsers, etc.). All that is required is a UNIX -command line prompt and an installation of RT. Secondly, a user -of RT who has a very specific command to run and who knows the -appropriate CLI commands can accomplish her task much more -quickly with a single command then she could navigating through a -menu based interface. - -In the specification, I will describe the second type of CLI. - -Caveats: - -This specification draws heavily on the structure of formatting -command line options for cvs. RT faces a smaller version of the -same kinds of problems cvs faces: we want to create a very rich -command set without sacrificing ease-of-use. - -I am not wedded to any specific command names if they seem -impractical; I merely am proposing the command names that seem -reasonable to me at this moment. - -Finally, I am finding the functioning of the web UI from RT 1. -If the functionality differs greatly in RT 2, I will need to -modify this specification. - -Specification: - -There are two commands: "rt", which is the primary interface to -the database, and "rtadmin", which is the administrative -interface to the database. - -The format of an rt command is as follows: - - rt - is one of: - - - help - print an overview of the commands which can be run - - - print - with no options, dump to the screen a list of all open - requests in -- the equivalent of "Display Queue" in - the existing Web interface. - - is the name of an RT queue -