From e1eb06c05b654a4533bab0e034e87a8de99015cc Mon Sep 17 00:00:00 2001 From: cvs2git Date: Mon, 12 Oct 1998 07:03:12 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'freeside_current'. --- Artistic | 125 ------ CREDITS | 14 - GPL | 339 --------------- INSTALL | 1 - README | 43 -- bin/dbdef-create | 85 ---- bin/fs-setup | 542 ------------------------ bin/pod2x | 23 - bin/svc_acct.export | 351 --------------- bin/svc_acct.import | 227 ---------- bin/svc_acct_sm.export | 221 ---------- bin/svc_acct_sm.import | 252 ----------- eg/TEMPLATE_cust_main.import | 189 --------- etc/acp_logfile-parse | 197 --------- etc/countries.txt | 239 ----------- etc/domain-template.txt | 231 ---------- etc/example-direct-cardin | 67 --- fs_passwd/fs_passwd | 129 ------ fs_passwd/fs_passwd_server | 73 ---- fs_passwd/fs_passwdd | 49 --- fs_radlog/fs_radlogd | 51 --- htdocs/browse/agent.cgi | 72 ---- htdocs/browse/agent_type.cgi | 81 ---- htdocs/browse/cust_main_county.cgi | 65 --- htdocs/browse/part_pkg.cgi | 81 ---- htdocs/browse/part_referral.cgi | 57 --- htdocs/browse/part_svc.cgi | 81 ---- htdocs/browse/svc_acct_pop.cgi | 63 --- htdocs/docs/admin.html | 6 - htdocs/docs/billing.html | 40 -- htdocs/docs/config.html | 38 -- htdocs/docs/export.html | 39 -- htdocs/docs/index.html | 23 - htdocs/docs/install.html | 56 --- htdocs/docs/legacy.html | 34 -- htdocs/docs/passwd.html | 16 - htdocs/docs/schema.html | 205 --------- htdocs/docs/trouble.html | 41 -- htdocs/docs/upgrade.html | 24 -- htdocs/docs/upgrade2.html | 11 - htdocs/edit/agent.cgi | 77 ---- htdocs/edit/agent_type.cgi | 75 ---- htdocs/edit/cust_credit.cgi | 97 ----- htdocs/edit/cust_main.cgi | 214 ---------- htdocs/edit/cust_main_county-expand.cgi | 49 --- htdocs/edit/cust_main_county.cgi | 66 --- htdocs/edit/cust_pay.cgi | 76 ---- htdocs/edit/cust_pkg.cgi | 137 ------ htdocs/edit/part_pkg.cgi | 102 ----- htdocs/edit/part_referral.cgi | 66 --- htdocs/edit/part_svc.cgi | 148 ------- htdocs/edit/process/agent.cgi | 53 --- htdocs/edit/process/agent_type.cgi | 83 ---- htdocs/edit/process/cust_credit.cgi | 70 --- htdocs/edit/process/cust_main.cgi | 102 ----- htdocs/edit/process/cust_main_county-expand.cgi | 71 ---- htdocs/edit/process/cust_main_county.cgi | 38 -- htdocs/edit/process/cust_pay.cgi | 57 --- htdocs/edit/process/cust_pkg.cgi | 73 ---- htdocs/edit/process/part_pkg.cgi | 79 ---- htdocs/edit/process/part_referral.cgi | 45 -- htdocs/edit/process/part_svc.cgi | 47 -- htdocs/edit/process/svc_acct.cgi | 87 ---- htdocs/edit/process/svc_acct_pop.cgi | 43 -- htdocs/edit/process/svc_acct_sm.cgi | 80 ---- htdocs/edit/process/svc_domain.cgi | 78 ---- htdocs/edit/svc_acct.cgi | 191 --------- htdocs/edit/svc_acct_pop.cgi | 67 --- htdocs/edit/svc_acct_sm.cgi | 219 ---------- htdocs/edit/svc_domain.cgi | 120 ------ htdocs/images/mid-logo.gif | Bin 10606 -> 0 bytes htdocs/images/small-logo.gif | Bin 5426 -> 0 bytes htdocs/index.html | 96 ----- htdocs/misc/bill.cgi | 66 --- htdocs/misc/cancel-unaudited.cgi | 85 ---- htdocs/misc/cancel_pkg.cgi | 54 --- htdocs/misc/expire_pkg.cgi | 71 ---- htdocs/misc/link.cgi | 72 ---- htdocs/misc/print-invoice.cgi | 57 --- htdocs/misc/process/link.cgi | 73 ---- htdocs/misc/susp_pkg.cgi | 68 --- htdocs/misc/unsusp_pkg.cgi | 68 --- htdocs/search/cust_bill.cgi | 46 -- htdocs/search/cust_bill.html | 21 - htdocs/search/cust_main-payinfo.html | 21 - htdocs/search/cust_main.cgi | 235 ---------- htdocs/search/cust_main.html | 36 -- htdocs/search/cust_pkg.cgi | 122 ------ htdocs/search/svc_acct.cgi | 186 -------- htdocs/search/svc_acct.html | 21 - htdocs/search/svc_acct_sm.cgi | 128 ------ htdocs/search/svc_acct_sm.html | 23 - htdocs/search/svc_domain.cgi | 139 ------ htdocs/search/svc_domain.html | 22 - htdocs/view/cust_bill.cgi | 79 ---- htdocs/view/cust_main.cgi | 336 --------------- htdocs/view/cust_pkg.cgi | 181 -------- htdocs/view/svc_acct.cgi | 172 -------- htdocs/view/svc_acct_sm.cgi | 114 ----- htdocs/view/svc_domain.cgi | 76 ---- 100 files changed, 9859 deletions(-) delete mode 100644 Artistic delete mode 100644 CREDITS delete mode 100644 GPL delete mode 100644 INSTALL delete mode 100644 README delete mode 100755 bin/dbdef-create delete mode 100755 bin/fs-setup delete mode 100755 bin/pod2x delete mode 100755 bin/svc_acct.export delete mode 100755 bin/svc_acct.import delete mode 100755 bin/svc_acct_sm.export delete mode 100755 bin/svc_acct_sm.import delete mode 100755 eg/TEMPLATE_cust_main.import delete mode 100755 etc/acp_logfile-parse delete mode 100644 etc/countries.txt delete mode 100644 etc/domain-template.txt delete mode 100755 etc/example-direct-cardin delete mode 100755 fs_passwd/fs_passwd delete mode 100755 fs_passwd/fs_passwd_server delete mode 100755 fs_passwd/fs_passwdd delete mode 100755 fs_radlog/fs_radlogd delete mode 100755 htdocs/browse/agent.cgi delete mode 100755 htdocs/browse/agent_type.cgi delete mode 100755 htdocs/browse/cust_main_county.cgi delete mode 100755 htdocs/browse/part_pkg.cgi delete mode 100755 htdocs/browse/part_referral.cgi delete mode 100755 htdocs/browse/part_svc.cgi delete mode 100755 htdocs/browse/svc_acct_pop.cgi delete mode 100644 htdocs/docs/admin.html delete mode 100644 htdocs/docs/billing.html delete mode 100644 htdocs/docs/config.html delete mode 100644 htdocs/docs/export.html delete mode 100644 htdocs/docs/index.html delete mode 100644 htdocs/docs/install.html delete mode 100644 htdocs/docs/legacy.html delete mode 100644 htdocs/docs/passwd.html delete mode 100644 htdocs/docs/schema.html delete mode 100644 htdocs/docs/trouble.html delete mode 100644 htdocs/docs/upgrade.html delete mode 100644 htdocs/docs/upgrade2.html delete mode 100755 htdocs/edit/agent.cgi delete mode 100755 htdocs/edit/agent_type.cgi delete mode 100755 htdocs/edit/cust_credit.cgi delete mode 100755 htdocs/edit/cust_main.cgi delete mode 100755 htdocs/edit/cust_main_county-expand.cgi delete mode 100755 htdocs/edit/cust_main_county.cgi delete mode 100755 htdocs/edit/cust_pay.cgi delete mode 100755 htdocs/edit/cust_pkg.cgi delete mode 100755 htdocs/edit/part_pkg.cgi delete mode 100755 htdocs/edit/part_referral.cgi delete mode 100755 htdocs/edit/part_svc.cgi delete mode 100755 htdocs/edit/process/agent.cgi delete mode 100755 htdocs/edit/process/agent_type.cgi delete mode 100755 htdocs/edit/process/cust_credit.cgi delete mode 100755 htdocs/edit/process/cust_main.cgi delete mode 100755 htdocs/edit/process/cust_main_county-expand.cgi delete mode 100755 htdocs/edit/process/cust_main_county.cgi delete mode 100755 htdocs/edit/process/cust_pay.cgi delete mode 100755 htdocs/edit/process/cust_pkg.cgi delete mode 100755 htdocs/edit/process/part_pkg.cgi delete mode 100755 htdocs/edit/process/part_referral.cgi delete mode 100755 htdocs/edit/process/part_svc.cgi delete mode 100755 htdocs/edit/process/svc_acct.cgi delete mode 100755 htdocs/edit/process/svc_acct_pop.cgi delete mode 100755 htdocs/edit/process/svc_acct_sm.cgi delete mode 100755 htdocs/edit/process/svc_domain.cgi delete mode 100755 htdocs/edit/svc_acct.cgi delete mode 100755 htdocs/edit/svc_acct_pop.cgi delete mode 100755 htdocs/edit/svc_acct_sm.cgi delete mode 100755 htdocs/edit/svc_domain.cgi delete mode 100644 htdocs/images/mid-logo.gif delete mode 100644 htdocs/images/small-logo.gif delete mode 100755 htdocs/index.html delete mode 100755 htdocs/misc/bill.cgi delete mode 100755 htdocs/misc/cancel-unaudited.cgi delete mode 100755 htdocs/misc/cancel_pkg.cgi delete mode 100755 htdocs/misc/expire_pkg.cgi delete mode 100755 htdocs/misc/link.cgi delete mode 100755 htdocs/misc/print-invoice.cgi delete mode 100755 htdocs/misc/process/link.cgi delete mode 100755 htdocs/misc/susp_pkg.cgi delete mode 100755 htdocs/misc/unsusp_pkg.cgi delete mode 100755 htdocs/search/cust_bill.cgi delete mode 100755 htdocs/search/cust_bill.html delete mode 100755 htdocs/search/cust_main-payinfo.html delete mode 100755 htdocs/search/cust_main.cgi delete mode 100755 htdocs/search/cust_main.html delete mode 100755 htdocs/search/cust_pkg.cgi delete mode 100755 htdocs/search/svc_acct.cgi delete mode 100755 htdocs/search/svc_acct.html delete mode 100755 htdocs/search/svc_acct_sm.cgi delete mode 100755 htdocs/search/svc_acct_sm.html delete mode 100755 htdocs/search/svc_domain.cgi delete mode 100755 htdocs/search/svc_domain.html delete mode 100755 htdocs/view/cust_bill.cgi delete mode 100755 htdocs/view/cust_main.cgi delete mode 100755 htdocs/view/cust_pkg.cgi delete mode 100755 htdocs/view/svc_acct.cgi delete mode 100755 htdocs/view/svc_acct_sm.cgi delete mode 100755 htdocs/view/svc_domain.cgi diff --git a/Artistic b/Artistic deleted file mode 100644 index 4ffc78e97..000000000 --- a/Artistic +++ /dev/null @@ -1,125 +0,0 @@ - The "Artistic License" - - Preamble - -The intent of this document is to state the conditions under which a -Package may be copied, such that the Copyright Holder maintains some -semblance of artistic control over the development of the Package, -while giving the users of the package the right to use and distribute -the Package in a more-or-less customary fashion, plus the right to make -reasonable modifications. - -It also grants you the rights to reuse parts of a Package in your own -programs without transferring this License to those programs, provided -that you meet some reasonable requirements. - -Definitions: - - "Package" refers to the collection of files distributed by the - Copyright Holder, and derivatives of that collection of files - created through textual modification. - - "Standard Version" refers to such a Package if it has not been - modified, or has been modified in accordance with the wishes - of the Copyright Holder as specified below. - - "Copyright Holder" is whoever is named in the copyright or - copyrights for the package. - - "You" is you, if you're thinking about copying or distributing - this Package. - - "Reasonable copying fee" is whatever you can justify on the - basis of media cost, duplication charges, time of people involved, - and so on. (You will not be required to justify it to the - Copyright Holder, but only to the computing community at large - as a market that must bear the fee.) - - "Freely Available" means that no fee is charged for the item - itself, though there may be fees involved in handling the item. - It also means that recipients of the item may redistribute it - under the same conditions they received it. - -1. You may make and give away verbatim copies of the source form of the -Standard Version of this Package without restriction, provided that you -duplicate all of the original copyright notices and associated disclaimers. - -2. You may apply bug fixes, portability fixes and other modifications -derived from the Public Domain or from the Copyright Holder. A Package -modified in such a way shall still be considered the Standard Version. - -3. You may otherwise modify your copy of this Package in any way, provided -that you insert a prominent notice in each changed file stating how and -when you changed that file, and provided that you do at least ONE of the -following: - - a) place your modifications in the Public Domain or otherwise make them - Freely Available, such as by posting said modifications to Usenet or - an equivalent medium, or placing the modifications on a major archive - site such as uunet.uu.net, or by allowing the Copyright Holder to include - your modifications in the Standard Version of the Package. - - b) use the modified Package only within your corporation or organization. - - c) rename any non-standard executables so the names do not conflict - with standard executables, which must also be provided, and provide - a separate manual page for each non-standard executable that clearly - documents how it differs from the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -4. You may distribute the programs of this Package in object code or -executable form, provided that you do at least ONE of the following: - - a) distribute a Standard Version of the executables and library files, - together with instructions (in the manual page or equivalent) on where - to get the Standard Version. - - b) accompany the distribution with the machine-readable source of - the Package with your modifications. - - c) give non-standard executables non-standard names, and clearly - document the differences in manual pages (or equivalent), together - with instructions on where to get the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -5. You may charge a reasonable copying fee for any distribution of this -Package. You may charge any fee you choose for support of this -Package. You may not charge a fee for this Package itself. However, -you may distribute this Package in aggregate with other (possibly -commercial) programs as part of a larger (possibly commercial) software -distribution provided that you do not advertise this Package as a -product of your own. - -6. The scripts and library files supplied as input to or produced as -output from the programs of this Package do not automatically fall -under the copyright of this Package, but belong to whomever generated -them, and may be sold commercially, and may be aggregated with this -Package. If such scripts or library files are aggregated with this -Package via the so-called "undump" or "unexec" methods of producing a -binary executable image, then distribution of such an image shall -neither be construed as a distribution of this Package nor shall it -fall under the restrictions of Paragraphs 3 and 4, provided that you do -not represent such an executable image as a Standard Version of this -Package. - -7. You may reuse parts of this Package in your own programs, provided that -you explicitly state where you got them from, in the source code (and, left -to your courtesy, in the documentation), duplicating all the associated -copyright notices and disclaimers. Besides your changes, if any, must be -clearly marked as such. Parts reused that way will no longer fall under this -license if, and only if, the name of your program(s) have no immediate -connection with the name of the Package itself or its associated programs. -You may then apply whatever restrictions you wish on the reused parts or -choose to place them in the Public Domain--this will apply only within the -context of your package. - -8. The name of the Copyright Holder may not be used to endorse or promote -products derived from this software without specific prior written permission. - -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - The End diff --git a/CREDITS b/CREDITS deleted file mode 100644 index 87c79a779..000000000 --- a/CREDITS +++ /dev/null @@ -1,14 +0,0 @@ -Thanks to Matt Simerson of MichWeb Inc. for documentation -and pre-release testing. Without his help the documentation in the first -release would have consisted of a single screenfull of text. - -# Steve Cleff did the default background image and is also -# the creator of Freeside's mascot, Snakeman. - -Jerry St. Pierre did the "SISD" graphic. - -Brian McCane? contributed PostgreSQL support, HTML -style enhancements and many, many bugfixes. - -Everything else is my (Ivan Kohler ) fault. - diff --git a/GPL b/GPL deleted file mode 100644 index e77696ae8..000000000 --- a/GPL +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/INSTALL b/INSTALL deleted file mode 100644 index ff2e43f4e..000000000 --- a/INSTALL +++ /dev/null @@ -1 +0,0 @@ -See htdocs/docs/index.html diff --git a/README b/README deleted file mode 100644 index 14234df5a..000000000 --- a/README +++ /dev/null @@ -1,43 +0,0 @@ -Freeside, (pre) 1.1.4 - -Copyright (C) 1998 Silicon Interactive Software Design. All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of either: - - a) the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any - later version, or - - b) the "Artistic License" - - This program 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 either the - GNU General Public License or the Artistic License for more details. - - You should have received a copy of the GNU General Public - License along with this program, in the file `GPL'; if not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite - 330, Boston, MA 02111-1307, USA. - - You should have received a copy of the Artistic License along with - this program, in the file `Artistic'; if not, download it from - http://www.perl.com/CPAN/doc/misc/license/Artistic - -Freeside is a billing and administration package for Internet Service -Providers. - -The Freeside home page is at `http://www.sisd.com/freeside'. - -The documentation is in `htdocs/docs'. - -A mailing list for users and developers is available. Send a blank message to - to subscribe. - -Commercial support is available from Ivan Kohler . Please -subscribe to the the mailing list to request free support! - -Ivan Kohler -ivan@sisd.com - diff --git a/bin/dbdef-create b/bin/dbdef-create deleted file mode 100755 index eb62c77e3..000000000 --- a/bin/dbdef-create +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/perl -Tw -# -# create dbdef file for existing mySQL database (needs SHOW|DESCRIBE command -# not in Pg) based on fs-setup -# -# ivan@sisd.com 98-jun-2 - -use strict; -use DBI; -use FS::dbdef; -use FS::UID qw(adminsuidsetup datasrc); - -#needs to match FS::Record -my($dbdef_file) = "/var/spool/freeside/dbdef.". datasrc; - -my($dbh)=adminsuidsetup; - -my($tables_sth)=$dbh->prepare("SHOW TABLES"); -my($tables_rv)=$tables_sth->execute; - -my(@tables); -foreach ( @{$tables_sth->fetchall_arrayref} ) { - my($table)=${$_}[0]; - #print "TABLE\t$table\n"; - - my($index_sth)=$dbh->prepare("SHOW INDEX FROM $table"); - my($primary_key)=''; - my(%index,%unique); - for ( 1 .. $index_sth->execute ) { - my($row)=$index_sth->fetchrow_hashref; - if ( ${$row}{'Key_name'} eq "PRIMARY" ) { - $primary_key=${$row}{'Column_name'}; - next; - } - if ( ${$row}{'Non_unique'} ) { #index - push @{$index{${$row}{'Key_name'}}}, ${$row}{'Column_name'}; - } else { #unique - push @{$unique{${$row}{'Key_name'}}}, ${$row}{'Column_name'}; - } - } - - my(@index)=values %index; - my(@unique)=values %unique; - #print "\tPRIMARY KEY $primary_key\n"; - foreach (@index) { - #print "\tINDEX\t", join(', ', @{$_}), "\n"; - } - foreach (@unique) { - #print "\tUNIQUE\t", join(', ', @{$_}), "\n"; - } - - my($columns_sth)=$dbh->prepare("SHOW COLUMNS FROM $table"); - my(@columns); - for ( 1 .. $columns_sth->execute ) { - my($row)=$columns_sth->fetchrow_hashref; - #print "\t", ${$row}{'Field'}, "\n"; - ${$row}{'Type'} =~ /^(\w+)\(?([\d\,]+)?\)?( unsigned)?$/ - or die "Illegal type ${$row}{'Type'}\n"; - my($type,$length)=($1,$2); - my($null)=${$row}{'Null'}; - $null =~ s/YES/NULL/; - push @columns, new FS::dbdef_column ( - ${$row}{'Field'}, - $type, - $null, - $length, - ); - } - - #print "\n"; - push @tables, new FS::dbdef_table ( - $table, - $primary_key, - new FS::dbdef_unique (\@unique), - new FS::dbdef_index (\@index), - @columns, - ); - -} - -my($dbdef) = new FS::dbdef ( @tables ); - -#important -$dbdef->save($dbdef_file); - diff --git a/bin/fs-setup b/bin/fs-setup deleted file mode 100755 index 45332d85c..000000000 --- a/bin/fs-setup +++ /dev/null @@ -1,542 +0,0 @@ -#!/usr/bin/perl -Tw -# -# create database and necessary tables, etc. DBI version. -# -# ivan@sisd.com 97-nov-8,9 -# -# agent_type and type_pkgs added. -# (index need to be declared, & primary keys shoudln't have mysql syntax) -# ivan@sisd.com 97-nov-13 -# -# pulled modified version back out of register.cgi ivan@sisd.com 98-feb-21 -# -# removed extraneous sample data ivan@sisd.com 98-mar-23 -# -# gained the big hash from dbdef.pm, dbdef.pm usage rewrite ivan@sisd.com -# 98-apr-19 - 98-may-11 plus -# -# finished up ivan@sisd.com 98-jun-1 -# -# part_svc fields are all forced NULL, not the opposite -# hmm: also are forced varchar($char_d) as fixed '0' for things like -# uid is Not Good. will this break anything else? -# ivan@sisd.com 98-jun-29 -# -# ss is 11 chars ivan@sisd.com 98-jul-20 -# -# setup of arbitrary radius fields ivan@sisd.com 98-aug-9 -# -# ouch, removed index on company name that wasn't supposed to be there -# ivan@sisd.com 98-sep-4 -# -# fix radius attributes ivan@sisd.com 98-sep-27 - -#to delay loading dbdef until we're ready -BEGIN { $FS::Record::setup_hack = 1; } - -use strict; -use DBI; -use FS::dbdef; -use FS::UID qw(adminsuidsetup datasrc); -use FS::Record; -use FS::cust_main_county; - -#needs to match FS::Record -my($dbdef_file) = "/var/spool/freeside/dbdef.". datasrc; - -### - -print "\nEnter the maximum username length: "; -my($username_len)=&getvalue; - -print "\n\n", <); - chop $x; - $x; -} - -### - -my($char_d) = 80; #default maxlength for text fields - -#my(@date_type) = ( 'timestamp', '', '' ); -my(@date_type) = ( 'int', 'NULL', '' ); -my(@perl_type) = ( 'long varchar', 'NULL', '' ); -my(@money_type); -if (datasrc =~ m/Pg/) { #Pg can't do decimal(10,2) - @money_type = ( 'money', '', '' ); -} else { - @money_type = ( 'decimal', '', '10,2' ); -} - -### -# create a dbdef object from the old data structure -### - -my(%tables)=&tables_hash_hack; - -#turn it into objects -my($dbdef) = new FS::dbdef ( map { - my(@columns); - while (@{$tables{$_}{'columns'}}) { - my($name,$type,$null,$length)=splice @{$tables{$_}{'columns'}}, 0, 4; - push @columns, new FS::dbdef_column ( $name,$type,$null,$length ); - } - FS::dbdef_table->new( - $_, - $tables{$_}{'primary_key'}, - #FS::dbdef_unique->new(@{$tables{$_}{'unique'}}), - #FS::dbdef_index->new(@{$tables{$_}{'index'}}), - FS::dbdef_unique->new($tables{$_}{'unique'}), - FS::dbdef_index->new($tables{$_}{'index'}), - @columns, - ); -} (keys %tables) ); - -#add radius attributes to svc_acct - -my($svc_acct)=$dbdef->table('svc_acct'); - -my($attribute); -foreach $attribute (@attributes) { - $svc_acct->addcolumn ( new FS::dbdef_column ( - 'radius_'. $attribute, - 'varchar', - 'NULL', - $char_d, - )); -} - -#make part_svc table (but now as object) - -my($part_svc)=$dbdef->table('part_svc'); - -#because of svc_acct_pop -#foreach (grep /^svc_/, $dbdef->tables) { -#foreach (qw(svc_acct svc_acct_sm svc_charge svc_domain svc_wo)) { -foreach (qw(svc_acct svc_acct_sm svc_domain)) { - my($table)=$dbdef->table($_); - my($col); - foreach $col ( $table->columns ) { - next if $col =~ /^svcnum$/; - $part_svc->addcolumn( new FS::dbdef_column ( - $table->name. '__' . $table->column($col)->name, - 'varchar', #$table->column($col)->type, - 'NULL', - $char_d, #$table->column($col)->length, - )); - $part_svc->addcolumn ( new FS::dbdef_column ( - $table->name. '__'. $table->column($col)->name . "_flag", - 'char', - 'NULL', - 1, - )); - } -} - -#important -$dbdef->save($dbdef_file); -FS::Record::reload_dbdef; - -### -# create 'em -### - -my($dbh)=adminsuidsetup; - -#create tables -$|=1; - -my($table); -foreach ($dbdef->tables) { - my($table)=$dbdef->table($_); - print "Creating $_..."; - - my($statement); - - #create table - foreach $statement ($table->sql_create_table(datasrc)) { - #print $statement, "\n"; - $dbh->do( $statement ) - or die "CREATE error: ",$dbh->errstr, "\ndoing statement: $statement"; - } - - print "\n"; -} - -#not really sample data (and shouldn't default to US) - -#cust_main_county -foreach ( qw( -AL AK AS AZ AR CA CO CT DC DE FM FL GA GU HI ID IL IN IA KS KY LA -ME MH MD MA MI MN MS MO MT NC ND NE NH NJ NM NV NY MP OH OK OR PA PW PR RI -SC SD TN TX TT UT VT VI VA WA WV WI WY AE AA AP -) ) { - my($cust_main_county)=create FS::cust_main_county({ - 'state' => $_, - 'tax' => 0, - }); - my($error); - $error=$cust_main_county->insert; - die $error if $error; -} - -$dbh->disconnect or die $dbh->errstr; - -### -# Now it becomes an object. much better. -### -sub tables_hash_hack { - - #note that s/(date|change)/_$1/; to avoid keyword conflict. - #put a kludge in FS::Record to catch this or? (pry need some date-handling - #stuff anyway also) - - my(%tables)=( #yech.} - - 'agent' => { - 'columns' => [ - 'agentnum', 'int', '', '', - 'agent', 'varchar', '', $char_d, - 'typenum', 'int', '', '', - 'freq', 'smallint', 'NULL', '', - 'prog', @perl_type, - ], - 'primary_key' => 'agentnum', - 'unique' => [ [] ], - 'index' => [ ['typenum'] ], - }, - - 'agent_type' => { - 'columns' => [ - 'typenum', 'int', '', '', - 'atype', 'varchar', '', $char_d, - ], - 'primary_key' => 'typenum', - 'unique' => [ [] ], - 'index' => [ [] ], - }, - - 'type_pkgs' => { - 'columns' => [ - 'typenum', 'int', '', '', - 'pkgpart', 'int', '', '', - ], - 'primary_key' => '', - 'unique' => [ ['typenum', 'pkgpart'] ], - 'index' => [ ['typenum'] ], - }, - - 'cust_bill' => { - 'columns' => [ - 'invnum', 'int', '', '', - 'custnum', 'int', '', '', - '_date', @date_type, - 'charged', @money_type, - 'owed', @money_type, - 'printed', 'int', '', '', - ], - 'primary_key' => 'invnum', - 'unique' => [ [] ], - 'index' => [ ['custnum'] ], - }, - - 'cust_bill_pkg' => { - 'columns' => [ - 'pkgnum', 'int', '', '', - 'invnum', 'int', '', '', - 'setup', @money_type, - 'recur', @money_type, - 'sdate', @date_type, - 'edate', @date_type, - ], - 'primary_key' => '', - 'unique' => [ ['pkgnum', 'invnum'] ], - 'index' => [ ['invnum'] ], - }, - - 'cust_credit' => { - 'columns' => [ - 'crednum', 'int', '', '', - 'custnum', 'int', '', '', - '_date', @date_type, - 'amount', @money_type, - 'credited', @money_type, - 'otaker', 'varchar', '', 8, - 'reason', 'varchar', '', 255, - ], - 'primary_key' => 'crednum', - 'unique' => [ [] ], - 'index' => [ ['custnum'] ], - }, - - 'cust_main' => { - 'columns' => [ - 'custnum', 'int', '', '', - 'agentnum', 'int', '', '', - 'last', 'varchar', '', $char_d, - 'first', 'varchar', '', $char_d, - 'ss', 'char', 'NULL', 11, - 'company', 'varchar', 'NULL', $char_d, - 'address1', 'varchar', '', $char_d, - 'address2', 'varchar', 'NULL', $char_d, - 'city', 'varchar', '', $char_d, - 'county', 'varchar', 'NULL', $char_d, - 'state', 'char', '', 2, - 'zip', 'varchar', '', 10, - 'country', 'char', '', 2, - 'daytime', 'varchar', 'NULL', 20, - 'night', 'varchar', 'NULL', 20, - 'fax', 'varchar', 'NULL', 12, - 'payby', 'char', '', 4, - 'payinfo', 'varchar', 'NULL', 16, - 'paydate', @date_type, - 'payname', 'varchar', 'NULL', $char_d, - 'tax', 'char', 'NULL', 1, - 'otaker', 'varchar', '', 8, - 'refnum', 'int', '', '', - ], - 'primary_key' => 'custnum', - 'unique' => [ [] ], - #'index' => [ ['last'], ['company'] ], - 'index' => [ ['last'], ], - }, - - 'cust_main_county' => { #county+state are checked off the cust_main_county - #table for validation and to provide a tax rate. - #add country? - 'columns' => [ - 'taxnum', 'int', '', '', - 'state', 'char', '', 2, #two letters max in US... elsewhere? - 'county', 'varchar', '', $char_d, - 'tax', 'real', '', '', #tax % - ], - 'primary_key' => 'taxnum', - 'unique' => [ [] ], - # 'unique' => [ ['taxnum'], ['state', 'county'] ], - 'index' => [ [] ], - }, - - 'cust_pay' => { - 'columns' => [ - 'paynum', 'int', '', '', - 'invnum', 'int', '', '', - 'paid', @money_type, - '_date', @date_type, - 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into - # payment type table. - 'payinfo', 'varchar', 'NULL', 16, #see cust_main above - 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes. - ], - 'primary_key' => 'paynum', - 'unique' => [ [] ], - 'index' => [ ['invnum'] ], - }, - - 'cust_pay_batch' => { #what's this used for again? list of customers - #in current CARD batch? (necessarily CARD?) - 'columns' => [ - 'invnum', 'int', '', '', - 'custnum', 'int', '', '', - 'last', 'varchar', '', $char_d, - 'first', 'varchar', '', $char_d, - 'address1', 'varchar', '', $char_d, - 'address2', 'varchar', 'NULL', $char_d, - 'city', 'varchar', '', $char_d, - 'state', 'char', '', 2, - 'zip', 'varchar', '', 10, - 'country', 'char', '', 2, - 'trancode', 'TINYINT', '', '', - 'cardnum', 'varchar', '', 16, - 'exp', @date_type, - 'payname', 'varchar', 'NULL', $char_d, - 'amount', @money_type, - ], - 'primary_key' => '', - 'unique' => [ [] ], - 'index' => [ ['invnum'], ['custnum'] ], - }, - - 'cust_pkg' => { - 'columns' => [ - 'pkgnum', 'int', '', '', - 'custnum', 'int', '', '', - 'pkgpart', 'int', '', '', - 'otaker', 'varchar', '', 8, - 'setup', @date_type, - 'bill', @date_type, - 'susp', @date_type, - 'cancel', @date_type, - 'expire', @date_type, - ], - 'primary_key' => 'pkgnum', - 'unique' => [ [] ], - 'index' => [ ['custnum'] ], - }, - - 'cust_refund' => { - 'columns' => [ - 'refundnum', 'int', '', '', - 'crednum', 'int', '', '', - '_date', @date_type, - 'refund', @money_type, - 'otaker', 'varchar', '', 8, - 'reason', 'varchar', '', $char_d, - 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index - # into payment type table. - 'payinfo', 'varchar', 'NULL', 16, #see cust_main above - ], - 'primary_key' => 'refundnum', - 'unique' => [ [] ], - 'index' => [ ['crednum'] ], - }, - - 'cust_svc' => { - 'columns' => [ - 'svcnum', 'int', '', '', - 'pkgnum', 'int', '', '', - 'svcpart', 'int', '', '', - ], - 'primary_key' => 'svcnum', - 'unique' => [ [] ], - 'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ], - }, - - 'part_pkg' => { - 'columns' => [ - 'pkgpart', 'int', '', '', - 'pkg', 'varchar', '', $char_d, - 'comment', 'varchar', '', $char_d, - 'setup', @perl_type, - 'freq', 'smallint', '', '', #billing frequency (months) - 'recur', @perl_type, - ], - 'primary_key' => 'pkgpart', - 'unique' => [ [] ], - 'index' => [ [] ], - }, - - 'pkg_svc' => { - 'columns' => [ - 'pkgpart', 'int', '', '', - 'svcpart', 'int', '', '', - 'quantity', 'int', '', '', - ], - 'primary_key' => '', - 'unique' => [ ['pkgpart', 'svcpart'] ], - 'index' => [ ['pkgpart'] ], - }, - - 'part_referral' => { - 'columns' => [ - 'refnum', 'int', '', '', - 'referral', 'varchar', '', $char_d, - ], - 'primary_key' => 'refnum', - 'unique' => [ [] ], - 'index' => [ [] ], - }, - - 'part_svc' => { - 'columns' => [ - 'svcpart', 'int', '', '', - 'svc', 'varchar', '', $char_d, - 'svcdb', 'varchar', '', $char_d, - ], - 'primary_key' => 'svcpart', - 'unique' => [ [] ], - 'index' => [ [] ], - }, - - #(this should be renamed to part_pop) - 'svc_acct_pop' => { - 'columns' => [ - 'popnum', 'int', '', '', - 'city', 'varchar', '', $char_d, - 'state', 'char', '', 2, - 'ac', 'char', '', 3, - 'exch', 'char', '', 3, - #rest o' number? - ], - 'primary_key' => 'popnum', - 'unique' => [ [] ], - 'index' => [ [] ], - }, - - 'svc_acct' => { - 'columns' => [ - 'svcnum', 'int', '', '', - 'username', 'varchar', '', $username_len, #unique (& remove dup code) - '_password', 'varchar', '', 25, #13 for encryped pw's plus ' *SUSPENDED* - 'popnum', 'int', 'NULL', '', - 'uid', 'bigint', 'NULL', '', - 'gid', 'bigint', 'NULL', '', - 'finger', 'varchar', 'NULL', $char_d, - 'dir', 'varchar', 'NULL', $char_d, - 'shell', 'varchar', 'NULL', $char_d, - 'quota', 'varchar', 'NULL', $char_d, - 'slipip', 'varchar', 'NULL', 15, #four TINYINTs, bah. - ], - 'primary_key' => 'svcnum', - 'unique' => [ [] ], - 'index' => [ ['username'] ], - }, - - 'svc_acct_sm' => { - 'columns' => [ - 'svcnum', 'int', '', '', - 'domsvc', 'int', '', '', - 'domuid', 'bigint', '', '', - 'domuser', 'varchar', '', $char_d, - ], - 'primary_key' => 'svcnum', - 'unique' => [ [] ], - 'index' => [ ['domsvc'], ['domuid'] ], - }, - - #'svc_charge' => { - # 'columns' => [ - # 'svcnum', 'int', '', '', - # 'amount', @money_type, - # ], - # 'primary_key' => 'svcnum', - # 'unique' => [ [] ], - # 'index' => [ [] ], - #}, - - 'svc_domain' => { - 'columns' => [ - 'svcnum', 'int', '', '', - 'domain', 'varchar', '', $char_d, - ], - 'primary_key' => 'svcnum', - 'unique' => [ ['domain'] ], - 'index' => [ [] ], - }, - - #'svc_wo' => { - # 'columns' => [ - # 'svcnum', 'int', '', '', - # 'svcnum', 'int', '', '', - # 'svcnum', 'int', '', '', - # 'worker', 'varchar', '', $char_d, - # '_date', @date_type, - # ], - # 'primary_key' => 'svcnum', - # 'unique' => [ [] ], - # 'index' => [ [] ], - #}, - - ); - - %tables; - -} - diff --git a/bin/pod2x b/bin/pod2x deleted file mode 100755 index 1edb1c41e..000000000 --- a/bin/pod2x +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/perl - -#use Pod::Text; -#$Pod::Text::termcap=1; - -my $site_perl = "./site_perl"; -#my $catman = "./catman"; -my $catman = "./htdocs/docs/man"; -#my $html = "./htdocs/docs/man"; - -$|=1; - -die "Can't find $site_perl and $catman" - unless [ -d $site_perl ] && [ -d $catman ] && [ -d $html ]; - -foreach my $file (glob("$site_perl/*.pm")) { - $file =~ /\/([\w\-]+)\.pm$/ or die "oops file $file"; - my $name = $1; - print "$name\n"; - system "pod2text $file >$catman/$name.txt"; -# system "pod2html --podpath=$site_perl $file >$html/$name.html"; -# system "pod2html $file >$html/$name.html"; -} diff --git a/bin/svc_acct.export b/bin/svc_acct.export deleted file mode 100755 index 3f65a08ba..000000000 --- a/bin/svc_acct.export +++ /dev/null @@ -1,351 +0,0 @@ -#!/usr/bin/perl -Tw -# -# Create and export password files: passwd, passwd.adjunct, shadow, -# acp_passwd, acp_userinfo, acp_dialup, users -# -# ivan@voicenet.com late august/september 96 -# (the password encryption bits were from melody) -# -# use a temporary copy of svc_acct to minimize lock time on the real file, -# and skip blank entries. -# -# ivan@voicenet.com 96-Oct-6 -# -# change users / acp_dialup file formats -# ivan@voicenet.com 97-jan-28-31 -# -# change priority (after copies) to 19, not 10 -# ivan@voicenet.com 97-feb-5 -# -# added exit if stuff is already locked 97-apr-15 -# -# rewrite ivan@sisd.com 98-mar-9 -# -# Changed 'password' to '_password' because Pg6.3 reserves this word -# Added code to create a FreeBSD style master.passwd file -# bmccane@maxbaud.net 98-Apr-3 -# -# don't export non-root 0 UID's, even if they get put in the database -# ivan@sisd.com 98-jul-14 -# -# Uses Idle_Timeout, Port_Limit, Framed_Netmask and Framed_Route if they -# exist; need some way to support arbitrary radius fields. also -# /var/spool/freeside/conf/ ivan@sisd.com 98-jul-26, aug-9 -# -# OOPS! added arbitrary radius fields (pry 98-aug-16) but forgot to say so. -# ivan@sisd.com 98-sep-18 - -use strict; -use Fcntl qw(:flock); -use FS::SSH qw(scp ssh); -use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearch fields); - -my($fshellmachines)="/var/spool/freeside/conf/shellmachines"; -my(@shellmachines); -if ( -e $fshellmachines ) { - open(SHELLMACHINES,$fshellmachines); - @shellmachines=map { - /^(.*)$/ or die "Illegal line in conf/shellmachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close SHELLMACHINES; -} - -my($fbsdshellmachines)="/var/spool/freeside/conf/bsdshellmachines"; -my(@bsdshellmachines); -if ( -e $fbsdshellmachines ) { - open(BSDSHELLMACHINES,$fbsdshellmachines); - @bsdshellmachines=map { - /^(.*)$/ or die "Illegal line in conf/bsdshellmachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close BSDSHELLMACHINES; -} - -my($fnismachines)="/var/spool/freeside/conf/nismachines"; -my(@nismachines); -if ( -e $fnismachines ) { - open(NISMACHINES,$fnismachines); - @nismachines=map { - /^(.*)$/ or die "Illegal line in conf/nismachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close NISMACHINES; -} - -my($ferpcdmachines)="/var/spool/freeside/conf/erpcdmachines"; -my(@erpcdmachines); -if ( -e $ferpcdmachines ) { - open(ERPCDMACHINES,$ferpcdmachines); - @erpcdmachines=map { - /^(.*)$/ or die "Illegal line in conf/erpcdmachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close ERPCDMACHINES; -} - -my($fradiusmachines)="/var/spool/freeside/conf/radiusmachines"; -my(@radiusmachines); -if ( -e $fradiusmachines ) { - open(RADIUSMACHINES,$fradiusmachines); - @radiusmachines=map { - /^(.*)$/ or die "Illegal line in conf/radiusmachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close RADIUSMACHINES; -} - -my($spooldir)="/var/spool/freeside/export"; -my($spoollock)="/var/spool/freeside/svc_acct.export.lock"; - -adminsuidsetup; - -my(@saltset)= ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' ); -srand(time|$$); - -open(EXPORT,"+>>$spoollock") or die "Can't open $spoollock: $!"; -select(EXPORT); $|=1; select(STDOUT); -unless ( flock(EXPORT,LOCK_EX|LOCK_NB) ) { - seek(EXPORT,0,0); - my($pid)=; - chop($pid); - #no reason to start loct of blocking processes - die "Is another export process running under pid $pid?\n"; -} -seek(EXPORT,0,0); -print EXPORT $$,"\n"; - -my(@svc_acct)=qsearch('svc_acct',{}); - -( open(MASTER,">$spooldir/master.passwd") - and flock(MASTER,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/master.passwd: $!"; -( open(PASSWD,">$spooldir/passwd") - and flock(PASSWD,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/passwd: $!"; -( open(SHADOW,">$spooldir/shadow") - and flock(SHADOW,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/shadow: $!"; -( open(ACP_PASSWD,">$spooldir/acp_passwd") - and flock (ACP_PASSWD,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/acp_passwd: $!"; -( open (ACP_DIALUP,">$spooldir/acp_dialup") - and flock(ACP_DIALUP,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/acp_dialup: $!"; -( open (USERS,">$spooldir/users") - and flock(USERS,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/users: $!"; - -chmod 0644, "$spooldir/passwd", - "$spooldir/acp_dialup", -; -chmod 0600, "$spooldir/master.passwd", - "$spooldir/acp_passwd", - "$spooldir/shadow", - "$spooldir/users", -; - -setpriority(0,0,10); - -my($svc_acct); -foreach $svc_acct (@svc_acct) { - - my($password)=$svc_acct->getfield('_password'); - my($cpassword,$rpassword); - if ( ( length($password) <= 8 ) - && ( $password ne '*' ) - && ( $password ne '' ) - ) { - $cpassword=crypt($password, - $saltset[int(rand(64))].$saltset[int(rand(64))] - ); - $rpassword=$password; - } else { - $cpassword=$password; - $rpassword='UNIX'; - } - - if ( $svc_acct->uid =~ /^(\d+)$/ ) { - - die "Non-root user ". $svc_acct->username. " has 0 UID!" - if $svc_acct->uid == 0 && $svc_acct->username ne 'root'; - - ### - # FORMAT OF FreeBSD MASTER PASSWD FILE HERE - print MASTER join(":", - $svc_acct->username, # User name - $cpassword, # Encrypted password - $svc_acct->uid, # User ID - $svc_acct->gid, # Group ID - "", # Login Class - "0", # Password Change Time - "0", # Password Expiration Time - $svc_acct->finger, # Users name - $svc_acct->dir, # Users home directory - $svc_acct->shell, # shell - ), "\n" ; - - ### - # FORMAT OF THE PASSWD FILE HERE - print PASSWD join(":", - $svc_acct->username, - 'x', # "##". $svc_acct->$username, - $svc_acct->uid, - $svc_acct->gid, - $svc_acct->finger, - $svc_acct->dir, - $svc_acct->shell, - ), "\n"; - - ### - # FORMAT OF THE SHADOW FILE HERE - print SHADOW join(":", - $svc_acct->username, - $cpassword, - '', - '', - '', - '', - '', - '', - '', - ), "\n"; - - } - - if ( $svc_acct->slipip ne '' ) { - - ### - # FORMAT OF THE ACP_* FILES HERE - print ACP_PASSWD join(":", - $svc_acct->username, - $cpassword, - "0", - "0", - "", - "", - "", - ), "\n"; - - my($ip)=$svc_acct->slipip; - - unless ( $ip eq '0.0.0.0' || $svc_acct->slipip eq '0e0' ) { - print ACP_DIALUP $svc_acct->username, "\t*\t", $svc_acct->slipip, "\n"; - } - - ### - # FORMAT OF THE USERS FILE HERE - print USERS - $svc_acct->username, qq(\tPassword = "$rpassword"\n\t), - - join ",\n\t", - map { - /^(radius_(.*))$/; - my($field,$attrib)=($1,$2); - $attrib =~ s/_/\-/g; - "$attrib = \"". $svc_acct->getfield($field). "\""; - } grep /^radius_/ && $svc_acct->getfield($_), fields('svc_acct') - ; - if ( $ip && $ip ne '0e0' ) { - print USERS qq(,\n\tFramed-Address = "$ip"\n\n); - } else { - print USERS qq(\n\n); - } - - } - -} - -flock(MASTER,LOCK_UN); -flock(PASSWD,LOCK_UN); -flock(SHADOW,LOCK_UN); -flock(ACP_DIALUP,LOCK_UN); -flock(ACP_PASSWD,LOCK_UN); -flock(USERS,LOCK_UN); - -close MASTER; -close PASSWD; -close SHADOW; -close ACP_DIALUP; -close ACP_PASSWD; -close USERS; - -### -# export stuff -# - -my($shellmachine); -foreach $shellmachine (@shellmachines) { - scp("$spooldir/passwd","root\@$shellmachine:/etc/passwd.new") - == 0 or die "scp error: $!"; - scp("$spooldir/shadow","root\@$shellmachine:/etc/shadow.new") - == 0 or die "scp error: $!"; - ssh("root\@$shellmachine", - "( ". - "mv /etc/passwd.new /etc/passwd; ". - "mv /etc/shadow.new /etc/shadow; ". - " )" - ) - == 0 or die "ssh error: $!"; -} - -my($bsdshellmachine); -foreach $bsdshellmachine (@bsdshellmachines) { - scp("$spooldir/passwd","root\@$bsdshellmachine:/etc/passwd.new") - == 0 or die "scp error: $!"; - scp("$spooldir/master.passwd","root\@$bsdshellmachine:/etc/master.passwd.new") - == 0 or die "scp error: $!"; - ssh("root\@$bsdshellmachine", - "( ". - "mv /etc/passwd.new /etc/passwd; ". - "mv /etc/master.passwd.new /etc/master.passwd; ". - " )" - ) - == 0 or die "ssh error: $!"; -} - -my($nismachine); -foreach $nismachine (@nismachines) { - scp("$spooldir/passwd","root\@$nismachine:/etc/global/passwd") - == 0 or die "scp error: $!"; - scp("$spooldir/shadow","root\@$nismachine:/etc/global/shadow") - == 0 or die "scp error: $!"; - ssh("root\@$nismachine", - "( ". - "cd /var/yp; make; ". - " )" - ) - == 0 or die "ssh error: $!"; -} - -my($erpcdmachine); -foreach $erpcdmachine (@erpcdmachines) { - scp("$spooldir/acp_passwd","root\@$erpcdmachine:/usr/annex/acp_passwd") - == 0 or die "scp error: $!"; - scp("$spooldir/acp_dialup","root\@$erpcdmachine:/usr/annex/acp_dialup") - == 0 or die "scp error: $!"; - ssh("root\@$erpcdmachine", - "( ". - "kill -USR1 \`cat /usr/annex/erpcd.pid\'". - " )" - ) - == 0 or die "ssh error: $!"; -} - -my($radiusmachine); -foreach $radiusmachine (@radiusmachines) { - scp("$spooldir/users","root\@$radiusmachine:/etc/raddb/users") - == 0 or die "scp error: $!"; - ssh("root\@$erpcdmachine", - "( ". - "builddbm". - " )" - ) - == 0 or die "ssh error: $!"; -} - -unlink $spoollock; -flock(EXPORT,LOCK_UN); -close EXPORT; - diff --git a/bin/svc_acct.import b/bin/svc_acct.import deleted file mode 100755 index c4b8c5ec5..000000000 --- a/bin/svc_acct.import +++ /dev/null @@ -1,227 +0,0 @@ -#!/usr/bin/perl -Tw -# -# ivan@sisd.com 98-mar-9 -# -# changed 'password' field to '_password' because PgSQL 6.3 reserves this word -# bmccane@maxbaud.net 98-Apr-3 -# -# generalized svcparts (still needs radius import) ivan@sisd.com 98-mar-23 -# -# radius import, now an interactive script. still needs erpcd import? -# ivan@sisd.com 98-jun-24 -# -# arbitrary radius attributes ivan@sisd.com 98-aug-9 -# -# don't import /var/spool/freeside/conf/shells! ivan@sisd.com 98-aug-13 - -use strict; -use vars qw(%part_svc); -use Date::Parse; -use FS::SSH qw(iscp); -use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearch); -use FS::svc_acct; - -adminsuidsetup; - -#my($spooldir)="/var/spool/freeside/export"; -my($spooldir)="unix/"; - -$FS::svc_acct::nossh_hack = 1; - -### - -%part_svc=map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_acct'}); - -print "\n\n", &menu_svc, "\n", <= 2) -END -my($oisdn_svcpart)=&getpart; - -print "\n\n", &menu_svc, "\n", <svc, sort keys %part_svc ). "\n"; -} -sub getpart { - print "Enter part number, or 0 for none: "; - &getvalue; -} -sub getvalue { - my($x)=scalar(); - chop $x; - $x; -} - -print "\n\n"; - -### - -open(PASSWD,"<$spooldir/passwd.import"); -open(SHADOW,"<$spooldir/shadow.import"); -open(USERS,"<$spooldir/users.import"); - -my(%upassword,%ip,%allparam); -my(%param,$username); -while () { - chop; - next if /^$/; - if ( /^\S/ ) { - /^(\w+)\s+Password\s+=\s+"([^"]+)"(,\s+Expiration\s+=\s+"([^"]*")\s*)?$/ - or die "1Unexpected line in users.import: $_"; - my($password,$expiration); - ($username,$password,$expiration)=(lc($1),$2,$4); - $upassword{$username}=$password; - undef %param; - } else { - die "2Unexpected line in users.import: $_"; - } - while () { - chop; - if ( /^\s*$/ ) { - $ip{$username}=$param{'radius_Framed_IP_Address'}||'0e0'; - delete $param{'radius_Framed_IP_Address'}; - $allparam{$username}={ %param }; - last; - } elsif ( /^\s+([\w\-]+)\s=\s"?([\w\.\-\s]+)"?,?\s*$/ ) { - my($attribute,$value)=($1,$2); - $attribute =~ s/\-/_/g; - $param{'radius_'.$attribute}=$value; - } else { - die "3Unexpected line in users.import: $_"; - } - } -} -#? incase there isn't a terminating blank line ? -$ip{$username}=$param{'radius_Framed_IP_Address'}||'0e0'; -delete $param{'radius_Framed_IP_Address'}; -$allparam{$username}={ %param }; - -my(%password); -while () { - chop; - my($username,$password)=split(/:/); - $password{$username}=$password; -} - -while () { - chop; - my($username,$x,$uid,$gid,$finger,$dir,$shell)=split(/:/); - my($password)=$upassword{$username} || $password{$username}; - - my($maxb)=${$allparam{$username}}{'radius_Port_Limit'}; - my($svcpart); - if ( exists $upassword{$username} ) { - if ( $maxb >= 2 ) { - $svcpart = $isdn_svcpart - } elsif ( ! $maxb || $maxb == 1 ) { - $svcpart = $ppp_svcpart - } else { - die "Illegal Port-Limit in users ($username)!\n"; - } - } elsif ( $shell eq $pop_shell ) { - $svcpart = $popmail_svcpart; - } else { - $svcpart = $shell_svcpart; - } - - my($svc_acct) = create FS::svc_acct ({ - 'svcpart' => $svcpart, - 'username' => $username, - 'password' => $password, - 'uid' => $uid, - 'gid' => $gid, - 'finger' => $finger, - 'dir' => $dir, - 'shell' => $shell, - 'slipip' => $ip{$username}, - %{$allparam{$username}}, - }); - my($error); - $error=$svc_acct->insert; - die $error if $error; - - delete $allparam{$username}; - delete $upassword{$username}; -} - -#my($username); -foreach $username ( keys %upassword ) { - my($password)=$upassword{$username}; - - my($maxb)=${$allparam{$username}}{'radius_Port_Limit'} || 0; - my($svcpart); - if ( $maxb == 2 ) { - $svcpart = $oisdn_svcpart - } elsif ( ! $maxb || $maxb == 1 ) { - $svcpart = $oppp_svcpart - } else { - die "Illegal Port-Limit in users!\n"; - } - - my($svc_acct) = create FS::svc_acct ({ - 'svcpart' => $svcpart, - 'username' => $username, - 'password' => $password, - 'slipip' => $ip{$username}, - %{$allparam{$username}}, - }); - my($error); - $error=$svc_acct->insert; - die $error, if $error; - - delete $allparam{$username}; - delete $upassword{$username}; -} - diff --git a/bin/svc_acct_sm.export b/bin/svc_acct_sm.export deleted file mode 100755 index c2ec1e53f..000000000 --- a/bin/svc_acct_sm.export +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/perl -Tw -# -# Create and export VoiceNet_quasar.m4 -# -# ivan@voicenet.com late oct 96 -# -# change priority (after copies) to 19, not 10 -# ivan@voicenet.com 97-feb-5 -# -# put file in different place and run different script, as per matt and -# mohamed -# ivan@voicenet.com 97-mar-10 -# -# added exit if stuff is already locked ivan@voicenet.com 97-apr-15 -# -# removed mail2 -# ivan@voicenet.com 97-jul-10 -# -# rewrote lots of the bits, now exports qmail "virtualdomain", -# "recipientmap" and "rcpthosts" files as well -# -# ivan@voicenet.com 97-sep-4 -# -# adds ".extra" files -# -# ivan@voicenet.com 97-sep-29 -# -# added ".pp" files, ugh. -# -# ivan@voicenet.com 97-oct-1 -# -# rewrite ivan@sisd.com 98-mar-9 -# -# now can create .qmail-default files ivan@sisd.com 98-mar-10 -# -# put example $my_domain declaration in ivan@sisd.com 98-mar-23 -# -# /var/spool/freeside/conf and sendmail updates ivan@sisd.com 98-aug-14 - -use strict; -use Fcntl qw(:flock); -use FS::SSH qw(ssh scp); -use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearch qsearchs); - -my($conf_shellm)="/var/spool/freeside/conf/shellmachine"; -my($fqmailmachines)="/var/spool/freeside/conf/qmailmachines"; -my($shellmachine); -my(@qmailmachines); -if ( -e $fqmailmachines ) { - open(SHELLMACHINE,$conf_shellm) or die "Can't open $conf_shellm: $!"; - =~ /^([\w\.\-]+)$/ or die "Illegal $conf_shellm"; - $shellmachine = $1; - close SHELLMACHINE; - open(QMAILMACHINES,$fqmailmachines); - @qmailmachines=map { - /^(.*)$/ or die "Illegal line in conf/qmailmachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close QMAILMACHINES; -} - -my($fsendmailmachines)="/var/spool/freeside/conf/sendmailmachines"; -my(@sendmailmachines); -if ( -e $fsendmailmachines ) { - open(SENDMAILMACHINES,$fsendmailmachines); - @sendmailmachines=map { - /^(.*)$/ or die "Illegal line in conf/sendmailmachines"; #we trust the file - $1; - } grep $_ !~ /^(#|$)/, ; - close SENDMAILMACHINES; -} - -my($conf_domain)="/var/spool/freeside/conf/domain"; -open(DOMAIN,$conf_domain) or die "Can't open $conf_domain: $!"; -my($mydomain)=map { - /^(.*)$/ or die "Illegal line in $conf_domain!"; #yes, we trust the file - $1 -} grep $_ !~ /^(#|$)/, ; -close DOMAIN; - -my($spooldir)="/var/spool/freeside/export"; -my($spoollock)="/var/spool/freeside/svc_acct_sm.export.lock"; - -adminsuidsetup; -umask 066; - -open(EXPORT,"+>>$spoollock") or die "Can't open $spoollock: $!"; -select(EXPORT); $|=1; select(STDOUT); -unless ( flock(EXPORT,LOCK_EX|LOCK_NB) ) { - seek(EXPORT,0,0); - my($pid)=; - chop($pid); - #no reason to start locks of blocking processes - die "Is another export process running under pid $pid?\n"; -} -seek(EXPORT,0,0); -print EXPORT $$,"\n"; - -my(@svc_acct_sm)=qsearch('svc_acct_sm',{}); - -( open(RCPTHOSTS,">$spooldir/rcpthosts") - and flock(RCPTHOSTS,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/rcpthosts: $!"; -( open(RECIPIENTMAP,">$spooldir/recipientmap") - and flock(RECIPIENTMAP,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/recipientmap: $!"; -( open(VIRTUALDOMAINS,">$spooldir/virtualdomains") - and flock(VIRTUALDOMAINS,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/virtualdomains: $!"; -( open(VIRTUSERTABLE,">$spooldir/virtusertable") - and flock(VIRTUSERTABLE,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/virtusertable: $!"; -( open(SENDMAIL_CW,">$spooldir/sendmail.cw") - and flock(SENDMAIL_CW,LOCK_EX|LOCK_NB) -) or die "Can't open $spooldir/sendmail.cw: $!"; - -setpriority(0,0,10); - -my($svc_domain,%domain); -foreach $svc_domain ( qsearch('svc_domain',{}) ) { - my($domain)=$svc_domain->domain; - $domain{$svc_domain->svcnum}=$domain; - print RCPTHOSTS "$domain\n.$domain\n"; - print SENDMAIL_CW "$domain\n"; -} - -my(@sendmail); - -my($svc_acct_sm); -foreach $svc_acct_sm ( qsearch('svc_acct_sm') ) { - my($domsvc,$domuid,$domuser)=( - $svc_acct_sm->domsvc, - $svc_acct_sm->domuid, - $svc_acct_sm->domuser, - ); - my($domain)=$domain{$domsvc}; - my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid}); - my($username,$dir,$uid,$gid)=( - $svc_acct->username, - $svc_acct->dir, - $svc_acct->uid, - $svc_acct->gid, - ); - next unless $username && $domain && $domuser; - - if ($domuser eq '*') { - push @sendmail, "\@$domain\t$username\n"; - print VIRTUALDOMAINS "$domain:$username-$domain\n", - ".$domain:$username-$domain\n", - ; - ### - # qmail - ssh("root\@$shellmachine", - "[ -e $dir/.qmail-default ] || { touch $dir/.qmail-default; chown $uid:$gid $dir/.qmail-default; }" - ) if ( $shellmachine && $dir && $uid ); - - } else { - print VIRTUSERTABLE "$domuser\@$domain\t$username\n"; - print RECIPIENTMAP "$domuser\@$domain:$username\@$mydomain\n"; - } - - print VIRTUSERTABLE @sendmail; - -} - -chmod 0644, "$spooldir/sendmail.cw", - "$spooldir/virtusertable", - "$spooldir/rcpthosts", - "$spooldir/recipientmap", - "$spooldir/virtualdomains", -; - -flock(SENDMAIL_CW,LOCK_UN); -flock(VIRTUSERTABLE,LOCK_UN); -flock(RCPTHOSTS,LOCK_UN); -flock(RECIPIENTMAP,LOCK_UN); -flock(VIRTUALDOMAINS,LOCK_UN); - -close SENDMAIL_CW; -close VIRTUSERTABLE; -close RCPTHOSTS; -close RECIPIENTMAP; -close VIRTUALDOMAINS; - -### -# export stuff -# - -my($sendmailmachine); -foreach $sendmailmachine (@sendmailmachines) { - scp("$spooldir/sendmail.cw","root\@$sendmailmachine:/etc/sendmail.cw.new") - == 0 or die "scp error: $!"; - scp("$spooldir/virtusertable","root\@$sendmailmachine:/etc/virtusertable.new") - == 0 or die "scp error: $!"; - ssh("root\@$sendmailmachine", - "( ". - "mv /etc/sendmail.cw.new /etc/sendmail.cw; ". - "mv /etc/virtusertable.new /etc/virtusertable; ". - #"/etc/init.d/sendmail restart; ". - " )" - ) - == 0 or die "ssh error: $!"; -} - -my($qmailmachine); -foreach $qmailmachine (@qmailmachines) { - scp("$spooldir/recipientmap","root\@$qmailmachine:/var/qmail/control/recipientmap") - == 0 or die "scp error: $!"; - scp("$spooldir/virtualdomains","root\@$qmailmachine:/var/qmail/control/virtualdomains") - == 0 or die "scp error: $!"; - scp("$spooldir/rcpthosts","root\@$qmailmachine:/var/qmail/control/rcpthosts") - == 0 or die "scp error: $!"; - #ssh("root\@$qmailmachine","/etc/init.d/qmail restart") - # == 0 or die "ssh error: $!"; -} - -unlink $spoollock; -flock(EXPORT,LOCK_UN); -close EXPORT; - diff --git a/bin/svc_acct_sm.import b/bin/svc_acct_sm.import deleted file mode 100755 index 10d7e4c20..000000000 --- a/bin/svc_acct_sm.import +++ /dev/null @@ -1,252 +0,0 @@ -#!/usr/bin/perl -Tw -# -# ivan@sisd.com 98-mar-9 -# -# generalized svcparts ivan@sisd.com 98-mar-23 - -# You really need to enable ssh into a shell machine as this needs to rename -# .qmail-extension files. -# -# now an interactive script ivan@sisd.com 98-jun-30 -# -# has an (untested) section for sendmail, s/warn/die/g and generates a program -# to run on your mail machine _later_ instead of ssh'ing for each user -# ivan@sisd.com 98-jul-13 - -use strict; -use vars qw(%d_part_svc %m_part_svc); -use FS::SSH qw(iscp); -use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::svc_acct_sm; -use FS::svc_domain; - -adminsuidsetup; - -#my($spooldir)="/var/spool/freeside/export"; -my($spooldir)="unix"; - -my(%mta) = ( - 1 => "qmail", - 2 => "sendmail", -); - -### - -%d_part_svc = - map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_domain'}); -%m_part_svc = - map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_acct_sm'}); - -print "\n\n", - ( join "\n", map "$_: ".$d_part_svc{$_}->svc, sort keys %d_part_svc ), - "\n\nEnter part number for domains: "; -my($domain_svcpart)=&getvalue; - -print "\n\n", - ( join "\n", map "$_: ".$m_part_svc{$_}->svc, sort keys %m_part_svc ), - "\n\nEnter part number for mail aliases: "; -my($mailalias_svcpart)=&getvalue; - -print "\n\n", <); - chop $x; - $x; -} - -print "\n\n"; - -### - -$FS::svc_domain::whois_hack=1; -$FS::svc_acct_sm::nossh_hack=1; - -if ( $mta{$mta} eq "qmail" ) { - open(RCPTHOSTS,"<$spooldir/rcpthosts.import") - or die "Can't open $spooldir/rcpthosts.import: $!"; -} elsif ( $mta{$mta} eq "sendmail" ) { - open(RCPTHOSTS,"<$spooldir/sendmail.cw.import") - or die "Can't open $spooldir/sendmail.cw.import: $!"; -} else { - die "Unknown MTA!\n"; -} - -my(%svcnum); - -while () { - next if /^(#|$)/; - /^\.?([\w\-\.]+)$/ - #or do { warn "Strange rcpthosts/sendmail.cw line: $_"; next; }; - or die "Strange rcpthosts/sendmail.cw line: $_"; - my $domain = $1; - my($svc_domain); - unless ( $svc_domain = qsearchs('svc_domain', {'domain'=>$domain} ) ) { - $svc_domain = create FS::svc_domain ({ - 'domain' => $domain, - 'svcpart' => $domain_svcpart, - 'action' => 'N', - }); - my $error = $svc_domain->insert; - #warn $error if $error; - die $error if $error; - } - $svcnum{$domain}=$svc_domain->svcnum; -} -close RCPTHOSTS; - -#these two loops have enough similar parts they should probably be merged -if ( $mta{$mta} eq "qmail" ) { - - open(VD_FIX,">$spooldir/virtualdomains.FIX"); - print VD_FIX "#!/usr/bin/perl\n"; - - open(VIRTUALDOMAINS,"<$spooldir/virtualdomains.import") - or die "Can't open $spooldir/virtualdomains.import: $!"; - while () { - next if /^#/; - /^\.?([\w\-\.]+):(\w+)(\-([\w\-\.]+))?$/ - #or do { warn "Strange virtualdomains line: $_"; next; }; - or die "Strange virtualdomains line: $_"; - my($domain,$username,$dash_ext,$extension)=($1,$2,$3,$4); - $dash_ext ||= ''; - $extension ||= ''; - my($svc_acct)=qsearchs('svc_acct',{'username'=>$username}); - unless ( $svc_acct ) { - #warn "Unknown user $username in virtualdomains; skipping\n"; - #die "Unknown user $username in virtualdomains; skipping\n"; - next; - } - if ( $domain ne $extension ) { - #warn "virtualdomains line $domain:$username$dash_ext changed to $domain:$username-$domain\n"; - my($dir)=$svc_acct->dir; - my($qdomain)=$domain; - $qdomain =~ s/\./:/g; #see manpage for 'dot-qmail': EXTENSION ADDRESSES - #example to move .qmail files for virtual domains to their new location - #dry run - #issh("root\@$shellmachine",'perl -e \'foreach $a (<'. $dir. '/.qmail'. $dash_ext. '-*>) { $old=$a; $a =~ s/\\.qmail'. $dash_ext. '\\-/\\.qmail\\-'. $qdomain. '\\-/; print " $old -> $a\n"; }\''); - #the real thing - #issh("root\@$shellmachine",'perl -e \'foreach $a (<'. $dir. '/.qmail'. $dash_ext. '-*>) { $old=$a; $a =~ s/\\.qmail'. $dash_ext. '\\-/\\.qmail\\-'. $qdomain. '\\-/; rename $old, $a; }\''); - print VD_FIX <) { - \$old = \$file; - \$file =~ s/\.qmail$dash_ext\-/\.qmail\-$qdomain\-/; - rename \$old, \$file; -} -END - } - - unless ( exists $svcnum{$domain} ) { - my($svc_domain) = create FS::svc_domain ({ - 'domain' => $domain, - 'svcpart' => $domain_svcpart, - 'action' => 'N', - }); - my $error = $svc_domain->insert; - #warn $error if $error; - die $error if $error; - $svcnum{$domain}=$svc_domain->svcnum; - } - - my($svc_acct_sm)=create FS::svc_acct_sm ({ - 'domsvc' => $svcnum{$domain}, - 'domuid' => $svc_acct->uid, - 'domuser' => '*', - 'svcpart' => $mailalias_svcpart, - }); - my($error)=''; - $error=$svc_acct_sm->insert; - #warn $error if $error; - die $error, ", domain $domain" if $error; - } - close VIRTUALDOMAINS; - close VD_FIX; - -} elsif ( $mta{$mta} eq "sendmail" ) { - - open(VIRTUSERTABLE,"<$spooldir/virtusertable.import") - or die "Can't open $spooldir/virtusertable.import: $!"; - while () { - next if /^#/; #comments? - /^([\w\-\.]+)?\@([\w\-\.]+)\t([\w\-\.]+)$/ - #or do { warn "Strange virtusertable line: $_"; next; }; - or die "Strange virtusertable line: $_"; - my($domuser,$domain,$username)=($1,$2,$3); - my($svc_acct)=qsearchs('svc_acct',{'username'=>$username}); - unless ( $svc_acct ) { - #warn "Unknown user $username in virtusertable"; - die "Unknown user $username in virtusertable"; - next; - } - my($svc_acct_sm)=create FS::svc_acct_sm ({ - 'domsvc' => $svcnum{$domain}, - 'domuid' => $svc_acct->uid, - 'domuser' => $domuser || '*', - 'svcpart' => $mailalias_svcpart, - }); - my($error)=''; - $error=$svc_acct_sm->insert; - #warn $error if $error; - die $error if $error; - } - close VIRTUSERTABLE; - -} else { - die "Unknown MTA!\n"; -} - -#open(RECIPIENTMAP,"<$spooldir/recipientmap.import"); -#close RECIPIENTMAP; - -print "\n\n", < 10, - 'Business' => 11, - 'Individual' => 12, - 'Basic PPP' => 13, - 'Slave' => 14, - 'Co-Located Server' => 15, - 'Virtual Web' => 16, - 'Perk Mail' => 17, - 'Credit Hold' => 18, -); - -my($file)="legacy_file"; - -open(CLIENT,$file) - or die "Can't open $file: $!"; - -# put a tab-separated header atop the file, or define @fields -# (use these names or change them below) -# -# for cust_main -# custnum - unique -# last - (name) -# first - (name) -# company -# address1 -# address2 -# city -# state -# zip -# country -# daytime - (phone) -# night - (phone) -# fax -# payby - CARD, BILL or COMP -# payinfo - Credit card #, P.O. # or COMP authorization -# paydate - Expiration -# tax - 'Y' for tax exempt -# for cust_pkg -# LegacyBillingData - maps via %pkgpart above to a pkgpart -# for svc_acct -# username - -my($header); -$header=; -chop $header; -my(@fields)=map { /^\s*(.*[^\s]+)\s*$/; $1 } split(/\t/,$header); -#print join("\n",@fields); - -my($error); -my($link,$line)=(0,0); -while () { - chop; - next if /^[\s\t]*$/; #skip any blank lines - - #define %svc hash for this record - my(@record)=split(/\t/); - my(%svc); - foreach (@fields) { - $svc{$_}=shift @record; - } - - # might need to massage some data like this - $svc{'payby'} =~ s/^Credit Card$/CARD/io; - $svc{'payby'} =~ s/^Check$/BILL/io; - $svc{'payby'} =~ s/^Cash$/BILL/io; - $svc{'payby'} =~ s/^$/BILL/o; - $svc{'First'} =~ s/&/and/go; - $svc{'Zip'} =~ s/\s+$//go; - - my($cust_main) = create FS::cust_main ( { - 'custnum' => $svc{'custnum'}, - 'agentnum' => $agentnum, - 'last' => $svc{'last'}, - 'first' => $svc{'first'}, - 'company' => $svc{'company'}, - 'address1' => $svc{'address1'}, - 'address2' => $svc{'address2'}, - 'city' => $svc{'city'}, - 'state' => $svc{'state'}, - 'zip' => $svc{'zip'}, - 'country' => $svc{'country'}, - 'daytime' => $svc{'daytime'}, - 'night' => $svc{'night'}, - 'fax' => $svc{'fax'}, - 'payby' => $svc{'payby'}, - 'payinfo' => $svc{'payinfo'}, - 'paydate' => $svc{'paydate'}, - 'payname' => $svc{'payname'}, - 'tax' => $svc{'tax'}, - 'refnum' => $refnum, - } ); - - $error=$cust_main->insert; - - if ( $error ) { - warn $cust_main->_dump; - warn map "$_: ". $svc{$_}. "|\n", keys %svc; - die $error; - } - - my($cust_pkg)=create FS::cust_pkg ( { - 'custnum' => $svc{'custnum'}, - 'pkgpart' => $pkgpart{$svc{'LegacyBillingData'}}, - 'setup' => '', - 'bill' => '', - 'susp' => '', - 'expire' => '', - 'cancel' => '', - } ); - - $error=$cust_pkg->insert; - if ( $error ) { - warn $svc{'LegacyBillingData'}; - die $error; - } - - unless ( $svc{'username'} ) { - warn "Empty login"; - } else { - #find svc_acct record (imported with bin/svc_acct.import) for this username - my($svc_acct)=qsearchs('svc_acct',{'username'=>$svc{'username'}}); - unless ( $svc_acct ) { - warn "username ", $svc{'username'}, " not found\n"; - } else { - #link to the cust_pkg record we created above - - #find cust_svc record for this svc_acct record - my($o_cust_svc)=qsearchs('cust_svc',{ - 'svcnum' => $svc_acct->svcnum, - 'pkgnum' => '', - } ); - unless ( $o_cust_svc ) { - warn "No unlinked cust_svc for svcnum ", $svc_acct->svcnum; - } else { - - #make sure this svcpart is in pkgpart - my($pkg_svc)=qsearchs('pkg_svc',{ - 'pkgpart' => $pkgpart{$svc{'LegacyBillingData'}}, - 'svcpart' => $o_cust_svc->svcpart, - 'quantity' => 1, - }); - unless ( $pkg_svc ) { - warn "login ", $svc{'username'}, ": No svcpart ", $o_cust_svc->svcpart, - " for pkgpart ", $pkgpart{$svc{'Acct. Type'}}, "\n" ; - } else { - - #create new cust_svc record linked to cust_pkg record - my($n_cust_svc) = create FS::cust_svc ({ - 'svcnum' => $o_cust_svc->svcnum, - 'pkgnum' => $cust_pkg->pkgnum, - 'svcpart' => $pkg_svc->svcpart, - }); - my($error) = $n_cust_svc->replace($o_cust_svc); - die $error if $error; - $link++; - } - } - } - } - - $line++; - -} - -warn "\n$link of $line lines linked\n"; - diff --git a/etc/acp_logfile-parse b/etc/acp_logfile-parse deleted file mode 100755 index 5e258991b..000000000 --- a/etc/acp_logfile-parse +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/perl - -### -# WHO WROTE THIS??? -### - -#require "perldb.pl"; - -# Compute SLIP/PPP log times -# Arguments -a Process entire file with totals -# -t Process only totals -# -f File to be processed if not current -# -d processing start date (default is entire file) -# -l to return all totals for dayuse -# -w name of tmp work file for dayuse -# user names - -require "time.pl"; - -$space=' '; - -unless (@ARGV[0]) { - print "Missing Arguments\n"; - print "-a - entire file\n"; - print "-t - totals only\n"; - print "-f - file name to be processed\n"; - print "-d - processing start date (yymmdd)\n"; - print "-l - return totals for dayuse\n"; - print "-w - tmp work file for dayuse\n"; - exit; -} # end if test for missing arguments - -$infile = "/usr/annex/acp_logfile"; -$tmpfile = "/tmp/ppp"; -$n = $#ARGV; -$start_yymmdd = ""; -for ($i = 0; $i <= $n; $i++) { - if ($ARGV[$i] eq "-a") { - $allflag = "true"; - } - elsif ($ARGV[$i] eq "-t") { - $totalflag = "true"; - } - elsif ($ARGV[$i] eq "-f") { - $i++; - $infile = $ARGV[$i]; - } - elsif ($ARGV[$i] eq "-d") { - $i++; - $start_yymmdd = $ARGV[$i]; - } #end start yymmdd - elsif ($ARGV[$i] eq "-l") { - $logflag = "true"; - $totalflag = "true"; - } # end log - elsif ($ARGV[$i] eq "-w") { - $i++; - $tmpfile = $ARGV[$i]; - } # end tmp file - else { - ($arg_user,$arg_yymmdd) = split (/:/, $ARGV[$i]); - $ip_user_date {$arg_user} = $ARGV[$i]; - $userflag = "true"; - } # end else - } # end for 1 = 1 to n - -open (IN,$infile) - || die "Can't open acp_logfile"; - -NEXTUSER: while () { - chop; - ($add,$ether,$port,$date,$time,$type,$action,$user) = split(/:/); - - if ($logflag) { - $start_yymmdd = ''; - if ($ip_user_date{$user}) { - ($ip_user, $start_yymmdd) = - split (/:/, $ip_user_date{$user}); - } # end get date - } # end log flag - if ($start_yymmdd) { - if ($date < $start_yymmdd) { - next NEXTUSER; - } #end date compare - } #end if date - if ($userflag){ - if (!$ip_user_date{$user}) { - next NEXTUSER; - } # end user test - } # end by user or all - if (($totalflag) || - ($allflag) || - ($ip_user_date{$user})) { - if (($type eq 'ppp') || ($type eq 'slip')) { - - if ($action eq 'login') { - $login{$user} = "$time:$date"; - - } - elsif ($action eq 'logout') { - if (!$login{$user}) { - $login{$user} = "010101:$date"; - } #end pad user if carry over - ($stime,$sdate) = split(':',$login{$user}); - $start = &annex2sec($stime); - $end = &annex2sec($time); - - #If we went through midnight, add a day; - if ($end < $start) {$end += 86400;} - $timeon = $end - $start; - - $elapsed{$user} += $timeon; - - if (!$totalflag) { - print (&fmt_user($user), - ' ', &fmt_date($sdate), ' In: ', - &fmt_time($stime),' Out: ', - &fmt_time($time), - ' Elapsed: ', &fmt_sec($timeon), "\n"); - } # end total test - } #end elsif action - } # type = ppp of slip - } # check arguments -} -close IN; - -if ($logflag) { - open (TMPPPP, ">$tmpfile") - || die "Can't open ppp tmp file"; - foreach $user ( sort((keys(%elapsed))) ) { - $log_time = &fmt_sec($elapsed{$user}); - $tmp = join (':', - $user, - $log_time); - print (TMPPPP "$tmp\n"); - } - close (TMPPPP); -} - else { - print "\n\nTotal Time On For Period:\n"; - print "-------------------------\n"; - - foreach $user ( sort((keys(%elapsed))) ) { - print (&fmt_user($user), " ",&fmt_sec($elapsed{$user}), "\n"); - } - } -exit(0); - -#------------------------------------------------------- -#--------------- Subroutines Start Here ---------------- -#------------------------------------------------------- - -sub annex2sec { - local($time) = @_; - return( &time2sec( &break_annex($time) ) ); -} - -sub fmt_date { - local($date) = @_; - - return( substr($date,2,2).'/'.substr($date,4,2).'/'.substr($date,0,2) ); -} - -sub fmt_time { - local($time) = @_; - local($s,$m,$h) = &break_annex($time); - return ("$h:$m:$s"); -} - - -sub break_annex { - local($time) = @_; - local($h,$m,$s); - - $h=substr($time,0,2); - $m=substr($time,2,2); - $s=substr($time,4,2); - - return ($s,$m,$h); -} - -sub fmt_sec { - local(@t) = &sec2time(@_); - @t[2] += (@t[3]*24); - - foreach $a (@t) { - if ($a < 10) {$a = "0$a";} - } - - return ("@t[2]:@t[1]:@t[0]"); -} - -sub fmt_user { - local($user) = @_; - return( $user.substr($space,0,8 - length($user) ).' ' ); -} - diff --git a/etc/countries.txt b/etc/countries.txt deleted file mode 100644 index 73c3975ed..000000000 --- a/etc/countries.txt +++ /dev/null @@ -1,239 +0,0 @@ -AFGHANISTAN AF AFG 004 -ALBANIA AL ALB 008 -ALGERIA DZ DZA 012 -AMERICAN SAMOA AS ASM 016 -ANDORRA AD AND 020 -ANGOLA AO AGO 024 -ANGUILLA AI AIA 660 -ANTARCTICA AQ ATA 010 -ANTIGUA AND BARBUDA AG ATG 028 -ARGENTINA AR ARG 032 -ARMENIA AM ARM 051 -ARUBA AW ABW 533 -AUSTRALIA AU AUS 036 -AUSTRIA AT AUT 040 -AZERBAIJAN AZ AZE 031 -BAHAMAS BS BHS 044 -BAHRAIN BH BHR 048 -BANGLADESH BD BGD 050 -BARBADOS BB BRB 052 -BELARUS BY BLR 112 -BELGIUM BE BEL 056 -BELIZE BZ BLZ 084 -BENIN BJ BEN 204 -BERMUDA BM BMU 060 -BHUTAN BT BTN 064 -BOLIVIA BO BOL 068 -BOSNIA AND HERZEGOWINA BA BIH 070 -BOTSWANA BW BWA 072 -BOUVET ISLAND BV BVT 074 -BRAZIL BR BRA 076 -BRITISH INDIAN OCEAN TERRITORY IO IOT 086 -BRUNEI DARUSSALAM BN BRN 096 -BULGARIA BG BGR 100 -BURKINA FASO BF BFA 854 -BURUNDI BI BDI 108 -CAMBODIA KH KHM 116 -CAMEROON CM CMR 120 -CANADA CA CAN 124 -CAPE VERDE CV CPV 132 -CAYMAN ISLANDS KY CYM 136 -CENTRAL AFRICAN REPUBLIC CF CAF 140 -CHAD TD TCD 148 -CHILE CL CHL 152 -CHINA CN CHN 156 -CHRISTMAS ISLAND CX CXR 162 -COCOS (KEELING) ISLANDS CC CCK 166 -COLOMBIA CO COL 170 -COMOROS KM COM 174 -CONGO CG COG 178 -COOK ISLANDS CK COK 184 -COSTA RICA CR CRI 188 -COTE D'IVOIRE CI CIV 384 -CROATIA (local name: Hrvatska) HR HRV 191 -CUBA CU CUB 192 -CYPRUS CY CYP 196 -CZECH REPUBLIC CZ CZE 203 -DENMARK DK DNK 208 -DJIBOUTI DJ DJI 262 -DOMINICA DM DMA 212 -DOMINICAN REPUBLIC DO DOM 214 -EAST TIMOR TP TMP 626 -ECUADOR EC ECU 218 -EGYPT EG EGY 818 -EL SALVADOR SV SLV 222 -EQUATORIAL GUINEA GQ GNQ 226 -ERITREA ER ERI 232 -ESTONIA EE EST 233 -ETHIOPIA ET ETH 231 -FALKLAND ISLANDS (MALVINAS) FK FLK 238 -FAROE ISLANDS FO FRO 234 -FIJI FJ FJI 242 -FINLAND FI FIN 246 -FRANCE FR FRA 250 -FRANCE, METROPOLITAN FX FXX 249 -FRENCH GUIANA GF GUF 254 -FRENCH POLYNESIA PF PYF 258 -FRENCH SOUTHERN TERRITORIES TF ATF 260 -GABON GA GAB 266 -GAMBIA GM GMB 270 -GEORGIA GE GEO 268 -GERMANY DE DEU 276 -GHANA GH GHA 288 -GIBRALTAR GI GIB 292 -GREECE GR GRC 300 -GREENLAND GL GRL 304 -GRENADA GD GRD 308 -GUADELOUPE GP GLP 312 -GUAM GU GUM 316 -GUATEMALA GT GTM 320 -GUINEA GN GIN 324 -GUINEA-BISSAU GW GNB 624 -GUYANA GY GUY 328 -HAITI HT HTI 332 -HEARD AND MC DONALD ISLANDS HM HMD 334 -HONDURAS HN HND 340 -HONG KONG HK HKG 344 -HUNGARY HU HUN 348 -ICELAND IS ISL 352 -INDIA IN IND 356 -INDONESIA ID IDN 360 -IRAN (ISLAMIC REPUBLIC OF) IR IRN 364 -IRAQ IQ IRQ 368 -IRELAND IE IRL 372 -ISRAEL IL ISR 376 -ITALY IT ITA 380 -JAMAICA JM JAM 388 -JAPAN JP JPN 392 -JORDAN JO JOR 400 -KAZAKHSTAN KZ KAZ 398 -KENYA KE KEN 404 -KIRIBATI KI KIR 296 -KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF KP PRK 408 -KOREA, REPUBLIC OF KR KOR 410 -KUWAIT KW KWT 414 -KYRGYZSTAN KG KGZ 417 -LAO PEOPLE'S DEMOCRATIC REPUBLIC LA LAO 418 -LATVIA LV LVA 428 -LEBANON LB LBN 422 -LESOTHO LS LSO 426 -LIBERIA LR LBR 430 -LIBYAN ARAB JAMAHIRIYA LY LBY 434 -LIECHTENSTEIN LI LIE 438 -LITHUANIA LT LTU 440 -LUXEMBOURG LU LUX 442 -MACAU MO MAC 446 -MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF MK MKD 807 -MADAGASCAR MG MDG 450 -MALAWI MW MWI 454 -MALAYSIA MY MYS 458 -MALDIVES MV MDV 462 -MALI ML MLI 466 -MALTA MT MLT 470 -MARSHALL ISLANDS MH MHL 584 -MARTINIQUE MQ MTQ 474 -MAURITANIA MR MRT 478 -MAURITIUS MU MUS 480 -MAYOTTE YT MYT 175 -MEXICO MX MEX 484 -MICRONESIA, FEDERATED STATES OF FM FSM 583 -MOLDOVA, REPUBLIC OF MD MDA 498 -MONACO MC MCO 492 -MONGOLIA MN MNG 496 -MONTSERRAT MS MSR 500 -MOROCCO MA MAR 504 -MOZAMBIQUE MZ MOZ 508 -MYANMAR MM MMR 104 -NAMIBIA NA NAM 516 -NAURU NR NRU 520 -NEPAL NP NPL 524 -NETHERLANDS NL NLD 528 -NETHERLANDS ANTILLES AN ANT 530 -NEW CALEDONIA NC NCL 540 -NEW ZEALAND NZ NZL 554 -NICARAGUA NI NIC 558 -NIGER NE NER 562 -NIGERIA NG NGA 566 -NIUE NU NIU 570 -NORFOLK ISLAND NF NFK 574 -NORTHERN MARIANA ISLANDS MP MNP 580 -NORWAY NO NOR 578 -OMAN OM OMN 512 -PAKISTAN PK PAK 586 -PALAU PW PLW 585 -PANAMA PA PAN 591 -PAPUA NEW GUINEA PG PNG 598 -PARAGUAY PY PRY 600 -PERU PE PER 604 -PHILIPPINES PH PHL 608 -PITCAIRN PN PCN 612 -POLAND PL POL 616 -PORTUGAL PT PRT 620 -PUERTO RICO PR PRI 630 -QATAR QA QAT 634 -REUNION RE REU 638 -ROMANIA RO ROM 642 -RUSSIAN FEDERATION RU RUS 643 -RWANDA RW RWA 646 -SAINT KITTS AND NEVIS KN KNA 659 -SAINT LUCIA LC LCA 662 -SAINT VINCENT AND THE GRENADINES VC VCT 670 -SAMOA WS WSM 882 -SAN MARINO SM SMR 674 -SAO TOME AND PRINCIPE ST STP 678 -SAUDI ARABIA SA SAU 682 -SENEGAL SN SEN 686 -SEYCHELLES SC SYC 690 -SIERRA LEONE SL SLE 694 -SINGAPORE SG SGP 702 -SLOVAKIA (Slovak Republic) SK SVK 703 -SLOVENIA SI SVN 705 -SOLOMON ISLANDS SB SLB 090 -SOMALIA SO SOM 706 -SOUTH AFRICA ZA ZAF 710 -SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS GS SGS 239 -SPAIN ES ESP 724 -SRI LANKA LK LKA 144 -ST. HELENA SH SHN 654 -ST. PIERRE AND MIQUELON PM SPM 666 -SUDAN SD SDN 736 -SURINAME SR SUR 740 -SVALBARD AND JAN MAYEN ISLANDS SJ SJM 744 -SWAZILAND SZ SWZ 748 -SWEDEN SE SWE 752 -SWITZERLAND CH CHE 756 -SYRIAN ARAB REPUBLIC SY SYR 760 -TAIWAN, PROVINCE OF CHINA TW TWN 158 -TAJIKISTAN TJ TJK 762 -TANZANIA, UNITED REPUBLIC OF TZ TZA 834 -THAILAND TH THA 764 -TOGO TG TGO 768 -TOKELAU TK TKL 772 -TONGA TO TON 776 -TRINIDAD AND TOBAGO TT TTO 780 -TUNISIA TN TUN 788 -TURKEY TR TUR 792 -TURKMENISTAN TM TKM 795 -TURKS AND CAICOS ISLANDS TC TCA 796 -TUVALU TV TUV 798 -UGANDA UG UGA 800 -UKRAINE UA UKR 804 -UNITED ARAB EMIRATES AE ARE 784 -UNITED KINGDOM GB GBR 826 -UNITED STATES US USA 840 -UNITED STATES MINOR OUTLYING ISLANDS UM UMI 581 -URUGUAY UY URY 858 -UZBEKISTAN UZ UZB 860 -VANUATU VU VUT 548 -VATICAN CITY STATE (HOLY SEE) VA VAT 336 -VENEZUELA VE VEN 862 -VIET NAM VN VNM 704 -VIRGIN ISLANDS (BRITISH) VG VGB 092 -VIRGIN ISLANDS (U.S.) VI VIR 850 -WALLIS AND FUTUNA ISLANDS WF WLF 876 -WESTERN SAHARA EH ESH 732 -YEMEN YE YEM 887 -YUGOSLAVIA YU YUG 891 -ZAIRE ZR ZAR 180 -ZAMBIA ZM ZMB 894 -ZIMBABWE ZW ZWE 716 diff --git a/etc/domain-template.txt b/etc/domain-template.txt deleted file mode 100644 index 8e4983ce2..000000000 --- a/etc/domain-template.txt +++ /dev/null @@ -1,231 +0,0 @@ -[ URL ftp://rs.internic.net/templates/domain-template.txt ] [ 03/98 ] - -******* Please DO NOT REMOVE Version Number or Sections A-Q ******** - -Domain Version Number: 4.0 - -******* Email completed agreement to hostmaster@internic.net ******* - - NETWORK SOLUTIONS, INC. - - DOMAIN NAME REGISTRATION AGREEMENT - - -A. Introduction. This domain name registration agreement -("Registration Agreement") is submitted to NETWORK SOLUTIONS, INC. -("NSI") for the purpose of applying for and registering a domain name -on the Internet. If this Registration Agreement is accepted by NSI, -and a domain name is registered in NSI's domain name database and -assigned to the Registrant, Registrant ("Registrant") agrees to be -bound by the terms of this Registration Agreement and the terms of -NSI's Domain Name Dispute Policy ("Dispute Policy") which is -incorporated herein by reference and made a part of this Registration -Agreement. This Registration Agreement shall be accepted at the -offices of NSI. - -B. Fees and Payments. - -1) Registration or renewal (re-registration) date through March 31, 1998: -Registrant agrees to pay a registration fee of One Hundred United States -Dollars (US$100) as consideration for the registration of each new domain -name or Fifty United States Dollars (US$50) to renew (re-register) an -existing registration. -2) Registration or renewal date on and after April 1, 1998: Registrant -agrees to pay a registration fee of Seventy United States Dollars (US$70) -as consideration for the registration of each new domain name or the -applicable renewal (re-registration) fee (currently Thirty-Five United -States Dollars (US$35)) at the time of renewal (re-registration). -3) Period of Service: The non-refundable fee covers a period of two (2) -years for each new registration, and one (1) year for each renewal, -and includes any permitted modification(s) to the domain name record -during the covered period. -4) Payment: Payment is due to Network Solutions within thirty (30) -days from the date of the invoice. - -C. Dispute Policy. Registrant agrees, as a condition to -submitting this Registration Agreement, and if the Registration -Agreement is accepted by NSI, that the Registrant shall be bound by -NSI's current Dispute Policy. The current version of the Dispute -Policy may be found at the InterNIC Registration Services web site: -"http://www.netsol.com/rs/dispute-policy.html". - -D. Dispute Policy Changes or Modifications. Registrant agrees -that NSI, in its sole discretion, may change or modify the Dispute -Policy, incorporated by reference herein, at any time. Registrant -agrees that Registrant's maintaining the registration of a domain name -after changes or modifications to the Dispute Policy become effective -constitutes Registrant's continued acceptance of these changes or -modifications. Registrant agrees that if Registrant considers any such -changes or modifications to be unacceptable, Registrant may request -that the domain name be deleted from the domain name database. - -E. Disputes. Registrant agrees that, if the registration of its -domain name is challenged by any third party, the Registrant will be -subject to the provisions specified in the Dispute Policy. - -F. Agents. Registrant agrees that if this Registration Agreement -is completed by an agent for the Registrant, such as an ISP or -Administrative Contact/Agent, the Registrant is nonetheless bound as a -principal by all terms and conditions herein, including the Dispute -Policy. - -G. Limitation of Liability. Registrant agrees that NSI shall have -no liability to the Registrant for any loss Registrant may incur in -connection with NSI's processing of this Registration Agreement, in -connection with NSI's processing of any authorized modification to the -domain name's record during the covered period, as a result of the -Registrant's ISP's failure to pay either the initial registration fee -or renewal fee, or as a result of the application of the provisions of -the Dispute Policy. Registrant agrees that in no event shall the -maximum liability of NSI under this Agreement for any matter exceed -Five Hundred United States Dollars (US$500). - -H. Indemnity. Registrant agrees, in the event the Registration -Agreement is accepted by NSI and a subsequent dispute arises with any -third party, to indemnify and hold NSI harmless pursuant to the terms -and conditions contained in the Dispute Policy. - -I. Breach. Registrant agrees that failure to abide by any -provision of this Registration Agreement or the Dispute Policy may be -considered by NSI to be a material breach and that NSI may provide a -written notice, describing the breach, to the Registrant. If, within -thirty (30) days of the date of mailing such notice, the Registrant -fails to provide evidence, which is reasonably satisfactory to NSI, -that it has not breached its obligations, then NSI may delete -Registrant's registration of the domain name. Any such breach by a -Registrant shall not be deemed to be excused simply because NSI did -not act earlier in response to that, or any other, breach by the -Registrant. - -J. No Guaranty. Registrant agrees that, by registration of a -domain name, such registration does not confer immunity from objection -to either the registration or use of the domain name. - -K. Warranty. Registrant warrants by submitting this Registration -Agreement that, to the best of Registrant's knowledge and belief, the -information submitted herein is true and correct, and that any future -changes to this information will be provided to NSI in a timely manner -according to the domain name modification procedures in place at that -time. Breach of this warranty will constitute a material breach. - -L. Revocation. Registrant agrees that NSI may delete a -Registrant's domain name if this Registration Agreement, or subsequent -modification(s) thereto, contains false or misleading information, or -conceals or omits any information NSI would likely consider material -to its decision to approve this Registration Agreement. - -M. Right of Refusal. NSI, in its sole discretion, reserves the -right to refuse to approve the Registration Agreement for any -Registrant. Registrant agrees that the submission of this Registration -Agreement does not obligate NSI to accept this Registration Agreement. -Registrant agrees that NSI shall not be liable for loss or damages -that may result from NSI's refusal to accept this Registration -Agreement. - -N. Severability. Registrant agrees that the terms of this -Registration Agreement are severable. If any term or provision is -declared invalid, it shall not affect the remaining terms or -provisions which shall continue to be binding. - -O. Entirety. Registrant agrees that this Registration Agreement -and the Dispute Policy is the complete and exclusive agreement between -Registrant and NSI regarding the registration of Registrant's domain -name. This Registration Agreement and the Dispute Policy supersede all -prior agreements and understandings, whether established by custom, -practice, policy, or precedent. - -P. Governing Law. Registrant agrees that this Registration -Agreement shall be governed in all respects by and construed in -accordance with the laws of the Commonwealth of Virginia, United -States of America. By submitting this Registration Agreement, -Registrant consents to the exclusive jurisdiction and venue of the -United States District Court for the Eastern District of Virginia, -Alexandria Division. If there is no jurisdiction in the United States -District Court for the Eastern District of Virginia, Alexandria -Division, then jurisdiction shall be in the Circuit Court of Fairfax -County, Fairfax, Virginia. - -Q. This is Domain Name Registration Agreement Version -Number 4.0. This Registration Agreement is only for registrations -under top-level domains: COM, ORG, NET, and EDU. By completing -and submitting this Registration Agreement for consideration and -acceptance by NSI, the Registrant agrees that he/she has read and -agrees to be bound by A through P above. - - -Authorization -0a. (N)ew (M)odify (D)elete....:###action### -0b. Auth Scheme................: -0c. Auth Info..................: - -1. Comments...................:###purpose### - -2. Complete Domain Name.......:###domain### - -Organization Using Domain Name - -3a. Organization Name..........:###company### -###LOOP### -3b. Street Address.............:###address### -###ENDLOOP### -3c. City.......................:###city### -3d. State......................:###state### -3e. Postal Code................:###zip### -3f. Country....................:###country### - -Administrative Contact -4a. NIC Handle (if known)......: -4b. (I)ndividual (R)ole........:I -4c. Name (Last, First).........:###last###, ###first### -4d. Organization Name..........:###company### -###LOOP### -4e. Street Address.............:###address### -###ENDLOOP### -4f. City.......................:###city### -4g. State......................:###state### -4h. Postal Code................:###zip### -4i. Country....................:###country### -4j. Phone Number...............:###daytime### -4k. Fax Number.................:###fax### -4l. E-Mailbox..................:###email### - -Technical Contact -5a. NIC Handle (if known)......:###tech_contact### -5b. (I)ndividual (R)ole........: -5c. Name (Last, First).........: -5d. Organization Name..........: -5e. Street Address.............: -5f. City.......................: -5g. State......................: -5h. Postal Code................: -5i. Country....................: -5j. Phone Number...............: -5k. Fax Number.................: -5l. E-Mailbox..................: - -Billing Contact -6a. NIC Handle (if known)......: -6b. (I)ndividual (R)ole........: -6c. Name (Last, First).........: -6d. Organization Name..........: -6e. Street Address.............: -6f. City.......................: -6g. State......................: -6h. Postal Code................: -6i. Country....................: -6j. Phone Number...............: -6k. Fax Number.................: -6l. E-Mailbox..................: - -Prime Name Server -7a. Primary Server Hostname....:###primary### -7b. Primary Server Netaddress..:###primary_ip### - -Secondary Name Server(s) -###LOOP### -8a. Secondary Server Hostname..:###secondary### -8b. Secondary Server Netaddress:###secondary_ip### -###ENDLOOP### - -END OF AGREEMENT - diff --git a/etc/example-direct-cardin b/etc/example-direct-cardin deleted file mode 100755 index 1a4097221..000000000 --- a/etc/example-direct-cardin +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/local/bin/perl - -### -# THIS IS FROM CYBERCASH (is there a newer version?) -### - -$paymentserverhost = 'localhost'; -$paymentserverport = 8000; -$paymentserversecret = 'two-turntables'; -use CCLib qw(sendmserver); - -# first lets fake up some data -# use time of day and pid to give me my pretend -# order number -# you obviously need to get real data from somewhere... - -$oid = "test$$"; #fake order number. -$amount = 'usd 42.42'; -$ramount = 'usd 24.24'; -$pan = '4111111111111111'; -$name = 'John Q. Doe'; -$addr = '17 Richard Rd.'; -$city = 'Ivyland'; -$state = 'PA'; -$zip = '18974'; -$country = 'USA'; -$exp = '7/97'; - - -%result = &sendmserver('mauthcapture', - 'Order-ID', $oid, - 'Amount', $amount, - 'Card-Number', $pan, - 'Card-Name', $name, - 'Card-Address', $addr, - 'Card-City', $city, - 'Card-State', $state, - 'Card-Zip', $zip, - 'Card-Country', $country, - 'Card-Exp', $exp); - -# -# just dump results to stdout. -# you should process them... -# to allow results to affect operation of your fulfillment... -# -foreach (keys(%result)) { - print " $_ ==> $result{$_}\n"; -} - -print "\n"; - -exit; - -$trans=$result{'MTransactionNumber'}; -$code=$result{'MRetrievalCode'}; - -%result = &sendmserver('return', - 'Order-ID', $oid, - 'Return-Amount',$ramount, - 'Amount',$amount, - ); - -foreach (keys(%result)) { - print " $_ ==> $result{$_}\n"; -} - diff --git a/fs_passwd/fs_passwd b/fs_passwd/fs_passwd deleted file mode 100755 index bcf09f1fe..000000000 --- a/fs_passwd/fs_passwd +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/perl -Tw -# -# fs_passwd -# -# portions of this script are copied from the `passwd' script in the original -# (perl 4) camel book, now archived at -# http://www.perl.com/CPAN/scripts/nutshell/ch6/passwd -# -# ivan@sisd.com 98-mar-8 -# -# password lengths 0,255 instead of 6,8 - we'll let the server process -# check the data ivan@sisd.com 98-jul-17 - -use strict; -use Getopt::Std; -use Socket; -use IO::Handle; -use vars qw($opt_f $opt_s); - -my($fs_passwdd_socket)="/usr/local/freeside/fs_passwdd_socket"; -my($freeside_uid)=scalar(getpwnam('freeside')); - -$ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; -$ENV{'SHELL'} = '/bin/sh'; -$ENV{'IFS'} = " \t\n"; -$ENV{'CDPATH'} = ''; -$ENV{'ENV'} = ''; -$ENV{'BASH_ENV'} = ''; - -$SIG{__DIE__}= sub { system '/bin/stty', 'echo'; }; - -die "passwd program isn't running setuid to freeside\n" if $> != $freeside_uid; - -unshift @ARGV, "-f" if $0 =~ /chfn$/; -unshift @ARGV, "-s" if $0 =~ /chsh$/; - -getopts('fs'); - -my($me)=''; -if ( $_ = shift(@ARGV) ) { - /^(\w{2,8})$/; - $me = $1; -} -die "You can't change the password for $me." if $me && $<; -$me = (getpwuid($<))[0] unless $me; - -my($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell)= - getpwnam $me; - -my($old_password,$new_password,$new_gecos,$new_shell); - -if ( $opt_f || $opt_s ) { - system '/bin/stty', '-echo'; - print "Password:"; - $old_password=; - system '/bin/stty', 'echo'; - chop($old_password); - #$old_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; - $old_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; - $old_password = $1; - - $new_password = ''; - - if ( $opt_f ) { - print "\nChanging gecos for $me.\n"; - print "Gecos [", $gcos, "]: "; - $new_gecos=; - chop($new_gecos); - $new_gecos ||= $gcos; - $new_gecos =~ /^(.{0,255})$/ or die "\nIllegal gecos.\n"; - } else { - $new_gecos = ''; - } - - if ( $opt_s ) { - print "\nChanging shell for $me.\n"; - print "Shell [", $shell, "]: "; - $new_shell=; - chop($new_shell); - $new_shell ||= $shell; - $new_shell =~ /^(.{0,255})$/ or die "\nIllegal shell.\n"; - } else { - $new_shell = ''; - } - -} else { - - print "Changing password for $me.\n"; - print "Old password:"; - system '/bin/stty', '-echo'; - $old_password=; - chop $old_password; - #$old_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; - $old_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; - $old_password = $1; - print "\nEnter the new password (minimum of 6, maximum of 8 characters)\n"; - print "Please use a combination of upper and lowercase letters and numbers.\n"; - print "New password:"; - $new_password=; - chop($new_password); - #$new_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; - $new_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; - $new_password = $1; - print "\nRe-enter new password:"; - my($check_new_password); - $check_new_password=; - chop($check_new_password); - die "\nThey don't match; try again.\n" unless $check_new_password eq $new_password; - - $new_gecos=''; - $new_shell=''; -} -print "\n"; - -system '/bin/stty', 'echo'; - -socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; -connect(SOCK, sockaddr_un($fs_passwdd_socket)) or die "connect: $!"; -print SOCK join("\n",$me,$old_password,$new_password,$new_gecos,$new_shell),"\n"; -SOCK->flush; -my($error); -$error = ; -chop $error; - -if ($error) { - print "\nUpdate error: $error\n"; -} else { - print "\nUpdate sucessful.\n"; -} diff --git a/fs_passwd/fs_passwd_server b/fs_passwd/fs_passwd_server deleted file mode 100755 index 99e7c4351..000000000 --- a/fs_passwd/fs_passwd_server +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/perl -Tw -# -# fs_passwd_server -# -# portions of this script are copied from the `passwd' script in the original -# (perl 4) camel book, now archived at -# http://www.perl.com/CPAN/scripts/nutshell/ch6/passwd -# -# ivan@sisd.com 98-mar-9 -# -# crypt-aware, s/password/_password/; ivan@sisd.com 98-aug-23 - -use strict; -use IO::Handle; -use FS::SSH qw(sshopen2); -use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearchs); -use FS::svc_acct; - -$SIG{CHLD} = sub { wait() }; - -&adminsuidsetup; - -my($fs_passwdd)="/usr/local/sbin/fs_passwdd"; - -my($shellmachine)=shift; -die "Usage: fs_passwd_server shellmachine\n" unless $shellmachine; - -while (1) { - my($reader,$writer)=(new IO::Handle, new IO::Handle); - $writer->autoflush(1); - sshopen2($shellmachine,$reader,$writer,$fs_passwdd); - while (1) { - my($username,$old_password,$new_password,$new_gecos,$new_shell); - defined($username=<$reader>) or last; - defined($old_password=<$reader>) or last; - defined($new_password=<$reader>) or last; - defined($new_gecos=<$reader>) or last; - defined($new_shell=<$reader>) or last; - chop($username); - chop($old_password); - chop($new_password); - chop($new_gecos); - chop($new_shell); - my($svc_acct); - - #need to try both $old_password and encrypted $old_password - #maybe the crypt function in svc_acct.export needs to be a library? - my $salt = substr($old_password,0,2); - my $cold_password = crypt($old_password,$salt); - $svc_acct=qsearchs('svc_acct',{'username'=>$username, - '_password'=>$old_password, - } ) - || qsearchs('svc_acct',{'username'=>$username, - '_password'=>$cold_password, - } ); - unless ( $svc_acct ) { print $writer "Incorrect password.\n"; next; } - - my(%hash)=$svc_acct->hash; - my($new_svc_acct) = create FS::svc_acct ( \%hash ); - $new_svc_acct->setfield('_password',$new_password) - if $new_password && $new_password ne $old_password; - $new_svc_acct->setfield('finger',$new_gecos) if $new_gecos; - $new_svc_acct->setfield('shell',$new_shell) if $new_shell; - my($error)=$new_svc_acct->replace($svc_acct); - print $writer $error,"\n"; - } - close $writer; - close $reader; - sleep 60; - warn "Connection to $shellmachine lost! Reconnecting...\n"; -} - diff --git a/fs_passwd/fs_passwdd b/fs_passwd/fs_passwdd deleted file mode 100755 index 582e13ccd..000000000 --- a/fs_passwd/fs_passwdd +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/perl -Tw -# -# fs_passwdd -# -# This is run REMOTELY over ssh by fs_passwd_server. -# -# ivan@sisd.com 98-mar-9 - -use strict; -use Socket; - -my($fs_passwdd_socket)="/usr/local/freeside/fs_passwdd_socket"; - -$ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; -$ENV{'SHELL'} = '/bin/sh'; -$ENV{'IFS'} = " \t\n"; -$ENV{'CDPATH'} = ''; -$ENV{'ENV'} = ''; -$ENV{'BASH_ENV'} = ''; - -$|=1; - -my $uaddr = sockaddr_un($fs_passwdd_socket); -my $proto = getprotobyname('tcp'); - -socket(Server,PF_UNIX,SOCK_STREAM,0) or die "socket: $!"; -unlink($fs_passwdd_socket); -bind(Server, $uaddr) or die "bind: $!"; -listen(Server,SOMAXCONN) or die "listen: $!"; - -my($paddr); -for ( ; $paddr = accept(Client,Server); close Client) { - my($me,$old_password,$new_password,$new_gecos,$new_shell); - - $me=; - $old_password=; - $new_password=; - $new_gecos=; - $new_shell=; - - print $me,$old_password,$new_password,$new_gecos,$new_shell; - my($error); - - $error=; - - print Client $error; - close Client; -} - diff --git a/fs_radlog/fs_radlogd b/fs_radlog/fs_radlogd deleted file mode 100755 index 74c2af361..000000000 --- a/fs_radlog/fs_radlogd +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/perl -Tw -# -# ivan@sisd.com 98-mar-23 - -use strict; -use Date::Parse; #but hopefully not - -$|=1; - -my($file,$pos)=@_; -open(FILE,"<$file") or die "Can't open $file: $!"; -seek(FILE,$pos,0) or die "Can't seek: $!"; - -my($datestr); -my(%param); - -$SIG{'HUP'} = sub { print "EOF\n"; exit; }; - -while (1) { - - while () { - next if /^$/; - if ( /^\S/ ) { - chop($datestr=$_); - undef %param; - } else { - warn "Unexpected line: $_"; - } - while () { - if ( /^$/ ) { - #if ( $param{'Acct-Status-Type'} eq 'Stop' ) { - print join("\t", - tell FILE, - %param, - ),"\n"; - #} - last; - } elsif ( /^\s+([\w\-]+)\s\=\s\"?([\w\.\-]+)\"?\s*$/ ) { - $param{$1}=$2; - } else { - warn "Unexpected line: $_"; - } - - } - - } - sleep 1; - seek(FILE,0,1); -} - - diff --git a/htdocs/browse/agent.cgi b/htdocs/browse/agent.cgi deleted file mode 100755 index cf5f2281f..000000000 --- a/htdocs/browse/agent.cgi +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/perl -Tw -# -# agent.cgi: browse agent -# -# ivan@sisd.com 97-dec-12 -# -# changes to allow pages to load from a relative location in the web tree. -# bmccane@maxbaud.net 98-mar-25 -# -# changed 'type' to 'atype' because type is reserved word in Pg6.3 -# bmccane@maxbaud.net 98-apr-3 -# -# agent type was linking to wrong cgi ivan@sisd.com 98-jul-18 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. -print header('Agent Listing', menubar( - 'Main Menu' => '../', - 'Add new agent' => '../edit/agent.cgi' -)), < - Click on agent number to edit. - - - - - - - - -END - -my($agent); -foreach $agent ( sort { - $a->getfield('agentnum') <=> $b->getfield('agentnum') -} qsearch('agent',{}) ) { - my($hashref)=$agent->hashref; - my($typenum)=$hashref->{typenum}; - my($agent_type)=qsearchs('agent_type',{'typenum'=>$typenum}); - my($atype)=$agent_type->getfield('atype'); - print < - - - - - - -END - -} - -print < - - - -END - diff --git a/htdocs/browse/agent_type.cgi b/htdocs/browse/agent_type.cgi deleted file mode 100755 index 5f05bd514..000000000 --- a/htdocs/browse/agent_type.cgi +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/perl -Tw -# -# agent_type.cgi: browse agent_type -# -# ivan@sisd.com 97-dec-10 -# -# Changes to allow page to work at a relative position in server -# Changes to make "Packages" display 2-wide in table (old way was too vertical) -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -print header("Agent Type Listing", menubar( - 'Main Menu' => '../', - 'Add new agent type' => "../edit/agent_type.cgi", -)), <Click on agent type number to edit. -
Agent #AgentTypeFreq. (unimp.)Prog. (unimp.)
- $hashref->{agentnum}$hashref->{agent}$atype$hashref->{freq}$hashref->{prog}
- - - - - -END - -my($agent_type); -foreach $agent_type ( sort { - $a->getfield('typenum') <=> $b->getfield('typenum') -} qsearch('agent_type',{}) ) { - my($hashref)=$agent_type->hashref; - my(@type_pkgs)=qsearch('type_pkgs',{'typenum'=> $hashref->{typenum} }); - my($rowspan)=scalar(@type_pkgs); - $rowspan = int($rowspan/2+0.5) ; - print < - - -END - - my($type_pkgs); - my($tdcount) = -1 ; - foreach $type_pkgs ( @type_pkgs ) { - my($pkgpart)=$type_pkgs->getfield('pkgpart'); - my($part_pkg) = qsearchs('part_pkg',{'pkgpart'=> $pkgpart }); - print qq!! if ($tdcount == 0) ; - $tdcount = 0 if ($tdcount == -1) ; - print qq!"; - $tdcount ++ ; - if ($tdcount == 2) - { - print qq!\n! ; - $tdcount = 0 ; - } - } - - print ""; -} - -print <
Type #TypePackages
- $hashref->{typenum} - $hashref->{atype}
!, - $part_pkg->getfield('pkg'),"
- - - -END - diff --git a/htdocs/browse/cust_main_county.cgi b/htdocs/browse/cust_main_county.cgi deleted file mode 100755 index d615198c9..000000000 --- a/htdocs/browse/cust_main_county.cgi +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_main_county.cgi: browse cust_main_county -# -# ivan@sisd.com 97-dec-13 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. -print header("Tax Rate Listing", menubar( - 'Main Menu' => '../', - 'Edit tax rates' => "../edit/cust_main_county.cgi", -)),<Click on expand to specify tax rates by county. -

- - - - - -END - -my($cust_main_county); -foreach $cust_main_county ( qsearch('cust_main_county',{}) ) { - my($hashref)=$cust_main_county->hashref; - print < - -END - - print ""; - - print <$hashref->{tax}% - -END - -} - -print < - - - -END - diff --git a/htdocs/browse/part_pkg.cgi b/htdocs/browse/part_pkg.cgi deleted file mode 100755 index e5ff31e9e..000000000 --- a/htdocs/browse/part_pkg.cgi +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/perl -Tw -# -# part_svc.cgi: browse part_pkg -# -# ivan@sisd.com 97-dec-5,9 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -print header("Package Part Listing",menubar( - 'Main Menu' => '../', - 'Add new package' => "../edit/part_pkg.cgi", -)), <Click on package part number to edit. -
StateCountyTax
$hashref->{state}", $hashref->{county} - ? $hashref->{county} - : qq!(ALL) !. - qq!expand! - , "
- - - - - - - - - - -END - -my($part_pkg); -foreach $part_pkg ( sort { - $a->getfield('pkgpart') <=> $b->getfield('pkgpart') -} qsearch('part_pkg',{}) ) { - my($hashref)=$part_pkg->hashref; - my(@pkg_svc)=grep $_->getfield('quantity'), - qsearch('pkg_svc',{'pkgpart'=> $hashref->{pkgpart} }); - my($rowspan)=scalar(@pkg_svc); - print < - - - - - - -END - - my($pkg_svc); - foreach $pkg_svc ( @pkg_svc ) { - my($svcpart)=$pkg_svc->getfield('svcpart'); - my($part_svc) = qsearchs('part_svc',{'svcpart'=> $svcpart }); - print qq!\n"; - } - - print ""; -} - -print <
Part #PackageCommentSetup FeeFreq.Recur. FeeServiceQuan.
- $hashref->{pkgpart} - $hashref->{pkg}$hashref->{comment}$hashref->{setup}$hashref->{freq}$hashref->{recur}!, - $part_svc->getfield('svc'),"", - $pkg_svc->getfield('quantity'),"
- - - -END - diff --git a/htdocs/browse/part_referral.cgi b/htdocs/browse/part_referral.cgi deleted file mode 100755 index b16fa896d..000000000 --- a/htdocs/browse/part_referral.cgi +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/perl -Tw -# -# part_referral.cgi: Browse part_referral -# -# ivan@sisd.com 98-feb-23 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. -print header("Referral Listing", menubar( - 'Main Menu' => '../', - 'Add new referral' => "../edit/part_referral.cgi", -)), <Click on referral number to edit. - - - - - -END - -my($part_referral); -foreach $part_referral ( sort { - $a->getfield('refnum') <=> $b->getfield('refnum') -} qsearch('part_referral',{}) ) { - my($hashref)=$part_referral->hashref; - print < - - - -END - -} - -print < - - - -END - diff --git a/htdocs/browse/part_svc.cgi b/htdocs/browse/part_svc.cgi deleted file mode 100755 index 71a556421..000000000 --- a/htdocs/browse/part_svc.cgi +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/perl -Tw -# -# part_svc.cgi: browse part_svc -# -# ivan@sisd.com 97-nov-14, 97-dec-9 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch); -use FS::part_svc qw(fields); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. -print header('Service Part Listing', menubar( - 'Main Menu' => '../', - 'Add new service' => "../edit/part_svc.cgi", -)),<Click on service part number to edit. -
Referral #Referral
- $hashref->{refnum}$hashref->{referral}
- - - - - - - - -END - -my($part_svc); -foreach $part_svc ( sort { - $a->getfield('svcpart') <=> $b->getfield('svcpart') -} qsearch('part_svc',{}) ) { - my($hashref)=$part_svc->hashref; - my($svcdb)=$hashref->{svcdb}; - my(@rows)= - grep $hashref->{${svcdb}.'__'.$_.'_flag'}, - map { /^${svcdb}__(.*)$/; $1 } - grep ! /_flag$/, - grep /^${svcdb}__/, - fields('part_svc') - ; - my($rowspan)=scalar(@rows); - print < - - - -END - my($row); - foreach $row ( @rows ) { - my($flag)=$part_svc->getfield($svcdb.'__'.$row.'_flag'); - print ""; - } -print ""; -} - -print < - - - -END - diff --git a/htdocs/browse/svc_acct_pop.cgi b/htdocs/browse/svc_acct_pop.cgi deleted file mode 100755 index a8a3a9224..000000000 --- a/htdocs/browse/svc_acct_pop.cgi +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_acct_pop.cgi: browse pops -# -# ivan@sisd.com 98-mar-8 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use FS::UID qw(cgisuidsetup swapuid); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. -print header('POP Listing', menubar( - 'Main Menu' => '../', - 'Add new POP' => "../edit/svc_acct_pop.cgi", -)), <Click on pop number to edit. -
Part #ServiceTableFieldActionValue
- $hashref->{svcpart} - $hashref->{svc}$hashref->{svcdb}$row"; - if ( $flag eq "D" ) { print "Default"; } - elsif ( $flag eq "F" ) { print "Fixed"; } - else { print "(Unknown!)"; } - print "",$part_svc->getfield($svcdb."__".$row),"
- - - - - - - -END - -my($svc_acct_pop); -foreach $svc_acct_pop ( sort { - $a->getfield('popnum') <=> $b->getfield('popnum') -} qsearch('svc_acct_pop',{}) ) { - my($hashref)=$svc_acct_pop->hashref; - print < - - - - - - -END - -} - -print < - - - -END - diff --git a/htdocs/docs/admin.html b/htdocs/docs/admin.html deleted file mode 100644 index 8adddbe92..000000000 --- a/htdocs/docs/admin.html +++ /dev/null @@ -1,6 +0,0 @@ - - Administration - - -

Administration

- diff --git a/htdocs/docs/billing.html b/htdocs/docs/billing.html deleted file mode 100644 index 02bfbd783..000000000 --- a/htdocs/docs/billing.html +++ /dev/null @@ -1,40 +0,0 @@ - - Billing - - -

Billing

- The bin/bill script can be run daily to bill all customers. Usage: bill [ -c [ i ] ] [ -d date ] [ -b ] -
    -
  • -c: Turn on collecting (you probably want this). -
  • -i: Real-time billing (as opposed to bacth billing). Only relevant for credit cards. Not available without modifying site_perl/Bill.pm -
  • -d: Pretend it is date (parsed by Date::Parse) -
  • -b: N/A -
- Printing should be configured on your freeside machine to print invoices. -

Batch credit card processing -
    -
  • After this script is run, a credit card batch will be in the cust_pay_batch table. Export this table to your credit card batching. -
  • When your batch completes, erase the cust_pay_batch records in that batch and add any necessary paymants to the cust_pay table. Example code to add payments is: -
    use FS::cust_pay;
    -
    -# loop over all records in batch
    -
    -my $payment=create FS::cust_pay (
    -  'invnum' => $invnum,
    -  'paid' => $paid,
    -  '_date' => $_date,
    -  'payby' => $payby,
    -  'payinfo' => $payinfo,
    -  'paybatch' => $paybatch,
    -);
    -
    -my $error=$payment->insert;
    -if ( $error ) {
    -  #process error
    -}
    -
    -# end loop
    -
    -All fields except paybatch are contained in the cust_pay_batch table. You can use paybatch field to track particular batches and/or particular transactions within a batch. -
- diff --git a/htdocs/docs/config.html b/htdocs/docs/config.html deleted file mode 100644 index 9b8002601..000000000 --- a/htdocs/docs/config.html +++ /dev/null @@ -1,38 +0,0 @@ - - Configuration files - - -

Configuration files

-Configuration files and directories are located in `/var/spool/freeside/conf'. -
    -
  • address - Your company name and address, four lines. -
  • bsdshellmachines - Your BSD flavored shell (and mail) machines, one per line. This enables export of `/etc/passwd' and `/etc/master.passwd'. -
  • cybercash2 - CyberCash v2 support, four lines: paymentserverhost, paymentserverport, paymentserversecret, and transaction type (`mauthonly' or `mauthcapture'). CCLib.pm is required. -
  • cybercash3.2 - CyberCash v3.2 support. Two lines: the full path and name of your merchant_conf file, and the transaction type (`mauthonly' or `mauthcapture'). CCMckLib3_2.pm, CCMckDirectLib3_2.pm and CCMckErrno3_2 are required. -
  • domain - Your domain name. -
  • erpcdmachines - Your ERPCD authenticaion machines, one per line. This enables export of `/usr/annex/acp_passwd' and `/usr/annex/acp_dialup'. -
  • home - For new users, prefixed to usrename to create a directory name. Should have a leading but not a trailing slash. -
  • lpr - Print command for paper invoices, for example `lpr -h'. -
  • nismachines - Your NIS master (not slave master) machines, one per line. This enables export of `/etc/global/passwd' and `/etc/global/shadow'. -
  • qmailmachines - Your qmail machines, one per line. This enables export of `/var/qmail/control/virtualdomains', `/var/qmail/control/recipientmap', and `/var/qmail/control/rcpthosts'. The existance of this file (even if empty) also turns on user `.qmail-extension' file maintenance in conjunction with `shellmachine'. -
  • radiusmachines - Your RADIUS authentication machines, one per line. This enables export of `/etc/raddb/users'. -
  • registries - Directory which contains domain registry information. Each registry is a directory. -
      -
    • registries/internic - Currently the only supported registry -
        -
      • registries/internic/from - Email address from which InterNIC domain registrations are sent. -
      • regestries/internic/nameservers - The nameservers for InterNIC domain registrations, one per line. Each line contains an IP address and hostname, separated by whitespace. -
      • registries/internic/tech_contact - Technical contact NIC handle for domain registrations. -
      • registries/internic/template - Template for InterNIC domain registrations with special markup. A suitable copy of the InterNIC domain template v4.0 is in `fs-x.y.z/etc/domain-template.txt'. -
      • registries/internic/to - Email address to which InterNIC domain registrations are sent. -
      -
    -
  • secrets - Three lines: Database engine datasource (for example, `DBI:mysql:freeside' or `DBI:Pg:dbname=freeside'), username, and password. This file should not be world readable. -
  • sendmailmachines - Your sendmail machines, one per line. This enables export of `/etc/virtusertable' and `/etc/sendmail.cw'. -
  • shellmachine - A single machine with user home directories mounted. This enables home directory creation, renaming and archiving/deletion. In conjunction with `qmailmachines', it also enables `.qmail-extension' file maintenance. -
  • shellmachines - Your Linux and System V flavored shell (and mail) machines, one per line. This enables export of `/etc/passwd' and `/etc/shadow' files. -
  • shells - Legal shells (think /etc/shells). You probably want to `cut -d: -f7 /etc/passwd | sort | uniq' initially so that importing doesn't fail with `Illegal shell' errors, then remove any special entries afterwords. A blank line specifies that an empty shell is permitted. -
  • smtpmachine - SMTP relay for Freeside's outgoing mail. -
- - diff --git a/htdocs/docs/export.html b/htdocs/docs/export.html deleted file mode 100644 index f760b97dd..000000000 --- a/htdocs/docs/export.html +++ /dev/null @@ -1,39 +0,0 @@ - - File exporting - - -

File exporting

-
    -
  • bin/svc_acct.export will create UNIX `passwd', `shadow' and `master.passwd' files, ERPCD `acp_passwd' and `acp_dialup' files and a RADIUS `users' file in the `/var/spool/freeside/export' directory. Using the appropriate configuration files, you can export these files to your remote machines unattended; see below. -
      -
    • shellmachines - passwd and shadow are copied to the remote machine as /etc/passwd.new and /etc/shadow.net and then moved to /etc/passwd and /etc/shadow if no errors occur. -
    • bsdshellmachines - passwd and master.passwd are copied to the remote machine as /etc/passwd.new and /etc/master.passwd.new and moved to /etc/passwd and /etc/master.passwd if no errors occur. -
    • nismachines - passwd and shadow are copied to the `/etc/global' directory on the remote machine. If no errors occur, the command `( cd /var/yp; make; )' is executed on the remote machine. -
    • erpcdmachines - acp_passwd and acp_dialup are copied to the `/usr/annex' directory on the remote machine. If no errors occur, the command `( kill -USR1 `cat /usr/annex/erpcd.pid` )' is executed on the remote machine. -
    • radiusmachines - users is copied to the `/etc/raddb' directory on the remote machine. If no errors occur, the command `( builddbm )' is executed on the remote machine. -
    -
  • site_perl/svc_acct.pm - If a shellmachine is defined, users can be created, modified and deleted remotely; see below. -
      -
    • The command `useradd -d homedir -s shell -u uid username' is executed when a user is added. -
    • The command `userdel username' is executed with a user is deleted. -
    • If a user's home directory changes, the command `[ -d old_homedir && ( chmod u+t old_homedir; umask 022; mkdir new_homedir; cd old_homedir; find . -depth -print | cpio -pdm new_homedir; chmod u-t new_homedir; chown -R uid.gid new_homedir; rm -rf old_homedir )' is executed. -
    -
  • bin/svc_acct_sm.export will create Qmail `rcpthosts', `recipientmap' and `virtualdomains' files and Sendmail `virtusertable' and `sendmail.cw' files in the `/var/spool/freeside/export' directory. Using the appropriate configuration files, you can export these files to your remote machines unattemded; see below. -
      -
    • qmailmachines - recipientmap, virtualdomains and rcpthosts are copied to the `/var/qmail/control' directory on the remote machine. Note: If you imported qmail configuration files, run the generated `/var/spool/freeside/export/virtualdomains.FIX' on a machine with your user home directories before exporting qmail configuration files. -
    • shellmachine - The command `[ -e homedir/.qmail-default ] || { touch homedir/.qmail-default; chown uid.gid homedir/.qmail-default; }' will be run on this machine for users in the virtualdomains file. -
    • sendmailmachines - sendmail.cw and virtusertable are copied to the remote machine as /etc/sendmail.cw.new and /etc/virtusertable.new and moved to /etc/sendmail.cw and /etc/virtusertable if no errors occur. -
    -
  • site_perl/svc_acct_sm.pm - If the qmailmachines configuration file exists and a shellmachine is defined, user `.qmail-' files can be updated. -
      -
    • The command `[ -e homedir/.qmail-domain-default ] || { touch homedir/.qmail-domain-default; chown uid.gid homedir/.qmail-domain-default; }' is run. -
    -
-
Unattended remote login - Freeside can login to remote machines unattended using SSH. This can pose a security risk if not configured correctly, and will allow an intruder who breaks into your freeside machine full access to your remote machines. Do not use this feature unless you understand what you are doing! -
    -
  • As the freeside user (on your freeside machine), generate an authentication key using ssh-keygen. Since this is for unattended operation, you need to use a blank passphrase. -
  • Append the newly-created identity.pub file to root's authorized_keys on the remote machine(s). -
- - - diff --git a/htdocs/docs/index.html b/htdocs/docs/index.html deleted file mode 100644 index 20051ca4d..000000000 --- a/htdocs/docs/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - Documentation - - -

Documentation

- - diff --git a/htdocs/docs/install.html b/htdocs/docs/install.html deleted file mode 100644 index c4784ebf6..000000000 --- a/htdocs/docs/install.html +++ /dev/null @@ -1,56 +0,0 @@ - - Installation - - -

Installation

-Before installing, you need: - -Install the Freeside distribution: -
    -
  • Add the user `freeside' to your system. -
  • Add the freeside database to your database engine. (with MySQL) (with PostgreSQL) -
  • Allow the freeside user full access to the freeside database. (with MySQL) (with PostgreSQL) -
  • Unpack the tarball:
    gunzip -c fs-x.y.z.tar.gz | tar xvf -
    -
  • Copy or link fs-x.y.z/site_perl to FS in your site_perl directory. (try `perl -V' if unsure)
    mkdir /usr/local/lib/site_perl/FS
    -cp fs-x.y.z/site_perl/* /usr/local/lib/site_perl/FS
    or
    ln -s /full/path/to/fs-x.y.z/site_perl /usr/local/lib/site_perl/FS
    -
  • Copy or link fs-x.y.z/htdocs to your web server's document space.
    mkdir /usr/local/apache/htdocs/freeside
    -cp -r fs-x.y.z/htdocs/* /usr/local/apache/htdocs/freeside
    or
    ln -s /full/path/to/fs-x.y.z/htdocs /usr/local/apache/htdocs/freeside
    -
  • Restrict access to this web interface. (with Apache) -
  • Enable CGI execution for files with the `.cgi' extension. (with Apache) -
  • Set ownership and permissions for the web interface. Your system should support secure setuid scripts or Perl's emulation, see perlsec: Security Bugs for information and workarounds. -
    cd /usr/local/apache/htdocs/freeside
    -chown -R freeside .
    -chmod 4755 browse/*.cgi edit/*.cgi edit/process/*.cgi misc/*.cgi misc/process/*.cgi search/*.cgi view/*.cgi
    -
  • Create the base Freeside directory `/var/spool/freeside', and the subdirectories `conf', `counters', and `export'.
    mkdir /var/spool/freeside
    -mkdir /var/spool/freeside/conf
    -mkdir /var/spool/freeside/counters
    -mkdir /var/spool/freeside/export
    -chown -R freeside /var/spool/freeside
    -
  • Create the necessary configuration files. -
  • Run bin/fs-setup to create the database tables. -
- diff --git a/htdocs/docs/legacy.html b/htdocs/docs/legacy.html deleted file mode 100644 index 40e09cb3c..000000000 --- a/htdocs/docs/legacy.html +++ /dev/null @@ -1,34 +0,0 @@ - - Importing legacy data - - -

Importing legacy data

-
    -
  • bin/svc_acct.import - Import `passwd', ( `shadow' or `master.passwd' ) and RADIUS `users'. Before running bin/svc_acct.import, you need services (with table svc_acct) as follows: -
      -
    • Most accounts probably have entries in passwd and users (with Port-Limit nonexistant or 1) -
    • Some accounts have entries in passwd and users, but with Port-Limit 2 (or more) -
    • Some accounts might have entries in users only (Port-Limit 1) -
    • Some accounts might have entries in users only (Port-Limit >= 2) -
    • POP mail accounts have entries in passwd only, and have a particular shell. -
    • Everything else in passwd is a shell account. -
    -
  • bin/svc_acct_sm.import - Import qmail ( `virtualdomains' and `rcpthosts' ), or sendmail ( `virtusertable' and `sendmail.cw' ) files. Before running bin/svc_acct_sm.import, you need services as follows: -
      -
    • Domain (table svc_acct) -
    • Mail alias (table svc_acct_sm) -
    -
  • Importing customer data -
      -
    • Manually -
        -
      • Add a new customer -
      • Add one or more packages for this customer -
      • Enter a package by clicking on the package number -
      • Pick the `Link to existing' option -
      -
    • Batch - You will need to write a script to import your particular legacy data. You can use eg/TEMPLATE_cust_main.import as a starting point. -
    -
- - diff --git a/htdocs/docs/passwd.html b/htdocs/docs/passwd.html deleted file mode 100644 index a8f8151e2..000000000 --- a/htdocs/docs/passwd.html +++ /dev/null @@ -1,16 +0,0 @@ - - fs_passwd - - -

fs_passwd

-You may use fs_passwd/fs_passwd as a "passwd", "chfn" and "chsh" replacement on your shell machine(s) to cause password, gecos and shell changes to update your freeside machine. This can pose a security risk if not configured correctly. Do not use this feature unless you understand what you are doing! -

Currently it is assumed that the the crypt(3) function in the C library is the same on the Freeside machine as on the target machine. -
    -
  • Create a freeside account on the shell machine(s). -
  • Append the identity.pub from the freeside user on your freeside machine to the authorized_keys file of the newly created freeside user on the shell machine(s). -
  • Copy fs_passwd/fs_passwd to /usr/local/bin on the shell machine(s). (chown freeside, chmod 4755). You may link it to passwd, chfn and chsh as well. -
  • Copy fs_passwd/fs_passwdd to /usr/local/sbin on the shell machine(s). (chown freeside, chmod 500) -
  • Create /usr/local/freeside on the shell machine(s). (chown freeside, chmod 700) -
  • Run an iteration of "fs_passwd/fs_passwd_server shell.machine" as the freeside user for each shell machine (this is a daemon process). -
- diff --git a/htdocs/docs/schema.html b/htdocs/docs/schema.html deleted file mode 100644 index 5a296ec83..000000000 --- a/htdocs/docs/schema.html +++ /dev/null @@ -1,205 +0,0 @@ - - Schema reference - - -

Schema reference

-
    -
  • agent - Agents are resellers of your service. Agents may be limited to a subset of your full offerings (via their agent type). -
      -
    • agentnum - primary key -
    • agent - name of this agent -
    • typenum - agent type -
    • prog - (unimplemented) -
    • freq - (unimplemented) -
    -
  • agent_type - Agent types define groups of packages that you can then assign to particular agents. -
      -
    • typenum - primary key -
    • atype - name of this agent type -
    -
  • cust_bill - Invoices -
      -
    • invnum - primary key -
    • custnum - customer -
    • _date -
    • charged - amount of this invoice -
    • owed - amount still outstanding on this invoice -
    • printed - how many times this invoice has been printed automatically -
    -
  • cust_bill_pkg - Invoice line items -
      -
    • invnum - (multiple) key -
    • pkgnum - package -
    • setup - setup fee -
    • recur - recurring fee -
    • sdate - starting date -
    • edate - ending date -
    -
  • cust_credit - Credits -
      -
    • crednum - primary key -
    • custnum - customer -
    • amount - amount credited -
    • credited - amount still outstanding (not yet refunded) on this credit -
    • _date -
    • otaker - order taker -
    • reason -
    -
  • cust_main - Customers -
      -
    • custnum - primary key -
    • agentnum - agent -
    • refnum - referral -
    • first - name -
    • last - name -
    • ss - social security number -
    • company -
    • address1 -
    • address2 -
    • city -
    • county -
    • state -
    • zip -
    • country -
    • daytime - phone -
    • night - phone -
    • payby - CARD, BILL, or COMP -
    • payinfo - card number, P.O.#, or comp issuer -
    • paydate - expiration date -
    • payname - billing name (name on card) -
    • tax - tax exempt, Y or null -
    • otaker - order taker -
    -
  • cust_main_county - Tax rates -
      -
    • taxnum - primary key -
    • state -
    • county -
    • tax - % rate -
    -
  • cust_pay - Payments -
      -
    • paynum - primary key -
    • invnum - invoice -
    • paid - amount -
    • _date -
    • payby - CARD, BILL, or COMP -
    • payinfo - card number, P.O.#, or comp issuer -
    • paybatch - text field for tracking card processor batches -
    -
  • cust_pay_batch - Pending batch -
      -
    • trancode - 77 for charges -
    • cardnum -
    • exp - card expiration -
    • amount -
    • invnum - invoice -
    • custnum - customer -
    • payname - name on card -
    • first - name -
    • last - name -
    • address1 -
    • address2 -
    • city -
    • state -
    • zip -
    • country -
    -
  • cust_pkg - Customer billing items -
      -
    • pkgnum - primary key -
    • custnum - customer -
    • pkgpart - Package definition -
    • setup - date -
    • bill - next bill date -
    • susp - (past) suspension date -
    • expire - (future) cancellation date -
    • cancel - (past) cancellation date -
    • otaker - order taker -
    -
  • cust_refund - Refunds -
      -
    • refundnum - primary key -
    • crednum - credit -
    • refund - amount -
    • _date -
    • payby - CARD, BILL or COMP -
    • payinfo - card number, P.O.#, or comp issuer -
    • otaker - order taker -
    -
  • cust_svc - Customer services - -
  • part_pkg - Package definitions -
      -
    • pkgpart - primary key -
    • pkg - package name -
    • comment - non-customer visable package comment -
    • setup - setup fee -
    • freq - recurring frequency (months) -
    • recur - recurring fee -
    -
  • part_referral - Referral listing -
      -
    • refnum
    • - primary key -
    • referral
    • - referral -
    -
  • part_svc - Service definitions -
      -
    • svcpart - primary key -
    • svc - name of this service -
    • svcdb - table used for this service: svc_acct, svc_acct_sm, svc_domain, svc_charge or svc_wo -
    • table__field - Default or fixed value for field in table -
    • table__field_flag - null, D or F -
    -
  • pkg_svc - -
  • svc_acct - Accounts -
      -
    • svcnum - primary key -
    • username -
    • _password -
    • popnum - Point of Presence -
    • uid -
    • gid -
    • finger - GECOS -
    • dir -
    • shell -
    • quota - (unimplementd) -
    • slipip - IP address -
    • radius_Radius_Attribute - Radius-Attribute -
    -
  • svc_acct_pop - Points of Presence -
      -
    • popnum - primary key -
    • city -
    • state -
    • ac - area code -
    • exch - exchange -
    -
  • svc_acct_sm - Domain mail aliases - -
  • svc_domain - Domains - -
  • type_pkgs - -
- diff --git a/htdocs/docs/trouble.html b/htdocs/docs/trouble.html deleted file mode 100644 index 2cf6d4e71..000000000 --- a/htdocs/docs/trouble.html +++ /dev/null @@ -1,41 +0,0 @@ - - Troubleshooting - - -

Troubleshooting

-
    -
  • When troubleshooting the web interface, helpful information is often in your web server's error log. -
  • Internet Explorer will not work with Freeside's HTML interface. -Netscape, -Lynx, and -Emacs/W3, -among others, should work fine. -
  • If bin/svc_acct.import fails with an "Out of memory!" error using MySQL, upgrede MySQL and recompile the Perl DBD. There was a memory leak in some older versions of MySQL. -
  • If you get tons of errors in your web server's error log like this: -
    -Ambiguous use of value => resolved to "value" =>
    -at /usr/lib/perl5/site_perl/File/CounterFile.pm line 132.
    -
    - This clutters up your log files but is otherwise harmless. Upgrade to the latest File::CounterFile. -
  • If you get an Internal Server Error when adding or editing, but find that the update has occured, and you get something like the following in your web server's error log: -
    -access to /your/path/edit/process/some_table.cgi failed for
    -machine.domain.tld, reason: malformed header from script.
    -Bad header=HTTP/1.0 302 Moved Temporarily
    -
    - Then you forgot to apply this patch as mentioned in the New Installation section of the documentation. -
  • If you get errors like this: -
    -UID.pm: Can't open /var/spool/freeside/conf/secrets: Permission denied 
    -at /your/path/site_perl/FS/UID.pm line 26.
    -BEGIN failed--compilation aborted at
    -/your/path/edit/process/part_svc.cgi line 15.
    -
    - Then the scripts are not running setuid freeside. If you were editing -the files, it is possible you inadvertantly removed the setuid bit. -As mentioned in the New Installation section of the documentation, set ownership and permissions for the web interface. Your system should support secure setuid scripts or Perl's emulation, see perlsec: Security Bugs for information and workarounds. -
    cd /usr/local/apache/htdocs/freeside
    -chown -R freeside .
    -chmod 4755 browse/*.cgi edit/*.cgi edit/process/*.cgi misc/*.cgi misc/process/*.cgi search/*.cgi view/*.cgi
    -
- diff --git a/htdocs/docs/upgrade.html b/htdocs/docs/upgrade.html deleted file mode 100644 index d2201f601..000000000 --- a/htdocs/docs/upgrade.html +++ /dev/null @@ -1,24 +0,0 @@ - - Upgrading to 1.1.x - - -

Upgrading to 1.1.x

-
    -
  • Back up your data and current Freeside installation. -
  • Unpack a copy of the 1.0.0 distribution in a separate location. -
  • Diff your current installation against the 1.0.0 distribution. -
  • Apply all the diffs you found above, if applicable. -
  • Apply (at least) the following changes to your database: -
    -ALTER TABLE cust_main CHANGE ss ss char(11) NULL;
    -ALTER TABLE cust_main CHANGE day daytime varchar(20) NULL;
    -ALTER TABLE svc_acct CHANGE password _password varchar(25) NOT NULL;
    -ALTER TABLE part_svc CHANGE svc_acct__password svc_acct___password varchar(25) NULL;
    -ALTER TABLE part_svc CHANGE svc_acct__password_flag svc_acct___password_flag char(1) NULL;
    -ALTER TABLE agent_type CHANGE type atype varchar(80) NOT NULL;
    -
    -
  • Optionally change the field lengths and types to match a 1.1.x install; see `bin/fs-setup'. -
  • Create the necessary configuration files, -
  • Copy or symlink htdocs and site_perl to the new 1.1.x copies. -
  • Run bin/dbdef-create. This file uses MySQL-specific syntax. If you are running a different database engine you will need to modify it slightly. - diff --git a/htdocs/docs/upgrade2.html b/htdocs/docs/upgrade2.html deleted file mode 100644 index 4bf7ea45a..000000000 --- a/htdocs/docs/upgrade2.html +++ /dev/null @@ -1,11 +0,0 @@ - - Upgrading to 1.1.3 - - -

    Upgrading to 1.1.3 from 1.1.x

    -
      -
    • If migrating from 1.0.0, see these instructions first. -
    • Back up your data and current Freeside installation. -
    • If applicable, create the new configuration files: lpr, cybercash2, cybercash3.2 -
    • Copy or symlink htdocs and site_perl to the new copies. - diff --git a/htdocs/edit/agent.cgi b/htdocs/edit/agent.cgi deleted file mode 100755 index 5bd116528..000000000 --- a/htdocs/edit/agent.cgi +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/perl -Tw -# -# agent.cgi: Add/Edit agent (output form) -# -# ivan@sisd.com 97-dec-12 -# -# Changes to allow page to work at a relative position in server -# Changed 'type' to 'atype' because Pg6.3 reserves the type word -# bmccane@maxbaud.net 98-apr-3 -# -# use FS::CGI, added inline documentation ivan@sisd.com 98-jul-12 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::agent; -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($agent,$action); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $agent=qsearchs('agent',{'agentnum'=>$1}); - $action='Edit'; -} else { #adding - $agent=create FS::agent {}; - $action='Add'; -} -my($hashref)=$agent->hashref; - -print header("$action Agent", menubar( - 'Main Menu' => '../', - 'View all agents' => '../browse/agent.cgi', -)), '
      '; - -print qq!!, - "Agent #", $hashref->{agentnum} ? $hashref->{agentnum} : "(NEW)"; - -print < -Agent -Agent type -Program (unimplemented) - -END - -print qq!
      !; - -print < - - -END - diff --git a/htdocs/edit/agent_type.cgi b/htdocs/edit/agent_type.cgi deleted file mode 100755 index b9fff4530..000000000 --- a/htdocs/edit/agent_type.cgi +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/perl -Tw -# -# agent_type.cgi: Add/Edit agent type (output form) -# -# ivan@sisd.com 97-dec-10 -# -# Changes to allow page to work at a relative position in server -# Changed 'type' to 'atype' because Pg6.3 reserves the type word -# bmccane@maxbaud.net 98-apr-3 -# -# use FS::CGI, added inline documentation ivan@sisd.com 98-jul-12 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::agent_type; -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($agent_type,$action); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $agent_type=qsearchs('agent_type',{'typenum'=>$1}); - $action='Edit'; -} else { #adding - $agent_type=create FS::agent_type {}; - $action='Add'; -} -my($hashref)=$agent_type->hashref; - -print header("$action Agent Type", menubar( - 'Main Menu' => '../', - 'View all agent types' => '../browse/agent_type.cgi', -)), ''; - -print qq!!, - "Agent Type #", $hashref->{typenum} ? $hashref->{typenum} : "(NEW)"; - -print <Type -

      Select which packages agents of this type may sell to customers

      -END - -my($part_pkg); -foreach $part_pkg ( qsearch('part_pkg',{}) ) { - print qq!
      $agent_type->getfield('typenum'), - 'pkgpart' => $part_pkg->getfield('pkgpart'), - }) - ? 'CHECKED ' - : '', - qq!"VALUE="ON"> !,$part_pkg->getfield('pkg') - ; -} - -print qq!
      !; - -print < - - -END - diff --git a/htdocs/edit/cust_credit.cgi b/htdocs/edit/cust_credit.cgi deleted file mode 100755 index 75ef21208..000000000 --- a/htdocs/edit/cust_credit.cgi +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_credit.cgi: Add a credit (output form) -# -# Usage: cust_credit.cgi custnum [ -paybatch ] -# http://server.name/path/cust_credit?custnum [ -paybatch ] -# -# Note: Should be run setuid root as user nobody. -# -# some hooks in here for modifications as well as additions, but needs (lots) more work. -# also see process/cust_credit.cgi, the script that processes the form. -# -# ivan@voicenet.com 96-dec-05 -# -# paybatch field, differentiates between credits & credits+refunds by commandline -# ivan@voicenet.com 96-dec-08 -# -# added (but commented out) sprintf("%.2f" in amount field. Hmm. -# ivan@voicenet.com 97-jan-3 -# -# paybatch stuff thrown out - has checkbox now instead. -# (well, sort of. still passed around for backward compatability and possible editing hook) -# ivan@voicenet.com 97-apr-21 -# -# rewrite ivan@sisd.com 98-mar-16 - -use strict; -use Date::Format; -use CGI::Base qw(:DEFAULT :CGI); #CGI module -use FS::UID qw(cgisuidsetup getotaker); - -my($cgi) = new CGI::Base; -$cgi->get; -cgisuidsetup($cgi); - -#untaint custnum -$QUERY_STRING =~ /^(\d+)$/; -my($custnum)=$1; - -#untaint otaker -my($otaker)=getotaker; - -SendHeaders(); # one guess. -print < - - Post Credit - - -
      -

      Post Credit

      -
      - -
      -END
      -
      -#crednum
      -my($crednum)="";
      -print qq!Credit #!, $crednum ? $crednum : " (NEW)", qq!!;
      -
      -#custnum
      -print qq!\nCustomer #$custnum!;
      -
      -#paybatch
      -print qq!!;
      -
      -#date
      -my($date)=time;
      -print qq!\nDate: !, time2str("%D",$date), qq!!;
      -
      -#amount
      -my($amount)='';
      -print qq!\nAmount \$!;
      -
      -#refund?
      -#print qq! Also post refund!;
      -
      -#otaker (hidden)
      -print qq!!;
      -
      -#reason
      -my($reason)='';
      -print qq!\nReason !;
      -
      -print <
      -
      -
      -END - -print < - - -END - diff --git a/htdocs/edit/cust_main.cgi b/htdocs/edit/cust_main.cgi deleted file mode 100755 index 14556010c..000000000 --- a/htdocs/edit/cust_main.cgi +++ /dev/null @@ -1,214 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_main.cgi: Edit a customer (output form) -# -# Usage: cust_main.cgi custnum -# http://server.name/path/cust_main.cgi?custnum -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 96-nov-29 -> 96-dec-04 -# -# Blank custnum for new customer. -# ivan@voicenet.com 96-dec-16 -# -# referral defaults to blank, to force people to pick something -# ivan@voicenet.com 97-jun-4 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-28 -# -# new customer is null, not '#' -# otaker gotten from &getotaker instead of $ENV{REMOTE_USER} -# ivan@sisd.com 97-nov-12 -# -# cgisuidsetup($cgi); -# no need for old_ fields. -# now state+county is a select field (took out PA hack) -# used autoloaded $cust_main->field methods -# ivan@sisd.com 97-dec-17 -# -# fixed quoting problems ivan@sisd.com 98-feb-23 -# -# paydate sql update ivan@sisd.com 98-mar-5 -# -# Changes to allow page to work at a relative position in server -# Changed 'day' to 'daytime' because Pg6.3 reserves the day word -# Added test for paydate in mm-dd-yyyy format for Pg6.3 default format -# bmccane@maxbaud.net 98-apr-3 -# -# fixed one missed day->daytime ivan@sisd.com 98-jul-13 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup getotaker); -use FS::Record qw(qsearch qsearchs); -use FS::cust_main; - -my($cgi) = new CGI::Base; -$cgi->get; - -cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -#get record -my($custnum,$action,$cust_main); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $custnum=$1; - $cust_main = qsearchs('cust_main',{'custnum'=>$custnum}); - $action='Edit'; -} else { - $custnum=''; - $cust_main = create FS::cust_main ( {} ); - $cust_main->setfield('otaker',&getotaker); - $cust_main->setfield('country','US'); - $action='Add'; -} - -print < - - Customer $action - - -
      -

      Customer $action

      -
      - -
      -END
      -
      -print qq!!,
      -      qq!Customer #!;
      -print $custnum ? $custnum : " (NEW)" , "";
      -
      -#agentnum
      -my($agentnum)=$cust_main->agentnum || 1; #set to first agent by default
      -my(@agents) = qsearch('agent',{});
      -print qq!\n\nAgent # ";
      -
      -#referral
      -#unless ($custnum) {
      -  my($refnum)=$cust_main->refnum || 0; #to avoid "arguement not numeric" error
      -  my(@referrals) = qsearch('part_referral',{});
      -  print qq!\nReferral ";
      -#}
      -
      -my($last,$first,$ss,$company,$address1,$address2,$city)=(
      -  $cust_main->last,
      -  $cust_main->first,
      -  $cust_main->ss,
      -  $cust_main->company,
      -  $cust_main->address1,
      -  $cust_main->address2,
      -  $cust_main->city,
      -);
      -
      -print < (first)  SS# 
      -Company 
      -Address 
      -        
      -City   State (county) ";
      -
      -my($zip,$country,$daytime,$night,$fax)=(
      -  $cust_main->zip,
      -  $cust_main->country,
      -  $cust_main->daytime,
      -  $cust_main->night,
      -  $cust_main->fax,
      -);
      -
      -print <
      -Country: $country
      -
      -Phone (daytime)  (night)  (fax)
      -
      -END
      -
      -my(%payby)=(
      -  'CARD' => "Credit card    ",
      -  'BILL' => "Billing    ",
      -  'COMP' => "Complimentary",
      -);
      -for (qw(CARD BILL COMP)) {
      -  print qq!payby eq "$_");
      -  print qq!>$payby{$_}!;
      -}
      -
      -
      -my($payinfo,$payname,$otaker)=(
      -  $cust_main->payinfo,
      -  $cust_main->payname,
      -  $cust_main->otaker,
      -);
      -
      -my($paydate);
      -if ( $cust_main->paydate =~ /^(\d{4})-(\d{2})-\d{2}$/ ) {
      -  $paydate="$2/$1"
      -} elsif ( $cust_main->paydate =~ /^(\d{2})-\d{2}-(\d{4}$)/ ) {
      -  $paydate="$1/$2"
      -}
      -else {
      -  $paydate='';
      -}
      -
      -print <
      -END
      -
      -print qq!Exp. date (MM/YY or MM/YYYY)    Billing name \ntax eq "Y";
      -print qq!> Tax Exempt!;
      -
      -print <$otaker
      -
      -END - -print qq!
      !; - -print < - - -END - diff --git a/htdocs/edit/cust_main_county-expand.cgi b/htdocs/edit/cust_main_county-expand.cgi deleted file mode 100755 index 59ff7043a..000000000 --- a/htdocs/edit/cust_main_county-expand.cgi +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_main_county-expand.cgi: Expand a state into counties (output form) -# -# ivan@sisd.com 97-dec-16 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -$cgi->var('QUERY_STRING') =~ /^(\d+)$/ - or die "Illegal taxnum!"; -my($taxnum)=$1; - -my($cust_main_county)=qsearchs('cust_main_county',{'taxnum'=>$taxnum}); -die "Can't expand entry!" if $cust_main_county->getfield('county'); - -print header("Tax Rate (expand state)", menubar( - 'Main Menu' => '../', -)), < - - Separate counties by - line - (rumor has it broken on some browsers) or - whitespace. -
      -
      - - - - -END - diff --git a/htdocs/edit/cust_main_county.cgi b/htdocs/edit/cust_main_county.cgi deleted file mode 100755 index 904d58346..000000000 --- a/htdocs/edit/cust_main_county.cgi +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_main_county.cgi: Edit tax rates (output form) -# -# ivan@sisd.com 97-dec-13-16 -# -# Changes to allow page to work at a relative position in server -# Changed tax field to accept 6 chars (MO uses 6.1%) -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -print header("Edit tax rates", menubar( - 'Main Menu' => '../', -)),< -
POP #CityStateArea codeExchange
- $hashref->{popnum}$hashref->{city}$hashref->{state}$hashref->{ac}$hashref->{exch}
- - - - - -END - -my($cust_main_county); -foreach $cust_main_county ( qsearch('cust_main_county',{}) ) { - my($hashref)=$cust_main_county->hashref; - print < - -END - - print ""; - - print qq!!; -END - -} - -print < - - - - - -END - diff --git a/htdocs/edit/cust_pay.cgi b/htdocs/edit/cust_pay.cgi deleted file mode 100755 index a6cb204d1..000000000 --- a/htdocs/edit/cust_pay.cgi +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_pay.cgi: Add a payment (output form) -# -# Usage: cust_pay.cgi invnum -# http://server.name/path/cust_pay.cgi?invnum -# -# Note: Should be run setuid as user nobody. -# -# some hooks for modifications as well as additions, but needs work. -# -# ivan@voicenet.com 96-dec-11 -# -# rewrite ivan@sisd.com 98-mar-16 - -use strict; -use Date::Format; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup); - -my($cgi) = new CGI::Base; -$cgi->get; -cgisuidsetup($cgi); - -#untaint invnum -$QUERY_STRING =~ /^(\d+)$/; -my($invnum)=$1; - -SendHeaders(); # one guess. -print < - - Enter payment - - -
-

Enter payment

-
-
-
-END
-
-#invnum
-print qq!Invoice #$invnum!;
-
-#date
-my($date)=time;
-print qq!
Date: !, time2str("%D",$date), qq!!; - -#paid -print qq!
Amount \$!; - -#payby -my($payby)="BILL"; -print qq!
Payby: $payby!; - -#payinfo (check # now as payby="BILL" hardcoded.. what to do later?) -my($payinfo)=""; -print qq!
Check #!; - -#paybatch -print qq!!; - -print < -
-
-END - -print < - - -END - diff --git a/htdocs/edit/cust_pkg.cgi b/htdocs/edit/cust_pkg.cgi deleted file mode 100755 index d7f143db4..000000000 --- a/htdocs/edit/cust_pkg.cgi +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_pkg.cgi: Add/edit packages (output form) -# -# this is for changing packages around, not editing things within the package -# -# Usage: cust_pkg.cgi custnum -# http://server.name/path/cust_pkg.cgi?custnum -# -# Note: Should be run setuid freeside as user nobody -# -# started with /sales/add/cust_pkg.cgi, which added packages -# ivan@voicenet.com 97-jan-5, 97-mar-21 -# -# Rewrote for new API -# ivan@voicenet.com 97-jul-7 -# -# FS::Search is no more, &cgisuidsetup needs $cgi, ivan@sisd.com 98-mar-7 -# -# Changes to allow page to work at a relative position in server -# Changed to display packages 2-wide in a table -# bmccane@maxbaud.net 98-apr-3 -# -# fixed a pretty cool bug from above which caused a visual glitch ivan@sisd.com -# 98-jun-1 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup getotaker); -use FS::Record qw(qsearch qsearchs); - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -my(%pkg,%comment); -foreach (qsearch('part_pkg', {})) { - $pkg{ $_ -> getfield('pkgpart') } = $_->getfield('pkg'); - $comment{ $_ -> getfield('pkgpart') } = $_->getfield('comment'); -} - -#untaint custnum -$QUERY_STRING =~ /^(\d+)$/; -my($custnum)=$1; - -my($otaker)=&getotaker; - -SendHeaders(); -print < - - Add/Edit Packages - - -
-

Add/Edit Packages

-
- -
-END - -#custnum -print qq!!; - -#current packages (except cancelled packages) -my(@cust_pkg) = grep ! $_->getfield('cancel'), - qsearch('cust_pkg',{'custnum'=>$custnum}); - -if (@cust_pkg) { - print <Current packages -These are packages the customer currently has. Select those packages you -wish to remove (if any).

-END - - my ($count) = 0 ; - print qq!
StateCountyTax
$hashref->{state}", $hashref->{county} - ? $hashref->{county} - : '(ALL)' - , "%
! ; - foreach (@cust_pkg) { - print qq!! if ($count ==0) ; - my($pkgnum,$pkgpart)=( $_->getfield('pkgnum'), $_->getfield('pkgpart') ); - print qq!\n!, - #now you've got to admit this bug was pretty cool - qq!$pkgnum: $pkg{$pkgpart} - $comment{$pkgpart}\n!; - $count ++ ; - if ($count == 2) - { - $count = 0 ; - print qq!\n! ; - } - } - print qq!
!, - #qq!$pkgnum: $pkg{$pkgpart} - $comment{$pkgpart}
! ; - - print "


"; -} - -print <New packages -These are packages the customer can purchase. Specify the quantity to add -of each package.

-END - -my($cust_main)=qsearchs('cust_main',{'custnum'=>$custnum}); -my($agent)=qsearchs('agent',{'agentnum'=> $cust_main->agentnum }); - -my($type_pkgs); -my ($count) = 0 ; -print qq!
! ; -foreach $type_pkgs ( qsearch('type_pkgs',{'typenum'=> $agent->typenum }) ) { - my($pkgpart)=$type_pkgs->pkgpart; - print qq!! if ($count == 0) ; - print < - - $pkgpart: $pkg{$pkgpart} - $comment{$pkgpart}\n -END - $count ++ ; - if ($count == 2) - { - print qq!\n! ; - $count = 0 ; - } -} -print qq!
! ; - -#otaker -print qq!\n!; - -#submit -print qq!

\n!; - -print < - - -END diff --git a/htdocs/edit/part_pkg.cgi b/htdocs/edit/part_pkg.cgi deleted file mode 100755 index 9fe739bb7..000000000 --- a/htdocs/edit/part_pkg.cgi +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/perl -Tw -# -# part_pkg.cgi: Add/Edit package (output form) -# -# ivan@sisd.com 97-dec-10 -# -# Changes to allow page to work at a relative position in server -# Changed to display services 2-wide in table -# bmccane@maxbaud.net 98-apr-3 -# -# use FS::CGI, added inline documentation ivan@sisd.com 98-jul-12 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::part_pkg; -use FS::pkg_svc; -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($part_pkg,$action); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $part_pkg=qsearchs('part_pkg',{'pkgpart'=>$1}); - $action='Edit'; -} else { #adding - $part_pkg=create FS::part_pkg {}; - $action='Add'; -} -my($hashref)=$part_pkg->hashref; - -print header("$action Package Definition", menubar( - 'Main Menu' => '../', - 'View all packages' => '../browse/part_pkg.cgi', -)), ''; - -print qq!!, - "Package Part #", $hashref->{pkgpart} ? $hashref->{pkgpart} : "(NEW)"; - -print < -Package (customer-visable) -Comment (customer-hidden) -Setup fee for this package -Recurring fee for this package -Frequency (months) of recurring fee - - - -Enter the quantity of each service this package includes.

- - -END - -my($part_svc); -my($count) = 0 ; -foreach $part_svc ( qsearch('part_svc',{}) ) { - - my($svcpart)=$part_svc->getfield('svcpart'); - my($pkg_svc)=qsearchs('pkg_svc',{ - 'pkgpart' => $part_pkg->getfield('pkgpart'), - 'svcpart' => $svcpart, - }) || create FS::pkg_svc({ - 'pkgpart' => $part_pkg->getfield('pkgpart'), - 'svcpart' => $svcpart, - 'quantity' => 0, - }); - next unless $pkg_svc; - - print qq!! if $count == 0 ; - print qq!!, - qq!"; - $count ++ ; - if ($count == 2) - { - print qq!! ; - $count = 0 ; - } -} -print qq!! if ($count != 0) ; - -print "
Quan.ServiceQuan.Service
!, $part_svc->getfield('svc'), "
"; - -print qq!
!; - -print < - - -END - diff --git a/htdocs/edit/part_referral.cgi b/htdocs/edit/part_referral.cgi deleted file mode 100755 index f29802239..000000000 --- a/htdocs/edit/part_referral.cgi +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl -Tw -# -# agent.cgi: Add/Edit referral (output form) -# -# ivan@sisd.com 98-feb-23 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# confisuing typo on submit button ivan@sisd.com 98-jun-14 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::part_referral; -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($part_referral,$action); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $part_referral=qsearchs('part_referral',{'refnum'=>$1}); - $action='Edit'; -} else { #adding - $part_referral=create FS::part_referral {}; - $action='Add'; -} -my($hashref)=$part_referral->hashref; - -print header("$action Referral", menubar( - 'Main Menu' => '../', - 'View all referrals' => "../browse/part_referral.cgi", -)), < -END - -#display - -print qq!!, - "Referral #", $hashref->{refnum} ? $hashref->{refnum} : "(NEW)"; - -print < -Referral - -END - -print qq!
!; - -print < - - -END - diff --git a/htdocs/edit/part_svc.cgi b/htdocs/edit/part_svc.cgi deleted file mode 100755 index 491c013fe..000000000 --- a/htdocs/edit/part_svc.cgi +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/perl -Tw -# -# part_svc.cgi: Add/Edit service (output form) -# -# ivan@sisd.com 97-nov-14 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# use FS::CGI, added inline documentation ivan@sisd.com 98-jul-12 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::part_svc qw(fields); -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($part_svc,$action); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $part_svc=qsearchs('part_svc',{'svcpart'=>$1}); - $action='Edit'; -} else { #adding - $part_svc=create FS::part_svc {}; - $action='Add'; -} -my($hashref)=$part_svc->hashref; - -print header("$action Service Definition", menubar( - 'Main Menu' => '../', - 'View all services' => '../browse/part_svc.cgi', -)), ''; - - - -print qq!!, - "Service Part #", $hashref->{svcpart} ? $hashref->{svcpart} : "(NEW)"; - -print < -Service -Table
Off"; - print qq!Default "; - print qq!Fixed "; - print qq!
!, - ""; - $ptmp=''; - } -} -print ""; - -print qq!\n

!; - -print < - - -END - diff --git a/htdocs/edit/process/agent.cgi b/htdocs/edit/process/agent.cgi deleted file mode 100755 index 5d1ce3232..000000000 --- a/htdocs/edit/process/agent.cgi +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/agent.cgi: Edit agent (process form) -# -# ivan@sisd.com 97-dec-12 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::agent qw(fields); -use FS::CGI qw(idiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -my($agentnum)=$req->param('agentnum'); - -my($old)=qsearchs('agent',{'agentnum'=>$agentnum}) if $agentnum; - -#unmunge typenum -$req->param('typenum') =~ /^(\d+)(:.*)?$/; -$req->param('typenum',$1); - -my($new)=create FS::agent ( { - map { - $_, $req->param($_); - } fields('agent') -} ); - -my($error); -if ( $agentnum ) { - $error=$new->replace($old); -} else { - $error=$new->insert; - $agentnum=$new->getfield('agentnum'); -} - -if ( $error ) { - &idiot($error); -} else { - #$req->cgi->redirect("../../view/agent.cgi?$agentnum"); - #$req->cgi->redirect("../../edit/agent.cgi?$agentnum"); - $req->cgi->redirect("../../browse/agent.cgi"); -} - diff --git a/htdocs/edit/process/agent_type.cgi b/htdocs/edit/process/agent_type.cgi deleted file mode 100755 index 43f129fd5..000000000 --- a/htdocs/edit/process/agent_type.cgi +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/agent_type.cgi: Edit agent type (process form) -# -# ivan@sisd.com 97-dec-11 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::agent_type qw(fields); -use FS::type_pkgs; -use FS::CGI qw(idiot); - -my($req)=new CGI::Request; -&cgisuidsetup($req->cgi); - -my($typenum)=$req->param('typenum'); -my($old)=qsearchs('agent_type',{'typenum'=>$typenum}) if $typenum; - -my($new)=create FS::agent_type ( { - map { - $_, $req->param($_); - } fields('agent_type') -} ); - -my($error); -if ( $typenum ) { - $error=$new->replace($old); -} else { - $error=$new->insert; - $typenum=$new->getfield('typenum'); -} - -if ( $error ) { - idiot($error); - exit; -} - -my($part_pkg); -foreach $part_pkg (qsearch('part_pkg',{})) { - my($pkgpart)=$part_pkg->getfield('pkgpart'); - - my($type_pkgs)=qsearchs('type_pkgs',{ - 'typenum' => $typenum, - 'pkgpart' => $pkgpart, - }); - if ( $type_pkgs && ! $req->param("pkgpart$pkgpart") ) { - my($d_type_pkgs)=$type_pkgs; #need to save $type_pkgs for below. - $error=$d_type_pkgs->del; #FS::Record not FS::type_pkgs, - #so ->del not ->delete. hmm. hmm. - if ( $error ) { - idiot($error); - exit; - } - - } elsif ( $req->param("pkgpart$pkgpart") - && ! $type_pkgs - ) { - #ok to clobber it now (but bad form nonetheless?) - $type_pkgs=create FS::type_pkgs ({ - 'typenum' => $typenum, - 'pkgpart' => $pkgpart, - }); - $error= $type_pkgs->insert; - if ( $error ) { - idiot($error); - exit; - } - } - -} - -#$req->cgi->redirect("../../view/agent_type.cgi?$typenum"); -#$req->cgi->redirect("../../edit/agent_type.cgi?$typenum"); -$req->cgi->redirect("../../browse/agent_type.cgi"); - diff --git a/htdocs/edit/process/cust_credit.cgi b/htdocs/edit/process/cust_credit.cgi deleted file mode 100755 index e660b4c78..000000000 --- a/htdocs/edit/process/cust_credit.cgi +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/cust_credit.cgi: Add a credit (process form) -# -# Usage: post form to: -# http://server.name/path/cust_credit.cgi -# -# Note: Should be run setuid root as user nobody. -# -# ivan@voicenet.com 96-dec-05 -> 96-dec-08 -# -# post a refund if $new_paybatch -# ivan@voicenet.com 96-dec-08 -# -# refunds are no longer applied against a specific payment (paybatch) -# paybatch field removed -# ivan@voicenet.com 97-apr-22 -# -# rewrite ivan@sisd.com 98-mar-16 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use FS::UID qw(cgisuidsetup getotaker); -use FS::cust_credit; - -my($req)=new CGI::Request; # create form object -cgisuidsetup($req->cgi); - -$req->param('custnum') =~ /^(\d*)$/ or die "Illegal custnum!"; -my($custnum)=$1; - -$req->param('otaker',getotaker); - -my($new) = create FS::cust_credit ( { - map { - $_, $req->param($_); - } qw(custnum _date amount otaker reason) -} ); - -my($error); -$error=$new->insert; -&idiot($error) if $error; - -#no errors, no refund, so view our credit. -$req->cgi->redirect("../../view/cust_main.cgi?$custnum#history"); - -sub idiot { - my($error)=@_; - CGI::Base::SendHeaders(); # one guess - print < - - Error posting credit/refund - - -
-

Error posting credit/refund

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and press the Post button again. - - -END - -} - diff --git a/htdocs/edit/process/cust_main.cgi b/htdocs/edit/process/cust_main.cgi deleted file mode 100755 index 7664dfcb8..000000000 --- a/htdocs/edit/process/cust_main.cgi +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/cust_main.cgi: Edit a customer (process form) -# -# Usage: post form to: -# http://server.name/path/cust_main.cgi -# -# Note: Should be run setuid root as user nobody. -# -# ivan@voicenet.com 96-dec-04 -# -# added referral check -# ivan@voicenet.com 97-jun-4 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-28 -# -# same as above (again) and clean up some stuff ivan@sisd.com 98-feb-23 -# -# Changes to allow page to work at a relative position in server -# Changed 'day' to 'daytime' because Pg6.3 reserves the day word -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::cust_main; - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -#create new record object - -#unmunge agentnum -$req->param('agentnum', - (split(/:/, ($req->param('agentnum'))[0] ))[0] -); - -#unmunge tax -$req->param('tax','') unless defined($req->param('tax')); - -#unmunge refnum -$req->param('refnum', - (split(/:/, ($req->param('refnum'))[0] ))[0] -); - -#unmunge state/county -$req->param('state') =~ /^(\w+)( \((\w+)\))?$/; -$req->param('state', $1); -$req->param('county', $3 || ''); - -my($new) = create FS::cust_main ( { - map { - $_, $req->param("$_") || '' - } qw(custnum agentnum last first ss company address1 address2 city county - state zip country daytime night fax payby payinfo paydate payname tax - otaker refnum) -} ); - -if ( $new->custnum eq '' ) { - - my($error)=$new->insert; - &idiot($error) if $error; - -} else { #create old record object - - my($old) = qsearchs( 'cust_main', { 'custnum', $new->custnum } ); - &idiot("Old record not found!") unless $old; - my($error)=$new->replace($old); - &idiot($error) if $error; - -} - -my($custnum)=$new->custnum; -$req->cgi->redirect("../../view/cust_main.cgi?$custnum#cust_main"); - -sub idiot { - my($error)=@_; - CGI::Base::SendHeaders(); # one guess - print < - - Error updating customer information - - -

-

Error updating customer information

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and submit the form again. - - -END - - exit; - -} - diff --git a/htdocs/edit/process/cust_main_county-expand.cgi b/htdocs/edit/process/cust_main_county-expand.cgi deleted file mode 100755 index a821560c6..000000000 --- a/htdocs/edit/process/cust_main_county-expand.cgi +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/cust_main_county-expand.cgi: Expand counties (process form) -# -# ivan@sisd.com 97-dec-16 -# -# Changes to allow page to work at a relative position in server -# Added import of datasrc from UID.pm for Pg6.3 -# Default tax to 0.0 if using Pg6.3 -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI -# undo default tax to 0.0 if using Pg6.3: comes from pre-expanded record -# for that state -#ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup datasrc); -use FS::Record qw(qsearch qsearchs); -use FS::cust_main_county; -use FS::CGI qw(eidiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -$req->param('taxnum') =~ /^(\d+)$/ or die "Illegal taxnum!"; -my($taxnum)=$1; -my($cust_main_county)=qsearchs('cust_main_county',{'taxnum'=>$taxnum}) - or die ("Unknown taxnum!"); - -my(@counties); -if ( $req->param('delim') eq 'n' ) { - @counties=split(/\n/,$req->param('counties')); -} elsif ( $req->param('delim') eq 's' ) { - @counties=split(/\s+/,$req->param('counties')); -} else { - die "Illegal delim!"; -} - -@counties=map { - /^\s*([\w\- ]+)\s*$/ or eidiot("Illegal county"); - $1; -} @counties; - -my($county); -foreach ( @counties) { - my(%hash)=$cust_main_county->hash; - my($new)=create FS::cust_main_county \%hash; - $new->setfield('taxnum',''); - $new->setfield('county',$_); - #if (datasrc =~ m/Pg/) - #{ - # $new->setfield('tax',0.0); - #} - my($error)=$new->insert; - die $error if $error; -} - -unless ( qsearch('cust_main',{ - 'state' => $cust_main_county->getfield('state'), - 'county' => $cust_main_county->getfield('county'), -} ) ) { - my($error)=($cust_main_county->delete); - die $error if $error; -} - -$req->cgi->redirect("../../edit/cust_main_county.cgi"); - diff --git a/htdocs/edit/process/cust_main_county.cgi b/htdocs/edit/process/cust_main_county.cgi deleted file mode 100755 index 58eaa63ce..000000000 --- a/htdocs/edit/process/cust_main_county.cgi +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/agent.cgi: Edit cust_main_county (process form) -# -# ivan@sisd.com 97-dec-16 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::cust_main_county; -use FS::CGI qw(eidiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -foreach ( $req->params ) { - /^tax(\d+)$/ or die "Illegal form $_!"; - my($taxnum)=$1; - my($old)=qsearchs('cust_main_county',{'taxnum'=>$taxnum}) - or die "Couldn't find taxnum $taxnum!"; - next unless $old->getfield('tax') ne $req->param("tax$taxnum"); - my(%hash)=$old->hash; - $hash{tax}=$req->param("tax$taxnum"); - my($new)=create FS::cust_main_county \%hash; - my($error)=$new->replace($old); - eidiot($error) if $error; -} - -$req->cgi->redirect("../../browse/cust_main_county.cgi"); - diff --git a/htdocs/edit/process/cust_pay.cgi b/htdocs/edit/process/cust_pay.cgi deleted file mode 100755 index 9ec97532b..000000000 --- a/htdocs/edit/process/cust_pay.cgi +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/cust_pay.cgi: Add a payment (process form) -# -# Usage: post form to: -# http://server.name/path/cust_pay.cgi -# -# Note: Should be run setuid root as user nobody. -# -# ivan@voicenet.com 96-dec-11 -# -# rewrite ivan@sisd.com 98-mar-16 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use FS::UID qw(cgisuidsetup); -use FS::cust_pay qw(fields); - -my($req)=new CGI::Request; -&cgisuidsetup($req->cgi); - -$req->param('invnum') =~ /^(\d*)$/ or die "Illegal svcnum!"; -my($invnum)=$1; - -my($new) = create FS::cust_pay ( { - map { - $_, $req->param($_); - } qw(invnum paid _date payby payinfo paybatch) -} ); - -my($error); -$error=$new->insert; - -if ($error) { #error! - CGI::Base::SendHeaders(); # one guess - print < - - Error posting payment - - -

-

Error posting payment

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and press the Post button again. - - -END -} else { #no errors! - $req->cgi->redirect("../../view/cust_bill.cgi?$invnum"); -} - diff --git a/htdocs/edit/process/cust_pkg.cgi b/htdocs/edit/process/cust_pkg.cgi deleted file mode 100755 index 6f5bc875a..000000000 --- a/htdocs/edit/process/cust_pkg.cgi +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/cust_pkg.cgi: Add/edit packages (process form) -# -# this is for changing packages around, not for editing things within the -# package -# -# Usage: post form to: -# http://server.name/path/cust_pkg.cgi -# -# Note: Should be run setuid root as user nobody. -# -# ivan@voicenet.com 97-mar-21 - 97-mar-24 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-7 - 15 -# -# &cgisuidsetup($cgi) ivan@sisd.com 98-mar-7 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::cust_pkg; - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -#untaint custnum -$req->param('new_custnum') =~ /^(\d+)$/; -my($custnum)=$1; - -my(@remove_pkgnums) = map { - /^(\d+)$/ or die "Illegal remove_pkg value!"; - $1; -} $req->param('remove_pkg'); - -my(@pkgparts); -my($pkgpart); -foreach $pkgpart ( map /^pkg(\d+)$/ ? $1 : (), $req->params ) { - my($num_pkgs)=$req->param("pkg$pkgpart"); - while ( $num_pkgs-- ) { - push @pkgparts,$pkgpart; - } -} - -my($error) = FS::cust_pkg::order($custnum,\@pkgparts,\@remove_pkgnums); - -if ($error) { - CGI::Base::SendHeaders(); - print < - - Error updating packages - - -

-

Error updating packages

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and submit the form again. - - -END -} else { - $req->cgi->redirect("../../view/cust_main.cgi?$custnum#cust_pkg"); -} - diff --git a/htdocs/edit/process/part_pkg.cgi b/htdocs/edit/process/part_pkg.cgi deleted file mode 100755 index 7d787819a..000000000 --- a/htdocs/edit/process/part_pkg.cgi +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/part_pkg.cgi: Edit package definitions (process form) -# -# ivan@sisd.com 97-dec-10 -# -# don't update non-changing records in part_svc (causing harmless but annoying -# "Records identical" errors). ivan@sisd.com 98-feb-19 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# Added `|| 0 ' when getting quantity off web page ivan@sisd.com 98-jun-4 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::part_pkg qw(fields); -use FS::pkg_svc; -use FS::CGI qw(eidiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -my($pkgpart)=$req->param('pkgpart'); - -my($old)=qsearchs('part_pkg',{'pkgpart'=>$pkgpart}) if $pkgpart; - -my($new)=create FS::part_pkg ( { - map { - $_, $req->param($_); - } fields('part_pkg') -} ); - -if ( $pkgpart ) { - my($error)=$new->replace($old); - eidiot($error) if $error; -} else { - my($error)=$new->insert; - eidiot($error) if $error; - $pkgpart=$new->getfield('pkgpart'); -} - -my($part_svc); -foreach $part_svc (qsearch('part_svc',{})) { -# don't update non-changing records in part_svc (causing harmless but annoying -# "Records identical" errors). ivan@sisd.com 98-jan-19 - #my($quantity)=$req->param('pkg_svc'. $part_svc->getfield('svcpart')), - my($quantity)=$req->param('pkg_svc'. $part_svc->svcpart) || 0, - my($old_pkg_svc)=qsearchs('pkg_svc',{ - 'pkgpart' => $pkgpart, - 'svcpart' => $part_svc->getfield('svcpart'), - }); - my($old_quantity)=$old_pkg_svc ? $old_pkg_svc->quantity : 0; - next unless $old_quantity != $quantity; #!here - my($new_pkg_svc)=create FS::pkg_svc({ - 'pkgpart' => $pkgpart, - 'svcpart' => $part_svc->getfield('svcpart'), - #'quantity' => $req->param('pkg_svc'. $part_svc->getfield('svcpart')), - 'quantity' => $quantity, - }); - if ($old_pkg_svc) { - my($error)=$new_pkg_svc->replace($old_pkg_svc); - eidiot($error) if $error; - } else { - my($error)=$new_pkg_svc->insert; - eidiot($error) if $error; - } -} - -#$req->cgi->redirect("../../view/part_pkg.cgi?$pkgpart"); -#$req->cgi->redirect("../../edit/part_pkg.cgi?$pkgpart"); -$req->cgi->redirect("../../browse/part_pkg.cgi"); - diff --git a/htdocs/edit/process/part_referral.cgi b/htdocs/edit/process/part_referral.cgi deleted file mode 100755 index 08a4c01d0..000000000 --- a/htdocs/edit/process/part_referral.cgi +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/part_referral.cgi: Edit referrals (process form) -# -# ivan@sisd.com 98-feb-23 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::part_referral qw(fields); -use FS::CGI qw(eidiot); -use FS::CGI qw(eidiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -my($refnum)=$req->param('refnum'); - -my($new)=create FS::part_referral ( { - map { - $_, $req->param($_); - } fields('part_referral') -} ); - -if ( $refnum ) { - my($old)=qsearchs('part_referral',{'refnum'=>$refnum}); - eidiot("(Old) Record not found!") unless $old; - my($error)=$new->replace($old); - eidiot($error) if $error; -} else { - my($error)=$new->insert; - eidiot($error) if $error; -} - -$refnum=$new->getfield('refnum'); -$req->cgi->redirect("../../browse/part_referral.cgi"); - diff --git a/htdocs/edit/process/part_svc.cgi b/htdocs/edit/process/part_svc.cgi deleted file mode 100755 index 0f0fbc6e8..000000000 --- a/htdocs/edit/process/part_svc.cgi +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/part_svc.cgi: Edit service definitions (process form) -# -# ivan@sisd.com 97-nov-14 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::part_svc qw(fields); -use FS::CGI qw(eidiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -my($svcpart)=$req->param('svcpart'); - -my($old)=qsearchs('part_svc',{'svcpart'=>$svcpart}) if $svcpart; - -my($new)=create FS::part_svc ( { - map { - $_, $req->param($_); -# } qw(svcpart svc svcdb) - } fields('part_svc') -} ); - -if ( $svcpart ) { - my($error)=$new->replace($old); - eidiot($error) if $error; -} else { - my($error)=$new->insert; - eidiot($error) if $error; - $svcpart=$new->getfield('svcpart'); -} - -#$req->cgi->redirect("../../view/part_svc.cgi?$svcpart"); -#$req->cgi->redirect("../../edit/part_svc.cgi?$svcpart"); -$req->cgi->redirect("../../browse/part_svc.cgi"); - diff --git a/htdocs/edit/process/svc_acct.cgi b/htdocs/edit/process/svc_acct.cgi deleted file mode 100755 index 8d77ba703..000000000 --- a/htdocs/edit/process/svc_acct.cgi +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/svc_acct.cgi: Add/edit a customer (process form) -# -# Usage: post form to: -# http://server.name/path/svc_acct.cgi -# -# Note: Should br run setuid root as user nobody. -# -# ivan@voicenet.com 96-dec-18 -# -# Changed /u to /u2 -# ivan@voicenet.com 97-may-6 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-17 - 21 -# -# no FS::Search, FS::svc_acct creates FS::cust_svc record, used for adding -# and editing ivan@sisd.com 98-mar-8 -# -# Changes to allow page to work at a relative position in server -# Changed 'password' to '_password' because Pg6.3 reserves the password word -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::svc_acct; - -my($req) = new CGI::Request; # create form object -&cgisuidsetup($req->cgi); - -$req->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!"; -my($svcnum)=$1; - -my($old)=qsearchs('svc_acct',{'svcnum'=>$svcnum}) if $svcnum; - -#unmunge popnum -$req->param('popnum', (split(/:/, $req->param('popnum') ))[0] ); - -#unmunge passwd -if ( $req->param('_password') eq '*HIDDEN*' ) { - $req->param('_password',$old->getfield('_password')); -} - -my($new) = create FS::svc_acct ( { - map { - $_, $req->param($_); - } qw(svcnum pkgnum svcpart username _password popnum uid gid finger dir - shell quota slipip) -} ); - -if ( $svcnum ) { - my($error) = $new->replace($old); - &idiot($error) if $error; -} else { - my($error) = $new->insert; - &idiot($error) if $error; - $svcnum = $new->getfield('svcnum'); -} - -#no errors, view account -$req->cgi->redirect("../../view/svc_acct.cgi?" . $svcnum ); - -sub idiot { - my($error)=@_; - CGI::Base::SendHeaders(); # one guess - print < - - Error adding/updating account - - -

-

Error adding/updating account

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and submit the form again. - - -END - exit; -} - diff --git a/htdocs/edit/process/svc_acct_pop.cgi b/htdocs/edit/process/svc_acct_pop.cgi deleted file mode 100755 index 18d7940b4..000000000 --- a/htdocs/edit/process/svc_acct_pop.cgi +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/svc_acct_pop.cgi: Edit POP (process form) -# -# ivan@sisd.com 98-mar-8 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::svc_acct_pop qw(fields); -use FS::CGI qw(eidiot); - -my($req)=new CGI::Request; # create form object - -&cgisuidsetup($req->cgi); - -my($popnum)=$req->param('popnum'); - -my($old)=qsearchs('svc_acct_pop',{'popnum'=>$popnum}) if $popnum; - -my($new)=create FS::svc_acct_pop ( { - map { - $_, $req->param($_); - } fields('svc_acct_pop') -} ); - -if ( $popnum ) { - my($error)=$new->replace($old); - eidiot($error) if $error; -} else { - my($error)=$new->insert; - eidiot($error) if $error; - $popnum=$new->getfield('popnum'); -} -$req->cgi->redirect("../../browse/svc_acct_pop.cgi"); - diff --git a/htdocs/edit/process/svc_acct_sm.cgi b/htdocs/edit/process/svc_acct_sm.cgi deleted file mode 100755 index 9ad546bf4..000000000 --- a/htdocs/edit/process/svc_acct_sm.cgi +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/svc_acct_sm.cgi: Add/edit a mail alias (process form) -# -# Usage: post form to: -# http://server.name/path/svc_acct_sm.cgi -# -# Note: Should br run setuid root as user nobody. -# -# lots of crufty stuff from svc_acct still in here, and modifications are (unelegantly) disabled. -# -# ivan@voicenet.com 97-jan-6 -# -# enabled modifications -# -# ivan@voicenet.com 97-may-7 -# -# fixed removal of cust_svc record on modifications! -# ivan@voicenet.com 97-jun-5 -# -# rewrite ivan@sisd.com 98-mar-15 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::svc_acct_sm; - -my($req)=new CGI::Request; # create form object -cgisuidsetup($req->cgi); - -$req->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!"; -my($svcnum)=$1; - -my($old)=qsearchs('svc_acct_sm',{'svcnum'=>$svcnum}) if $svcnum; - -#unmunge domsvc and domuid -$req->param('domsvc',(split(/:/, $req->param('domsvc') ))[0] ); -$req->param('domuid',(split(/:/, $req->param('domuid') ))[0] ); - -my($new) = create FS::svc_acct_sm ( { - map { - ($_, scalar($req->param($_))); - } qw(svcnum pkgnum svcpart domuser domuid domsvc) -} ); - -my($error); -if ( $svcnum ) { - $error = $new->replace($old); -} else { - $error = $new->insert; - $svcnum = $new->getfield('svcnum'); -} - -unless ($error) { - $req->cgi->redirect("../../view/svc_acct_sm.cgi?$svcnum"); -} else { - CGI::Base::SendHeaders(); # one guess - print < - - Error adding/editing mail alias - - -

-

Error adding/editing mail alias

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and submit the form again. - - -END - -} - diff --git a/htdocs/edit/process/svc_domain.cgi b/htdocs/edit/process/svc_domain.cgi deleted file mode 100755 index 0782772dd..000000000 --- a/htdocs/edit/process/svc_domain.cgi +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/svc_domain.cgi: Add a domain (process form) -# -# Usage: post form to: -# http://server.name/path/svc_domain.cgi -# -# Note: Should br run setuid root as user nobody. -# -# lots of yucky stuff in this one... bleachlkjhui! -# -# ivan@voicenet.com 97-jan-6 -# -# kludged for new domain template 3.5 -# ivan@voicenet.com 97-jul-24 -# -# moved internic bits to svc_domain.pm ivan@sisd.com 98-mar-14 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::svc_domain; - -#remove this to actually test the domains! -$FS::svc_domain::whois_hack = 1; - -my($req) = new CGI::Request; -&cgisuidsetup($req->cgi); - -$req->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!"; -my($svcnum)=$1; - -my($new) = create FS::svc_domain ( { - map { - $_, $req->param($_); - } qw(svcnum pkgnum svcpart domain action purpose) -} ); - -my($error); -if ($req->param('legal') ne "Yes") { - $error = "Customer did not agree to be bound by NSI's ". - qq!!. - "Domain Name Resgistration Agreement"; -} elsif ($req->param('svcnum')) { - $error="Can't modify a domain!"; -} else { - $error=$new->insert; - $svcnum=$new->svcnum; -} - -unless ($error) { - $req->cgi->redirect("../../view/svc_domain.cgi?$svcnum"); -} else { - CGI::Base::SendHeaders(); # one guess - print < - - Error adding domain - - -

-

Error adding domain

-
- Your update did not occur because of the following error: -

$error -

Hit the Back button in your web browser, correct this mistake, and submit the form again. - - -END - -} - - diff --git a/htdocs/edit/svc_acct.cgi b/htdocs/edit/svc_acct.cgi deleted file mode 100755 index 61d0fdc28..000000000 --- a/htdocs/edit/svc_acct.cgi +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_acct.cgi: Add/edit account (output form) -# -# Usage: svc_acct.cgi {svcnum} | pkgnum{pkgnum}-svcpart{svcpart} -# http://server.name/path/svc_acct.cgi? {svcnum} | pkgnum{pkgnum}-svcpart{svcpart} -# -# Note: Should be run setuid freeside as user nobody -# -# ivan@voicenet.com 96-dec-18 -# -# rewrite ivan@sisd.com 98-mar-8 -# -# Changes to allow page to work at a relative position in server -# Changed 'password' to '_password' because Pg6.3 reserves the password word -# bmccane@maxbaud.net 98-apr-3 -# -# use conf/shells and dbdef username length ivan@sisd.com 98-jul-13 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup getotaker); -use FS::Record qw(qsearch qsearchs); -use FS::svc_acct qw(fields); - -my($shells)="/var/spool/freeside/conf/shells"; -open(SHELLS,$shells) or die "Can't open $shells: $!"; -my(@shells)=map { - /^([\/\w]*)$/ or die "Illegal shell in conf/shells!"; - $1; -} grep $_ !~ /^#/, ; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -my($action,$svcnum,$svc_acct,$pkgnum,$svcpart,$part_svc); - -if ( $QUERY_STRING =~ /^(\d+)$/ ) { #editing - - $svcnum=$1; - $svc_acct=qsearchs('svc_acct',{'svcnum'=>$svcnum}) - or die "Unknown (svc_acct) svcnum!"; - - my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}) - or die "Unknown (cust_svc) svcnum!"; - - $pkgnum=$cust_svc->pkgnum; - $svcpart=$cust_svc->svcpart; - - $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $action="Edit"; - -} else { #adding - - $svc_acct=create FS::svc_acct({}); - - foreach $_ (split(/-/,$QUERY_STRING)) { - $pkgnum=$1 if /^pkgnum(\d+)$/; - $svcpart=$1 if /^svcpart(\d+)$/; - } - $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $svcnum=''; - - #set gecos - my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - if ($cust_pkg) { - my($cust_main)=qsearchs('cust_main',{'custnum'=> $cust_pkg->custnum } ); - $svc_acct->setfield('finger', - $cust_main->getfield('first') . " " . $cust_main->getfield('last') - ) ; - } - - #set fixed and default fields from part_svc - my($field); - foreach $field ( fields('svc_acct') ) { - if ( $part_svc->getfield('svc_acct__'. $field. '_flag') ne '' ) { - $svc_acct->setfield($field,$part_svc->getfield('svc_acct__'. $field) ); - } - } - - $action="Add"; - -} - -my($svc)=$part_svc->getfield('svc'); - -my($otaker)=getotaker; - -my($username,$password)=( - $svc_acct->username, - $svc_acct->_password ? "*HIDDEN*" : '', -); - -my($ulen)=$svc_acct->dbdef_table->column('username')->length; -my($ulen2)=$ulen+2; - -SendHeaders(); -print < - - $action $svc account - - -

-

$action $svc account

-

- - - - -Username: - -
Password: - -(blank to generate) -END - -#pop -my($popnum)=$svc_acct->popnum || 0; -if ( $part_svc->svc_acct__popnum_flag eq "F" ) { - print qq!!; -} else { - print qq!
POP: "; -} - -my($uid,$gid,$finger,$dir)=( - $svc_acct->uid, - $svc_acct->gid, - $svc_acct->finger, - $svc_acct->dir, -); - -print < - -
GECOS: - -END - -my($shell)=$svc_acct->shell; -if ( $part_svc->svc_acct__shell_flag eq "F" ) { - print qq!!; -} else { - print qq!
Shell: "; -} - -my($quota,$slipip)=( - $svc_acct->quota, - $svc_acct->slipip, -); - -print qq!!; - -if ( $part_svc->svc_acct__slipip_flag eq "F" ) { - print qq!!; -} else { - print qq!
IP: !; -} - -#submit -print qq!

!; - -print < - - -END - - diff --git a/htdocs/edit/svc_acct_pop.cgi b/htdocs/edit/svc_acct_pop.cgi deleted file mode 100755 index 46d803f07..000000000 --- a/htdocs/edit/svc_acct_pop.cgi +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_acct_pop.cgi: Add/Edit pop (output form) -# -# ivan@sisd.com 98-mar-8 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# lose background, FS::CGI ivan@sisd.com 98-sep-2 - -use strict; -use CGI::Base; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::svc_acct_pop; -use FS::CGI qw(header menubar); - -my($cgi) = new CGI::Base; -$cgi->get; - -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($svc_acct_pop,$action); -if ( $cgi->var('QUERY_STRING') =~ /^(\d+)$/ ) { #editing - $svc_acct_pop=qsearchs('svc_acct_pop',{'popnum'=>$1}); - $action='Edit'; -} else { #adding - $svc_acct_pop=create FS::svc_acct_pop {}; - $action='Add'; -} -my($hashref)=$svc_acct_pop->hashref; - -print header("$action POP", menubar( - 'Main Menu' => '../', - 'View all POPs' => "../browse/svc_acct_pop.cgi", -)), < -END - -#display - -print qq!!, - "POP #", $hashref->{popnum} ? $hashref->{popnum} : "(NEW)"; - -print < -City -State -Area Code -Exchange - -END - -print qq!
!; - -print < - - -END - diff --git a/htdocs/edit/svc_acct_sm.cgi b/htdocs/edit/svc_acct_sm.cgi deleted file mode 100755 index 45a8eb8fc..000000000 --- a/htdocs/edit/svc_acct_sm.cgi +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_acct_sm.cgi: Add/edit a mail alias (output form) -# -# Usage: svc_acct_sm.cgi {svcnum} | pkgnum{pkgnum}-svcpart{svcpart} -# http://server.name/path/svc_acct_sm.cgi? {svcnum} | pkgnum{pkgnum}-svcpart{svcpart} -# -# use {svcnum} for edit, pkgnum{pkgnum}-svcpart{svcpart} for add -# -# Note: Should be run setuid freeside as user nobody. -# -# should error out in a more CGI-friendly way, and should have more error checking (sigh). -# -# ivan@voicenet.com 97-jan-5 -# -# added debugging code; fixed CPU-sucking problem with trying to edit an (unaudited) mail alias (no pkgnum) -# -# ivan@voicenet.com 97-may-7 -# -# fixed uid selection -# ivan@voicenet.com 97-jun-4 -# -# uid selection across _CUSTOMER_, not just _PACKAGE_ -# -# ( i need to be rewritten with fast searches) -# -# ivan@voicenet.com 97-oct-3 -# -# added fast searches in some of the places where it is sorely needed... -# I see DBI::mysql in your future... -# ivan@voicenet.com 97-oct-23 -# -# rewrite ivan@sisd.com 98-mar-15 -# -# /var/spool/freeside/conf/domain ivan@sisd.com 98-jul-26 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::svc_acct_sm qw(fields); - -my($conf_domain)="/var/spool/freeside/conf/domain"; -open(DOMAIN,$conf_domain) or die "Can't open $conf_domain: $!"; -my($mydomain)=map { - /^(.*)$/ or die "Illegal line in $conf_domain!"; #yes, we trust the file - $1 -} grep $_ !~ /^(#|$)/, ; -close DOMAIN; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -SendHeaders(); # one guess. - -my($action,$svcnum,$svc_acct_sm,$pkgnum,$svcpart,$part_svc); -if ( $QUERY_STRING =~ /^(\d+)$/ ) { #editing - - $svcnum=$1; - $svc_acct_sm=qsearchs('svc_acct_sm',{'svcnum'=>$svcnum}) - or die "Unknown (svc_acct_sm) svcnum!"; - - my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}) - or die "Unknown (cust_svc) svcnum!"; - - $pkgnum=$cust_svc->pkgnum; - $svcpart=$cust_svc->svcpart; - - $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $action="Edit"; - -} else { #adding - - $svc_acct_sm=create FS::svc_acct_sm({}); - - foreach $_ (split(/-/,$QUERY_STRING)) { #get & untaint pkgnum & svcpart - $pkgnum=$1 if /^pkgnum(\d+)$/; - $svcpart=$1 if /^svcpart(\d+)$/; - } - $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $svcnum=''; - - #set fixed and default fields from part_svc - my($field); - foreach $field ( fields('svc_acct_sm') ) { - if ( $part_svc->getfield('svc_acct_sm__'. $field. '_flag') ne '' ) { - $svc_acct_sm->setfield($field,$part_svc->getfield('svc_acct_sm__'. $field) ); - } - } - - $action='Add'; - -} - -my(%username,%domain); -if ($pkgnum) { - - #find all possible uids (and usernames) - - my($u_part_svc,@u_acct_svcparts); - foreach $u_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_acct'}) ) { - push @u_acct_svcparts,$u_part_svc->getfield('svcpart'); - } - - my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - my($custnum)=$cust_pkg->getfield('custnum'); - my($i_cust_pkg); - foreach $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) { - my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum'); - my($acct_svcpart); - foreach $acct_svcpart (@u_acct_svcparts) { #now find the corresponding - #record(s) in cust_svc ( for this - #pkgnum ! ) - my($i_cust_svc); - foreach $i_cust_svc ( qsearch('cust_svc',{'pkgnum'=>$cust_pkgnum,'svcpart'=>$acct_svcpart}) ) { - my($svc_acct)=qsearchs('svc_acct',{'svcnum'=>$i_cust_svc->getfield('svcnum')}); - $username{$svc_acct->getfield('uid')}=$svc_acct->getfield('username'); - } - } - } - - #find all possible domains (and domsvc's) - - my($d_part_svc,@d_acct_svcparts); - foreach $d_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_domain'}) ) { - push @d_acct_svcparts,$d_part_svc->getfield('svcpart'); - } - - foreach $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) { - my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum'); - my($acct_svcpart); - foreach $acct_svcpart (@d_acct_svcparts) { - my($i_cust_svc); - foreach $i_cust_svc ( qsearch('cust_svc',{'pkgnum'=>$cust_pkgnum,'svcpart'=>$acct_svcpart}) ) { - my($svc_domain)=qsearch('svc_domain',{'svcnum'=>$i_cust_svc->getfield('svcnum')}); - $domain{$svc_domain->getfield('svcnum')}=$svc_domain->getfield('domain'); - } - } - } - -} elsif ( $action eq 'Edit' ) { - - my($svc_acct)=qsearchs('svc_acct',{'uid'=>$svc_acct_sm->domuid}); - $username{$svc_acct_sm->uid} = $svc_acct->username; - - my($svc_domain)=qsearchs('svc_domain',{'svcnum'=>$svc_acct_sm->domsvc}); - $domain{$svc_acct_sm->domsvc} = $svc_domain->domain; - -} else { - die "\$action eq Add, but \$pkgnum is null!\n"; -} - -print < - - Mail Alias $action - - -
-

Mail Alias $action

-
- -END - -#display - - #formatting - print "
";
-
-#svcnum
-print qq!!;
-print qq!Service #!, $svcnum ? $svcnum : " (NEW)", "";
-
-#pkgnum
-print qq!!;
- 
-#svcpart
-print qq!!;
-
-my($domuser,$domsvc,$domuid)=(
-  $svc_acct_sm->domuser,
-  $svc_acct_sm->domsvc,
-  $svc_acct_sm->domuid,
-);
-
-#domuser
-print qq!\n\nMail to  ( * for anything )!;
-
-#domsvc
-print qq! \@ ";
-
-#uid
-print qq!\nforwards to \@$mydomain mailbox.";
-
-	#formatting
-	print "
\n"; - -print qq!
!; - -print < - - -END - diff --git a/htdocs/edit/svc_domain.cgi b/htdocs/edit/svc_domain.cgi deleted file mode 100755 index 0717a2c09..000000000 --- a/htdocs/edit/svc_domain.cgi +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_domain.cgi: Add domain (output form) -# -# Usage: svc_domain.cgi pkgnum{pkgnum}-svcpart{svcpart} -# http://server.name/path/svc_domain.cgi?pkgnum{pkgnum}-svcpart{svcpart} -# -# Note: Should be run setuid freeside as user nobody -# -# ivan@voicenet.com 97-jan-5 -> 97-jan-6 -# -# changes for domain template 3.5 -# ivan@voicenet.com 97-jul-24 -# -# rewrite ivan@sisd.com 98-mar-14 -# -# no GOV in instructions ivan@sisd.com 98-jul-17 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup getotaker); -use FS::Record qw(qsearch qsearchs); -use FS::svc_domain qw(fields); - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -my($action,$svcnum,$svc_domain,$pkgnum,$svcpart,$part_svc); - -if ( $QUERY_STRING =~ /^(\d+)$/ ) { #editing - - $svcnum=$1; - $svc_domain=qsearchs('svc_domain',{'svcnum'=>$svcnum}) - or die "Unknown (svc_domain) svcnum!"; - - my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}) - or die "Unknown (cust_svc) svcnum!"; - - $pkgnum=$cust_svc->pkgnum; - $svcpart=$cust_svc->svcpart; - - $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $action="Edit"; - -} else { #adding - - $svc_domain=create FS::svc_domain({}); - - foreach $_ (split(/-/,$QUERY_STRING)) { - $pkgnum=$1 if /^pkgnum(\d+)$/; - $svcpart=$1 if /^svcpart(\d+)$/; - } - $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $svcnum=''; - - #set fixed and default fields from part_svc - my($field); - foreach $field ( fields('svc_domain') ) { - if ( $part_svc->getfield('svc_domain__'. $field. '_flag') ne '' ) { - $svc_domain->setfield($field,$part_svc->getfield('svc_domain__'. $field) ); - } - } - - $action="Add"; - -} - -my($svc)=$part_svc->getfield('svc'); - -my($otaker)=getotaker; - -my($domain)=( - $svc_domain->domain, -); - -SendHeaders(); -print < - - $action $svc - - -
-

$action $svc

-

- - - - - New -
Transfer - -

Customer agrees to be bound by NSI's - -Domain Name Registration Agreement - -

Domain -
Purpose/Description: -

-
    -
  • COM is for commercial, for-profit organziations -
  • ORG is for miscellaneous, usually, non-profit organizations -
  • NET is for network infrastructure machines and organizations -
  • EDU is for 4-year, degree granting institutions - -
-US state and local government agencies, schools, libraries, museums, and individuals should register under the US domain. See RFC 1480 for a complete description of the US domain -and registration procedures. -

GOV registrations are limited to top-level US Federal Government agencies (see RFC 1816). - - - -END - diff --git a/htdocs/images/mid-logo.gif b/htdocs/images/mid-logo.gif deleted file mode 100644 index 4ceb3add5e74f89d7e96128e1f826c9b81a46279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10606 zcmeI&_fr$wA2;wVNp|U*5Fqq~A{`T&R81fvf?_}v1jJB8iUkBEz(qF&2m%@b1r#+1 zC>As*C>As*A~p=zz`_k;!EzP7dPT1n9=`MZ56@4}XI}H3{bkS0IXmZ^*)wO+;$Ux| z#9x3p_yYh?EC+C6Z3bY*utiD!MCX)y(Rvsp+nn&4#{){~2g# z>1${iXldzdna#F=w*PtD);ZAD`M7gd_pH(G?#JD;+4s1+Z?x}!-u4ZQ_6@up7#JOx z&Bt#a|Ig>gqi-LNejXitJ35^-|0_v>~MZ@Qresd&cwr_NJS==s`Qo7N2RpRc*igc>Jw1Eq7{}$+sI8 zpFMJKzjx02=eN!ty?=-;)-(_8XdP?{sdij_yW`k{qr9fj1EHPAADxIfoAKgy=ZPn$ zY4-$QtZcQ0&w4a917yx3j$1;n{6Kl+T?(1>T-T<_I!Ny#zCctKrYZq+6G$QuR0qCP z%2+$n2hS;Ron7QF_xP`tyt;4D&BfG0z8++DSC?9C+>t3wOpY85bqm~%)I#NfYQoRR7=%U}X5a9899T(JVE$KJVqXGou zh$Vb>u9P>111_}oo~^G}w_k(FG)$-w&EuBPUYN%$&xeG&ufc$vXQ5Mh%T{GzrMlDA50N?g7naSiaTChMkP62rIW@9&0 z26E<8Re?FJP&`Jn`t5|Bmt0JTu1bgLYq%*{6(X+tr<1#ltxz_6k>~>gz^>h_pur=? zGLx$5(51X->YeGk?FmK&b*9Fw^+pj#FX&QlP?RRGBwG9TRYqtvkHsVycD*Oc0sV)l z1TZp7KhxRZ%lD+keq!<{p@Bk_Mh1YcAP@YYG1clMZuX2=HW)-;<}xlUj84mA8LvXW zoY-#-s6;Qx-dXMJ02<~y+N_r{@lGF*`<_4-@eOIa-{0mLTEBTWXRSlCOx#PzXMH9$ z>CWA4WU5?3&{`O-a(iusMV4x-nZjI0`0$-)oO3@Mn7N+|lVU)COUE4JHMVK}6qbK8 zEFSK5N&Ie#lC}9bX=GV2xhSbs#y%qx>izc?)UO+z_;w@!384p1^IHL6 z8y$07?~+OwZxB*n7E@3@@iptZrrREoq5rzA?!9}EKtZ7NHy)^O59)l4o-6cbKzdU( z>?6Y>uPqL~5&IeBoy|Q%OoxI+8Ie~Ak$z+kUB-bkjd@wN@aSc}=ts}}ZC>nR*YH=G z?lB^2)wt)(>;7eUm=J)xF^hL=OQYR^nttX&EX1y)?DDm}uBjy5{!ffl`~hjscX+mg zELVM{lC+ulU`5-?oek1@-zofE8Dqm-npDfHK78<$SB(xB}GLcVqm$QL6A&A)GGa7ZF03gzk?-dg{2GOgeW?m}+IE=@QbT z3Hd#j;E9>2TA8wRc2NO1RY`KPz;npWQH8^*5UxzZd5`@lgj;_Oj z4)-&^9Bs6$n5!W!{qmvNxkXQ_*8O$sxEWP`T8dMFcO+r&v)WV+DG z=Iv+5&<)1I6%tqNu7~qMu`U--7>pOtS?c&#b?-TdlCHJ9LD_nDQmnn&p+`CY_WZfB zGoPFp5X?LDyJqF}JN|rN0o%y${KEkFuKTl~RS?lk4Zp<4nu`pgHt$vwcc+)ao?oxs zbX19*D%3GoOY#(j?2pRI@)af?Kj1Xa>{<>T+sdA#&u)3we^{)&7xeM%+-PpW-0 zQmXWc>hL)S9>N+wym>>~?j{FvPuwu>Z`NXp-*naCZfka&vQ{(aUT(t^vQDSsI8b(f z2fS$O1HNb@^$}&A)~0`JjQMKlM?yih=9NIJvrL#Q#g|4c2+4bF(R%JG*C#b7{Y! zKO5JI%D%p5!&zgLh0a%ldbtAe`xo+($CswRE26KPJeL=EKL_;+F#;oLV7JRKAJVPE zwJoZP#mndqG_xVCE14v>Ps7@&Oo=7$bBWhU#y`XNul)09T2gwlTNS+X-Dm!AOtM{V#w~)^etr`|hDgKbcfKiELFCcuq-pt)$Iah*&N* zXAtd~uuBN3!z)9IIc*XHHh)`McbOFfVmDfG#*}0uj+jr7lK{eGGRf(m2vTn%{=~}< zhrX?~C{`dF*uqS2>9S#xfQ?RDM7Sr(;rnCY@j;^H-*(kj>n*C{=kiK$7Mc$rlHsz5 zH0caNL0;P?(2`GG%SpA$GTjT#kuiLjE7swXI1XBM~K99iKdyCotSvRPS)juhlz=*uq5 zgFPLsd_p_rjzuXUm=8Gcs#$MB$?|!r0I~gsPuOHt2m{TPR~dDYvQ&bV0&=ko5p`9y zJs}k-$p5{u{hdvmI786q0YoL#29lUcXHSUU<;IEU8kF!5h67SSmsxVqb0K@$-j)zj zt?G?j*31LHL~{+lrs}-50C3~DMkKUs`vzd!vY%vO*7mI<1-ZD?gazBlLij4E`Zc&% z>4$LOE)n2@Gf#CIY-jG-k&iUSP(+iY-M6YX30C_m94v_LDVsmXULJ&FV+>N| zhydGB%&UEBhm0MiY?IZYBcwn0HJW4TB(-=+Gu)mG*s8Llr&;K!5mG)AO$F*lo{+Yx z>g*!W^r?O8)re_(ddV>?LIEX+?4CMck#s`yIjR__+L(p>sw>*8MpVbh6F>KzdP4eG zPu^cbOJNgy<@^LM6F?0{D7_XXk%Icca2C3qx$O_0u-u{6B|=V$-E+U59Hz83%L3oc zi#tgnHrN55y;s<(15@ds{K0Jd$VDkyAlv?^PCl1|zFT#8Wj#5Gof&5ZWxOH=;7%m= z`sI(fQXv}7hd-~RN`U%JOf(nYzFvV?{i1B;9acOcZO5BuH!Q5lBmsw}zS^<366sl{ zf$FWHgZobZAkoW&x%`99iKK1#zUkECr1eU~0+bN!p>I=$VN5)}YPo4f!_-^SA3&>9 zglu7K>zv!59U~X9 z(37zzlb(`Om69wa>3ha$o;_0c3rnHHJIBn~vb{z!g3H9(*u%>fMxey8Me5x*k9XsUxy5i7!235fk3L@{lj5cH}&16IOfKs7RNL z_7Id$buSBkaP~dc^M% z!AWiEjXCH~&Sxtimotg_OxRBaok`QTaV#9IEyN34Se z9grOnpjLrrja|6BQ(le8Mml1B0r~I?6S5KN1gYQ>wq1SpL3w#r)`iB1yiE^i2~}%+ zG7>cFWn5@cZ9|u`kk@V!@5Xx!fgg=9y8(Q8|vDNMWGc~zPi8I5h>CpOLL6f_{5W6 zSb|abU6vidNiR+>Sgu zPvR6}#q{pi>uWJ5Ys=-%RzNcS=HB)X1vzXb#Jc^jSv?v{HrjKQkd?=2N6-V<^9w}< zDony2&?+k5!W%@hN#{O*&dilT5e-N0PGeuVQ3^3)Fl6G;sdkMtWK2DvPG_3Xjg?jpAX210s$pFoCq{@RX3H99Xz&`Ieu9ip>D)KnSmR^&&}KN*Sr>U7zaEQ zAD>vgeOin3-P0ec9c#Y)L7zb!-*dIc2sC1X4+lUOHRPm%wgmzX^C)H7%`aVZ&s=<{ z+8J2cbHt0E7R4q;vWd~E)}X2d*0vNe|I?}SB!T)b$HBde=Xam^3tJ^OuTLe-{A-ys zW~XO4O(Aa=8r-KEX+QY=0&6_{W>YpXLN=-Kncz!@U6rnPyeM{?gzIr+d_X@{w#)p* zSM4#k$}z}A359;XG&vufJjf8(-#6_+7Ef0OpQ0AaYW`jS?XCFiwgK1S(b#48!Qjbp zvqqIiYdPn>zTD+r!hLKtb3I)R+E2n{;Jd4=A(mV|@$~ zUuNbZeC^p!%2hS~%14a1x0M~jqPAzyuTpTmVot_~MS}=srn7z*_U8#Kj0f4P&RKo= znK8RmtB_S|s51$DM>k>X=xY|J{=G8uZ{~X|gHVzx`nSrCB3mFeo+9Ndkb&tn#S%3# zu;9OkR}pg)*~@5j*$crE!Q{O|H^%B8*2bQ+!^%A60`+~jO}EF z-nkd0+l_~deqEh;ar5^M1j7kBZsLA5N1|cix+JDG+|-k78{Ql<_;O)|vGuRSVREAs zG2-qtTQw$vLC9)J7NC3`R!i9{Xnx1q72M#nD(7rX^ry;NKc_87|Q%Us7W&s^1){kkvm_BkP_g=#S zZt4D!vqyZFdtYlBU;Xlol4w7!KQKKy|ESr5r^!YI;|JGG4ksxmo@}Vuf$HP<(ty!n z#b;&3<1Vpm>>oDs=w#^MFN?{J4MNnKnR|FaNv~SQ=90er#i7`VuJ6(taU|@du!e%J zkqLrZ03pLeEz}5x8WHQA%p?srkq3OylH(E5YgiqXTu5Q-2Oy1w7cRAcg}JTM;WE*cs{5&|6+%k(6a9bvh$k&amgo7*8a> zn7m=+Pi&XV{L6)ZFLc}zl7828F1x4L_A(%D-+6h`AdX8oRvq_m|BX!9h9>88?$%~( zda<$Buo8s&2}&U~o^7?mr5_VZ?I%{J$$m{PRK?x;3c>0bY|>g=-Z(kVN+8 zc}M8-1VZtAmzAx$m6ms##^?QMe^1+KIzTPcW-eI`5p}I->|oF>>rraJ=3q=WeB^5# zw`lfI9w>eG9r7*i&9Xws{>&b&{RURt_wdNnhhrzm@#7mV-vzD#Zd$`~f|0}?`lvVy z_-_zvm+jy1^edX*c>S+u9Uay+B;kdeg6`p@GP8uKo?lH9sw)={9QtKp=k;7LUfH*2 zpZMERSt3!88Ks#9xb*A+w@rJFh5z#=ul|<-(P63yrlZ*$&hy6YzCWYaosoew0UaKK z+0m{Fkui;-`6!MaIPtggDOWM4?skajFS)b3s%-9hK)oCX2yPV_8eAL<%P7TBDM0k4 z8EB1_y3Q1Pl{PEnRReA;Ng{axLqzFi`HeVD|w zFD2prA(rTfk=Nzyl8wp`b49C+qeye;-JxUP$_uPP0nm7YLw(bNSp&jq5<}v+;HRP5 zn26D)8)G9hg&{5SQyyM1!+JZIVhxN5xwO)PY|e#=CmMHOeW+m?egSh?nWAIfpuK$J z+{x%Zc}~hOL`hOnK!JMa@JCeV!m%1Z=K*@L)YN>KGH_rjXP!5p9Qid)H0QDbFMBE3 z^_y#fl|=7Hl&0xq6g4;@C3G2>7T$Nk)IqAWHLDZybvKt7D+aVuV-A3!c%9U6qnNs< zKg|YRSiYXhNS(NT^6}ZF753GkPFWlRI)Ur-(zTMXAdMq=^XJ5~gXc=q?b44|FM7m@rHaAZ1^x`xv^+{deM#DLCWEQ&o3?#m?jdcP+LF z-i0-&k9)*nJxeG_C9cjK!jQX?5K5QW%lV15Ek_yr8%F-r!+QH&2C05-ODZb7_Ky@c za7v!s%YjNzNPz1!cVctBL4rO%s>v#Dg@mxzVLkdGCfW1i;XmeB-(J{j`Kxnx?{6== zJesa?Bz>ug^VnYG7DVRpA5wtCtE|6TBcEp(1@`WaGkmnJ@Xt8%Kl{S1)&txz-iN+1 zNv?*AJq~P45n1OFv{y-?O+8vC2QqBxj=nZDFQ~(U>}l5b0{W*Do@SN$=4KuCWi_Xq zDnsW2iLjvjE#;Kf=+OzHtNC5$?Co~*E9S>E!T!h^%E{hrS5V)0XO3(TaAk{0)jwlSP+M{i{NDeE z$!k4_z0&gZ!><~?c}GWQadLo3+;E~+JDAC;zb7m89PjPg=AD~1imfDF@v+XEI>PyM zl`sHuMTS@ZVjIvW)BQW8I2H){fTr^X5+5} zF1|XqDDuMX2`I1+@y%P*wLD{`)hoTt{0@`#-Ulr(UNEt)=YjTDPkN3V@cfXsh>$(@ z1CU``(z?=k|4nTA+^b`ds(mcrc>h=mc*-K?n%*4snAR|UJ|PW6_o^Y-TiI!Tdff%s zF|+R*<8|jMar3UPnHPqIdfHE%7OMOYI@x!iq}h{T)n;3Jwg+>Ppj3WZ`c142y{vj}j2@PMoEJ6fwBxzCMc`@;mg-IZm zV}C&ik|!Kj-qaB?C5~_LZ$mN=;mqsd7fiRn!6U9no>`T7Vdd5UvjSba?Hd?VKxyLN zHX|KBehkh1J39Jo&meuD45a7CoI0$yUJ6&*~kz)^p|XPEVQGv3HJxy`#yk0|C!<-23PI4bOkt z1%Hmy@jS6p{eGUC46@6D`Z9Zmnc_f7Qb@0YG?Z?={AbUx+^PyriPov_5^XSIMh) zr|MeAhzG_50EMtuCEPm<)LjcH_z1r*EdQVubJXGuje*y0i6|jLU3b8G!pwabBw)CX z466Os$5zSjD0c>`9i)oJ&?r4tKg6VqqIUq>tYLHIer-Th?0>uNc4Mic;=<&DJ~bRw zBR1`*cgMs(g9vs4TZ9SSh=KHEw&t=$3Y)WmGS1Fs)JwVZ5)+=E1wWVG{?ZSbvq4L_ z=x38?e-7|BOX>s&&)gB7etw5&b=PO=&c1zOe}G`;An~7oRd@E-cHz^yrnm;pcjO}3 z5N~xBv=luEyGO8bS6sEPvG&5nzLRiZ+HLBsy91M=OAP=uO}Ehxb(0EfFriE-1wT z?BK&WB18(<@wIKzc4|y5J5>n!JA+TGU=tdSFmM0to#RgH+LbyLTl*^R@1}V5k@n z$B4AMIxMp+uA?Ca-y0U05d!&&)D$)^Lk@Q1%xVUM*$Y4_8z1rC*q>PHs zUtGjtBuCdd>zu@9}Zec)6VZcc}E z0YHNf%{FKf19sf9?_|oh6Ikc zTb?^(A_`lWR|Xk71aa9S&>r6qM6ed%pj>#K&>-UPje7U&;f56ohZSVD?%fq-c`R68 zpe@bNx!xKrLER>R)jLc_*BXc|-K6$);TDyTEGEos*tCZ4qPV~DeDE_S9U&{Wgc|0g>GPi(nRb zDRPO40(|F^=-<8nHB}t-C`jB76~CM}mrXN5n=L|WJikxt+kYR+C%hYKaZ zAcSNA<#KD~Bvw`gMQ{H4W}H(t8KYW&SGFdFIrg+S}}MvWI4IqtnL&U(g5 zzgOHPGLj2dPQPiAK$njh-|Po2eHH1%2)E?#jLPd<&XhimJC!*5%^R!F8^t^+I`Z67 ze##}SpS9a=*uGs{vc^$)uDQx_w>?OyoS-}oEi1=Me{w7P65N?0qdJ^c_f!_1z9%7l z@5c1nZRvG8)9VkW?>m*g|4MqpK>C5v^n;($4^5}bbu$_*G7h_DG|hjH1AyQE0h?GU A8vpB2v_#(W*sGf>8l!Pqb($7hPznr7b-T9?q%9PPy0fXWZ}SZ>_!8UVHDg_PY4k z@KxDIfs?==0KjuDDy=eF9!xMeFD6OLRH>$3&$M)o5RwB#4|xcip&bdOBEni=_KA~#2G z>>p)1^^B`K)2L-KGD9QPOk`9{td_ZHocYIG<_^88!Z`6_hB;i?(qZYjHljM&mzdU) zpVy;pvt)kM!pt+J6~?Fp?cAF=bwgijMho+7RJf>ARb?C*o=8m6&ipbL8m87Z_A&pS zD?MzS7@vuXRu>ia1c#{l-a|VInUm_NUuJUm>6w(&;4l^Q%}C#!(b4fKW_c)6SmYg| z>bWv9`ecf^(!+RqGi@zQPA(H2!}Ry*J1m(wEzCb=v<-ck?{QyDsA`RgDcY!5b>G0K zWq3m0IWqT-DJnCzv{^=;Ohv6#GZiZ1wNZD^Qf;%PsJKVyTFTh-m|FGJ>$%*#9wzC% zo@!=zMBQjf{YXFeZ^n3Ml=)?b>F!~gTbMh2%=iTJj$s^UQ&n$9hKFSPzkGnQ1CP6#%W^Uru3{zH`zptmX%*Z$k znY2_UER-oOVtl=s9l1wl6WI zB`Q|iH!xuto@!|uDJnJs|4%OXzdZk&1pu7~_Mq-@2A#PQ6$EAu8rttw6J7}|alIY) z>s(gkO$_#)e|UwwS}Jyv-GXKG+vEcYBsVNtkHR^1O+lB!|H}MX{sY+QNk#77 zHI50uqyXG3UOpnTBQHELfgMC(hWbkF%#3)bsyVEw=BfWvAP)B^EV=s|QMthZ4vPp7 zKiU10IViW*{lQ?xX)$^!&)UuNPHDagCuQx}|ICD^VWUu&rWGga{n^M)h*-hIQ=^snR$Yvx!_wkfd<+00Gg2ik6VRNb- zRv!Z_a$~L0Ns%!3O@oW!I2!arcl$~TIL`~JOL?u)l(4KwQxSBONm#UiK4=V#JxboDLFP^`Ku3=$!#k z0L;5J5q&Q({4I1muqj4KxD9OHejn?4n=`zjd-PS+l6}4~%q{DAf)EfvJ_>=Ey6&z zLHGSYeHFj4=oOCmO;eQH5C0*nm(Dtcw&gnHS~+e_;zzhI6#4~$?8%e>Zf6S`U_Y0x z0gjt&lBAcYUYZi@A;8QDX{L0bJ=@7qjZ@6H6sfnQ#34uFAJ&OvnFWn^VHq9In=6(N zFLo?a)-BEpPDKU5leTJij!;`GUNH)+TiC5H&k{vUo1#S*7iey6aDEJNAeJ)S zUXPC6kdn>r+uR}ZER5}!_!<#zoBv1)O^q?H9i(@WObc_AM(m=jS! zqGNuj>=D-e?xhq_?jn)b{tKW7_E~U;475G`nD#iX=ry@W6I0QJO^O^TUMCo)YH1{* z{L+?VF46_O*_x`CU%mUB$`n;^38h)CZ$VcvTqQA@-~>~<@Zx4k za=r+rm2vzEQJv^Pj!WUBg;S=u5#2Hnm;$mq1MAs=cVX zg@N(5^$}{P5Q)WW381jb)1WrBo zoDI~&ni&&3-!ciu%D=AE1Lz8uSfMVZ=3q{TFksr`L6h>6!8vG#d_WjSKgKGe36C>_ zL>%!1OUZ%j6mbqJGq}`pk#%U44#W!(=fMuA7+1_IT2!-POpZB?NjEHjYGC2hF7K=w z#8qAwF(HB?r`P-D$!l2e16Qc%jC)`>7Fm;nJN3noYj^R*W1`xf9)J(8KK0nHXed~B zUmX6JbIzSDaA^vPe;a7V1IzK%E_*hZsBw>AnouZUJofRomcYhdUco%*tClp`TPuM6 z8puAk`)U8U6&CpiLMw>)e%ZRL7G*vaEx+Erz)I1 zL6%db+w%=GI??J9RzMr~`Km~W%?*f!VO_bK{( zB$`I9T!!no*V>$7UOJmStL(}qt9Ua*-gW-hlbs|Qf^@dZJ{%|#RIq%717OKsn(zCV zyLH;M)EA5K@(YJ5g28XE_{c(>3UQPm9gphLmsPYcJ`H%D6YAkoBxU1fznf3(o>AVL zL6zs+?{I(Iy`i|m$N1U`%SzO8;lytnw;bsP_ZVcYORboyAQv6GGUgTNUy5yiRCJa7XEOOcdRwS6HP8*NdH?#Y{vKv$BiQSfDJq0HNO2r+WdB;p##?Saa;0ie;8~RR0Zde)_YZ&ek$F{=#o?m$e&Cey zb}brRu|94P8V{!f#BW8%3?}l0hJMyDfyovOdK`Y~zqLi-vP=&8?&^J0-g5-_Jnj$5 zxmUFaF?u>vpwqm%a9!VX^2)SDyw8iyR!-W>O!vKA%MOGjT7SeA4(wi$g34MZCfmls zqc_`FZLOYmjgxHqG_g8G*w5i=O1Nc9>pd8^ALn9gf=X8A z->VzaB<-Y<1kv@T;@O+*LkPTI0l$0#7)TbD!p#-%>ulI5BL=_aOKGTc!6%qT37PSG z8rV?*G#j`a+p2o;8h&zG_!PFpw9~r)wIO?at!4k1Ww~0hR@(b0f!)xtvV?pUfTvhC zG{iX43Is)WMKlq|2)3huS875E0VLiKdcQh%lQ*7fW!J6>uThrDyDHf)@wQHm^f8!D zm9CyVma1i+QJ`5Asush}Voqr|M{PjE_%(m~qpZpK7%Jk5w#x&(dx4~nN%fGfb7*kR`i5f$4W79FOp!|B**bSVX7%i zpl~m`3R%WE)R=QdT!p;^9TcvR81s{>coOvL+5HDhZ0ZJ4V<-v?`_z%*bz4D>JjG(g zJ{5logB;U?11ueUMzaI!MYn2l&gqCxN!|^T7fG;C6GmuQ(F(Q$0d^bYyk0csf<{<` zjinREO-Fa0DGh%!4~3B2T_$`t#a$bY8EmW*lbj&xFwV#Qw@5MpHnHx|l?(93okW0= z?MQ8cl2??`taO0;g%Wq&fl9YX&Kt@hGrD*>L!dmweu?C#aB_6uRU2?o=d`$x{l5>1 z|J*wB_!t{aM*o7dKGz&f7nj_$a$BwVU*7_*0P8nCf1CJ}^fr6irQW)-9!rM(#Ml=K zuA>GIrg-@PSSUV9B%>$e&k80r9Dei850P@^(u3yZ*G+*JNN%`zqhL0#C_-{+Hz6+B zk-LS6(Ln)9$y1RY4EljMad`ENF#%TN$fANuFCy(#c%1cY0ZP!qt-)nu>i z<*v`=kN?yVaZ$_R9}rIMWsA;-$DBvo@wRlHagzJ)B@!V`caflf57n;NNo2%JUhf7~ zGBo_4lsrs0$RUH6wO8&%kYK+Rt3Jdx9&b1$Poe2@VazAKv3ROYBB!-ZQ}C-eg0evl z1UJ&g>X$>U8c3A&o2zJ4>^-G7$2*NH}O%p|WT~ z!MR6bpaSde;ETjvPFi4_jT3S>?F>arHEM1|;qA}bm(bF7@uyN6+^6)AE>sDH!O*YPIF-Mjm*`(0o%V60g%S`f?QQYq( zYd)h&F*AxCl6Dkmx20s;N$y53Y|O6u{MR z3%i<}C$?$M?#)vpFL9%ewVwon4r;lv+q8xmv55=#!5{p++R^RjlAUbD&IEMcV6?@v-=z}wyEkkhAbsjpI}lz&L{gLIVI35& zf!YEbRRsPn4&Q7n=^Qd-7|InuPpumi269|q2h@bVMcQ0D5K|+4Ul5`3F zBpT;0J40V)_o8f|JH>d*oeOQ(vD`^^B*6{L29Hm|x^CEWUfe1OtwcZ$TVV|M#*dqN zp=9`dRm0XjL6XcR6uyP%N&K^O;@7*Yim*zu-=~TbLS`=o(IW)9p1`-#nH{>g-*-a= zs|jZV_U6y6T2AyO#oq#!!3qUfZ9tBQQIWX#gMlKoo*rmY^O51S=~Au)vQ?D1$Jhk4DEDvfGdZiFrLHXpN2a=kevAkWicA zu0SU_N1|Ec9M@zt9EfRBe0Es}ehI)1K1l09w~Fhm8k)VChN>sGFES7Jo3bugIV)|* zMg^Yn60+~|TiwDRYuffe%xxuDYe}M+25u-|!UUHA$PFvdUos*nU>C?(BRR2`OhCvJ z4)+YlM~=UE9QZsr+iU1+p$HzJc%1P*2z&aYZ zLULgx^`(w`U+5K<#kc=)rK=bzBf#sw9z5*@kIgP#X2sjSd+PKO`BXWaMthVQIH(fI z`19Ol1%816)|kNNAD;=zS%C^xvyL_C6Lvv|`ze7 z{t;-I0&6iPZrMNd)n&m30Q4Yvjz{E*J~WBt-t+kD?eNbbSl{L+s|LE Yc`=ps;`PxN)2%Olx% - - - Freeside Main Menu - - - - - -
-

- Silicon Interactive Software Design -

-
freeside main menu
-
- - Information - -
- Documentation - -

-
-

New Customer

-

Search

- -
  • - customers (by last name and/or company) - -
  • customers (by credit card number) -
  • accounts (by username) -
  • domains (by domain) -
  • mail aliases (by domain, and optionally username) -
  • invoices (by invoice number) -
  • -

    Browse

    - -
  • customers (by customer number) -
  • customers (by last name) -
  • customers (by company) -
  • packages (by package number) -
  • packages with unconfigured services (by package number) -
  • accounts (by service number) -
  • accounts (by username) -
  • accounts (by uid) -
  • unlinked accounts (by service number) -
  • unlinked accounts (by username) -
  • unlinked accounts (by uid) -
  • domains (by service number) -
  • domains (by domain) -
  • unlinked domains (by service number) -
  • unlinked domains (by domain) -
  • -

    Administration

    - -
  • - View/Edit services - - - Services are items you offer to your customers. -
  • - View/Edit packages - - - One or more services are grouped together into a package and - given pricing information. Customers purchase packages, not - services. -
  • - View/Edit agent types - - - Agent types define groups of packages that you can then assign - to particular agents. -
  • - View/Edit agents - - - Agents are resellers of your service. Agents may be limited - to a subset of your full offerings (via their agent type). -
    -
  • - View/Edit referrals - - - Where a customer heard about your service. Tracked for - informational purposes. -
    -
  • - View/Edit locales and tax rates - - - Change tax rates by state, or break down a state into counties - and assign different tax rates to each county. -
    -
  • - View/Edit POPs - - - Points of Presence -
  • - - - diff --git a/htdocs/misc/bill.cgi b/htdocs/misc/bill.cgi deleted file mode 100755 index d41f6d1c9..000000000 --- a/htdocs/misc/bill.cgi +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl -Tw -# -# s/FS:Search/FS::Record/ and cgisuidsetup($cgi) ivan@sisd.com 98-mar-13 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::Bill; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint custnum -$QUERY_STRING =~ /^(\d*)$/; -my($custnum)=$1; -my($cust_main)=qsearchs('cust_main',{'custnum'=>$custnum}); -die "Can't find customer!\n" unless $cust_main; - -# ? -bless($cust_main,"FS::Bill"); - -my($error); - -$error = $cust_main->bill( -# 'time'=>$time - ); -&idiot($error) if $error; - -$error = $cust_main->collect( -# 'invoice-time'=>$time, -# 'batch_card'=> 'yes', - 'batch_card'=> 'no', - 'report_badcard'=> 'yes', - ); -&idiot($error) if $error; - -$cgi->redirect("../view/cust_main.cgi?$custnum#history"); - -sub idiot { - my($error)=@_; - CGI::Base::SendHeaders(); # one guess - print < - - Error billing customer - - -
    -

    Error billing customer

    -
    - Your update did not occur because of the following error: -

    $error - - -END - - exit; - -} - diff --git a/htdocs/misc/cancel-unaudited.cgi b/htdocs/misc/cancel-unaudited.cgi deleted file mode 100755 index 929274f38..000000000 --- a/htdocs/misc/cancel-unaudited.cgi +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cancel-unaudited.cgi: Cancel an unaudited account -# -# Usage: cancel-unaudited.cgi svcnum -# http://server.name/path/cancel-unaudited.cgi pkgnum -# -# Note: Should be run setuid freeside as user nobody -# -# ivan@voicenet.com 97-apr-23 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-21 -# -# Search->Record, cgisuidsetup($cgi) ivan@sids.com 98-mar-19 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::cust_svc; -use FS::svc_acct; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint svcnum -$QUERY_STRING =~ /^(\d+)$/; -my($svcnum)=$1; - -my($svc_acct) = qsearchs('svc_acct',{'svcnum'=>$svcnum}); -&idiot("Unknown svcnum!") unless $svc_acct; - -my($cust_svc) = qsearchs('cust_svc',{'svcnum'=>$svcnum}); -&idiot(qq!This account has already been audited. Cancel the - package instead.!) - if $cust_svc->getfield('pkgnum') ne ''; - -local $SIG{HUP} = 'IGNORE'; -local $SIG{INT} = 'IGNORE'; -local $SIG{QUIT} = 'IGNORE'; -local $SIG{TERM} = 'IGNORE'; -local $SIG{TSTP} = 'IGNORE'; - -my($error); - -bless($svc_acct,"FS::svc_acct"); -$error = $svc_acct->cancel; -&idiot($error) if $error; -$error = $svc_acct->delete; -&idiot($error) if $error; - -bless($cust_svc,"FS::cust_svc"); -$error = $cust_svc->delete; -&idiot($error) if $error; - -$cgi->redirect("../"); - -sub idiot { - my($error)=@_; - SendHeaders(); - print < - - Error cancelling account - - -

    -

    Error cancelling account

    -
    -
    - There has been an error cancelling this acocunt: $error - - - -END - exit; -} - diff --git a/htdocs/misc/cancel_pkg.cgi b/htdocs/misc/cancel_pkg.cgi deleted file mode 100755 index 6702a0351..000000000 --- a/htdocs/misc/cancel_pkg.cgi +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cancel_pkg.cgi: Cancel a package -# -# Usage: cancel_pkg.cgi pkgnum -# http://server.name/path/cancel_pkg.cgi pkgnum -# -# Note: Should be run setuid freeside as user nobody -# -# IT DOESN'T RUN THE APPROPRIATE PROGRAMS YET!!!! -# -# probably should generalize this to do cancels, suspensions, unsuspensions, etc. -# -# ivan@voicenet.com 97-jan-2 -# -# still kludgy, but now runs /dbin/cancel $pkgnum -# ivan@voicenet.com 97-feb-27 -# -# doesn't run if pkgnum doesn't match regex -# ivan@voicenet.com 97-mar-6 -# -# now redirects to enter comments -# ivan@voicenet.com 97-may-8 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-21 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::cust_pkg; -use FS::CGI qw(idiot); - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint pkgnum -$QUERY_STRING =~ /^(\d+)$/ || die "Illegal pkgnum"; -my($pkgnum)=$1; - -my($cust_pkg) = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - -bless($cust_pkg,'FS::cust_pkg'); -my($error)=$cust_pkg->cancel; -idiot($error) if $error; - -$cgi->redirect("../view/cust_main.cgi?".$cust_pkg->getfield('custnum')); - diff --git a/htdocs/misc/expire_pkg.cgi b/htdocs/misc/expire_pkg.cgi deleted file mode 100755 index 163516627..000000000 --- a/htdocs/misc/expire_pkg.cgi +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/perl -Tw -# -# expire_pkg.cgi: Expire a package -# -# Usage: post form to: -# http://server.name/path/expire_pkg.cgi -# -# Note: Should be run setuid freeside as user nobody -# -# based on susp_pkg -# ivan@voicenet.com 97-jul-29 -# -# ivan@sisd.com 98-mar-17 FS::Search->FS::Record -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use Date::Parse; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::cust_pkg; - -my($req) = new CGI::Request; -&cgisuidsetup($req->cgi); - -#untaint date & pkgnum - -my($date); -if ( $req->param('date') ) { - str2time($req->param('date')) =~ /^(\d+)$/ or die "Illegal date"; - $date=$1; -} else { - $date=''; -} - -$req->param('pkgnum') =~ /^(\d+)$/ or die "Illegal pkgnum"; -my($pkgnum)=$1; - -my($cust_pkg) = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); -my(%hash)=$cust_pkg->hash; -$hash{expire}=$date; -my($new)=create FS::cust_pkg ( \%hash ); -my($error) = $new->replace($cust_pkg); -&idiot($error) if $error; - -$req->cgi->redirect("../view/cust_main.cgi?".$cust_pkg->getfield('custnum')); - -sub idiot { - my($error)=@_; - SendHeaders(); - print < - - Error expiring package - - -
    -

    Error expiring package

    -
    -
    - There has been an error expiring this package: $error - - - -END - exit; -} - diff --git a/htdocs/misc/link.cgi b/htdocs/misc/link.cgi deleted file mode 100755 index d1db000ec..000000000 --- a/htdocs/misc/link.cgi +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/perl -Tw -# -# link: instead of adding a new account, link to an existing. (output form) -# -# Note: Should be run setuid freeside as user nobody -# -# ivan@voicenet.com 97-feb-5 -# -# rewrite ivan@sisd.com 98-mar-17 -# -# can also link on some other fields now (about time) ivan@sisd.com 98-jun-24 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); - -my(%link_field)=( - 'svc_acct' => 'username', - 'svc_domain' => 'domain', - 'svc_acct_sm' => '', - 'svc_charge' => '', - 'svc_wo' => '', -); - -my($cgi) = new CGI::Base; -$cgi->get; -cgisuidsetup($cgi); - -my($pkgnum,$svcpart); -foreach $_ (split(/-/,$QUERY_STRING)) { #get & untaint pkgnum & svcpart - $pkgnum=$1 if /^pkgnum(\d+)$/; - $svcpart=$1 if /^svcpart(\d+)$/; -} - -my($part_svc) = qsearchs('part_svc',{'svcpart'=>$svcpart}); -my($svc) = $part_svc->getfield('svc'); -my($svcdb) = $part_svc->getfield('svcdb'); -my($link_field) = $link_field{$svcdb}; - -CGI::Base::SendHeaders(); -print < - - Link to existing $svc account - - -
    -

    Link to existing $svc account

    -

    -
    -END - -if ( $link_field ) { - print < - - $link_field of existing service: -END -} else { - print qq!Service # of existing service: !; -} - -print < - -

    - - - -END - diff --git a/htdocs/misc/print-invoice.cgi b/htdocs/misc/print-invoice.cgi deleted file mode 100755 index 084dcc1c4..000000000 --- a/htdocs/misc/print-invoice.cgi +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/perl -Tw -# -# just a kludge for now, since this duplicates in a way it shouldn't stuff from -# Bill.pm (like $lpr) ivan@sisd.com 98-jun-16 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::Invoice; - -my($lpr) = "|lpr -h"; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint invnum -$QUERY_STRING =~ /^(\d*)$/; -my($invnum)=$1; -my($cust_bill)=qsearchs('cust_bill',{'invnum'=>$invnum}); -die "Can't find invoice!\n" unless $cust_bill; - - bless($cust_bill,"FS::Invoice"); - open(LPR,$lpr) or die "Can't open $lpr: $!"; - print LPR $cust_bill->print_text; #( date ) - close LPR - or die $! ? "Error closing $lpr: $!" - : "Exit status $? from $lpr"; - -my($custnum)=$cust_bill->getfield('custnum'); - -$cgi->redirect("../view/cust_main.cgi?$custnum#history"); - -sub idiot { - my($error)=@_; - CGI::Base::SendHeaders(); # one guess - print < - - Error printing invoice - - -
    -

    Error printing invoice

    -
    - Your update did not occur because of the following error: -

    $error - - -END - - exit; - -} - diff --git a/htdocs/misc/process/link.cgi b/htdocs/misc/process/link.cgi deleted file mode 100755 index 23fb05386..000000000 --- a/htdocs/misc/process/link.cgi +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/link.cgi: link to existing customer (process form) -# -# ivan@voicenet.com 97-feb-5 -# -# rewrite ivan@sisd.com 98-mar-18 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# can also link on some other fields now (about time) ivan@sisd.com 98-jun-24 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::CGI qw(idiot); -use FS::UID qw(cgisuidsetup); -use FS::cust_svc; -use FS::Record qw(qsearchs); - -my($req)=new CGI::Request; # create form object -cgisuidsetup($req->cgi); - -#$req->import_names('R'); #import CGI variables into package 'R'; - -$req->param('pkgnum') =~ /^(\d+)$/; my($pkgnum)=$1; -$req->param('svcpart') =~ /^(\d+)$/; my($svcpart)=$1; - -$req->param('svcnum') =~ /^(\d*)$/; my($svcnum)=$1; -unless ( $svcnum ) { - my($part_svc) = qsearchs('part_svc',{'svcpart'=>$svcpart}); - my($svcdb) = $part_svc->getfield('svcdb'); - $req->param('link_field') =~ /^(\w+)$/; my($link_field)=$1; - my($svc_acct)=qsearchs($svcdb,{$link_field => $req->param('link_value') }); - idiot("$link_field not found!") unless $svc_acct; - $svcnum=$svc_acct->svcnum; -} - -my($old)=qsearchs('cust_svc',{'svcnum'=>$svcnum}); -die "svcnum not found!" unless $old; -my($new)=create FS::cust_svc ({ - 'svcnum' => $svcnum, - 'pkgnum' => $pkgnum, - 'svcpart' => $svcpart, -}); - -my($error); -$error = $new->replace($old); - -unless ($error) { - #no errors, so let's view this customer. - $req->cgi->redirect("../../view/cust_pkg.cgi?$pkgnum"); -} else { - CGI::Base::SendHeaders(); # one guess - print < - - Error - - -

    -

    Error

    -
    - Your update did not occur because of the following error: -

    $error -

    Hit the Back button in your web browser, correct this mistake, and submit the form again. - - -END - -} - diff --git a/htdocs/misc/susp_pkg.cgi b/htdocs/misc/susp_pkg.cgi deleted file mode 100755 index 7b23caeb2..000000000 --- a/htdocs/misc/susp_pkg.cgi +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/perl -Tw -# -# susp_pkg.cgi: Suspend a package -# -# Usage: susp_pkg.cgi pkgnum -# http://server.name/path/susp_pkg.cgi pkgnum -# -# Note: Should be run setuid freeside as user nobody -# -# probably should generalize this to do cancels, suspensions, unsuspensions, etc. -# -# ivan@voicenet.com 97-feb-27 -# -# now redirects to enter comments -# ivan@voicenet.com 97-may-8 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-21 -# -# FS::Search -> FS::Record ivan@sisd.com 98-mar-17 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::cust_pkg; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint pkgnum -$QUERY_STRING =~ /^(\d+)$/ || die "Illegal pkgnum"; -my($pkgnum)=$1; - -my($cust_pkg) = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - -bless($cust_pkg,'FS::cust_pkg'); -my($error)=$cust_pkg->suspend; -&idiot($error) if $error; - -$cgi->redirect("../view/cust_main.cgi?".$cust_pkg->getfield('custnum')); - -sub idiot { - my($error)=@_; - SendHeaders(); - print < - - Error suspending package - - -

    -

    Error suspending package

    -
    -
    - There has been an error suspending this package: $error - - - -END - exit; -} - diff --git a/htdocs/misc/unsusp_pkg.cgi b/htdocs/misc/unsusp_pkg.cgi deleted file mode 100755 index 2f340c6fa..000000000 --- a/htdocs/misc/unsusp_pkg.cgi +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/perl -Tw -# -# susp_pkg.cgi: Unsuspend a package -# -# Usage: susp_pkg.cgi pkgnum -# http://server.name/path/susp_pkg.cgi pkgnum -# -# Note: Should be run setuid freeside as user nobody -# -# probably should generalize this to do cancels, suspensions, unsuspensions, etc. -# -# ivan@voicenet.com 97-feb-27 -# -# now redirects to enter comments -# ivan@voicenet.com 97-may-8 -# -# rewrote for new API -# ivan@voicenet.com 97-jul-21 -# -# FS::Search -> FS::Record ivan@sisd.com 98-mar-17 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::cust_pkg; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint pkgnum -$QUERY_STRING =~ /^(\d+)$/ || die "Illegal pkgnum"; -my($pkgnum)=$1; - -my($cust_pkg) = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - -bless($cust_pkg,'FS::cust_pkg'); -my($error)=$cust_pkg->unsuspend; -&idiot($error) if $error; - -$cgi->redirect("../view/cust_main.cgi?".$cust_pkg->getfield('custnum')); - -sub idiot { - my($error)=@_; - SendHeaders(); - print < - - Error unsuspending package - - -
    -

    Error unsuspending package

    -
    -
    - There has been an error unsuspending this package: $error - - - -END - exit; -} - diff --git a/htdocs/search/cust_bill.cgi b/htdocs/search/cust_bill.cgi deleted file mode 100755 index 5be84b79e..000000000 --- a/htdocs/search/cust_bill.cgi +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_bill.cgi: Search for invoices (process form) -# -# Usage: post form to: -# http://server.name/path/cust_bill.cgi -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 97-apr-4 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); - -my($req)=new CGI::Request; -cgisuidsetup($req->cgi); - -$req->param('invnum') =~ /^\s*(FS-)?(\d+)\s*$/; -my($invnum)=$2; - -if ( qsearchs('cust_bill',{'invnum'=>$invnum}) ) { - $req->cgi->redirect("../view/cust_bill.cgi?$invnum"); #redirect -} else { #error - CGI::Base::SendHeaders(); # one guess - print < - - Invoice Search Error - - -
    -

    Invoice Search Error

    -
    - Invoice not found. -
    - - -END - -} - diff --git a/htdocs/search/cust_bill.html b/htdocs/search/cust_bill.html deleted file mode 100755 index 4adb40e4a..000000000 --- a/htdocs/search/cust_bill.html +++ /dev/null @@ -1,21 +0,0 @@ - - - Invoice Search - - -
    -

    Invoice Search

    -
    -
    -
    - Search for invoice #: - - -

    - -

    - -
    - - - diff --git a/htdocs/search/cust_main-payinfo.html b/htdocs/search/cust_main-payinfo.html deleted file mode 100755 index 92341ad13..000000000 --- a/htdocs/search/cust_main-payinfo.html +++ /dev/null @@ -1,21 +0,0 @@ - - - Customer Search - - -
    -

    Customer Search

    -
    -
    -
    - Search for Credit card #: - - - -

    - -

    -
    - - - diff --git a/htdocs/search/cust_main.cgi b/htdocs/search/cust_main.cgi deleted file mode 100755 index 70ce991f7..000000000 --- a/htdocs/search/cust_main.cgi +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/perl -Tw -# -# process/cust_main.cgi: Search for customers (process form) -# -# Usage: post form to: -# http://server.name/path/cust_main.cgi -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 96-dec-12 -# -# rewrite ivan@sisd.com 98-mar-4 -# -# now does browsing too ivan@sisd.com 98-mar-6 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# display total, use FS::CGI ivan@sisd.com 98-jul-17 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use IO::Handle; -use IPC::Open2; -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header idiot); - -my($fuzziness)=2; #fuzziness for fuzzy searches, see man agrep - #0-4: 0=no fuzz, 4=very fuzzy (too much fuzz!) - -my($req)=new CGI::Request; -&cgisuidsetup($req->cgi); - -my(@cust_main); -my($sortby); - -my($query)=$req->cgi->var('QUERY_STRING'); -if ( $query eq 'custnum' ) { - $sortby=\*custnum_sort; - @cust_main=qsearch('cust_main',{}); -} elsif ( $query eq 'last' ) { - $sortby=\*last_sort; - @cust_main=qsearch('cust_main',{}); -} elsif ( $query eq 'company' ) { - $sortby=\*company_sort; - @cust_main=qsearch('cust_main',{}); -} else { - &cardsearch if ($req->param('card_on') ); - &lastsearch if ($req->param('last_on') ); - &companysearch if ($req->param('company_on') ); -} - -if ( scalar(@cust_main) == 1 ) { - $req->cgi->redirect("../view/cust_main.cgi?". $cust_main[0]->custnum); - exit; -} elsif ( scalar(@cust_main) == 0 ) { - idiot "No matching customers found!\n"; - exit; -} else { - - my($total)=scalar(@cust_main); - CGI::Base::SendHeaders(); # one guess - print header("Customer Search Results",''), < - - Cust. # - Contact name - Company - -END - - my($lines)=16; - my($lcount)=$lines; - my(%saw,$cust_main); - foreach $cust_main ( - sort $sortby grep(!$saw{$_->custnum}++, @cust_main) - ) { - my($custnum,$last,$first,$company)=( - $cust_main->custnum, - $cust_main->getfield('last'), - $cust_main->getfield('first'), - $cust_main->company, - ); - print < - $custnum - $last, $first - $company - -END - if ($lcount-- == 0) { # lots of little tables instead of one big one - $lcount=$lines; - print < - - - - - -END - } - } - - print < - - - -END - -} - -# - -sub last_sort { - $a->getfield('last') cmp $b->getfield('last'); -} - -sub company_sort { - $a->getfield('company') cmp $b->getfield('company'); -} - -sub custnum_sort { - $a->getfield('custnum') <=> $b->getfield('custnum'); -} - -sub cardsearch { - - my($card)=$req->param('card'); - $card =~ s/\D//g; - $card =~ /^(\d{13,16})$/ or do { idiot "Illegal card number\n"; exit; }; - my($payinfo)=$1; - - push @cust_main, qsearch('cust_main',{'payinfo'=>$payinfo, 'payby'=>'CARD'}); - -} - -sub lastsearch { - my(%last_type); - foreach ( $req->param('last_type') ) { - $last_type{$_}++; - } - - $req->param('last_text') =~ /^([\w \,\.\-\']*)$/ - or do { idiot "Illegal last name"; exit; }; - my($last)=$1; - - if ( $last_type{'Exact'} - && ! $last_type{'Fuzzy'} - # && ! $last_type{'Sound-alike'} - ) { - - push @cust_main, qsearch('cust_main',{'last'=>$last}); - - } else { - - my(%last); - - my(@all_last)=map $_->getfield('last'), qsearch('cust_main',{}); - if ($last_type{'Fuzzy'}) { - my($reader,$writer) = ( new IO::Handle, new IO::Handle ); - open2($reader,$writer,'agrep',"-$fuzziness",'-i','-k', - substr($last,0,30)); - print $writer join("\n",@all_last),"\n"; - close $writer; - while (<$reader>) { - chop; - $last{$_}++; - } - close $reader; - } - - #if ($last_type{'Sound-alike'}) { - #} - - foreach ( keys %last ) { - push @cust_main, qsearch('cust_main',{'last'=>$_}); - } - - } - $sortby=\*last_sort; -} - -sub companysearch { - - my(%company_type); - foreach ( $req->param('company_type') ) { - $company_type{$_}++ - }; - - $req->param('company_text') =~ /^([\w \,\.\-\']*)$/ - or do { idiot "Illegal company"; exit; }; - my($company)=$1; - - if ( $company_type{'Exact'} - && ! $company_type{'Fuzzy'} - # && ! $company_type{'Sound-alike'} - ) { - - push @cust_main, qsearch('cust_main',{'company'=>$company}); - - } else { - - my(%company); - my(@all_company)=map $_->company, qsearch('cust_main',{}); - - if ($company_type{'Fuzzy'}) { - my($reader,$writer) = ( new IO::Handle, new IO::Handle ); - open2($reader,$writer,'agrep',"-$fuzziness",'-i','-k', - substr($company,0,30)); - print $writer join("\n",@all_company),"\n"; - close $writer; - while (<$reader>) { - chop; - $company{$_}++; - } - close $reader; - } - - #if ($company_type{'Sound-alike'}) { - #} - - foreach ( keys %company ) { - push @cust_main, qsearch('cust_main',{'company'=>$_}); - } - - } - $sortby=\*company_sort; - -} diff --git a/htdocs/search/cust_main.html b/htdocs/search/cust_main.html deleted file mode 100755 index 656943f9c..000000000 --- a/htdocs/search/cust_main.html +++ /dev/null @@ -1,36 +0,0 @@ - - - Customer Search - - -
    -

    Customer Search

    -
    -
    -
    - Search for last name: - - using search method(s): - -

    Search for company: - - using search methods(s): - -

    Note: Fuzzy searching can take a while. Please be patient. - - - -


    Explanation of search methods: -
      -
    • Fuzzy - Searches for matches that are close to your text. -
    • Exact - Finds exact matches only, but much faster than the other search methods. -
    - - - diff --git a/htdocs/search/cust_pkg.cgi b/htdocs/search/cust_pkg.cgi deleted file mode 100755 index 967068f5e..000000000 --- a/htdocs/search/cust_pkg.cgi +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_pkg.cgi: search/browse for packages -# -# based on search/svc_acct.cgi ivan@sisd.com 98-jul-17 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header idiot); - -my($req)=new CGI::Request; -&cgisuidsetup($req->cgi); - -my(@cust_pkg,$sortby); - -my($query)=$req->cgi->var('QUERY_STRING'); -#this tree is a little bit redundant -if ( $query eq 'pkgnum' ) { - $sortby=\*pkgnum_sort; - @cust_pkg=qsearch('cust_pkg',{}); -} elsif ( $query eq 'APKG_pkgnum' ) { - $sortby=\*pkgnum_sort; - - #perhaps this should go in cust_pkg as a qsearch-like constructor? - my($cust_pkg); - foreach $cust_pkg (qsearch('cust_pkg',{})) { - my($flag)=0; - my($pkg_svc); - PKG_SVC: - foreach $pkg_svc (qsearch('pkg_svc',{ 'pkgpart' => $cust_pkg->pkgpart })) { - if ( $pkg_svc->quantity - > scalar(qsearch('cust_svc',{ - 'pkgnum' => $cust_pkg->pkgnum, - 'svcpart' => $pkg_svc->svcpart, - })) - ) - { - $flag=1; - last PKG_SVC; - } - } - push @cust_pkg, $cust_pkg if $flag; - } -} else { - die "Empty QUERY_STRING!"; -} - -if ( scalar(@cust_pkg) == 1 ) { - my($pkgnum)=$cust_pkg[0]->pkgnum; - $req->cgi->redirect("../view/cust_pkg.cgi?$pkgnum"); - exit; -} elsif ( scalar(@cust_pkg) == 0 ) { #error - &idiot("No packages found"); - exit; -} else { - my($total)=scalar(@cust_pkg); - CGI::Base::SendHeaders(); # one guess - print header('Package Search Results',''), < -
    - - - - - -END - - my($lines)=16; - my($lcount)=$lines; - my(%saw,$cust_pkg); - foreach $cust_pkg ( - sort $sortby grep(!$saw{$_->pkgnum}++, @cust_pkg) - ) { - my($cust_main)=qsearchs('cust_main',{'custnum'=>$cust_pkg->custnum}); - my($pkgnum,$custnum,$name,$company)=( - $cust_pkg->pkgnum, - $cust_main->custnum, - $cust_main->last. ', '. $cust_main->first, - $cust_main->company, - ); - print < - - - - - -END - if ($lcount-- == 0) { # lots of little tables instead of one big one - $lcount=$lines; - print < -
    Cust. #Contact nameCompany -
    Package #Customer #NameCompany
    $pkgnum$custnum$name$company
    - - - - - - -END - } - } - - print < - - - -END - exit; - -} - -sub pkgnum_sort { - $a->getfield('pkgnum') <=> $b->getfield('pkgnum'); -} - diff --git a/htdocs/search/svc_acct.cgi b/htdocs/search/svc_acct.cgi deleted file mode 100755 index 250a741db..000000000 --- a/htdocs/search/svc_acct.cgi +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_acct.cgi: Search for customers (process form) -# -# Usage: post form to: -# http://server.name/path/svc_acct.cgi -# -# Note: Should be run setuid freeside as user nobody. -# -# loosely (sp?) based on search/cust_main.cgi -# -# ivan@voicenet.com 96-jan-3 -> 96-jan-4 -# -# rewrite (now does browsing too) ivan@sisd.com 98-mar-9 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# show unlinked accounts ivan@sisd.com 98-jun-22 -# -# use FS::CGI, show total ivan@sisd.com 98-jul-17 -# -# give service and customer info too ivan@sisd.com 98-aug-16 - -use strict; -use CGI::Request; # form processing module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header idiot); - -my($req)=new CGI::Request; # create form object -&cgisuidsetup($req->cgi); - -my(@svc_acct,$sortby); - -my($query)=$req->cgi->var('QUERY_STRING'); -#this tree is a little bit redundant -if ( $query eq 'svcnum' ) { - $sortby=\*svcnum_sort; - @svc_acct=qsearch('svc_acct',{}); -} elsif ( $query eq 'username' ) { - $sortby=\*username_sort; - @svc_acct=qsearch('svc_acct',{}); -} elsif ( $query eq 'uid' ) { - $sortby=\*uid_sort; - @svc_acct=grep $_->uid ne '', qsearch('svc_acct',{}); -} elsif ( $query eq 'UN_svcnum' ) { - $sortby=\*svcnum_sort; - @svc_acct = grep qsearchs('cust_svc',{ - 'svcnum' => $_->svcnum, - 'pkgnum' => '', - }), qsearch('svc_acct',{}); -} elsif ( $query eq 'UN_username' ) { - $sortby=\*username_sort; - @svc_acct = grep qsearchs('cust_svc',{ - 'svcnum' => $_->svcnum, - 'pkgnum' => '', - }), qsearch('svc_acct',{}); -} elsif ( $query eq 'UN_uid' ) { - $sortby=\*uid_sort; - @svc_acct = grep qsearchs('cust_svc',{ - 'svcnum' => $_->svcnum, - 'pkgnum' => '', - }), qsearch('svc_acct',{}); -} else { - &usernamesearch; -} - -if ( scalar(@svc_acct) == 1 ) { - my($svcnum)=$svc_acct[0]->svcnum; - $req->cgi->redirect("../view/svc_acct.cgi?$svcnum"); #redirect - exit; -} elsif ( scalar(@svc_acct) == 0 ) { #error - idiot("Account not found"); - exit; -} else { - my($total)=scalar(@svc_acct); - CGI::Base::SendHeaders(); # one guess - print header("Account Search Results",''), < - - - - - - - - - -END - - my($lines)=16; - my($lcount)=$lines; - my(%saw,$svc_acct); - foreach $svc_acct ( - sort $sortby grep(!$saw{$_->svcnum}++, @svc_acct) - ) { - my $cust_svc = qsearchs('cust_svc', { 'svcnum' => $svc_acct->svcnum }) - or die "No cust_svc record for svcnum ". $svc_acct->svcnum; - my $part_svc = qsearchs('part_svc', { 'svcpart' => $cust_svc->svcpart }) - or die "No part_svc record for svcpart ". $cust_svc->svcpart; - my($cust_pkg,$cust_main); - if ( $cust_svc->pkgnum ) { - $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $cust_svc->pkgnum }) - or die "No cust_pkg record for pkgnum ". $cust_svc->pkgnum; - $cust_main = qsearchs('cust_main', { 'custnum' => $cust_pkg->custnum }) - or die "No cust_main record for custnum ". $cust_pkg->custnum; - } - my($svcnum,$username,$uid,$svc,$custnum,$last,$first,$company)=( - $svc_acct->svcnum, - $svc_acct->getfield('username'), - $svc_acct->getfield('uid'), - $part_svc->svc, - $cust_svc->pkgnum ? $cust_main->custnum : '', - $cust_svc->pkgnum ? $cust_main->getfield('last') : '', - $cust_svc->pkgnum ? $cust_main->getfield('first') : '', - $cust_svc->pkgnum ? $cust_main->company : '', - ); - my($pcustnum) = $custnum - ? "$custnum" - : "(unlinked)" - ; - my($pname) = $custnum ? "$last, $first" : ''; - print < - - - - -END - if ($lcount-- == 0) { # lots of little tables instead of one big one - $lcount=$lines; - print < -
    Package #Customer #NameCompany -
    Service #UsernameUIDServiceCustomer #Contact nameCompany
    $svcnum$username$uid$svc - $pcustnum - $pname - $company -
    - - - - - - - - - -END - } - } - - print < - - - -END - exit; - -} - -sub svcnum_sort { - $a->getfield('svcnum') <=> $b->getfield('svcnum'); -} - -sub username_sort { - $a->getfield('username') cmp $b->getfield('username'); -} - -sub uid_sort { - $a->getfield('uid') <=> $b->getfield('uid'); -} - -sub usernamesearch { - - $req->param('username') =~ /^([\w\d\-]{2,8})$/; #untaint username_text - my($username)=$1; - - @svc_acct=qsearch('svc_acct',{'username'=>$username}); - -} - - diff --git a/htdocs/search/svc_acct.html b/htdocs/search/svc_acct.html deleted file mode 100755 index 91291be99..000000000 --- a/htdocs/search/svc_acct.html +++ /dev/null @@ -1,21 +0,0 @@ - - - Account Search - - -
    -

    Account Search

    -
    -
    -
    - Search for username: - - -

    - - - -


    - - - diff --git a/htdocs/search/svc_acct_sm.cgi b/htdocs/search/svc_acct_sm.cgi deleted file mode 100755 index 3b1a4cf4e..000000000 --- a/htdocs/search/svc_acct_sm.cgi +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_acct_sm.cgi: Search for domains (process form) -# -# Usage: post form to: -# http://server.name/path/svc_domain.cgi -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 96-mar-5 -# -# need to look at table in results to make it more readable -# -# ivan@voicenet.com -# -# rewrite ivan@sisd.com 98-mar-15 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); - -my($conf_domain)="/var/spool/freeside/conf/domain"; -open(DOMAIN,$conf_domain) or die "Can't open $conf_domain: $!"; -my($mydomain)=map { - /^(.*)$/ or die "Illegal line in $conf_domain!"; #yes, we trust the file - $1 -} grep $_ !~ /^(#|$)/, ; -close DOMAIN; - -my($req)=new CGI::Request; # create form object -&cgisuidsetup($req->cgi); - -$req->param('domuser') =~ /^([a-z0-9_\-]{0,32})$/; -my($domuser)=$1; - -$req->param('domain') =~ /^([\w\-\.]+)$/ or die "Illegal domain"; -my($svc_domain)=qsearchs('svc_domain',{'domain'=>$1}) - or die "Unknown domain"; -my($domsvc)=$svc_domain->svcnum; - -my(@svc_acct_sm); -if ($domuser) { - @svc_acct_sm=qsearch('svc_acct_sm',{ - 'domuser' => $domuser, - 'domsvc' => $domsvc, - }); -} else { - @svc_acct_sm=qsearch('svc_acct_sm',{'domsvc' => $domsvc}); -} - -if ( scalar(@svc_acct_sm) == 1 ) { - my($svcnum)=$svc_acct_sm[0]->svcnum; - $req->cgi->redirect("../view/svc_acct_sm.cgi?$svcnum"); #redirect -} elsif ( scalar(@svc_acct_sm) > 1 ) { - CGI::Base::SendHeaders(); - print < - - Mail Alias Search Results - - -
    -

    Mail Alias Search Results

    -
    Service #UserameUIDServiceCustomer #Contact nameCompany
    - - - - -END - - my($svc_acct_sm); - foreach $svc_acct_sm (@svc_acct_sm) { - my($svcnum,$domuser,$domuid,$domsvc)=( - $svc_acct_sm->svcnum, - $svc_acct_sm->domuser, - $svc_acct_sm->domuid, - $svc_acct_sm->domsvc, - ); - my($svc_domain)=qsearchs('svc_domain',{'svcnum'=>$domsvc}); - my($domain)=$svc_domain->domain; - my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid}); - my($username)=$svc_acct->username; - my($svc_acct_svcnum)=$svc_acct->svcnum; - - print <\n \n -\n \n -END - - } - - print < - - - -END - -} else { #error - CGI::Base::SendHeaders(); # one guess - print < - - Mail Alias Search Error - - -
    -

    Mail Alias Search Error

    -
    - Mail Alias not found. -
    - - -END - -} - diff --git a/htdocs/search/svc_acct_sm.html b/htdocs/search/svc_acct_sm.html deleted file mode 100755 index 0719856db..000000000 --- a/htdocs/search/svc_acct_sm.html +++ /dev/null @@ -1,23 +0,0 @@ - - - Mail Alias Search - - -
    -

    Mail Alias Search

    -
    -
    -
    - Search for mail alias: - (opt.) @ - (req.) - -

    - - - -


    - - - - diff --git a/htdocs/search/svc_domain.cgi b/htdocs/search/svc_domain.cgi deleted file mode 100755 index d5277037b..000000000 --- a/htdocs/search/svc_domain.cgi +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/perl -Tw -# -# svc_domain.cgi: Search for domains (process form) -# -# Usage: post form to: -# http://server.name/path/svc_domain.cgi -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 97-mar-5 -# -# rewrite ivan@sisd.com 98-mar-14 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# display total, use FS::CGI now does browsing too ivan@sisd.com 98-jul-17 - -use strict; -use CGI::Request; -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); -use FS::CGI qw(header idiot); - -my($req)=new CGI::Request; -&cgisuidsetup($req->cgi); - -my(@svc_domain); -my($sortby); - -my($query)=$req->cgi->var('QUERY_STRING'); -if ( $query eq 'svcnum' ) { - $sortby=\*svcnum_sort; - @svc_domain=qsearch('svc_domain',{}); -} elsif ( $query eq 'domain' ) { - $sortby=\*domain_sort; - @svc_domain=qsearch('svc_domain',{}); -} elsif ( $query eq 'UN_svcnum' ) { - $sortby=\*svcnum_sort; - @svc_domain = grep qsearchs('cust_svc',{ - 'svcnum' => $_->svcnum, - 'pkgnum' => '', - }), qsearch('svc_domain',{}); -} elsif ( $query eq 'UN_domain' ) { - $sortby=\*domain_sort; - @svc_domain = grep qsearchs('cust_svc',{ - 'svcnum' => $_->svcnum, - 'pkgnum' => '', - }), qsearch('svc_domain',{}); -} else { - $req->param('domain') =~ /^([\w\-\.]+)$/; - my($domain)=$1; - push @svc_domain, qsearchs('svc_domain',{'domain'=>$domain}); -} - -if ( scalar(@svc_domain) == 1 ) { - $req->cgi->redirect("../view/svc_domain.cgi?". $svc_domain[0]->svcnum); - exit; -} elsif ( scalar(@svc_domain) == 0 ) { - idiot "No matching domains found!\n"; - exit; -} else { - CGI::Base::SendHeaders(); # one guess - - my($total)=scalar(@svc_domain); - CGI::Base::SendHeaders(); # one guess - print header("Domain Search Results",''), < -
    - - - - -END - - my($lines)=16; - my($lcount)=$lines; - my(%saw,$svc_domain); - foreach $svc_domain ( - sort $sortby grep(!$saw{$_->svcnum}++, @svc_domain) - ) { - my($svcnum,$domain)=( - $svc_domain->svcnum, - $svc_domain->domain, - ); - my($malias); - if ( qsearch('svc_acct_sm',{'domsvc'=>$svcnum}) ) { - $malias=( - qq||. - qq||. - qq||. - qq||. - qq|| - ); - } else { - $malias=''; - } - print < - - - - -END - if ($lcount-- == 0) { # lots of little tables instead of one big one - $lcount=$lines; - print < -
    Mail to
    (click here to view mail alias)
    Forwards to
    (click here to view account)
    -END - - print '', ( ($domuser eq '*') ? "(anything)" : $domuser ); - - print < $username\@$mydomain
    Service #Domain
    $svcnum$domain$malias
    - - - - - -END - } - } - - print < - - - -END - -} - -sub svcnum_sort { - $a->getfield('svcnum') <=> $b->getfield('svcnum'); -} - -sub domain_sort { - $a->getfield('domain') cmp $b->getfield('doimain'); -} - - diff --git a/htdocs/search/svc_domain.html b/htdocs/search/svc_domain.html deleted file mode 100755 index 533743ba2..000000000 --- a/htdocs/search/svc_domain.html +++ /dev/null @@ -1,22 +0,0 @@ - - - Domain Search - - -
    -

    Domain Search

    -
    -
    -
    - Search for domain: - - -

    - - - -


    - - - - diff --git a/htdocs/view/cust_bill.cgi b/htdocs/view/cust_bill.cgi deleted file mode 100755 index 96101d004..000000000 --- a/htdocs/view/cust_bill.cgi +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/perl -Tw -# -# Usage: cust_bill.cgi invnum -# http://server.name/path/cust_bill.cgi?invnum -# -# Note: Should be run setuid freeside as user nobody. -# -# this is a quick & ugly hack which does little more than add some formatting to the ascii output from /dbin/print-invoice -# -# ivan@voicenet.com 96-dec-05 -# -# added navigation bar -# ivan@voicenet.com 97-jan-30 -# -# now uses Invoice.pm -# ivan@voicenet.com 97-jun-30 -# -# what to do if cust_bill search errors? -# ivan@voicenet.com 97-jul-7 -# -# s/FS::Search/FS::Record/; $cgisuidsetup($cgi); ivan@sisd.com 98-mar-14 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# also print 'printed' field ivan@sisd.com 98-jul-10 - -use strict; -use IO::File; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); -use FS::Invoice; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint invnum -$QUERY_STRING =~ /^(\d+)$/; -my($invnum)=$1; - -my($cust_bill) = qsearchs('cust_bill',{'invnum'=>$invnum}); -die "Invoice #$invnum not found!" unless $cust_bill; -my($custnum) = $cust_bill->getfield('custnum'); - -my($printed) = $cust_bill->printed; - -SendHeaders(); # one guess. -print < - - Invoice View - - -
    -

    Invoice View

    - View this customer (#$custnum) | Main menu -

    - -
    - Enter payments (check/cash) against this invoice -
    Reprint this invoice -

    (Printed $printed times) -
    -
    -END
    -
    -bless($cust_bill,"FS::Invoice");
    -print $cust_bill->print_text;
    -
    -	#formatting
    -	print <
    -  
    -
    -END
    -
    diff --git a/htdocs/view/cust_main.cgi b/htdocs/view/cust_main.cgi
    deleted file mode 100755
    index ca5fcd94f..000000000
    --- a/htdocs/view/cust_main.cgi
    +++ /dev/null
    @@ -1,336 +0,0 @@
    -#!/usr/bin/perl -Tw
    -#
    -# cust_main.cgi: View a customer
    -#
    -# Usage: cust_main.cgi custnum
    -#        http://server.name/path/cust_main.cgi?custnum
    -#
    -# Note: Should be run setuid freeside as user nobody.
    -#
    -# the payment history section could use some work, see below
    -# 
    -# ivan@voicenet.com 96-nov-29 -> 96-dec-11
    -#
    -# added navigation bar (go to main menu ;)
    -# ivan@voicenet.com 97-jan-30
    -#
    -# changes to the way credits/payments are applied (the links are here).
    -# ivan@voicenet.com 97-apr-21
    -#
    -# added debugging code to diagnose CPU sucking problem.
    -# ivan@voicenet.com 97-may-19
    -#
    -# CPU sucking problem was in comment code?  fixed?
    -# ivan@voicenet.com 97-may-22
    -#
    -# rewrote for new API
    -# ivan@voicenet.com 97-jul-22
    -#
    -# Changes to allow page to work at a relative position in server
    -# Changed 'day' to 'daytime' because Pg6.3 reserves the day word
    -#       bmccane@maxbaud.net     98-apr-3
    -#
    -# lose background, FS::CGI ivan@sisd.com 98-sep-2
    -
    -use strict;
    -use CGI::Base qw(:DEFAULT :CGI); # CGI module
    -use CGI::Carp qw(fatalsToBrowser);
    -use Date::Format;
    -use FS::UID qw(cgisuidsetup);
    -use FS::Record qw(qsearchs qsearch);
    -use FS::CGI qw(header menubar);
    -
    -my($cgi) = new CGI::Base;
    -$cgi->get;
    -&cgisuidsetup($cgi);
    -
    -SendHeaders(); # one guess.
    -print header("Customer View", menubar(
    -  'Main Menu' => '../',
    -)),<
    -END
    -
    -#untaint custnum & get customer record
    -$QUERY_STRING =~ /^(\d+)$/;
    -my($custnum)=$1;
    -my($cust_main)=qsearchs('cust_main',{'custnum'=>$custnum});
    -die "Customer not found!" unless $cust_main;
    -my($hashref)=$cust_main->hashref;
    -
    -#custnum
    -print "
    Customer #$custnum
    ", - qq!
    Customer Information | !, - qq!Comments | !, - qq!Packages | !, - qq!Payment History
    !; - -#bill now linke -print qq!
    !, - qq!Bill this customer now
    !; - -#formatting -print qq!
    Customer Information!, - qq!!, - qq!
    Edit this information
    !; - -#agentnum -my($agent)=qsearchs('agent',{ - 'agentnum' => $cust_main->getfield('agentnum') -} ); -die "Agent not found!" unless $agent; -print "
    Agent #" , $agent->getfield('agentnum') , ": " , - $agent->getfield('agent') , ""; - -#refnum -my($referral)=qsearchs('part_referral',{'refnum' => $cust_main->refnum}); -die "Referral not found!" unless $referral; -print "
    Referral #", $referral->refnum, ": ", - $referral->referral, "<\B>"; - -#last, first -print "

    ", $hashref->{'last'}, ", ", $hashref->{first}, ""; - -#ss -print " (SS# ", $hashref->{ss}, ")" if $hashref->{ss}; - -#company -print "
    ", $hashref->{company}, "" if $hashref->{company}; - -#address1 -print "
    ", $hashref->{address1}, ""; - -#address2 -print "
    ", $hashref->{address2}, "" if $hashref->{address2}; - -#city -print "
    ", $hashref->{city}, ""; - -#county -print " (", $hashref->{county}, " county)" if $hashref->{county}; - -#state -print ",", $hashref->{state}, ""; - -#zip -print " ", $hashref->{zip}, ""; - -#country -print "
    ", $hashref->{country}, "" - unless $hashref->{country} eq "US"; - -#daytime -print "

    ", $hashref->{daytime}, "" if $hashref->{daytime}; -print " (Day)" if $hashref->{daytime} && $hashref->{night}; - -#night -print "
    ", $hashref->{night}, "" if $hashref->{night}; -print " (Night)" if $hashref->{daytime} && $hashref->{night}; - -#fax -print "
    ", $hashref->{fax}, " (Fax)" if $hashref->{fax}; - -#payby/payinfo/paydate/payname -if ($hashref->{payby} eq "CARD") { - print "

    Card #", $hashref->{payinfo}, " Exp. ", - $hashref->{paydate}, ""; - print " (", $hashref->{payname}, ")" if $hashref->{payname}; -} elsif ($hashref->{payby} eq "BILL") { - print "

    Bill"; - print " on P.O. #", $hashref->{payinfo}, "" - if $hashref->{payinfo}; - print " until ", $hashref->{paydate}, "" - if $hashref->{paydate}; - print " to ", $hashref->{payname}, " at above address" - if $hashref->{payname}; -} elsif ($hashref->{payby} eq "COMP") { - print "

    Access complimentary"; - print " courtesy of ", $hashref->{payinfo}, "" - if $hashref->{payinfo}; - print " until ", $hashref->{paydate}, "" - if $hashref->{paydate}; -} else { - print "Unknown payment type ", $hashref->{payby}, "!"; -} - -#tax -print "
    (Tax exempt)" if $hashref->{tax}; - -#otaker -print "

    Order taken by ", $hashref->{otaker}, ""; - -#formatting -print qq!


    Packages!, - qq!
    Click on package number to view/edit package.!, - qq!
    Add/Edit packages!, - qq!

    !; - -#display packages - -#formatting -print qq!
    Service #Domain
    \n!, - qq!\n!, - qq!!, - qq!!, - qq!\n!; - -#get package info -my(@packages)=qsearch('cust_pkg',{'custnum'=>$custnum}); -my($package); -foreach $package (@packages) { - my($pref)=$package->hashref; - my($part_pkg)=qsearchs('part_pkg',{ - 'pkgpart' => $pref->{pkgpart} - } ); - print qq!!, - "", - "", - "", - "", - "", - "", - ""; -} - -#formatting -print "
    #Package!, - qq!Dates
    Setup!, - qq!Next bill!, - qq!Susp.Expire!, - qq!Cancel
    !, - $pref->{pkgnum}, qq!", $part_pkg->getfield('pkg'), " - ", - $part_pkg->getfield('comment'), "", - $pref->{setup} ? time2str("%D",$pref->{setup} ) : "" , - "", - $pref->{bill} ? time2str("%D",$pref->{bill} ) : "" , - "", - $pref->{susp} ? time2str("%D",$pref->{susp} ) : "" , - "", - $pref->{expire} ? time2str("%D",$pref->{expire} ) : "" , - "", - $pref->{cancel} ? time2str("%D",$pref->{cancel} ) : "" , - "
    "; - -#formatting -print qq!

    Payment History!, - qq!
    !, - qq!Click on invoice to view invoice/enter payment.
    !, - qq!!, - qq!Post Credit / Refund

    !; - -#get payment history -# -# major problem: this whole thing is way too sloppy. -# minor problem: the description lines need better formatting. - -my(@history); - -my(@bills)=qsearch('cust_bill',{'custnum'=>$custnum}); -my($bill); -foreach $bill (@bills) { - my($bref)=$bill->hashref; - push @history, - $bref->{_date} . qq!\tInvoice #! . $bref->{invnum} . - qq! (Balance \$! . $bref->{owed} . qq!)\t! . - $bref->{charged} . qq!\t\t\t!; - - my(@payments)=qsearch('cust_pay',{'invnum'=> $bref->{invnum} } ); - my($payment); - foreach $payment (@payments) { -# my($pref)=$payment->hashref; - my($date,$invnum,$payby,$payinfo,$paid)=($payment->getfield('_date'), - $payment->getfield('invnum'), - $payment->getfield('payby'), - $payment->getfield('payinfo'), - $payment->getfield('paid'), - ); - push @history, - "$date\tPayment, Invoice #$invnum ($payby $payinfo)\t\t$paid\t\t"; - } -} - -my(@credits)=qsearch('cust_credit',{'custnum'=>$custnum}); -my($credit); -foreach $credit (@credits) { - my($cref)=$credit->hashref; - push @history, - $cref->{_date} . "\tCredit #" . $cref->{crednum} . ", (Balance \$" . - $cref->{credited} . ") by " . $cref->{otaker} . " - " . - $cref->{reason} . "\t\t\t" . $cref->{amount} . "\t"; - - my(@refunds)=qsearch('cust_refund',{'crednum'=> $cref->{crednum} } ); - my($refund); - foreach $refund (@refunds) { - my($rref)=$refund->hashref; - push @history, - $rref->{_date} . "\tRefund, Credit #" . $rref->{crednum} . " (" . - $rref->{payby} . " " . $rref->{payinfo} . ") by " . - $rref->{otaker} . " - ". $rref->{reason} . "\t\t\t\t" . - $rref->{refund}; - } -} - - #formatting - print < - - - - - - - - - -END - -#display payment history - -my($balance)=0; -my($item); -foreach $item (sort keyfield_numerically @history) { - my($date,$desc,$charge,$payment,$credit,$refund)=split(/\t/,$item); - $charge ||= 0; - $payment ||= 0; - $credit ||= 0; - $refund ||= 0; - $balance += $charge - $payment; - $balance -= $credit - $refund; - - print "", - "", - "", - "", - "", - "", - "", - "\n"; -} - -#formatting -print "
    DateDescriptionChargePaymentIn-house
    Credit
    RefundBalance
    ",time2str("%D",$date),"$desc", - ( $charge ? "\$".sprintf("%.2f",$charge) : '' ), - "", - ( $payment ? "- \$".sprintf("%.2f",$payment) : '' ), - "", - ( $credit ? "- \$".sprintf("%.2f",$credit) : '' ), - "", - ( $refund ? "\$".sprintf("%.2f",$refund) : '' ), - "\$" . sprintf("%.2f",$balance), - "
    "; - -#end - -#formatting -print < - -END - -#subroutiens -sub keyfield_numerically { (split(/\t/,$a))[0] <=> (split(/\t/,$b))[0] ; } - diff --git a/htdocs/view/cust_pkg.cgi b/htdocs/view/cust_pkg.cgi deleted file mode 100755 index 04e38326a..000000000 --- a/htdocs/view/cust_pkg.cgi +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/perl -Tw -# -# cust_pkg.cgi: View a package -# -# Usage: cust_pkg.cgi pkgnum -# http://server.name/path/cust_pkg.cgi?pkgnum -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 96-dec-15 -# -# services section needs to be cleaned up, needs to display extraneous -# entries in cust_pkg! -# ivan@voicenet.com 96-dec-31 -# -# added navigation bar -# ivan@voicenet.com 97-jan-30 -# -# changed and fixed up suspension and cancel stuff, now you can't add -# services to a cancelled package -# ivan@voicenet.com 97-feb-27 -# -# rewrote for new API, still needs to be cleaned up! -# ivan@voicenet.com 97-jul-29 -# -# no FS::Search ivan@sisd.com 98-mar-7 - -use strict; -use Date::Format; -use CGI::Base qw(:DEFAULT :CGI); # CGI module -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearch qsearchs); - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -my(%uiview,%uiadd); -my($part_svc); -foreach $part_svc ( qsearch('part_svc',{}) ) { - $uiview{$part_svc->svcpart}="../view/". $part_svc->svcdb . ".cgi"; - $uiadd{$part_svc->svcpart}="../edit/". $part_svc->svcdb . ".cgi"; -} - -SendHeaders(); # one guess. -print < - - Package View - - -
    -

    Package View

    -
    - -END - -#untaint pkgnum -$QUERY_STRING =~ /^(\d+)$/; -my($pkgnum)=$1; - -#get package record -my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); -die "No package!" unless $cust_pkg; -my($part_pkg)=qsearchs('part_pkg',{'pkgpart'=>$cust_pkg->getfield('pkgpart')}); - -#nav bar -my($custnum)=$cust_pkg->getfield('custnum'); -print qq!
    View this customer!, - qq! (#$custnum) | Main menu

    !; - -#print info -my($susp,$cancel,$expire)=( - $cust_pkg->getfield('susp'), - $cust_pkg->getfield('cancel'), - $cust_pkg->getfield('expire'), -); -print "
    Package #$pkgnum"; -print qq!
    Package Information!; -print qq! | Service Information! unless $cancel; -print qq!

    \n!; - -my($pkg,$comment)=($part_pkg->getfield('pkg'),$part_pkg->getfield('comment')); -print qq!
    Package Information!, - qq!!; -print qq!
    Edit this information
    !; -print "

    Package: $pkg - $comment"; - -my($setup,$bill)=($cust_pkg->getfield('setup'),$cust_pkg->getfield('bill')); -print "
    Setup: ", $setup ? time2str("%D",$setup) : "(Not setup)" ,""; -print "
    Next bill: ", $bill ? time2str("%D",$bill) : "" ,""; - -if ($susp) { - print "
    Suspended: ", time2str("%D",$susp), ""; - print qq! Unsuspend! unless $cancel; -} else { - print qq!
    Suspend! unless $cancel; -} - -if ($expire) { - print "
    Expire: ", time2str("%D",$expire), ""; -} - print < - -Expire (date): - -END - -if ($cancel) { - print "
    Cancelled: ", time2str("%D",$cancel), ""; -} else { - print qq!
    Cancel now!; -} - -#otaker -my($otaker)=$cust_pkg->getfield('otaker'); -print "

    Order taken by $otaker"; - -unless ($cancel) { - - #services - print <

    Service Information -
    Click on service to view/edit/add service.

    -
    Do NOT pick the "Link to existing" option unless you are auditing!!!
    -
    - -END - - #list of services this pkgpart includes - my($pkg_svc,%pkg_svc); - foreach $pkg_svc ( qsearch('pkg_svc',{'pkgpart'=> $cust_pkg->pkgpart }) ) { - $pkg_svc{$pkg_svc->svcpart} = $pkg_svc->quantity if $pkg_svc->quantity; - } - - #list of records from cust_svc - my($svcpart); - foreach $svcpart (sort {$a <=> $b} keys %pkg_svc) { - - my($svc)=qsearchs('part_svc',{'svcpart'=>$svcpart})->getfield('svc'); - - my(@cust_svc)=qsearch('cust_svc',{'pkgnum'=>$pkgnum, - 'svcpart'=>$svcpart, - }); - - my($enum); - for $enum ( 1 .. $pkg_svc{$svcpart} ) { - - my($cust_svc); - if ( $cust_svc=shift @cust_svc ) { - my($svcnum)=$cust_svc->svcnum; - print < -END - } else { - print < - - -END - } - - } - warn "WARNING: Leftover services pkgnum $pkgnum!" if @cust_svc;; - } - - print "
    Service(View) $svc
    - (Add) $svc - or - (Link to existing) $svc -
    "; - -} - -#formatting -print < - -END - diff --git a/htdocs/view/svc_acct.cgi b/htdocs/view/svc_acct.cgi deleted file mode 100755 index 7096c2fb1..000000000 --- a/htdocs/view/svc_acct.cgi +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/perl -Tw -# -# View svc_acct records -# -# Usage: svc_acct.cgi svcnum -# http://server.name/path/svc_acct.cgi?svcnum -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 96-dec-17 -# -# added link to send info -# ivan@voicenet.com 97-jan-4 -# -# added navigation bar and ability to change username, etc. -# ivan@voicenet.com 97-jan-30 -# -# activate 800 service -# ivan@voicenet.com 97-feb-10 -# -# modified navbar code (should be a subroutine?), added link to cancel account (only if not audited) -# ivan@voicenet.com 97-apr-16 -# -# INCOMPLETELY rewrote some things for new API -# ivan@voicenet.com 97-jul-29 -# -# FS::Search became FS::Record, use strict, etc. ivan@sisd.com 98-mar-9 -# -# Changes to allow page to work at a relative position in server -# Changed 'password' to '_password' because Pg6.3 reserves the password word -# bmccane@maxbaud.net 98-apr-3 -# -# /var/spool/freeside/conf/domain ivan@sisd.com 98-jul-17 -# -# displays arbitrary radius attributes ivan@sisd.com 98-aug-16 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use CGI::Carp qw(fatalsToBrowser); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs fields); - -my($conf_domain)="/var/spool/freeside/conf/domain"; -open(DOMAIN,$conf_domain) or die "Can't open $conf_domain: $!"; -my($mydomain)=map { - /^(.*)$/ or die "Illegal line in $conf_domain!"; #yes, we trust the file - $1; -} grep $_ !~ /^(#|$)/, ; - -my($cgi) = new CGI::Base; -$cgi->get; -&cgisuidsetup($cgi); - -#untaint svcnum -$QUERY_STRING =~ /^(\d+)$/; -my($svcnum)=$1; -my($svc_acct)=qsearchs('svc_acct',{'svcnum'=>$svcnum}); -die "Unkonwn svcnum" unless $svc_acct; - -my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}); -my($pkgnum)=$cust_svc->getfield('pkgnum'); -my($cust_pkg,$custnum); -if ($pkgnum) { - $cust_pkg=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - $custnum=$cust_pkg->getfield('custnum'); -} - -my($part_svc)=qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } ); -die "Unkonwn svcpart" unless $part_svc; - -SendHeaders(); # one guess. -print < - - Account View - - -

    Account View

    - -
    -END - -if ($pkgnum || $custnum) { - print <View this package (#$pkgnum) | -View this customer (#$custnum) | -END -} else { - print <Cancel this (unaudited)account | -END -} - -print <Main menu

    -Service #$svcnum -END - -print qq!
    Edit this information!; -#print qq!
    Send account information!; -print qq!

    General | Shell account | !; -print qq!SLIP/PPP account
    !; - -#formatting -print qq!
    General
    !; - -#svc -print "Service: ", $part_svc->svc, ""; - -#username -print "
    Username: ", $svc_acct->username, ""; - -#password -if (substr($svc_acct->_password,0,1) eq "*") { - print "
    Password: (Login disabled)
    "; -} else { - print "
    Password: (hidden)
    "; -} - -# popnum -> svc_acct_pop record -my($svc_acct_pop)=qsearchs('svc_acct_pop',{'popnum'=>$svc_acct->popnum}); - -#pop -print "POP: ", $svc_acct_pop->city, ", ", $svc_acct_pop->state, - " (", $svc_acct_pop->ac, ")/", $svc_acct_pop->exch, "<\B>" - if $svc_acct_pop; - -#shell account -print qq!
    !; -if ($svc_acct->uid ne '') { - print "Shell account"; - print "
    "; - print "Uid: ", $svc_acct->uid, ""; - print "
    Gid: ", $svc_acct->gid, ""; - - print qq!
    Finger name: !, $svc_acct->finger, qq!
    !; - - print "Home directory: ", $svc_acct->dir, "
    "; - - print "Shell: ", $svc_acct->shell, "
    "; - - print "Quota: ", $svc_acct->quota, " (unimplemented)"; -} else { - print "No shell account.
    "; -} - -# SLIP/PPP -print qq!
    !; -if ($svc_acct->slipip) { - print "SLIP/PPP account
    "; - print "IP address: ", ( $svc_acct->slipip eq "0.0.0.0" || $svc_acct->slipip eq '0e0' ) ? "(Dynamic)" : $svc_acct->slipip ,""; - my($attribute); - foreach $attribute ( grep /^radius_/, fields('svc_acct') ) { - #warn $attribute; - $attribute =~ /^radius_(.*)$/; - my($pattribute) = ($1); - $pattribute =~ s/_/-/g; - print "
    Radius $pattribute: ". $svc_acct->getfield($attribute), ""; - } -} else { - print "No SLIP/PPP account" -} - -print "
    "; - - #formatting - print < - -END - diff --git a/htdocs/view/svc_acct_sm.cgi b/htdocs/view/svc_acct_sm.cgi deleted file mode 100755 index 42623eefd..000000000 --- a/htdocs/view/svc_acct_sm.cgi +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/perl -Tw -# -# View svc_acct_sm records -# -# Usage: svc_acct_sm.cgi svcnum -# http://server.name/path/svc_acct_sm.cgi?svcnum -# -# Note: Should be run setuid freeside as user nobody. -# -# based on view/svc_acct.cgi -# -# ivan@voicenet.com 97-jan-5 -# -# added navigation bar -# ivan@voicenet.com 97-jan-30 -# -# rewrite ivan@sisd.com 98-mar-15 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 -# -# /var/spool/freeside/conf/domain ivan@sisd.com 98-jul-17 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); - -my($conf_domain)="/var/spool/freeside/conf/domain"; -open(DOMAIN,$conf_domain) or die "Can't open $conf_domain: $!"; -my($mydomain)=map { - /^(.*)$/ or die "Illegal line in $conf_domain!"; #yes, we trust the file - $1 -} grep $_ !~ /^(#|$)/, ; -close DOMAIN; - -my($cgi) = new CGI::Base; -$cgi->get; -cgisuidsetup($cgi); - -#untaint svcnum -$QUERY_STRING =~ /^(\d+)$/; -my($svcnum)=$1; -my($svc_acct_sm)=qsearchs('svc_acct_sm',{'svcnum'=>$svcnum}); -die "Unknown svcnum" unless $svc_acct_sm; - -my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}); -my($pkgnum)=$cust_svc->getfield('pkgnum'); -my($cust_pkg,$custnum); -if ($pkgnum) { - $cust_pkg=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - $custnum=$cust_pkg->getfield('custnum'); -} - -my($part_svc)=qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } ); -die "Unkonwn svcpart" unless $part_svc; - -SendHeaders(); # one guess. -print < - - Mail Alias View - - -

    Mail Alias View

    -END -if ($pkgnum || $custnum) { - print <View this package (#$pkgnum) | -View this customer (#$custnum) | -END -} else { - print <Cancel this (unaudited)account | -END -} - -print <Main menu
    Service #$svcnum -

    Edit this information - -END - -my($domsvc,$domuid,$domuser)=( - $svc_acct_sm->domsvc, - $svc_acct_sm->domuid, - $svc_acct_sm->domuser, -); -my($svc) = $part_svc->svc; -my($svc_domain)=qsearchs('svc_domain',{'svcnum'=>$domsvc}); -my($domain)=$svc_domain->domain; -my($svc_acct)=qsearchs('svc_acct',{'uid'=>$domuid}); -my($username)=$svc_acct->username; - -#formatting -print qq!


    !; - -#svc -print "Service: $svc"; - -print "
    "; - -print qq!Mail to !, ( ($domuser eq '*') ? "(anything)" : $domuser ) , qq!\@$domain forwards to $username\@$mydomain mailbox.!; - -print "
    "; - - #formatting - print < - -END - diff --git a/htdocs/view/svc_domain.cgi b/htdocs/view/svc_domain.cgi deleted file mode 100755 index 78ff6ac0b..000000000 --- a/htdocs/view/svc_domain.cgi +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/perl -Tw -# -# View svc_domain records -# -# Usage: svc_domain svcnum -# http://server.name/path/svc_domain.cgi?svcnum -# -# Note: Should be run setuid freeside as user nobody. -# -# ivan@voicenet.com 97-jan-6 -# -# rewrite ivan@sisd.com 98-mar-14 -# -# Changes to allow page to work at a relative position in server -# bmccane@maxbaud.net 98-apr-3 - -use strict; -use CGI::Base qw(:DEFAULT :CGI); -use FS::UID qw(cgisuidsetup); -use FS::Record qw(qsearchs); - -my($cgi) = new CGI::Base; -$cgi->get; -cgisuidsetup($cgi); - -#untaint svcnum -$QUERY_STRING =~ /^(\d+)$/; -my($svcnum)=$1; -my($svc_domain)=qsearchs('svc_domain',{'svcnum'=>$svcnum}); -die "Unknown svcnum" unless $svc_domain; -my($domain)=$svc_domain->domain; - -my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}); -my($pkgnum)=$cust_svc->getfield('pkgnum'); -my($cust_pkg,$custnum); -if ($pkgnum) { - $cust_pkg=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - $custnum=$cust_pkg->getfield('custnum'); -} - -my($part_svc)=qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } ); -die "Unkonwn svcpart" unless $part_svc; - -SendHeaders(); # one guess. -print < - - Domain View - - -

    Domain View

    - -
    -View this package (#$pkgnum) | -View this customer (#$custnum) | -Main menu

    - Service #$svcnum -
    -END - -print "
    "; -print "Service: ", $part_svc->svc, ""; -print "
    "; - -print qq!Domain name $domain.!; -print qq!

    View whois information.!; - -print "


    "; - - #formatting - print < - -END - -- 2.11.0