loganalyzer-4.1.5/000077500000000000000000000000001277740250400140605ustar00rootroot00000000000000loganalyzer-4.1.5/COPYING000066400000000000000000001052511277740250400151170ustar00rootroot00000000000000This work is released to the free software world via the GNU GPLv3, which can be found below. However, Adiscon GmbH also offers commercial licenses for those in the need. For questions, please contact info@adiscon.com or visit http://loganalyzer.adiscon.com/commercial ------------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read . loganalyzer-4.1.5/ChangeLog000066400000000000000000001344471277740250400156470ustar00rootroot00000000000000--------------------------------------------------------------------------- Version 4.1.5 (stable), 2016-10-12 - Fixed compaitiblity issues related to PHP7. - Updated JPGraph to 4.0.1 (to fix PHP7 support). - Changed all mysql_* API calls to mysqli_* API. - Fixed several possible XSS exploit issues in report modules and chart generator. - Updated JQUERY to v1.12.4 and fixed issues with the loading widget. - Fixed case sensitive speling issue in logstream disk helper functions. - Fixed a bug when using the clear data function in UserDB Sources Admin. --------------------------------------------------------------------------- Version 4.1.3 (beta), 2015-03-26 - Fixed REGEX Filtering issue, see #bugid 536. - Added Autofocus functions for formelemts in certain admin panel areas. - Reorganized Search Form. --------------------------------------------------------------------------- Version 4.1.2 (beta), 2015-02-23 - Corrected error handling in chartgenerator. - Fixed minor issues in database layout template. - Fixed missing buttons in database mapping admin panel. - Fixed MSIE8 Display Issue with buttons on main page. - Fixed some strings in german translation. - Increased javascript script performance for Firefox, MSIE and Opera. - Removed broken Page Number display support. - Fixed #bugid 532, report generation problem with special html characters. - Fixed #bugid 533 in dbmapping admin panel. - Fixed Installation #bugid 518 when $ character was used in any setting. - Fixed #bugid 494 and 311, added support for detecting more timestamps in RFC5424 Parser. Also adding structured data to the message field if available. - Fixed #bugid 320, added workaround for report admin panel when using MSIE8, as it incorrectly handles buttons. - Fixed multiple PHP 5.5 deprecated issues with preg_replace calls. - Fixed DNS Cache which did not work properly in some PHP versions. - Fixed deprecated issues in html2pdf converte. --------------------------------------------------------------------------- Version 4.1.1 (beta), 2014-10-29 - Included jquery library into Loganalyzer - Included jquery-ui library into Loganalyzer - Message Popup Window is a jquery-iu dialog now. - Almost all Buttons and Menus are based on jquery-ui now. - Added support to set a custom font and fontsize - Added new style/theme called "High Contrast", which can be used for people with debility of sight. - Setting Page Reloadtime to 0 will now disable the automatic reload. - Chart (Statistics) are loading with jquery now. - Chart erroroutput is now HTML. - Cleaned up layout of all admin templates - Fixed Tab-Order in Search template. - Added missing Alt-Text to some images in htmlcode. - Added loading overlay to jquery menu and link click functions. - Cleanup stylesheets and removed unused csscode. - Changed german language files to UTF8 --------------------------------------------------------------------------- Version 3.6.6 (stable), 2014-09-02 - Fixed bug in databasemapping admin. The form parameter and database fieldname of EventID field were interfering. - Fixed a bug in maintenance.php, the ID parameter was forced to an integer. A leftover from earlier loganalyzer days. - Fixed Cross Site Scripting Issue in index.php/detail.php for stringtype fields discovered by Dolev Farhi dolevf@yahoo.com from F5 Networks. --------------------------------------------------------------------------- Version 3.6.5 (stable), 2013-10-08 - LogStreamDB Driver, LogStreamPDO Driver, UserDB: Added backticks arround tablenames in all SQL Statements. This fixes http://bugzilla.adiscon.com/show_bug.cgi?id=479 - LogStreamPDO Driver: Fixed hardcoded tablename in trigger create statement - Fixed LDAP login problem when special characters like quotes were used in passwords. This fixes http://bugzilla.adiscon.com/show_bug.cgi?id=480 --------------------------------------------------------------------------- Version 3.6.4 (stable), 2013-08-16 - Added MYSQL hint in install script when enabling User Database System. - Using default header encoding in GetStringWithHTMLCodes() function now. This should solve http://bugzilla.adiscon.com/show_bug.cgi?id=433. - Added SyslogNG logline parser, thanks to Mulyadi Santosa for providing the a patch to us. A customized template in SyslogNG is needed: template("$FACILITY_NUM $LEVEL_NUM $DATE $FULLHOST $MESSAGE\n") --------------------------------------------------------------------------- Version 3.6.3 (stable), 2013-02-25 - Updated Search documentation - Fixed Bug in the ApplyFilters function which applies to all logstreams. This caused most REGEX filters to fail, if supported by the LogStream driver. - Added support for dynamic fields in MongoDB logstream sources. This enables Loganalyzer to view data written by rsyslog into MongoDB from CEE sources. - Fixed wrong UID calculation in MongoDB Logstream class. - Fixed an issue deleting all data in MongoDB LogStream class. --------------------------------------------------------------------------- Version 3.6.2 (stable), 2013-01-09 - Fixed another DiskAllowed Checked in Disk logstream class, no works as expected. - Fixed Cross Site Scripting Issue in userchange.php (viewid parameter) --------------------------------------------------------------------------- Version 3.6.1 (stable), 2012-12-19 - Cosmetic fix in login.php, fixed static language strings. - Fixed Cross Site scripting issue in asktheoracle.php (oracle_query parameter) --------------------------------------------------------------------------- Version 3.6.0 (stable), 2012-12-04 - Bugfix: Fixed "DiskAllowed" checking in Disklogstream. Filenames are now correctly checked against allowed folders. This check was added for security reasons before. - Fixes #bugid 369: http://bugzilla.adiscon.com/show_bug.cgi?id=369 The DefaultviewID was accidentally overwritten with default value. - Fixes #bugid 375: http://bugzilla.adiscon.com/show_bug.cgi?id=369 User and Group data is now deleted when removing them from the UserDB. - Bugfix: Added missing dependency for the Checksum field in "EventLog Audit" and "EventLog Logon/Logoff" report. --------------------------------------------------------------------------- Version 3.5.6 (beta), 2012-09-10 - bugfix: Changed intval() handling in details.php into is_numeric. This fixes problems with 64 Bit unsigned uid's. Fixes #bugid 345: http://bugzilla.adiscon.com/show_bug.cgi?id=345 --------------------------------------------------------------------------- Version 3.4.5 (stable), 2012-09-10 - Merged fix from beta branch in function_db.php. DB_RemoveBadChars function supports arrays now, this caused invisible notice errors. --------------------------------------------------------------------------- Version 3.5.5 (beta), 2012-06-19 - Merged security fixes into beta branch --------------------------------------------------------------------------- Version 3.4.4 (stable), 2012-06-19 - Fixed cross-site scripting vulnerability of highlight parameter on index.php page. --------------------------------------------------------------------------- Version 3.5.4 (beta), 2012-05-22 - Merged security fixes into beta branch --------------------------------------------------------------------------- Version 3.4.3 (stable), 2012-05-22 - Fixed several security vulnerabilities discovered by Filippo Cavallarin. This contains the following fixes: - Fixed SQL Injection vulnerability in admin/view.php - Fixed Cross Site scripting issue filter parameter on index.php - Fixed Cross site scripting issue of id parameter on admin/reports.php - Fixed Cross site scripting issue of id parameter on admin/searches.php - Fixed arbitrary file read issue in Disk LogStream class. The config.php file does now contain an array "DiskAllowed" which contains allowed directories. Only files located within these allowed directories can be accessed in LogAnalyzer. By default, only /var/log is allowed. --------------------------------------------------------------------------- Version 3.5.3 (beta), 2012-05-09 - Fixed some issues in the new MongoDB Logstream Class. To name a few, add resultlimits to speedup performance. Changed and fixed some issues when grouping data for consolidation. Added support to create Indexes on fields. This should also speedup report generation. - Added support to filter by date string, example: timereported:=2012-01-01 A new Datetype hasbeen added to support filtering by date. - Updated jpgraph code to latest version which is 3.0.7 --------------------------------------------------------------------------- Version 3.4.2 (stable), 2012-05-07 - Fixed a #bugid 303, VerifyChecksumTrigger function in logstreamdb class did not generate a lowercase triggername. - Fixed typo in lang files - Changed processid field type to string in logstreamclass. Filtering for non-numeric processids is now possible. - Added support to filter by day (Date field - for example: timereported:=2012-01-01 --------------------------------------------------------------------------- Version 3.5.2 (beta), 2012-04-23 - Added new Logstream driver for MongoDB. The initial version contains all features needed to use MongoDB with Loganalyzer and it's reports. You will need the Mongo PHP extension installed (see here for more: http://www.php.net/manual/en/mongo.installation.php ). - Extended ID Field handling in Loganalyzer which is needed in order to work with MongoDB IDs. - Changed processid field type to string in logstreamclass. This caused problems when filtering for non-numeric processids. - Added support to use MongoDB logstream in LogAnalyzer installer. --------------------------------------------------------------------------- Version 3.5.1 (beta), 2012-03-16 - Added Support for LDAP Authentication based on the modification from forum user "Prune". LDAP Support can be configured during the installation of LogAnalyzer, but can also be turned on later by editing the config.php. More Details will be found in our wiki: http://wiki.rsyslog.com/index.php/LogAnalyzer - Fixed a #bugid 303, VerifyChecksumTrigger function had trouble with mixed cased triggernames. --------------------------------------------------------------------------- Version 3.5.0 (beta), 2012-01-24 - Added new Report "Eventlog Audit Summary Report" which can generate detailed security reports for Windows Eventlog security records. It supports Windows 2003 and 2008 Server and is compliant with the Sarbanes-Oxley (SOX) Act, 2002. - Added support for customized boolean report filters. This enhancement is also used by the new "Eventlog Audit Summary Report". --------------------------------------------------------------------------- Version 3.4.1 (stable), 2012-01-10 - Fixed a bug in Syslog and Eventlog summary report which consolidated wrong events when the source filter was used in the report. --------------------------------------------------------------------------- Version 3.4.0 (stable), 2011-12-06 - Added initial version of a new free report for consolidating Windows Eventlog Logon / Logoff events - PDO LogStream, the RowCount function is now only used with MYSQL, PGSQL and MSSQL. Other PDO Drivers may not return a useful value. - Removed language files from source, can be found here from now on: http://loganalyzer.adiscon.com/translations - Straighten out a couple of issues - Doc: Redirected professional support options to proper page --------------------------------------------------------------------------- Version 3.2.3 (stable), 2011-11-08 - Removed magic quotes check from database functions (obselete due the changes in the last version) - Merged Changes from BUGID #288 (Thanks to User Jeff) - Fixed internal Filter parsing bug introduced in 3.2.2. - Fixed bug in syslog summary report missing checksum in report generation - Fixed bug in preparing filters for display in basic report class - Fixed bug in verification routine of sources admin when backslashes were in any other variables - Fixed BUGID #291, custom filters are now taken care in database logstream sources when cleaning up data. - Changed minwidth for context menus from 200 to 250px due display problems in some browsers. --------------------------------------------------------------------------- Version 3.2.2 (stable), 2011-09-28 - Implemented support to use User or Group configured logstream sources in commandline report generator (cmdreportgen.php). The Report Admin will generate an additional parameter for the sample commandline: userid=$uid or groupid=$gid - Fixed syntaxlogic bugs in proxy utilisation, thanks to forum member pierre: http://kb.monitorware.com/post-t10570.html#p20033 - Fixed ignoring "IPAddressResolve" setting when "EnableContextLinks" was disabled. - Fixed filter detection bug in report class which could lead to problems with certain filter evaluations. - Fixed error in parsing include/exclude filters for numeric fields in report admin panel. Changes in the main filter parser were also necessary to fix this issue. - Added function to automatically remove MagicQuotes (performed if the php "magic_quotes_gpc" is on). - Added support to search for full phrases instead of words only. Kindly use Quotes to mark the start and end of a phrase, for example: "Search for this" // Searches for full phrase -"Search for this" // Excludes full phrase - Report admin, fixed filter editor issues when full phrase strings (with spaces) were configured. - Report admin, the custom filterstring was not saved if new report was created or the previous custom filterstring was empty. --------------------------------------------------------------------------- Version 3.2.1 (stable), 2011-04-12 - Fixed timezone parsing in GetEventTime function. This caused problems reading date/time strings with negative timezone offsets. - Added option to disable context links in LogAnalyzer. --------------------------------------------------------------------------- Version 3.2.0 (stable), 2011-03-30 - Added new logline parser for Syslog23 Format (RFC 5424). This format is suported by the RSYSLOG_SyslogProtocol23Format template in RSyslog. This format also includes syslog facility and priority. - Added php session_write_close to certain places to avoid hanging browser sessions. - Eventlog Summary Report now also detects and processes data from EventLog Monitor V2 (from EventReporter/MonitorWare Agent). - Fixed typo in Syslog Report, Last Occurrence date is now correctly printed in the report. --------------------------------------------------------------------------- Version 3.0.7 (beta), 2011-02-25 - Added UserDBPort Parameter into DB_Connect function. Thanks to forum user "plebreton" pointing to this bug. - Added Output of report generation time into templates and common report variabes. - Fixed a bug in logstream DB causing unnecessary mysql_free_result calls when updating Checksum data. - Fixed filter dialog issue parsing message filters wrong in Report Admin Panel. An semicolon was added while saving report settings. - Added missing mapping for ProcessID field for monitorware database mapping (logstream constants). --------------------------------------------------------------------------- Version 3.0.6 (beta), 2011-02-11 - Added missing filterstring url parameter into statistics.php. - You can enabled/disable charts by clicking on the checkbox now in the Charts Admin panel. - Added support to select character encoding in HTML Header. This enables Loganalyzer to process and display UTF-8 encoded logs properly. The default encoding is ISO-8859-1 and can be switched in the general admin panel, or by adding the $CFG['HeaderDefaultEncoding'] configuration variable into config.php. Possible values are ENC_ISO_8859_1 and ENC_UTF8. The supported encodings can be extended by adding new encoding definitions in include/constats_general.php. --------------------------------------------------------------------------- Version 3.0.5 (beta), 2011-02-10 - Fixed javascript compatibility issue related to Internet Explorer in reports admin. - Fixed spelling error in german language translation - Fixed problem with german special characters (Umlaute) in Form captions. Some admin panels did not work properly because of this issue. - Filters were ignored in chart generation if the according filter fields were not included in the chart data. - The auto-increment value of the ID field is now resetted if all data is cleared using the mysql logstream maintenance functions. --------------------------------------------------------------------------- Version 3.0.4 (beta), 2010-11-16 - Fixed Copy and Paste error in db_template.txt. --------------------------------------------------------------------------- Version 3.0.3 (beta), 2010-10-28 - Added support for using custom filter for charts, for example if you want to create charts for single servers. - Added support for using custom default filters in logstream sources. This filter will always prepended for all other custom search filters. - Added new UserDB fields and updated database version to 10 --------------------------------------------------------------------------- Version 3.0.2 (beta), 2010-10-22 - Added support to use a proxy server for internal url request. For example the update check request which is done during login will use this proxy server if configured. - Fixed TYPO in maintenance.sh, the parameter is cleandata, not cleardata. - Added favicon which was submitted by Chris Hartman. --------------------------------------------------------------------------- Version 3.0.1 (beta), 2010-04-14 - Fixed record height issue when "Show Onlinesearch icons within fields" option was enabled - Added support to automatically add missing fields in Mysql and PDO Logstreams. Currently MySQL and PostgreSQL are support only. - Error details of logstream sources will now be shown on detail.php page as well. --------------------------------------------------------------------------- Version 3.0.0 (beta), 2010-03-29 - All references to phpLogCon have now been renamed to LogAnalyzer, which will be the new name for the phpLogCon project from now on. - Added initial implementation of the new Report engine along with two free reports called "EventLog Summary" and "Syslog Summary" - Autoreload time in admin panels is now configureable. - Added Read-Only User functionality. - Added Updatecheck functionality for future update notifications. - Fixed alignment of formfields in all admin panels. --------------------------------------------------------------------------- Version 2.8.1 (v2-stable), 2010-02-23 - Added Inline searchicon, will be visible in each online searchable field. Can be disabled in admin center. - Added Updatecheck which will be performed during login only, so once per session. If a newer Version is available, you will be notified in Admin Center. - Secured Views, Sources, Searches and Charts Admin access from users without admin access. - Settings will be remembered now when configuring columns in Views Admin Panel. - Normal users cannot init or remove message parsers anymore - Added Time-extension on search page (send by Sergey Sireskin). --------------------------------------------------------------------------- Version 2.9.0 (beta), 2010-01-14 - Merged previous devel branch into Stable branch and set new version number 2.9 --------------------------------------------------------------------------- Version 2.8.0 (v2-stable), 2010-01-14 - Merged previous Beta branch into Stable branch and set new version number 2.8 - As of RFC5424, changed ProcessID Field into string valuetype, which has effect on how searches are done. --------------------------------------------------------------------------- Version 2.7.3 (beta), 2009-11-17 - Merged bugfixes and changes from 2.6.5 stable into beta branch --------------------------------------------------------------------------- Version 2.6.5 (v2-stable), 2009-11-17 - Fixed wrong include in maintenance.php which caused the script to fail --------------------------------------------------------------------------- Version 2.7.2 (beta), 2009-08-17 - Merged bugfixes and changes from 2.6.4 stable into beta branch --------------------------------------------------------------------------- Version 2.6.4 (v2-stable), 2009-08-14 - Removed unneeded call for define_syslog_variables, which is depreceated in php 5.3 and will be removed in php6 - Replaced SPLIT call in install.php with preg_split because SPLIT is a depreceated function and will proberly be removed in php6 - Updated jpgraph classes to version 3.0.2 which also removes some issues with depreaced functions in php 5.3 --------------------------------------------------------------------------- Version 2.7.1 (beta), 2009-05-06 - Merged bugfixes from 2.6.3 stable into beta branch --------------------------------------------------------------------------- Version 2.6.3 (v2-stable), 2009-04-29 - Fixed a bug that caused fields like syslog facily, severity or messagetype to be shown numeric instead of readable coloured replacements. - Fixed a bug in the detail page which could cause numeric fields to be missing. - Added support for debug output in the data cleanup routine of mysql and pdo logstreams. This will help troubleshooting. --------------------------------------------------------------------------- Version 2.7.0 (beta), 2009-03-26 - Added support for dynamic filenames in disk logstream by using replacement characters. See the doc for details. - Added support for using REGEXP on supported logstream sources. Currently MYSQL and PostGRESQL are supported due the native support of REGEXP. To use REGEXP in searches, prepend the search phrase with the ~ character. - Added support for configuring and administrating custom database mappings in the Admin Center. This makes it easier to support custom table layouts. --------------------------------------------------------------------------- Version 2.6.2 (v2-stable), 2009-03-24 - Fixed minor spelling errors in language files (BugID #115) - Fixed number of records exported when using the export (BugID #110). - Added missing filter selection for message type filter on search page. - Fixed Filtering issues when using multiple filters on the same field. Numeric based filters will now work as expected again (BugID #108). - Fixed table detection method in PDO LogStream. - Added support to parse date only values like "2009-03-24". --------------------------------------------------------------------------- Version 2.6.1 (v2-stable), 2009-03-23 - Fixed an issue with case sensitive fieldnames in db and pdo logstream. This issue could cause unexpected results depending on how fieldnames were returned by the database layer. Now, all fieldnames and array keys are automatically converted into lowercase. - Fixed minor database template definition issues with the logcon_config table, the propvalue and propvalue_text field can be NULL now. --------------------------------------------------------------------------- Version 2.6.0 (v2-stable), 2009-03-20 - Merged beta branch into v2-stable branch. --------------------------------------------------------------------------- Version 2.5.24 (beta), 2009-01-27 - Added italian language files, translated by Luigi Rosa - Improved loading of language files, to avoid display error's if translation is incomplete. - Enhanced database performance of MYSQL and PDO logstream source drivers. Searching and paging through results is much faster on larger databases now. - Enhanced Pager performance on index and detail page. - Hardened db logstream classes against invalid parameters. - Added missing include file for debug functions - Debug Messages are now printed well formated below the site content - Improved Documentation --------------------------------------------------------------------------- Version 2.5.23 (beta), 2008-12-23 - Fixed typo in textual month detection, which caused date detection problems in december month only. - Fixed missing include of debug functions in maintenance.php - Added some performance tweaks into mysql db driver, which will make searching for strings within messages faster. --------------------------------------------------------------------------- Version 2.5.22 (beta), 2008-12-10 - Added workaround for year detection for RFC 3164 like timestamps. This also resolves issues of the syslog date detection on new year. - Fixed a notice error in chartgenerator, only visible if debug options were enabled. --------------------------------------------------------------------------- Version 2.5.21 (beta), 2008-11-24 - Fixed an infinite search loop which occured of the option "Suppress Duplicated Messages was enabled". This caused the index page to timeout once a duplicated message was hit. - Fixed that filters were ignored when exporting results to cvs/xml --------------------------------------------------------------------------- Version 2.5.20 (beta), 2008-11-19 - Fixed a performance issue in the logstream db and pdo drivers when using filters. This bug could cause script timeouts when using complex filters. - Added default .htaccess to prevent webserver access on cron folder --------------------------------------------------------------------------- Version 2.5.19 (beta), 2008-11-18 - Added a new "cron" folder which contains a maintenance.php script. This script can be used on command line level for database maintenance. For more information, see the documentation. - Fixed typo of new column "DBRecordsPerQuery" in admin/sources.php which caused an error when adding new database logstream sources. --------------------------------------------------------------------------- Version 2.5.18 (beta), 2008-11-12 - Added logstream statistic and maintenance option which are accessable in the sources admin panel. You can view overall stats of database logstreams, and cleanup data based on the date field. - Added option to use a custom phpLogCon logo in the header. The logo url can be configured in the admin panel --------------------------------------------------------------------------- Version 2.5.17 (beta), 2008-11-03 - Fixed default database template, updates for DB Version 6 and 7 were missing. - Added expandable submenu for help into the top menu. Also fixed some minor stylesheet issues, to optimize usebility in the main view. - The detail page hides empty fields now. --------------------------------------------------------------------------- Version 2.5.16 (beta), 2008-10-27 - Fixed a problem when adding a mysql logstream source. Due a problem of how php mysql_connect function handels second conenctions, the Verify of a newly added logstream source could cause the first database connection to be overwritten. The following error is, that the wrong database was used for the UserDB after the new logstream was verified. - Added a check into the redirect function to STOP redirecting if an error happens in the UserDB. - Fixed minor issues handling form input which happened when magic_quotes_gpc was enabled. - Fixed a bug in the convert.php script which inserted the wrong database version number. This caused phpLogCon to force an database upgrade which is not needed at all. - Added dummy db update scripts, so the db upgrade script won't fail in future. This is for the case when the db version is not correctly or missing in the user database. - Added support to filter for dynamic fields within the logstream database sources. This was not possible yet. The filtering also has a secure end timer, which avoids that the timelimit hits the script. - Added support to suppress unparseable messages when using msgparsers. This enhances useability if you have mixed data sources, and want to filter out unparseable messages. - Added new setting for MYSQL logstream sources to control the amount of data per query. This value can be used to tweak the MYSQL performance. For example when filtering for fields which are generated by a message parser, highering the value does improve the database performance. The default value is 100, and should only be changed if you know what you are doing. --------------------------------------------------------------------------- Version 2.5.15 (beta), 2008-10-22 - Corrected the check for magic_quotes_gpc which is important when saving configuration values are saved into the UserDB. This also fixes a problem of duplicating backslahes when using \ or ' in string fields. - Fixed a minor bug of handling and saving the ViewEntriesPerPage option. - Added Option to inject custom html code into the header and footer. - Added Help Links into the message parser admin panel. - Cleaned up and enhanced the default and dark theme. - Improved documentation --------------------------------------------------------------------------- Version 2.5.14 (beta), 2008-10-10 - Added support for fully customizeable fields. This includes a fields admin with possibility to customize width and alignment of fields, and add new custom ones. - Added new table into user database to support the custom fields. This requires a database upgrade. - Add admin panel for message parsers. This includes further information on the parsers as well as the option to import necessary custom fields for the message parsers. - Overall simplified code related to field definitions and types. --------------------------------------------------------------------------- Version 2.5.13 (beta), 2008-10-07 - Improved documentation, added general and search description. - The conversion script does convert the charts now as well. - Added global warning which will be displayed on all pages if a database update is pending - Added button below searchfield which becomes visible when you run searches which links to the asktheoracle site. - Fixed a race condition in the installer which could cause phpLogCon to fail at Step 8. - Added parser for apache2 common format. So we support apache combine and common now. --------------------------------------------------------------------------- Version 2.5.12 (beta), 2008-09-29 - Fixed several SQL issues in the logstream classes when filtering was used. - Enhanced all content menus in the main site, reduced coding as well. - Added support for URL detection within the data of string fields, these links can be opened in new windows. - Fixed bug when excluding more then one string filter from the same field type. - Fixed wrong database version insert in install.php as well as incorrect redirect login page during install. --------------------------------------------------------------------------- Version 2.5.11 (beta), 2008-09-25 - Fixed the "next page" button when a logstream disk source was used. The "next page" button stopped working as a side effect of some performance changes made in the last version. - Added new description field for logstream sources. If the description field is used, the description is shown below the pager on the main index site. The database version has also been incremented, this only affects you if you are using the user system. --------------------------------------------------------------------------- Version 2.5.10 (beta), 2008-09-24 - Merged devel branch into beta branch. - Enhanced search performance in disk logstream, specially when searching in large files. - Enhanced critical error display, and added better error details if the user db server is not reachable --------------------------------------------------------------------------- Version 2.4.0 (v2-stable), 2008-09-24 - Merged beta branch into v2-stable branch. --------------------------------------------------------------------------- Version 2.5.9 (devel), 2008-09-19 - Implemented support to analyze Webserver logfiles from Apache and Microsoft IIS Webserver. There is a collection of new fields available, filtering is possible. . In order to read Apache or IIS logfiles, you need to use the "iis" or "apache2" message parser in your disk sources. - Added a new page called "asktheoracle.php" which will be automatically linked on IP's and domain names. It is a simple helper page which creates a bunch of usefull filter links. - Added some basic documentation into the doc folder. phpLogCon does also link to this documentation now (Help Menu Entry). - Added a general option to limit the display of string fields. - Added a general option to configure the timeout value of popup menus. - Added a general option to alter the php scrip timeout. This is of course only possible if the php interpreter is allowed to change the script timeout. - Added checks for the script timeout in the disk logstream, this avoids that the script is suddenly stopped by the php interpreter. - Fixed a sorting bug in the disk logstream, which removed numeric values in the charts - Added support to filter for a + character as well now. In order to filter for strings containing the + character, just add replace it with ++. A single + will still be equal to a space character in the filter engine. --------------------------------------------------------------------------- Version 2.5.8 (devel), 2008-09-16 - Added Bitstream Vera Fonts into the package which will be used by the chart generator. So there won't be a problem of missing truetype fonts anymore. - Tweaked the visual appereance of all chart types. --------------------------------------------------------------------------- Version 2.5.7 (devel), 2008-09-15 - Added Statistics page for chart generation. The following charts are possible right now: Pie, bars vertical and bars horicontal. All charts can be configured within the Admin Center, if the user system is installed and enabled. Custom charts can be added as well. - Added filter / search support for processid, event category and the event user field - Added database update, as we now have a new table to store configured charts into. - Fixed a few minor filtering issues, specially with numeric filters. --------------------------------------------------------------------------- Version 2.3.11 (beta), 2008-09-08 - Fix another parsing issue in the logline parser. Most of RFC 3164 formatted syslog messages should now be correctly splitted into their fields. --------------------------------------------------------------------------- Version 2.5.6 (devel), 2008-09-03 - Implemented Message Parser facility. This new extendable facility of phpLogCon helps splitting messages into fields. And the fields can be filtered and searched for, this expands the full potential of phpLogCon. A message parser for windows eventlog logfiles generated by Adiscon products is included. - Linebreaks within messages are now displayed in the popup window, and the detail page. - Added Database Upgrade functionalety, the reason is simple, because there was an update to the database structure. If you are using the User Management system, you will be prompted to upgrade your database next time you login. --------------------------------------------------------------------------- Version 2.5.5 (devel), 2008-08-28 - Added option to send debug messages (warnings and error's) from phpLogCon to the local syslog server on linux. On Windows, the debug messages will appear in the application event log. - Enhanced the PDO Logstream Driver for better performance on large databases. On MYSQL and POSTGRES, the PDO Logstream does not uses the LIMIT statement to minimize database usage. --------------------------------------------------------------------------- Version 2.3.10 (beta), 2008-08-27 - Fixed a few parsing issues with prior RFC 3164 syslog messages. These messages are now correctly parsed, or better do not cause any parsing problems anymore. --------------------------------------------------------------------------- Version 2.5.4 (devel), 2008-08-05 - Included fixed from Beta v2.3.9 --------------------------------------------------------------------------- Version 2.3.9 (beta), 2008-08-07 - Fixed a bug in the parsing of RFC 3164 date and time stamps which occured from the 1st to the 9th of each month. During this time, the date was not correctly parsed. - Enhanced detail popup window, it performs much better now and is less annoying. It still can be turned off very easily. - Fixed an image alignment problem of the message once and for all. --------------------------------------------------------------------------- Version 2.5.3 (devel), 2008-08-05 - Added support to export the current visible events into a XML or CSV file. If you have further recommendations for useful export file formats, just let us know in the phpLogCon forums or mailinglist. - Extended Filter Engine to support Full and Partial Text searches on string fields. The submenu buttons also now use the Full Text search by default, which performs much better on database logstream sources. - A new menu entry on each value on each field in the main EventView gives you the option to search for this field only, or extend an existing filterset. --------------------------------------------------------------------------- Version 2.5.2 (devel), 2008-08-01 - General Options are now configureable on user basis, if UserDB System is installed of course. This means first, phpLogCon used the global configured options, then the user configured - if available. - When you add new Sources, the source is checked with better error details. If you have a database connection, even the existence of the configured table is checked. This helps locating configuration problems. - Fixed minor bug in the installer which was added in v2.5.0. - Fixed spelling errors in the admin index template. - Error messages in the admin center contain more useful details now. --------------------------------------------------------------------------- Version 2.5.1 (devel), 2008-07-29 - Added a new option to suppress displaying multiple messages. This means if you have two or more messages of the exact same text one after another, only ONE message will be shown. This helps to "compress" the logview a little bit. - New feature, added Maximize/Normalize button into the menu. You can hide the header now by using this feature for maximum log display. - If the UserDB System is enabled, the donate button will only being shown within the Admin Center. - Fixed a bug in the input checking of files when a Diskfile source was added or reconfigured. - Fixed minor bug reading the correct default view for sources from DB. - Fixed a problem in the Views Admin, a set of predefined columns could be in the list. - Enhanced error display in all admin templates. --------------------------------------------------------------------------- Version 2.3.8 (beta), 2008-07-28 - Fixed a "notice" bug in the installer, which was missing to save the DBType for MYSQL Datasource. - Fixed a bug in the pdo logstream class which caused display of empty rows when no records where found. - Fixed Bug ID82 from bugtracker. Internal and invalid IP Addresses are not linked to whois anymore. - Fixed Line Ending to Unix in some code files. --------------------------------------------------------------------------- Version 2.5.0 (devel), 2008-07-24 - Fully implemented the UserDB System. This is the next major milestone in the development of phpLogCon. The new UserDB System allows you to fully customize phpLogCon using an admin interface and offers the following sub-features: Users, Groups, Sources, Views, Searches and general options. Exiting configurations can be imported into the user system using the convert.php script. The installer has an option to install the user system. - Added Icons to all Topmenu entries, as well as into the Admin Topmenu entries. - Improved stylesheets --------------------------------------------------------------------------- Version 2.3.7 (beta), 2008-07-07 - Added missing db mapping for program field of syslogng - thanks to Micha "Wolvverine" Panasiewicz - Added translation for Brazilian Portuguese, thanks to Ricardo Maraschini --------------------------------------------------------------------------- Version 2.5.0 (devel), 2008-06-10 - Moved older devel branch to beta branch. Increment Version minor number. --------------------------------------------------------------------------- Version 2.2.0 (v2-stable), 2008-06-10 - Moved beta branch to v2-stable branch. --------------------------------------------------------------------------- Version 2.3.6 (devel), 2008-06-09 - Added new feature, multiple configureable views which can be configured and selected for each source seperately. Old configurations can still be used with the new Views feature. The installer also supports selecting the default View for the first added source. --------------------------------------------------------------------------- Version 2.3.5 (devel), 2008-06-06 - Enhanced the detected of IP Addresses and domain names, so the automatic generated context links match better now. - Added new option (enabled by default) to resolve IP Addresses into hostnames. Note that this will only be done if the IP Address is NOT in square brackets. The resolved names will be cached in the users session, to speed up the resolving process. The resolved IP Addresses will be injected behind the IP Address in curly brackets, and a diffirent colour. --------------------------------------------------------------------------- Version 2.3.4 (devel), 2008-06-02 - Added new feature to automatically link IP and domain names with our whois search engine. So you can research these informations with one click. - Changed Online Search Parameters. For Eventlog related search links, you will now directly directed to entries in our knowledge base, if found. --------------------------------------------------------------------------- Version 2.3.3 (devel), 2008-05-23 - Initial Added the new DB Driver (Logstream) which uses PHP PDO. PDO is the latest generic database interface for PHP5 and recommended for best performance. It is possible to use other database engines with this new logstream class like mssql, postgres sql, odbc, oracle or even ibm db2. - Optimized the logic of the pager and increased performance related to it. - Added support for the new Database driver into the installation script. The old driver has been renamed to MYSQL Native and is also recommended if you use MYSQL as database server. --------------------------------------------------------------------------- Version 2.3.2 (devel), 2008-05-20 - Implemented Online Search button into the field submenus. The search uses our new repository at kb.monitorware.com. - Added pager to the bottom of the index page as well (bugtracker id 76) - Added filtering support for the new Eventlog fields - Adding field mapping definitions for Windows Eventlog which are: SYSLOG_EVENT_LOGTYPE, SYSLOG_EVENT_SOURCE, SYSLOG_EVENT_CATEGORY, SYSLOG_EVENT_ID and SYSLOG_EVENT_USER - Simplified columns configuration definition in config.sample.php - Fixed minor css issues. --------------------------------------------------------------------------- Version 2.1.6 (beta), 2008-05-19 - Fixed filter bug, if you want to filter with ":", you can do this by using "\:" now. - Added donate button ;) - Changed install.php handling, so it is not necessary to remove the script after installation anymore. It is only possible to use install.php if the config.php is empty or does not exist. - Added check for installed PHP Version. phpLogCon will refuse to run on PHP4 or lower from now on! --------------------------------------------------------------------------- Version 2.3.1 (devel), 2008-05-02 - The page title is now created with Source, and other useful informations. It is also possible to configure a custom title string with the configuration, which will be prepended into each phpLogcon page. - Added support for gzip compression (configurable), this will reduce bandwidth and page load time. - Added Auto reload function into main list view, can be enabled by default in the configuration as well. Done using a META REFRESH. - Added new configuration variable to set the default SourceID. The source parameter will be appened to all necessary links and forms within phplogcon, if the session sources differs from the default one. Version 2.1.5 (beta), 2008-05-05 - Converted all files into UNIX format (^M has been removed) --------------------------------------------------------------------------- Version 2.3.0 (devel), 2008-04-30 - Added "Back to Listview" button in the detailview. - Added filter for message type - Added inline button menus into the listview. Most values can be clicked now, which opens a menu with additional useful links. - Added Pagesite Selection into listview, so you can change the amount of records you want to see on one page at any time you want. - greatly improved database performance, runs much better now, but there is still room for further optimization --------------------------------------------------------------------------- Version 2.1.4 (beta), 2008-04-29 - Added missing facility 10 to 15 from RFC3164 into phhlogcon --------------------------------------------------------------------------- Version 2.1.3 (beta), 2008-04-28 - Fixed a bug in the installer, the table type was not written into the configuration. Version 2.1.2 (beta), 2008-04-28 --------------------------------------------------------------------------- - Removed syslog sample logfile from samplelogs, fixed minor issue in the installer - Fixed bug in logstreamlineparsersyslog.class which failed to parse some rsyslog loglines. - Special characters like german "umlaute" are now proberly replaced - Added link to help page, pointing to rsyslog wiki - Changed database layout from winsyslog to monitorware. Added more debug handling --------------------------------------------------------------------------- Version 2.1.1 (beta), 2008-04-25 - added detail page into phpLogCon. The detail page shows all possible details of a syslog message. It also possible to page in the detail view. - fixed minor notices bugs in the functions_db.php, which is really used right now. But it will become important once the user-ui will be added. - fixed "NEXT" button bug in the install script. Infact only ONE next button is available now in the install script. This removes the duplicated ones from before. - added full german translation (thanks to Tom Bergfeld for providing it) --------------------------------------------------------------------------- Version 2.1.0 (beta), 2008-04-24 - initial release of the rewritten phpLogCon v2 loganalyzer-4.1.5/INSTALL000066400000000000000000000204011277740250400151060ustar00rootroot00000000000000 LogAnalyzer Installation help ---------------------------------- To install LogAnalyzer, you will need: * Apache or IIS Webserver * PHP5 Optionally, you may need: * MySQL Database For obvious reasons, you also need some syslog data. Any standard syslogd will do. From a feature and stability point of view, we recommend either one of these (which we also wrote ;)): - WinSyslog (for Windows Environments - http://www.winsyslog.com) - rsyslog (for Linux/Unix Environments - http://www.rsyslog.com) Both of them are also capable to writing to a database. Rsyslog is a drop-in replacement for stock syslogd and also *is* the stock syslogd on some platforms (e.g. Fedora 8 and above). Installation in Detail ---------------------- 1. Upload all files from the loganalyzer/src/ folder to you webserver. The other files are not needed on the webserver. 2. If your webserver has write access to the LogAnalyzer folder, you can skip the following step: Upload the scripts configure.sh and secure.sh from the contrib folder to your webserver, into the same folder where you uploaded the other LogAnalyzer files into. Then set the execution flag to them (chmod +x configure.sh secure.sh). Now run ./configure.sh, this will create a blank config.php, and will also set write access to everyone to it. You can of course do this manually if you want. 3. Now open your LogAnalyzer installation in your favourite webbrowser, you will see an error, and you will be pointed to the installation script. The install script will guide you through the LogAnalyzer installation, just follow the instructions. 3.1 Step 1 - Prerequisites Beginning of installation / welcome site This is the first page of the installation. It just tells you, that before installing, some file permission have to be checked. Simply click "Next" to start the process. 3.2 Step 2 - Verify the file permissions Here you will see, if the config.php can be written or not. If it cannot be written, you have to repeat the complete Step 2. 3.3 Step 3 - Basic Configuration You can set several basic options here. - Number of syslog messages per page = 50 (default) This is the number of syslog messages displayed on each page. You can increase the value (makes LogAnalyzer slower) or decrease the value (makes it faster). - Message character limit for the main view = 80 (default) Set the number of characters per message which will be shown in the last column of the main view. Full messages can be reviewed by hovering the mouse over it. - Show message details popup (default yes) = yes (default) Here you can set, if you want the small window with the complete message to pop up if you are hovering over a event with the cursor. If you choose "No", then you have to click on the message to see the details. 3.4 Step 4 - not implemented yet 3.5 Step 5 - not implemented yet 3.6 Step 6 - not implemented yet 3.7 Step 7 - Create the first source for syslog messages This is the most important step. Here, you will configure your first data source, which holds all your syslog data. Mainly, you have to choose a "Name of the Source" and a "Source Type". The name will be displayed later in a drop-down menu with which you choose your active syslog source. The "Source Type" can be a file, a MySQL database or the PHP PDO which supports different database types like mssql, PostgreSQL, odbc, oracle or even ibm db2. If you choose the diskfile, you have to provide the following information: - Logline Type = Syslog / Rsyslog (default) or Adiscon WinSyslog This tells LogAnalyzer, how the lines look like. This is necessary for show the log messages properly. - Syslog File = /var/log/syslog (default) This is the position of the logfile in your file system. If you choose MySQL native as data source, following information is needed: - Table Type = monitorware (default) This is the table layout. Currently, you can use "monitorware" or "syslogng". For more details see "Note on MySQL Databases" below. - Database Host = localhost (default) This is the host, where the database is located. By default this is localhost. You can specify any other host if necessary. - Database Name = loganalyzer (default) The name of the database you want to use. - Database Tablename = systemevents (default) This is the name of the table in which the data is stored. The default tablename corresponds to the tables created with the MonitorWare Line of products. - Database User = user (default) The username for the database. - Database Password = not set by default The password for the username. - Enable Row Counting = No (default) If configured to "Yes", the amount of rows in the table will be counted with every query, giving you the total records for your search, though having a lot of impact on your system when using a very large database. If configured to "No", the rows will not be counted, providing you a lot more performance. If you choose Database (PDO), the following has to be defined: - Database Storage Engine = MySQL Server (default) Choose the engine of the database you are using. The databases are available: MySQL Server, Microsoft SQL Server, ODBC Database Connection, PostgreSQL, Oracle Call Interface, IBM DB2, Firebird/Interbase 6, IBM Informix Dynamic Server, SQLite 2. - Table Type = monitorware (default) This is the table layout. Currently, you can use "monitorware" or "syslogng". For more details see "Note on MySQL Databases" below. - Database Host = localhost (default) This is the host, where the database is located. By default this is localhost. You can specify any other host if necessary. - Database Name = loganalyzer (default) The name of the database you want to use. - Database Tablename = systemevents (default) This is the name of the table in which the data is stored. The default tablename corresponds to the tables created with the MonitorWare Line of products. - Database User = user (default) The username for the database. - Database Password = not set by default The password for the username. - Enable Row Counting = No (default) If configured to "Yes", the amount of rows in the table will be counted with every query, giving you the total records for your search, though having a lot of impact on your system when using a very large database. If configured to "No", the rows will not be counted, providing you a lot more performance. 3.8 Step 8 - Finish 4. If everything went right, you should see syslog messages already in your LogAnalyzer installation. You can now remove the install.php script now. Note on Accesing Files -------------------------------- In most environments the webserver has only access to the web directory. If you want to read files e.g. from /var/log/ you have to grant the necessary permisson to your webserver. Of course, you always need to make sure that the user the web server runs under also has the correct file permissions. Be careful when doing this, you may create a security vulnerability by granting too much to too many users. Note on MySQL Databases -------------------------------- LogAnalyzer does support using a MySQL database as syslog source. LogAnalyzer supports Adiscon's MonitorWare database schema. The schema used by php-syslog-ng is also partly supported. That schema, however, is somewhat inefficient in that it stores facility and severity codes as textual values. We do not currently convert these values back to their native format and consequently facility and severity can not be taken from a php-syslog-ng database. loganalyzer-4.1.5/contrib/000077500000000000000000000000001277740250400155205ustar00rootroot00000000000000loganalyzer-4.1.5/contrib/configure.sh000066400000000000000000000000611277740250400200320ustar00rootroot00000000000000#!/bin/sh touch config.php chmod 666 config.php loganalyzer-4.1.5/contrib/secure.sh000066400000000000000000000000371277740250400173420ustar00rootroot00000000000000#!/bin/sh chmod 644 config.php loganalyzer-4.1.5/doc/000077500000000000000000000000001277740250400146255ustar00rootroot00000000000000loganalyzer-4.1.5/doc/basics.html000066400000000000000000000260051277740250400167620ustar00rootroot00000000000000 LogAnalyzer Basics

LogAnalyzer Basics

This documentation describes some basic concepts of LogAnalyzer. It is meant as a useful guide for understanding concepts, the application itself as well as the rest of the documentation.

Configuring LogAnalyzer

LogAnalyzer is configured via a master configuration file. If the userDB system (see below) is enabled, most settings can be made via the web-application itself without any further need to change the config file.

Intial configuration can also be done during a setup wizard, which writes an initial configuration file itself. This wizard can also enable the userDB system, so in this case you probably never need to touch the configuration file.

Data Sources

A data source is a set of syslog (and other) data that is gathered. Data sources can be text files or databases. Any text file is supported, as long as it contains purely printable characters and LF is used as a line terminator. This applies to all regular text files so in short you can use whatver is present in text format. Obviously, these are files written by the syslogd, but this also includes any other text file, e.g. written by an application as its log file. Note that at this time, a file data source can contain exactly one file (and NOT multiple). For the database, tabels in either MonitorWare format or the format used by php-syslog-ng is supported. We support php-syslog-ng schema mainly for migration scenarios: it is sub-optimal in that it uses text strings where integer values are sufficient. This results in the need for more database space plus slower response time. If you set up something new, be sure the use MonitorWare schema. If you use rsyslog to create the database, please note that rsyslog uses MonitorWare schema by default, too. So you probably need not to do anything special.

Searches

With LogAnalyzer, you can search any datasource for a variety of properties. By default, text is searched within the msg part of the message. However, quite complex searches can be performed. It is suggested to use the "advanced search" button to build these. Alternatively, you can also review the "LogAnalyzer search syntax" documentation to see how to craft complex searches manually.

Note that searches are done via http get requests. That means you can copy and paste an url (or bookmark and email it) and that URL will contain a complete source. This is actually a great way to send searches to a co-worker or have some automatted process (eg via cron " wget) pull specific data on a periodic schedule.

The search part of LogAnalyzer is used much like any major search engine and hopefully is quite intuitive.

Note that a search is currently limited to a single data source only. If you would like to search across different data sources, you need to do this on the basis of individual data sources. To support you at least a bit in the process, there is a special page (for historical reasons called "the Oracle") which generates canned searches for you, so that you only need to click the individual search links to perform these searches. We know this is not perfect, but we hope this is useful.

Context Links and Menues

At appropriate places, LogAnalyzer generates context links to potentially helpful information. For example, links to domain or IP range owner lookup or troubleshooting information (via the external knowledge base) are generated. At other places, links to the cross-datasource search capability are generated.

Consider this example to understand why it is done and how it may be useful. Let's assume you have two data sources, one with your firewall log and one with the mail log. Now you wonder why a recent spam attack could happen. You review the mail log and find indication of the spammer. Now, you can lookup the IP addresses and domain names used. Probably more interesting, you can invoke the cross-datasource search tool and obtain information on what the firewall log has recorded about the IPs in question. Finally, you may want to check the online knowledge based if there is some information recorded about this or a similar event (for example, if you found a message that puzzels you). You may even ask you peers for help via the knowledge base.

In addition to the links, there are helpful popup menues for most of the properties being displayed. To find out what you can do, please simply click the values (even those that do NOT look like a link) and see what the popup has to offer (and, yes, we will improve doc on these topics... ;)).

Windows Event Log Data

LogAnalyzer contains automatic support for displaying Windows Event Log data in a useful format if that data is generated by either the EventReporter or the MonitorWare Agent forwarding agents. This includes proper detection, and ability to filter, on event-log specific properties (like Windows event id and such).

The UserDB System

The so-called userDB system allows different user accounts to be created and user-specific settings to be made. This is a great aid if multiple people share a single instance of LogAnalyzer.

The userDB system is disabled by default. This is because a database is needed for the userDB system as user profiles are stored inside it. Setting up the database tables requires some additonal work, so we do not expect users to do this by default. Please do not confuse this with database (log) data sources: these are not necessarily needed. You can use the userDB system and still store the log data in text files (which may be desirable from a performance point of view). To enable the userDB system, the LogAnalyzer configuration file needs to be changed. Note that once the userDB system is active, most system settings can be made via the web application.

There are basically two types of users: admins and non-admins. Admins can change anything, non-admins can only change their personal preferences.

The userDB system is not yet a strong security tool, but helps greatly with moderate security needs. User groups can be created and data sources be assigned to a specific user group. So only users of this group can access the data source in question. This is useful if you have a group of people caring about the firewall logs and another group caring about the mail logs. You can then define two different groups and assign the data source accordingly. Then, assign the user's the group they should belong to. The end result is that every user only sees what he or she is expected to see.

Do I need a Database?

Not necessarily. LogAnalyzer only needs databases if you plan to use the userDB system or use database data sources. Without that, no database is needed. A typical scenario, for example, is private review of server-based syslog files. For this use case, no database is required.

Securing LogAnalyzer

Log data is very valuable to an attacker. So it is highly suggested that you secure access to any LogAnalyzer instance, especially if it contains live log data. We suggest to place it on local, non-internet accessible servers, only. In a hosting environment, it may be useful to place it on an internet-accessible server. In this case, access should be protected on the http layer at least. In any case, the use of https is suggested to prevent accidental loss of confidentiality (this is important in the local network, too!).

The userDB system can be used as a tool to tune user's ability to view data sources (users can only view those sources that belong to one of their groups). However, this is currently considered a secondary access control mechanism. An Internet-accessible instance of LogAnalyzer should NOT rely on that as the sole source of protection.

Please note that this section gives just a few rough, common-sense recommendations. Evaluate the risk yourself, check with your policies and do not blame us if you made a mistake ;) In short: use LogAnalyzer at your sole risk, and reduce this risk by thinking about what you do.

You may consider to purchase professional services if you are serious about the risk implications in an (enterprise) environment.

External Tool Integration

As already described, LogAnalyzer accesses external tools, most importantly the MonitorWare Knowledge Base to aid you in your analysis effort. The goal is to provide useful information that helps you get the job done better and quicker.

No private data (except the obious one, eg a domain name for a domain search) is provided to the external entity nor is anything recorded (except for what can be seen from regular web logs). However, you need to decide yourself, as with all external accesses, if this functionality fits into your security policy.

Please note that the external tool is able to call back into your local LogAnalyzer installation if you provide it with the local URL. This can be done via the user profile in the external part. Note that both the local as well as the external part are programmed in such a way that no private data (except for the URL) needs to be kept externally and, most important, local data is never visible to a third-party observer. The notable exception is if you host your local LogAnalyzer on an external server without any further security measure (e.g. https, access restrictions). Even in that case the external part will not be able to access data from the local part, but an attacker may find it easy to get hold of your log data (which is always the case with such a local setup and not specifically related to the local/external integration).

Upgrades

LogAnalyzer is actively being developed. So chances are good you want to upgrade to a later release at some time. In general, it is always a good idea to backup everything before you upgrade. We highly recommend doing so. Other than that, the upgrade should be fairly easy without the installed userDB system. If the userDB system is installed, it may be necessary to upgrade the database schema. This can be done via the admin center. No access to LogAnalyzer is possible unless the database schema has been upgraded.

Again, as a general precaution, you should have a solid backup available before you run the upgrade procedure (and this specifically applies to any database content!).

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/build_from_repo.html000066400000000000000000000045601277740250400206670ustar00rootroot00000000000000 Installing LogAnalyzer from the source repository

Installing LogAnalyzer from the source repository

In most cases, people install LogAnalyzer either via a package or use an "official" distribution tarball to generate it. But there may be situations where it is desirable to install directly from the source repository. This is useful for people who would like to participate in development or who would like to use the latest, not-yet-released code. The later may especially be the case if you are asked to try out an experimental version.

Installing from the repsitory is not much different than building from the source tarball, except that you need to know how to obtain things.

Obtaining the Source

You need to download the sources. LogAnalyzer is currently kept in a git repository. You can clone this repository either via http or git protocol (with the later being much faster. URLS are:

  • git://git.adiscon.com/git/phplogcon.git
  • http://git.adiscon.com/git/phplogcon.git

There is also a browsable version (gitweb) available at http://git.adiscon.com/?p=phplogcon.git;a=summary. This version also offers snapshots of each commit for easy download. You can use these if you do not have git present on your system.

After you have cloned the repository, you are in the master branch by default. This is where we keep the devel branch. If you need any other branch, you need to do a "git checkout --track -b branch origin/branch". For example, the command to check out the beta branch is "git checkout --track -b beta origin/beta".

Actual Install Process

The actual installation does not differ from a version obtained via a tarball. Please see the LogAnalyzer install guide for details on how to do that.

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/devel/000077500000000000000000000000001277740250400157245ustar00rootroot00000000000000loganalyzer-4.1.5/doc/devel/Activity.dia000066400000000000000000000113761277740250400202070ustar00rootroot00000000000000 ]sF_A9/*e 3 DM%Nnnх%,sA^~3,blkUcD0ӿ~aGi# Y:śOw۳QȂ%>7EyP5Ëq\Eo,Am~E]Je:u2?/Wm8ͬAu~E:{ u__ҫ0۽rXRܯjKZ#dfU.%D)oik5h+bd(&.A!D< {)xr㒋%K.ʯViVdATI^iIIa:,ǖ7QQ&. ޞcO"neEUyq{*~o꟣<æbsݷ5wCyVx{! XG0?ͪkZtYvq`_퀵"aϏ0mm^FbHa r$;Ri6pxą^@uD l%PP@QGW^;N58>(0Ataڽ>3ĉ)#aD M:@v[!z ݛF\). х .%I+ĉ FkԢ P0DΠn@Éxq5 cHEܴmISsP~p->jEvzD* j8tfA!1R!LU#{}udIf{rwY2ύ܈y5 js+8iO q󔮔2ɢ.=Ce\F,U oէͫ.OsD 5e<$i  .$W,œ¬1Z̤JД)poyLf7iTǦ eazLuq 7e;6K/{ ^{/ڇ[w4id9yә6+Jn,*d^LJH x_﮵D&/X^/>;> ?@~q̘H#?~) A@v h` "iL](gn4Y."^u#z|PR R R R R R  |X ;):.4AvHoNAvXRAt'e$*@zx =@z@ LwiVYCm&huvO1Fh%98R4H3^igD{32w_1=EI! lOl ~,bFrVG !KKvv S/Q1H1/RTlׅSz/;X*(I;Y3+nS",: DfQCQmˡh4K\k"OE]3جTXlnꛇs* d&}89MiI !UV4IK5U/V=)%Hz`v>7 P82Zw1al߄&O`<Ӱ96xz-c] H#6I7'l&~`2A&aÉ "$2B"KRxX 0bП1;b1Q;&†g p,bS  2ΩP$]Ǔ*clDh{|ecxJf* *uulK#o,G\I@p=+<ӟ/hB2DԖR#5WCOo0m7ętWt$&4><"Ήa#Y6W'uxp uJ0I IaIFt$@\d$ )B@$ $+ޅy,>6R&`O0E'l*CVA׶{OH0,ib-@dN( rC6]f>d#5_}0A跳 IX,^eWk71uT? Xϕ_?OH[SAg< I.ꨋ|C$|΢hf⌃f:#ÇL3S2)| .}GTkHHcaj@ B!ZR^,:I9+}'vȲڞU} #X!k1 Y7Fo[,$:`O5{*t<#w*(:+LAsUGyN(QLxE( 6>.{8F8'~k@ ڃ  6:T Bl* v%]d`mE NG7>I/6eF2#FÿN *5eݑc6DbIN %P &ZA˓&60l M=„fN b6J6&D|gz<OP00_0gП8\ cCTi5kSPp,d+YuUW3G>%#djD]訸d 3Kxf2lȩ \PT- "0 6!`t-oD([AMyH!7,2Iх~ o%;ycu#Cw'ǦkkCDķA,-j]:Uh#D\Ўgg L":6 * 9-|f6 ;{q{ !G+PWUǶ٘@S4H55ưjچq&5\ :jQoԶ=A j6]~u*1/Y$v{WqD&*j7>GS 2ˡ#RDeWNacݴO>?%1c>"R`hh Ufp IK^Ja,ؼ`s1@lU?OZAyDĀ:h7oE-o޶ȕ8d#!i_[g}*چo^&a F~ 9>m'p<+7(NdAeS!i6jjqyjz&C ",eIGI{DEù8V\elf7i Mחi`-K "qLF_ߺ= e5Ӻ2\jtp6i *DRXr8bXYk]&lVS%Ϥ>J sf+SoGS|۪<`Xk+~N~6Q[c&Ͼg1̖M_ 2h2qbKdU+''î3s~ώYxj@(5-n^/M?i aXtzf)F-#%#5faXY.!,1;n G}0~\v+$ XRρobѓ/{r}sK 毹qXYELuN 1_M҄*pZ*i06*itB|ôLK_CK)բX 5clKY Id%uYV$*mqZ=[*k$˻O^^gP=B=wT˩"{ޒ6mn#@ G0#LwT~L~)?H<VuZgyޅay%sHlnWV0 K gȱkWkoMs܇۳o˷g\sloganalyzer-4.1.5/doc/devel/objectmodel.dia000066400000000000000000000101171277740250400206720ustar00rootroot00000000000000 ][s۶~ϯ硝Qa&JuN&ɜG$B2 ;dْH7зO3#b!b߾OCqIGFDӣ_?_M8H$N.r||}}M…2$ D0ǪqJ|JɃ\2#Svz4o#hjn17hxz8}9gO3:aC5TzvY,D.f;MrI~ij%ThW!>+kDIQs.'"}˲d9y3' %KK.KNKr!ђsVP-}lbHˏVVr'< F^_^^|4]z D0 YH6T{>^s5,{>s[~{lMNOfLJf}]щY~Y$B`|mX}+sgl$W}&BB8謻97ܨۙY^AnG!g]Ga8&i4 ٚHt`pb٤g{K\re!^bYK*de׶KL.e>1!-'Rf"2Td"ΣU)P=KG;R348b^T4Jh#uod*R}B妋53̤TX ϵt_M҅B"ddW} I'MJNYD69Gnax湽ɾK FF=Z%1Tzw^1h:35gܬHɡ쎤(HA%ifGyCX#F׹.rwp 6_Lº|0Zpb$Kr̹{l y !%ۡ{(U0,r,OWvd2am/ 1FervdGL!4Ma9WKk?Bz =#R#8ߐHP?,& ;!;˹ [7/zU&9o'[s(m^]2HEw֘RQGx%7~JD M~`}qm{P<rpVFwUǐT^?oAFss$ % g3aA_쬪s |9]{-[`-M ={ dz? ']B}@}@}BĎ=:3r Hj)ϹNgs8r X +X~ع`؃߽/j@s|CFobX6Fq.-17$V>Ƹ}~OR>a ,ܬ+Vd}7.<.tH,ds 3G&717+a 7T(X (r(r9P0P0P0m9UvX0 ÂV(h"C=`oAl 6Hܖ I%n%;;;eQttttC@@<@|v ~jd| ܎S?O$X6Z+sT$۹xoj }E*" hD?3{#G=Bz\\ޅ^L`ၯt{jVim>jK9m~ 'ɶIKj鼜"։= }q-|qUEEy2کxjY{Gހ{xIJza[E.Lj=W-7=)X "r$L'CH}ƌ'1 8 @^?C4>}1|8Kje/q/q/q/q/qI^lBSzxHC0~BS>Th2|&nD۱M)r;Nh/TBA;n$ASf}mﮔ$r~\ !t&  p' ʙAkgK}|c0e `)@a )@a )Z5l} h5 ͓E-r'+Ӕx<L?N(Q?cO_޼L=/# 6#bUW&S@ c84_kK2'IzIZckTYwWS4XYco׻iYS ߖ, ͞Q.xW'A'j Dw"b`#11>҅1d\0ccW:I"Z ka>?9 '[%KP ?:X:ujRbc Free Support for LogAnalyzer

Free Services for LogAnalyzer

A personal word from the authors of LogAnalyzer:

The LogAnalyzer community provides ample free support resources. Please see our troubleshooting guide to get started.

Every now and then we receive private mail with support questions. We appreciate all feedback, but we must limit my resources so that we can help drive a great project forward.

To do so, we have decided not to reply to unsolicited support emails, at least not with a solution (but rather a link to this page ;)). We hope this does not offend you. The reason is quite simple: If we do personal support, you gain some advantage without contributing something back. Think about it: if you ask your question on the public forum or mailing list, others with the same problem can see it and, most importantly, even years later find your post (and the answer) and get the problem solved. So by solving your issue in public, you help create a great community ressource and also help your fellow users finding solutions quicker. In the long term, this also contributes to improved code because the more questions users can find solutions to themselves, the fewer we need to look at.

But it comes even better: the LogAnalyzer community is much broader than the authors ;) - there are helpful other members hanging around at the public places. They often answer questions, so that we do not need to look at them (btw, once again a big "thank you", folks!). And, more important, those folks have different background than us. So they often either know better how to solve your problem (e.g. because it is distro-specific) or they know how to better phrase it. So you do yourself a favor if you use the public places.

An excellent place to go to is the LogAnalyzer forum inside the knowledge base (which in itself is a great place to visit!). For those used to mailing lists, the LogAnalyzer mailing list also offers excellent advise.

Don't like to post your question in a public place? Well, then you should consider purchasing LogAnalyzer professional support. The fees are very low and help fund the project. If you use LogAnalyzer seriously inside a corporate environment, there is no excuse for not getting one of the support packages ;)

Of course, things are different when we ask you to mail us privately. We'll usually do that when we think it makes sense, for example when we exchange debug logs.

I hope you now understand the free support options and the reasoning for them. I hope we haven't offended you with our words - this is not our intension. We just needed to make clear why there are some limits on our responsiveness. Happy analyzing!

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/install.html000066400000000000000000000235421277740250400171670ustar00rootroot00000000000000

HOWTO install LogAnalyzer



Abstract

In this paper, I describe how to install LogAnalyzer. It is intentionally a brief step-by-step guide, targeted to those who want to quickly get it up and running. For more elaborate information, please consult the rest of the manual set.

Steps To Do

To install LogAnalyzer, you need:

  • Apache or IIS Webserver
  • PHP5

Optionally, you may need:

  • MySQL Database

For obvious reasons, you also need some syslog data. Any standard syslogd will do. From a feature and stability point of view, we recommend either one of these (which we also wrote ;) ):

Both of them are also capable of writing to databases. Rsyslog is a drop-in replacement for stock syslogd and also *is* the stock syslogd on some platforms (e.g. Fedora 8 and above).

Step 1 - Download Software

For obvious reasons, you need to download LogAnalyzer. Here, I assume that you use a distribution tarball.

Load the most recent build from http://loganalyzer.adiscon.comdownloads. Extract the software with "tar xzf -nameOfDownloadSet-". This will create a new subdirectory LogAnalyzer-version in the current working directory. CD into that.

Step 2

Upload all files from the loganalyzer/src/ folder to you webserver. The other files are not needed on the webserver.

Step 3

If your webserver has write access to the LogAnalyzer folder, you can skip the following step:

Upload the scripts configure.sh and secure.sh from the contrib folder to your webserver, into the same folder where you uploaded the other LogAnalyzer files into. Then set the execution flag to them (chmod +x configure.sh secure.sh).

Now run ./configure.sh, this will create a blank config.php, and will also set write access to everyone to it.

You can of course do this manually if you want.

Step 4

Now open your LogAnalyzer installation in your favourite webbrowser, you will see an error, and you will be pointed to the installation script. The install script will guide you through the LogAnalyzer installation, just follow the instructions.

Step 4.1

Prerequisites Beginning of installation / welcome site. This is the first page of the installation. It just tells you, that before installing, some file permission have to be checked. Simply click "Next" to start the process.

Step 4.2

Verify the file permissions Here you will see, if the config.php can be written or not. If it cannot be written, you have to repeat the complete Step 2.

Step 4.3

Basic Configuration

You can set several basic options here.

  • Number of syslog messages per page = 50 (default)

    This is the number of syslog messages displayed on each page. You can increase the value (makes LogAnalyzer slower) or decrease the value (makes it faster).

  • Message character limit for the main view = 80 (default)
    Set the number of characters per message which will be shown in the last column of the main view. Full messages can be reviewed by hovering the mouse over it. Many folks prefer to use a setting of "0", which means complete messages will be displayed<
  • Show message details popup (default yes) = yes (default). Note that many people find the popups intrusive and prefer to disable them. Use "no" in this case.

Step 4.4

Not implemented yet, some real magic may happen here at a later stage ;-) - for now, just skip it.

Step 4.5

Create the first source for syslog messages. This is the most important step. Here, you will configure your first data source, which holds all your syslog data.

Mainly, you have to choose a "Name of the Source" and a "Source Type". The name will be displayed later in a drop-down menu with which you choose your active syslog source. The "Source Type" can be a file, a MySQL database or the PHP PDO which supports different database types like mssql, PostgreSQL, odbc, oracle or even ibm db2.

If you choose the diskfile, you have to provide the following information:
  • Logline Type = Syslog / Rsyslog (default) or Adiscon WinSyslog

    This tells LogAnalyzer, how the lines look like. This is necessary for show the log messages properly.

  • Syslog File = /var/log/syslog (default)

    This is the position of the logfile in your file system.

If you choose MySQL native as data source, following information is needed:
  • Table Type = monitorware (default)

    This is the table layout. Currently, you can use "monitorware" or "syslogng". For more details see "Note on MySQL Databases" below.

  • Database Host = localhost (default)

    This is the host, where the database is located. By default this is localhost. You can specify any other host if necessary.

  • Database Name = loganalyzer (default)

    The name of the database you want to use.

  • Database Tablename = systemevents (default)

    This is the name of the table in which the data is stored. The default tablename corresponds to the tables created with the MonitorWare Line of products.

  • Database User = user (default)

    The username for the database.

  • Database Password = not set by default

    The password for the username.

  • Enable Row Counting = No (default)

    If configured to "Yes", the amount of rows in the table will be counted with every query, giving you the total records for your search, though having a lot of impact on your system when using a very large database. If configured to "No", the rows will not be counted, providing you a lot more performance.

If you choose Database (PDO), the following has to be defined:
  • Database Storage Engine = MySQL Server (default)

    Choose the engine of the database you are using. These databases are supported: MySQL Server, Microsoft SQL Server, ODBC Database Connection, PostgreSQL, Oracle Call Interface, IBM DB2, Firebird/Interbase 6, IBM Informix Dynamic Server, SQLite 2.

  • Table Type = monitorware (default)

    This is the table layout. Currently, you can use "monitorware" or "syslogng". For more details see "Note on MySQL Databases" below.

  • Database Host = localhost (default)

    This is the host, where the database is located. By default this is localhost. You can specify any other host if necessary.

  • Database Name = loganalyzer (default)

    The name of the database you want to use.

  • Database Tablename = systemevents (default)

    This is the name of the table in which the data is stored. The default tablename corresponds to the tables created with the MonitorWare Line of products.

  • Database User = user (default)

    The username for the database.

  • Database Password = not set by default

    The password for the username.

  • Enable Row Counting = No (default)

    If configured to "Yes", the amount of rows in the table will be counted with every query, giving you the total records for your search, though having a lot of impact on your system when using a very large database. If configured to "No", the rows will not be counted, providing you a lot more performance.

Step 4.6

Finish :)

Step 5

If everything went right, you should see syslog messages already in your LogAnalyzer installation. You can now remove the install.php script now.

Note on Accesing Files

In most environments the webserver has only access to the web directory. If you want to read files e.g. from /var/log/ you have to grant the necessary permisson to your webserver.

A note for linux systems that have SELinux enabled, you will most likely get an access denied error when trying to access logs in /var/log regardless if the file permissions are correct.

Of course, you always need to make sure that the user the web server runs under also has the correct file permissions. Be careful when doing this, you may create a security vulnerability by granting too much to too many users.

Note on MySQL Databases

LogAnalyzer does support using a MySQL database as syslog source. LogAnalyzer supports Adiscon's MonitorWare database schema. The schema used by php-syslog-ng is also partly supported. That schema, however, is somewhat inefficient in that it stores facility and severity codes as textual values. We do not currently convert these values back to their native format and consequently facility and severity can not be taken from a php-syslog-ng database.

Copyright

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/manual.html000066400000000000000000000102531277740250400167710ustar00rootroot00000000000000 LogAnalyzer documentation

LogAnalyzer - Documentation

The LogAnalyzer project provides an easy to use but powerful front end for searching, reviewing and analyzing network event data, including syslog, windows event log and many other event sources. It focusses on the user-interface side of this project, so the data itself needs to be gathered by another program, for example the stock syslogd, rsyslog (often the distro's default syslogd), WinSyslog or MonitorWare Agent. LogAnalyzer works equally well on Linux and Windows. It is a free, GPLed open source application written mostly in php. Data can be obtained from databases but also from plain text files, for example those that are written by the syslogd.

Follow the links below for the

We have some in-depth papers on

You can also browse the following online resources:

Don't forget about the LogAnalyzer mailing list. If you are interested in the "backstage" behind the overall idea that LogAnalyzer contributes to, you may find Rainer's blog an interesting read.

Feedback is always welcome, but if you have a support question, please do not mail the authors directly (why not?).

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/professional_services.html000066400000000000000000000015131277740250400221220ustar00rootroot00000000000000

Professional Services for Adiscon LogAnalyzer

Professional services are being offered by Adiscon, please follow the Adiscon LogAnalyzer support options link for more details.

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/searching.html000066400000000000000000000136301277740250400174610ustar00rootroot00000000000000 LogAnalyzer Search Syntax

LogAnalyzer Search Syntax

This document describes how you can search in LogAnalyzer. Please note that you can also always use the "advanced search" dialog to build the search string.

A search term is always in the format "property:search" where property is the data item you will search (for example the syslog tag, source system). Available properties depend on the data source in use, parsers present, and even the actual data. What usually is available is listed below. Please note that there is a special case. Because it is so common to search inside the message text itself, there is no property name for this - to perform this search, simply omit the "property:" part.

In LogAnalyzer we basically have two different types of data types which are handled different from each other, these are: string and number. There is also a date type filter and the message field, but these are handled separately from the others fields. Every filter usually is delimited by spaces, and filters from different fields are combined by AND.

String Fields

For the string type fields, you can search for partially or full string matches. Searching for full string matches can improve performance in your logstream. If you have spaces in your search string, you need to replace them with a + character, the reason is simple, because the space character splits the filters. If you want to search for a single + sign, you need to replace it with a double +, so + becomes ++ in your search string. To separate multiple search values for the same fieldtype, you just need to separate them commas - but remember, no spaces!

String filters can be included in your search as well as excluded. All included filter of a field type will be combined by OR which means if you search for "Search1" and "Search2", you will results matching both strings. This is different if you exclude strings from your search. Excluded filters from a field type will be combined with AND for the simple reason, if you want to exclude "Search1" and "Search2", you want that both are excluded, and one or the other.

Below you will see how the syntax looks like:

  • Search for a partially string match: property:search
  • Search for multiple partially string matches: property:search1,search2
  • Search for a full string match: property:=search1,search2
  • Search for multiple full string matches: property:=search
  • Exclude by a partially string match: property:-search
  • Exclude multiple partially string matches: property:-search1,-search2
  • Exclude by a full string match: property:-=search
  • Exclude multiple full string matches: property:-=search1,-=search2

Additionally some Logstream sources support REGEX Searches when supported native. Currently the MySQL LogStream and PDO Logstream (MySQL and PostGRESQL only) support REGEX searches. To use REGEXP in searches, prepend the search phrase with the ~ character. See the samples below:

Search samples with REGEX support:

  • Search for REGEX string match: property:~search
  • Exclude string by REGEX match: property:-~search

Number Fields

Number fields work similar to string fields, except that there are partially matches, and the search value obviously must be a number. There are a few exceptions where you can use string representations instead of numbers, but these will be explained later.

Below you will see how the syntax looks like:

  • Search for a number: property:1234
  • Search for multiple numbers: property:1234,5678
  • Exclude a number from the search: property:-1234
  • Exclude multiple numbers from the search: property:-1234,-5678

 

Date Field

There is currently only one date field possible, and so we have two different kinds of date filters we can use on this date field. The first option is to search for a time range where you need to use the datefrom and dateto properties. The date/time format has to be ISO TIMESTAMP (see RFC 3339 for more) for both properties. The other option is datelastx which will filter for the last hour (filter value 1), last 12 hours (filter value 2), last 24 hours (filter value 3), last 7 days (filter value 4) and last 31 days (filter value 5).

  • This search will filter for events starting at 2007-10-01 and ending at 2008-10-01: datefrom:2007-10-1T00:00:00 dateto:2008-10-1T23:59:59
  • This search will show events from the last 24 hours: datelastx:3

 

Message Field

The message field is a string type field and does not require the use of a property. You can have include and exclude filters here as well. The main difference to ordinary string filters is, that include filters are combined with AND instead of OR.

  • This search will include "test1": test1
  • This search will include "test1" and "test2": test1 test2
  • This search will exclude "test1": -test1
  • This search will exclude "test1" and "test2": -test1 -test2

 

 

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/textfiles.html000066400000000000000000000117301277740250400175240ustar00rootroot00000000000000 Using text log files with LogAnalyzer

Using text log files with LogAnalyzer

LogAnalyzer natively supports operting on text log files. So there is no need to put log data into databases. Each approach has advantages and disadvantages, which we will not discuss in this paper. Here, we focus on how text log files are supported.

We assume that the reader is familiar with basic LogAnalyzer concepts. If you are not, get aquainted to them, first.

Requirements for text log files

LogAnalyzer can operate on any standard text log file, that means a file that purely consists of printable characters and uses LF (linefeed, newline) characters as log line terminators. Most importantly, this includes standard syslog files as well as web server and other application logs.

A data source is defined to pull data from a text log file. Note that only a single text log file can be contained in any data source.

Working with text log files

Text log files are just regular data sources. You can work with them like with any other data sources, for example, you can browse them, search them, generate graphics from the or base reports on their content. Depending on the size of the text log and on the operation being performed, performance may be worse or even better than with using database-based data sources. For typical operations and typical text file sizes, performance should be quite well.

Note that some options make limited sense when working with text log files. For example, you may set a filter with a broad date range, but the text log file will, for obvious reasons, only provide what is currently contained in it. For typical syslog files, that will probably mean they contain maximum one day's data.

Use Cases for Text Log Files

A typical use case is in a hosting environment. There, LogAnalyzer may be used to do an online review of log data, via the web and without the need to log into an SSH session. This can be very handy to learn what is currently going on or, for example, to verify if an important mail left your system.

Another use case is that you would like to keep an eye on some local text files, for example while debugging an installation. Instead of reconfiguring your whole logging system, you can set up a LogAnalyzer instance and point it to the log files in question. Keep in mind that you are not restricted to syslog files. For example, you may want to add additional application text log files as data sources as well. With the cross-datasource search capability, you can quickly follow events across the boundaries of log servers.

For secuity sensitive-environments, the access to LogAnalyzer can be protected by several levels, e.g. user authentication or IP ranges at the firewall or http server level. Also, one may consider to activate a LogAnalyzer instance only when actually needed to do troubleshooting and keep it "turned off" at other times. The beauty of text log files is that you do not need to reconfigure the whole logging system to do so. All that is needed is to disable the web site inside the http server.

Support of Dynamic Logfilenames (and Pathes)

Since Loganalyzer Version 2.7.0, dynamic logfilenames are supported. You can add date replacement variables into the filename property which will automatically be applied using the current systemtime. For example if you have logfiles located in subfolders named by Year, month and date like this: /var/log/servername/2015/01/30/syslog, the configured filename property would be this: /var/log/Servers/ServerName/%Y/%m/%d/syslog. Below is a list of possible replacements.

%y = Year with two digits (e.g. 2002 becomes "02")
%Y = Year with 4 digits
%m = Month with two digits (e.g. March becomes "03")
%M = Minute with two digits
%d = Day of month with two digits (e.g. March, 1st becomes "01")
%h = Hour as two digits
%S = Seconds as two digits. It is hardly believed that this ever be used in reality.
%w = Weekday as one digit. 0 means Sunday, 1 Monday and so on.
%W = Weekday as three-character string. Possible values are "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat".

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/troubleshoot.html000066400000000000000000000047171277740250400202550ustar00rootroot00000000000000 troubleshooting LogAnalyzer

troubleshooting LogAnalyzer

Having trouble with LogAnalyzer? This page provides some tips on where to look for help and what to do if you need to ask for assistance. This page is continously being expanded.

Useful troublehshooting ressources are:

  • The LogAnalyzer documentation - note that the online version always covers the most recent development version. However, there is a version-specific doc set in each tarball. If you installed LogAnalyzer from a package, there usually is a LogAnalyzer-doc package, that often needs to be installed separately. If running the default installation, you should simply be able to get to the correct documentation version by clicking on the "help" button on any LogAnalyzer page.
  • The LogAnalyzer wiki (part of the larger rsyslog wiki) provides user tips and experiences.
  • Check the bugzilla to see if your problem is a known (and even fixed ;)) bug.

Configuration Problems

Validate your text configuration settings and, if you use the user system, also the configuration stored in your database. Some very few configuration settings can only be applied in the text config files.

Asking for Help

If you can't find the answer yourself, you should look at these places for community help.

  • The LogAnalyzer forum. This is the preferred method of obtaining support.
  • The LogAnalyzer mailing list. This is a low-volume list which occasional gets traffic spikes. The mailing list is probably a good place for complex questions.

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/doc/windowsevent.html000066400000000000000000000037431277740250400202560ustar00rootroot00000000000000 Using Windows Event Logs with LogAnalyzer

Using Windows Event Logs with LogAnalyzer

LogAnalyzer provides a message parser that understand Windows Event Log entries in Adiscon common format. With that parser, all Windows event log properties can be easily accessed, displayed and searched for.

How to get hold of the Windows Event Log Data

LogAnalyzer does not (yet) provide a data source driver to natively pull the log entries from the Windows event logs. So it needs to be delivered to it. This can be done with Adiscon's EventReporter or MonitorWare Agent software. These Agents are excuted either on each Windows machine (or a single machine doing remote monitoring) and the events extracted are written to LogAnalyzer's datasource (either a file or database). Depending on your network setup, you may have some intermediate systems, in which case the actual write to the data source is done by something like WinSyslog or rsyslog.

Once the data is inside the data source, the event log subparser does the rest. Together with proper view defininitions, it provides a native-like view and search capability of that data. Please note that Windows Event Log Fields can also be used as sources for drawing graphics.

[manual index] [LogAnalyzer site]

This documentation is part of the Adiscon LogAnalyzer project.
Copyright © 2008-2011 by Adiscon. Released under the GNU GPL version 3 or higher. Adiscon LogAnaylzer commercial licenses are also available.

loganalyzer-4.1.5/src/000077500000000000000000000000001277740250400146475ustar00rootroot00000000000000loganalyzer-4.1.5/src/.htaccess000066400000000000000000000000211277740250400164360ustar00rootroot00000000000000Options -indexes loganalyzer-4.1.5/src/BitstreamVeraFonts/000077500000000000000000000000001277740250400204315ustar00rootroot00000000000000loganalyzer-4.1.5/src/BitstreamVeraFonts/COPYRIGHT.TXT000066400000000000000000000135021277740250400224030ustar00rootroot00000000000000Bitstream Vera Fonts Copyright The fonts have a generous copyright, allowing derivative works (as long as "Bitstream" or "Vera" are not in the names), and full redistribution (so long as they are not *sold* by themselves). They can be be bundled, redistributed and sold with any software. The fonts are distributed under the following copyright: Copyright ========= Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Copyright FAQ ============= 1. I don't understand the resale restriction... What gives? Bitstream is giving away these fonts, but wishes to ensure its competitors can't just drop the fonts as is into a font sale system and sell them as is. It seems fair that if Bitstream can't make money from the Bitstream Vera fonts, their competitors should not be able to do so either. You can sell the fonts as part of any software package, however. 2. I want to package these fonts separately for distribution and sale as part of a larger software package or system. Can I do so? Yes. A RPM or Debian package is a "larger software package" to begin with, and you aren't selling them independently by themselves. See 1. above. 3. Are derivative works allowed? Yes! 4. Can I change or add to the font(s)? Yes, but you must change the name(s) of the font(s). 5. Under what terms are derivative works allowed? You must change the name(s) of the fonts. This is to ensure the quality of the fonts, both to protect Bitstream and Gnome. We want to ensure that if an application has opened a font specifically of these names, it gets what it expects (though of course, using fontconfig, substitutions could still could have occurred during font opening). You must include the Bitstream copyright. Additional copyrights can be added, as per copyright law. Happy Font Hacking! 6. If I have improvements for Bitstream Vera, is it possible they might get adopted in future versions? Yes. The contract between the Gnome Foundation and Bitstream has provisions for working with Bitstream to ensure quality additions to the Bitstream Vera font family. Please contact us if you have such additions. Note, that in general, we will want such additions for the entire family, not just a single font, and that you'll have to keep both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add glyphs to the font, they must be stylistically in keeping with Vera's design. Vera cannot become a "ransom note" font. Jim Lyles will be providing a document describing the design elements used in Vera, as a guide and aid for people interested in contributing to Vera. 7. I want to sell a software package that uses these fonts: Can I do so? Sure. Bundle the fonts with your software and sell your software with the fonts. That is the intent of the copyright. 8. If applications have built the names "Bitstream Vera" into them, can I override this somehow to use fonts of my choosing? This depends on exact details of the software. Most open source systems and software (e.g., Gnome, KDE, etc.) are now converting to use fontconfig (see www.fontconfig.org) to handle font configuration, selection and substitution; it has provisions for overriding font names and subsituting alternatives. An example is provided by the supplied local.conf file, which chooses the family Bitstream Vera for "sans", "serif" and "monospace". Other software (e.g., the XFree86 core server) has other mechanisms for font substitution. loganalyzer-4.1.5/src/BitstreamVeraFonts/README.TXT000066400000000000000000000005001277740250400217620ustar00rootroot00000000000000Contained herin is the Bitstream Vera font family. The Copyright information is found in the COPYRIGHT.TXT file (along with being incoporated into the fonts themselves). The releases notes are found in the file "RELEASENOTES.TXT". We hope you enjoy Vera! Bitstream, Inc. The Gnome Project loganalyzer-4.1.5/src/BitstreamVeraFonts/RELEASENOTES.TXT000066400000000000000000000176601277740250400227350ustar00rootroot00000000000000Bitstream Vera Fonts - April 16, 2003 ===================================== The version number of these fonts is 1.10 to distinguish them from the beta test fonts. Note that the Vera copyright is incorporated in the fonts themselves. The License field in the fonts contains the copyright license as it appears below. The TrueType copyright field is not large enough to contain the full license, so the license is incorporated (as you might think if you thought about it) into the license field, which unfortunately can be obscure to find. (In pfaedit, see: Element->Font Info->TTFNames->License). Our apologies for it taking longer to complete the fonts than planned. Beta testers requested a tighter line spacing (less leading) and Jim Lyles redesigned Vera's accents to bring its line spacing to more typical of other fonts. This took additional time and effort. Our thanks to Jim for this effort above and beyond the call of duty. There are four monospace and sans faces (normal, oblique, bold, bold oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see www.fontconfig.org) can artificially oblique the serif faces for you: this loses hinting and distorts the faces slightly, but is visibly different than normal and bold, and reasonably pleasing. On systems with fontconfig 2.0 or 2.1 installed, making your sans, serif and monospace fonts default to these fonts is very easy. Just drop the file local.conf into your /etc/fonts directory. This will make the Bitstream fonts your default fonts for all applications using fontconfig (if sans, serif, or monospace names are used, as they often are as default values in many desktops). The XML in local.conf may need modification to enable subpixel decimation, if appropriate, however, the commented out phrase does so for XFree86 4.3, in the case that the server does not have sufficient information to identify the use of a flat panel. Fontconfig 2.2 adds Vera to the list of font families and will, by default use it as the default sans, serif and monospace fonts. During the testing of the final Vera fonts, we learned that screen fonts in general are only typically hinted to work correctly at integer pixel sizes. Vera is coded internally for integer sizes only. We need to investigate further to see if there are commonly used fonts that are hinted to be rounded but are not rounded to integer sizes due to oversights in their coding. Most fonts work best at 8 pixels and below if anti-aliased only, as the amount of work required to hint well at smaller and smaller sizes becomes astronomical. GASP tables are typically used to control whether hinting is used or not, but Freetype/Xft does not currently support GASP tables (which are present in Vera). To mitigate this problem, both for Vera and other fonts, there will be (very shortly) a new fontconfig 2.2 release that will, by default not apply hints if the size is below 8 pixels. if you should have a font that in fact has been hinted more agressively, you can use fontconfig to note this exception. We believe this should improve many hinted fonts in addition to Vera, though implemeting GASP support is likely the right long term solution. Font rendering in Gnome or KDE is the combination of algorithms in Xft2 and Freetype, along with hinting in the fonts themselves. It is vital to have sufficient information to disentangle problems that you may observe. Note that having your font rendering system set up correctly is vital to proper judgement of problems of the fonts: * Freetype may or may not be configured to in ways that may implement execution of possibly patented (in some parts of the world) TrueType hinting algorithms, particularly at small sizes. Best results are obtained while using these algorithms. * The freetype autohinter (used when the possibly patented algorithms are not used) continues to improve with each release. If you are using the autohinter, please ensure you are using an up to date version of freetype before reporting problems. * Please identify what version of freetype you are using in any bug reports, and how your freetype is configured. * Make sure you are not using the freetype version included in XFree86 4.3, as it has bugs that significantly degrade most fonts, including Vera. if you build XFree86 4.3 from source yourself, you may have installed this broken version without intending it (as I did). Vera was verified with the recently released Freetype 2.1.4. On many systems, 'ldd" can be used to see which freetype shared library is actually being used. * Xft/X Render does not (yet) implement gamma correction. This causes significant problems rendering white text on a black background (causing partial pixels to be insufficiently shaded) if the gamma of your monitor has not been compensated for, and minor problems with black text on a while background. The program "xgamma" can be used to set a gamma correction value in the X server's color pallette. Most monitors have a gamma near 2. * Note that the Vera family uses minimal delta hinting. Your results on other systems when not used anti-aliased may not be entirely satisfying. We are primarily interested in reports of problems on open source systems implementing Xft2/fontconfig/freetype (which implements antialiasing and hinting adjustements, and sophisticated subpixel decimation on flatpanels). Also, the algorithms used by Xft2 adjust the hints to integer widths and the results are crisper on open source systems than on Windows or MacIntosh. * Your fontconfig may (probably does) predate the release of fontconfig 2.2, and you may see artifacts not present when the font is used at very small sizes with hinting enabled. "vc-list -V" can be used to see what version you have installed. We believe and hope that these fonts will resolve the problems reported during beta test. The largest change is the reduction of leading (interline spacing), which had annoyed a number of people, and reduced Vera's utility for some applcations. The Vera monospace font should also now make '0' and 'O' and '1' and 'l' more clearly distinguishable. The version of these fonts is version 1.10. Fontconfig should be choosing the new version of the fonts if both the released fonts and beta test fonts are installed (though please discard them: they have names of form tt20[1-12]gn.ttf). Note that older versions of fontconfig sometimes did not rebuild their cache correctly when new fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f" can be used to force rebuilding fontconfig's cache files. If you note problems, please send them to fonts at gnome dot org, with exactly which face and size and unicode point you observe the problem at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd -fa sans"). A possibly more useful program to examine fonts at a variety of sizes is the "waterfall" program found in Keith Packard's CVS. $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS CVS password: $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall $ cd waterfall $ xmkmf -a $ make # make install # make install.man Again, please make sure you are running an up-to-date freetype, and that you are only examining integer sizes. Reporting Problems ================== Please send problem reports to fonts at gnome org, with the following information: 1. Version of Freetype, Xft2 and fontconfig 2. Whether TT hinting is being used, or the autohinter 3. Application being used 4. Character/Unicode code point that has problems (if applicable) 5. Version of which operating system 6. Please include a screenshot, when possible. Please check the fonts list archives before reporting problems to cut down on duplication. loganalyzer-4.1.5/src/BitstreamVeraFonts/Vera.ttf000066400000000000000000002006141277740250400220500ustar00rootroot00000000000000OS/2_cpVPCLTъ^6cmaplXcvt 9fpgm&`gaspH glyf tA&~hdmx4!Hhead݄T6hheaEoL$hmtx Ǝ0kernRՙ-loca=maxpG:, nameټȵpostZ/prep; h::_:: dM0l   p t  &   Y &  &   c . 5 `  s 0 & {Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SansBitstreamVeraSans-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SansBitstreamVeraSans-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com5fqu-J3T99NR7s`s3VV9s3D{o{RoHT3fs +b-{T#\q#H99`#fy```{w``b{{Rffw;{J/}oo5jo{-{T7fD)fs@%2%%A:B2SAS//2ݖ}ٻ֊A}G}G͖2ƅ%]%]@@%d%d%A2dA  d   A(]%]@%..%A  %d%@~}}~}}|d{T{%zyxw v utsrqponl!kjBjSih}gBfedcba:`^ ][ZYX YX WW2VUTUBTSSRQJQP ONMNMLKJKJIJI IH GFEDC-CBAK@?>=>=<=<; <@; :987876765 65 43 21 21 0/ 0 / .- .- ,2+*%+d*)*%)('%(A'%&% &% $#"!! d d BBBdB-B}d       -d@--d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ /10!%!!fsr)5 @@ <2991/0K TX @ 878Y P ]%3#3#5qeM@1<20KTKT[X@878Y@0 @ P ` p ]#!#o$++`@1      91/<<<<<<<2220@   ]!! !3!!!!#!#!5!!5!T%Dh$ig8R>hggh`TifaabbNm!(/@U" '&( /)/))/B" ) *!#*- ) " & 0<<<1/299990KSX99Y"K TX0@00878YK TKT[KT[X000@878Y#.'5.546753.'>54&dijfod]SS\dtzq{---@A$*.U# jXV`OnZXhq) #'3@6$%&%&'$'B .$ &($4'!%   ! + 1 49912<0KSXY"K TK T[K T[KT[KT[K T[X4@44878Y"32654&'2#"&546"32654&%3#2#"&546WccWUccUVcbWWcd1Zܻۻa ۻۼ 0@      !         B  (('+'$ .  .'.'!!199999991/9990KSX99999999Y"2]@ " ) **&:4D ^YZ UZZY0g{ "-  ' (   2'') #**(/2; 49?2J LKFO2VZ Y UY\_2j i`2uy z 2229]]3267 >73#'#"5467.54632.#"[UԠ_I{;B h]hΆ02޸SUWDi;#QX?@Yr~YW׀c?}<$$/1oX3goB@ 10KTKT[X@878Y@ @P`p]#o+{ O@  29910KTX@878YKTX@878Y#&547{>;o @ <99103#654<:=JN@,       <2<2991<22990%#'%%73%g:r:g:PrPbybcy #@   <<1/<<0!!#!5!-Ө-Ӫ--@ 1073#ӤR@d10!!d1/073#B-@B/9910KSXY"3#m #@  10"32'2#"  P3343ssyzZ K@B  1/20KSXY"KTX  @878Y]7!5%3!!JeJsHHժJ@'B   91/20KSX9Y"KTKT[KT[X@878Y@2UVVzzvtvust]]%!!567>54&#"5>32Ls3aM_xzXE[w:mIwBC12\ps({@.    #)&  )99190KTKT[X)@))878Y@ daa d!]!"&'532654&+532654&#"5>32?^jTmǹSrsY %Đ%%12wps{$& Ѳ|d @   B    <291/<290KSXY"K TK T[X@878Y@* *HYiw+&+6NO O Vfuz ]] !33##!55^%3`du@#    190KTKT[X@878YKTX@878Y!!>32!"&'532654&#",X,$^hZkʭQTժ 10$& $X@$  "% " !%190@]]"32654&.#">32# !2 LL;kPL;y$&W]ybhc@B991/0KSXY"KTX@878Y@X9Hg]]!#!3V+ #/C@% '-'0 $*$ !0991990"32654&%&&54632#"$54632654&#"HŚV г "Əُattt$X@# %!"" %190@]]7532#"543 !"&2654&#"LK:lL>$& V\s[#@<21/073#3### %@  <2103#3#ӤR#٬@^M@*B$#29190KSXY" 5Ѧ`@ #<210!!!!^O@+B$#<9190KSXY"55//m$p@+$     &%99991/9990K TX%@%%878Yy z z ]%3##546?>54&#"5>32ſ8ZZ93lOa^gHZX/'eVY5^1YnFC98ŸLVV/5<4q L@2  L4307$7CM34( (+(I+*(I,=M<9912990K TK T[KT[KT[KT[XMMM@878Y@ NN/N?N]32654&#"#"&5463253>54&'&$#"3267#"$'&5476$32|{zy!orqp ˘s'6@   0210].# !267# !2'ffjzSb_^^_HHghG.@   2 99991/0`]3 !%! )5BhPa/w.,~ .@   21/0 ]!!!!!!9>ժF# )@ 21/0 ]!!!!#ZpPժH7s9@ 43 1990%!5!# !2&&# !26uu^opkSUmnHF_`%; ,@ 8  221/<20P ]3!3#!#"d+991/0KTX@878Y@ 0@P`]3#+f M@  9 991990KTX  @878Y@ 0 @ P ` ]3+53265M?nj @(B  291/<290KSXY"]@ ((764GFCUgvw    (+*66650 A@E@@@ b`hgwp  ,]q]q3! !#3wH1j%@ :1/0@ 0P]3!!_ժ @4  B    >  91/<290KSXY"p]@V   && & 45 i|{y   #,'( 4<VY ej vy ]]! !###-}-+3 y@B6 991/<2990KSXY" ]@068HGif FIWXeiy ]]!3!#j+s #@  310"32' ! ':xyLHH[[bb:@   ? 291/0@ ?_]32654&#%!2+#8/ϒs R@*  B     39991990KSX9Y""32#'# ! '? !#y;:xLHHab[T@5  B    ?  299991/<9990KSX9Y"@]@Bz%%%&'&&& 66FFhuuw]]#.+#! 32654&#A{>ٿJx~hb؍O'~@<    B %( "-"(9999190KSX99Y")])/)O)].#"!"&'532654&/.54$32Hs_wzj{r{i76vce+ٶ0/EF~n|-&J@@@1/20K TX@878Y@  @ p ]!!#!ժ+)K@   8A1299990KTX@878Y]332653! ˮ®u\*$h@'B91/290KSXY"P]@b*GGZ} *&&))% 833<<7HEEIIGYVfiizvvyyu)]]!3 3J+D {@I      B     91/<2290KSXY"]@  ($ >>4 0 LMB @ Yjkg ` {|      !   # $ %  <:5306 9 ? 0FFJ@E@BBB@@ D M @@XVY Pfgab```d d d wv{xwtyywpx   []]3 3 3# #D:9:9+=; ]@F      B    91/<290KSXY"K TK T[KT[X  @878Y@ '' 486 KX[fkww       &()&(' ) 54<;:;4 4 8 ? H O X _ eejjhiil l xyyx}  x   @]]3 3 # #su \Y+3{@(B@@ 91/290KSXY" ]@<5000F@@@QQQe &)78@ ghxp ]]3 3#f9\ @BB 991/0KSXY"K TK T[X @ 878Y@@ )&8HGH    / 59? GJO UYfio wx ]]!!!5!sP=g՚oXS@C210K TX@878YKTKT[X@878Y!#3!XB-@B/9910KSXY"#mo<@C<10KTKT[X@878Y!53#5oXޏ@ 91290##HHu-10!5f1@ D10K TKT[X@878Y #ofv{-{ %@'   #   E&22991/9990@n0000 0!0"?'@@@@ @!@"PPPP P!P"P'p' !"'''000 0!@@@ @!PPP P!``` `!ppp p! !]]"326=7#5#"&5463!54&#"5>32߬o?`TeZ3f{bsٴ)Lfa..'' 8@  G F221/0`]4&#"326>32#"&'#3姒:{{:/Rdaadq{?@  HE210@ ].#"3267#"!2NPƳPNM]-U5++++$$>:#qZ8@G E221/0`]3#5#"3232654&#":||ǧ^daDDaq{p@$   KE9190@)?p?????,// , ooooo ]q]!3267# 32.#" ͷjbck)^Z44*,8 Cė/p@     L<<991/22990K TX@878YKTX@878Y@P]#"!!##535463cM/ѹPhc/яNqVZ{ (J@#  &#' & G E)221/990`***]4&#"326!"&'5326=#"3253aQQR9||9=,*[cb::bcd4@  N  F21/<90`]#4&#"#3>32d||Bu\edy+@F<21/0@  @ P ` p ]3#3#`Vy D@   O  F<2991990@ @P`p]3+532653#F1iL`a( @)B F 291/<90KSXY" ]@_ ')+Vfgsw    ('(++@ h` ]q]33 ##%kǹi#y"F1/0@ @P`p]3#{"Z@&   PPF#291/<<<290@0$P$p$$$$$$$ ]>32#4&#"#4&#"#3>32)Erurw?yz|v\`gb|d{6@  N  F21/<90`]#4&#"#3>32d||Bu\`edqu{ J@  QE10@#?{{   {  {]"32654&'2#"s98V{>@ GF2210@ `]%#3>32#"&4&#"326s:{{8 daaqVZ{ >@   GE2210@ `]32654&#"#"3253#/s:||:/daDDadJ{0@    F21/90P].#"#3>32JI,:.˾`fco{'@<  S  SB %( R"E(9999190KSX99Y"']@m   . , , , ; ; ; ; $( ( *//*(() )!$'      '/)?)_))))))]]q.#"#"&'532654&/.54632NZb?ĥZlfae@f?((TT@I!*##55YQKP%$78@  F<<2991/<2990]!!;#"&5#53w{KsբN`>X`6@    NF21/290`]332653#5#"&||Cua{fc=`@'B91/290KSXY"K TX@878YKTKT[X@878Y@Hj{  &&)) 55::0FFIIFH@VVYYPffiigh`ut{{uz>]]3 3#=^^\`TV5` @IU U U U   B     91/<2290KSXY"K TKT[KT[KT[K T[X  @878YK TK T[KT[X @ 878Y@" 5 IIF @ [[U P nnf yy          %%#'!%""%' $ ! # 9669 0FHF@B@@@D D D @@VVVPQRRPS T U cdejejjjn a g ouuy}x}zzxy  { v } @/   y]]333# #V`jjj;y` Z@F      B   91/<290KSXY"K TKT[KT[KT[X  @878YKTX @ 878Y@   & =1 UWX f vzvt        )&% * :9746 9 0 IFE J @ YVYYWVYVV Y P o x  /]] # # 3 dkr))`HJq=V`@C        B     9129990KSX2Y"K TKT[X@878YKTX@878Y@     # 5 I O N Z Z j        '$$  )( % $ $ ' ** 755008 6 6 8 990A@@@@@@@@B E G II@TQQUPPVUVW W U U YYPffh ii`{xx   e]]+5326?3 3N|lLT3!;^^hzHTNlX` @B 2991/0KSXY"K TK T[X @ 878YKTX  @878Y@B&GI  + 690 @@E@@CWY_ ``f``b ]]!!!5!qjL}e`ۓ%$@4 %   !  % $  C %<<29999999199999990K TX%%%@878Y&]#"&=4&+5326=46;#"3>l==k>DV[noZVtsݓXX10#$@6%   #%#C %<2<9999999199999990K TX%@%%878YKTX%%%@878Y&]326=467.=4&+532;#"+FUZooZUF?l>>l?VWstݔ1#@  1990#"'&'&'&#"56632326ian ^Xbian ^V1OD;>MSOE<>LhN'$uhm !@T   !!  ! !!!B     !  VV!"2299999991/<9990KSXY" #]@  s P#f iu {yyv v!# ]]4&#"326!.54632#!#TY?@WX??Y!X=>sr?<҈_Z?YWA?XXN)sIsrFv)su''&-k'(u3^'1usN'2'u)N'8u{-f'DR{-f'DCR{-f'DR{-'DR{-7'DR{-'DRqu{'Fqf'Hqf'HCqf'Hq'Hof'f'C\f'F'd7'Qquf'Rsquf'RCsquf'Rsqu'Rsqu7'RsXf'X{Xf'XC{Xf'X{X'X{9; '@  YW Y <<1<203!!#!5!oo\]u=  @  Z[Z10"32654&'2#"&546PnnPPnoO@v+..ooPOmmOOp1.-rB#!Q@+     "  "<<<221<9990%&&'667#&73JDFHAMf fIX⸹)**'# 32!b`@!    <<1/2<2990K TX@878Y66].#"!!!!53#535632NL=ty-=))׏/я\= >@54&.#"#"&'532654/.5467.54632{?>?>S8alӃ\]>9̭IXW:fqր][;;ȦI.Z.L-[.K''PGZsweZ54m@''TLf{xf[1,pE3!   \ 104632#"&3~|}}||};9 %@]] 91290!###&&54$yfNݸ/@0-'!  **.  !' $'$-F099991/990@@'(     ! "&  : :!MM I!I"jj  ]]4632#"&'532654&/.5467.#"#:A9`@IPAtx;e\`Wqqs`/Q*%jd_[?T>7;[gp/8L`@6EBC?2H09JC 9 $HE301BKL?gwyVpMI`3D/IC@&=>:A$104G$ 7aD=0^* D^ J21/02#"$'&5476$"32676654&'&&&&#"3267#"&54632mmllmmmmllmm^^``^^⃄^]]^\^BB@zBCFInmmmmnnmmmmng^^^傁^^__^]⃅]^^! "'F >@!    b b cbc91<<2<<903#######5Jq7rqr/B^^sRf1@ D10K TKT[X@878Y3#fF)@dd1<20K TK T[X@878YK TK T[KT[KT[X@878YKTKT[X@878Y@````pppp]3#%3#^y'>@"     <291<2<<990!!!!!'7!5!7!}/H{};fըfӪH@9  B     <291/<0KSXY"]@gww  ]!!!!!!#!59=qժF՞f +@< +,  )&  *&& &,+,* # )#3,99999999199999990@*WZWU!je!{vu! FYVjddj(|svz( ]] 324&'.#"&5!27!"&''3>_'y=_''NOy;WfNPƀ[gX@CHp@CpDfbMKYg[KKX /@- !$'!!0 $*0999919990@     $$$   $$ $ ***///***55500055 5 :::???:::EEE@@@EE E JJJOOOJJJV !"&'()]]32654&#".#"326#"&54632>32#"&1TevYR1UfvYRF^_HDa^/XZie7XXjeߦ~᧯w .@     <2<21/<<0!!#!5!!!-Ө-}} T@.B $# <2291/90KSXY" 5!!@po V@/B$ # <<291/90KSXY"55!5AǪR@F  B     fe f e<2299991/2<2<290KSXY"K TX@878Y@(' ' ')((79  ]]!#!5!5'!5!3 3!!!c`Tþ{yT9{3{JD{3V` M@%  !   NF!2912<990"`""]3326533267#"&'#"&'#% )I#ER2bf*V H<9 NPOONNh-)b@'! '!* $$*9991990K TK T[KT[KT[KT[X*@**878Y>54&#"#"&54632#"&54324&#"32IH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{w; ]@    91990@0QVPZ spvupz  Z pp{ t  ]]!! !!5 7AJI3!wq@gg120!#!# }/#@1 " $ #" #h#$9999991/<229990K TX$$$@878Y@V             ##(]]#3267#"&5467!##"#>3!i/7.%7vy"Pµ)6< yJ\:1fd.xo@E}/%&@  & iji&1026732#"&'&&#"#"&546327j Pd@7*8  kOeD=!0 l9TA6?&#Hn!bSA8?Ss;)_@3(%%  * "(kl"k *22999199990!!#5#"&5463354&#"56632"32655P,]uu>DIE~bRhP{@p?Dq[[""CO@Mr`d.@  klk 9910!!2#"&546"32654&PXγгi~hi}|P{ݿܾsN@@"   mm  9991/<20%!5654#"!5!&5! Dz?1/aL"a*>w؍{o{3>@C'-%= 4%:.-*1 %?47&%7& =&-7"E?<9999912<<29990@0+0,0-0.0/00@+@,@-@.@/@0P+P,P-P.P/P0+0@@@@@@@@@??? ??0,0-0.0/@,@-@.@/P,P-P.P/ooo oo`,`-`.`/p,p-p.p/,-./]q].#">32!3267#"&'#"&5463!54&#"5>32"326=DJԄ ̷hddjMI؏`TeZ߬o0Z^Z55*,ywxx..''`f{bsٴ)H +@<+,&  )&  *&& &,+,* # #Q)E,22999999199999990@p(?-YVUV jf!{    { z{ {!"#$%{&%--&YVUZ(ifej(ztvz($$]] 32654&'.#".5327#"&'')gA\*g>}66]C_56`?`!*(Ou))Hn.Mw834OMx43N $@/  !# #%" " "!& %999919990KTKT[KT[X%%%@878Y@ ttttv]33267#"&546?>7>5#537ZZ:3mN`^gIYX0&DeWX5^1YnFC98ŸLVV/5<65 b@ <2991/0K TX @ 878YKTKT[KT[X  @878Y P ]#53#3+e^@ 10!#!^=} *@    91903##'%\sB}}`s-Pb;V#@@   B   !$  $912299990KSX29Y"K TX$$$@878Y.#"!!#"&'53267#5!>32&P,`r<::d/4a/am"?$Ɨ5dzɏ!!J;?@.9*-" *19" <-<<219999990#"'&'&'&#"56632326#"'&'&'&#"56632326ian ^Xbian ^Vgian ^Xbian ^VoNE;=LTNE;=KڲOE;=LSNE;=K`8@91/90@cmpxyvn]] !3!^DC?%# @I    B   o o n<2991<2990KSXY"55%-+#-+#RRH# @I  B   o op<<991<2990KSXY"5%5+-+-#^R^  ^R^   #@   1/<<220%3#%3#%3#hk'$uh^'$us^'2'us ;@   299991/220!!!!! !# !39OAg@AժF|pm|q{'3@1 . ("%4"1 K1 Q+E499912<2290@%?5_5p55555????? ooooo ]q].#"!3267#"&'#"32>32%"32654& H ̷jbdjQGьBN5Z44*,nmnm98olkp݇y/10!!yy/10!!ym '@   1<20#53#53ӤRӤR??m '@   1<203#%3#ӤRӤRլ@@@ 10#53ӤR?@ q103#ӤR՘?o )@ r <<103#3#!!oA#u"@91990  9%-=V'\^N'<su+@B10KSXY"3#-\^R#/@I -'! - -'!0 *$0* $ $(st*(s099999999919999999907'#"&''7&&5467'766324&#"326{r%$&(r;t=:x=q%%&&s7t@?s9q(&%%s>v:@t8s'%$|pprs#G@%Bon29190KSXY"5s-+#R#I@&Bop<9190KSXY"5+-#^R^  /J@(   L<2<2991/<22990K TX@878YKTX@878Y@0P]]#!##53546;#"3#JcM`/яNPhc/J@!    L<<991/<22990K TX@878YKTX@878Y@0P ]!#!"!!##53546JcM/ѹ{Phc/яN9;>@   Y W Y <<2<<2122220%!#!5!!5!3!!!oooo\\HF103#F@ 10%3#ӤR@m '@    1<20%3#%3#ӤRfӤR@@q L #'3?K@D$%&%&'$'B@ .(F4 :&$L%IC'1+C =  1 =I 7+ ! L9912<<2220KSXY"KTK T[K T[K T[K T[KT[XL@LL878Y"32654&'2#"&5462#"&546!3#"32654&2#"&546"32654&WddWUccUt%ZVcbWWcdWccWUccܻۻۻۼܻۻhm'$um'(uhk'$uN'(uk'(uk',/u`m',/uXN',/u;k',/usk'2'usm'2'usk'2'u)k'8u)m'8u)k'8uy` F1/0@ @P`p]3#`?f7@ u91290K TKT[X@878Y3#'#fJ7c@$   VwVv99991<<99990K TK T[X@878Y'.#"#>3232673#"&9! &$}f[&@%9! &$}f[&@Z7IR!7IRb+/10K TKT[X@878Y!!V)9H W@ VV1<0K TX@878YKTKT[KT[X@878Y332673#"&v aWV` v HKKJLDf,@ d10K TX@878Y3# _@ V xV10K TK T[X@878YK TK T[K T[X@878Y4&#"3267#"&54632X@AWWA@Xzssss?XW@AWX@sss#u@  ' 1/90!#"&'532654&'T76xv.W+"J/;<+->i0Y[ 0.W=fB@991<20K TKT[X@878Y3#3#߉fxLu @   '1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i?f7@ u91<90K TKT[X@878Y373xu ?@   : y<<991/900P]3%!!'79Pw^Mo;jnH ^@  z z <<991/90KTX @ 878Y@ @ P ` sz p ]37#'7Ǹ}Lɸ{JZjXjm'6uof'V\m'=uXf']@ <210##    g@    2  y<291/220@(   ]]! )#53!!3 !iP`P5~.,qu('@^%{&%#${##{#({'(#&'('%$%(('"#" ! B('&%"! ## #)&' ! (%#" QE)999999919990KSXY"?*]@v%+("/#/$)%-&-'*(6%F%X X!` `!f"u u!u"%#%$&&&''(6$6%F$E%Z Z!b b!z{     {zzv v!x"**']].#"32654&#"5432''%'3%F2X)6 ~r4*!M!ü޼z&77kc\̑oabk'<su=Vf'\^ =@   ? 2291/0@ ?_]332+#32654&#'ђV>@ GF2210@ `]%#3>32#"&4&#"326s:{{8daa-10!!ת? @M    B   <291<290KSXY" '77w55v8vL57y5yy5 ,@   |]|| 12035733! c)t'+n^J@$}}B ~9190KSX2Y"!!56754&#"56632 "?XhU4zHM98rn81^BQ##{l0b(H@'    #)~&~ )999190#"&'532654&##532654&#"56632 \e9}F4wCmxolV^^ad_(fQI7Z`mR|yOFJLl?<:=svcE`''5 d?''5db''5 dsm'* uqVZH'JP', /uu'6ou{'Vs'k'&-uqf'Fs'm'&-uqf'Fq$J@$ "    GE%<<1/<20`&&&]!5!533##5#"3232654&#"F:||ǧN}}daDDad10!!dHF103#F1@: "+ /) 2+"!)#&  , & &*!/<29999999999122<20K TK T[K T[KT[KT[KT[X222@878Y@z  1Ti lnooooiko o!o"o#n$l%i'i-  !"#$%&'()*+,-2   USjg ]].#"!!!!3267#"#734&5465#7332[f A78 ʝf[Y`(77(6bbiZȻ{.# .{ZiHH"{/ #/{"G)@ dd1<20KTKT[X@878YKTK T[KT[X@878YKTKT[X@878YKTX@878Y@````pppp]3#%3#^ys@B10KSXY"K TX@878YKTX@878Y@ %%6FVjg //]]3#7Ju@!  VV 99991<2990K TX@878YKTX@878Y ]'.#"#4632326=3#"&9 $(}gV$=09" (}gT";9! 2-ev 3)dw @B10KSXY"K TX@878YKTX@878Y@*$$5CUU//]]#ę1w@ 91<90K TX@878YKTX@878YKTX@878Y@ //- ]3#'#Ӌ1@ 91290K TK T[K T[K T[X@878YKTX@878YKTX@878Y@ "  ]373Ӌ ? @   ] <291<290KTKT[KT[KT[K T[K T[X@878YKTKT[X@878Y@T /9IFYi       "5GK S[ e]] !33##5!55bf]my9 j@ VV120K TX@878YKTX@878YKTKT[X@878Y332673#"&v cSRav 6978w{zf103#  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f55q=3=dd?y}s)3s\\?uLsLsyD{={\{fqqq/q999qqJ+o#7=V;=3XyysLs{{{{{{fqqqqq9999qqqqq9\3 'sLfR#hd+/s`N{H?55=ZyyLss/q%%=V^33 / /9% qyy\\\\;LsLsLs9#LF+o{\3X3 q=55^5bb3sq\+osfqsfqqds 5?+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468c6469""""XO!nE~Le  R s  X : i  = z /Eu)pP@"m#{CwRw [ r !5!B!!!" ""#"0"="J"W"d"q"~"""""""""## ##'#4#A#N#[#h##$4$%3%S%&&'K''((X()_*%*\**+z+,D,,-P-..R./0A011!1P12H2z23F3p3p3}3334z44445595g55556[667C77888J999)969C9P9]9j9w99999999::{::;;^;;;<"<_<<<<<<=c>;>H>U>>>?a??@:@K@\@m@z@@@@@@@@A@AVAkBEBBC_CCDUDE*E?- x$%&')*K+-r./2934K57D9:;< =IQR&UYZ\bdg9xy&z&{&|&}&9 999 K$$$$$9$&$*$2$4$6$7a$8$9}$:$;$,,G}G  @ 2 YYdhd@%%Y   %Y%&Y]%]@%dX:t:2  Y~}|{zyxwvtvututYtsYs}rq&ponm @lkjkjj@ihihYhgYgf\ fedcdcb]ccbW%b]b@a`_.`_.^Y^]\ ] \ [Y[KZYZYXYXW%VUTSRQPO%PO%NMLKJIH H@FEFEDCDCC@BdB@A}@?>,>,=<;:94 9287265 6@5 5@43 4 3 211}0/0d//.-,+,K++**K)()(' (' &%$%2$#"#"!%!   2@   @:%dd:%:%K       @d:@  @d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ Q/10!%!!fsr) Y@.   :UTS 991/0KSX9Y"!!!!iqlhE^h@VS1<20###h++=P@6 Z Z W   91/<2<<22<<220!!!3!!!!#!#!7!!7!F+`aa)5E)6````5F5`hh7 !(/v@C# ")^] ^][* [!*)#"&- !&-& - & 09999991/<29990#&&'&&54$773&&'6654&T;]1`x=ҿ+,+eX1?w93TdA7ckI-+&7=7 "%/$ DQ=07VK39q '3M@+e .e"a(ee a`d4+%   1  + %49912<0"32654&'2#"&54#3!2#"&54"32654&Vo=>Wn? ֝ k֝ Vn==Wn?hWWUWꭍ ꪍXYTX9&0@[   0'0%&$''0:0' - -iYf!gd` '*$ * 0$* 1999991/99990KSX999Y"]@`  * 9 K K'[ \'bm n'   &0' ' +'+0;';0III H H'J0ZZ\ \ \\#X'honki i l0$]] >7!!'#"$5467.54$32.#"3267m)>Z7+xJTv{ֿ.[e5WOVd54&#"6$3278{hmpe_@PMRZKN=21Ū(i@,s ^ x s ^xsw#d`)   & /999190K TK T[X)))@878Y!"&'32654&+732654&#">32q~wh9YiŖ1yUl7vp%s%%)49kYYraLP,*  @;         : uS    991/<290KSXY"K TK T[K T[K T[X@878YK]] !!3#!!Lo556`ARJ'@9:^]]sys vS `  999190KSX9Y"K TK T[K T[K T[X@878Y!!>32!"&'32654&#"j7v-,_0r}t;ol|Tt ѹ12/HD`q+-fH 'r@! ^ ]sss%d`(  (9190K TX(((@878Y@```` ` ` `````` ]"32654&.#">32!"476$32rZPqX6VQN]|pxG^ἔYc`f,,ȵ31ک!s 3@:vS991/0KSXY"!!!'f-<-F #/t@$ *ssw$sd`0- ' -!0991990K TK T[K T[KT[KT[KT[X000@878Y"32654&%.54$!2!"$546"32654&ufXwglkM&zt3f{YIf{YtSauSb-e谠-/yŰwbDTwbEST7'@ ^]s s "sd`(%% (9190K TX(((@878YKTX(@((878Y@o o o ooo$o%o&o' ]73267#"&5!2#"&2654&#"T5WQM]i|qx_rWQqX!-+ȵ31کa [b`fT`N@(:TzT91/0KSXY"!!!!-iJChL`}}` Z@.   :TpTz   9910KSX9Y"!#!!h;լiJu}=@|{29190 5<'@ o}o<210!!!!=@|{<91905511Jo!@I !:!  Y]iUTd  ! "999991/9990KSX9Y"!!!766776654&#"6632hFWJOHQLPs>ajLP9d1P}f:=j69=CB:*(wf<>M+\j L]@5IM-.* LF~*1~!=WM -.L C'7M991<<29990"32654&#"&543273654!"!267#"&'&5476$32!"#"&' jQMjP'-ZS}˅v\`Kvhm⎇bxroirg!ґTXɒV^KSBTEKnWSbbRMl>ɰH]\Yv{ @A     : uS   91/<90KSXY"]@  + / ?   + ) ]]!!!!!uLZ+?+ h@::S    !9991/90KSXY"2654&##2654&##!!! 3gtQL>ebeLbk#A h[;>s~vKHyn՜JJ@ uu d` 991990@  ))]]%# 476$32.#"3267يrroqty>`oeF12J=78IDIN+J@@!  : S   9991/0KSXY"3 4&#! !! :/""`abjq.#EQQzm\+\ T@/    :S    91/0KSXY"!!!!!!N9s6g:B7+\ O@+    :S  91/0KSXY"!!!!!N9s6g:{J9 h@6  : uu d`!  !299199990KSX9Y"%# 476$32&&# 3267#!sƳrqw;zv8p991VoGEC=87GF"+ u@A     :S    91/<<0KSXY"!!!!!!No8n{{9+y+6@:S91/0KSXY"]!!N+f g@%  : S    9991990KSX9Y"K TKT[X @ 878Y!!#3267N:N9  :S  9991/<2990KSXY"] ]!!!!NVlR + J ;@ uud`! !10KTX!!!@878Y4&#"3267> # 476$쟗s? qRn{oja*k4s?=QE'la_[+{@H    : u u S      99991/<9990KSX9Y"] ]2654&+ !!2!.#]dL3o#9ȫNh'p"a\?zvJEոXsoSR'@;    : uu%d`( " "(9999190KSX99Y"]@9 9 9 9 9 99999 9!I I I I I IIIII I!YZ Z Z Z Z ZZZZZ Z!m m m m m mkkmmmmm m!y y y y y yyyyyy y!< )```` ]].#"!"$'32654&/.54!2R>qiGoƹɑ=zJ}e.y87ZP39'265EMLlT7= '+%b`@:S991/20KSXY"K TK T[KT[X@878Y!!!!`9NTg@:     : ` S  91290KSX99Y"!3267!! $5467N ih$A 0Jba$Y;q@':S91/290KSXY"]@%5)76 ]]!!!nj5\+ % @J        : S    91/<2290KSXY"KTX @ 878Y@j       / / ? ? O O YYY      &%#' 637 0 BB UZVPP  !]]!!!!!d.n1}L2B==+o @I   :  S   91/<290KSXY" ]@4  -$ <2 LC    '$' * 79 : DHG ]] !! !!nyKa  +yx@5:S  991/290KSXY"]@  D]]!!!yy)o 9@:S   91/0KSXY"!!!7!08%:-<F@":lk9910KSXY"!!!!Nl--B5@ S9103Xƾm@@:lk9910KSXY"!7!!7!3+ +m`@ S91290##fg--10! f2@ 910K TKT[X@878Y#'fx#{ +@c        : "  g#"g&`  )#"),9991/99990KSX99999Y";"]@83!0"C!@"S!P"c!`"!"!"!"5":#:$K#K$[#[$k#k$#$#$ ]]"326?%!7#"&54$!37>54&#">32QGn}XsK8}{oa6p~ SQ=Fy)d_ BC.."Q?j @K  : ii`k    !  9991/990KSX9999Y""32654&!!6632#"&?cX_.!.huRkMH[sw\ifk+b]ρd~]L{3@ ii`  99910&&#"3267# $5476$329HCފ~TI7Y[ibmU=02u21ډgqnJ @K  : ii` k    ! 9991/990KSX9999Y"%2654&#"!!7#"&54676632uaW_ti!RkMH[s]hfkXb]ρd~]J{'H@( g$g`( ' !  (9999190!3267# $54676$32%6654&#" q7[Wg `Ri'9mlDC0/݀dx|(Yo  P^spfR@<      : igkz     991/22990KSX9Y"K TKT[KT[KT[KT[KT[X@878Y@ ``pp]#"!!!#37>3R/KE /1Ѩ2%7CO`N)Fuy+@Y+* )'&(  :& &g i z&i)#! ,99991/99990KSX99999Y"%#"&546766327!!"&'3267"32654&XViMHXv7i:h^5UY!T^Z^b\qdy\c3 !65fkhm?;@L   :  k  %#  9991/<99990KSX999Y"0]!>54&#"!!>32)q GAol.hucm VH9O@Fa^ N?X@(:zk  91/0KSXY" ]o ]!!!!h.h9`F @:     : gz k   ...9991990KSX9Y"K TK T[X@878Yo]!+73267!!h.ղ-?e]+h9`[? @A      :zk   91/<90KSXY"]@<     )EQXcwpvz  *ESdpus ]]!! !!mhug^?6@:k  91/0KSXY"]!!mh?{+@x !    "#$# !$#(')&$#%$$#:!  &$ )$z" %"!$  &$ %% $# ,99999991/<<<299990KSX9999Y"]@#     /-]>32!7654&#"!>54&#"!!>32Sr q?6gls >7clh!TgtgnM1VH|#7@HKM8?`_`w?;{@N   :  z  %#& 9991/<99990KSX999Y"0]!>54&#"!!>32)q GAolh!cm VH9O@F`a^ NJ5{ )@ii ` !)! 10p]"32654&2#"$54676$a]a@ZVf\Vd{joincvx~dtxVj{@M:ii`z !   9991990KSX9999Y"0!]%!!>32#"&"32654&s-h!RkMH[sAcX_ b]ρd~]7\ifkJVu{@N:ii`z  ! 9991990KSX9999Y"7!!#"&546766322654&#"isPkMH[saW_Lb]ρd~]]hfk?\{@6       :  z   & 91/9990KSX99Y" ]@#    @@@@@@``````].#"!!>32%Z4 fh'GՂ0!/`jq{{'@9    : gg%`(  ,*"(9999190KSX99Y"K TKT[K T[X(@((878Y@i j j jjj j!````o)vv]].#"!"&'32654&/.54$!2{5i]js@^Aٮs}6atqr@dAs=2473$ .$$9:64$( (X@>  : iz i  9991/<2990KSX9Y"K TK T[KT[KT[KT[K T[X@878Y)]!!;!"&5467#3=n3\=H3Ӣ\1>& .(@!>{s`@M    :  ` z &%9991/299990KSX999Y"K TK T[K T[K T[K T[KT[KT[KT[KT[KT[KT[X@878Y0]!3267!!7#"&546gq FAolg!\p9P?F'a`#Nm`@&:z91/290KSXY"K TKT[KT[KT[KT[KT[K T[K T[K T[X@878Y@FVffj]]!!!Jkn`j` @F     : z    91/<2290KSXY"KTKT[KT[K T[X @ 878Y@(I   %% GHF W fh xty ]]!!!!!J'R)P`%`^` @I     : z    91/<290KSXY"KTKT[KT[K T[K T[X @ 878Y@N  (%)+ 1GJ   ((')+* 65GEGFG G G kch i  ]] !! !!t#8{=#LbF`@C :  gz   /9129990KSX9Y"K TKT[KT[KT[KT[KT[K T[K T[X@878Y@   H]]!!+7326?R;wʠ%qXa&!`6ρ;J<` x@,,:izi   91/0KSXY"KTKT[KT[KT[KT[X @ 878Y@)&/ ]]!!!7!1FC1/`fZ0@g0/.-,+* $%&'() "!# : 1 #)*k110-*)&#   19999999199999990KSX9999Y"#"&546776654&##7326776633#"3+ڳ%[u@->'%+Fg!vrPJ Qtm{{<(7XHtWZMC(.0C410#Z0@l+,+0,,+ :+1''%,'%/k1'&0  /0+",%(&01999999199999990KSX9999Y"32677667&&546776654&##73233#"##Fg!wsPL !QtC+۳']t?-=%%mYZND-*2D3z{="6XHuR#@ o o1990#"'&'&'&#"56632326j`k^Xbk`k^VRPE:=MSPE:=K{k'$Du{m !@P!!    ! !:! u W " !  "99991/<9990KSXY"]@2!!!-!9!?!Y!!!! ! !(* +!!! ]]32654&#"!!!.54632!M66MN56Mh+u9vuZP6MM66MMP%M,uu0ML?Jo'&+\k'(u+m'1uuJk'2uTk'8mu#f'D#f'DC#f'D#1'D#9'D#'DLo{'FJ3f'HJf'HCJf'HJ1'H?f's?f'Cs?Pf's?R1's?;9'QJ5f'RJ5f'RCJ5f'RJ51'RJ59'R{sf'X{sf'XC{sf'X{s1'XN; [@0:S    9991220KSXY"!!!!!7!JJ!--#/dL @  -.-10"32654&'2#"&546HdcIHdeGBz0/11-0|D\dHHbcGHd3/0xDCy-03"a@8    i i #   #99199990&&##667#&&5%3f{94p9K@ YG8HU77l(77DX.рJm520h10"#"#}@E  :^] gsd s  99991/222990KSX9Y"&&#"!!!!3#737$!27;G}!u-@34?-!4.\%({ F=3?@F@1:4%  $+1d@$7! =%+.47! :=(!11.=070.(@9999999199990&&#"#"&'732654&''&&5467&&54$326654&+Z=P^19Z96T_0f=Ma0Owp42S!PUaPXr(&=22)No{:$X6++?0/%=6f{;)\5Y>=V@[8=]'` 2104676632#"&'&&'535II245633JI326J235624IJ336633; c@.  :S  9999120KSX9Y"!###&&54+Ӽ9fN?T7@^&% %&%67734257:5,& % 2gg2gk`667&%)"/ 57) ,/), "/, 7 89999999991/990KSX999Y"6$!2#"&'732654&''&&54676654&#"!*5f =TNNJ18o4Rd.M=C<ROfuZڰ0I]H7H+;[L=(A7+/e?1CFkp 4Lb@8-*+'0!5 2+A'*,$0-+$!1837$4-;6-34GM299991/29990"32676654&'&&#32654&'2#'&&###2#"$'&5476$yWWWWWVy{WWWWWXϲ##NOM+i`)Gok&: 1mmllmmmmllmm3WWWzyWVVUWWyzWXV5442wyVpP:NAD7nmmmmnnmmmmn1IH@(  2&>7,- 486 -9DJ21/990&&#"3267#"&54632'"32676654&'&&'2#"$'&5476$+9o9q~r@s.A>EyWWWWWVy{WWWWWXymmllmmmmllmmf%#rs~$#WWWzyWVVUWWyzWXVnmmmmnnmmmmn'R v@>  :   S ;: : ;:91<<2<<9990KSXY"73#######5ww㪉LqKBMPf\10K TKT[X@878YK TK T[X@878Y@ ))<<LL]!#+%Jf7;1u@99991<20K TK T[X@878Y@*    0000 ////????]]3#%3#f111 =@!   o} o  <291<2<2.990!3!!!'7#5!7!^P1}`@M  : u S  91/<90KSXY"]@ %%] !!!!!!!!!yw9s5f9A7Db^++ (6@D(76) ,&# ,'#,u#ud#`72'76) 2 2&(2 7.9999999199999990@             ! . / 0 1 2 3 4 5 6@@@@@@@@@@@@@@ @!@.@/@0@1@2@3@4@5@6PPPPPPPPPPPPPP P!P.P/P0P1P2P3P4P5P6H].#".5476$32%#"&''3267>54'&'(zR**nkaXf--oj\f{'zNs?a_\t5 /B@#  $'!-!0 $<*<099991<999032654&#"&&#"326#"&546326632#"&+vIZqgLHw+tKZqfMGzDaƯZcG_ů[1CDeOMeeCCdOMeia~q~n .@o  o = = <2<21/<<0!!#!5!!!  bb '@  o  <2291/90%!55PN '@ o  <<291/907!!55%  @S  :    S    9991/2<<<290KSXY"!!!7!7'!7!!!!!!:RRA'o%#pH%%h;`LL LLT\`&@W   &#$"% : % "` z'&%  '9999912<990KSX999Y"!3267!3267#"&'#"&'7-hVRfxh'29b-Xc>XJ]`T u(INpu# LROO/0;R)8@'! '!* $$*99919906654&#"#"&54632#"&54324&#"32;'#S0@eID`IFa~q9WzC2EqG Ur|tx)w 0@    91990!!!!5Bl_{Nw@??120!!!!)JD/@    991/<22990#!#!#"663J'7: Ddd>Dǜ3,:@ *# - *(&  @A @-9919026732#"&54&#"#"&54632jciRA@Ae '&>ÄkTF54&#"7>32/'\p>5TVBe}MLXU#bK=9F,4qXT@}LFod ,.##z3^u\ b@ d   DD 999910@,@@@OOOPPP___ JJJEEEXXX ]]2#"&54!!"32654&Ϸ*7&XcFCcGMѹLPKQ7>@    GFG F 9991/<2990!!654&#"!!&5! #~˲˄~#~zx89xz#VˤUy9yǤ#{ @J@T7@5= ,&A A5&%"g5) @G=g/)`KJAD76 ,:%&D5:@ 2:D2K9999999999912<<<999990@6; ; K K [ [ k k 2?0@B?@@R?P@b?`@?@?@?@]]"326?>32>32!3267#"&'#"&54$!37>54&#">54&#"QGnuh9_Ղ p5BuK<|xr^aQi%SQ=Fy)JIMMI-\/9mlCD0/ghif BC..  P^to$+{@@$,+%("(#(ii`,+#, %+ +" $+!! ,.99999999199999990&&#"&&54676$327#"&''3267E- ''[WdhDa))ZVemD`E/J;L~duw..o;Octz12pL!@M !!!:UT Y] i` S"  !  "9999919990KSX9Y"!3267#"&54677667%!!h VKPFPLPr=`jLS8Fh3P{f<=h69=DA*(wfK@/91/90!!!#-3mV?}' 4@     991<290772+Z%L1+Z%'qsqu' 4@     991<29077%%77%%7u1X+#L1X-#^ y@=    :T     999991/<<220KSXY"!!!!!!%hKhKBhL}}}{k'$Du{m'$DuJm'2uV ; !@8    : S   !  "91/220KSXY"]@ ## #0#`#p## ]#";!!!!!!# 476$3iLqkh9u8g9A9y7`Ѐ;/1J.zIFJo{ 3?j@:+( g:i g4i.(`@ 1 +=1=17!" @999999912<99906654&#"!3267#"&'#"$54676$326632"32654&`Ri%# p7:Z։[Ue@^ a]a  P^un9mlDC0/NRRNcuwQQQQ(]Bjoin@ q9910!! 3@ q9910!! 3X7 f@4     : S   H  991<20KSX99Y"!3!3X7'ը:'ժX``X b@2     : S H  91<20KSX99Y"!#!#T7ըT8ԩ``X9@:S910KSX9Y"!3;:'ժX`X5@:S10KSX9Y"!#wT8ԩ`V *@ on IJI <<10!!!!!!33Xˁ#uv@A:91990KSXY"  9%-F1'\yk'<ud10#3 J=#/@H ! ! $!* 00   'LKM-L K022999999122999990'7&&5467'766327'#"&72654&#"ϙљ0l=6l9ϘϚ.j?:l[\[~ Ϛ1k??l.͚Ϛ7n6?i/ϙ\\\]~}'@919071+Z%'qN'@ 9199077%%7N1X+#fb@c  : i gkz  &N&991/<22<2990KSX9Y"K TKT[KT[KT[X@878Y?]]!!!!#"!!!#37>3h9h/KE /1Ѩ2%ܐ7CO`Nfb@L   : i gk z    N&991/<22990KSX9Y"K TKT[KT[KT[X@878Y?]!!!"!!!#37>?#KE /1Ѩ2%)7CO`N;@F       : X S       .9999991<2<20KSXY"!!!!!!!7!!7!JJ!-X#/JI/!X-!<}`/@:T910KSXY"!!hL}5@:T10KSX9Y"!#T8ժ`  b@2     : T H  91<20KSX99Y"!#!#T7ըT8ժ``q 5 #/3?Kb@7 eFe:a@e2e$a0*`42dL1C=3'!    - ! 'I 7 'C =L9912<<22202#"&54"32654&!"32654&'2#"&54#3!2#"&54"32654& ۜם Vn=>Wm>$Vo=>Wn? ֝ k֝ Vn==Wn?魍WWUWWWUWꭍ ꪍXYTX{k'$Du+\k'(u{k'$Du+\k'(u+\k'(u+k',u+k',u+k',u+k',uJk'2uJk'2uJk'2uTk'8muTk'8muTk'8mu?`0@:z& 91/0KSXY"!!h`f8@ 991290K TKT[X@878Y!#'#!f9@"    91999999990K TKT[X@878Y@(         (]]'&'&#"#>3232673#"&{1&"4 ^$C%5"&4 ^"<T%E<+C>=X,9910K TX@878Y!!bw%TFo@  91<90K TX@878YK TX@878Y@   ]332673#"&546WVPQh"͜F AFGI|y;-1K@ 9910K TK T[X@878Y@  00//??]]!!11y @@  KK10K TK T[KT[X@878Y#"&546324&#"326wxxwTABTUAATxxxxATTAAUT-o#@   991/0!#"&'732654&'%"1a3(Q&BL4X*hs 9/E7%f@ 1<20K TK T[X@878YK TKT[X@878Y@-   0000@@@@]3#3#ɮbfxoF@@  991/0@IIIIYYYYiiii ]!33267#"&5463G41-%R+9Z'joJJP"& EBA~59fP@ 991<90K TKT[X@878YK TX@878Y!373x `@6    : S    .9991/90KSXY"!%!!'%eTi N7bh=iJׇ @1: k   .9991/90KSXY"KTKT[KT[KT[KT[KT[K T[K T[X @ 878Y / ]!7!'%hfdu` NˑVDˇRk'6uf'Vbk'=!uf']T@ <210##  m p@:    : S      .9999991/<20KSXY"!]3#3 4&#! )#393F;0""`adk}3/#EQQ{m\Jm,@c*+,+)(),,+&'&#$#%$$#'(&%&(#$#(( !"(:,+*)&%$#'"'i i`'k-*+,) %$'&#" + !! -99999919990KSX9Y"&&#"32654'4#"$5!2''%'!%4f4d^@A[Wel%1W$#T`R#ms (j\tdtx] l^tj^yk'<uFf'\+j@: :u uS  9991/0KSXY"!32##!32654&#N+ WSY9BP̈eb׿uOVN\zRVVj@L:ii`k  !  999991990KSX9999Y"%!!6632#"&"32654&shuRkMH[sAcX_b]ρd~]7\ifk on10!!) /@   <291<290 '7NNNN3NPPN) @0 OO:  b     9991290KSX2Y"]@   ))99JMMJJ]3?33!fۅ9 41Z\sc@!  dP99919990@ 55YY ]]!!7>54&#"7>32y!\nPNA:DG$SElxD :c*(..,mdOTRj(t@- #  #d)   PP& )99919990@        (]#"&'732654&+732654&#"7>32KNP>!:w54&#"7>32#33?33!Dv ^nQMB9DG%SFlw=mfۅ :a))0/,mdOT I 41ZZ(+6:@r*6,6)+),,6)O*)-2-+O2-4O2-3O22-: #)* .*0 9#d40,7`2*)43+5:.120/-8   /-PP& 25- ;9999991/2<299990KSXY" (]@:)+*,(.9+:,9.Y)Y+i)i+         '[)l)]]#"&'732654&+732654&#"7>32 333##7!7#3LOQ>#:w3232673#"&j1!$4 _%A#5$'5 ]&@!% @8) =:`:910K TX@878Y@ //]#hG@ 991<90K TX@878Y@/// ]!#'#\3 M@ 991290K TX@878Y@//// ]!373N3@  1290K TX@878Y332673#"&5N QOHj'Ɣ<7=6}!>@ 9910K TX@878Y@ 0000]]!!/  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f+7q9s/) R3 ^;JXf-T3T3\1{+J+w+w+J++3++++J+J)+ub1+ f#?LJmJ{f)??R??V??JJ?X{7d)7Z1{1{Jw++Jf#f#f#f#f#f#LmJmJmJmJ?????JJJJJ{{{{N'?'7` Z;)L'3X^'7b#LVL3}3u^1{1{J VVJ''  7VJL}LNLfLf  ' q1{w+1{w+w+++++JJJ?=Ty-%5HJ7+\RZJ)+JLJLJR3 +`3N   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468""""iE%JbG>lq  < _  Y F M w mEK?Hn+McIgu$NLNh W !{!"q"#,#n#{$ $-$:$G$T$a$n${$$$$$$$$$$% %%$%1%>%K%X%e%r%%%%%&.&'''(3()**w*++E+,- -D-s-..//8/[//01D12t23x334+45'5L556!6!6.6;6H67Z7v77848c8899"9/9E99::;:;;;>u>>?#?i??@6@p@A+A8AEARA_AABBBCCCCD8DE EF{G`GmGzGGGGGGGHpHHI5IqIJ J6JlJJK` R79k:;2<$&$&$&$&$&$2$7<$8$9u$:$<$F$G$W$Y$Z$\k$d$g$h$o$$$$$$k$$h$h$$$$$$$$k$$$$$%9%:%<%%&6&&'&'-Rfpgmp9)gasp glyf4h)&hdmxEHheadO$6hhea. $hmtxy,kernlocaXz[maxp} nameYͿpostx<prep|a!\::N:: R^0p   t t  &   ; 0  0   C , [ `   0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans BoldRelease 1.10BitstreamVeraSans-BoldCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans BoldRelease 1.10BitstreamVeraSans-BoldCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comf3f=ffTbfTfmf3bq%fHZfm99Xm=fuff9{{X3fLfLJ#DDf?;Pw /X#/553X sf+j-j!f#^`3B3\fy```{j\{`bXP1L`%!JJ7{'}3Xy9bsA&%$!:$#"!:"!: d}}      Y    & Y @ &  .A@}>,,G}G  @ 2 d۠d%%%   %ё%Д #&̑ɻ]ɻɀ@%]@%dĐ::2  }& @ ]%]@..@   K%%%2 ~}|{zywvwvututsr}qpo,o,nmlkjihc h2gf2ed ed d@cb c b a`a``_ ^]\\[Z[ZZYXWV@VUTSRQRQQPOPONONMLKLKJKJIJIHGFGFEDCDCBA%BAA%@?@?>?>=< =< ;d:987656%54554 4432 33@2 10100/ .-,:-,%,:+d*d)(''& %$#@+$#" "!!@  %@ K}K%%dd   2     @   @d  d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX (EDY!-,%E`D-,KSX%%EDY!!-,ED-ff&&/10!%!!fsr) @ <2991/0!!!!h33h^h@1<20###h++)K@1     91/<2<<22<<220!3!!!!#!#!5!!5!!!`aaE````HFR`PF#*1s@? %$ + ,#,, (/($ +/ 2<<991/99999990#&&''&&546773&&'6654&}osy!dede GUNWWP-.);?7* "*/(BE5;CBBDCB '3c@5  % ."( 41+  1 +%49912<0KSXY""32654&'2#"&546#3!2#"&546"32654&3GNMHHLMGֺ%պպHNNHHMNh{rs{{sr{ؽ۽ ٽڽ٨|rs}}sr|{&06@Y     ,-./+0()'%0' - -! '*$ 0$*$  *  199999991/99990KSX999Y"']@   ' 0   0%/ / %&? ? @K K K/K0ZZUZ Z U(\.\0X2_2dig`i i d&2, ' '* 9 5005@J I'I(WW\ ['ggl ]] >7!!'# 5467.54632.#"3267577oc%Xbi*([k^PMU1ABwCt2>FnkmFDےj5j:0.;6"W/wGs))@ 10#+ @ 29910!&547!י);: @   29910654'!)?C)9F@(      <2<29912290%#'%%73%JLLNLNMXX "@   <<1/<<0!!#!5!    m9@ 10!#hduo10!!ot91/0!!h}B/99103#mb/ #@  10&#"326! ! i||jj|{j@'&@mstm (@  1/20!%!!!T[nT HH5@)% 9991/2990KSX9Y"K TX@878Y@&**"""555BJFF]]!!>54&#">3 N!IFuZzz )~B~DiMLH+-zӱ(L@+  #)& )999190!"&'32654&##532654&#"663 sqlg~]^rl#!%'%%)67jcfi[]V^*) \3 C@ !  ! %    <291/<290KSXY"!!3#!!Z@jRJ=@"  " 190!!663 !"&'32654&#"v,Y00{zaSl 12/FFuv+-# $7@ "% %$%190"32654&&&#"6632! !2eeeefeev_PB[uEgჃ-+11ir E@%91/0KSXY"]@ &5F]!!!e'1} #/G@( '-0 $*& '&!$0991990"32654&%&&54$! ! $54632654&#"lttlkrr|כc\ZbbZ\cvnnuunou)ž)*ސUY``YY_`j$7@  %%" $%19073267#"54! !"&2654&#"\RDZ9$@ieffeeff!++22 "vYN`@<21/0!!!!ii`}}N` %@  <210!#!!idiu}=@29190 5<'@ <210!!!!=@<91905511J!H@'    "<299991/9990!546776654&#"6632!!Bj@95`VQfy]N^@D*i1Rb:4\.FOCB:*(ǿbY9>K-o Ml@: 40LM3 30 07$CN34L **)(I(*)4=N<991299999032654&#"#"&54632536654&'&$#"3267#"$'&5476$32!#?iZYjkZXiYثY|:;_tZked~Yk}٘~~On{KM'{zyZGOPGKɝdIz=;bɵdbg^Pag}}IJ}|b~ ' @@     %    91/<90KSXY"K TX  @878Y@ / V f  t   %* IFGH XYVWhifg` t{zu{t      /]]!!!!!F_}))}+%R P@%    !299991/90@ ""/"P"]2654&+2654&+)! [^^[tutuH|B7fPNMQsbcaay$ռmf\;@    - +21990/_]%# !2.#"3267\j}Lu}jksskR78ef87IDDI9.@  -. 99991/0P]32654&#! )=TMwiffixjq#ateeta 0@   21/0 P p ]!!!!!!rg +@ 21/0 P p ]!!!!!rgfK@%    1 3/-+19990_]%# !2.#"3267#!ʥLy}|@   221/<<0@P ` p ]!!!!!!89+y=71/0KTKT[X@878Y@P]!!+f= L@   991990KTKT[X  @878Y @ P ]!!#3265N3IO@UZfi ]]!!!!mR+ff 2@  -7-+10@ /?]"3254 ! f°±hhgddjk 1@   - 299991/0]! !#!32654&#1pzzp_mddlffb@   - 7-+999190@,  '/V S f ` w w p  Y Y YXj i x ]]# ! !"3254fgk-¾lkh\@2%       29991/<9990KSX9Y"]@66EEVVPee`]2654&+!! !.#yiiyL'O}@f7q^?ZgfX֔-XspR-'@*% %( "(999919990@Tp)9999 JJJ X ]\^^ Z!joooh o n!t t t || |!  !  !(]].#"!"$'32654&/.54$!2{hYuӎ⏏ |~[ {78LP@881/20K TKT[X@878Y@ ]!!!! `N3@   91290@p]!3265!! yy6= '@'%91/290KSXY"K TKT[X@878Y@,  GGHHEJWX]]! !! 5N+= x@J 6  6 6 6   %     91/<2290KSXY"K TK T[K T[K T[X  @878Y@  % :?:?3 0 0 @ @ @ ^^a          '('(%* /66220002 4 6 ?IFHE J ]]ZZUURRRZ U ] ooonhheh k n i o wwx v x   K]]! ! !! !=qsnDD==+o' @E    %     91/<290KSXY"K TKT[KT[X  @878Y@X  /& <3 _P      ++%$%+ :55: P ejo  ]] ! ! ! !omGF@(%:: 91/290KSXY"K TK T[KT[X  @878Y@, %%0@P` %*5:0 O o ]]! !!TTu\q w@% 991/0KSXY"K TK T[X  @878Y@ %)69? FHO V_ o ]!!!5!s8!7@210!!!!mB/99103m@210!5!!5!m`@ 91290##fg--/10!5۾^fN10K TKT[X@878YK TX@878Y] #yfxX{ %@*   # # = ;&229991/9990@L/'= =!?'M M!] ]!n n!~ ~!p' ! ! ! !20C@SPc`]]"326=%!5#"&54$!354&#">3 pq[QeiH"ӆsUst/ LJDMm)f]ˢŸUO..^ 8@ B@ 221/0O`]%2654&#">32#"&'!!syyss{{{Ju uJf稠b]]bX5{7@ B ;210_].#"3267# !25IOT@TWV/X=202177\8@ @B ;221/0O`]!!5#"322654&#"hJu tsyysryyXc\II]ɨX {C@!    D ;9190/?]!3267# ! 4&#" q}K"=w`h3f~~CD015:“f}un'`@    E <<991/22990K TKT[X@878Y@ ]#"!!!#35463L<27DN`N\Fy(K@& #& @ B;)221/990O*`*]%#"54325!!"&'3265"32654&Ju uJhic^[o|xsp||b\CA\c !655@   G 21/<9990`]!54&'.#"!!>32 H.pfQnVon#'b])@ <21/0@ P ` p ]!!!!ff`F =@    <2991990@ P`p]!+53265!!fͱ>fLf`\y @   291/<90@`;IIZ]X_ogvv{:DGJV]g`ewpv|]]!! !!fNNK- 1/0@ P`p]!!f{%t@)   #  H H &<991/<<<29990KTX&&&@878Y@'0'P'p'''']>32!>54&#"!4&#"!!>32DpFNfo@RgphBgthmVH wkHk`_`p{5@   G 21/<9990`]!54&'.#"!!>32 H.pfQnVon#'`b]X'{ -@  BLB;107?G]"32654& ! w}}wu||u!EG{88V^{;@B @ 2210O`]%!!>32#"&"32654&fJu us{{ssyy b]]7\Vy ;@  @B;2210O`]"32654&#"325!!ryyrsyyyJu uJhw+c\IG\c{C@     21/990KTX@878Y.#"!!>32/]/fE}*(/`nejb{'@@  6  6% %( SRP"M(9999190KSX99Y" ]@^ #  ,. . . . . ) 9; ; ; : : K J J J H w w  %  7 ?)_) ]].#"!"&'32654&/.54632s_fcKa?o}ktijIm?c=0035+. ###44:90/ x@    T<<991/<2990KTKT[KT[KT[X@878Y@??PPP`` ]]!!;!"&5#33q>\Ա%N7>`;@  G 291/29990`]!3265!!5#"&hG.pfQmp[.w#&)b]`@'%91/290KSXY"K TKT[X@878Y@| 0@Vf  &$+)64990FFII`x$]]! !!fgGw`H` @J 4  4 4 4   %     91/<2290KSXY"K TK T[K T[X  @878Y@ 550 G @ @ _ l        &$+)*+ $ % /554;::78 ?GIFHGH YVV[ T Y _f`b```d ` upspppt p      []]!!!! !H\+\yy` ` @F    %    91/<290KSXY"K TKT[KT[KT[X  @878Y@  / 3< CL R\ bl sz         2     $++$ 4;;4 0 DKKD o       :]] !! ! !l{{l=#LbF`A@C %    9129990KSX9Y"K TKT[KT[X@878Y@ @Pet $$$5586699EEJJEEge    9]]! !+5326?f-f)Gp[S `6:K\F` @% 2991/0KSXY"K TK T[X  @878Y@DYVifyv &)/ 9? J_ ]]!!!5!uNN`f$^@1 %   ! % $  %<<29999999199999990#"&554&##5326554633#"3l==lEUZnoYUmutWW10#$`@2%   #%# %<2<999999919999999032655467&&554&##53233#"##FUZooZUFl==lmWW͖tuR#@  1990#"'&'&'&#"56632326j`k^Xbk`k^VRPE:=MSPE:=K 'k'$u 'm!{@S!! ! !%! !  UU "9999999991/<9990KSXY"K TX"""@878Y@/!/!:!o! !! # ///  /// "+ #EKUZ` ` ` ooo``ooo`fi `#tuyz{t    D]] !!!.54632%32654&#"!}^_}vtwM66MN56MJH"K+uu/L{6MM66MMRfo\'&sk'(um'15uffk'2Nuk'8'uXf'DXf'DCXf'DX1'DX9'DX'DXo5{'FX f'HX f'HCX f'HX 1'Hf'wf'Cwf'w<1'w9'QX'f'RX'f'RCX'f'RX'1'RX'9'Rf'Xf'XCf'X1'X5; *@  WV W <<1220!!!!!5!VJ#!/dL @  XYX10"32654&'2#"&546HdcIHdeGBz0/11-0|D\dHHbcGHd3/0xDCy-03#W@.    !$   B$<<222991<9990&&##667###$4%3NMMNJAY9S: GZ,lm*902i2/  (.##}@@!   <<1/222990&&#"!!!!3#5356!2FMvqu\'&} F=3?k@8@1:4 %+1@ =!+%74:!=\.!\=[.7[(@9999991999990&&#"#"&'532654'&'&&5467&&546326654&uc9KL ҟquMKUfs9AN$ˠoqKATDC{AF''1/CO Y}u0)qI)+2(FJWh33oKL2CbBO4Cj'` ]104676632#"&'&&'535II245633JI326J235624IJ336633;d &@ ^^9120!###&&54$\fN۲h0j@4.(" !++/"!(%  a%.(a_ . 199991/990@ /2O2p22]4$! #"&'532654&/.5467.#"! 1]EtkAJ8s6HX7bFXT`[efZG NJ%94%@uH9/D7'1Zt2UYnm 4Lb@8-*+'0!5 2+A'*,$0-+$!1g3f$cX;eX3cGM299991/29990"32676654&'&&#32654&'2#'&&###2#"$'&5476$yWWWWWVy{WWWWWXϲ##NOM+i`)Gok&: 1mmllmmmmllmm3WWWzyWVVUWWyzWXV5442wyVpP:NAD7nmmmmnnmmmmn1IH@(  2&>f,X c8e XhDJ21/990&&#"3267#"&54632'"32676654&'&&'2#"$'&5476$+9o9q~r@s.A>EyWWWWWVy{WWWWWXymmllmmmmllmmf%#rs~$#WWWzyWVVUWWyzWXVnmmmmnnmmmmn'R v@>  %    ji i ji91<<2<<9990KSXY"73#######5ww㪉LqKBMmf710K TKT[X@878Y]!#f;;1\@1<20K TK T[KT[KT[X@878YK TX@878Y3#%3#1 =@!      <291<2<2.990!3!!!'7#5!7!^P1}@7%     /<291/<90KSXY"K TK T[X@878Y@&W ] !!!!!!!!!{y}sfb^- +@> +,   )*&& &,+,* # )-#7-+,99999999199999990@p- -*'&!/-976!9)?-GYVT!Y(Y)jege!j%j($'))68)KFE I)Z^SVV T!V"[(j ejlaf c!k(x ]]3254&/.#".5!27!"&''\4SM3RJJgfqMLhfqs>;Du1:9@q.dkKMscdOOq /B@#  $'!-!0 $k*k099991<999032654&#"&&#"326#"&546326632#"&+vIZqgLHw+tKZqfMGzDaƯZcG_ů[1CDeOMeeCCdOMeia~q~n .@   l l <2<21/<<0!!#!5!!!  bb '@    <2291/90%!55PN '@   <<291/907!!55%y@B  %     nm n m<2<2999991/2<<<290KSXY"]@, $+6:FI   0@ ]]!!!5!5'!5!! !!!!N9:1k$! %j1`BV3VBT` :@!  !   !2912<990!3265!3267#"&'#"&'idfgdh!'!5]-Yq#/YJhT utqqtG8 KSOO/0;R)8@'! '!* $$*99919906654&#"#"&54632#"&54324&#"32;'#S0@eID`IFa~q9WzC2EqG Ur|tx)w O@    91990@ &#)  ) ( ) 8 ]]!! !!5 Bl_{Nw@pp120!!!!)JD/@    991/<22990#!#!#"663J'7: Ddd>Dǜ3,B*# @- *(&  qr q-9919026732#"&54&#"#"&54632jciRA@Ae '&>ÄkTF32-ӅhB:Yr 7^YUWO\K=4>3:rWT@LHt8;##uu 9A  @  uu 99102#"&546!!"32654&B7T[[TS[[޾ܾM~tt||tt~7F   @  xwx w 9991/<2990!!654&#"!!&5! #~˲˄~#~zx89xz#VˤUy9yǤX{>@B8>66'&# 6-*>;0*? - 6 & 7 3;?<9999912<<<9990@N>>?@MMO@^^_@nno@@@2=0>B=@>R=P>b=`>=>=>=>=>]]4&#""326=>32>3 !3267#"$'#"&54$!354&#"w`gpq[Qe^waGMz =q}~Heߋ"ӆsUf}unLJDMm)JMOMOf~~CD01kdkdŨŸUO..N) +@> )+ *& &&++, #* #)B#LB;,999999991/9999990@@:5 ;75!8)?-IF KGD!H)[VT!U(ikfe!e(5:)EJ)U^(i em( ]].#"32654&'.5!27!"&''XK/w}HO0u|;CDG"jKmFElMpD)A+CN{8,,eP~--^!M@*   "  "<2999919990!3267#"$54677665%!!iAm@84`VQew\N^@D*ii1Q~d:3\/FPDB*(ǾcX:=L-d @ <2991/0!!!33h=^qd@ 10!#!LZ n@*      %  @  9190KSXY"3##'%`w͑%hN7V7#w@I #"!   %   !$2299990KSX92Y"&&#"!!#"&'53267#5!766327.T*Zd!)AD.U)Ycu!3*Bs_sM#;C@!.9* 1 "9*1<-<<219999990#"'&'&'&#"56632326#"'&'&'&#"56632326j`k^Xbian ^Vgj`k ^Xbk`k^V#PE:=MSNE;=KPE:=LTPE:>K  @ /91/90!!!#-3mV?j' 5  @  y y<2991<299055%$'qsq' 5  @ yy <<991<29905-5%%%!$'^ #@   1/<<220!!!!!!hhh}}} 'k'$u 'm'$uffm'2NufP@"     -+ 299991/220@ !!?!O!_!]# !3!!!!!!"# !2i iZhsf / F& 0ihX^{'3t@2"  .(%4"1 1 +B;499912<9990@/5?5O5O5_5o5o55F"]]4&#"!3267#"&'# !2>3 %"32654&w`hA q}~~HRՂG"QRLJBcw}}wu||f}unwf~~CD01QWTT88RVWQ:/10!!/10!!X +@    1<20!3!3!ddXb`Xo + @  1<20!#!#!TeTe`^X@ 10!3'dX`X9@ 10!#Td`V 0@  z{z <<10!!!!!!33Xˁ#uv@A%91990KSXY"  9%-F1'\k'<uh+@55%10KSXY"#3 J=#/@ ! ! $A !* @&00   '}|~-} |022999999122999990'7&&5467'766327'#"&72654&#"ϙљ0l=6l9ϘϚ.j?:l[\[~ Ϛ1k??l.͚Ϛ7n6?i/ϙ\\\]~'y291905%'q'y<91905%%$'+Bu@&       ET<2<<991/<2<2990KTKT[KT[KT[X@878Y@]!!#"!!!!#35463iJK:k$7DN``N'Bl@!      ET<2991/<22990KTKT[KT[KT[X@878Y@]!!!"!!!#3546{L<)7DN`N3;?@!   W VW <<<<2912<220!!!!!!!5!!5!VJ###!<}910!!h}L@ 10!#Te`F + @  1<20!#!#TeTe`^B V #/3?K|@C3 2211 003%@ *$F4 :02$L3IC1!  C=!'= I7' -L9912<<2220KSXY""32654&'2#"&546"32654&'2#"&546#32#"&546"32654& HNNHGLLGֹHNNHHMNGպֺ׺GNMHHLMh{rs{{sr{ؽ۽8|rs}}sr|ٽڽ ؽ۽٨{rs{{sr{ 'k'$uk'(u 'k'$uk'(uk'(uk',duk',du)k',du=k',duffk'2Nuffk'2Nuffk'2Nuk'8'uk'8'uk'8'u` 1/0@ P`p]!!f`yf6@ 91290K TKT[X@878Y3#'#Dzf\9@  @  999919999990K TKT[X@878Y@T              ( ]]'&'&#"#4632326=3#"&7/$&g]$I)=%$(g]$CT%>;+@9X;E10K TKT[X@878YKTX@878Y!!vPF i@  1<0K TKT[KT[X@878YK TX@878Y@]332673#"& cSSc FFJJFw;1*10K TX@878Y!!w1 C @ : 10K TKT[X@878Y32654&#"4632#"&}M67LM67Lvvvv7LM66MM6vvvo5@   991/0K TX@878Y!#"&/32654&'Z:7{0f42S!:A+->j/_[ .(R<fE@991<20K TKT[X@878Y3#3#-fxVo@   991/0!33267#"&546ō2&;1'M(7^)s{6CI'1 \V5myf6@ 91<90K TKT[X@878Y 373Dzx `@2 %    <<.9991/90KSXY"!7!!'%s۔#` j ~@-   %    T <2.991/90KSXY" ]@ut@ P ` ` tp p  ]]!7!'7ho}o XV-k'6ujbf'Vb\qk'=u\Ff']T@ <210##  !L @   -. <291/<20@X!P!`!////////OOOOOOOO________(]]3#32654&#! )#3PULxhgghyk#ateetamX'(@Y&'('%$%(('"#" ! "! 5((5(%('&%"! ## #)'& !#(%" BB;)999919990KSX92Y"KTKT[X)@))878Y@6f!/*76"?*O*oooooooooo]].#"32654&! 4!2''%'!%7l4uru| uj-.N$%3`ox#y-\8 watr`k'<uFf'\ @  - 2299991/0K TK T[KT[KT[KT[X@878Y@,0000PPPP]]!!3 !32654&#=1pzzp]mcenV^;@B @ 2210O`]%!!>32#"&"32654&fJu us{{ssyyb]]7 10!!) /@   <291<290 '7NNNN3NPPN{ 7  @   129035733!9 41Zm]@%   "@99919990KSX9Y"!!56654&#"56632r_9=4I;>TWKGeD 5P(2>-/oHyVZ(W@ #  ""#@#)& )99919990#"&'532654&##532654&#"56632P\fQDB<_hkrJTbZNP4{FAWZ`nQ$%@;@=/3--piE`d @     % @    229991/222990KSXY"333##5!5#335733!9y+ I 41Zd'@   %!   $$& !&"@ #%# (9991/299990KSX9Y"%!!56654&#"56632#335733!qt];>3J<>UXJIc 5N'2?-0oH|T I 41Zh 6:@ : 9988 77: %.1* #! #!$-*$!#917@$$8'" :!'"4  '4-";229999991/2<299990KSXY"33##5!53#"&'532654&##532654&#"56632#3'y%]fQDB<_hjsJTb[OO5zGAVZ-D7#nQ$%@;@=/3--piE`q fk'* 1u\FF'J=k', duo-'6job{'Vbf\k'&fuXuf'Ff\k'&fuXLf'F\$K%@"      @"B;%<<1/<20O&]!5!5!3#!5#"322654&#"FhJu tsyysryyrr+c\II]ɨo10!!ot910!!h}1r@;.*(1.!2*("%!) 2 +) )% 2229999999999122<2990%# '#73&&5467#736!2&&#"!!!!3267_pKXbXMep_Qc-VY2~cTR78 87NO{v$$ zzOO;@ 1<203#%3#mN810K TX@878Y@ //]!#3\#@  @! $  $999991<29990K TX$$$@878Y@\             ##+]]'&'&#"#465463232653#"&8- (kW%J';'%'kW&F#<2j'<9j810K TX@878Y@ //]#yE@ 91<90K TX@878Y@/// ]!#'#f4߲DzyK@ 91290K TX@878Y@//// ]373f߲DzP S@  120K TX@878Y@///// / ]332673#"&`LL`=<<=w*10K TX@878Y!!w  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f+B{s/) mRo b\}j331 fwwf3ff)u 1 =+'\^fXX\mX{'\RVX\j7dH)7\1 1 fwffXfXfXfXfXfXXmXmXmXmX<XXXXX5}''m-Z;)L'3u'7bXNVL++1 1 f VfXBB  7VhJLL+'3  B B1 w1 ww)fffwV#j\\!X7{mZHdHdHhf\jfXfX\Ro mw   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468%%%%Nq] 6 N{U?u<_O K G E a > *2e:\u#p|$Z<~*Z@!I"dqjw   - : G T a n { !!]!"""##$.$%!%K%%&H''n''((()6){))*<*++p,5,-8-a-}-.B..//\/////00001161U1t112 2292233v344-4L4~5*575D5Q5^5k5x5555555556 67667H7k778'8W889-9:9G9T9a9::::;O;;;<>>>>>>??????@4@T@AA@AuAAB 79k:;Y<$&$&$&$&$7a$8$9u$:$<<$Y$\$h$D$D$$<$r$r$$$$<$%9%:%<%%&/&6&&K&K&&&&'&'<6B<;:6B:S9@p8}76B6-6B543:20 /-,+-+1*))#('&'d&% %2$ $}#:#" "!!    @  @:%d%%A%:  }    :-:-  @d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ D/10!%!!fsr) @-   :HF 991/0KSX9Y"K TK T[KT[KT[X @ 878Y3 #3#Z2q1qe@IF1<20#!#o$++/N@4L L    91/<<<<<<<2220!3!!!!#!#!7!!7!!!h$igP'RT$hggh%JT'Pf8T%aabbND /`@9 $ KOM+* K#M-*',+ -#$*  '09991/<2290%6654&'&&'#&&'7&&54$773Xfs_l""VOT;d;tS"\jX/d,ZgT\ZdFO.2U -/*>D$~ #/3O@,W*WRW!W*R1$Q0V40-2 '  ' - 49912<0"&54324&#"3264&#"326"&5432#ሟ躈HNMp~QKk\LMoQKk纈.ñ ij­\dkjí]dò   ` 3@T// ///:0 /& Z&%Y)Z"VQ 0/&, % 3,3  4999991/9990KSX999Y"]@X *: It      % & %&+)*%*&6 9%9&6/KIkxu/]] 326#'#"$547.5467>32.#">7Vy}^n-gjj.+ExNQ#KF|&EKjXgA[lSUڴt._6Dz2RZ$$/1d,VXOzo@ IF10#o+j @ \   99910#&5jLL\ZəE)G#N !@\ 999104'3 KL\ZKS7=JN@,  ] ] V    <2<2991<22990%#'%%73%g:r:g:PrPbybcy #@ `  <<1/<<0!!#!5!-Ө-Ӫ--@:bH10KSX9Y"K TK T[X@878Y@%%55FFVV ]KTX878Y73#!ぐ@\?@ c9910KTX@878Y@ __oo]!!}w{Q@:H91/0KSXY"K TK T[KT[X@878Y73#1jBj.@:F910KSXY"3#mf#D@d dV Q$! $10K TK T[K T[X$@$$878Y2#"547>"3267654&e[]g\\L7\murP7[ku}QOuХQOѥd T@* :ddFd   99991/20KSX2Y"7!7%3!!J#sI }HHժ@,:eY dVd 999991/990KSX9Y"K TX@878Y@( ,,eyuxy '4Ucv]] !!7>54&#"7>32{#7!qn_%|`rרBu]azDA12Щr+@+ d!KXd+KX(dVQ!g,!  "+ %,99190K TX,@,,878YK TKT[KT[X,,,@878Y@aff*a++]]>32#"&'732654&+732654&#"Dnd跡~vslR^c%^d`l &$}xL:9%%43ˢhq^g))% @;   : d F   991/<290KSXY"K TK T[KT[KT[KT[KT[X@878Y@$:  +*) :89 6 f yu ]]33##!7 !q!CD^'7f3`) @6  :dKOddFQ!   !999190KSX2Y"K TKT[KT[X!!!@878Y!>32#"&'732654&#"H._1{qPZg%\^OZը޾\@E --갂%% *@# d dk K hj(VQ+ "+9190K TX+@++878Y@`z{J J JJ*Z Z ZZ*j j jj*z z zyz* * * * * * * *-]]4&#"326.#">32#"5476$32pӁr":U>IpkfFimbg%N)ﰄ:&(UWӲ_AF@:dF991/0KSXY"K TX@878YK TKT[KT[X@878Y@ ')Zhxy]!#!'V+D /c@#$d dd*VQg0$' -'!0991990K TK T[KT[X000@878Y4&#"3264&#"326#"&5467.54$32˛gtsqxگin-qrD_ttdz+{Ӱ"$lŘZ*@("K"d kjh(dVQ+% +9190K TX+@++878YK TKT[KT[KT[KT[KT[X+++@878Y@FFFdddd ]?32#"&5467>32#"&32654&#"Z%:U>JpjgFhobhܲMDŽp҂r!&(UYӲ^BFvj #k@(:HlH91/0KSXY"K TKT[X@878Y3#3#91l2### @.   :HbHl   9910KSX9Y"]]K TK T[KT[X @ 878Y@%%55FFVV ]73#3##၏1@^M@*````:nm29190KSXY" 5Ѧ`@ ``<210!!!!^O@+````:nm<9190KSXY"55//m!@F  : K!NZHV  !"9991/9990KSX9Y"K TX"@""878Y@ t t ttt]%#7>32#7>?>54&#"11fjkyhT8NojTDm`Ph98gbTB^\{^\YFj9LVGBw4@Z@3 5"!4;or!o%5o ro%.A>  !"4811(A9912990%#"&543273654!"!267# 476$3 "32654&EW)\']RǥUѼhAiāresJLƘIPG0'}rW]rfiGr~wߜp~fy @@    :Z F   91/<90KSXY"]@$ *HIHGWhgw]]3#!# !>`]$+7 l@<:ZZFZs    !9991/90KSXY"!2!!!2654&#!2654&#Zг||TjEƃX-z՜ݨvlf>|aYVS@ ZetZVQ   99910K TKT[X  @878Yo!].#"32$7# 476$32)`}^32.#"326^NƟku)Z_Q]joIO8WUGG^cylۘ-7 }@D     :ZsF    9991/<20KSXY"3!3#!#Zwwˋ#d+97%2@:F91/0KSXY"3#Z+f! K@&  : ZvF    9991990KSX9Y"3##73267V5P!?%󪚾7 @G     :F    991/<290KSXY"]@j$%#675HXkixx  &&%'787=<IGFYX\[hfbbzxx~~$]]3! ##Z{ u7)79@:ZF9991/0KSXY"3!!X!^Ө7 @Q     : F    9991/<290KSXY"]@  )70 JC x  &)(') 2547 5 DGJCI F XYWhfw *]]!!## #Z/B7ž+7 @@  :F   999991/<2990KSXY"]@P' ?6H[j ")&5:=7IWY_ hkw ]]!3!#Ze+R#P@ ZZVQ$  $100%]KTK T[KT[KT[X$$$@878Y"32$7>54& 476$3 ^54& yl}9<^>OO]]``]!!#!y ժ+w@<     : ZQ F   9991299990KSX99Y"@!     4 4 4 4 4 444]K TX@878Y]332673!"$5467=˰ .˴; u=O\#W2@&:F91/290KSXY"]@0*(8GGXWgieyywh]]!33+)  @I      : F    91/<2290KSXY" ]@ ()& ;;3 KF     ')$)+*(- & * 6756 6 8 KGCH G VV gihg g yx 1]]333##H3J-hE  +# M@I    : F    91/<290KSXY"]@ )+) :8; IJI YZhhh y   ''()())& ( 8::665 5 8 FFGGD F H YYXT T X ffehfggfe e f zzzyu u    I]]3 3 # #s7u#h@7:F 9991/290KSXY"]@:(9IIZY{y$5Vj ]]3 3#[ʉf9 P@:ZFZ   91/0KSXY"x]@ w]]!!!7! { =w՚oR\Q@!:oo\9910KSXY"]]!#3!XB0@:F910KSXY"#XmD@ :oo\9910KSXY"!73#7X+ޏ@ F91290##HHu-o10!5fk910K TKT[X@878YK TK T[KT[KT[KT[X@878Y@ DDUgv]#JњfvT`{ +@d  #"$!)*(+:+(!!o (LK{LzQ +"! % %#% ",99991/99990KSX99999Y"0]@.<<O[[jjzz 2C@TPd`tp ]]KTX,,,@878Y@ !"#$+ ]#7#"&54$)7>54&#"7>32#"3267L}"Q9 Zd h] Ѹob$dc1Yc..''!Y~yXd״J%@M  $#$#"$# !#$#$#%$$#:! L LQz$\""#% !#$$%#$&999991/990KSX9999Y"`']KTX&&&@878Y']4&#"3267>>32#"&'#3uU7:CsW89FDpwnHgm2!/SOSmQORm\iƢvNTdc^J{K@KN LKNLzQ  " 99910KTX  @878Y.#"3267#"&547>32J%BPX6V^L]#PY}{TN500>9W}..!!Ϯ%uPR#^%@L   : L LQ z\%"&999991/990KSX9999Y"`']KTX&&&@878Y%#"&547>323#3267>54&#"XJ{vpJfl-xѹtV8;DsW5:EadǦ-wOShabSQTkRMS^{ &@$o KNL |L!zQ' $ #$#"'999910p(]KTX'''@878Y@,oooolo o o o$o%o&]]>54&#"!3267#"&547>32{65x\#cm}yNy "z&,64((ͯ-vJP.i@<      : o}\~      991/22990KSX9Y"K TK T[K T[K T[KT[KT[KT[KT[X@878Y#"!!##737>3d[/Ѿ&Oic/яNƠBV{.@X"#!-.,   :#,K L#Lz,L~ )"/99991/99990KSX99999Y"`0]KTX///@878Y!"&'7326?#"&547>3274&#"32ſ7aH"DV$MvvkGgq) \vI/LUy`+,*TX\ś)sLRi`e:4V|=H@M   :  Lz\   '%$99991/<99990KSX999Y"0]`]KTX@878Y]#>54&#"#3>32u j_ y/wFx \/HT^Ȧ^m$RH/q@*:c\~(%$9991/0KSXY"@ ]KTX@878Y3#3#w-'۸V7@A : c }~\   (...99919990KSX9Y"K TK T[X@878Y@////PPPP```` ]3+732673#)%0-vE/l[3-`GCHZ(H @H))     :~\   % $ 9991/<90KSXY"]@>6STThi ::@ XXWWiljyyy]]KTX  @878Y33 ##ww@"ju#H/U@:\%$91/0KSXY"@]`]KTX@878Y3#wѸH?{+@s    : # L& z~  #) # '#')$,99999991/<<<2990KSX9999Y"0-]@-`-p-]KTX,,,@878Y#>54&#"#>54&#"#3>32>32/dZ{dX{۸#KszT{\+>Zdɡ%?[eɡ`bgrv|!OH{@M   :  Lz~   '*$99991/<99990KSX999Y"0]`]KTX@878Y]#>54&#"#3>32u j_!{ٸ%Mw \/HT^ũ`aj$R^{ ?@LL zQ! "!10KTX!!!@878Yp"]"&5467>323254&#"O?cN?by~h@/3zVW˘CacJV{%@O  $#$$#"$# !#$#$#%$$#:! LLzQ"$~&"&% !#$$%#&999991990KSX9999Y"K TK T[KT[KT[KT[X&@&&878Y`'p'']4&#"3267>>32#"&'#3xR:9DvW59FJ{voJgw(s-TPOnRNRiad˦wOScb ^Z{"@L  :LL zQ~#%"#999991990KSX9999Y"`$]$]KTX###@878Y%#"&547>3273#3254&#"VJzwoHg|$ չ:|uwW7:Cadɢ.xNTbcRMQNRH{@4       : Lz ~   $991/990KSX99Y"O]@ T ][__]]KTX@878Y@@@@@@@@@P ].#"#3>32H)$q۸#Is:߻`ah{(@?      :  KOLKOL&zQ)  #)9991990KSX99Y"K TKT[KT[X)@))878Y@( //)X X X X XX ))99JJYY]].#"#"&'732654/.54$32#IV;{Yv$eZ? [?((cUc53pa"$46tY`;%y^b@>  : o~ }  991/<2990KSX9Y"]@ gyy]K TK T[KT[K T[X@878Y!;#"&5467#733bwMUw>=`". @:7!`>u`@L    :  LQ ~  '99991/299990KSX999Y"K TK T[K T[KT[KT[KT[X@878Y`]332673#7#"&546 h_!{ٸ%Ny c1FU]ȩlbkZ`@'++++:~91/290KSXY"]@,x%75IIgftsu]]K TK T[K T[KT[KT[KT[X@878Y0]33#ä`H` x@J++     + + : ~    91/<2290KSXY" ]@5 ED ST gdvt     ,&( ) $ 6=768 3 6 LHJJII H F [XZYZX feeddf` f v{zyv v   =]]KTK T[KT[X @ 878Y@.    ]]333##/>7T`{{`` @H++ + +  +  +++: ~   91/<290KSXY"]@*)&'%&)) ) + :865579 ; JIGEEGI J VVUVXW ffffefg f f vuvuuw v   J   &+)& 6886 FIIF Xihh wx   ]]K TKT[KT[KT[X @ 878Y ] ## 3;d'w`DNkV`2@F +  ++ +  + + :  } ~ 99129990KSX9Y"]@f& 7 F v w v &$$)9 9 98I I H Hwwwx x v v yy  *]]K TK T[KT[KT[KT[X@878YKTX@878Y+7326?33}jMlC9úhkTzk7ZX` @++:o~o   91/0KSXY"x]@xw]]K TKT[KT[KT[X @ 878Y!!!7!j!s!Kk`ۓ%4@f -.-..-    : 5'- )'.)o'oo'\5)(54.  $-5999199999990KSX9999Y"]@K      % % % %%5 5 5 55H H H HHK K!K"K#K$K%Z Z!Z"Z#Z$Z%%]#";#"&546?47654&+7326?>7>3M^3 yoIQ/UaNG- bq=> /G7.OgKB&5?9m{ D% 2-UKm{'"10#4@f -.-..-    :-5)  )'.'o)o)o\54.  5)('*(599199999990KSX9999Y"732677667&&546776654&##73233#"#N^3!xoIP/UaNJ- bq>>~5F5/OfL@&"2@9l{D' 1-VJn~&"1#@ `` 1990#"'&'&'&#"56632326ian ^Xbian ^V1OD;>MSOE<>LN'$um !@P !  !   : Z S " !"999991/<9990KSXY" ]@8 & 9MW  ( 98HGHW[YXX!gww ]]4&#"326.54632#!# !Y?@WW@?Y69rrIE>`]$Z?YWA?XX%qErrOz$Vu'&7 k'(u7^'1uRN'2TuwN'8uTf'DdT`f'DCdT`f'DdT`'DdT7'DdT`'Dd^uJ{'Fw^f'Ho^f'HCo^f'Ho^'HoH+f'Hf'CHf'H'H7'Q^f'Rs^f'RCs^f'Rs^'Rs^7'Rsuf'Xjuf'XCjuf'Xju'XjV; Y@.:L F   99991<20KSXY"3!!#!7!5Poٰp\]u=  @ V ,-,10"32654&'2#"&546PnnPPnoO@v+..ooPOmmOOp1.-rB!@[     ! : K NKNLL LLzQ"!    "912<0KSX9999Y"&&'667#&&5%3z+I>#/|YBS#AM54&#"#=& Ů*01wRL?AG|/N3aCԭqd۹q޺=%a(H%'^Pr[-NC+RoC~%NZ/8L`@6EBC?2H09JC 9 $HE301BKL?gwyVpMI`3D/IC@&=>:A$104G$ 73D=00*/D0/J21/02#"$'&5476$"32676654&'&&&&#"3267#"&54632mmllmmmmllmm^^``^^⃄^]]^\^BB@zBCFInmmmmnnmmmmng^^^傁^^__^]⃅]^^! "'F >@!   F 4 4 54591<<2<<903#######5Jq7rqr/B^^-f10K TKT[X@878YK TKT[K T[KT[KT[X@878YK TX878Y@VV]3#fqfyF@99991<20K TK T[KT[KT[KT[X@878YK TK T[X@878Y@"@@@@QQQQOOOOPPPP]]3#%3#)''>@" `  `  <291<2<<990!!!!!'7!5!7!}/H{};fըfӪ@L  : ZZZZF Zs  91/<0KSXY"]@-   GIIIGWXgfwuwwy] !%!!!!!!#ʚ!X!8i!>I7Fy 7@B78(&# )562'#Z2Z#V2Q8',(68),  &,5 (,7,  8.99999991999990@$7754709 &5&5' )765]]K TKT[KT[KT[X888@878Y@>IJ J7YZ d j gu { w) D6C7WS6S7`6`7w q6q76767]].#" 32$7>54&.5476$327#"&''-b\>A u3c[>? ''zm}9TZ((vp˽LZ<=mr-W,DCpz8]PUPMMcIbTRc /<@- !$'!!0 $*099991999032654&#"&&#"326#"&546326632#"&1TevYR1UfvYRF^_HDa^/XZie7XXjeߦ~᧯w .@`  `   <2<21/<<0!!#!5!!!-Ө-}} T@.````:m`  <2291/90KSXY" 5!!@po V@/````:m`  <<291/90KSXY"55!5AǪ\b@]  :    F    9991/2<2<290KSXY"]@85ESww  &&&::GFWUT``v vuu]]!#!7!7'!7!33!!!beXX` 6 ̾Rq 9{3{JD{3V`&@X   &#$"% : % L"Q ~'&'  %%'99912<990KSX999Y"3326733267#"&5#"&'-um  # ,P&BK8i]lV G4]d  TJPNVFh-)6@'! '!* $$*99919906654&#"#"&54632#"&54324&#"32IH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{w; [@    91990@.UPQVPb`g`e`tppupx V pp]]!! !!5 7AJI3!wq@77120!#!# }/#i@1 " $ #" #8#$9999991/<229990@ ]]#3267#"&5467!##"#>3!i/7.%7vy"Pµ)6< yJ\:1fd.xo@E}/%&@  & 9:9&1026732#"&'&&#"#"&546327j Pd@7*8  kOeD=!0 l9TA6?&#Hn!bSA8?SR +/r@@ " .,#" ,&V0 .- )/,0 #";);0999999199990"326?#7#"&5463356654&#"76632!!RLAsX:`kж]dFIODPPKS;F{=@pABzdFA""|x7{R 4@  V;;9999104&#"3262#"&546766!!catc\z˖&%>wPns֗mvⴚD?jv`{N@@" V  =<= < 9991/<20%!5654#"!5!&5! Dz?1/aL"a*>w؍T{ >I@T5>3*# I?>?o3o$K#NF L' K>{;L| z-'Q3JI@C54?  >3 C8*? #$ ?C0"J99999999912<<<99990@2; ; K K \ \ k k { { 3=0>D=@>T=P>c=`>t=p>=> ]]KTXJJJ@878Y@,oooolo ooooo1234?@AB"#]]>54&#">32>32!3267#"&'#"&54$)7>54&#"#"3267|6h]-V x["dm8f܄9 Zdfob$"z''Z\Z\.i<&,64((sqvn1Yc..yXd״ '1@B'2")( ,%" ,&",L"Lz"Q2/&2 )( / /% /' "29999999199999990@DJ H EGV%U&X)kkg%b&f's&w'p3I I FFU VWWY(fh%uvx%y&y'y)]]KTX222@878Y ()]].#".5467>327#"&'' 324&%]:O?bW:VO>aW9V'[;#"/)1~KzV43V7}D|V54T3%#G'&Lf!@I  : !HK!NZQF" ! $"99919990KSX9Y"KTX"""@878Y@#dddddddz y zzzz]73#"&546?>?33267d21gkkxgU9NnkTCm_Qh98gbTD^Z{^\YFj9LVGB k@/ :HF   99991/0KSX9Y"]]!#3#73yZ1p1eH^@ `10!#!^=} *@    91903##'%\sB}}`s-Pb;V#@P !    :  M ooMo!\$  $ $9912299990KSX99Y"&&#"!!#"&'73267!7!6632&P,`r<>9J{74a/am"?%ʩ.czɏ!!J;?@.9*-" *`19`"` `<-<<219999990#"'&'&'&#"56632326#"'&'&'&#"56632326ian ^Xbian ^Vgian ^Xbian ^VoNE;=LTNE;=KڲOE;=LSNE;=K`@91/90!3!^DC?q# 1@  l   991<299077'%}'%}#RRo# 1@  l   991<2990%77779'c''`% ^R^ ^R v@:    :H     999991/<<220KSXY"73#%3#%3#111k'$u^'$uR^'2Tu^ #@9    :ZZ F Zs  #  $91/220KSXY"KTK T[KT[KT[X$$$@878Y#";!!!!!"&'&5476$3xW1!X!9h!N{^+LInӵ+F#Ftba^{(2A@9 /) )o K N6L|32>32'>54&#"3254&#"x[%cm/e燿LBc6c {7h@/3264')ncihXulpq.iT"z嘗@acJy@ o9910!!yy@ o9910!!y + @1     :b F   991<20KSX99Y"@1     *** * ::: : III I YYY Y ]#73#73#၏w#၏??3 @.     : bF    91<20KSX99Y" ]@1    %%% % 666 6 FFF F UUU U ]3#%3##႐#၏լ@@ T@:bF910KSX9Y"@  **99IIYY ]#73#၏?V@:bF10KSX9Y"]@%%66FFVV ]3#!ゐլ@o )@` > <<103#3#!!oA#u"@91990  9%-V'\^hN'<um_@:QV10KSXY"]@) %86EYViexuu]3#/^R#/@I -'! - -L'L!0 *$0* $ $?@*?099999999919999999907'#"&''7&&5467'766324&#"326{r%$&(r;t=:x=q%%&&s7t@?s9q(&%%s>v:@t8s'%$|ppr#@ l91907%%}#R#@ l9190777'd# ^R!@b  : o }c\~  (%9991/<22<2990KSX9Y"K TK T[K T[KT[KT[KT[X@878Y__]3#3#'#"!!##737>3۹/-hd[/Ѿ&`Oic/яNƠ!@J   : o }\ ~    %9991/<22990KSX9Y"K TK T[K T[KT[KT[KT[X@878Y@ ````` `  ]!#!"!!##737>%ѹd[/Ѿ&{Oic/яNǟ;@I       :LL  F   .9999912<220KSXY"%!#!7!!7!3!!!jRRnkoRRpjn\\HF/@:H910KSXY"3#2F4@:bH10KSX9Y"73##ၐ@% ]@.     : bH    91<20KSX99Y"73#%3##ၐ#၏@@  #/;GKd@83W-WR'W9WBRI<QHVLHE0J*6 ?  $ !0 ? E* ! L9912<<2220"&54324&#"326"&54324&#"3264&#"326"&5432#s织HMMo~PKkn躈HNMp~QKk\LMoQKk纈. kjí]d ij­\dkjí]dò   m'$u7 m'(uk'$u7 N'(u7 k'(u7k',;u7m',;u7"N',;u7Vk',;uRk'2TuRm'2TuRk'2Tuwk'8uwm'8uwk'8uH`O@:~$91/0KSXY"@]KTX@878Y3##۸`Rfd@ 91290K TKT[X@878YK TK T[K T[KT[KT[X@878Y3#'#fP7@   91<<99990K TK T[X@878Y@  ]]K TK T[K T[KT[X@878Y@!    ]K TX878YKTKT[X@878Y'.'"#>322673#"&- '3}[%@/ &1}\&BZ7IR7GT}bd@ o9910K TK T[K T[K T[KT[KT[X@878YKTKT[X@878Y!!V)H@  91<90K TX@878YK TK T[K T[K T[KT[KT[X@878YKTKT[KT[KT[X@878Y332673#"&546rTVUnt HDCIM};D/@:9910KSXY"K TK T[K T[K T[KT[KT[X@878Y@OOPPUU]]K TX@878Y3#d' @   10K TK T[X@878Y@   ]K TK T[KT[KT[KT[X@878Y@I44400044 4 444000444OOKKKKK K O O O KKKKKKO$]K TX878Y#"&546324&#"326џtsst{WABUUBCUsstt@WUBBVVdu#&@    991/90!#"&'732654&'$"+V+'O*32''%'3%.#"3254&DEOKTRLX:(| G`P#+W,ufvdt|xet|k^ȃm_bdCDlhk'<uVf'\^7 q@= :Z ZF  999991/0KSXY"!#3!232654&#DB#3 qm|rRѯhsV%@L  $#$#"$# !#$#$#%$$#:! L LQz"$\&"&% !#$$#&999991990KSX9999Y"K TK T[KT[KT[KT[X&@&&878Y`'p'']4&#"3267>>32#"&'#3xR:9DvW59FJ{voJgw(s}TPOnRNRiad˦wOScb-`10!!ת? @M `  ````` ` ` :   <291<290KSXY" '77w55v8vL57y5yy5 @/ AA:  V     999120KSX2Y"]@  //??OO__]3?33!w摍 c)t'+nJ@/AA: V C9991990KSX9Y"]@ )),,]K TK T[KT[KT[KT[KT[KT[KT[X@878Y@#699FOOLLLLFYYjjzz] !!7>54&#"7>32;:TF7SL@{@BrnT.V(6C"${rY>q!(k@* (%V) (C "C)99190@(     ]]>32#"&'732654&+732654&#"S~7}raKP߸@@5p?{abV\fsRR8|=iVMr^Hy\R>?lH@55''5 d''5d!''5 d\m'* 'uBVH'J7`P', ;u u'6du{'VVk'&-u^f'FwVm'&-u^f'Fw^-@i'&(% !"#$  :((L LQ z\%%".999991/<2990KSX9999Y"`/]KTX...@878Y%#"&547>32!7!733##3267>54&#"XJ{vpJfl-CFtV8;DsW5:EadǦ-wOShaR{{SQTkRMS\@ c9910!!}HF/@:H910KSXY"3#2F+@> ZetZ)% # )VQ,,%$#   &$,9999999991<2220@o o ooooooo o! ].#"!!!!3267#"#73>7#7332!S`G5 7w mf'^a 7 8a@gbe^{2f7{V`34${7g1{Go@99991<20@"@@@@PPPPOOOO____]]KTKT[KT[K T[X@878YKTKT[X@878YKTKT[X@878Y3#%3#)&µ10@   ]K TK T[K T[KT[X@878Y@ ]K TX@878Y@(**)66GGWW //]]KTX@878Y@ff]3#͞Ln@ W W91<<9990KTKT[X@878YKTK T[X@878Y/&#"#>3232673#"&#+&"6}#{U#=$ &'9 }!}\79 32mn 6.mn910K TX@878Y@ //]]KTX@878YK TKT[X@878Y@ tt]#R@ 91<90K TK T[K T[K T[X@878Y@     ]KTX@878YKTKT[X@878Y3#'#Xמї c@ 91290@//// ]K TX@878YKTX@878Y#373՞ї T @*A  A  A :  V     99991<290KSXY"K TK T[K T[K T[KT[KT[KT[X@878Y@)+/--/ / 6Fy]KTKT[KT[KT[X878Y !33##7!7Zw7Rj%%`bam O@  120KTKT[X@878YKTX@878Y332673#"&w NLVlw"y=67?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f5D=`3=\wjfd%)DZj?wy}7V)7773\7\7\?7u777LR7LT7 Xwy{{RTJf^^^BH9H9H9HHH^^JH+#u3yyV77LRwTTTTTTf^^^^^9H9H9H9HH^^^^^uuuuV13 `'yL\#hd+/RRNT?L5=ZyyLR^9^% % V^33++% y7y77\7\7\7\7LRLRLRwww9HRP};dL# +{33\755J5!!3\B\7 +Vf^Vf^^\oLR5T1+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468c6469""""zF=r8<90 9 % F  | * r 1cO-0Z3t1GZH_ V`W2 f !{!""#$%m%&&'O''(E(R(_(l(y(((((((((()))")/)<)I)V)c)p)}))))))**M*+O+,,f-8-.o.//f/0411v112:23h34 4/445o567 78i88999:$:a::::; ;;)>6>C>? ?0?R?@@AAEAB4BABNB[BhBuBBBBBBBBBBC,CpDDYDEEEF.FoFGGSG`GmGzGGHHHHI@IIJZJKIKKKKKLLL!L.L;LHLULbMM0MUMNONO"OuOPPPQv 7k9:;06fpgmQ#gaspִ glyf`h$hdmx33>lHheadٗ6hhea M[$hmtxlL8locaxmaxpg nameL- $post*(prepԱ h:: S%:%: _k0    t  0 &  X J & J &  p 8  ` :  0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans Mono Bold ObliqueRelease 1.10BitstreamVeraSansMono-BoldObCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans Mono Bold ObliqueRelease 1.10BitstreamVeraSansMono-BoldObCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com#3#N#'#\ ##3##/%%1/;sqoV#d\H```{\{`o7L'5%={D=!/s@tGG22dk  Y&Y@&~2}|{zG{{@zyAzGyAxw2xkw2vutsrqp%olkj j iihghhgg@fed:d}cbcbaba`;`2_^_^];]d\ [Z[ZY]ZZYX%Y]Y@X%WV;V}U:U2T;T'SRSdRQPdOSM;M2L:L2KJ;JdIHGF F F@ED.ED@.CBABA@]AA@=%@]@@?k>=%>=%<;4K7 7   @6 2   2X}Xd++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-hh@ 7/10!%!!hsr)R ]@.    49    99991/0KSX9Y"!!!# 7# f!qe@ 91<20!!!++N@3      91/<2<<22<<220#3333#3#####73#73J^^^6H6^_^_5H5^qrvuu%v'D /m@;)%%$(<2 ZD*9-.,=BZ(|',.! '3V@-(  (?? ?>.?%1"+1""499991/999904632#"&"32654&4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q&0@O$%$&%%$()'/.040'$ % -<;C<BE%%!&!0$ ' !* 199999991/99990KSX999Y"%#"&547&&54$32&&#"6673!3267VWź FA16BX^&(*0 xlsZ^^,Z.H23հi:d/#&GB"tW :][4\c910!+R7 @ G   99910#&5789RPۏͦJ"F!qV @G  999104'3q89QQ8[%3y9TJ@(   B   <2<2991<22990%#'%%73%TJLLLLKLXXB\ #@ H   <<1<<0!!#!5!RPRPo4@4I10KSX9Y"!#:6׬o9910!!+u8\o/@4I91/0KSXY"!!NFoB3@ 49/9910KSXY"3#TmZw /@ J$J-B$E0 '010@////////// / / ?????????? ? ? D@@@@@E UPPPPPU ookkkkk k o   C////////// / /  ]]4632#"&3267654&#"#"&547>32I45JJ54IjDG@k$6ABGCj$6AfUIeSJ5HI43IGqljc\rkheI+ O@(4JJ9J   991/20KSXY"!%!!!^J3F53bL J/oc@24LK JBJ 9999991/9990KSX9Y"!!7%6754&#"6632bi3K13^pcRv3me:(.RbHQ;: (*{"`(M@,M LK#M L K MBE) ) &  )999190#32654&#"6632!"&'32654&4|sjSn6hXfz6`loUFL*( Ÿ$&$.0Rc` o@<      4 J9    991/<290KSXY"!!3#!!u51>?:jBj@84JLKJ J9 E  999190KSX9Y"!!6632!"&'32654&#"T+35!H)__3F_ǎzNO  (*hy(&` '8@M M L KM%BE(  (91904&#"326&&#"6632#"&5476$32#[Mi[Kln3IH 7:_bVis ?a@4-0)? OO P,)O0P O09@? < ,- <&<3@999991999902654&#"#7#"&54326654&#"3267# 476$32hQGgP+rB3#uf&x@3#&& !"&4"##V%VUCV BE'%$#"&'991990KSX9Y"K TX'@''878Y%#"476$32.#"3267#7!FsxbQMB3QG4)E "t$?91^;@"os$$CF;9/~MbN# @?     4VS9   91/<20KSXY"P]@ PPPPP]!!!!!!'oqn'ف9+h J@&  4V9 V    991/220KSXY"!!!!! 3y3׼)43)3R@+  4 UCVV 9E  991990KSX9Y"'3267!!#"&ANgtq4!RCCqoNX`_l 7785X w@B      49   91/<290KSXY"!!!!'l3\R_- P!6@4V991/0KSXY"3!!P#'w3/  @I     4 9   991/<290KSXY"K TK T[X @ 878Y@>  /////   '//)/;8]]!!## #a1)h/q+qR @:  49  9991/<2990KSXY"(]@*5(*'%300005QWPPWPWPW]]!!! ! /=+==)P@V'VB'E*! *10@+0044553300000000 0!0"0#0$0%]4&#"3267>7>47>32#"&dPQ;d$+PQ;c%-dUMbTNxxGE'\sKxvGE,Ss ck@;    4TT 9   9991/0KSX999Y"32654&#%!2##!)Th}I:N蹤mJ[MrB[Q=-|@%VV BE." " ".99991990@A000 0 0 00000000005553$3%3&0'0(0)0*0+0,0- ]#"&547>324&#"3267>7>cTNaU#iIӛPQ;d$+PQ;c%-]Bn/xxGE'\sKxvGE,Ss@Q       4T T9    999991/<9990KSX999Y"(](]!&'&+!!232654&#=Dj5ius#ZP{\\ HWx կi|NM'@;'''4 ' UC!V U C VBE('$ $(99991990KSX99Y"   ]@    ( ]]@() ( ( 9 9 9 I I I Y Y Y h h h y y y ( ]].54!2.#"!"&'32654&'|Cg[9Dovtn|;akFEP~))>?qXTS3A451QUud>[}@4V9991/20KSXY"K TKT[KT[KT[KT[KT[X@878Y@ ])!!!j1#3-s@=   4  VE9 9991299990KSX99Y"!3267!#"&546D'\Tl'#P?L} '/RZz|R?JNƷ*d-F@#4991/290KSXY"%!!!-{dA#+)Z @A      4 9    91/<290KSXY"]@**5888]33!!!l )3 ;H+q? u@?    4 9   91/<290KSXY"!!!!!/pf#hA1N`@149 91/290KSXY"!!!%BsswwL  7@4V9V   91/0KSXY"!!!7!13/Z}#?F@!4WWG9910KSXY"!#3!D&%ZTB.@49910KSXY"#mjB@4WWG9910KSXY"!73#7!d%%9@ 991290##--W/10!5/۾s`f/910K TKT[X@878Y#fx/u{ *@O      4!  ]]!<"\]%[E_ (  !"(+99999991/9990KSX999Y"K TK T[KT[KT[KT[KT[KT[X+++@878Y@23 0!0"3#vv x  ]]"3267%!7#"&54$!37>54&#"7>32Q?v7{Cn7%faRv/q[hm?Rm}MM1 9<98'''j/ @J    4 <<E[G    999991/990KSX9999Y"K TKT[KT[KT[X  @878Y%254&#"!!>32#"&XoSJrZ)/%w?_=7Euoephw`c۽i}{W@ ` <K< K [E  99910K TKT[KT[X@878Y%#"$5!2.#"3267MSo(bL5=Nz|F[%!!=)+:8ƀ~44B @J    4 <<E[ G    999991/990KSX9999Y"K TK T[KT[KT[X  @878Y"3254&7!!7#"&547>32yoSIrZ}%B_>8Eupephw`cܾkL}&w@#`d<Kc#< [E'& '999910K TK T[X'''@878Y@ & ]%#"$547>32!3267>54&#"_nXPT  l]fYd(7**afm-vSce>;h Ubvv@=    4 ddG e    99991/22990KSX9Y"K TX@878YK TKT[KT[X@878Y!!!!7!7>;#"XX+ۮ+*+A:LNӓ7X +@\+ + + + +* +'(&)+ +4)* `<<K<&[*ef,* )+ + ,9999199990KSX99999Y"K TK T[KT[X,,,@878Y]%254&#"!"&'326?#"&547>327!sRHrP5bW6KW}6`TIFjh#% dofo --u|SUѲlgtng;`@L   4  <[G   99991/<99990KSX999Y"K TK T[KT[KT[KT[KT[X@878Y@    7 ]!>54&#"!!>32Nۅ:7Sty/#t0e (5:=\gL7 @5   4 i hded    991/20KSXY"K TK T[KT[KT[KT[KT[X@878Y!!!7!!!!5Dl++m%C`X@?   4 id dhef  .991990KSX9Y"K TX@878YK TK T[KT[KT[X@878Y]%#!73267!7!7!!!=/;-df+N)B%+.;4kTVR @D      4eG   991/<90KSXY"K TX  @878Y!! !!%r9tRZ^B `T @/ 4dGd  999991/990KSX9Y"K TKT[KT[KT[X@878Y@ ]3!!"&5467!7!q>N-ͪ +Vm!-%pF,{+@k !    $!"!#""!4&$!  <)[$e" $,"%  &!"% # % " ,.999999999991/<<<29990KSX99Y"KTK T[KT[KT[KT[X,,,@878Y@? ? ? ?????7???????@@@@@@@ @ GOOOOOOOOOO O!O"O#O$O%O&O'O(PPPPPP P __________ _!_"_#_$_%_&_'_( !"$%&'L]>32#>54&#"#>54&#"#3>32 L\l  #"09 $"/7)yEEW@Kpa/aK13=(*Zw1*B(*Wz1`tDKK;`{@L   4  <[e   9991/<99990KSX999Y"K TK T[KT[KT[KT[KT[X@878Y@ ]!>54&#"!!>32Nۅ:7Ruy% 0e (5:=`\gLXy} !@ <<[E 104&#"32!2!"&R]U{aSyM mvjy6BpV{@M4<<[Efe    999991990KSX9999Y"K TX @ 878Y%!!>32#"&7254&#"{{-%!G]>8EupoSJrZ ba۽j|rephwDV}@N4<<[Efe  999991990KSX9999Y"K TK T[KT[X  @878Y7!!#"&547>32"3254&V'%s?_>8FtooTJrZP_dܾk}sdqhw{}@5       4 <[ e   91/990KSX99Y"KTX@878Y.#"!!>320vJ(d%#>w>o,/+)``iZF{'@<    4 ``<K<K%[E( " "(9999190KSX99Y"K TK T[X(((@878Y@(-/// / / ,/. / :::JJJYYY ]].#"#"&'32654&/.54$32F2K]^nIJvhc3V]n{=Xzr]=56F;-7%%r##8;KC.4'$p@>  4 de d  9991/<2990KSX9Y"K TX@878YK TKT[KT[X@878Y!!;#"&5467!7!P>+hj`@O   4  <E e  9991/299990KSX999Y"K TK T[X@878YKTX@878Y@      ]!3267!!7#"&546{#:6Sqz#!,eT4:?wZiH`@#4e91/290KSXY"K TK T[X@878YKTK T[K T[KT[KT[KT[X@878Y@    ] !!P``nZ-` @B      4 e    91/<290KSXY"]@.&))::KL   **-<<<IM[\]]333! !`!#^`5ZN` @@    4 e   91/<290KSXY"K TX @ 878YKTKT[KT[KT[KT[KT[KT[KT[X  @878Y@ )8HYY]] !! !#ժ- `dR=X`@A     4  df e  99129990KSX9Y"K TX@878YK TK T[KT[KT[X@878Y+7326?!!'p~-uWd<')5yi%=)+${hY& }_S) DPm}880=L=nVѧWLE'.8;3k10#0@i+,+,,+ 4+1''%,%W'W/W'G1/, 1'&%(&01.991999999990KSX9999Y"32677667&&546776654&##73233#"##{gX' ~^T) BQy%ͤ)_t>%>)+UͤTOG*06<1`r#m :UFtޓXy++@ ll  19990#"'&'&&#"56632326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7=nk'$3um !@J    !  !4 < = Q  " !  "99991/<9990KSXY"32654&#"!!!&&54632!oM66MN56MEku$*vt/P6MM66MMq$j5uu;lo'&yk'(Xum'13u=k'23u-k'89u/f'D/uf'DC/uf'D/u1'D/9'D/u'Do{'FLf'HLf'HCLf'HL1'Hf'7f'C7f'71';h9'QXf'Xyf'CXyf'Xy1'Xy9'jf'Xjf'XCjf'Xj1'X;y Z@/4; 9    9991<20KSXY"!!!!!7!yLL++L}8V@m mB102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHdhN$R@1` `J K JK[ E%  ""%912<220&&'667#&&5476673N5-n@@@3>A77mfP{775rh5(/L.)" țjSY"j@F  4 dLK<B J  9991/222990KSX9Y"&&#"!!!!3#737$325i!P+?34@-%3J))N h=#G@N7829 %8?/;.2;+;;EB+H785 (" 5%(9B 8?"B5("B#&N:)9>&"J-D?U^=micUor-+Rb.JKV^dmPzr30G7,X&':6&'X(#@"!D?)HECAzLTC+e?!"D?Ee DHsK]2)b?` 104676632#"&'&&736HI256743IH426I235624HI447743f; `@-  49  <9991290KSX9Y"!###&&54-վEfN'3@e )*+*&'%(++*4("!%3.+%`< %<.G E))*31! (+*1!  ! 1*499999999991/99990KSX999Y"KTKT[KT[KT[K T[X444@878Y@lllllllllll ]#"&'732654/.546754&#"!6$32y`L;:B@1:k.ZhoE,*ZR]r) #dS9`L;}D ODBoG-g;%@Gfefݮ+d}N 4L\@3-*+'0!o5n2+oAn M*',$0-!1"3+"$ G3 ;/29991<99902#"&'&&546766#32654&'2#'&&'##%"32676654&'&&hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIG}N1ID@%  q po>qpo2n>n&JD  8 ,/210&&#"3267#"&546322#"&'&&546766"32676654&'&&P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIGf A@$   9 # # ###/91<<2<<9073#######5dYЙkKuTKBC9f-10KTK T[X@878Y!#wAFf;H1a@99991<20K TK T[X@878Y@////????]]3#%3#Z111N >@"   H H   <291<2<2.990!3!!!'7#5!7!NŮmA1}j@L    4V <V9VQS  91/<20KSXY"!!!!!!!33<3N64H}nj{sL'.l@8+'/.(+%&"V"+VB"E/ .(% '& &/999999919999999032&&54766327#"&''&&#"wM8}4 bUNi= L5Nr9K4y6b<=2^"J'BAs8a,>ObJHrN47  /7@$ s'!t s-r0 $$$*099991<2<299032654&#"&&#"3266632#"&'#"&546320P2;JC88b6J0 b )'8yaxMB3F KbPJ?(: *.t@A! '~!~ -~+ +'~}~|B/! *$-,.+/  $ $ /999999919990#7#"&5463376654&#"76632"3267!!X.{OkЇIF9S!PAzu:,Up#P@X65zh#(*(&i^ EHK,:x+ 4@~~ }~B  999910432#"&4&#"326!!3%D=WxE54&#"!3267#"&'#"&546;7>54&#"7>32>32Jbu:1CP% (,8G=UF8A/9Q^ =Yl DA4V/OERt4T~NgU3IH7:_bViR ]@. 49 99991/0KSX9Y"!!!3H8 f#+eXjy@ H 10!#!X!,1 ,@     9190'%3##q@`44{$ V#@I   4   d`K<`Ks7+P'_iP'ˠ54&#"!3267#"&'#"&547>32>32267>7>54&#" (,7G> VH9@/9R^2\@68DŽSx%0Rr4D 394D3B'40UYF54O]72((QEKK<=<;>1XZ@JvaZxHA@I*|HQz"IA@ 9910!! 1/@ 9910!! 1/ d@2     4 G    991<20KSX99Y"!3!35׬5׬~~ `@0     4 G   91<20KSX99Y"!#!#}95׬-95׬8@4G910KSX9Y"!35׬~4@4G10KSX9Y"!#95׬BV $@H  <<10!!!!!!55uKu#\u"@91990 h 9%-X1'\Nk'</uB3@ 49/9910KSXY"3#Tm^T /c@8  *( -'! ) -0)'!$ * ( $02299912299904&#"3267'#"&''7&&5467'76632;dJIeeIJd$P0'T-)S.'QIccIJffq)S,/Q$*S)/Q&1m#@ /91907m2)w#=w#@ /91907%'-B#wvB@]       4 ddGe       999991/<2<2990KSX9Y"!!!!!!#7376633#"%9Zۮɮۮ-'P+CB:-cNɝ1B@M    4 ddG e      99991/<22990KSX9Y"3#!#737663!!#"d+ۮ-'B:cNɝ311;{@J   4;;  9      999912<220KSXY"!!!!!!!7!!7!yLN-ZL+JJ+LZ-J}+}-/@4I910KSXY"!!NHo4@4I10KSX9Y"!#:6׬oo `@0     4 I   91<20KSX99Y"!#!#93լ+:3լo $0<HLp@?J%K+I"L 71= +"%>4C: L(I1KJ11F17@11.11(1/99991/<2229999904632#"&5%"32654&4632#"&%"32654&4632#"&%"32654&%wwwu2IH33JJxvvw4GH33JKޥxwvw3HH33JK'!xwxwK24KK42IxwxG45LM41J+xwxH35LM41J^\rk'$3uk'(Xuwk'$3uk'(Xuk'(Xuk',/uk',/uk',/uk',/u=k'23u=k'23u=k'23u-k'89u-k'89u-k'89u7` j@"4ded   991/20KSXY"KTKT[KT[K T[X  @878Y!!!7!!5Dl++m`PFf6@ 991290K TKT[X@878Y3#'#󷰘fyh9@     99991999999990K TK T[X@878YK TX@878Y@'           ]'&'&#"#>3232673#"&1*"4 _"=.3$&4 }e#AT%!E<$'C>XB19910K TK T[X@878Y!!w%`Fd@  1<990K TX@878YK TX@878Y@  ]332673#"&5XLQuƘF =HMER;189910K TX@878Y@ //??]!!/1 :@ 2 210K TK T[X@878Y4632#"&732654&#"ϦwvvwM76MN57Mvvvv7LM66MMo{%@    291/90!#"&'732654&'3$$4f0+R#DI0\,cv 62E7ufi@ 1<20K TKT[X@878Y@/,,,,&87663146LLJJBB]!#3#fxo#@   2 91/90!33267#"&546K04*%P-1\+ctNPJ!) MB<f6@ 991<90K TKT[X@878Y#373F򶮙x! d@8   4  V9   .9991/90KSXY"3'%!7!P`s+'_s^\w3c#%@J 4dGd  99991/990KSX9Y"KTKT[K T[X@878Y3!!"&5467'!7!%=N-Ω 5Zb+V^"gEl -%pF,Ò:ˊk'6 /uZf'V k'= /u1f']@ <210##  "}@F!" 4<V9V #" #99991/220KSX99Y"! #!#733#3267654&#;%hH^/f?-N`p+4A}WqE\PFrXXj%~R)@G!"! %&'&$#$''&4)('$#"!%< <E%G*() "#'%$! ) *999999199990KSX9Y"&&#"32654&!"&532&&''%'!%F&R,dT~8Eupephwba۽j|B H 10!!BKwXs 0@   <291<290 '7XJJGJHJHH! S@+334       99120KSXY"37733!;jŇo-+)NL@&4 3999999190KSXY"!!76754&#"76632h3[HC?MLIfD-%A[-1$#lc/(K@+ # )  &33)999190#732654&#"76632#"&'732654&omX^PF0PIBypScKE>O`oW73(.fYZo cJQF-5w{''  V{'' V/w''  Vfk'* /uXF'Jk', /uo'6ZoF{'Vk'&uf'FV4k'& uf'FVBs'@h'&% #"$      4 "  <"<E[G %      (999991/<2990KSX9999Y"!7!7!3#!7#"&5476632"3254&VB%/%%B_>8EupoSIrZTtt`cܾkqephw9910!!+u8-/@4I910KSXY"!!NH,v@@#$u& uUCJ UC JB E*-,&+*'## %+#-999999999122<290632&&#"!!!!3267#"55#73667#7]VPI@8Oi9RZRhMs?LUTT$$KMg|>Z$$ +K!;\@99991<20KTX@878Y@////????]]3#%3#P/15Ds10K TX@878YK TX@878YKTX@878Y@++//]]!#+s`@  99991<<99990K TX@878YK TX@878YKTX@878Y@%         ]'.#"#>3232673#"&1!#5 `%A#5%'4 ^%@!% @8) =:Xy} !@ <<[E 104&#"32!2!"&R]U{aSyM mvjy6BpX910#ɏX?@ 991<90!#'#L\s@ 991290!373/wo@ 9910'T%#%vu _@3 3  3 334      991<290KSXY"333##7!7Reml#${)N@  1290332673#"&5 ROGj(Ɠ<7=6}H9910!!w/  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~hR'!RqyB\Z+`m?71XXX#/fP==-)qTj9s//BL;R;XDZjZ1X=-//////LLLL;XXXXXjjjjhhf9Njs XXXHZZRX1 XNR=Bu1=BB1===---PyRu%Z1RBw!/fZB5sXX/H#  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6469c6471c6473c6478c6479c6476c6477""""ktGq_Ty ;  Z ^  Q h?#C7Av*?f(@F29u   !!!""#=##$$$+$8$E$R$_$l$y$$$$$$$$$$%%%"%/%<%I%V%c%p%}%%%&&&''(,()***o**++,,r,,--t-.Z.../M/00q1z12t223 344A4{45555+5856s6667G7v7778 8818889t9:N:t::;;;;;;;;<<<<)<69>m>>??i??@@@ @A@ABAOA\ABKBaBBC/CCCCCCCCDDDD,D9DDEEEF%FFFGG8GSGGGNH@mj^sGBGSf    JBits! mB`#cVeraSansMonoBdOb6628J00@             9_<=–jsmloganalyzer-4.1.5/src/BitstreamVeraFonts/VeraMoBd.ttf000066400000000000000000001376341277740250400226250ustar00rootroot00000000000000OS/2sVPCLTc6cmapXcvt IDfpgmw%gaspX glyfuÒ&vhdmx32`Hheadjd6hhea "\$hmtx ϜT4locaە maxp< name) postnprepLQ3 ::S:: Wc0y   } t  0   N :  :   V 4 n `   0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans Mono BoldRelease 1.10BitstreamVeraSansMono-BoldCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans Mono BoldRelease 1.10BitstreamVeraSansMono-BoldCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com3#N\{#'##\ #\\w#3b##\b b b%%1/#/ 9bRsq#oVd\Hf```{\{`o7L'5%={D=!/s@tGG22dk  Y&Y@&2G@AGA2k2%e}f2 ]%]@%e2d~}d|S{f{2zez2yxfxdwvts s rq.rq.pfp}onmnml]mmli%l]l@kkji%ji@%hfhdgfgdfefedcba}`^d\[\[Z2Y-YXWWV2UTS TS RQRQPQPONMdNMdLKJIJIHGF}EDE}DCA?2>=<=<; <; :9:98 998 8@76776-6545K4343212d1-10/@0D/.-.-,--@@ ,+,,@ +*++@ * **@W)K('K&$&$%$%K$$#""2! 4!>  42@ @@ @WK77222X}X       @   @   @ @  d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-hh@ b/10!%!!hsr) @ d <2991/0!!!#  !#qe@ d1<20!!!++J@0g g    91/<<<<<<<2220333#3!####5!#5!#3_^aJ^^^^J^Jvuu%vD /P@+)%$(hh!/$, ( 0<21/<222906654&#&&'&&546753&&'?FE>??ˍWggU̹GP>[ٴ O=>O-C:9L-.+=BI' (0Ϭ ! '3V@-(  (kk kj.k%1"+1""499991/999904632#"&"32654&4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q%*8@Z)(*()(-,.+23456718%8+(%#1) #1p#popnr)($ +.#  .8 )$. 9999999991/99990KSX999Y"%#"5467&&54632&&#"6654&'3!32676767fKWꍋ20ID@APR=D9DI"BCr;H23ёXN<$%86$~f &b993V+wIz  d10!+ @ut  29910#&547䟚@=5R @ut  299103#6545䞛䄀=?y9TJ@(   n   <2<2991<22990%#'%%73%TJLLLLKLXXB\ #@ v    <<1<<0!!#!5!RPRPjo@ w 10!#9co-10!!-wow 1/0!!MoqB`@ d103#m{V #$@ x! xn!r$  $10@////////// / / ?????????? ? ? OOKKKKK K O TTTPPPTT T ddd```dd d    T////////// / /   $]]4632#"&"326&32#"H45HH54H|f^^fg^^5HH54HGB~{|~o $@xxdx  1/20!%!!!J5JML J/s'[@/% zy xnx    991/990KSX9Y"!!5776654&#"6632uL=KByoOkk^;H5/FVAdm?<')ݿX^D}L(G@)p zy#p z y pnr) &  )9190#32654&#"6632!"&'32654&%nyynTgg\qd^xxWOS]*( !εǢ&$/1o^s}fu B@   % xd   <291/<290KSXY"!!3#!!y5jBF<@!xzyx xd r  190!!6632!"&'32654&#"+$R.`fSXOQ  ))u''b $5@{{ z y{"nr%   %190"32654&&&#"6632# !2`ee``gg#OC/c..F싄--AAn75@%xd 991/0KSXY"!!!P #/D@% {'{-{nr'0 $*  ! 0991990"32654&%&&54632#"&54632654&#"hczzcc{zqvto|eWXeeXVf}gg~eg}}'yغx(&ĉ׊TXggXWefoN$7@{ zy{ {nr% " %19073267#"&543 !"&2654&#"OC/dF7_ee_`gg .,AAi}}'@ ww <21/0!!!!MM's' "@ww   <210!#!!MNMoXmy@29190 5y!X'y@vv<210!!!!X!!Xmy@<919055X!`a)$q@8   %$  fhn !  %<2999991/9990KSX99Y"!!!546776654&#"6632  >PZ?-\\T`beD^XD&cNY=P+CDGF 89L\VBT= s 4]@1(+$ 4| | }'$|+}|+15'(   ! .529919999904&#"326#5#"&5463254&#"3267# !2fYYeeYYf&gHȥGl"0PE\Qm`v4!qqrR511/)//77! @;      %h~d     91/<90KSXY"K TK T[X  @878Y@,0000 5::5s|]]!!!!!hi\uZq+q} >@$h hdh   !2991/9032654&#32654&#%!2!!čqvp_anF`wyjFP\\S뽼 İ9.@op op nr! 210%# !2&&#"32679FU>.UDLLLL+$$xy$$FAAFu(@p dp !  "99991/0326&#! !!P<nB? tsJ *@ppd p#  2<1/0!!!!!!!J^?{yX %@ppd# 21/0!!!!!XBuujS@!ppopnr%! 1990@]]#5!# !2.#"326hUu?-ZL>`.DTIKsy30PQH &@pd  " 221/<20!!!!!!'q'9+h% #@pd p 221/220!!!!!y))3m.@ opp dr  199073265!!!"&mVctl_JVX\t 4u a@3  %d   291/<290KSXY"!!!!u'N)Nw@ pd1/03!!'w/V{ @,  % d   % % 91/<290KSXY" ]@R )=??   & )/708?    ]]!!###V`bq+sTwX S@%d&& 991/<2990KSXY"]@  ]]!!!!w=^=+=\u #@ppnr !! '10"326&! ! hqhhqrhh    xx{,@pp d !  299991/032654&#%! !#!yuu`5nJbyyb\u<@ pp n ! !'9919990# ! "326&   ~xqhhqrhh~xL  f@6  %p pd   !  "29991/<9990KSX9Y"!&'&##!! 32654&#',A/ Ok^ yihz A^y暶 i_mm^V'p@>'' '%' o!p o pnr('$ ($"(9999190KSX99Y"&&54$32&&#"!"&'32654&'ߞge_`krSohvlmxPLU/.CFVP>Q10Bڦ541TRcYCeZw@ pd1/20!!!!!jf*@  pr d  1299990!3265!! j'reer''ppR9s@%%d91/290KSXY"K TX@878Y@  ]]%!!!h)g)+ @@      % d   /91/<<90KSXY"]@6fe   )&ghj f g wzsx]]!3!! !kT;H+ @C    % d   91/<290KSXY"K TX  @878Y@  ]]) ! ! !V11X%!S@(%d 9991/290KSXY"!!!>"#>3XwLs 8@%pdp 991/0KSXY"!!!5!Lw#$@ut10!#3!ZoB`@ d9910#Nm/+ @ut9910!53#5+޾9@ d91290##--/10!5/۾f.10K TKT[X@878Y #fx^T{ %@/   ggh g#r #  .)&22991/99990@-400 4!urr  ]"326=%!5#"&546!354&#"5>3 ZMt#5d gdikapTfLZq}JPʵĻ1GI5:(&w 6@  h hrt2 0221/9904&#"3266632#"&'!!Rl__nn__lh6Ze.$-6]]ba%}.@yh yh r 75210%# !2&&#"3267%Jb&ZS@RUB9++89*,7;9:Z;6@hhrt2 )221/990!!5#"3232654&#"$/eZl__nn__lSab40]\}{L@#   hy h r .)190@ ]%# 32!3267.#"Nfv ekspex 7**->w:?itw{q;4@ t  <<2991/22990!!!!5!54633#"XB/bNʜ0bXH} (I@(  &' hyhh#')& 2 ))221999904&#"326!"&'32655#"325!#r]\qq\]r%\]S[|v+f`+%B .,u|yPN, 8ZR/.@ h t 7  521/<99990!4&#"!!6632/ENPZ#j)yh}]f B@  s  <<1/20K TX@878Y!!!5!!!!Dlm%`XR O@  s  <2991990K TX@878Y%#!53265!5!5!!RbRN%+nTV @@! %t  .5 291/<90KSXY"!!!!%`cXd}^B `TZF %@t  991/990!5!33!"&NRbѶ`nR{"@'  h :=:=:#91/<<<299990K TK T[X###@878Y@7      /////////?? ? ? ? ?????]>32#4&#"#4&#"#3>32!fJo&22((22&nDDpGD}TV{1{VT}1`tBMQ/{0@  h 7  521/<99990!4&#"!!6632/ENO[#j)zi~`]fbo{ #@hhr . )10"32654&32#"hixxijxx==Vw{9@hhr 20221990%!!6632#"&4&#"326$.eZbl__nn__l ab]񢸸ZV;{ 5@ h hr 2)22199032654&#"#"325!!l__nn__l6Ze/$1^]04ba#{)@ h  21/990&&#"!!66320M]&%+w&ln``i+{'@=    %  yhyh%r( >7"5(99991990KSX99Y"(!]@+ $)) ) ) ) ) ),//,))))) (!$'].#"#"&'32654&/.54632QXbd Tema^gjKQ_=4598P2&##7:<98<"&o1N@  <<2991/<2990K TK T[X@878Y!!;#"&5!5!IUKA>%`0@  hr   7521/299990!3265!!5#"&%DOOY%iTyh~]fP`i@%%1/91/290KSXY"X]@U  ZUUY]] !!)``j` @@      %    /91/<<90KSXY"h ]@@     )&') 96k c wxuy   ]]333! !ywꈇ`5ZF7` @B    %  1/ 91/<290KSXY" ]@    96]] ! ! !yV`yHN;X`w@A     %    1 /9129990KSX9Y"##532677!!;vwZT+V44y=o<A)9` 8@%6/ 2991/0KSXY"!!!5!MiN``$^@0 %   !  t% $  %<<29999999199999990#"&554&##5326554633#"3k>>k{hFb~~bFhחsrݓTѥ͐Ut10#!$`@1%   #t%# %<2<999999919999999032655467&&554&##53233#"##yhHb}~aGiym>>mVͤэVחstݔXy++@  19990#"'&'&&#"56632326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7=!k'$u!m!@M ! !%h  i ~!   "999991/<9990KSXY"]@\ !000 0!o  !!' )!;44 ;!t |! ! !]] !!!.54632%32654&#"!/\uZ,*uv*N57MN65Nsq%a=uu>_6MM66MMAo9'&uJk'(uwXm'1u\uk'2ujfk'8u^Tf'D^Tf'DC^Tf'D^T1'D^T9'D^T'Do%}'FH\}f'H'\}f'HC'\}f'H'\}1'H'f'f'Cf'1'/9'Qbo0@ hhr .)10!#"32654&32#"œixxijxx==bo0@ hhr .)10#"32654&32#"ixxijxx+t==bo8@ hhr . )912903#'#"32654&32#"ƲxixxijxxՓ==bo7@hhr . ) 12203#%3#"32654&32#"-Pixxijxxj==bo".:h@:    )h8#h2 28r;&,5.&/ /);99991999990'&'&#"#54632326553#"&"32654&32#"j7 +"'lY$G*>%$'kX#A4ixxijxx3%@9!q+>: s|==%f'X%f'XC%f'X%1'X;3 $@f d ?  <<1<20!!!!!5!LK}8V@ n@@102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHd !F@& yh yh r" -/"<<<2212<220&&'667#&5473 8x?@w84xC=ur{~5*1L0+" :9!wb>@  zyhn x <<1/222990&&#"!!!!3#535632N9EjcPS)+N=% >y@C/0*1 06 'f&*f# f f^ C:HX D0M~JIebf}N 4L\@3-*+'0!52+A M*',$0-!1E3+E$CGB3C;B/29991<99902#"&'&&546766#32654&'2#'&&'##%"32676654&'&&hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIG}N1ID@%  >2>&JDB C8B ,/210&&#"3267#"&546322#"&'&&546766"32676654&'&&P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIGf A@$   d F F FFF/91<<2<<9073#######5dYЙkKuTKBC f.10KTK T[X@878Y!#f-;1I@ 1<20K TX@878YK TX@878Y3#%3#u1N >@"   v v  <291<2<2.990!3!!!'7#5!7!NŮmA1}c@3  %p hpdp~  % /<291/<20KSXY"!!!!!!#36Vfnj{ )s@> )*  '$ ($p$ pn$r*(! '!)!!!'*.99999991999999903264&'&&#"&&5!27!"&''U8rh9N4pi## g=q''j@xb9= >5 33X>=s^xCBr  /7@$ '! -0 $GG*099991<2<299032654&#"&&#"3266632#"&'#"&546320P2;JC88b6J0"#>VddVX𻗽JT` G@'  hr !    75!29912<<990!3265!3267#"&'#"&'RRQP!+J#H[%nF;ST XrsrsG> KSNP/0DF)8@'! '!* $$*99919906654&#"#"&54632#"&54324&#"32?3-,:*:}fMHeLJdcBds<+@lFWt|uy LP *@     <919905!!!!5my=/9) ӇL9@__120!!!9_^-L<@    LKJKJH1/2299990#3267#"&'&&55!!#51F",c7OrL? " VX#o{H)*@$ *'! `a!`*91026732#"&'&'&#"#"&54632mfbwL=.> b )'8yaxMB3F KbPJ?(: %)d@4 $#(&$& n*&(' #*229991999905#"326#"&5463354&#"56632#!!fmd=6Vn2yN[[R@ILP4818g96u11!"@w0@ n  9910!!4632#"&"32654&%PŦçkIUUIIUUV޾~mm}}mm~ZwF@$    OON N 9991/<299073&5323!6654&#"!Zxllx)QNpgfqPR'm8nȿm O֦M{ A@K. 4, ;5#A  ggy 451g8g,>8& rB#;-, 4T)-RB<999912222999990@'33040536G3G4G5G6YYYYW3W6 A]5#"326554&#"!3267#"&'#"&546;54&#"5>32>32IWY@=?=2??2=d_A=B +s@>+,  )*&h&h&r,+,* # )#.),9999999919999999032654&&&#"&&5327#"&''?B&hxJZ>'jy--UC./SCc:"4Im=+-yLk--w%x@<   %%  fhrd&# !  &<<99999919990KSX99Y"!!!3267#"&546776654765  >PZ=-\\SabeD^XB&ocMY;Q,CDGF89L\V@T? @ d <2991/0!!!3 !#+eXjy@ v 10!#!X!,1 ,@     9190'%3##q@`44{$ V#@I   %   yhyh!n$  $912299990KSX99Y"&&#"!!#"&'53267#5!6632)R%^g^ʠ>s7+P'_iP'ˠ@!p  pdp %  <99991/220! !!!!!"33C=.{\[|478nͲɮ{ )5o@1("!% !gy3g -%g r6*0T!*R(6<9912<22999990@ !"()]!3267#"&'#"32>32'54&#"4&#"326>c_>2:MN;;NM:ߐ;:,*JJMG8;;B%$'g^$BT%>;+?:-X@10K TX@878YK TX@878Y!!-wF `@  ]]1<0K TX@878YK TX@878Y@]332673#"& dSSc FEKJF;1M10K TX@878YK TK T[X@878Y00]!!1L R@ ] ]10K TK T[X@878YK TX@878Y4632#"&732654&#"LvwwvM67MN66Mvvvv7LM66MMoo3!@   ]1/90!#"&'532654&'97{0e5-T$:A*.>j/_[ .(R<)=fI@991<20K TKT[X@878Y55]3#3#Vfxoj@  ] 1/90!33267#"&546-5%=2&M(6_)r|7GF'1 \V5mf5@ 91<90K TKT[X@878Y 373Dzx 7@  pd    <2.9991/903'%!%!q'p}wo™%\D@%  t  <<99991/99905'!5!%33!"&duK'grSbѶӦâѠnVk'6u+f'Vsk'=u9f']@ <210##  u 9@hp dp  ! "/<29991/2203#326&#! !!#53P<nBĉr tsbf(@N (((#$%$"!"%%$%('%"! #&#h hr#t)'& !#(%" .))999919990KSX9Y"&&#"32654&#"432''%'!%+1b0izwhms udV(?7%\)B}-b2 wumt{uk'<u;Xf'\{0@hh d !  2299991/032654&#!3 !#!ytu`'n5nIbxydVw9@hhrt 20221990%!!6632#"&4&#"326$.eZbl__nn__lab]񢸸B v10!!BKwXs 0@   <291<290 '7XJJGJHJHH9 )@   ^ 12035733!9x-+)N2@ ^9190!!56754&#"56632f3Z:WK8MKB6-+KO4<#"}o~*(D@& #  )^&^ )9190#532654&#"56632#"&'532654&FooJUOFEDECibouKJCPU_b2,-3teI^p\y@8=D/w{''  V/w{'' V/w''  Vujk'* ubXHF'J%k', uoV'6o+{'VAk'&upf'Ffjk'&uGf'FfZ$F@&"   "hhrt   2)%<<1/<2990!5!5!3#!5#"3232654&#"2$/eZl__nn__l"ttab40]-10!!-ww 10!!M51@9&(  ox#o xn#r/21('/),&, 0',2229999999999122<20@]]632.#"!!!#3267#"'#73.5467#7,$SDJMkT?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~h!%5yBj-q{s}fosXXX!}umuVw\\Zj9so/9^Z\bZRbZ#oP7;X!!w\j^^^^^^\\\\bbbbbwF-N XXXHZX1 Xw9!!\DBu;qZ  j!!\\\jjj -Lo)%sb;Bw9///ubZ-- /#   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      sfthyphenperiodcenteredEuroc6459c6460c6461c6468c6470c6472c6477c6478c6475c6476""""Ik>e|He{yeJx7Ya \ 0 ^  = t S  h EecNr e][ GV-g-&BO #0=JWdq~ g ^J2 ( !?!""8"o"# ##$$$R$$%<%%%&5&&'A'(P()M)t))*<**+.+f+++++, ,,,,--9-V-----.^.}../0/q///00000000001111(151B1g12+2Y223&3W3334(4s44444555556D6Z6677_7p777777777788d8z899I9t::::}::;1;Y;o ME@m GBGSf   JBits mB`#cVeraSansMonoBd6628B00@             X-_<#–Umloganalyzer-4.1.5/src/BitstreamVeraFonts/VeraMoIt.ttf000066400000000000000000001523541277740250400226500ustar00rootroot00000000000000OS/2ZVPCLTp(6cmapLXcvt &$fpgm%gaspԨ glyf4&\hdmx32``HheadٮԴ6hhea fF$hmtx 4locapmaxp name@Z postn]prep8 ::S : : Zf0    t  0 "  T @ " @ "  b : z ` .  0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans Mono ObliqueRelease 1.10BitstreamVeraSansMono-ObliqueCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans Mono ObliqueRelease 1.10BitstreamVeraSansMono-ObliqueCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com##X!#/{{RfoZ!7={fs +bb#3N{T\q#w!`j#fy```{w`{{RNNfffHF?{L'5oojo{-{{=foD7f}s@֚ԴG}%2і}2»}Y&Y@&//2G@GddkY }:Y :  V f   XA W%d]%]@%XA~XA~}|d{dzy@}xwvutst2srqpq(ponmlkldkjkji hgf f f@ed.ed.cXAcbY ba`a`_]``_[%_]_@^]\[%\[%ZY ZY XW%XAWVW%VUTSRSRQPONBNSMLxKJ}KJ}IHGDCB2A@BAF@?-@B?>@?->=<;:9S:98(9S8(76543210/+ /.d-,+ ,+ *)('-'&%%2$#"!-!1 d 2 @:%%:B-B   :    @$--:-  d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-hh@ O/10!%!!hsr)s` Y@.   :TSQ 991/0KSX9Y"3#3#ʁX2s2qeR@UQ1<20###Ѯ++P@5 X X    91/<2<<22<<220#333!!!!###!7!!7! Siih'T'hhii'T'haabbN; 0l@@()%/0%W$ZXWZX!0 !()/ %$, 19991/29999902654&'#&&'7&&54$773&&'##uV^PwTe;__#QhZ 0d/UH AYQ LEtNUcEJ-.+J zk{;_hǼA|9#*zLq,_AGB͋fqGG֯!g4l7&&s^/Iuw96Q10#+u @hg   99910#&5;32267654&#"P77ON87PsTTߔürUUݓþP/E]bkP0F\g7PP78NOEEg`f__{ T@* :ccQc   99991/20KSX2Y"7!7%3!!9#`5!ɪuLJժf^@1: q cac99991/29990KSX9Y"%!!7754&#"76632  n!7'r\~)paGR!#]jCD12›`g*N(J@+c W q cW qc#ae) )  & )99190!"&'732654&##732654&#"76632rl^&[b {Rq%{Tس~%%45uy|d_((!? s@>      : cQ     991/<290KSXY"!33##!7JٜFE$3dT j@8  : cWbccQe!   !999190KSX9Y"!!6632#"&'732654&#"`!H/Y,i`XlH)T^OKժ|VPP!32ꮀ(&\h *;@ ccr W bc(ae+ "+9104&#"32&&#"6632#"&5476$32\tkzk $:K7DqPDNzNDb1KRqzy '%'fiǸwSa`צf5@:cQ91/0KSXY"!#! <^+)f #/?@" c* c$cae*t0 '-!09919904&#"326&&5432#"&546"32654&5vpykl(ֲ ~uf{xtŚi~&i)̳`|cr}[l?L *3@cr c( ca(e+"+91032654&#"732#"&54676632#"&Jtkxk#:K7DqPCNzNDbKqzzٺ%'fiȹvS`a֦X#%O@):nun91/0KSXY"3#3#'54&#"3267# 476$32}eX{c3QT_TX9xC-BS|n& Ә`nїap}o?D9H=+#4~}՝{=ѰM/ v@B      :cyQ    91/<90KSXY"!3#!##-+{ u@@       :c cQc z   !9991/90KSX99Y"32654&#32654&#%!2!!mkÈ{Xo}bи}<ݮkff>^T|s2@|{c|{c ae  99910%#"5476$32&&#"3267T[rkPK)@P_GhUX5)) |*(?>QS{@=j P@(   : c Qc   99991/0KSX99Y"%267654&## !!DD6ErgTGh#}s?w/5 X@0    :ccQcz   991/0KSXY"!!!!!!Xu!TV rh!wժF\ S@,    :ccQz  991/0KSXY"!!!!#o!\Vd ժH7N)a@3&))#$"%):%&"&c("c|{cae*('&%)*9991990KSX9Y"%#"54676676$32&&#"3267#7!Wu! #^8kPM)AQbD,N"#Dl%L`>? ZouC|*(?>SQ4arQ%# {@B     :czQ   9991/<20KSXY"3!3#!#v)vʋՉd+99 ?@"  : cQc   91/220KSXY"!!!!7!!Z>!:!!9ժNU@.  : {cc Qe  991990KSX9Y"'73267!7!#"&-Hg(!H8a=OSD.J j@;      :}   991/<290KSXY"33##ApyN 8@:cQ9991/0KSXY"3!!q!eժ  @D     : }   99991/<290KSXY"]@&  ]]!!# ## nݺNs +/ @<  :}  9991/<2990KSXY"]@  )]!3!#3+3R)!@c c'ae**10%267654&#"#"&4676676632U/J\inU/L\i-+C'Xڑ++C'XڑÇf_f_hun\;yo\;y3h@6    :cc Q   99991/0KSX999Y"32654&#%!2!##m|mu/ϿlgR-3@c%c ae.+"+.991990#"&4676676632267654&#" ++C'Xڑ@%6OU/J\inU/L\io\;ySotC_!\f_f_h @R       :c c Q      9999991/<9990KSX999Y"#&&###!232654&#HW6yj,mn{!)fۣ~jhybճWpi{'@:    : |qc|qc%ae(  "(9999190KSX99Y"8]@<'''))))777  (((%%%%88VVVV]].#"!"&'732654&/.54!2{'Q]byhd)bpXeJ P;<GX('2--EBRZ)!:y(5@@:cQ99991/20KSXY"!!#!t!++ժ+P~@K   : ceQ991290KSX99Y"332676673#"&546s˳mnY|--˲*_NGj=h ;\\9>h?8;%~+J@':}91/290KSXY"%3!3V1ƾ+R` @J        : }    91/<<90KSXY" ]@\  ;u      )%& 86736 FFCE ZVTU kfch e zvvy u   %]]333##ZIyF +f9 ~@H      : }    91/<290KSXY"33##D1dDf@5:} 9991/290KSXY"33#σub 9@:cQc   91/0KSXY"!!!7!1-" )՚oG@":~~g9910KSXY"!#3!mVdB0@:Q910KSXY"#3ժǪC@ :~~g9910KSXY"!73#7X+ޏH@ Q91290##Ȳu-m/10!5mPPPf2@ 910K TKT[X@878Y#ŏfxH?{ .@a! "   : %  &W%")e,% &,/99991/99990KSX99999Y"']@65$0%0&5'  ' ]]"326?#7#"&54$!37>54&#"7>32wt+DRgX&} Hn5 ~uVo#lY 3{IScԹ)L^e= U[33'' h;T%@L$#  $#"$# !#$#$#%$$#:! e$""#%!#$ $#&999991/990KSX9999Y"%2676654&#"6632#"&'#3T.19eeS30:k>fRHL|b"/ZV^l\XVo{RTVϺlsVTq{4@WZWZ e   99910%#"&5476632&&#"3267IZk[]߅YO%BUn<8?`S3')ܕbcb++:6YYRh>?w%@L  $%#: # e# &999991/990KSX9999Y""32676654&3#7#"&5476632X.16feU018msѸAdPEK|aWWZsZXWrxCTVҼ!lvxWbf} &\@" W&Y#  e'  &  '999910@h hooooo ooooo ]]>54&#"#"&547>32!3267t{,uigxjSm Xr#x++֜,mVZ"eN 498j@9     :       999991/22990KSXY"#"!!#!7!7663_`)&Sec/яN;Hy{.@[ ... ..-.)*+(,..: , W  ) -/-,. .#/999199990KSX99999Y"%2676654&#"#"&'732677#"&547663273O.17pdr5RK%IP%:nPHJoe"ZTZjwwI,.uW[׸jp|aUTH@R    :   99991/<990KSX999Y"#67654&#"#366323]W!{/tKb J G'QWab ^= h@7   :      99991/20KSXY"!!!7!!3#f׾mnm-`/BCV r@@  :     91990KSX9Y"!7!##73263#)ʵ_nJ-wZ {@:!!     :   991/<90KSXY"w]v}p]]33 ##%uͨXZFF?7]@/:    99999991/990KSX9Y"33#"&5467!7!XY[ϭ #6IHP.{+@e    $%"%#""%:!  &$ )$" $"%  &!"% # %" ,.999999999991/<<<299990KSX99Y"K TX,,,@878Y>32#>54&#"#>54&#"#3>32'}MVg}.3KT+}}/1JQ-}٨,o@K\DIm\6kw\u?8aq=:w``3B5ovD/`>}m`@Q     :  e   99991/2990KSX999Y"332673#7#"&546]U!{ڸ!Ii J%DOUyba~']`J@'!!!!:91/290KSXY"33#`D\#` @J      !!! ! :     91/<<90KSXY" ]@f   * J       *$ :4 GCD ZZ T kfh c yxy u   !]]333##\ 1j<צ`wBo` ~@H!! ! !  !  !!!:    91/<290KSXY" ##3>_4q`DT uV`~@F!  !!!!!:     99129990KSX9Y"##73267733>g6:`lQu<+ٷhkILJ]qTN^Nm` 7@!!:  91/0KSXY"!!!7!?.!u!`ۓ%4@f -.-..-    : 5'- )'.)~)~'~g5)(54.  $-5999199999990KSX9999Y"#"33#"&5467767654&##732677667663N^3!xoIP/VaNH- bq>=~2H6/OgK@&!3?9m{D% 2-UKn{'"10#4@e -.-..-    :-5)  )'.)~'~)~g54.  5)('*(5.99199999990KSX9999Y"732677667&&546776654&##73233#"#N^3!xpJP/UbMJ- bp>= /H6/OfLA&"3@9l{ D% 1-VJn|'"Xy &@ ll 1<2990#"'&'&&#"56632326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=LN'$3um !@Q   !! !!  !:  c  [ y   " ""!"99991/<9990KSXY"4&#"326!&&54632#!#Y?@WW@?Y33srPF#Z?YWA?XX`#kErrQ {su'&h5k'(`u^'1/uRN'2+uPN'87uHjf'DH?f'DCH?f'DH?'DHZ7'DH?N'Duq{'Fwbff'Hbff'HCbff'Hbf'H=If'=f'C=f'='TV7'Quff'RuZf'RCuZf'RuZ'RuZ7'R}mf'X}mf'XC}mf'X}m'X;o \@0: Q   99991<20KSXY"3!!#!7!Roٮo\]+u @ a#$# 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOp{?$V@3WY WY  e %  "" %912<990&&'667#&&5476673? 1{HAK!K?7f7̢FV8f7<}u5&,-(!úD`16"+`႙@F  :  Wqa c  9991/2<2990KSX9Y"&&#"!!!!73#737$32%6y?&+rZ 3!Z/3<+-ُ/яd7-4Bv@E$%B<;5& %, XX2aC$%5 "<%&,/B;"%/"%8%/?%)C9999919990&&#"#"&'732654/&&5467&&546326654&''-!G:gV|Ur))FS!J=p J}Pv)%GTXkPRVU~&(bHOZ ;VuEe5#Z7$'^Nb| 3UoI`?%P53o75p^34p73`S?!   & 104632#"&?}|}||{|};u g@0  :Q  99991290KSX9Y"!###&&54/эZfN7f5@[#$# $$#45512035:3*$ #0W0e445$'# 35'*-  '' '-56999999991/990KSX999Y"6632#"&'732654&''&&54676654&#"#*˰ )<3sQGA;G6U=Z8˲h\yۻqϠ!F$`&=,'UW !}l4R?/D\?$OY}N4L@I  . . :   A)5)M  -- ,G(#);(#*//29999129990KSX9Y"2#'&&####32654&2#"&'&&546766"32676654&'&&XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ}N1ID@'  &>>2J- /,(8 (8*D/210&&#"3267#"&54632'"32676654&'&&'2#"&'&&546766`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZfh@6    :   Q  1 1010/91<<2<<90KSXY"###5!3###r}r7q^^-B?ff/10K TKT[X@878Y3#ufF-n@99991<20@@@@@PPPP]K TX@878YK TX@878Y3#%3#''X%y<@ l  l  <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬo@P   :c ccQcz  91/<20KSXY"!!!!!!#!!V3!jd!K\5ժFժ 8o@;)9$863 '$*73(c$c3a$e9)9(*-7  '-6 8 -999999999199999990%3267654&'&&#"#"&''7&&54766327B^Bp=26yf[8q<2:$iSXQ6^cwhTXM6Td,2'{#)u'+l <[Z..@:V++}@) /7@$ '! -0 $22*099991<2<299032654&#"&&#"32676632#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥sXy.@ l l   <2<21/<<07!!!!#!5!X!dCDLIVw? (@l  <2291/905!5w!!LK Xy? (@l  <<291/90%%5!!X#!!V/@]  :    Q    9991/2<2<290KSXY"!#!7!7'!73333!! wbbs7ln   o#o1ho#V`&@\   &#$"% :%   c"e '&'  %'99912<99999990KSX999Y"3326733267#"&5#"&''-mf! (J!CO5b\| mV H6[a  UIRLSS-)6@'! '!* $$*99919906654&#"#"&54632#"&54324&#"32JIH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{L= -@     <91990!!55!!LR%# Չ\P_L9@ LL120!#!L^PL?@!   544391/2299990!#3267#"&5!##P117,#J%q\TL@H? HL%&@  & MNM&1026732#"&'&&#"#"&54632j Pd@7*9  kOeD=!0 l9TA6?&#Hn!bSA8?T  +/o@?  .,#", &a0 .- )/,0 #"6)6099999919990"326?#7#"&5463347654&#"76632!!ٔI@#<<=: ;=:7 991/<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI L{ OP@'O'OO'  ';:987<6'5':+ $!F@6?$O4%W$!(@W?<IC.(ePOL?965F$%+4@L'1P999999912<2<29999990KSX9999Y"@`>#>$>%0?0@Z#Z$Z%Z&ooollloooooj#j$j%j2o3o4o5oNoO{#{${%{&#$%&%9#9$9%2?2@I#I$I%I&j3 ]]7#"3267>54&#"!3267#"&'#"&546;7>54&#"7>32>321}i##N;Ze=D;SjaUF5";Hj/]uUM1L#O8Rv2PyH'!b3C'\/ '1m@:'2"1( +%&""+"e2'2& 1(.%.  . 299999999199999990324&&&54766327#"&''&&#"N4PKQߓNx.p]{ RJOJ{3w\%I49W.`0Pnwu$$M2Tmvv%%L'!@J !!!:S WY ce Q"  ! ! "99919990KSX9Y"33267#"&54677667#73PojUGodOj%lebhT=1D]]YHo8JRGB98~^lVFfVs ^@/ :SQ 99991/0KSX9Y"#73#3B1ˁX1+eXsy^@ l10!#!X!^?; /@     99190'%3##d)#Ӕ/}b%9V#@NAA  A A:   XX!$  /912299990KSX99Y"&&#"!!#"&'53267#5!6632$R,fs-/d+Ǻ9f.1d0`yu1Ɣ1c|ɏ!JX1y7K@&' 10+5  ll* l5'l.810*8<2991<2<<99990#"'&'&&#"56632326#"'&'&&#"566323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=O@*BBBB:91/90KSXY"#3 !qJR# 3@  u  CC 991<299077R+#}R+#}#RRRZ# 3@  u   CC991<299077777R+^#T+^# ^R^ ^R)/ w@<    :n    999991/<<220KSXY"3#3#3#<o;;///k'$3u^'$3uR^'2+u#H"b@7!"!"!"!""!:c c Q c"!    #91/220KSXY"%!"&5476$3!!!!"33P!B5VR!WH!k!v/1}{>᪪ђlêFlm7~j=xz{,8P@\-'@?6758'@@?  '@? '?@?:8/-59 - E5- W 5*eQB8/.- N N2'N'!Q9999912<99999990KSX99Y"o.]@oo o o jjo-i/o8 ]>32!3267#"&'#"&5467>7>32!7>54&#"267>7>54&#":Pz aUF6#;G_":Q;'8uP|4IB=Sk7<`(HCA_(J?@+TZ[nNX:2)+E@AD6NyGfkDVL8GNGB,jl MTEF5`V$QWy@ 9910!!/yy@ 9910!!/y e@3     :o g     991<20KSX99Y"#73#73& '~~y _@0     : og     91<20KSX99Y"3#%3#))9@:og910KSX9Y"#73)~5@:og10KSX9Y"3#)Xyo '@l D <<103#3#!!j!u#\u"@91990 h 9%-V'\DN'<9uB#@ :Q10KSXY"3TmLB /}@B (-  * -'! ) -0)$ !'$* EFE( $02299999999912299999999904&#"3267'#"&''7&&5467'76632d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_5m#@uC91907m+!{#R=s#@uC9190%77=+_# ^Rb@`   :        2999991/<2<2990KSX9Y"3#'#"!#!##737663/-J__۸%&Sec/яNb@K   :     99991/<22990KSX9Y"!#!"!!##73766Ѹ__)پ&{Sec/яN;;o@L       :   Q   999122220KSXY"%!#!7!!7!3!!!RPojoRRohn\\/`/@:n910KSXY"3#;`/5@:on10KSX9Y"3#)// _@0     : on     91<20KSX99Y"3#%3#''/'3?Km@<%1= 1%+\C7IF:4(:"FG4"@ "G""".G"@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy3m'$3u5m'(`uEk'$3u5N'(`u5k'(`u9k',9u9m',9u9N',9u9k',9uRk'2+uRm'2+uRk'2+uPk'87uPm'87uPk'87u=` C@":   991/20KSXY"!!!7!!f׾mnm`/BfR@91290K TKT[X@878YK TX@878Y3#'#͓ufV7@!   91<99990K TK T[X@878Y@=     ]K TK T[X@878Y@           ]'.#"#>3232673#"&/#*/}rY+D&/ )1}qY,B`1KN&/NMb+@ 9910!!V)JHn@ H H91<90K TX@878Y@   ]K TX@878Y332673#"&546xWUPjw HADJLvwDm;@ 9910K TX@878Y@ @@PP]3#))N h@ " I"10K TK T[K T[X@878YKTKT[KT[KT[X@878Y4&#"3267#"&54632X@@WW@@X{ssss;@XWA@WX?sstus&@    991/90!#"&'732654&'+%#w,^/(I CK@]$]m<6N6fe@ 1<20KTK T[X@878Y@)////2222BBBBVSUU]3#3#҇LfxuX"@    9991/90!33267#"&546w=@/-!B "G"alK:e&%& PG7xNf:@91<90K TKT[X@878Y#373wx e@8    : Qc     .99991/90KSXY"3%!!'%sr)Iqq dqJdϨ3hdXZ@K:   99991/990KSX9Y"33#"&5467'!7!%XY[ϭ ;Jss;JX%6IH#O(c$)b{m'69usNf'Vm'=9uNmf']@ <210##  jk@;  : cQc    99991/220KSXY"%267654&##!! !!#73DD6Er[ kgTGhщ{}s?+/ŕ{wj!0@L:! %%+ e1( .(!. ( 19999199990KSX9Y"#"&54676632&&''%'3%&&#"324&f{qKFMLGL0 5)h%P,sh/֗htx~io{&V:^\VȑX\ xA@eDk'<9uVf'\3 @I   :c cQ   999991/0KSX9999Y"#32!32654&#FH#3`i|m縘gbVh%@M%$#" ! :e&& &.9991990KSX9999Y"%#36632#"&72676654&#"%or=dOFKzdQ-18gfU018pRXлnvzTHYU\qZXXr{X-yl10!!X!ת;T .@     <91<2907^t^_t\t%\^u^uw^\ X@. JJ:  `     99120KSX2Y"37733!qu c)t'+n3j@5:  aK999999199990KSX99Y"!!?$54&#"76632!9J?3zST}5vrni3=%)o^(H@*  #a)   KK& )99190#"&'732654&##732654&#"76632HNЯB;Ch2pUYHHavVV*e<Gz7yr\ [Gy\NC@jP@33sd[Ot/m{''  V/y{'' V/m''  VNm'* 9u;HyH'J9P', 9uu{'6su5{'Vsk'&uf'FZsm'&uf'FZw-@|  "! #+,-+,-*: + "e+ %.999991/<2990KSX99999Y""32676654&!7!733##7#"&5476632X.16feU018m>IAdPEK|aWWZsZXWrx5yyTVҼ!lvxW/Z9910!!P !/`/@:n910KSXY"3#;`-|@C$%|{c!|{ c '+a!e.'.-,+($$ &,$.9999999991<22299032&&#"!!!!3267#"5#73667#7]LJH'FGG28 /LU'PV1 1!*(A3232673#"&"*&"6}#|U">##$(8 } ~\79 32mn 6.mn=Y910@//]]KTX@878YK TX@878Y#]@ 91<90@/// ]K TX@878YKTX@878Y3#'#՞ј5c@ 91290@//// ]K TX@878YKTX@878Y#373-՞ї /mf@ 9910'F#ll t@> JJ J  J: `   991<290KSXY"33##7!7!iuw!#~ oy}y5 3@  HH120KTX@878Y332673#"&rOKWky!x=68;qym`:@ 9910@ OO__]KTX@878Y3#'  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~hsR!uX/bb{\)?XXXXFs5\N9NR3R PRdHH;wb;T=Z7Tubs}\NXs5RPHHHHHHbbbb====Tuuuuu}}}}+{d?}7?Xo)XVX/PJ/X;XJRR#Xu5=bb;5559999RRRPPP=wXsNw3X\3///N;9sssw/?/m+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      sfthyphenperiodcenteredEuroc6459c6460c6461c6468c6470c6472c6477c6478c6475c6476""""gt]`}\ > . C =  o t!B{ j"G~kZPv"F ],$ !V!c!p!}!!!!!!!!!!" ""&"3"@"M"Z"g"t""""""""#%#`#$?$$%O%&'4'''(A()E))* *:*+K+++,?,--b-./[/0070h01_1122m2m2z2233344_445525\5i5v566@6c67W7788`9999,999F9S9`9m9z999999::=::;A;l;;0>>>?K??@@b@A!A2ACATAaAnA{AAAAAABzBBC=CCDhDDE&EAEEE QK@moJ GBGSf    JBits mB`#cVeraSansMonoOb6628I00@             [_<bomloganalyzer-4.1.5/src/BitstreamVeraFonts/VeraMono.ttf000066400000000000000000001401101277740250400226730ustar00rootroot00000000000000OS/2_*,VPCLT!?6cmapXcvt  0fpgmp((Tgasp glyf(thdmx32`Hheadم'6hhea ?$hmtx ε`4locamaxp name` postn]4prep:!8::h:: mR0u   y t  0   t 0  0   ~ 6 H `   0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans MonoBitstreamVeraSansMono-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Sans MonoBitstreamVeraSansMono-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comf 7X!uu9!{Xm{o{RoZ!=fs +b#1N {T\q#w`j#fy```{{w`b{!{RNNfffHF?{L'oo5jo{-{3=foD7f}s]A GA% } % 2  %%@Y}2}Y&Y@&//2G@Gddkߖږ؍ }:Ս :  ϊ̖ˋ%}Ś   ]%]@%AA dd@2(-}-d   ..A]%]@%%%A  %d%BSx~}~}}|{zwvut uu@t tss@rqponSonm(nSm(lk2ji2hgfedcbcbba`_^Z ^]d\[Z [Z YXWVUU2TSRQ}PONM-MLK(JIJ7ICIHEHGCGdFEFEDCD7CBCC@@ BABB@ A@AA@ @? @@@ ? ? ?@@d>=-=<;(:9B9d818K76-65K404K3032B21-10/-/. .-,--@ ,,,@@+*%+* *%):)('&%B%E$#""! -!} -KBBF-B-B-B@  @   @    @  @7    -:-:-d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-hh/10!%!!hsr) @ <2991/03#3#qeR@1<20###Ѯ++J@0     91/<<<<<<<2220333!3!###!5!!5!#3hiiThiih)T/hTaabbNZ /d@9($)%/%$(!$, ( 0<2<1/2999906654&'#&&'5&&546753&&'n|phumdfbdcӿdOTUPDNtd]gp^Vd-.)>B+/Qš ! *9V@/7(" "7(.+  % 4  + :99991/9999032654&#"4632#"&'%32654&#"4632#"&iNMklLNi@s..2H#)iOMllMMk@u--1?NjkMMljO0./t?``OikMMkjN0--uA9*7@b  -,.+2345617B7 1 +"1"!% (! 7+!(!(! .899999991/9990KSX999Y"6654''3#'#"5467&&54632&&#"3267667#'&JKNSj抋20ǭAF;}Eap:6\[ț*\,#1h F'XmFD ̉dHG'%[M;I\ 10#+u @  29910#&547u;:\' @  299103#654\<<J+N@,       <2<2991<22990%#'%%73%+f9s9f9PsPbybcyXqy '@    <<1<<0!!#!5!CDDD/@ 103#Śc/dm10!!d 11/03#1fB7@ 103#ymL # @  $!"!$10@////////// / / ?????????? ? ? OOOO O ____ _    F////////// / / __________ _ _  $]]4632#"&"32'2#"M68PO98K7PP78NL0670xx~F &@ ## 1/20%!5%3!!:P6ȪuLJժ#Q@)%%B   "$91/20KSX92Y"%!!5676654&#"56632uu5dF[pga Yd8ժ.>zO}BC12`tA7(G@)  #)&" )9190#"&'532654&##532654&#"56632ggfbYhyI'Ǖ&$54zms{(( ۵{fo B@   B    $<291/<290KSXY"!33##!5)!3d-=@"   "190!!6632#"&'532654&#"+W,wN\aQFժ 21%%L$=@#  %"& "%190&&#"6632# !2"32654&?M0n#J݁%'dkuzl75@%%B"991/0KSXY"!#!5V+N #/C@% '-'0 $*$ "!0991990"32654&%&&54632#"$54632654&#"hʁ򑁖Myz{yŗT!Ѳ!!ȟɠbx~~xzF $;@" ""%"  &%1902654&#"532#"543 !"&T?M/nI%'!dk  os'@ <21/03#3#'9' %@  103#3#Śc /Xyw!@('29190 5yR!÷X`y@ <210!!!!X!! BXyw!@('<919055X!R^^="{@B  %%B !    ) #99991/9990KSX99Y"#546776654&#"566323#=TZ>/mNb^hC^XE&bRY;X1YnED98L\VBT=/s 4p@1(+$ 4 '$+1+5' ( + . !+ -.5<991999990@ ]4&#"326#5#"&5463254&#"!267# !2kkkk%RӡP$J6l90?{:]x<!o?DF=?z% @A%%%% % % %  % B   / 91/<90KSXY"]@    ]]!3#!#hnl#+{q =@#   21 0!29991/9032654&#32654&#%!2!!qﰖ뒃JF{f>p}qdƵϠ1.@  2 10210%# !2&&#"32671M[?[MJVXI5))pn))=@@=R(@  2 1099991/0%26&!# !!`dVDѦHKw/N )@  13 21/0!!!!!!vTrwժFX $@14 21/0!!!!#o\eժH7fP<@!   6251990%# !2&&#"3267#5!PQv@^PQ_ſCe){KMon56MI!H &@ 1 0 221/<203!3#!#)d+9 %@ 77 221/220!!!!5!!=99ժm,@    51990753265!5!#"&m[hqG`=QQD, @!% %B  0 291/<290KSXY"]@L&&6FUWX dzy{ ',+&:IGG[WXXWkzx]]33 ##wVhs@ 141/03!!dժVy @,  B    / 0 91/<290KSXY" ]@$  &)&) 6968  ]]! !###V+'F m@B10 991/<2990KSXY"]@&)&8Wdjuz &)FIWgh]]!3!#3+3u\ #@ 2 62510#"32#"32IIz~u+@  2 8 3291/032654&#%!2###ꌝL/ϔu\=@   2 625999919990"#"32#"32ȗyHdIj@8  %%B     21  0299991/<9990KSX9Y"#&&###!232654&#NnRٲM{cݑohy]ҔYJ'@=  %  %B %( &919"0(9999190KSX99Y"]@ ]].#"#"&'532654&/.54$32\^mjikshulм V;9L@)%%%%B/091/290KSXY"%3#3h_KKѪ++ @D    %%% % B    /91/<<90KSXY" ]@^ //+ ??8 ZZ  &*%*(+ % & 5:5:;: 4 6 TTZXWV[[RW X ] gh yvy v #]]333# #ŏӬ߿ʿD"+w @K % % % %%%% % B   ;/; 0 91/<290KSXY"7]@8  '()& X xyw !%+% 5UYX es]]3 3 # #VHNAu3B}%Y@.%%%%B<< 9991/290KSXY"33#%lk!mb E@%%B/0 991/0KSXY"]]!!!5!" ՚ow@=210!#3!XfB7@ 10#%mZ@=210!53#5XޏH@ 91290##Ȳu-m/10!5mPPf1@ <10K TKT[X@878Y #fx#{ )n@*  ! $   D >*22991/99990@00 0!0" ]#"326757#5#"&546;5.#"5>32=zl;^[fX=& 3qpepӺ)Ld_y64''RR2X 0@  G F221/9904&#"3266632#"&'#3,fd./xRXWS%{/@   F210%# !2&&#"3267%JR%QNI]`A9++88*,A:;>{0@G H221/9903#5#"3232654&#"Z.deCSW;7W {X{E@&    IH991990!3267# 32&&#"X㿮Xmi[ ^Z89++9 @Ţ'4@     <<2991/22990#"!!#!5!5463'cM+Qgc/яN{H{ )H@' '  $(*' G!H*221999904&#"326#"&'5326=#"3253ZLSbC,ml/9.,}^\::VZ,@  J  F21/<990#4&#"#36632jq1sJ`cD .@ L LK <<1/20!!!5!!3#mnm`/BCV 8@   <2991990!5!##53263#XZZӜ} @:  B  DE 291/<90KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb{ZFB?  &@   L 991/99033#"&5!5![Y饵|~mo{"@'  MNMNME#<91/<<<299990@G000000 0 0 ????????? #]K TKT[KT[X#@##878YKTX###@878Y>32#4&#"#4&#"#3>32"iJo5FP;9JI9!c?LeHEws{p{``10"32654&'2#"hڜ-.VT{3@ GF221990%#36632#"&4&#"326w.df SWWRw 3@   G>22199032654&#"#"3253#L-ed.+SY7:WSj{O@   21/990@%  0030@@C@PPPP].#"#3>32;zI.Dv6y.*`w"${'u@@    B %( OI"E(99991990KSX99Y"&&#"#"&'532654/&&54632OS}{\JSjgTzEZ9..QSKJ#}##55cY1!1@  <<2991/<2990!!33#"&5!5!f^^uϪ+|b`>^,@    JF21/2990332653#5#"&økp1qJyaddm`e@)BIE91/290KSXY"']@%]]3 3#dEFr`T` @E      B    /91/<<90KSXY" ]@      &&)&))#, 96993< EI F J VX W Y fifij e vzx| r -   ++>>< H Y jih {yz|  ]]333# #àö`wBfL` @H      B  IE 91/<290KSXY" ]@ fivy  :4 ZV ]] # # 3 ^oo)'`?HkhV`@E       B   IE9129990KSX9Y"8]@v  &&8IIY ]]+532673 3Z.Gc".\mQ\GOLGhu:NN^Nlb X@BIE 2991/0KSXY"8]@68EJWXejuz ]!!!5!-}bܖ%$f@5 %   !  % $  = %<<29999999199999990#"&554&##5326554633#"3@k>>j@FU[noZUtrݓWV10#$j@7%   #%#= %<2<999999919999999032655467&&554&##53233#"##DVZon[VD>k@@k>XXrtݔXy &@  '1<2990#"'&'&&#"56632326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=%N'$u%m !@W % %%% %!%! %!! % !B     !  PPK/K!"2299999991/<9990KSXY"]@  ]]4&#"326!.54632#!#Y?@WX??Y:Arr@;nlZ?YWA?XXP!yIrrIv${u1'&dNk'(uF^'1uu\N'2u=N'8u#f'D#f'DC#f'D#'D#7'D#'Du%{'Fh{Xf'H{Xf'HC{Xf'H{X'HDf'Df'CDf'D'7'QHf'RHf'RCHf'RH'RH7'Rf'Xf'XCf'X'X;/ '@  RQ R <<1<203!!#!5!nn\]+u @ STS 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOp%!N@*   " E"<<<2212<990&&'667#&5473%C??BI9gg9ބ5(,-("9="+` 츸X>@     <<1/2<2990&&#"!!!!53#5354632D>Cs3A,,ُ/я= 2>j@<#$93 $*0?#=><''PGZsweZ54m@''TLf{xf[1,pE-Z/L-Z/L?!   V 104632#"&?}|}||{|j; #@WW1 9120!###&&54$FfNݸ}/V@1-'!  **.  !' $'$-DF099991/9904632#"&'532654&''&&5467&&#"#7C:oEBL;lAxC\[yqyrq|d1M*%]taQG_J'8O#kr}N4L@I  ] ] B   A)5)M  \\ [G#X;#Y//29999129990KSX9Y"2#'&&####32654&2#"&'&&546766"32676654&'&&XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ}N1ID@'  &>>2J\ ^,8 8YD/210&&#"3267#"&54632'"32676654&'&&'2#"&'&&546766`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZfh@6    B     ` `_`_/91<<2<<90KSXY"###5!3###r}r7q^^-Bf1@ <10KTK T[X@878Y3#f?F\@aa1<20K TK T[KT[X@878YK TKT[X@878Y3#%3#?X%y<@     <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬg@7 % %%%B    c /<291/<20KSXY"!!!!!!#!3eex5ժFժ +k@:+)&  *&&, #* #)+262#5,999999991/9999990324&'&&#"#"&''7&5327sT sV)+y=g %s9d/NZIn-QUPeQzQQFIRPJ) /7@$ '! -0 $dd*099991<2<299032654&#"&&#"32676632#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥sXy.@    <2<21/<<07!!!!#!5!X!dCDLIVw? (@( ' <2291/905!5w!!LK Xy? (@ (' <<291/90%%5!!X#!!V%@D% % %%B  < e e<<2<299991/2<2<290KSXY"333!!!#!5!5'!53%lkVoqZmo#o o#oT` L@*  !   JF!99912<9903326533267#"&'#"&'øxo ! &D">K .Y\,T H;8 OOPNLP-):@'! '! @ * $$*99919906654&#"#"&54632#"&54324&#"32JIH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{L= 7   @  <91990!!55!!LR%# Չ\P_L9@ 120!#!L^PL?@!   hggf91/2299990!#3267#"&5!##P117,#J%q\TL@H? HL%1  @ & &1026732#"&'&&#"#"&54632j Pd@7*9  kOeD=!0 l9TA6?&#Hn!bSA8?T %)d@6  (&&  #*& (' j kji*22999199990"326557#5#"&5463354&#"56632!!|WHi1Rwu3}CD?kdPDN@Ms=@pABtZ\#! { 3@   jkji9910"32654&'2#"&546!!hfssfeusgʫ˫\{u༻߻`{J>@#qqro prol 991/<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI L){ C@I=70 6 %C "76. 3@:("D%=/.M/u MCM6+sD299912<2<2<999990@ 05060708]5#"32654&#"!3267#"&'#"&546;54&#"5>32>321xYS\JMWWLepO27Gn 'aȿuc^8>M<[|%!YHZqYa4+#"33)+RNPPXx+'#!?@=B/ +s@>+,&  )&  *&& &,+,* # )#D>,9999999919999999032654&'&&#"&&5327#"&''m1$eA H#cC')d<]*,g9\ //4o0.0tGGq.78MBz;/mNb^hC^XC&DbRY;X1YnED98L\V@T? @ <2991/0533)eqXsy^@ '10!#!X!^?; /@     99190'%3##d)#Ӕ/}b%9V#@N   B   !$  /912299990KSX99Y"&&#"!!#"&'53267#5!6632$R,fs-/d+Ǻ9f.1d0`yu1Ɣ1c|ɏ!JX1y7K@&' 10+5  * 5'.810*8<2991<2<<99990#"'&'&&#"56632326#"'&'&&#"566323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=O@*iiiiB91/90KSXY"#3 !qw# /@    v v<2991<299055L-+-+#RR\# /@   vv <<991<29905%5+-:+-#^R^  ^R^  P1 #@   1/<<2203#3#3#P3f111%k'$u%^'$uu\^'2uH;@     -299991/220%! !!!!!"33(RH=MKF{ 8i@92/ & 8   #5/)#92& MuMCM,s9299912<229999904654&#"265&#"!3267#"&'#"326632PVWMfRPhgPPcpP/;}Jb04TY/%W & +#T53+)CBDA88>A>Ay/10!!/yy/10!!/y %@   1<20#53#53Ěb5Ǚb~~ '@   1<203#%3#řb5Ěb-@ 10#53Ěb~-@ 103#1řbXyo '@ w <<103#3#!!j!u#\u"@91990 h 9%-hV'\%N'<ufB7@ 103#ymLB /@ (-  * -'! @') -0)$ !'$* xyx( $02299999999912299999999904&#"3267'#"&''7&&5467'76632d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_Z/#@ v291905/-+#Ry#@ v<91905+-#^R^  #7N@*        JEE<2<2991/<299903#'#"!#!##535463wcM%ɩQge/яN#7B@#    JE E<<991/<29990#!"!!##5354637cM%۸ɩ{Qge/яN;/<@  R Q R <<2<<212<220%!#!5!!5!3!!!/nnnn\\/`103#`/103#Śc// * @  1<203#%3#řb5Ěb/'3?Kt@%1= 1%+C@&7IF:4(:PFz4P@ PzP"P.zP@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy%m'$uNm'(u%k'$uNN'(uNk'(uk',um',uN',uk',uu\k'2uu\m'2uu\k'2u=k'8u=m'8u=k'8uD` "@LLK 1/20!!!5!!mnm`/B)f7@  91290K TKT[X@878Y3#'#f7@!   PP99991<<99990K TK T[X@878YKTX@878Y@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@Z7JQ!7JQ=b10!!=V/)H 8 @ PP1<0K TX@878Y332673#"&/w `WU`w HLJJLD6@ a10K TK T[KT[X@878Y3#V{ W @  P{P10K TK T[X@878YK TX@878Y#"&546324&#"326{tsst{X@@WW@@Xssss?XW@AWXu)'  @ |1/90!#"&'532654&'85xv-W,"K/:=,,>i0Y[ 0.W=XfZ@991<20K TKT[X@878YK TX@878Y3#3# fxu"  @  |1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i)f7@  91<90K TKT[X@878Y373xs 7@   1 4<2.9991/903%!!'7;NwdPo;jnL >@!    <<2999991/999033#"&5'!5!%[Y饵P{;Pu|~$o/nJm'6uf'Vm'=uf']!<210##  N ;@!    21 0 0<291/220 !!#5326&!#!!VD}}/`ŕ{HK+H)@O B $ *'! !'D! >*999999199990KSX9Y"#"32&&''7'3%&&#"32654&Ŷ"#!H&!!#R-:/(  (-Y,\bPȑ^b n%k'<uhVf'\4 @  28  32299991/032654&#33 !##ꞝL!󄃃VT3@ GF221990%#36632#"&4&#"326w.dfSWWX-y10!!X!ת;T .@     <91<2907^t^_t\t%\^u^uw^X 9A      @  aW}a 12035733!j c)t'+nB}a@WWBA     @9991990KSX9Y"!!576654&#"56632eQdR1q?Ay;Jwrnaz3=L$$}k9wuF(\A          @#) & )99190#"&'532654&##532654&#"56632^c:r;Eq-evnmBJ]b`W,p;Eu2X`lP|yQDJLl?<8?yvcG]Z{''  VZ{'' VZ''  VfPm'* u{HH'JP', uuJ'6u{'V1k'&Zu%f'FZ1m'&Zu%f'FZ{$H@ "  @"   GH%<<1/<2990!5!533##5#"3232654&#"Z1.de5yySW;7W dm10!!d /`103#`%%3p@< 1& (# #43('1)-&- 2'-4229999999999122<2032&&#"!!!!3267#"#73&'&54767#70TJBN1Fi1OCHU,1u1!(*=Dl-.&nC>*( n -/ l?Q@ aa1<20KTX@878YKTK T[X@878Y3#%3#?Zk10K TX@878YKTX@878Y@&  //// //]]3#@   99991<<990KTKT[X@878Y@t        !      ]]'.#"#4632326=3#"&d9 #(}gU$=19#(}fT"<9! 2-ev 3)dwyi10K TX@878YKTX@878YKTX@878Y@ //]#1Ś7]@ 91<90K TX@878YKTX@878Y@ //, ]3#'# ӌ7i@ 91290KTX@878YK TX@878Y@ //*//]373 ӌ Zj@ 9910'3$ll  5   @  W <291<29033##5!5!wtt}oyc/ @ PP120332673#"&/w dRSaw 6978w{za103#  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~hR!9\XdffXXX%fmVuu/9%fZH{{{mjdLhX%%u{{{{+?j?X)XVX%PJ)/X;XwP%%uHXuh%fZ##%%uuu)=/VX)L%hXXBFf{{d%?y77 /+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      sfthyphenperiodcenteredEuroc6459c6460c6461c6468c6470c6472c6477c6478c6475c6476%%%%KmJz6b iP~Abj \ . [ ) ^ A  [ ?`m2l)*rd O TJlV|cp} &3@MZgtPJ ! !M!!"l"##3#a#$#$$$% %u%&-&'('(#(J(f()))**A*m*m*z***+k++++, ,),V,,,,-?-`--..W.o../e/r//////////0000(0O0|111S1{122C2t223"3/3<3I3V3{34S4`4m445 5E5x5696J6[6l6y666666667>7T7l78/8r99K999:$:N:d MF@Wm GBGSf   JBits@ mB`#cVeraSansMono6628R00@             䥉_<lmloganalyzer-4.1.5/src/BitstreamVeraFonts/VeraSe.ttf000066400000000000000000001655701277740250400223530ustar00rootroot00000000000000OS/2Xe\VPCLTybhմ6cmapXcvt 3fpgm%gasp4 glyf' ;&hdmx/CHhead'@6hheaEo8$hmtx1w0kernU \loca$maxp=; nameԵpostZ/prepuy ^::a:: fN0n   r t  (   _ (  (   i 0 9 `  y 0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SerifBitstreamVeraSerif-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SerifBitstreamVeraSerif-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com sLjq{)j/s3fbwPP;f=fRBsJ}s jjb\jjjj jj)R`fX{Hjj``'''Djb{sj\)'\jj=fHf JJ }T{3`}TjNNs@$d@$ 'd']}  22GG}  2d2dd%x %K.%x @@%0% @@   @I o} @ :]%]@%@0d0 ddl~}~2}|{|{zyx wv wvuv utltsrqp qp p@o}nm>nkm>lk llk k@jddjihihg]hhgf%g]g@f%eddeddcba`_.`_.^]\K[}ZYDXWVUSdRQ2POP}ONA@BL JdI"IH2GGFE EDCDkCBCBA BA@ A @ @@S?>->M=<=K<; <<@; :9:]98987 654543432 321 2 2@1 0/0D/.//. ..- d-,+,K+"++@* *d)(0)A(-(0'-'&:% %]$#$S#"##@"! !]     @#$0S-0 k@-B d-    @    @8k d } d2}-2- Sd+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ ]/10!%!!fsr)! $@a ` b  10%4632#"&!#5L97NN79LD{h8NN87NM@ b1<20#!#h++W@6 cc       991/<22<2222220!!!3!!!!#!#!5!!5!T32!53!5>54&#"pkh ou=Ŗq 9< mĖ*M@+ etee)te&ei`+  #) #  +99991906632!"&'332654&##532654&#"#u^unp _2 p,. ׫23"f~?@%d d M ss i  <<91/<<290KSXY"/ ] ]K TK T[K T[KT[X@878Y@ 8I( 68 GH ]] !53!53!!3Xtj%m ky@%xetee wb `     9190K TK T[KT[X  @878YKTKT[X @ 878Y@& //]]!>32!"&'332654&#"#T4Vgqq Z5VդT$$23"@C %c@" eely#ei`&    &190@%   ) ) NN N!]%2654&#">32#"!2#.#"DlB%O[q n¾FȽKJy^ejr@Mwb  91/90KSXY"K TX  @878YKTX @ 878Y] #!#!-Nuo1\ />@"$e ee*i`0$ ' -'! 09919904&#"3264&#"326#"$5467&&54632)|{{|lv͟ҟϴ%]@$ elyee i`& #  &190@ !"AAA ]#"5432!"&'5332"32654&CmO[p m¾KJ xRel%"ɽy @a a ` <21074632#"&4632#"&M88ML99LM89LL98Mh8NN88MM8ML99LMJy"@a  1990665534632#"&J^X?M88MM88ME%Z 8MN78MM^@29190 5Ѧf@rr<210!!!!^@<919055//y "<@ a ! ei `#! #10%4632#"&6632#6654&#"#hM97NN79MjT{~rah8NN87NMc/.ֶ3H+ʜ{o@Mm@;BAKE'N$ KE($ Ez Kzz@|$z+ |z+7N'(HA ==1N22991<9999990%#"&54632536654&'&$#"3267#"$'&5476$3254&#"326;]گ];DCjϳZVd_m+`5l}YawLNsyzrRPPR%oT&']gw}LLF]]{GF~b|i}@Qdddd  Mo ob    91/<290KSX22Y"(]@ ((( (,+]! 5333!53!3$H}}jkjjHjqd$E@'o obo ~ $ !$ !%229991/2290%!2654&#!532654&##53#5!2!+w埙jj~}jkäs8@ndn i`&' %10o]#"&'&5!2#.#"3267BapmIzq%0dap\@Aq=@ ob o  $ !299991/220@ 0O]%3 !#53#5! !#7ܺwRPjL66Hjkvtq3R@*  obo ~ $ !2221/00O]353#5!#5!!53#5!!53q{R{{{jk q7F@'  obo ~  $ !2221/20353#5!#5!!53#5!3q{>{{jk ~jsG@"  o ndni` &%1990 0 O ].# 3267!5!# !2#q]ͯiY88kMM_b;<q^@.  o bo ~ $ $$ $!2222221/<2<20@ p]353#5!#!#5!#3!53!3qGGjkkkkjj~jq 7@ obo $$! 221/220@ 0 P ` p ]%3!53#5!#GjjjkkTVm@ dn o b $ 12990K TX@878Y0]KTKT[X@878Y533265#5!##"&rXXw^qGca9kk"q(@Dd  dM  o bo $$!2<2991/<22<290KSX2Y"p]@  $ '6 F HW YYhzz    * % % & &'(: 6 6F F @ F @ F @ F@B@@@@@S X X U UPXXi i e efb```y  y  v vvyyC]]353#5!##5!# 3!3qGͪ3 HapmmpbEnpbNQJKQkdappbcVobcqC@!o ob o # $ !2299991/220_]!2654&#!53#5!2#!3wjkjs"@@nn i`#  %#99999190_$o$$] 47>3 ;.'2#"`jmpbE6mdapbcVm:C@QJKQq7$@H  Mo #ob o#   $ $ !%229999991/<2229990KSX9Y"3!&&##3!53#5!2%!2654&#!Fe(ٶCpbz'[REjۊQjjkп&)'@B#"$!   M !dn'dni'`* !)$)*9999190KSX99Y"+]@ +0+P+p++]KTKT[KT[X*@**878Y@t( ) ) ) )) )!)"8 9 : : : 99:: :!9"8#I I J I HI I!I"Y Y Y Y Y Y!Y"j l l l k kl l!l"i#{ { { { y{{ {!{"y#7++]]732654&/.54$32#.#"!"&sq֯hq|ɹ˭{HTlt7;A©-+ž{kz<7=2B{@  ob o $ $1/2<20K TX@878Y]K TK T[X@878Y@ /`]!53!#!#5!3I{.{Ij` j`bn@%   ob`$$ $$!1<299990`]KTKT[X@878Y]#5!#326#5!#! H廿jkkkkS@9dd  M o b   91/<290KSX22Y"]@"   (* * ']] #5!###5!f jzkkjkk 3@[d d    dd     M  o b 91/<<<290KSX22Y"]KTX@878Y@   %) $?< 5L FX\ Tm d~ t        &&&&)$ &546 4 7 IIEBFE G D H[[XW[X Y [_______feeehgff g g f d ehjjhusvuu v u w t y||yV]]!# ##5!# 3 #5!#y!7TZ9Bjkk9\kk @gdddd   M o bo  91/<2<290KSX2222Y"]]K TK T[KT[X@878Y@ )(%&65EFVUjicdyz        &&'& ()%%$$/6777 8997FCGGEE KIFIIUSSSSWSV V S [[WYYedeedede e d kllke``eee`xzzzz{yx x y {~||@{{}yuxxur]] 3!53 #5!# #5!# 3!53LP@Iuנjjskkkk?jjZ/@E  d d    M  o bo    $$999991/2<290KSX22Y"]]K TX@878YK TK T[KT[X@878Y@d 6 E [Zf xw       **/::7 8 ? 9 ? 9 ? ???F I V Y [ [ i h o h o `vvx x x )]]!53#5!# #5!#33+uu?jkk\kk,j\? m@#  M b     991/0KSXY"]@  O ]]35!#!!53\{^LzHZH$@ssq10!!!!/jjB*@Mb/9910KSXY"#mo@ssq9910!5!!5o/jNj@ b91290##}-m/10!5mPPsdv10K TKT[X@878YKTK T[K T[KT[KT[KT[X@878YKTX@878Y #oudxfD (~@/!  z!#&` z!-" ,' "*)22991/99990@$*o*x(*z( ]]5#"3263!5#"&5463!54&#"#5>32/퉆ts=kn_`VNvzojsJFIydb));!G@%!zqz` 5,'0"2221/990#]7#5!>32#"&'!532654&#"i6{{6ij@jmd__djuʿfD5@  `- *10o]#"5432#.#"3267'ްeekw?31/0|}f!O@& zqz` ,',5 *"<<1/990@ ####]%3!5#"5432#5!54&#"32636{{6fjjd_76_d)jifVDN@z  ` *2190@ @]]!32673#"5432.#"V碞y,}34ױJqq@& zq z - '6,0<2<91/222990]KTX@878Y``?]]#.#"!!3!53#5354632qaSOgT)CBKNqkjjRkf9D,f@3, )z) #`- -, '5&7*-22199990@ ....]#"&'53326=#"54325!4&#"32653iX`}6{{6h[&&h`ďd_76_dkJo@,  zqz =,,' :,',021/<299990/]KTX@878Y353#5!>323!534&#"3Th3l_zj@jVlnjjÏjJ` I@ z z , ',021/20]KTX@878Y4632#"&3!53#5!C/.CB//C갰hq.DD./BB(jjRk;9 i@"   z-6' , 01990/ ` p ]KTX@878Yss]4632#"&#5!#"&'533265C/.CA0/C-fëH>_UR[Wq.DD./BBzkq!!`Z{;@X    >>M z zqz   ,',0<9991/<2290KSX9Y"]@  &))899HVWggghw           ( ( ( &)-**+,)/6 6 6959?F D D DEY X X WVVVh f f gegaabef`x x x zxxvz T]])53#5!#5!# 3!533Ji‘j@j kkjj;R @@zqz,',0 21/20 ]KTX  @878Y%3!53#5!鱱ijjj@jJ^D0@A  +'z)%! z.#  = ", , '?=',?(,* '$,&01291/<<222990@ ?2_2o222]KTX111@878Y@/ / // 2 ]>323!534&#"3!534&#"3!53#5!>32%5n`o{`o{h3d|Xuwjj%jj,jjTijp{JDp@.  zz =,,' :,',021/<290/]KTX@878Y353#5!>323!534&#"3Th3l`yjRklnjjÑjfjD +@  `D *10 o]%2654&#""5432hFc32;VD #U@,  z"z ` $,5!,' 0$22212990%%]32654&#"'#5!>32#"&'3!53i6{{6Hiʵkd__dkkfVD#S@+# zz `$,',5 *$2<<12990%%]3!53#"54325!4&#"326536{{6hkkd_76_dkJD@" z z -,' ,021/2990@8/@@@@@@D@@@  ]]KTX@878Y#.#"3!53#5!>32jNKͦh6z-c)ONjjTioksD)@A#"$!>  > M !''`* !->'F$-E*9999190KSX99Y" +]@X'' '!'"'#Z Z Z Z ZZ Z!Z"X# !"# !"# !"#@++]]75332654&/.54632#.#"#"&sj|_{ֽTcjutwZg;wv]YFV1-,f,*gtRRCQ*-/o,;'qh@  z`, '/<291<2990K TX@878Y@&&/ ]#533!!32673#"&5ݢZ4FHBkJk]LU_7'u@"   z `,',:,' /<1/<2299990K TX@878Y]KTX@878Y!3!5#"&5#5!3265#X3k__z'Cjjo9k'@9    >>M z    91/<290KSX22Y" ]@H' Scv   %*** * *80HG GWXghvvwxx x x ]]!#5!# #5!#yy++wykk%kkD!'@[   >  >> > M  z  91/<<<290KSX22Y"`]@ $, (3= 9DJ IW ^di itz z          &() & # **%&:;??????:; 9 ; 8 8:9FEEE F F I H HHHHFQPPPPPPPPP R T XVSPb``dd````` b d fb`uxy}}yyyz@y v q u v vvwwwtw x]] #5!## ##5!#vęw'kkDkk->j'@g >  >>>Mz z    91/<2<290KSX2222Y"K TKT[X@878Y@ %*GIWWYXffhhyy       (),,% % ( '&&&))'9?9?HIGFGZYYYWY WUVVVVjjjgh h h gefx||||y wttttxvuuu []]#5!# 3!53 3!53 #5!#TߏLl%3kkw7jj>jjkk9'@Y  > >M z   - 9991<29990KSX229Y"]@ZYix))* * ''&XSUPUPSV V hd``dvwx~~tty x x yuuvvvv(]]7#5!# #5!##"&'53326Fsy++w2zo/c2^9<7Cñkk%kkT|[D;=R' j@" >> M z z  - - 991/0KSXY"K TK T[X@878Yif ]35!#!!53RjffBkVf#V$^@0 !   ! s ssq! %$ '%<29991/999999990#"&54&##532654633#"3>l==l>DVdbVititݓhXឈ"XG10#$[@/   ss#sq%' %<29991/9999999903265467&&54&##53233#"##FUbcUF?l>>l?W"Whtitݔ'>@    919999990#"''&'&#"56632326d]` _\Yd^` a\'XTB 9IMWQB:J\'$um )@a dd )('d&d  %"#$M %o  f'#o!$ ('& *%"   *99999991/<29990KSX22Y"]@://   / & ) "!   ///..)(%'&+/]]4&#"326! 53.546323!53!3wY?@WW@?Y#"HHKrrNH}}Z?YWA?XXj%zSrrP#jjHjsu'&Lq3k'(ud^'1us\'2Hu`b\'8uff'D9fd'DC9ff'D9f!'D9f7'D9f'D9fuD'FdfVf'H^fVd'HC^fVf'H^fV!'H^Jf'H`d'CH f'H!'HJ7'Qfjf'Rhfjd'RChfjf'Rhfj!'Rhfj7'Rh7f'XH7d'XCH7f'XH7!'XH9; 6@   b HH  <2<21<2<203%%#5#p##pFsu= @  i 10"32654&'2#"&546LhgMLhjJ@v+..fiMLfgKKk1.-rBPL"I@'  `# -" #222212<2<0%#&5473#&&'667u#dd\PjsdZt,+ .'{ i ldL@(  seis   I <2291/22990#&&#"!!!53!53#534632Ni q`ydt%UK_ekjRk'\= Ak@;39 (',o$ o?i$B3/9)'J1'*'"', 04999991/99990@D --./5``o55/0123-/0123]].#"!534632#"#"&'5332654&/.546wz 6IYwUOmofoPuVhYwZj8l]4M/7cr%#eiyhTuI6ARz$<T@TN N M  1%=1I 7" " PNPN"L7KCL+KCMOU2<99999991/2<229990KSX9Y"32654&##3#'&&##3!53#5!2"32676654&'&&'2#"$'&5476$}SSTR}*;tL#>1\TSS`׃^]__]^⃄^]]^\^ㄘmmllmmmmllmmLKJL3(DF/DDCpmS[j^^]僂^^__^]⃅]^^gnmmmmnnmmmmn2JM@+    ? 3?' REK!Q9K!M-K1/90#"&54632#&&#"32672#"$'&5476$"32676654&'&&`PWTriwyxvaqmmllmmmmllmm^]__]^⃄^]]^\^=%'mf_cnmmmmnnmmmmng^^]僂^^__^]⃅]^^(z@D  # '%!b) &S"7$S P PP TPS$T 7)2291<<22<22999903#3!53#3#53#5!!#5#3!53##^VVV+TVV}-DVVABBBB7VBBBhBBBhRfO10K TKT[X@878YK TK T[KT[X@878Y3#uf77! z@   1<20K TK T[KT[KT[X@878YK TK T[KT[X@878YK TX878Y2#"&546!2#"&546=0EB32BE/EB23BE!E03BB30EE03BB30E'<@!  r r  <291<2<29990!!!!!'7!5!7!}/H{}?f٠f٠#@Udd  ddMo!ob o~  $ "$ $<22991/<2220KSX2Y"]@ !"#0%O%o%%]!#53!3!53#5!#5!!53#5!!53dZ昤XN{P{{{MjHjjk d' +s@:, +&  ) *& nn&i`,,#* # )+#%,99999999199990_-o--].#"324&'7!"&''7&5!27A| "5@}!"{WWoeNWUC`PXVwQ`YYQJuRlSVVEiZUSG /D@$ !- $'!!0 $U*U0999919999032654&#"&&#"326#"&546326632#"&2TevYQ1UevYQG__KDa_/YYie9XXie~९{⦮u *@r  r   <2<21/<<0!!#!5!!!1Ϡ1yy &@r  <2291/90 5!!po &@ r  <<291/90%!555f$K@]dd  M s s sb"s# % #I! I%<<9999991/22<22<290KSX22Y"]@6iih     89969::9F K M MKKJ@@BBFIXVYYYYge g g gffgjhohojjhu y||yzF]]!53!5!5'!5!#5!# #5!#!!!!3hlR)WSGmjoiAikk\kkizTij;V'@3   zzz ` , ,',:, '0 2<91/<2299990!]K TX @ 878Y!]!3!5#"&'3!53#5!3265#X4Z9^'鱦^`y'Ahjo$$kkkh-)6@'! '!* $$*99919906654&#"#"&54632#"&54324&#"32IH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{wJ@#    <91990@  *]]!#'.#!!>?3!5 nNI =DN)u?$ HNh"%!%)/5w'=@"  V WV V WV22122<20!#3!53!3!53#56JJJJJJJJ'J@%z z =,' ,,:,',01/<2220/@]353#5!#3!53!3T!jRkkjjRj/%#@  & XX&1026732#"&'&&#"#"&546327j Pd@7*8  kOeD=!0 l9TA6?&#Hn!bSA8?S}(,q@<&+))&i-) #*#Y#Y -2299991999903#5#"&5463354&#"#566325#"326!!FP0}WtiWfLMBilea\oFTP30pr-T^FEPNQUah^d ,@ i Y Y99102654&#""&54632!!jklihmliԯP-Lװױbh}')M@( n!iw   '%*991/<22990%!53!565#"!3!&5476$32`PuuNsnccotӶF7SF-W`֗g[`_\gfD 8?@G,2*$ 29z*z2/*<'!6`@ $+-?+239**@22999912<2999990@(AoA*+,9?]]5#"326#"&5463!54&#"#5>32>32!32673#"&.#"/퉆tsmS}t_`V7Ju衟y+z\NvzoF[XIxcc))WZXY}[,L} +@?+*&  ) *& &`,,#* # )#+D#*,99999999199990@ -o-wx]].#"32654&'7#"&''7.54327H&pJ-(oJw>@^CL=>^@Lo99Hv1g=;Ly3Jv56?Ms232? "8@a ! e` i#! #10#"&54632#"$54675332673 M87NN79LjU{~q`m8NN87NM/.ֶ3+ʜ{! !@ ai   1/04632#"&53L97NN79LC{Dm8MN78NN5^@ r 10!#!^=} *@    91903##'%\sB}}`s-Pb;#P%@N%%  %!"!""!M!"se ei$&%#"!  &99912299990KSX2292Y"6632#&&#"!!#"&'533267#5!hɦ3vFbKIPW#1\˦2tGbJHPW\ oVRjVRj8l@9216/$#(!6/,(+! /(/6 6!921$#+9<2919999999999990#"'&'&'&#"56632326#"''&'&#"56632326c]\ _\Ye]` a\Xb^` _\Ye]` a\dZT?9ILZRB 9IѓYSB9ILZRA 9I3VM@)ddMwb91/90KSXY"%33^]<;A+%# :@     Z Z <21<222<22055%)+#)+#ssRssRH# :@     Z Z <<1<222<2205%5s+)N+(#^R^sXXs^R^sXX/ #&@a! `$ $1<<220%4632#"&%4632#"&%4632#"&%M87NN79LVM87NN79LVM87NN79Lh8NN87NM88NN87NM88NN87NMk'$u^'$us^'2Huwu!^@0 obo~    %"2299991/0 #0#]%# !! )#5!!53#5!!53q7#3P{Ryy{jjb_ fD ,3k@/ '--z  0*$`4'3 - !*429912<2<9990@P5 -3]]%2654&#"!32673#"&'#"5432>32.#"h碞y,IEςFIzF}ba`c32c``cױb/10!!bb/10!!b/@  i  991<290#667#667LE|ME}@?[P@?[r3@  b  991<29066553%66553NF~@LE}+?=[P??[%@ i  91990#667%ME}@?[@ b  9199066553NF~+?=[y '@a ar  <<104632#"&4632#"&!!M87NN79LM87NN79L8MN78MLU8NN87NM#u"@91990  9%-9!'\DZ\'<u+@M`i10KSXY"3#7Rh\#/o@= -'! 0 -!-'!0 *$0* $ $*099999991999999907'#"&''7&&5467'766324&#"326^+))-`8wE@}=_))*,_8xEBzQrpqq^z@Fw9^,*(pprs##@Z2105s)+#ssR##@Z<105+(#^R^sXXJ'"}@1z"q z - =,' , ,'0#<221/<222990@ $/$o$$]KTX###@878Y'.#"!3!53!3!53#5354632/^z{Ǯ갰WYVUdCjjRjjRk`Ju@. z zqz  =',, ',0<2<991/<222990/]KTX@878Y!3!53#"!!3!53#53546ף'ٮ갰Vjj@dkjjRk`9;\@1  b  H  H <222<22212<2<22<203%%%%#55#p##p##p##pFE%'BL  a  104632#"&M97NN79M8MN78MLZ@   9199066553Z_WE%ZZ`2@     991<29066553%66553Z_W;_XE%ZPE%Zq L #0<@L|@B?@=@=>?>M G$jjGj=*j1?7`A=iM$>0-'@!' :  - :4! D4 J M9912<<2290KSXY"2#"&546"32654&"32654&"32654&#'2#"&5463#2#"&546WddWVbcXcdWVbcXbdVVbaU"ZܻۻZݦ!\ܻۻ ۻۼk'$uq3k'(uk'$uq3\'(uq3k'(uqk',uWk',u_\',uqk',usk'2Husk'2Husk'2Hu`bk'8u`bk'8u`bk'8uJ`' @@zz,',0 21/20 ]KTX  @878Y%3!53#5!갰hjjjRk?f[@ 91290K TKT[X@878YK TK T[KT[KT[X@878Y3# #ttfJ7@  [[99991<299990@A            ]K TKT[KT[X@878YKTKT[KT[X@878Y'.#"#>3232673#"&9!*0`f[&@%9"+0`f[&@Z7OL!7PKb+(10K TX@878Y!!V)9H n@  [[120KTX@878YK TX@878YKTKT[KT[X@878Y332673#"&` hddh ` HOGGO7u! -  10K TK T[X @ 878Y2#"&5460EB33BE!E03BB30E \@  [[10K TK T[K T[X@878YK TK T[X@878Y#"&546324&#"326sssszX@AWWA@Xssss?XW@AWX#u"@    991/90!#"&'532654&'B@?~p*X.)O#9B,,@p1QY 5-X<f:@ 91<20K TKT[X@878Y3#3#rtfxLw&@   9991/9990!33267#"&546^WC8:$C q|<{/.8  YQ1i?fL@ 91<90K TKT[X@878YKTX@878Y33ttxV)Q@-  o bo  $ $ !<2299991/290353'7#5!#%!53{FF3F{jq\kk\-{a@% z qz, ' , 0<2<9991/290P]KTX@878Y%3!53'7#5!7ꮊ=Ǯf`VjbVk'6usf'V\?k'=uRf']@ G<210##  q M@%  obo   $!<2299991/22<200]%3 !#!!53#53#5! !#8ܼPyȾRPjL66H}1je}kvtfj-a@3-,+'$#"!( `(q.-, #"! '($+ D*.99999999199990 /o/].#"32654&#"5432.''%.'7%5-Q(/l#K4I2%%=_w\B% pاy/"5k7N:QV^DNZk'<u9f'\DqM@&oo ob o # $ !222299991/220_]!2654&#!53#5!#!2#!3wp9jkkj;V #S@+ "z zq` $,5!,' 0$2221299990%]32654&#"#5!>32#"&'3!53i6{{6Hijmd__dkk1@ r10!!ӢD /@   <291<290 '71s33r4rP13p4pq3 ?@Mh \ 12990KSXY"535733fTzj^TZk@6   M   h  \ 9999199990KSX9Y"#56632!53!5%6654&#"FBEJVJaTN^ "hzlKMzBUcLd*R@,& )&h+  #)#\\ +9999199906632#"&'532654&##532654&#"#}I;j_wyHDFb\^ffe5acQLRWFlcHdwdrzJMXR]_JJJCH@A''5 d?''5dd''5 dsm'* 3uf9H'Jq^', uu'6suD'Vsk'&5uff'F^sk'&5uff'F^f)d@2!z! 'zqz` $,',5$ **<2<91/<2990@ ++++]%3!5#"5432!5!5#5!3#54&#"32636{{6Ffjjd_76_dJjujjiZZs10!!ZsBL  a  104632#"&M97NN79M8MN78MLq4p@;-s+!s1edei`#5-+$(#,"5 .!, ",(4( 529999999999122<20#"#73&'&5467#7332#&&#"!!!!3267q+筽/--/c|jz/1w/t0h1"0h.>Eh3 Dh吏7 k@   1<20K TKT[X@878YK TK T[X@878YKTX@878Y2#"&546!2#"&546=0EC21CE/EC12CEF.2CC2.FF.2CC2.FP10@ //]K TX@878YK TX@878Y3#?uJ@!  [[999991<<99990@2         ]]K TK T[KT[X@878Y@)   ]K TK T[K T[X@878YKTKT[X@878Y'.#"'>3232653#"'0)'4`fU$>71,)/ag^CH> 9.dv 7/ir-qP10@ //]K TX@878YKTX@878Y#u?u@ 91290K TX@878Y@/// ]KTX@878YKTX@878Y3#'#tt?c@ 91<90K TX@878Y@//// ]KTX@878Y373tt5P@'  M  h  \<<91<<290KSXY"!535!533#3TNriTTR7 N@ [[1<0K TK T[K T[X@878Y@  ]332673#"&^k\\k^7667u}|u -  10K TK T[X  @878Y2#"&546/FC22CFF.2CC2.F  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f7q3!JZ?JJqsjqqqdsq)q5TqPq1fdsbqsq{V`9  H\f;{fffJf'JJ{;;;J'Jf;fJs7;'7!7Rsqds`ffffff{fffffJ 'Jfffff'7'7'7'79\3X;d3;#h^5BJ+/}^}fLJ7=#3s wfHVh33VJVJ9Z%Z qqqq)q)W)_)qsss```J#LZV-{s\7RuqfHhq;55Z5dddsf)q{ss{fs{ffZ55+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468c6469""""Tu_Ox2A?c9^  t  \ U ~(uR%~H;f"sa4{-i4/n/J !"G""##r##$$$$$$$$$%% %%'%4%A%N%[%h%u%%%%%%%%%%&&&H&&'5''(()*%**+7+{,,--6-f-.r./=//00`0112>233H3d344455`555556;6667!7\7~778 88%8I88999:M:l::;t;;;;;;;;;;<<<<*<7/>a>>??P??????@S@@@A?AAAB$BBBC CC*C7CDCQC^CkCxCCDDD5DEEQFF9FFGGTGX7 J79k:;<$7$9$:$<$I$W$Y$Z$\$$$$$$$$%&%&&%*&%2&%<%d&%g&%&%&%&%%&%&%&%%&%&%&&&''&''9(&))))))$N)Du)H)R)bN)iu)ju)ku)lu)mu)nu)p)q)r)s)y)z){)|)})u))N)N))N)N**&**<**--a--.k.$.&.2.8.:.<.H.R.X.\}.b.d.g.h.p.q.r.s.y.z.{.|.}.~...........}...........}../7Y/8/9 /:N/<}/\/h////}////}/1}1}1122K2292;3a33a333$D383D3H3R3V3bD3h3i3j3k3l3m3n3p3q3r3s3y3z3{3|3}333D3D33D3D3333344K44&4&57595:5<5D/5\5i/5j/5k/5l/5m/5n/5/5&55555566K66666777777$77&7Da7Fa7Ha7Ra7Vk7Z7b7ia7ja7ka7la7ma7na7oa7pa7qa7ra7sa7ya7za7{a7|a7}a7a7a777a777k7k7a7a8D88D888$8-8b888899D992929$u929DD9HD9L9RD9X}9\9bu9g9iD9jD9kD9lD9mD9nD9pD9qD9rD9sD9yD9zD9{D9|D9}D9~}9}9}9}99D9D9u9u999D9K9K99u9u9999::k::N:N:$:DN:HY:L:Ru:U:X:\:b:iN:jN:kN:lN:mN:nN:pY:qY:rY:sY:yu:zu:{u:|u:}u:~::::u:u:::u:&:&::::;;$;&;2;b;d;g;;;;;;;;;;;;<<<<<<$a<&<Da<HN<L<RN<XN<ba<d<ia<ja<ka<la<ma<na<pN<qN<rN<sN<yN<zN<{N<|N<}N<~N<N<N<N<<<N<a<a<)<a<a<<==IIII&IINRUUY Y Z Z [\\b7b9b:b<bIbWbYbZb\bbbbbbbbdde&f}f}ffggKgg9g;hDhhDhhh$h-hbhhhhyz{|}&K9;79:<IWYZ\79:<IWYZ\K9;&$-/99:9;9<9b99$-/b$a&DaHNLRNXNbadiajakalamanapNqNrNsNyNzN{N|N}N~NNNN<Naa)aa79:;9<YZ79:<IWYZ\&79:<IWYZ\&&K9;K9;K9;DD$-bDD$-bDD$-b7Y89 :N<2\h22K6K$9<b$a&DaHNLRNXNbadiajakalamanapNqNrNsNyNzN{N|N}N~NNNN<Naa)aa&&<K6 UE@ ^m L GBGSf JBits@ mB'#sVeraSerif6628R00                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     "                      "        #                       #         $                   $        &                   &        _<K Lmloganalyzer-4.1.5/src/BitstreamVeraFonts/VeraSeBd.ttf000066400000000000000000001625601277740250400226150ustar00rootroot00000000000000OS/23TVPCLTzZϬ6cmapXcvt 먏fpgm&4gasp, glyf5&NhdmxUHhead|-86hhea0$hmtx5gh0kern4Dlocar(maxp]^ nameR postV0prepV: ::O:: S_0r   v t  (   ? 2  2   G . _ `   0 & Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Serif BoldRelease 1.10BitstreamVeraSerif-BoldCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera Serif BoldRelease 1.10BitstreamVeraSerif-BoldCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com{`jyV\byb`{{N\=VTq\f{fb--){bb??)fD)y V%hNf s{juy jdy{Hy`yqq 33Nyj``'''Dbjyyb3'b=D)fRR5fVVVJ!/TfDs@K 2ǻƻĖG}G0}  & @ 7 !7 2.+t+t ]%]@%@ @  dtd  @   2 }t} t2q  @~t~}|}|{z{zy]zzyx%y]y@x%w7vtvkututsrqrqqpo.po.nmlkKj hg g@f!e}d@ckba}`^] ][YXY-XW2V TSTSRQPQ%PPOONMN}MI MM@LL1KK2JI J}I HG H}G FE F2ED E E@D CBCBA@A}@6 @@?=)?>=)>]==)<;<;:;:9 :9 878}76 776 6@5454+ 43 32) 210 0/$)/7.! .-,-,+ ,,@+ *&*) )@('('&''@&%$)%$!$)#!#"! "! ! !  @!*@-:!}22!)k!) !-} -    @      @@d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ m/10!%!!fsr) )@r p s  9910%4632#"&!#5oNNppNNowwNppNOpph@ s1<20#!#++)T@3        991/<22<2222220!!!3!!!!#!#!5!!5!F+`aaE````HFR`hh$+2h@;+2ww,v %u "p3(  /,  (%!  32<912<22907333&&54673#&&'#&&6654&'xypay| ynPUcUcyehal;#7 +'t;Ǵ, T=FV WJJ`1h '3W@,*(}}} .}"p {4+%1 412<0KSXY""32654&'2#"&546!3#2#"&546"32654&@88@A88A˿NZ;ʿ˾A89@A88e-dR.8@e,-,--,2130 ! 78/!! */,!60$ ($v&6~{-vp&03 !%$') 3/,$.)$)3 99999999991/2999990KSX999Y"0]@0 / 07 8/0178 / 07 8/0178OOf0v/u0]])'# 5467.54$32#.#">7#5!#3%326!d33J|tket +*>XHIuwwpq :@*v{  1/2990KSXY"!5!5%!!w;yyX@+   *  u{    9991/990KSX9Y"#663 !53!57$54&#"xzz?`ÉvdB%%ДJ*U@- vu)&u{p+ # ) #  +999190663 !"&'332654&##532654&#"#v!vy B4vy##̱((Hx{T=L@%* v v{ <<91/<<290KSXY"!!53!5!!!3qxCys+G@&uu s p     91990!663 !"&'332654&#"#BZ@zxLw3d34(*F?B#%6@ uu u{ p& # &1906632! !2#&&#"2654&#"A_^XZvyngXXggWWu44qffiѯدد7@*s 91/0KSXY"#!#!XE)j##/C@% 'u!-uu{p0$ *$* 0991990! $5467&&54$! 4&#"3264&#"326ȺL\]KK]]K']rs\]rq^̥Υ$Ⱦ'wwuuշo %@@# #u#uu{p&   &190"32654&#"54! !"&'3326gWWggXXxB^$2O229991<9999054&#"326#"&54632536654&'&&#"3267#"$'&5476$32!#|ecyyce|,ZڿZ,ۏnq\^aYkzg9~~GͲ$sLHLLG}'갏`NTFEjśewzDC^TT~~|KJ}~|aboL@Q     * v vs  91/<290KSX22Y"#5333!53!3!z23E{}y\yy1y#;`R$R@( v#vsv ## %(#"%2299991/2290&P&p&]353#5! !32654&+32654&+`uyyƤf}vV?@~ ~ {p % 10@ 0ou{{]! !2#.#"3267;Iz 'Ωܕ+ef@A`8@ vs v % (# "299991/220]%32+53#5! !Uoy,GE+yy`W@.  v vsv )( #"2221/0Po]353#5!#5!!53#5!!53`>yyy!`O@)  vsv )* #("2<21/20]353#5!#5!!53#5!3`3{yy!yV3D@!  v ~~{p(  % 190 P ].#"3267#5!# !2-ҿT;I6Ʊ&&xNLhi@A`3^@-  v sv - -( #(#"2222221/<2<20@ P]353#5!#!#5!#3!53!3`Ryyy yyyydy`` 9@vs v (#(" 221/220@ 0 @ P ` p ]353#5!#3`yyyyjV{@ ~ v s (# *.12990@ ///0@P]KTKT[KT[KT[X@878Y@____Y_p]533265#5!#!"&MLaMS^X+yy"`3@>   *  v sv (#("2<291/<22<290KSX2Y" ]@         , & & * *))'9H E @ E @ C CCHA@@@W S S S SSZy   =  ! &5 6B GQ Vv ]]353#5!##5!# 3!3`y-ٓgyyy!yy3yy`s =@ vs v(  (#"21/20@ 0 0 0 0 ]353#5!#!53`Lyyy-V{@D* vs v(( (# ("22991/<2<290KSXY"]@> (Sp  &&&:VPf`uwvvp]]353#5! !#3!53#3Vhg13yyByyysyZ~@-* v sv (( ( ("21/<2<22990KSXY"]@@Php&77h]]353#5!#5!#!3Z myyyy7ByV /@~ ~{ p% % 10@ o]%2#" ! {TxyS\BKLByjjdd`J@"v vsv  / * # ("2<99991/220Pp]353#5!2#!332654&+`R&ppyyy㭑V E@ ~~{p! % % !99999190@ o""""]$! ;#"&2#"u[xy5y3Lhjdt/92)BKLB`$@H  *v #vs v  # ( $( #"%22999991/<2229990KSX9Y"] ]3!.+3!53#5! %32654&+?Yz-ڙEaV=T \W`yÌMyyy!L)@?#"$!   * !~'~{'p* !1$0*9999190KSX99Y"+]@"( ( ( ( ((( (!("(#: : : : ::: :!:":#X X X X XXX X!X"X#k k k k kkk k!k"k#  !"#  !"#?0+P+++]]7332654&/.54$!2#.#"!"$ؿn۲' ĵhлђHbvrZd+78Ǹ,,gf]a4742o@  s v ( #(1/22990K TKT[KT[X@878Y@@_` ]!53!#!#5!3sgȇdyu-yFN@$   vsp(( ((#.1<299990@ ?]#5!#326#5!#! έ\yyyy&UR@9        *  vs  91/<290KSX22Y" ]@     # # @P ]]###5!# #5R}͍y\yy#y @\          *  v s 91/<<<290KSX22Y" ]@D "CFSV   && '##EFFGH@TX WP]]) !#5!# ! #5!#VĠBH#Ι?\yykyy 3)@f   * v sv  91/<2<290KSX2222Y"]@4*%   &+++))+]]K TK T[K T[KT[X@878Y@8= = ;;44?O]] 3!53 #5!# #5!# 3!53ɸ-!?:yy;yy\yy5yy@A       *  v sv    #999991/2<290KSX22Y"K TK T[KT[KT[KT[X@878Y@P       JJ[[Y Y _nnh o o xxx z  z  ppp  &]]!53#5!# #5!#3`D̦PNbyyy9yyByL y@"  * s    991/0KSXY"K TK T[K T[K T[K T[X@878YO]35!#!!53L{5hA7@vv210!#3!7xxB@ s/910#m@vv210!53#5x2x@ s91290##JJ;-/10!5۾f-10K TKT[X@878Y #fxTD(@1&&&p #35# 2)22991/99990@,*:?????9O** +//   !" ]]3!5#"&546;54&#"#5>3 5#"326hFnzjsq_q cjMORdyTP?{Wc""leedl/F!G@$!p> <58"2221/99990?#]7#5!>32#"&'!532654&#"ǘ-pp-_jmYYmj_y#xSQQSyf實TD2@  p3 >210]# !2#.#"3267&4oup~r}zkL& (**هπxTh !L@%   p55 <>2"<<1/99990?###]54&#"3263!5#"32#5!o`inYZmi`b-pp-i尦ySQ,*QSxTDe@"  p>9 ?221990@"`  ]]4&#"!32673# ! 5N^[O%|s+. Xҩwηzt#(?e@&  3 + 5A<<1/222990K TX@878Y0 0 ]#.#"!!3!53#5354632pKEPH :UN NLsyyy5yT9hD,t@., #) #p- 35 <&>2-2219999990@  ( ?.     $ ]]!"&'53326=#"325!4&#"3265jsq-pp-`inYZmi``!!ifySQ,*QSy尦?x@,   JH5 F5CA21/<299990]K TX@878Y/]353#5!>323!534&#"3F@}EUkdy#x}_Tyy5i#yF ;@  K 5 5A21/20@ /`]4632#"&3!53#5!pQOooOQpoTQooQOonuyy5yh9= L@%   3K 5 A19990 / ]4632#"&#5!#"&'53265oRNpoOQp)323!534&#"3!534&#"3!53#5!>32Js=S^h>R_h>nyjayyhyyhyy5y]VcFDy@,  JH5 F5A221/<299990]K TX@878Y/]353#5!>323!534&#"3F@}EUkdy5y_Tyy5i#yTD -@  p>; >210@`]%26&#" ! p[Zqq\\q?>Tq+)/VFD #q@+  "  p$4>32#"&'3!53)_jmYYmj_-pp-bHi實ySQQSHyyTVhD#S@*#  p$45<> 2$2<<1299990o%%]3!53#"325!4&#"3265їc-pp-`inYZmi`!yySQ,*QSy尦;LDU@%   43C 5A21/29990@ /?O_]#.#"3!53#5!>32LqPLtF4|Y3US̵\yy5yok X-D)@C  Q!  Q ! * !''p* ! 33O$O2*9999190KSX99Y"@ ]@+++) ) ) , , )6#E#Y Y Y Y Y YYY Y!Y"Y#j j j j j jjj j!j"j#  !"#  !"#  !"#<]]7332654&/.54632#.#"!"&`qlsIi^Ձq lo@SѠc)w}KF@F%)!mnEB6>%51q^@  p 8<2122990K TK T[X@878YO_]#53!!!32673#"&5˚b',:@> ۜyJyuDVZ/'i@#  pH5F 5 8<1/<299990]K TK T[X@878Y]3!5#"&5#5!3265#5?}BXkc'Ry_T+yky'}@:    LL*     91/<290KSX92Y"(]@ ,+KK[[]!#5!# #5!#ub  {yy`yyR '@[   L  LL L *    91/<<<290KSX22Y" ]@: + 7    &##**(7669 GGCCFJ WW Y ]]#5!## ##5!#Pȋ}tZ}';LyyRfyy'3@e L  LLL*    /91/<2<290KSX2222Y"]@       %+ + + )"""99?9?9 85566LIILDDZ^^ZX Wxx8$*59]]#5!# 3!53 3!53 #5!#ϼ<\ɏJwyyFyyyyyy9'@\ LL*  39991<299990KSX222Y"]@B  %%55<<<<<<FFSSVV]]#"&'5326?#5!##5!#0s1xGqCCAP(1seubMJGc%5yyuyyHF' @$ LL *   33 2991/0KSXY"K TK T[K T[K T[K T[X@878Y@ ' `]]35!#!!53Hb5wwy9+wm*\@/ + #&'  +# *& +<<29999999199999990#"&'&&554&##5326554676633#"3m2k==k2gpRcaRpy1>$npsyspm%=1x^"^10#y*^@0"+  #)+)" +<2<99999991999999903265467&&54&##53233#"##eoSbdSoe2k>>k2^"^x1=%mpsyspn$>1?-@  99199990#"'&'&'&#"56632326]e_ aM``d_eM?VR:BHIWQ9DHL'$uLm &)@d)')(" !')()&%$#*)"v' 'x$  v #'%$*!")( *999991/<29990KSX22Y"32654&#"53&&546323!53!3!N57MN65N_z:?uv=<E{}P6MM66MMzy%yJuuJv(yy1y#;Vo'&o`k'(/uZo'1uV'2}uF'8uTf'DXTf'DCXTf'DXTN'DXTV'DXT'DXToD'FTf'HTf'HCTf'HTN'HFf'f'C f'N'FV'QTf'RTf'RCTf'RTN'RTV'R/f'X/f'XC/f'X/N'X9; 8@   s TRT  <2<21<2<203%%#5)j))jJ##R##dL@  zUU102#"&546"32654&Bz0/11-0|DHdcIHde3/0xDCy-03dHHbcGHdL"S@+ u u p#   ">#<<22199990%%#$%3#&&'667cWVR y.y;vqnd[h ^kӝ%#&%~ zjL@(  vu{v    <2291/22990#&&#"!!!53!53#534$!2xcTuf` Axalyy=y?=5C@l)(*'W<=<$%#&W==<  WC6C  W66C*C=<6'  &- 3{D=@#69&  @#-'9C<#Y#WYW0@WV09WV*D99999999991990KSX9999Y"#&&#"#"&'5332654&''&&5467&&546326654&'whaQ[6ZrrSMSfvhjW]5[ssSOJr,.[n-/]pVVJC/B/Hbsh+/ZZRJE/B/Hcrg,.Y!N-=f:X#O*@"      <291<2<2.990!3!!!'7#5!7!Vb5}#@Y  *v!vvs v  $) "( #$<22991/<2220KSX2Y"KTKT[KT[X$$$@878Y!#53!3!53#5!#5!!53#5!!53KsTrPoo!;y/yyy!D! +|@=, +&  ) *& ~~&{p,,#* # )#+%%# ,99999999199990@ o----] .#"324&'!"$''7&5!27*t /-tø ZZSjZ[[x hZw{LzxNfAe+hdNNZf jMMZ /=@-$ '! !0 $`*`09999122999032654&#"&&#"326#"&546326632#"&-{N^ulQJ|.zN]vlQK~E`]XD_]1KLoYVqr$LJqXUqtE}밸u찷q)@    <2<21/<<07!!!!#!5!ff $@   <2291/90%!55yPP $@  <<291/9055%!!y'R$@\  *v v vs"v#  #!  %<2<29999991/2<2<2<290KSX22Y"]@HD, ,##3 553;??<LLEGX o o ]]!53!5!5'!5!#5!# #5!#!!!!3Fm=߉$5myZu;uyy'yy#utNuy9V'@1  p 5 H5F5 A 22<1/<2299990!]K TK T[X @ 878Y@!]3!5#"&'3!53#5!3265#57mJ;!nDXjc'Ry}SGyyynyLF)=@'! '!* $$*9919906654&#"#"&54632#"&54324&#"324,,:*:|fMHeMIecBds<+@lFWt|uy w9@$   91990!#'&&#!!26773!5ӋX\S~!v0" HX6S4+)X&G/w=@"  a ba c ba22122<20!#3!53!3!53#/XFFT^TT^TTF'K@#  HH 5F5A221/<2220@ /@]353#5!#3!53!3FPy5yyyy5y1q)*@$ *'! de!d*91026732#"&'&'&'"#"&54632VfbwL>.> c ('8z`yNB2F KbPfbN>J?(:=!,k@7"*# #*  {-$''"f'f-229999199990!!3!5#"&5463354&#"#566325#"326qs3U{^_LX `ITeHS=9?K^\96zr~ZYA>KA>CJ=*@ { f f9910!!2654&#""&54632qLCCLMBBM?Vзѷ\#K@( ~{g g %!% $991/<22990%!53!56#"!3!&5! N#Ǣ"Orr} 0 '5 5}\A<}TnD5@@E(.&>6.&7&>.+03 p&A8&;?'.3/6'?;/#2A22999912<<9999990@@:,?-?.?/?0?1PBB+-/.//$%&'789:]]4&#">3 !32673#"&'#"&546!354&#"#5>325#"326N^[OMo %|r+NY|{grq_qmjOYV^XҩPNNηyuMONN?tWa""MSnqq`p3#'|@>('%" &" "p((&%'?;?2(999999999199999990@)`)] .#"326=!"&''7.5!27ZMn]\Mm\ BCoPTAB?tHVZXYYHv12VKu)21V\+ "7@!r  p {#! #10#"&54632#"$54$75332673ZpNOnoNNp|izxmw x1NnnNOpq""+ &@r {  991/0#"&54632!53pNOnoNNpu1NnnNOpqJ@ 190!#!HD *@    91903##'%ugdɌKZ3qtkP-%@ML!"!L""!L%%  L%*! "vu u{$&%#"!  &99912299990KSX99Y"6632#4&#"!!#"&'533267#5!1CYy49 ?/2529912<2<99990@6   ]]%26&#"4&#">3 32673#"&'# !2p[Zqq\\O]ZNKv %zs'фHFԇ?TҩPPL϶ztMOMO.)M/10!!/10!!#2@   { i i991<22990!67!67#`Y`XhC7aC7`b4@   s ii 991<<29906655!%6655!3`V`WC7aC7aR@ { i 9190!67R`XhC7`b'@s i 91906655!b`WC7a{ '@   <<104632#"&4632#"&!!X=>XX>=XX=>XX>=X=XX=>XXZ>XX>=XX!#u"@91990  9%-9N'\T'<u)@*p{10KSXY"3#)ZL= /u@> )0- *( -!'-0  )'!$* $ ( $ 02299999919999999902654&#"'7&&5467'766327'#"&[\[~|їљ0l=7m9͘ќ.j?:l\\\]~Ϛ.k@?l.͞Ӛ8o6?i/Ӛs-@ h291905s+--@ h<91905+-AB?"l@4"  JH3 5 F5A#<21/<2229990@ $$/$$$]#.#"!3!53!3!53#5354$!2p xi˘avVZVRyy5yy5yL?a@/    J H5 F5A<29991/<222990@ /]4$)3!53#"3#3!53#53$2ӘXseyy+Vyyy5y9;a@5  s T R T <222<2221222<22<203%%%%#55)j))j))j))jJ####I#### #    104632#"&pNOppONpNppNNoo=?@  i 91906655!=`WC7`=?3@    ii 991<<29906655!%6655! `Y`WC7`C7`1  #/3?Kk@723030121*@ }}*}$F}4:2p0${L C= I17!'73-L12<<2220KSXY"2#"&546"32654&"32654&'2#"&546!3#2#"&546"32654& Z˾˾@77@A88@88@A88A˿NZ;ʿ˾A89@A88dߋe-dLk'$u`k'(/uLk'$u`'(/u`k'(/u``k',u``k',u``',u``k',uVk'2}uVk'2}uVk'2}uFk'8uFk'8uFk'8uF' 1@55A 21/20@  / ` ]%3!53#5!?oyyy5yyf<@ 91290K TKT[X@878YXW]3#'#դffVr@      9999199990@,               ]]5463232653#"&/&#"jf%G.G,$)1njf%G.H-$)1/F=/F=P; (10K TX@878Y!!v V5 6@  120K TK T[X@878Y332673#"&}pccp}5INNIm)N A  _ 10K TX @ 878YK TX  @878Y4632#"&mW<;y0f4-U$AJ)- \T4myf4@ 91<90K TKT[X@878Y 373դxO@,  v sv  ( ( #"<2299991/290353'%#5!#%!53mFTFfLyuyyNu`@# 5  5 A<2<9991/290@  /Z`]]%3!53'7#5!7Do>ٗ@yyy`ixaiLk'6uX-f'VBLk'=uHFf']F@ <210##  X L@&  vsv  % (#"<2299991/22<20]%32+!!53#53#5! !LWpy+HF*7yP yT-j@7" " (p .+% +% +>;%> 2.9999999199990@/`/]! 5432.''%.'7%.#"32654&?*V,A/24d[J//K o^^oo\9m%. ?n4d&>nI7g꾼kk'<u9f'\T`W@)v vvsv / *# ("2<<999991/220Pp]353#5!#!2#!332654&+`/&ppyyyy/VF #q@+ " p $4>32#"&'3!53)_jmYYmj_-pp-bHi實xSQQSHyy10!!/ /@    <291<290 '7HHHG9HHHH ?@*{ k 1290KSXY"535733^eei}^V@@   { k 9991990#56632!53!576654&#"^HPmdHdSI?WrRZ`T{]T_SZ/*N@) )&{+ # )#kk +9991906632#"&'5332654&##532654&#"oX@ifx|PP`VOX]b[)QWNHBP`idH^o]z{POVRPWTD@?FI@'' d''dZ'' dV3k'* juT9h5'J``', uoL'6Xo-D'VBVk'&yuTf'FVk'&yuTf'FT} )a@1 & ( "$ p#l!5'% <>2*<<91/<299990?+++]54&#"3263!5#"32!5!5#5!3#o`inYZmi`b-pp-Di尦ySQ,*QS'x]xxo10!!ot #    104632#"&pNOppONpNppNNoo14u@?-v1uu"v+${p5-+%($,#5  "., #,(4( 529999999991<2220#"#734'&54765#7332#&&#"!!!!32671&45y54Olv(t6YR5p$ w58 w $>Cķw,16wܭs |@  _ _1<20K TKT[X@878YK TK T[KT[X@878YKTKT[KT[X@878Y4632#"&%4632#"&X<;VU<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>: ~1BSax~ & 0 : !""""+"H"e%  0AR^x}  0 9 !""""+"H"`%^ChVjq_8 (Bbcdefghjikmlnoqprsutvwxzy{}|~f+19Rsh/-Ro`Tjo55`^V```V``j``VPZV`V`F55 L/T/TTTq?T? FhF FwFFVT/T7;X1/H%%55^V`PZVF/T/T/T/T/T/TTTTTT F   FVTVTVTVTVT/////9/?'FZFD'9FL/F1==\TV3\BH)55V qV9TbbVL33??/9== 15`5``````VVVFFF Fm=XLHXVT`/VZXXXZVT`X^VT^VTTRoZ1m'   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468c6469""""Vwb#wVNJ|G} r  8 ~  p [  F 3|)qz6XloxUT6 \#x19  !r!!!!!!!!!!""""("5"B"O"\"i"v""""""""""#0#m#$+$%!%U%&'>''(+(n)))*,*Y*+=+, ,T,,-.--.K/ //00/0^01e1122Y2Y2f2s2233334*4N4r444455556G6777B78"8/8<8I8V8c8p8}8888888899A999:2:::;;B;;;;<<<5<===,==> >E>z>?)?:?K?\?i?v???????@A@W@uAAeAB5B`BBCCUCt 79k:;k<$7$9k$:$<$I$W$Y$Z$\$ $ $$$$$$%&%&&%*&%2&%<%d&%g&%&%&%&%%&%&%&%%&%&%&&&''&''9(&)2))2)))$)D)H)R)U)X)b)i)j)k)l)m)n)p)q)r)s)y)z){)|)})~))))))))))**&**<**--a--.k.$.&.2.8.:.<.H.R.X.\.b.d.g.h.p.q.r.s.y.z.{.|.}.~......................../7Y/8/9 /:u/<}/\/h//////}////}/1}1}1122K2292;333333$k383D3H3R3V3bk3h3i3j3k3l3m3n3p3q3r3s3y3z3{3|3}333k3k3333k3k3333344K44457595:5<5D/5\5i/5j/5k/5l/5m/5n/5/5&55555566K66666777777$777D<7F7H7R7Uk7VD7XD7Z7\7b7i<7j<7k<7l<7m<7n<7o7p7q7r7s7y7z7{7|7}7~D7D7D7D7a7a7k7k777a77k7k7k7k777D77D778D88D888$8-8b888899k992929$a929DD9HD9L9RD9X}9\9ba9g9iD9jD9kD9lD9mD9nD9pD9qD9rD9sD9yD9zD9{D9|D9}D9~}9}9}9}99D9D9a9a999D9&9&9999a9a9999::::u:u:$}:DN:HY:L:RY:U:X:\:b}:iN:jN:kN:lN:mN:nN:pY:qY:rY:sY:yY:zY:{Y:|Y:}Y:~::::u:Y:}:}:Y:&:&::::}:}:;;$;&;2;b;d;g;;;;;;;;;;;;<<2<<<<$}<&<Da<HN<L<RN<XN<b}<d<ia<ja<ka<la<ma<na<pN<qN<rN<sN<yN<zN<{N<|N<}N<~N<N<N<N<a<N<}<}<N<}<}<<==IIIIAIINRUkUDUKUKUKUKYYY2YKYKYKYKZYZ2ZKZKZKZK[\<\\K\K\K\Kb7b9kb:b<bIbWbYbZb\b b bbbbbbdde&f}f}ffggKgg9g;hDhhDhhh$h-hbhhhhyz{|}&K9;-7k-7k79k:<IWYZ\ 79k:<IWYZ\ K9;&$-99:9;9<9b99$-b<KKKK2$}&DaHNLRNXNb}diajakalamanapNqNrNsNyNzN{N|N}N~NNNNaN}}N}}-7k-7k79:; serif Bitstream Vera Serif sans-serif Bitstream Vera Sans monospace Bitstream Vera Sans Mono loganalyzer-4.1.5/src/admin/000077500000000000000000000000001277740250400157375ustar00rootroot00000000000000loganalyzer-4.1.5/src/admin/charts.php000066400000000000000000000432131277740250400177370ustar00rootroot00000000000000 Helps administrating LogAnalyzer charts & graphics * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "add" || $_GET['op'] == "delete" ) || ( isset($_GET['miniop']) && ( $_GET['miniop'] == "setenabled" ) ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code // --- Set Helpervariable for non-ADMIN users if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $content['READONLY_ISUSERONLY'] = "disabled"; else $content['READONLY_ISUSERONLY'] = ""; // --- if ( isset($_GET['miniop']) ) { if ( isset($_GET['id']) && isset($_GET['newval']) ) { if ( $_GET['miniop'] == "setenabled" ) { //PreInit these values $content['CHARTID'] = intval(DB_RemoveBadChars($_GET['id'])); $iNewVal = intval(DB_RemoveBadChars($_GET['newval'])); // Perform SQL Query! $sqlquery = "SELECT * " . " FROM " . DB_CHARTS . " WHERE ID = " . $content['CHARTID']; $result = DB_Query($sqlquery); $mychart = DB_GetSingleRow($result, true); if ( isset($mychart['DisplayName']) ) { // Update enabled setting! $result = DB_Query("UPDATE " . DB_CHARTS . " SET chart_enabled = $iNewVal WHERE ID = " . $content['CHARTID']); DB_FreeQuery($result); // Reload Charts from DB LoadChartsFromDatabase(); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_CHARTIDNOTFOUND'], $content['CHARTID'] ); } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_CHARTS_ERROR_SETTINGFLAG']; } } if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWCHART'] = "true"; $content['CHART_FORMACTION'] = "addnewchart"; $content['CHART_SENDBUTTON'] = $content['LN_CHARTS_ADD']; //PreInit these values $content['Name'] = "MyChart"; $content['chart_type'] = CHART_BARS_VERTICAL; CreateChartTypesList($content['chart_type']); $content['chart_enabled'] = 1; $content['CHECKED_ISCHARTENABLED'] = "checked"; $content['chart_width'] = 400; $content['maxrecords'] = 5; $content['showpercent'] = 0; $content['CHECKED_ISSHOWPERCENT'] = ""; $content['chart_defaultfilter'] = ""; // Chart Field $content['chart_field'] = SYSLOG_HOST; CreateChartFields($content['chart_field']); // COMMON Fields $content['userid'] = null; $content['CHECKED_ISUSERONLY'] = ""; $content['CHARTID'] = ""; // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['CHECKED_ISUSERONLY'] = "checked"; } // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) $content['ISGROUPSAVAILABLE'] = true; else $content['ISGROUPSAVAILABLE'] = false; } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWCHART'] = "true"; $content['CHART_FORMACTION'] = "editchart"; $content['CHART_SENDBUTTON'] = $content['LN_CHARTS_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['CHARTID'] = DB_RemoveBadChars($_GET['id']); // Check if exists if ( is_numeric($content['CHARTID']) && isset($content['Charts'][ $content['CHARTID'] ]) ) { // Get Source reference $myChart = $content['Charts'][ $content['CHARTID'] ]; // Copy basic properties $content['Name'] = $myChart['DisplayName']; $content['chart_type'] = $myChart['chart_type']; CreateChartTypesList($content['chart_type']); $content['chart_enabled'] = $myChart['chart_enabled']; if ( $myChart['chart_enabled'] == 1 ) $content['CHECKED_ISCHARTENABLED'] = "checked"; else $content['CHECKED_ISCHARTENABLED'] = ""; $content['chart_width'] = $myChart['chart_width']; $content['maxrecords'] = $myChart['maxrecords']; $content['chart_defaultfilter'] = $myChart['chart_defaultfilter']; $content['showpercent'] = $myChart['showpercent']; if ( $myChart['showpercent'] == 1 ) $content['CHECKED_ISSHOWPERCENT'] = "checked"; else $content['CHECKED_ISSHOWPERCENT'] = ""; // Chart Field $content['chart_field'] = $myChart['chart_field']; CreateChartFields($content['chart_field']); // COMMON Fields $content['userid'] = $myChart['userid']; if ( $content['userid'] != null ) $content['CHECKED_ISUSERONLY'] = "checked"; else $content['CHECKED_ISUSERONLY'] = ""; // --- Can only EDIT own views! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 && $content['userid'] == NULL ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWEDTOEDIT'] ); // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) { // Process All Groups for($i = 0; $i < count($content['SUBGROUPS']); $i++) { if ( $myChart['groupid'] != null && $content['SUBGROUPS'][$i]['mygroupid'] == $myChart['groupid'] ) $content['SUBGROUPS'][$i]['group_selected'] = "selected"; else $content['SUBGROUPS'][$i]['group_selected'] = ""; } // Enable Group Selection $content['ISGROUPSAVAILABLE'] = true; } else $content['ISGROUPSAVAILABLE'] = false; // --- } else { $content['ISEDITORNEWCHART'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = "!" . $content['LN_CHARTS_ERROR_INVALIDORNOTFOUNDID']; } } else { $content['ISEDITORNEWCHART'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_CHARTS_ERROR_INVALIDID']; } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['CHARTID'] = DB_RemoveBadChars($_GET['id']); // Get UserInfo $result = DB_Query("SELECT DisplayName FROM " . DB_CHARTS . " WHERE ID = " . $content['CHARTID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['DisplayName']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_IDNOTFOUND'], $content['CHARTID'] ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_CHARTS_WARNDELETESEARCH'], $myrow['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_CHARTS . " WHERE ID = " . $content['CHARTID'] ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_DELCHART'], $content['CHARTID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_HASBEENDEL'], $myrow['DisplayName'] ) , "charts.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_CHARTS_ERROR_INVALIDORNOTFOUNDID']; } } } if ( isset($_POST['op']) ) { // Read parameters first! if ( isset($_POST['id']) ) { $content['CHARTID'] = intval(DB_RemoveBadChars($_POST['id'])); } else {$content['CHARTID'] = -1; } if ( isset($_POST['Name']) ) { $content['Name'] = DB_RemoveBadChars($_POST['Name']); } else {$content['Name'] = ""; } if ( isset($_POST['chart_enabled']) ) { $content['chart_enabled'] = intval(DB_RemoveBadChars($_POST['chart_enabled'])); } else {$content['chart_enabled'] = 0; } if ( isset($_POST['chart_type']) ) { $content['chart_type'] = intval(DB_RemoveBadChars($_POST['chart_type'])); } if ( isset($_POST['chart_width']) ) { $content['chart_width'] = intval(DB_RemoveBadChars($_POST['chart_width'])); } else {$content['chart_width'] = 400; } if ( isset($_POST['chart_field']) ) { $content['chart_field'] = DB_RemoveBadChars($_POST['chart_field']); } if ( isset($_POST['maxrecords']) ) { $content['maxrecords'] = intval(DB_RemoveBadChars($_POST['maxrecords'])); } if ( isset($_POST['showpercent']) ) { $content['showpercent'] = intval(DB_RemoveBadChars($_POST['showpercent'])); } else {$content['showpercent'] = 0; } if ( isset($_POST['chart_defaultfilter']) ) { $content['chart_defaultfilter'] = DB_RemoveBadChars($_POST['chart_defaultfilter']); } // User & Group handeled specially if ( isset ($_POST['isuseronly']) ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; // Either user or group not both! } else { // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; } else { $content['userid'] = "null"; if ( isset ($_POST['groupid']) && $_POST['groupid'] != -1 ) $content['groupid'] = intval($_POST['groupid']); else $content['groupid'] = "null"; } } // --- Check mandotary values if ( $content['Name'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_CHARTS_NAME'] ); } else if ( !isset($content['chart_type']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_CHART_TYPE'] ); } else if ( !isset($content['chart_field']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_CHART_FIELD'] ); } // --- Now ADD/EDIT do the processing! if ( !isset($content['ISERROR']) ) { // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewchart" ) { // Add custom search now! $sqlquery = "INSERT INTO " . DB_CHARTS . " (DisplayName, chart_enabled, chart_type, chart_width, chart_field, chart_defaultfilter, maxrecords, showpercent, userid, groupid) VALUES ('" . $content['Name'] . "', " . $content['chart_enabled'] . ", " . $content['chart_type'] . ", " . $content['chart_width'] . ", '" . $content['chart_field'] . "', '" . $content['chart_defaultfilter'] . "', " . $content['maxrecords'] . ", " . $content['showpercent'] . ", " . $content['userid'] . ", " . $content['groupid'] . " )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_CHARTS_HASBEENADDED'], DB_StripSlahes($content['Name']) ) , "charts.php" ); } else if ( $_POST['op'] == "editchart" ) { $result = DB_Query("SELECT ID FROM " . DB_CHARTS . " WHERE ID = " . $content['CHARTID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_IDNOTFOUND'], $content['CHARTID'] ); } else { $sqlquery = "UPDATE " . DB_CHARTS . " SET DisplayName = '" . $content['Name'] . "', chart_enabled = " . $content['chart_enabled'] . ", chart_type = " . $content['chart_type'] . ", chart_width = " . $content['chart_width'] . ", chart_field = '" . $content['chart_field'] . "', chart_defaultfilter = '" . $content['chart_defaultfilter'] . "', maxrecords = " . $content['maxrecords'] . ", showpercent = " . $content['showpercent'] . ", userid = " . $content['userid'] . ", groupid = " . $content['groupid'] . " WHERE ID = " . $content['CHARTID']; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_CHARTS_HASBEENEDIT'], DB_StripSlahes($content['Name']) ) , "charts.php" ); } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Searches $content['LISTCHARTS'] = "true"; // Copy Sources array for further modifications $content['CHARTS'] = $content['Charts']; // --- Process Sources $i = 0; // Help counter! foreach ($content['CHARTS'] as &$myChart ) { // --- Set Image for Type // NonNUMERIC are config files Sources, can not be editied if ( is_numeric($myChart['ID']) ) { // Allow EDIT $myChart['ActionsAllowed'] = true; if ( $myChart['userid'] != null ) { $myChart['ChartAssignedToImage'] = $content["MENU_ADMINUSERS"]; $myChart['ChartAssignedToText'] = $content["LN_GEN_USERONLY"]; } else if ( $myChart['groupid'] != null ) { $myChart['ChartAssignedToImage'] = $content["MENU_ADMINGROUPS"]; $myChart['ChartAssignedToText'] = GetAndReplaceLangStr( $content["LN_GEN_GROUPONLYNAME"], $myChart['groupname'] ); // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $myChart['ActionsAllowed'] = false; } else { $myChart['ChartAssignedToImage'] = $content["MENU_GLOBAL"]; $myChart['ChartAssignedToText'] = $content["LN_GEN_GLOBAL"]; // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $myChart['ActionsAllowed'] = false; } } else { // Disallow EDIT $myChart['ActionsAllowed'] = false; $myChart['ChartAssignedToImage'] = $content["MENU_INTERNAL"]; $myChart['ChartAssignedToText'] = $content["LN_GEN_CONFIGFILE"]; } // --- // --- Set SourceType if ( $myChart['chart_type'] == CHART_CAKE ) { $myChart['ChartTypeImage'] = $content["MENU_CHART_CAKE"]; $myChart['ChartTypeText'] = $content["LN_CHART_TYPE_CAKE"]; } else if ( $myChart['chart_type'] == CHART_BARS_VERTICAL ) { $myChart['ChartTypeImage'] = $content["MENU_CHART_BARSVERT"]; $myChart['ChartTypeText'] = $content["LN_CHART_TYPE_BARS_VERTICAL"]; } else if ( $myChart['chart_type'] == CHART_BARS_HORIZONTAL ) { $myChart['ChartTypeImage'] = $content["MENU_CHART_BARSHORI"]; $myChart['ChartTypeText'] = $content["LN_CHART_TYPE_BARS_HORIZONTAL"]; } // --- // --- Set enabled or disabled state if ( $myChart['chart_enabled'] == 1 ) { $myChart['ChartEnabledImage'] = $content["MENU_SELECTION_ENABLED"]; $myChart['set_enabled'] = 0; } else { $myChart['ChartEnabledImage'] = $content["MENU_SELECTION_DISABLED"]; $myChart['set_enabled'] = 1; } // --- // --- Set Chart default Filterstring if ( strlen($myChart['chart_defaultfilter']) > 0 ) $myChart['chart_defaultfilter_urldecoded'] = urlencode($myChart['chart_defaultfilter']); else $myChart['chart_defaultfilter_urldecoded'] = ""; // --- // --- Set CSS Class if ( $i % 2 == 0 ) $myChart['cssclass'] = "line1"; else $myChart['cssclass'] = "line2"; $i++; // --- // --- Check if Enable/Disable Button was clicked and add Autofocus code! if ( isset($content['CHARTID']) && $content['CHARTID'] == $myChart['ID'] ) AddWindowLoadFocus("chartenablebutton" . $myChart['ID']); // --- } // --- } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_CHARTOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_charts.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/dbmappings.php000066400000000000000000000441151277740250400206010ustar00rootroot00000000000000 Helps administrating custom database mappings * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- BEGIN Custom Code // Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); // Init helper variable to empty string $content['FormUrlAddOP'] = ""; if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWDBMP'] = "true"; $content['DBMP_FORMACTION'] = "addnewdbmp"; $content['DBMP_SENDBUTTON'] = $content['LN_DBMP_ADD']; //PreInit these values $content['DisplayName'] = ""; $content['DBMPID'] = ""; $content['FormUrlAddOP'] = "?op=add"; } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWDBMP'] = "true"; $content['DBMP_FORMACTION'] = "editdbmp"; $content['DBMP_SENDBUTTON'] = $content['LN_DBMP_EDIT']; // Copy Views array for further modifications $content['DBMP'] = $dbmapping; // View must be loaded as well already! if ( isset($_GET['dbmpid']) && isset($content['DBMP'][$_GET['dbmpid']]) ) { //PreInit these values $content['DBMPID'] = DB_RemoveBadChars($_GET['dbmpid']); if ( isset($content['DBMP'][ $content['DBMPID'] ]) ) { //Set the FormAdd URL $content['FormUrlAddOP'] = "?op=edit&dbmpid=" . $content['DBMPID']; $mymapping = $content['DBMP'][ $content['DBMPID'] ]; $content['DisplayName'] = $mymapping['DisplayName'] ; $content['SUBMAPPINGS'] = $mymapping['DBMAPPINGS']; } else { $content['ISEDITORNEWDBMP'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_IDNOTFOUND'], $content['DBMPID'] ); } } else { $content['ISEDITORNEWDBMP'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_INVALIDID'], isset($_GET['dbmpid']) ? $_GET['dbmpid'] : "" ); } } else if ($_GET['op'] == "delete") { if ( isset($_GET['dbmpid']) ) { //PreInit these values $content['DBMPID'] = DB_RemoveBadChars($_GET['dbmpid']); // Get UserInfo $result = DB_Query("SELECT DisplayName FROM " . DB_MAPPINGS . " WHERE ID = " . $content['DBMPID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['DisplayName']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_IDNOTFOUND'], $content['DBMPID'] ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_DBMP_WARNDELETEMAPPING'], $myrow['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_MAPPINGS . " WHERE ID = " . $content['DBMPID'] ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_DELSEARCH'], $content['DBMPID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_DBMP_ERROR_HASBEENDEL'], $myrow['DisplayName'] ) , "dbmappings.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_DBMP_ERROR_INVALIDID']; } } } // --- Additional work todo for the edit view if ( isset($content['ISEDITORNEWDBMP']) && $content['ISEDITORNEWDBMP'] ) { // If Columns are send using POST we use them, otherwise we try to use from the view itself, if available if ( isset($_POST['Mappings']) ) $AllMappings = $_POST['Mappings']; else if ( isset($content['SUBMAPPINGS']) ) $AllMappings = $content['SUBMAPPINGS']; // Read Columns from FORM data! if ( isset($AllMappings) ) { // --- Read Columns from Formdata if ( is_array($AllMappings) ) { // Copy columns ID's foreach ($AllMappings as $myColKey => $myFieldName) // $myColKey) { if ( !is_numeric($myColKey) ) $content['SUBMAPPINGS'][$myColKey] = array( 'MappingFieldID' => $myColKey, 'MappingDbFieldName' => $myFieldName ); else $content['SUBMAPPINGS'][$myFieldName] = array( 'MappingFieldID' => $myFieldName ); } } else // One element only $content['SUBMAPPINGS'][$AllColumns]['MappingFieldID'] = $AllColumns; // --- // --- Process Columns for display $i = 0; // Help counter! foreach ($content['SUBMAPPINGS'] as $key => &$myColumn ) { // Set Fieldcaption if ( isset($fields[$key]) && isset($fields[$key]['FieldCaption']) ) $myColumn['MappingCaption'] = $fields[$key]['FieldCaption']; else $myColumn['MappingCaption'] = $key; // Append Internal FieldID $myColumn['MappingInternalID'] = $fields[$key]['FieldDefine']; // Set Mapping Fieldname if ( isset( $_POST[ $myColumn['MappingFieldID'] ]) ) $myColumn['MappingDbFieldName'] = $_POST[ $myColumn['MappingFieldID'] ]; else if ( !isset($myColumn['MappingDbFieldName']) && strlen($myColumn['MappingDbFieldName']) > 0) $myColumn['MappingDbFieldName'] = ""; // --- Set CSS Class if ( $i % 2 == 0 ) $myColumn['colcssclass'] = "line1"; else $myColumn['colcssclass'] = "line2"; $i++; // --- } // --- } // --- Copy fields data array $content['FIELDS'] = $fields; // removed already added fields if ( isset($content['SUBMAPPINGS']) ) { foreach ($content['SUBMAPPINGS'] as $key => &$myColumn ) { if ( isset($content['FIELDS'][$key]) ) unset($content['FIELDS'][$key]); } } // set fieldcaption foreach ($content['FIELDS'] as $key => &$myField ) { // Set Fieldcaption if ( isset($myField['FieldCaption']) ) $myField['FieldCaption'] = $myField['FieldCaption']; else $myField['FieldCaption'] = $key; // Append Internal FieldID $myField['FieldCaption'] .= " (" . $fields[$key]['FieldDefine'] . ")"; } // --- } // --- // --- Process POST Form Data if ( isset($_POST['op']) ) { if ( isset ($_POST['dbmpid']) ) { $content['DBMPID'] = DB_RemoveBadChars($_POST['dbmpid']); } else {$content['DBMPID'] = ""; } if ( isset ($_POST['DisplayName']) ) { $content['DisplayName'] = DB_StripSlahes($_POST['DisplayName']); } else {$content['DisplayName'] = ""; } // --- Check mandotary values if ( $content['DisplayName'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_DBMP_ERROR_DISPLAYNAMEEMPTY']; } // --- if ( !isset($content['ISERROR']) ) { // Check subop's first! if ( isset($_POST['subop']) ) { if ( isset($_POST['newmapping']) ) { // Get NewColID $szColId = DB_RemoveBadChars($_POST['newmapping']); // Add a new Column into our list! if ( $_POST['subop'] == $content['LN_DBMP_ADDMAPPING'] && isset($_POST['newmapping']) ) { // Add New entry into columnlist $content['SUBMAPPINGS'][$szColId]['MappingFieldID'] = $szColId; // Set Internal FieldID $content['SUBMAPPINGS'][$szColId]['MappingInternalID'] = $fields[$szColId]['FieldDefine']; // Set default for DbFieldName $content['SUBMAPPINGS'][$szColId]['MappingDbFieldName'] = ""; // Set Fieldcaption if ( isset($fields[$szColId]['FieldCaption']) ) $content['SUBMAPPINGS'][$szColId]['MappingCaption'] = $fields[$szColId]['FieldCaption']; else $content['SUBMAPPINGS'][$szColId]['MappingCaption'] = $szColId; // Set CSSClass $content['SUBMAPPINGS'][$szColId]['colcssclass'] = count($content['SUBMAPPINGS']) % 2 == 0 ? "line1" : "line2"; // Remove from fields list as well if ( isset($content['FIELDS'][$szColId]) ) unset($content['FIELDS'][$szColId]); } } } else if ( isset($_POST['subop_edit']) ) { // Actually nothing todo ;), the edit is performed automatically when the SUBMAPPINGS array is created. } else if ( isset($_POST['subop_delete']) ) { // Get Column ID $szColId = DB_RemoveBadChars($_POST['subop_delete']); // Remove Entry from Columnslist if ( isset($content['SUBMAPPINGS'][$szColId]) ) unset($content['SUBMAPPINGS'][$szColId]); // Add removed entry to field list $content['FIELDS'][$szColId] = $fields[$szColId]; // Set Fieldcaption if ( isset($content['FIELDS'][$szColId]['FieldCaption']) ) $content['FIELDS'][$szColId]['FieldCaption'] = $content['FIELDS'][$szColId]['FieldCaption']; else $content['FIELDS'][$szColId]['FieldCaption'] = $szColId; // Append Internal FieldID $content['FIELDS'][$szColId]['FieldCaption'] .= " (" . $content['FIELDS'][$szColId]['FieldDefine'] . ")"; } else if ( isset($_POST['subop_moveup']) ) { // Get Column ID $szColId = DB_RemoveBadChars($_POST['subop_moveup']); // --- Move Entry one UP in Columnslist // Find the entry in the array $iArrayNum = 0; foreach ($content['SUBMAPPINGS'] as $key => &$myColumn ) { if ( $key == $szColId ) break; $iArrayNum++; } // If found move up if ( $iArrayNum > 0 ) { // Extract Entry from the array $EntryTwoMove = array_slice($content['SUBMAPPINGS'], $iArrayNum, 1); // Unset Entry from the array unset( $content['SUBMAPPINGS'][$szColId] ); // Splice the array order! array_splice($content['SUBMAPPINGS'], $iArrayNum-1, 0, $EntryTwoMove); } // --- // Add Focus to MoveUp Button again AddWindowLoadFocus("subop_moveup_" . $szColId); } else if ( isset($_POST['subop_movedown']) ) { // Get Column ID $szColId = DB_RemoveBadChars($_POST['subop_movedown']); // --- Move Entry one DOWN in Columnslist // Find the entry in the array $iArrayNum = 0; foreach ($content['SUBMAPPINGS'] as $key => &$myColumn ) { if ( $key == $szColId ) break; $iArrayNum++; } // If found move down if ( $iArrayNum < count($content['SUBMAPPINGS']) ) { // Extract Entry from the array $EntryTwoMove = array_slice($content['SUBMAPPINGS'], $iArrayNum, 1); // Unset Entry from the array unset( $content['SUBMAPPINGS'][$szColId] ); // Splice the array order! array_splice($content['SUBMAPPINGS'], $iArrayNum+1, 0, $EntryTwoMove); } // --- // Add Focus to MoveDown Button again AddWindowLoadFocus("subop_movedown_" . $szColId); } else // Now SUBOP means normal processing! { // Now we convert fr DB insert! $content['DisplayName'] = DB_RemoveBadChars($_POST['DisplayName']); // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewdbmp" ) { // Create Columnlist comma seperated! if ( isset($_POST['Mappings']) && is_array($_POST['Mappings']) ) { // Copy columns ID's foreach ($_POST['Mappings'] as $myColKey) { if ( isset($_POST[$myColKey]) && strlen($_POST[$myColKey]) > 0 ) { // Get FieldName $myMappingFieldName = DB_StripSlahes($_POST[$myColKey]); if ( isset($content['SUBMAPPINGS']) ) $content['SUBMAPPINGS'] .= "," . $myColKey; else $content['SUBMAPPINGS'] = $myColKey; // Append Fieldname $content['SUBMAPPINGS'] .= "=>" . $myMappingFieldName; } else { // Report error! $content['ISEDITORNEWDBMP'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_MISSINGFIELDNAME'], $myColKey ); // Abort loop break; } } // Only perform if no error occured if ( !isset($content['ISERROR']) ) { // Add custom search now! $sqlquery = "INSERT INTO " . DB_MAPPINGS. " (DisplayName, Mappings) VALUES ('" . $content['DisplayName'] . "', '" . $content['SUBMAPPINGS'] . "' )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_DBMP_HASBEENADDED'], DB_StripSlahes($content['DisplayName']) ) , "dbmappings.php" ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_DBMP_ERROR_NOCOLUMNS']; } } else if ( $_POST['op'] == "editdbmp" ) { // Now we convert fr DB insert! $content['DisplayName'] = DB_RemoveBadChars($_POST['DisplayName']); $result = DB_Query("SELECT ID FROM " . DB_MAPPINGS . " WHERE ID = " . $content['DBMPID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_IDNOTFOUND'], $content['DBMPID'] ); } else { // Create Columnlist comma seperated! if ( isset($_POST['Mappings']) && is_array($_POST['Mappings']) ) { // Copy columns ID's unset($content['SUBMAPPINGS']); foreach ($_POST['Mappings'] as $myColKey) { if ( isset($_POST[$myColKey]) && strlen($_POST[$myColKey]) > 0 ) { // Get FieldName $myMappingFieldName = DB_StripSlahes($_POST[$myColKey]); if ( isset($content['SUBMAPPINGS']) ) $content['SUBMAPPINGS'] .= "," . $myColKey; else $content['SUBMAPPINGS'] = $myColKey; // Append Fieldname $content['SUBMAPPINGS'] .= "=>" . $myMappingFieldName; } else { // Report error! $content['ISEDITORNEWDBMP'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBMP_ERROR_MISSINGFIELDNAME'], $myColKey ); // Abort loop break; } } // Only perform if no error occured if ( !isset($content['ISERROR']) ) { // Edit the Search Entry now! $result = DB_Query("UPDATE " . DB_MAPPINGS . " SET DisplayName = '" . $content['DisplayName'] . "', Mappings = '" . $content['SUBMAPPINGS'] . "' WHERE ID = " . $content['DBMPID']); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_DBMP_HASBEENEDIT'], DB_StripSlahes($content['DisplayName']) ) , "dbmappings.php" ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_DBMP_ERROR_NOCOLUMNS']; } } } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Searches $content['LISTDBMAPPINGS'] = "true"; // Copy Views array for further modifications $content['DBMP'] = $dbmapping; // --- Process Views $i = 0; // Help counter! foreach ($content['DBMP'] as &$myMappings ) { // So internal Views can not be edited but seen if ( is_numeric($myMappings['ID']) ) { $myMappings['ActionsAllowed'] = true; // --- Set Image for Type $myMappings['ViewTypeImage'] = $content["MENU_GLOBAL"]; $myMappings['ViewTypeText'] = $content["LN_GEN_GLOBAL"]; // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $myMappings['ActionsAllowed'] = false; // --- } else { $myMappings['ActionsAllowed'] = false; $myMappings['ViewTypeImage'] = $content["MENU_INTERNAL"]; $myMappings['ViewTypeText'] = $content["LN_GEN_INTERNAL"]; } // --- Add DisplayNames to columns $iBegin = true; foreach ($myMappings['DBMAPPINGS'] as $myKey => &$myMapping ) { // Set Fieldcaption if ( isset($fields[$myKey]) && isset($fields[$myKey]['FieldCaption']) ) $myMappings['MYMAPPINGS'][$myKey]['FieldCaption'] = $fields[$myKey]['FieldCaption']; else $myMappings['MYMAPPINGS'][$myKey]['FieldCaption'] = $myKey; // Set other fields $myMappings['MYMAPPINGS'][$myKey]['FieldID'] = $myKey; $myMappings['MYMAPPINGS'][$myKey]['FieldMapping'] = $myMapping; // Set seperator if ( $iBegin ) { $myMappings['MYMAPPINGS'][$myKey]['CaptionSeperator'] = ""; $iBegin = false; } else $myMappings['MYMAPPINGS'][$myKey]['CaptionSeperator'] = ", "; } // --- // --- Set CSS Class if ( $i % 2 == 0 ) $myMappings['cssclass'] = "line1"; else $myMappings['cssclass'] = "line2"; $i++; // --- } // --- } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_DBMAPPINGOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_dbmappings.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/fields.php000066400000000000000000000275631277740250400177330ustar00rootroot00000000000000 Helps administrating fields * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- BEGIN Custom Code // Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWFIELD'] = "true"; $content['FIELD_FORMACTION'] = "addnewfield"; $content['FIELD_SENDBUTTON'] = $content['LN_FIELDS_ADD']; //PreInit these values $content['FieldID'] = ""; $content['FieldDefine'] = "SYSLOG_"; $content['FieldCaption'] = ""; // Field Caption $content['SearchField'] = ""; // Should be set to FieldID for now! $content['SearchOnline'] = false; // If we want to be able to search online $content['CHECKED_SEARCHONLINE'] = ""; $content['FieldType'] = FILTER_TYPE_STRING; CreateFieldTypesList($content['FieldType']); $content['FieldAlign'] = ALIGN_CENTER; CreateFieldAlignmentList($content['FieldAlign']); $content['DefaultWidth'] = "50"; $content['Trunscate'] = "30"; // Not supported yet! $content['Sortable'] = false; // Not supported yet! } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWFIELD'] = "true"; $content['FIELD_FORMACTION'] = "editfield"; $content['FIELD_SENDBUTTON'] = $content['LN_FIELDS_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['FieldID'] = DB_RemoveBadChars($_GET['id']); if ( isset($fields[$content['FieldID']]['FieldID']) ) { $content['FieldDefine'] = $fields[$content['FieldID']]['FieldDefine']; $content['FieldCaption'] = $fields[$content['FieldID']]['FieldCaption']; $content['SearchField'] = $fields[$content['FieldID']]['SearchField']; $content['SearchOnline'] = $fields[$content['FieldID']]['SearchOnline']; if ( $content['SearchOnline'] ) { $content['CHECKED_SEARCHONLINE'] = "checked"; } else { $content['CHECKED_SEARCHONLINE'] = ""; } $content['FieldType'] = $fields[$content['FieldID']]['FieldType']; CreateFieldTypesList($content['FieldType']); $content['FieldAlign'] = $fields[$content['FieldID']]['FieldAlign']; CreateFieldAlignmentList($content['FieldAlign']); $content['DefaultWidth'] = $fields[$content['FieldID']]['DefaultWidth']; // Unused fields yet $content['Trunscate'] = $fields[$content['FieldID']]['Trunscate']; $content['Sortable'] = $fields[$content['FieldID']]['Sortable']; if ( $content['Sortable'] ) { $content['CHECKED_SORTABLE'] = "checked"; } else { $content['CHECKED_SORTABLE'] = ""; } // Some fields cannot be edited, if this is an internal field! if ( $fields[$content['FieldID']]['IsInternalField'] ) $content['DisableInternalFields'] = "disabled"; else $content['DisableInternalFields'] = ""; } else { $content['ISEDITORNEWFIELD'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_FIELDS_ERROR_IDNOTFOUND'], $content['FieldID'] ); } } else { $content['ISEDITORNEWFIELD'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_FIELDS_ERROR_INVALIDID']; } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['FieldID'] = DB_RemoveBadChars($_GET['id']); // Get UserInfo $result = DB_Query("SELECT FieldCaption FROM " . DB_FIELDS . " WHERE FieldID = '" . $content['FieldID'] . "'"); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['FieldCaption']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_FIELDS_ERROR_IDNOTFOUND'], $content['FieldID'] ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_FIELDS_WARNDELETESEARCH'], $myrow['FieldCaption'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_FIELDS . " WHERE FieldID = '" . $content['FieldID'] . "'" ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_FIELDS_ERROR_DELSEARCH'], $content['FieldID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_FIELDS_ERROR_HASBEENDEL'], $myrow['FieldCaption'] ) , "fields.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_FIELDS_ERROR_INVALIDID']; } } } if ( isset($_POST['op']) ) { //print_r ( $_POST ); // Get FieldID if ( isset($_POST['Newid']) ) { $content['FieldID'] = DB_RemoveBadChars($_POST['Newid']); } else if ( isset($_POST['id']) ) { $content['FieldID'] = DB_RemoveBadChars($_POST['id']); } else { $content['FieldID'] = ""; } // textfields if ( isset($_POST['FieldCaption']) ) { $content['FieldCaption'] = DB_RemoveBadChars($_POST['FieldCaption']); } else {$content['FieldCaption'] = ""; } if ( isset($_POST['SearchField']) ) { $content['SearchField'] = DB_RemoveBadChars($_POST['SearchField']); } else {$content['SearchField'] = ""; } if ( isset($_POST['NewFieldDefine']) ) { $content['FieldDefine'] = DB_RemoveBadChars($_POST['NewFieldDefine']); } else if ( isset($_POST['FieldDefine']) ) { $content['FieldDefine'] = DB_RemoveBadChars($_POST['FieldDefine']); } else { $content['FieldDefine'] = ""; } CreateFieldAlignmentList(0); if ( isset($_POST['FieldAlign']) && isset($content['ALIGMENTS'][$_POST['FieldAlign']]) ) { $content['FieldAlign'] = $_POST['FieldAlign']; } else {$content['FieldAlign'] = ALIGN_CENTER; } // number fields if ( isset($_POST['DefaultWidth']) ) { $content['DefaultWidth'] = intval(DB_RemoveBadChars($_POST['DefaultWidth'])); } else {$content['DefaultWidth'] = 50; } // NOT USED YET if ( isset ($_POST['Trunscate']) ) { $content['Trunscate'] = intval(DB_RemoveBadChars($_POST['Trunscate'])); } else {$content['Trunscate'] = 30; } CreateFieldTypesList(0); if ( isset($_POST['NewFieldType']) && isset($content['FILTERTYPES'][$_POST['NewFieldType']]) ) { $content['FieldType'] = intval($_POST['NewFieldType']); } else if ( isset($_POST['FieldType']) && isset($content['FILTERTYPES'][$_POST['FieldType']]) ) { $content['FieldType'] = intval($_POST['FieldType']); } else { $content['FieldType'] = FILTER_TYPE_STRING; } // Checkbox fields if ( isset($_POST['SearchOnline']) ) { $content['SearchOnline'] = "true"; } else { $content['SearchOnline'] = "false"; } // NOT USED YET if ( isset ($_POST['Sortable']) ) { $content['Sortable'] = true; } else {$content['Sortable'] = false; } // --- Check mandotary values if ( $content['FieldID'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_FIELDS_ERROR_FIELDIDEMPTY']; } else if ( $content['FieldCaption'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_FIELDS_ERROR_FIELDCAPTIONEMPTY']; } else if ( $content['SearchField'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_FIELDS_ERROR_SEARCHFIELDEMPTY']; } else if ( $content['FieldDefine'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_FIELDS_ERROR_FIELDDEFINEEMPTY']; } // --- if ( !isset($content['ISERROR']) ) { // Everything was alright, go and check if the entry exists! $result = DB_Query("SELECT FieldID FROM " . DB_FIELDS . " WHERE FieldID = '" . $content['FieldID'] . "'"); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['FieldID']) ) { // Add custom Field now! $sqlquery = "INSERT INTO " . DB_FIELDS . " (FieldID, FieldCaption, FieldDefine, SearchField, FieldAlign, DefaultWidth, FieldType, SearchOnline) VALUES ( '" . $content['FieldID'] . "', '" . $content['FieldCaption'] . "', '" . $content['FieldDefine'] . "', '" . $content['SearchField'] . "', '" . $content['FieldAlign'] . "', " . $content['DefaultWidth'] . ", " . $content['FieldType'] . ", " . $content['SearchOnline'] . " )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_FIELDS_HASBEENADDED'], DB_StripSlahes($content['FieldCaption']) ) , "fields.php" ); } else { // Edit the Search Entry now! $result = DB_Query("UPDATE " . DB_FIELDS . " SET FieldCaption = '" . $content['FieldCaption'] . "', FieldDefine = '" . $content['FieldDefine'] . "', SearchField = '" . $content['SearchField'] . "', FieldAlign = '" . $content['FieldAlign'] . "', DefaultWidth = " . $content['DefaultWidth'] . ", FieldType = " . $content['FieldType'] . ", SearchOnline = " . $content['SearchOnline'] . " WHERE FieldID = '" . $content['FieldID'] . "'"); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_FIELDS_HASBEENEDIT'], DB_StripSlahes($content['FieldCaption']) ) , "fields.php" ); } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Searches $content['LISTFIELDS'] = "true"; // Copy Search array for further modifications $content['FIELDS'] = $fields; $i = 0; // Help counter! foreach ($content['FIELDS'] as &$myField ) { // Allow Delete Operation if ( $myField['IsInternalField'] && $myField['FieldFromDB'] ) { $myField['AllowDelete'] = true; $myField['DELETEIMG'] = $content['MENU_DELETE_FROMDB']; } else if ( $myField['FieldFromDB'] ) { $myField['AllowDelete'] = true; $myField['DELETEIMG'] = $content['MENU_DELETE']; } // --- Set CSS Class if ( $i % 2 == 0 ) $myField['cssclass'] = "line1"; else $myField['cssclass'] = "line2"; $i++; // --- } // --- } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= $content['LN_ADMINMENU_FIELDOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_fields.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/groups.php000066400000000000000000000413361277740250400177760ustar00rootroot00000000000000 Helps administrating groups * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "add" || $_GET['op'] == "delete" || $_GET['op'] == "adduser" || $_GET['op'] == "removeuser" ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code // Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWGROUP'] = "true"; $content['GROUP_FORMACTION'] = "addnewgroup"; $content['GROUP_SENDBUTTON'] = $content['LN_GROUP_ADD']; //PreInit these values $content['groupname'] = ""; $content['groupdescription'] = ""; } else if ($_GET['op'] == "adduser" && isset($_GET['id']) ) { //PreInit these values $content['GROUPID'] = intval( DB_RemoveBadChars($_GET['id']) ); // Set Mode to add $content['ISADDUSER'] = "true"; $content['GROUP_FORMACTION'] = "adduser"; $content['GROUP_SENDBUTTON'] = $content['LN_GROUP_ADDUSER']; // --- Get Groupname $sqlquery = "SELECT " . DB_GROUPS . ".groupname " . " FROM " . DB_GROUPS . " WHERE " . DB_GROUPS . ".id = " . $content['GROUPID']; $result = DB_Query($sqlquery); $tmparray = DB_GetSingleRow($result, true); if ( isset($tmparray) ) { // Copy Groupname $content['GROUPNAME'] = $tmparray['groupname']; // --- Get Group Members $sqlquery = "SELECT " . DB_GROUPMEMBERS. ".userid " . " FROM " . DB_GROUPMEMBERS . " WHERE " . DB_GROUPMEMBERS . ".groupid = " . $content['GROUPID']; $result = DB_Query($sqlquery); $tmparray = DB_GetAllRows($result, true); if ( count($tmparray) > 0 ) { // Add UserID's to where clause! foreach ($tmparray as $datarow) { if ( isset($whereclause) ) $whereclause .= ", " . $datarow['userid']; else $whereclause = " WHERE " . DB_USERS . ".id NOT IN (" . $datarow['userid']; } // Finish whereclause $whereclause .= ") "; } else $whereclause = ""; // --- // --- Create LIST of Users which are available for selection $sqlquery = "SELECT " . DB_USERS. ".ID as userid, " . DB_USERS. ".username " . " FROM " . DB_USERS . " LEFT OUTER JOIN (" . DB_GROUPMEMBERS . ") ON (" . DB_GROUPMEMBERS . ".userid=" . DB_USERS . ".ID) " . $whereclause . " ORDER BY " . DB_USERS . ".username"; $result = DB_Query($sqlquery); $content['SUBUSERS'] = DB_GetAllRows($result, true); if ( count($content['SUBUSERS']) <= 0 ) { // Disable FORM: $content['ISADDUSER'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERRORNOMOREUSERS'], $content['GROUPNAME'] ); } } else { // Disable FORM: $content['ISADDUSER'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERROR_IDNOTFOUND'], $content['GROUPID'] ); } // --- } else if ($_GET['op'] == "removeuser" && isset($_GET['id']) ) { //PreInit these values $content['GROUPID'] = intval( DB_RemoveBadChars($_GET['id']) ); // Set Mode to add $content['ISREMOVEUSER'] = "true"; $content['GROUP_FORMACTION'] = "removeuser"; $content['GROUP_SENDBUTTON'] = $content['LN_GROUP_USERDELETE']; // --- Get Groupname $sqlquery = "SELECT " . DB_GROUPS . ".groupname " . " FROM " . DB_GROUPS . " WHERE " . DB_GROUPS . ".id = " . $content['GROUPID']; $result = DB_Query($sqlquery); $tmparray = DB_GetSingleRow($result, true); if ( isset($tmparray) ) { // Copy Groupname $content['GROUPNAME'] = $tmparray['groupname']; // --- Get Group Members $sqlquery = "SELECT " . DB_GROUPMEMBERS. ".userid, " . DB_USERS. ".username " . " FROM " . DB_GROUPMEMBERS . " INNER JOIN (" . DB_USERS . ") ON (" . DB_GROUPMEMBERS . ".userid=" . DB_USERS . ".ID) " . " WHERE " . DB_GROUPMEMBERS . ".groupid = " . $content['GROUPID']; $result = DB_Query($sqlquery); $content['SUBRMUSERS'] = DB_GetAllRows($result, true); if ( count($content['SUBRMUSERS']) <= 0 ) { // Disable FORM: $content['ISREMOVEUSER'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERRORNOUSERSINGROUP'], $content['GROUPNAME'] ); } } else { // Disable FORM: $content['ISREMOVEUSER'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERROR_IDNOTFOUND'], $content['GROUPID'] ); } } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWGROUP'] = "true"; $content['GROUP_FORMACTION'] = "editgroup"; $content['GROUP_SENDBUTTON'] = $content['LN_GROUP_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['GROUPID'] = DB_RemoveBadChars($_GET['id']); $sqlquery = "SELECT * " . " FROM " . DB_GROUPS . " WHERE ID = " . $content['GROUPID']; $result = DB_Query($sqlquery); $myuser = DB_GetSingleRow($result, true); if ( isset($myuser['groupname']) ) { $content['GROUPID'] = $myuser['ID']; $content['groupname'] = $myuser['groupname']; $content['groupdescription'] = $myuser['groupdescription']; } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERROR_IDNOTFOUND'], $content['GROUPID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_GROUP_ERROR_INVALIDGROUP']; } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['GROUPID'] = DB_RemoveBadChars($_GET['id']); // Get GroupInfo $result = DB_Query("SELECT groupname FROM " . DB_GROUPS . " WHERE ID = " . $content['GROUPID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['groupname']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERROR_IDNOTFOUND'], $content['USERID'] ); } else { // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_GROUP_WARNDELETEGROUP'], $myrow['groupname'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // Delete User objects! PerformSQLDelete( "DELETE FROM " . DB_SOURCES . " WHERE groupid = " . $content['GROUPID'], 'LN_SOURCES_ERROR_DELSOURCE', $content['GROUPID'] ); PerformSQLDelete( "DELETE FROM " . DB_VIEWS . " WHERE groupid = " . $content['GROUPID'], 'LN_VIEWS_ERROR_DELSEARCH', $content['GROUPID'] ); PerformSQLDelete( "DELETE FROM " . DB_SEARCHES . " WHERE groupid = " . $content['GROUPID'], 'LN_SEARCH_ERROR_DELSEARCH', $content['GROUPID'] ); PerformSQLDelete( "DELETE FROM " . DB_CHARTS . " WHERE groupid = " . $content['GROUPID'], 'LN_CHARTS_ERROR_DELCHART', $content['GROUPID'] ); PerformSQLDelete( "DELETE FROM " . DB_GROUPMEMBERS . " WHERE groupid = " . $content['GROUPID'], 'LN_GROUP_ERROR_REMUSERFROMGROUP', $content['GROUPID'] ); // Finally delete the Groupobject! PerformSQLDelete( "DELETE FROM " . DB_GROUPS . " WHERE ID = " . $content['GROUPID'], 'LN_GROUP_ERROR_DELGROUP', $content['GROUPID'] ); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_GROUP_ERROR_HASBEENDEL'], $myrow['groupname'] ) , "groups.php" ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_GROUP_ERROR_INVALIDGROUP']; } } } if ( isset($_POST['op']) ) { if ( isset ($_POST['id']) ) { $content['GROUPID'] = intval( DB_RemoveBadChars($_POST['id']) ); } else {$content['GROUPID'] = ""; } if ( isset ($_POST['groupname']) ) { $content['groupname'] = DB_RemoveBadChars($_POST['groupname']); } else {$content['groupname'] = ""; } if ( isset ($_POST['groupdescription']) ) { $content['groupdescription'] = DB_RemoveBadChars($_POST['groupdescription']); } else {$content['groupdescription'] = ""; } // Check mandotary values if ( $content['groupname'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_GROUP_ERROR_GROUPEMPTY']; } if ( !isset($content['ISERROR']) ) { // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewgroup" ) { $result = DB_Query("SELECT groupname FROM " . DB_GROUPS . " WHERE groupname = '" . $content['groupname'] . "'"); $myrow = DB_GetSingleRow($result, true); if ( isset($myrow['groupname']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_GROUP_ERROR_GROUPNAMETAKEN']; } else { // Add new Group now! $result = DB_Query("INSERT INTO " . DB_GROUPS . " (groupname, groupdescription) VALUES ( '" . $content['groupname'] . "', '" . $content['groupdescription'] . "' )"); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_GROUP_HASBEENADDED'], DB_StripSlahes($content['groupname']) ) , "groups.php" ); } } else if ( $_POST['op'] == "editgroup" ) { $result = DB_Query("SELECT ID FROM " . DB_GROUPS . " WHERE ID = " . $content['GROUPID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERROR_IDNOTFOUND'], $content['GROUPID'] ); } else { // Edit the User now! $result = DB_Query("UPDATE " . DB_GROUPS . " SET groupname = '" . $content['groupname'] . "', groupdescription = '" . $content['groupdescription'] . "' WHERE ID = " . $content['GROUPID']); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_GROUP_ERROR_HASBEENEDIT'], DB_StripSlahes($content['groupname']) ) , "groups.php" ); } } else if ( $_POST['op'] == "adduser" ) { if ( isset($_POST['userid']) ) { // Copy UserID $content['USERID'] = intval( DB_RemoveBadChars($_POST['userid']) ); $result = DB_Query("SELECT username FROM " . DB_USERS . " WHERE id = " . $content['USERID']); $myrow = DB_GetSingleRow($result, true); if ( isset($myrow['username']) ) { // Add Groupmembership now! $result = DB_Query("INSERT INTO " . DB_GROUPMEMBERS . " (groupid, userid, is_member) VALUES ( " . $content['GROUPID'] . ", " . $content['USERID'] . ", 1 )"); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_GROUP_USERHASBEENADDEDGROUP'], $myrow['username'], $content['groupname'] ) , "groups.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_GROUP_ERROR_USERIDMISSING']; } } else if ( $_POST['op'] == "removeuser" ) { if ( isset($_POST['userid']) ) { // Copy UserID $content['USERID'] = intval( DB_RemoveBadChars($_POST['userid']) ); $result = DB_Query("SELECT username FROM " . DB_USERS . " WHERE id = " . $content['USERID']); $myrow = DB_GetSingleRow($result, true); if ( isset($myrow['username']) ) { // remove user from group $result = DB_Query( "DELETE FROM " . DB_GROUPMEMBERS . " WHERE userid = " . $content['USERID'] . " AND groupid = " . $content['GROUPID']); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GROUP_ERROR_REMUSERFROMGROUP'], $myrow['username'], $content['groupname'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_GROUP_USERHASBEENREMOVED'], $myrow['username'], $content['groupname'] ) , "groups.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_GROUP_ERROR_USERIDMISSING']; } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Groups $content['LISTGROUPS'] = "true"; // Read all Groupentries $sqlquery = "SELECT ID, " . " groupname, " . " groupdescription " . " FROM " . DB_GROUPS. " ORDER BY ID "; $result = DB_Query($sqlquery); $content['GROUPS'] = DB_GetAllRows($result, true); if ( count($content['GROUPS']) > 0 ) { // --- Process Groups for($i = 0; $i < count($content['GROUPS']); $i++) { // --- Set CSS Class if ( $i % 2 == 0 ) $content['GROUPS'][$i]['cssclass'] = "line1"; else $content['GROUPS'][$i]['cssclass'] = "line2"; // --- // --- Read all Memberentries for this group $sqlquery = "SELECT " . DB_USERS. ".username, " . DB_GROUPMEMBERS . ".userid, " . DB_GROUPMEMBERS . ".groupid, " . DB_GROUPMEMBERS . ".is_member " . " FROM " . DB_GROUPMEMBERS . " INNER JOIN (" . DB_USERS . ") ON (" . DB_GROUPMEMBERS . ".userid=" . DB_USERS . ".ID) " . " WHERE " . DB_GROUPMEMBERS . ".groupid = " . $content['GROUPS'][$i]['ID'] . " ORDER BY " . DB_USERS . ".username"; $result = DB_Query($sqlquery); $content['GROUPS'][$i]['USERS'] = DB_GetAllRows($result, true); if ( count($content['GROUPS'][$i]['USERS']) > 0 ) { // Enable Groupmembers $content['GROUPS'][$i]['GROUPMEMBERS'] = true; // Process Groups $subUserCount = count($content['GROUPS'][$i]['USERS']); for($j = 0; $j < $subUserCount; $j++) $content['GROUPS'][$i]['USERS'][$j]['seperator'] = ", "; $content['GROUPS'][$i]['USERS'][$subUserCount-1]['seperator'] = ""; // last one is empty } // --- } // --- } else $content['EMPTYGROUPS'] = "true"; } // Helper function to delete SQL Data function PerformSQLDelete( $szDeleteStm, $szErrMsg, $szUserID) { global $content; $result = DB_Query( $szDeleteStm ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content[$szErrMsg], $szUserID ); return false; } else DB_FreeQuery($result); // Success return true; } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_GROUPOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_groups.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/index.php000066400000000000000000000642221277740250400175650ustar00rootroot00000000000000 Shows ... * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility // include($gl_root_path . 'classes/logstream.class.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "enableuserops" ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code if ( isset($_SESSION['SESSION_ISADMIN']) && $_SESSION['SESSION_ISADMIN'] == 1 ) { $content['EditAllowed'] = true; $content['DISABLE_GLOBALEDIT_FORMCONTROL'] = ""; } else { $content['EditAllowed'] = false; $content['DISABLE_GLOBALEDIT_FORMCONTROL'] = "disabled"; } // Init Fonts and sizes InitFontList(); InitFontSizeList(); // --- First thing to do is to check the op get parameter! // Check for changes first | Abort if Edit is not allowed if ( isset($_GET['op']) && isset($_GET['value']) ) { if ( $_GET['op'] == "enableuserops" ) { $iNewVal = intval($_GET['value']); if ( $iNewVal == 1 ) { // Set UserOption $USERCFG['UserOverwriteOptions'] = 1; // Focus the enable user button AddWindowLoadFocus("buttonenableuseropt"); } else { // Set UserOption $USERCFG['UserOverwriteOptions'] = 0; // Focus the disable user button AddWindowLoadFocus("buttondisableuseropt"); } // Enable User Options! WriteConfigValue( "UserOverwriteOptions", false, $content['SESSION_USERID'] ); } } // --- // --- Check if user wants to overwrite $UserOverwriteOptions = GetConfigSetting("UserOverwriteOptions", 0, CFGLEVEL_USER); if ( $UserOverwriteOptions == 1 ) { $content['ENABLEUSEROPTIONS'] = true; } else { $content['ENABLEUSEROPTIONS'] = false; } // --- // Check for changes first | Abort if Edit is not allowed if ( isset($_POST['op']) ) { if ( $_POST['op'] == "edit" ) { // Do if User is ADMIN if ( $content['EditAllowed'] ) { // Language needs special treatment if ( isset ($_POST['ViewDefaultLanguage']) ) { $tmpvar = DB_RemoveBadChars($_POST['ViewDefaultLanguage']); if ( VerifyLanguage($tmpvar) ) $content['ViewDefaultLanguage'] = $tmpvar; } // Read default theme if ( isset ($_POST['ViewDefaultTheme']) ) { $content['ViewDefaultTheme'] = $_POST['ViewDefaultTheme']; } // Read default VIEW | Check if View exists as well! if ( isset ($_POST['DefaultViewsID']) && isset($content['Views'][$_POST['DefaultViewsID']] )) { $content['DefaultViewsID'] = $_POST['DefaultViewsID']; } // Read default SOURCES | Check if Source exists as well! if ( isset ($_POST['DefaultSourceID']) && isset($content['Sources'][$_POST['DefaultSourceID']] )) { $content['DefaultSourceID'] = $_POST['DefaultSourceID']; } // Read default FONT Settings if ( isset ($_POST['DefaultFont']) ) { $content['DefaultFont'] = $_POST['DefaultFont']; } if ( isset ($_POST['DefaultFontSize']) ) { $content['DefaultFontSize'] = $_POST['DefaultFontSize']; } // Read checkboxes if ( isset ($_POST['ViewUseTodayYesterday']) ) { $content['ViewUseTodayYesterday'] = 1; } else { $content['ViewUseTodayYesterday'] = 0; } if ( isset ($_POST['ViewEnableDetailPopups']) ) { $content['ViewEnableDetailPopups'] = 1; } else { $content['ViewEnableDetailPopups'] = 0; } if ( isset ($_POST['EnableContextLinks']) ) { $content['EnableContextLinks'] = 1; } else { $content['EnableContextLinks'] = 0; } if ( isset ($_POST['EnableIPAddressResolve']) ) { $content['EnableIPAddressResolve'] = 1; } else { $content['EnableIPAddressResolve'] = 0; } if ( isset ($_POST['MiscShowDebugMsg']) ) { $content['MiscShowDebugMsg'] = 1; } else { $content['MiscShowDebugMsg'] = 0; } if ( isset ($_POST['MiscShowDebugGridCounter']) ) { $content['MiscShowDebugGridCounter'] = 1; } else { $content['MiscShowDebugGridCounter'] = 0; } if ( isset ($_POST['MiscShowPageRenderStats']) ) { $content['MiscShowPageRenderStats'] = 1; } else { $content['MiscShowPageRenderStats'] = 0; } if ( isset ($_POST['MiscEnableGzipCompression']) ) { $content['MiscEnableGzipCompression'] = 1; } else { $content['MiscEnableGzipCompression'] = 0; } if ( isset ($_POST['SuppressDuplicatedMessages']) ) { $content['SuppressDuplicatedMessages'] = 1; } else { $content['SuppressDuplicatedMessages'] = 0; } if ( isset ($_POST['TreatNotFoundFiltersAsTrue']) ) { $content['TreatNotFoundFiltersAsTrue'] = 1; } else { $content['TreatNotFoundFiltersAsTrue'] = 0; } if ( isset ($_POST['InlineOnlineSearchIcons']) ) { $content['InlineOnlineSearchIcons'] = 1; } else { $content['InlineOnlineSearchIcons'] = 0; } if ( isset ($_POST['DebugUserLogin']) ) { $content['DebugUserLogin'] = 1; } else { $content['DebugUserLogin'] = 0; } if ( isset ($_POST['MiscDebugToSyslog']) ) { $content['MiscDebugToSyslog'] = 1; } else { $content['MiscDebugToSyslog'] = 0; } if ( isset ($_POST['DisableAdminUsers']) ) { $content['DisableAdminUsers'] = 1; } else { $content['DisableAdminUsers'] = 0; } // Read Text number fields if ( isset ($_POST['ViewMessageCharacterLimit']) && is_numeric($_POST['ViewMessageCharacterLimit']) ) { $content['ViewMessageCharacterLimit'] = $_POST['ViewMessageCharacterLimit']; } if ( isset ($_POST['ViewStringCharacterLimit']) && is_numeric($_POST['ViewStringCharacterLimit']) ) { $content['ViewStringCharacterLimit'] = $_POST['ViewStringCharacterLimit']; } if ( isset ($_POST['PopupMenuTimeout']) && is_numeric($_POST['PopupMenuTimeout']) ) { $content['PopupMenuTimeout'] = $_POST['PopupMenuTimeout']; } if ( isset ($_POST['ViewEntriesPerPage']) && is_numeric($_POST['ViewEntriesPerPage']) ) { $content['ViewEntriesPerPage'] = $_POST['ViewEntriesPerPage']; } if ( isset ($_POST['ViewEnableAutoReloadSeconds']) && is_numeric($_POST['ViewEnableAutoReloadSeconds']) ) { $content['ViewEnableAutoReloadSeconds'] = $_POST['ViewEnableAutoReloadSeconds']; } if ( isset ($_POST['AdminChangeWaitTime']) && is_numeric($_POST['AdminChangeWaitTime']) ) { $content['AdminChangeWaitTime'] = $_POST['AdminChangeWaitTime']; } if ( isset ($_POST['MiscMaxExecutionTime']) && is_numeric($_POST['MiscMaxExecutionTime']) ) { $content['MiscMaxExecutionTime'] = $_POST['MiscMaxExecutionTime']; } // Read Text fields if ( isset ($_POST['PrependTitle']) ) { $content['PrependTitle'] = $_POST['PrependTitle']; } if ( isset ($_POST['SearchCustomButtonCaption']) ) { $content['SearchCustomButtonCaption'] = $_POST['SearchCustomButtonCaption']; } if ( isset ($_POST['SearchCustomButtonSearch']) ) { $content['SearchCustomButtonSearch'] = $_POST['SearchCustomButtonSearch']; } if ( isset ($_POST['InjectHtmlHeader']) ) { $content['InjectHtmlHeader'] = $_POST['InjectHtmlHeader']; } if ( isset ($_POST['InjectBodyHeader']) ) { $content['InjectBodyHeader'] = $_POST['InjectBodyHeader']; } if ( isset ($_POST['InjectBodyFooter']) ) { $content['InjectBodyFooter'] = $_POST['InjectBodyFooter']; } if ( isset ($_POST['PhplogconLogoUrl']) ) { $content['PhplogconLogoUrl'] = $_POST['PhplogconLogoUrl']; } if ( isset ($_POST['UseProxyServerForRemoteQueries']) ) { $content['UseProxyServerForRemoteQueries'] = $_POST['UseProxyServerForRemoteQueries']; } if ( isset ($_POST['HeaderDefaultEncoding']) ) { $content['HeaderDefaultEncoding'] = $_POST['HeaderDefaultEncoding']; } // Save configuration variables now SaveGeneralSettingsIntoDB(); } // Do if User wants extra options if ( $content['ENABLEUSEROPTIONS'] ) { // Language needs special treatment if ( isset ($_POST['User_ViewDefaultLanguage']) ) { $tmpvar = DB_RemoveBadChars($_POST['User_ViewDefaultLanguage']); if ( VerifyLanguage($tmpvar) ) $USERCFG['ViewDefaultLanguage'] = $tmpvar; } // Read default theme if ( isset ($_POST['User_ViewDefaultTheme']) ) { $USERCFG['ViewDefaultTheme'] = $_POST['User_ViewDefaultTheme']; } // Read default VIEW | Check if View exists as well! if ( isset ($_POST['User_DefaultViewsID']) && isset($content['Views'][$_POST['User_DefaultViewsID']] )) { $USERCFG['DefaultViewsID'] = $_POST['User_DefaultViewsID']; } // Read default SOURCES | Check if Source exists as well! if ( isset ($_POST['User_DefaultSourceID']) && isset($content['Sources'][$_POST['User_DefaultSourceID']] )) { $USERCFG['DefaultSourceID'] = $_POST['User_DefaultSourceID']; } // Read default FONT if ( isset ($_POST['User_DefaultFont']) ) { $USERCFG['DefaultFont'] = $_POST['User_DefaultFont']; } if ( isset ($_POST['User_DefaultFontSize']) ) { $USERCFG['DefaultFontSize'] = $_POST['User_DefaultFontSize']; } // Read checkboxes if ( isset ($_POST['User_ViewUseTodayYesterday']) ) { $USERCFG['ViewUseTodayYesterday'] = 1; } else { $USERCFG['ViewUseTodayYesterday'] = 0; } if ( isset ($_POST['User_ViewEnableDetailPopups']) ) { $USERCFG['ViewEnableDetailPopups'] = 1; } else { $USERCFG['ViewEnableDetailPopups'] = 0; } if ( isset ($_POST['User_EnableContextLinks']) ) { $USERCFG['EnableContextLinks'] = 1; } else { $USERCFG['EnableContextLinks'] = 0; } if ( isset ($_POST['User_EnableIPAddressResolve']) ) { $USERCFG['EnableIPAddressResolve'] = 1; } else { $USERCFG['EnableIPAddressResolve'] = 0; } if ( isset ($_POST['User_MiscShowDebugMsg']) ) { $USERCFG['MiscShowDebugMsg'] = 1; } else { $USERCFG['MiscShowDebugMsg'] = 0; } if ( isset ($_POST['User_MiscShowDebugGridCounter']) ) { $USERCFG['MiscShowDebugGridCounter'] = 1; } else { $USERCFG['MiscShowDebugGridCounter'] = 0; } if ( isset ($_POST['User_MiscShowPageRenderStats']) ) { $USERCFG['MiscShowPageRenderStats'] = 1; } else { $USERCFG['MiscShowPageRenderStats'] = 0; } if ( isset ($_POST['User_MiscEnableGzipCompression']) ) { $USERCFG['MiscEnableGzipCompression'] = 1; } else { $USERCFG['MiscEnableGzipCompression'] = 0; } if ( isset ($_POST['User_SuppressDuplicatedMessages']) ) { $USERCFG['SuppressDuplicatedMessages'] = 1; } else { $USERCFG['SuppressDuplicatedMessages'] = 0; } if ( isset ($_POST['User_InlineOnlineSearchIcons']) ) { $USERCFG['InlineOnlineSearchIcons'] = 1; } else { $USERCFG['InlineOnlineSearchIcons'] = 0; } if ( isset ($_POST['User_TreatNotFoundFiltersAsTrue']) ) { $USERCFG['TreatNotFoundFiltersAsTrue'] = 1; } else { $USERCFG['TreatNotFoundFiltersAsTrue'] = 0; } // Read Text number fields if ( isset ($_POST['User_ViewMessageCharacterLimit']) && is_numeric($_POST['User_ViewMessageCharacterLimit']) ) { $USERCFG['ViewMessageCharacterLimit'] = $_POST['User_ViewMessageCharacterLimit']; } if ( isset ($_POST['User_ViewStringCharacterLimit']) && is_numeric($_POST['User_ViewStringCharacterLimit']) ) { $USERCFG['ViewStringCharacterLimit'] = $_POST['User_ViewStringCharacterLimit']; } if ( isset ($_POST['User_PopupMenuTimeout']) && is_numeric($_POST['User_PopupMenuTimeout']) ) { $USERCFG['PopupMenuTimeout'] = $_POST['User_PopupMenuTimeout']; } if ( isset ($_POST['User_ViewEntriesPerPage']) && is_numeric($_POST['User_ViewEntriesPerPage']) ) { $USERCFG['ViewEntriesPerPage'] = $_POST['User_ViewEntriesPerPage']; } if ( isset ($_POST['User_ViewEnableAutoReloadSeconds']) && is_numeric($_POST['User_ViewEnableAutoReloadSeconds']) ) { $USERCFG['ViewEnableAutoReloadSeconds'] = $_POST['User_ViewEnableAutoReloadSeconds']; } if ( isset ($_POST['User_AdminChangeWaitTime']) && is_numeric($_POST['User_AdminChangeWaitTime']) ) { $USERCFG['AdminChangeWaitTime'] = $_POST['User_AdminChangeWaitTime']; } // Read Text fields if ( isset ($_POST['User_PrependTitle']) ) { $USERCFG['PrependTitle'] = $_POST['User_PrependTitle']; } if ( isset ($_POST['User_SearchCustomButtonCaption']) ) { $USERCFG['SearchCustomButtonCaption'] = $_POST['User_SearchCustomButtonCaption']; } if ( isset ($_POST['User_SearchCustomButtonSearch']) ) { $USERCFG['SearchCustomButtonSearch'] = $_POST['User_SearchCustomButtonSearch']; } // Save configuration variables now SaveUserGeneralSettingsIntoDB(); } // Do a redirect RedirectResult( $content['LN_GEN_SUCCESSFULLYSAVED'], "index.php" ); } } // PreInit newer values if necessary if ( !isset($content['SuppressDuplicatedMessages']) ) { $content['SuppressDuplicatedMessages'] = 0; } if ( !isset($content['TreatNotFoundFiltersAsTrue']) ) { $content['TreatNotFoundFiltersAsTrue'] = 0; } if ( !isset($content['InlineOnlineSearchIcons']) ) { $content['InlineOnlineSearchIcons'] = 1; } if ( !isset($content['AdminChangeWaitTime']) ) { $content['AdminChangeWaitTime'] = 2; } // Set checkbox States if (isset($content['ViewUseTodayYesterday']) && $content['ViewUseTodayYesterday'] == 1) { $content['ViewUseTodayYesterday_checked'] = "checked"; } else { $content['ViewUseTodayYesterday_checked'] = ""; } if (isset($content['ViewEnableDetailPopups']) && $content['ViewEnableDetailPopups'] == 1) { $content['ViewEnableDetailPopups_checked'] = "checked"; } else { $content['ViewEnableDetailPopups_checked'] = ""; } if (isset($content['EnableContextLinks']) && $content['EnableContextLinks'] == 1) { $content['EnableContextLinks_checked'] = "checked"; } else { $content['EnableContextLinks_checked'] = ""; } if (isset($content['EnableIPAddressResolve']) && $content['EnableIPAddressResolve'] == 1) { $content['EnableIPAddressResolve_checked'] = "checked"; } else { $content['EnableIPAddressResolve_checked'] = ""; } if (isset($content['MiscShowDebugMsg']) && $content['MiscShowDebugMsg'] == 1) { $content['MiscShowDebugMsg_checked'] = "checked"; } else { $content['MiscShowDebugMsg_checked'] = ""; } if (isset($content['MiscShowDebugGridCounter']) && $content['MiscShowDebugGridCounter'] == 1) { $content['MiscShowDebugGridCounter_checked'] = "checked"; } else { $content['MiscShowDebugGridCounter_checked'] = ""; } if (isset($content['MiscShowPageRenderStats']) && $content['MiscShowPageRenderStats'] == 1) { $content['MiscShowPageRenderStats_checked'] = "checked"; } else { $content['MiscShowPageRenderStats_checked'] = ""; } if (isset($content['MiscEnableGzipCompression']) && $content['MiscEnableGzipCompression'] == 1) { $content['MiscEnableGzipCompression_checked'] = "checked"; } else { $content['MiscEnableGzipCompression_checked'] = ""; } if (isset($content['SuppressDuplicatedMessages']) && $content['SuppressDuplicatedMessages'] == 1) { $content['SuppressDuplicatedMessages_checked'] = "checked"; } else { $content['SuppressDuplicatedMessages_checked'] = ""; } if (isset($content['TreatNotFoundFiltersAsTrue']) && $content['TreatNotFoundFiltersAsTrue'] == 1) { $content['TreatNotFoundFiltersAsTrue_checked'] = "checked"; } else { $content['TreatNotFoundFiltersAsTrue_checked'] = ""; } if (isset($content['InlineOnlineSearchIcons']) && $content['InlineOnlineSearchIcons'] == 1) { $content['InlineOnlineSearchIcons_checked'] = "checked"; } else { $content['InlineOnlineSearchIcons_checked'] = ""; } if (isset($content['DebugUserLogin']) && $content['DebugUserLogin'] == 1) { $content['DebugUserLogin_checked'] = "checked"; } else { $content['DebugUserLogin_checked'] = ""; } if (isset($content['MiscDebugToSyslog']) && $content['MiscDebugToSyslog'] == 1) { $content['MiscDebugToSyslog_checked'] = "checked"; } else { $content['MiscDebugToSyslog_checked'] = ""; } if (isset($content['DisableAdminUsers']) && $content['DisableAdminUsers'] == 1) { $content['DisableAdminUsers_checked'] = "checked"; } else { $content['DisableAdminUsers_checked'] = ""; } // --- // --- Init for Style field! // copy STYLES Array $content['GLOBAL_STYLES'] = $content['STYLES']; $defaultStyleID = GetConfigSetting('ViewDefaultTheme', "default", CFGLEVEL_GLOBAL); foreach ( $content['GLOBAL_STYLES'] as &$myStyle ) { if ( $myStyle['StyleName'] == $defaultStyleID ) $myStyle['selected'] = "selected"; else $myStyle['selected'] = ""; } // --- // --- Init for ViewDefaultLanguage field! // copy LANGUAGES Array $content['GLOBAL_LANGUAGES'] = $content['LANGUAGES']; $defaultLangID = GetConfigSetting('ViewDefaultLanguage', "en", CFGLEVEL_GLOBAL); foreach ( $content['GLOBAL_LANGUAGES'] as &$myLang ) { if ( $myLang['langcode'] == $defaultLangID ) $myLang['selected'] = "selected"; else $myLang['selected'] = ""; } // --- // --- Init for DefaultView field! // copy Views Array $content['VIEWS'] = $content['Views']; if ( !isset($content['DefaultViewsID']) ) { $content['DefaultViewsID'] = 'SYSLOG'; } foreach ( $content['VIEWS'] as &$myView ) { if ( $myView['ID'] == $content['DefaultViewsID'] ) $myView['selected'] = "selected"; else $myView['selected'] = ""; } // --- // --- Init for DefaultSource field! // copy Sources Array $content['SOURCES'] = $content['Sources']; if ( !isset($content['DefaultSourceID']) ) { $content['DefaultSourceID'] = ''; } foreach ( $content['SOURCES'] as &$mySource ) { if ( $mySource['ID'] == $content['DefaultSourceID'] ) $mySource['selected'] = "selected"; else $mySource['selected'] = ""; } // --- // --- Init for DefaultFont field! // copy Fonts Array $content['FONTS'] = $content['fonts']; if ( !isset($content['DefaultFont']) ) { $content['DefaultFont'] = 'Tahoma'; } foreach ( $content['FONTS'] as &$myFont ) { if ( $myFont['Name'] == $content['DefaultFont'] ) $myFont['selected'] = "selected"; else $myFont['selected'] = ""; } // --- // --- Init for DefaultFontSize field! // copy Fontsizes Array $content['FONTSIZES'] = $content['fontsizes']; if ( !isset($content['DefaultFontSize']) ) { $content['DefaultFontSize'] = 100; } foreach ( $content['FONTSIZES'] as $myFontKey => &$myFontSize ) { if ( $myFontKey == $content['DefaultFontSize'] ) $myFontSize['selected'] = "selected"; else $myFontSize['selected'] = ""; } // --- // --- Init for DefaultEncoding field! // copy Sources Array $content['ENCODINGS'] = $encodings; // if ( !isset($content['DefaultSourceID']) ) { $content['DefaultSourceID'] = ''; } foreach ( $content['ENCODINGS'] as &$myEncoding) { $myEncoding['DisplayName'] = $myEncoding['ID']; if ( $myEncoding['ID'] == $content['HeaderDefaultEncoding'] ) $myEncoding['selected'] = "selected"; else $myEncoding['selected'] = ""; } // --- // Do if User wants extra options if ( $content['ENABLEUSEROPTIONS'] ) { // Set checkbox States if ( GetConfigSetting('ViewUseTodayYesterday', $content['ViewUseTodayYesterday'], CFGLEVEL_USER) == 1) { $content['User_ViewUseTodayYesterday_checked'] = "checked"; } else { $content['User_ViewUseTodayYesterday_checked'] = ""; } if ( GetConfigSetting('ViewEnableDetailPopups', $content['ViewEnableDetailPopups'], CFGLEVEL_USER) == 1) { $content['User_ViewEnableDetailPopups_checked'] = "checked"; } else { $content['User_ViewEnableDetailPopups_checked'] = ""; } if ( GetConfigSetting('EnableContextLinks', $content['EnableContextLinks'], CFGLEVEL_USER) == 1) { $content['User_EnableContextLinks_checked'] = "checked"; } else { $content['User_EnableContextLinks_checked'] = ""; } if ( GetConfigSetting('EnableIPAddressResolve', $content['EnableIPAddressResolve'], CFGLEVEL_USER) == 1) { $content['User_EnableIPAddressResolve_checked'] = "checked"; } else { $content['User_EnableIPAddressResolve_checked'] = ""; } if ( GetConfigSetting('MiscShowDebugMsg', $content['MiscShowDebugMsg'], CFGLEVEL_USER) == 1) { $content['User_MiscShowDebugMsg_checked'] = "checked"; } else { $content['User_MiscShowDebugMsg_checked'] = ""; } if ( GetConfigSetting('MiscShowDebugGridCounter', $content['MiscShowDebugGridCounter'], CFGLEVEL_USER) == 1) { $content['User_MiscShowDebugGridCounter_checked'] = "checked"; } else { $content['User_MiscShowDebugGridCounter_checked'] = ""; } if ( GetConfigSetting('MiscShowPageRenderStats', $content['MiscShowPageRenderStats'], CFGLEVEL_USER) == 1) { $content['User_MiscShowPageRenderStats_checked'] = "checked"; } else { $content['User_MiscShowPageRenderStats_checked'] = ""; } if ( GetConfigSetting('MiscEnableGzipCompression', $content['MiscEnableGzipCompression'], CFGLEVEL_USER) == 1) { $content['User_MiscEnableGzipCompression_checked'] = "checked"; } else { $content['User_MiscEnableGzipCompression_checked'] = ""; } if ( GetConfigSetting('SuppressDuplicatedMessages', $content['SuppressDuplicatedMessages'], CFGLEVEL_USER) == 1) { $content['User_SuppressDuplicatedMessages_checked'] = "checked"; } else { $content['User_SuppressDuplicatedMessages_checked'] = ""; } if ( GetConfigSetting('TreatNotFoundFiltersAsTrue', $content['TreatNotFoundFiltersAsTrue'], CFGLEVEL_USER) == 1) { $content['User_TreatNotFoundFiltersAsTrue_checked'] = "checked"; } else { $content['User_TreatNotFoundFiltersAsTrue_checked'] = ""; } if ( GetConfigSetting('InlineOnlineSearchIcons', $content['InlineOnlineSearchIcons'], CFGLEVEL_USER) == 1) { $content['User_InlineOnlineSearchIcons_checked'] = "checked"; } else { $content['User_InlineOnlineSearchIcons_checked'] = ""; } // --- // --- Set TextFields! $content['User_PrependTitle'] = GetConfigSetting('PrependTitle', $content['PrependTitle'], CFGLEVEL_USER); $content['User_ViewMessageCharacterLimit'] = GetConfigSetting('ViewMessageCharacterLimit', $content['ViewMessageCharacterLimit'], CFGLEVEL_USER); $content['User_ViewStringCharacterLimit'] = GetConfigSetting('ViewStringCharacterLimit', $content['ViewStringCharacterLimit'], CFGLEVEL_USER); $content['User_PopupMenuTimeout'] = GetConfigSetting('PopupMenuTimeout', $content['PopupMenuTimeout'], CFGLEVEL_USER); $content['User_ViewEntriesPerPage'] = GetConfigSetting('ViewEntriesPerPage', $content['ViewEntriesPerPage'], CFGLEVEL_USER); $content['User_ViewEnableAutoReloadSeconds'] = GetConfigSetting('ViewEnableAutoReloadSeconds', $content['ViewEnableAutoReloadSeconds'], CFGLEVEL_USER); $content['User_AdminChangeWaitTime'] = GetConfigSetting('AdminChangeWaitTime', $content['AdminChangeWaitTime'], CFGLEVEL_USER); $content['User_SearchCustomButtonCaption'] = GetConfigSetting('SearchCustomButtonCaption', $content['SearchCustomButtonCaption'], CFGLEVEL_USER); $content['User_SearchCustomButtonSearch'] = GetConfigSetting('SearchCustomButtonSearch', $content['SearchCustomButtonSearch'], CFGLEVEL_USER); // --- // --- Init for ViewDefaultTheme field! // copy STYLES Array $content['USER_STYLES'] = $content['STYLES']; $userStyleID = GetConfigSetting('ViewDefaultTheme', $content['ViewDefaultTheme'], CFGLEVEL_USER); foreach ( $content['USER_STYLES'] as &$myStyle ) { if ( $myStyle['StyleName'] == $userStyleID ) $myStyle['selected'] = "selected"; else $myStyle['selected'] = ""; } // --- // --- Init for ViewDefaultLanguage field! // copy LANGUAGES Array $content['USER_LANGUAGES'] = $content['LANGUAGES']; $userLangID = GetConfigSetting('ViewDefaultLanguage', $content['ViewDefaultLanguage'], CFGLEVEL_USER); foreach ( $content['USER_LANGUAGES'] as &$myLang ) { if ( $myLang['langcode'] == $userLangID ) $myLang['selected'] = "selected"; else $myLang['selected'] = ""; } // --- // --- Init for DefaultView field! // copy Views Array $content['USER_VIEWS'] = $content['Views']; $userViewID = GetConfigSetting('DefaultViewsID', $content['DefaultViewsID'], CFGLEVEL_USER); foreach ( $content['USER_VIEWS'] as &$myView ) { if ( $myView['ID'] == $userViewID ) $myView['selected'] = "selected"; else $myView['selected'] = ""; } // --- // --- Init for DefaultSource field! // copy Sources Array $content['USER_SOURCES'] = $content['Sources']; $userSourceID = GetConfigSetting('DefaultSourceID', $content['DefaultSourceID'], CFGLEVEL_USER); foreach ( $content['USER_SOURCES'] as &$mySource ) { if ( $mySource['ID'] == $userSourceID ) $mySource['selected'] = "selected"; else $mySource['selected'] = ""; } // --- // --- Init for DefaultFont field! // copy Fonts Array $content['USER_FONTS'] = $content['fonts']; $DefaultFont = GetConfigSetting('DefaultFont', $content['DefaultFont'], CFGLEVEL_USER); foreach ( $content['USER_FONTS'] as &$myFont ) { if ( $myFont['Name'] == $DefaultFont ) $myFont['selected'] = "selected"; else $myFont['selected'] = ""; } // --- // --- Init for DefaultFontSize field! // copy Fontsizes Array $content['USER_FONTSIZES'] = $content['fontsizes']; $DefaultFontSize = GetConfigSetting('DefaultFontSize', $content['DefaultFontSize'], CFGLEVEL_USER); foreach ( $content['USER_FONTSIZES'] as $myFontKey => &$myFontSize ) { if ( $myFontKey == $DefaultFontSize ) $myFontSize['selected'] = "selected"; else $myFontSize['selected'] = ""; } // --- } // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_GENOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_index.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/parsers.php000066400000000000000000000240511277740250400201310ustar00rootroot00000000000000 Helps administrating message parsers * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "initparser" || $_GET['op'] == "removeparser" ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code // First of all init List of Parsers! InitMessageParsers(); if ( isset($_GET['op']) ) { if ($_GET['op'] == "details") { // Set Mode to edit $content['ISSHOWDETAILS'] = "true"; // $content['SEARCH_FORMACTION'] = "editsearch"; // $content['SEARCH_SENDBUTTON'] = $content['LN_SEARCH_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['ParserID'] = DB_RemoveBadChars($_GET['id']); if ( isset($content['PARSERS'][ $content['ParserID'] ]) ) { // Get Reference to parser! $myParser = $content['PARSERS'][ $content['ParserID'] ]; $content['DisplayName'] = $myParser['DisplayName']; $content['Description'] = $myParser['Description']; if ( strlen($myParser['ParserHelpArticle']) > 0 ) { $content['EnableHelpArticle'] = true; $content['ParserHelpArticle'] = $myParser['ParserHelpArticle']; } // check for custom fields if ( isset($myParser['CustomFieldsList']) && count($myParser['CustomFieldsList']) > 0 ) { // Needs custom fields! $content['EnableCustomField'] = true; $content['CustomFieldsList'] = $myParser['CustomFieldsList']; foreach( $myParser['CustomFieldsList'] as $myField ) { // check if field is in define list! if ( !array_key_exists($myField['FieldID'], $fields) ) { $content['ParserInitEnabled'] = true; break; } else { $content['ParserDeleteEnabled'] = true; break; } } } } else { $content['ISSHOWDETAILS'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_IDNOTFOUND'], $content['ParserID'] ); } } else { $content['ISSHOWDETAILS'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_PARSERS_ERROR_INVALIDID']; } } else if ($_GET['op'] == "removeparser") { // --- Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); // --- if ( isset($_GET['id']) ) { //PreInit these values $content['ParserID'] = DB_RemoveBadChars($_GET['id']); if ( isset($content['PARSERS'][ $content['ParserID'] ]) ) { // Get Reference to parser! $myParser = $content['PARSERS'][ $content['ParserID'] ]; // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_PARSERS_WARNREMOVE'], $myParser['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // Check if we have fields to delete if ( isset($myParser['CustomFieldsList']) && count($myParser['CustomFieldsList']) > 0 ) { // Helper counter $deletedFields = 0; // Loop through all custom fields! foreach( $myParser['CustomFieldsList'] as $myField ) { // check if field is in define list! if ( array_key_exists($myField['FieldID'], $fields) ) { $result = DB_Query( "DELETE FROM " . DB_FIELDS . " WHERE FieldID = '" . $myField['FieldID'] . "'"); DB_FreeQuery($result); // increment counter $deletedFields++; } } // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_HASBEENREMOVED'], $myParser['DisplayName'], $deletedFields ) , "parsers.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_NOFIELDS'], $content['ParserID'] ); } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_PARSERS_ERROR_INVALIDID']; } } else if ($_GET['op'] == "initparser") { // --- Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); // --- if ( isset($_GET['id']) ) { //PreInit these values $content['ParserID'] = DB_RemoveBadChars($_GET['id']); if ( isset($content['PARSERS'][ $content['ParserID'] ]) ) { // Get Reference to parser! $myParser = $content['PARSERS'][ $content['ParserID'] ]; // check for custom fields if ( isset($myParser['CustomFieldsList']) && count($myParser['CustomFieldsList']) > 0 ) { // Helper counter $addedFields = 0; // Loop through all custom fields! foreach( $myParser['CustomFieldsList'] as $myField ) { // check if field is in define list! if ( !array_key_exists($myField['FieldID'], $fields) ) { // Add field into DB! $sqlquery = "INSERT INTO " . DB_FIELDS . " (FieldID, FieldCaption, FieldDefine, SearchField, FieldAlign, DefaultWidth, FieldType, SearchOnline) VALUES ( '" . $myField['FieldID'] . "', '" . $myField['FieldCaption'] . "', '" . $myField['FieldDefine'] . "', '" . $myField['SearchField'] . "', '" . $myField['FieldAlign'] . "', " . $myField['DefaultWidth'] . ", " . $myField['FieldType'] . ", " . $myField['SearchOnline'] . " )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // increment counter $addedFields++; } } // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_HASBEENADDED'], $myParser['DisplayName'], $addedFields ) , "parsers.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_NOFIELDS'], $content['ParserID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_IDNOTFOUND'], $content['ParserID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_PARSERS_ERROR_INVALIDID']; } } } // Default mode! if ( !isset($_POST['op']) && !isset($_GET['op']) ) { if ( isset($content['PARSERS']) ) { // Default Mode = List Searches $content['LISTPARSERS'] = "true"; $i = 0; // Help counter! foreach ($content['PARSERS'] as &$myParser ) { // Set if help link is enabled if ( strlen($myParser['ParserHelpArticle']) > 0 ) $myParser['ParserHelpEnabled'] = true; else $myParser['ParserHelpEnabled'] = false; // Find out if we need to INIT something! if ( isset($myParser['CustomFieldsList']) && count($myParser['CustomFieldsList']) > 0 ) { foreach( $myParser['CustomFieldsList'] as $myField ) { // check if field is in define list! if ( !array_key_exists($myField['FieldID'], $fields) ) { $myParser['ParserInitEnabled'] = true; break; } else { $myParser['ParserDeleteEnabled'] = true; break; } } } // --- Set CSS Class if ( $i % 2 == 0 ) $myParser['cssclass'] = "line1"; else $myParser['cssclass'] = "line2"; $i++; // --- } } else { $content['LISTPARSERS'] = "false"; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_PARSERS_ERROR_NOPARSERS']; } } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_MSGPARSERSOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_parsers.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/reports.php000066400000000000000000001653451277740250400201640ustar00rootroot00000000000000 Helps administrating report modules * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); include($gl_root_path . 'include/functions_reports.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( strpos($_GET['op'], "initreport") !== false || strpos($_GET['op'], "removereport") !== false || strpos($_GET['op'], "editsavedreport") !== false || strpos($_GET['op'], "addsavedreport") !== false || strpos($_GET['op'], "removesavedreport") !== false ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- FIX MSIE8 Button Values if (isset($_POST['op'])) { if (strpos($_POST['op'], $content['LN_REPORTS_ADDSAVEDREPORTANDRETURN']) !== false ) $_POST['op'] = "addsavedreport_return"; else if (strpos($_POST['op'], $content['LN_REPORTS_EDITSAVEDREPORTANDRETURN']) !== false ) $_POST['op'] = "editsavedreport_return"; else if (strpos($_POST['op'], $content['LN_REPORTS_ADDSAVEDREPORT']) !== false ) $_POST['op'] = "addsavedreport"; else if (strpos($_POST['op'], $content['LN_REPORTS_EDITSAVEDREPORT']) !== false ) $_POST['op'] = "editsavedreport"; } // --- // --- BEGIN Custom Code $content['OPTIONAL_TITLE'] = ""; // Firts of all init List of Reports! InitReportModules(); // Handle GET requests if ( isset($_GET['op']) ) { if ($_GET['op'] == "details") { // Set Mode to edit $content['ISSHOWDETAILS'] = "true"; if ( isset($_GET['id']) ) { //PreInit these values $content['ReportID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); if ( isset($content['REPORTS'][ $content['ReportID'] ]) ) { // Get Reference to parser! $myReport = $content['REPORTS'][ $content['ReportID'] ]; $content['Category'] = $myReport['Category']; $content['DisplayName'] = $myReport['DisplayName']; $content['Description'] = $myReport['Description']; if ( strlen($myReport['ReportHelpArticle']) > 0 ) { $content['EnableHelpArticle'] = true; $content['ReportHelpArticle'] = $myReport['ReportHelpArticle']; } // check for custom fields if ( isset($myReport['RequiredFieldsList']) && count($myReport['RequiredFieldsList']) > 0 ) { // Needs custom fields! $content['EnableRequiredFields'] = true; // $content['CustomFieldsList'] = $myParser['CustomFieldsList']; foreach( $myReport['RequiredFieldsList'] as $myField ) { if ( isset($fields[$myField]) ) $content['RequiredFieldsList'][$myField] = array ("FieldID" => $myField, "FieldDefine" => $fields[$myField]["FieldDefine"], "FieldCaption" => $fields[$myField]["FieldCaption"] ); else $content['RequiredFieldsList'][$myField] = array ("FieldID" => $myField, "FieldDefine" => $myField, "FieldCaption" => $myField ); } } // check for custom fields if ( $myReport['NeedsInit'] ) // && count($myReport['CustomFieldsList']) > 0 ) { // Needs custom fields! $content['EnableNeedsInit'] = true; if ( $myReport['Initialized'] ) { $content['InitEnabled'] = false; $content['DeleteEnabled'] = true; } else { $content['InitEnabled'] = true; $content['DeleteEnabled'] = false; } } // --- Check for saved reports! if ( isset($myReport['SAVEDREPORTS']) && count($myReport['SAVEDREPORTS']) > 0 ) { $content['HASSAVEDREPORTS'] = "true"; $content['SavedReportRowSpan'] = ( count($myReport['SAVEDREPORTS']) + 1); $content['SAVEDREPORTS'] = $myReport['SAVEDREPORTS']; $i = 0; // Help counter! foreach ($content['SAVEDREPORTS'] as &$mySavedReport ) { // --- Set CSS Class if ( $i % 2 == 0 ) $mySavedReport['srcssclass'] = "line1"; else $mySavedReport['srcssclass'] = "line2"; $i++; // --- } } // --- } else { $content['ISSHOWDETAILS'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_IDNOTFOUND'], $content['ReportID'] ); } } else { $content['ISSHOWDETAILS'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDID']; } } else if ($_GET['op'] == "removereport") { if ( isset($_GET['id']) ) { //PreInit these values $content['ReportID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); if ( isset($content['REPORTS'][ $content['ReportID'] ]) ) { // Get Reference to parser! $myReport = $content['REPORTS'][ $content['ReportID'] ]; if ( !$myReport["NeedsInit"] ) { // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_REPORTDOESNTNEEDTOBEREMOVED'], $myReport['DisplayName'] ) , "reports.php" ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_REPORTS_WARNREMOVE'], $myReport['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // TODO WHATEVER /* // Check if we have fields to delete if ( isset($myParser['CustomFieldsList']) && count($myParser['CustomFieldsList']) > 0 ) { // Helper counter $deletedFields = 0; // Loop through all custom fields! foreach( $myParser['CustomFieldsList'] as $myField ) { // check if field is in define list! if ( array_key_exists($myField['FieldID'], $fields) ) { $result = DB_Query( "DELETE FROM " . DB_FIELDS . " WHERE FieldID = '" . $myField['FieldID'] . "'"); DB_FreeQuery($result); // increment counter $deletedFields++; } } // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_HASBEENREMOVED'], $myParser['DisplayName'], $deletedFields ) , "parsers.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_NOFIELDS'], $content['ParserID'] ); } */ } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDID']; } } else if ($_GET['op'] == "initreport") { if ( isset($_GET['id']) ) { //PreInit these values $content['ReportID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); if ( isset($content['REPORTS'][ $content['ReportID'] ]) ) { // Get Reference to parser! $myParser = $content['REPORTS'][ $content['ReportID'] ]; // TODO WHATEVER /* // check for custom fields if ( isset($myParser['CustomFieldsList']) && count($myParser['CustomFieldsList']) > 0 ) { // Helper counter $addedFields = 0; // Loop through all custom fields! foreach( $myParser['CustomFieldsList'] as $myField ) { // check if field is in define list! if ( !array_key_exists($myField['FieldID'], $fields) ) { // Add field into DB! $sqlquery = "INSERT INTO " . DB_FIELDS . " (FieldID, FieldCaption, FieldDefine, SearchField, FieldAlign, DefaultWidth, FieldType, SearchOnline) VALUES ( '" . $myField['FieldID'] . "', '" . $myField['FieldCaption'] . "', '" . $myField['FieldDefine'] . "', '" . $myField['SearchField'] . "', '" . $myField['FieldAlign'] . "', " . $myField['DefaultWidth'] . ", " . $myField['FieldType'] . ", " . $myField['SearchOnline'] . " )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // increment counter $addedFields++; } } // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_HASBEENADDED'], $myParser['DisplayName'], $addedFields ) , "parsers.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_PARSERS_ERROR_NOFIELDS'], $content['ParserID'] ); } */ } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_IDNOTFOUND'], $content['ReportID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDID']; } } else if (strpos($_GET['op'], "addsavedreport") !== false ) { if ( isset($_GET['id']) ) { //PreInit these values $content['ReportID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); // Init Form variables $content['ISADDSAVEDREPORT'] = "true"; $content['REPORT_FORMACTION'] = "addsavedreport"; $content['REPORT_FORMACTIONRETURN'] = "addsavedreport_return"; $content['REPORT_SENDBUTTON'] = $content['LN_REPORTS_ADDSAVEDREPORT']; $content['REPORT_SENDANDRETURN'] = $content['LN_REPORTS_ADDSAVEDREPORTANDRETURN']; $content['FormUrlAddOP'] = "?op=addsavedreport&id=" . $content['ReportID']; // Check if report exists if ( isset($content['REPORTS'][ $content['ReportID'] ]) ) { // Get Reference to parser! $myReport = $content['REPORTS'][ $content['ReportID'] ]; // Set Extra language strings $content['REPORTS_DETAILSFOR'] = GetAndReplaceLangStr( $content['LN_REPORTS_DETAILSFOR'], $content['ReportID'] ); // Set Report properties $content['DisplayName'] = $myReport['DisplayName']; $content['Description'] = $myReport['Description']; // Set defaults for report $content['SavedReportID'] = ""; $content['customTitle'] = $myReport['DisplayName']; $content['customComment'] = ""; $content['filterString'] = ""; $content['filterString_htmlform'] = ""; // Init Custom Filters InitCustomFilterDefinitions($myReport, ""); // $content['customFilters'] = ""; // Copy Sources array for further modifications global $currentSourceID; $content['SOURCES'] = $content['Sources']; foreach ($content['SOURCES'] as &$mySource ) { $mySource['SourceID'] = $mySource['ID']; if ( $mySource['ID'] == $currentSourceID ) { $content['SourceID'] = $currentSourceID; $mySource['sourceselected'] = "selected"; } else $mySource['sourceselected'] = ""; } // Check if logstream is optimized! CheckConfiguredLogStreamSource($myReport, $content['SourceID']); // Create Outputlist $content['outputFormat'] = REPORT_OUTPUT_HTML; CreateOutputformatList( $content['outputFormat'] ); // Create Outputtargetlist $content['outputTarget'] = REPORT_TARGET_STDOUT; CreateOutputtargetList( $content['outputTarget'] ); // Init other outputTarget properties $content['outputTarget_filename'] = ""; // Create visible CronCommand $content['cronCommand'] = CreateCronCommand( $content['ReportID'] ); // Other settings ... TODO! // $content['customFilters'] = ""; // $content['outputTarget'] = ""; // $content['scheduleSettings'] = ""; } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDID']; } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDID']; } } else if (strpos($_GET['op'], "editsavedreport") !== false ) { // Set Mode to add $content['ISADDSAVEDREPORT'] = "true"; $content['REPORT_FORMACTION'] = "editsavedreport"; $content['REPORT_FORMACTIONRETURN'] = "editsavedreport_return"; $content['REPORT_SENDBUTTON'] = $content['LN_REPORTS_EDITSAVEDREPORT']; $content['REPORT_SENDANDRETURN'] = $content['LN_REPORTS_EDITSAVEDREPORTANDRETURN']; if ( isset($_GET['id']) ) { //PreInit these values $content['ReportID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); if ( isset($content['REPORTS'][ $content['ReportID'] ]) ) { // Get Reference to report! $myReport = $content['REPORTS'][ $content['ReportID'] ]; // Set Extra language strings $content['REPORTS_DETAILSFOR'] = GetAndReplaceLangStr( $content['LN_REPORTS_DETAILSFOR'], $content['ReportID'] ); // Now Get data from saved report! $content['SavedReportID'] = DB_RemoveBadChars($_GET['savedreportid']); if ( isset($myReport['SAVEDREPORTS'][$content['SavedReportID']]) ) { // Get Reference to savedreport! $mySavedReport = $myReport['SAVEDREPORTS'][$content['SavedReportID']]; // Subform helper $content['FormUrlAddOP'] = "?op=editsavedreport&id=" . $content['ReportID'] . "&savedreportid=" . $content['SavedReportID']; // Set Report properties $content['DisplayName'] = $myReport['DisplayName']; $content['Description'] = $myReport['Description']; // Set defaults for Savedreport $content['customTitle'] = $mySavedReport['customTitle']; $content['customComment'] = $mySavedReport['customComment']; $content['filterString'] = $mySavedReport['filterString']; $content['filterString_htmlform'] = htmlspecialchars($content['filterString']); // Init Custom Filters InitCustomFilterDefinitions($myReport, $mySavedReport['customFilters']); // $content['customFilters'] = $mySavedReport['customFilters']; // Copy Sources array for further modifications $content['SOURCES'] = $content['Sources']; foreach ($content['SOURCES'] as &$mySource ) { $mySource['SourceID'] = $mySource['ID']; if ( $mySource['ID'] == $mySavedReport['sourceid'] ) { $mySource['sourceselected'] = "selected"; $content['SourceID'] = $mySavedReport['sourceid']; } else $mySource['sourceselected'] = ""; } // Check if sourceid is valid if ( !isset($content['SourceID']) ) { $content['ISERROR'] = true; $content['ERROR_CODE'] = ERROR_SOURCENOTFOUND; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_GEN_ERROR_SOURCENOTFOUND'], $mySource['ID']); } else { // Check if logstream is optimized! CheckConfiguredLogStreamSource($myReport, $content['SourceID']); } // Create Outputlist $content['outputFormat'] = $mySavedReport['outputFormat']; CreateOutputformatList( $content['outputFormat'] ); // Create Outputtargetlist $content['outputTarget'] = $mySavedReport['outputTarget']; CreateOutputtargetList( $content['outputTarget'] ); // Init other outputTarget properties $content['outputTarget_filename'] = ""; InitOutputtargetDefinitions($myReport, $mySavedReport['outputTargetDetails']); // Create visible CronCommand $content['cronCommand'] = CreateCronCommand( $content['ReportID'], $content['SavedReportID'] ); // Other settings ... TODO! $content['scheduleSettings'] = ""; } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDSAVEDREPORTID']; } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDID']; } } } else if ($_GET['op'] == "removesavedreport") { // Get SavedReportID! if ( isset($_GET['savedreportid']) ) { //PreInit these values $content['SavedReportID'] = DB_RemoveBadChars($_GET['savedreportid']); // Get GroupInfo $result = DB_Query("SELECT customTitle FROM " . DB_SAVEDREPORTS . " WHERE ID = " . $content['SavedReportID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['customTitle']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_SAVEDREPORTIDNOTFOUND'], $content['SavedReportID'] ); } else { // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_REPORTS_WARNDELETESAVEDREPORT'], $myrow['customTitle'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_SAVEDREPORTS . " WHERE ID = " . $content['SavedReportID'] ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_DELSAVEDREPORT'], $content['SavedReportID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_HASBEENDEL'], $myrow['customTitle'] ) , "reports.php" ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_INVALIDSAVEDREPORTID']; } } else if ($_GET['op'] == "onlinelist") { // Set Mode to list Online Reports $content['LISTONLINEREPORTS'] = "true"; $content['OPTIONAL_TITLE'] = " - " . $content['LN_REPORTMENU_ONLINELIST']; if ( InitOnlineReports() ) { $j = 0; // Help counter! foreach ($content['ONLINEREPORTS'] as &$myOnlineReport ) { // Split reportID preg_match("/report\.(.*?)\.(.*?)\.class$/", $myOnlineReport['reportid'], $out ); $myOnlineReport['reportcat'] = $out[1]; $myOnlineReport['reportid'] = $out[2]; // Set Installed Flag! $myOnlineReport['installed'] = false; foreach($content['REPORTS'] as $myReport) { // check if already installed! if ( $myOnlineReport['reportid'] == $myReport['ID'] ) $myOnlineReport['installed'] = true; } // --- Set Icon! if ( $myOnlineReport['installed'] ) { $myOnlineReport['installed_icon'] = $content['MENU_CHECKED']; $myOnlineReport['installed_text'] = $content['LN_REPORTS_INSTALLED']; } else { $myOnlineReport['installed_icon'] = $content['MENU_DELETE']; $myOnlineReport['installed_text'] = $content['LN_REPORTS_NOTINSTALLED']; } // --- // --- Set CSS Class if ( $j % 2 == 0 ) $myOnlineReport['cssclass'] = "line1"; else $myOnlineReport['cssclass'] = "line2"; $j++; // --- } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_ONLINELIST']; } } } // --- Additional work regarding FilterDisplay todo for the edit view if ( isset($content['ISADDSAVEDREPORT']) && $content['ISADDSAVEDREPORT'] ) { // If Filters are send using POST we read them and create a FilterSting! // Init Filterstring variable $szFilterString = ""; if ( // ( strlen($content['filterString']) <= 0 && // isset($_POST['report_filterString']) ) // || ( strlen($content['filterString']) > 0 && !isset($_POST['subop']) && !isset($_POST['subop_edit']) && !isset($_POST['subop_delete']) && ( isset($_POST['report_filterString']) && $content['filterString'] != $_POST['report_filterString'] ) ) ) { // Overwrite filterString from form data instead of filter array! $content['filterString'] = DB_RemoveBadChars($_POST['report_filterString']); $content['filterString_htmlform'] = htmlspecialchars($content['filterString']); } else { // Process POST data! if ( isset($_POST['Filters']) ) { // Get Filter array $AllFilters = $_POST['Filters']; // Loop through filters and build filterstring! $i = 0; foreach( $AllFilters as $tmpFilterID ) { if ( isset($_POST['subop_delete']) && $_POST['subop_delete'] == $i ) { // Do nothing, user wants this filter to be deleted! } else { // Get Comparison Bit if ( isset($_POST['newcomparison_' . $i]) ) $tmpComparison = DB_RemoveBadChars($_POST['newcomparison_' . $i]); else $tmpComparison = 0; // Default bit // Get FilterValue if ( isset($_POST['FilterValue_' . $i]) ) $tmpFilterValue = DB_RemoveBadChars($_POST['FilterValue_' . $i]); else $tmpFilterValue = ""; // Default value // Get Filtertype from FilterID if ( isset($fields[$tmpFilterID]) ) { // Append to Filterstring $tmpField = $fields[ $tmpFilterID ]; if ( $tmpField['FieldType'] == FILTER_TYPE_DATE ) { // Append comparison switch ( $tmpComparison ) { case 4: // DATEMODE_RANGE_FROM $szFilterString .= "datefrom:"; $szFilterString .= CreateTimeStampFromValues($i); break; case 5: // DATEMODE_RANGE_TO $szFilterString .= "dateto:"; $szFilterString .= CreateTimeStampFromValues($i); break; case 3: // DATEMODE_LASTX $szFilterString .= "datelastx:"; if ( isset($_POST['filter_daterange_last_x_' . $i]) ) $szFilterString .= DB_RemoveBadChars($_POST['filter_daterange_last_x_' . $i]); else $szFilterString .= DATE_LASTX_24HOURS; // Default value break; } } else if ( $tmpField['FieldType'] == FILTER_TYPE_NUMBER ) { // Append Fieldname $szFilterString .= $tmpField['SearchField']; // Append comparison switch ( $tmpComparison ) { case 1: // FILTER_MODE_INCLUDE $szFilterString .= ":="; break; case 2: // FILTER_MODE_EXCLUDE $szFilterString .= ":-="; break; } if ( $tmpFilterID == SYSLOG_SEVERITY ) { // Append field value $szFilterString .= GetSeverityDisplayName($tmpFilterValue); } else if ( $tmpFilterID == SYSLOG_FACILITY ) { // Append field value $szFilterString .= GetFacilityDisplayName($tmpFilterValue); } else { // Append field value $szFilterString .= $tmpFilterValue; } } else if ( $tmpField['FieldType'] == FILTER_TYPE_STRING ) { // Append Fieldname, if set! if (isset($tmpField['SearchField']) && strlen($tmpField['SearchField']) > 0 ) $szFilterString .= $tmpField['SearchField'] . ":"; // Append comparison switch ( $tmpComparison ) { case 1: // FILTER_MODE_INCLUDE $szFilterString .= ""; break; case 2: // FILTER_MODE_EXCLUDE $szFilterString .= "-"; break; case 5: // FILTER_MODE_INCLUDE + FILTER_MODE_SEARCHFULL $szFilterString .= "="; break; case 6: // FILTER_MODE_EXCLUDE + FILTER_MODE_SEARCHFULL $szFilterString .= "-="; break; case 9: // FILTER_MODE_INCLUDE + FILTER_MODE_SEARCHREGEX $szFilterString .= "~"; break; case 10: // FILTER_MODE_EXCLUDE + FILTER_MODE_SEARCHREGEX $szFilterString .= "-~"; break; } // Append field value if ( strpos($tmpFilterValue, " ") === false || (substr($tmpFilterValue, 0, 1) == "\"" && substr($tmpFilterValue, strlen($tmpFilterValue)-1, 1) == "\"" ) ) $szFilterString .= $tmpFilterValue; else // Spaces are in search value, so we add quotes to the string! $szFilterString .= "\"" . $tmpFilterValue . "\""; } // Append trailing space $szFilterString .= " "; } } //Increment Helpcounter $i++; } // Reset Allfilters Array to NULL in this case! if ( strlen($szFilterString) <= 0 ) { $content['filterString'] = ""; $content['filterString_htmlform'] = ""; } /* // DEBUG stuff echo $content['filterString'] . "
\r\n"; echo $szFilterString . "
\r\n"; print_r ( $AllFilters ); // */ } } // Add new filter if wanted if ( isset($_POST['subop']) ) { if ( $_POST['subop'] == $content['LN_REPORTS_ADDFILTER'] && isset($_POST['newfilter']) ) { if ( isset($fields[ $_POST['newfilter'] ]) ) { // Get Field Info $myNewField = $fields[ $_POST['newfilter'] ]; if ( $myNewField['FieldType'] == FILTER_TYPE_DATE ) { $szFilterString .= "datelastx:" . DATE_LASTX_24HOURS; } else if ( $myNewField['FieldType'] == FILTER_TYPE_NUMBER ) { // Append sample filter $szFilterString .= $myNewField['SearchField']. ":="; if ( $myNewField['FieldID'] == SYSLOG_SEVERITY ) { // Append field value $szFilterString .= GetSeverityDisplayName(SYSLOG_NOTICE); } else if ( $myNewField['FieldID'] == SYSLOG_FACILITY ) { // Append field value $szFilterString .= GetFacilityDisplayName(SYSLOG_LOCAL0); } else { // Append sample value $szFilterString .= "1"; } } else if ( $myNewField['FieldType'] == FILTER_TYPE_STRING ) { // Searchfield filter if (isset($myNewField['SearchField']) && strlen($myNewField['SearchField']) > 0 ) $szFilterString .= $myNewField['SearchField'] . ":"; // Append sample $szFilterString .= "sample"; } } // Append to Filterstring } } // Copy Final Filterstring if necessary if ( strlen($szFilterString) > 0 ) { $content['filterString'] = $szFilterString; $content['filterString_htmlform'] = htmlspecialchars($szFilterString); } // echo $content['SourceID']; if ( isset($content['SourceID']) && isset($content['Sources'][$content['SourceID']]['ObjRef']) ) { // Obtain and get the Config Object $stream_config = $content['Sources'][$content['SourceID']]['ObjRef']; // Create LogStream Object $stream = $stream_config->LogStreamFactory($stream_config); $stream->SetFilter( $content['filterString'] ); // Copy filter array $AllFilters = $stream->ReturnFiltersArray(); } if ( isset($AllFilters) ) { //$AllFilters = $content['AllFilters']; foreach( $AllFilters as $tmpFieldId=>$tmpFieldFilters ) { foreach( $tmpFieldFilters as $tmpFilter ) { // Create new row $aNewFilter = array(); $aNewFilter['FilterFieldID'] = $tmpFieldId; $aNewFilter['FilterType'] = $tmpFilter[FILTER_TYPE]; $aNewFilter['FilterValue'] = $tmpFilter[FILTER_VALUE]; if ( isset($tmpFilter[FILTER_DATEMODE]) ) $aNewFilter['FilterDateMode'] = $tmpFilter[FILTER_DATEMODE]; if ( isset($tmpFilter[FILTER_MODE]) ) $aNewFilter['FilterMode'] = $tmpFilter[FILTER_MODE]; // $aNewFilter['FilterInternalID' => 1, // $aNewFilter['FilterCaption' => "1", // Add to filters array $content['SUBFILTERS'][] = $aNewFilter; } } } // Init Comparison Arrays $ComparisonsNumber[] = array ( 'ComparisonBit' => FILTER_MODE_INCLUDE, 'ComparisonCaption' => "=", ); $ComparisonsNumber[] = array ( 'ComparisonBit' => FILTER_MODE_EXCLUDE, 'ComparisonCaption' => "!=", ); $ComparisonsString[] = array ('ComparisonBit' => FILTER_MODE_INCLUDE, 'ComparisonCaption' => "contains", ); $ComparisonsString[] = array ('ComparisonBit' => FILTER_MODE_EXCLUDE, 'ComparisonCaption' => "does not contain", ); $ComparisonsString[] = array ('ComparisonBit' => FILTER_MODE_INCLUDE + FILTER_MODE_SEARCHFULL, 'ComparisonCaption' => "equals", ); $ComparisonsString[] = array ('ComparisonBit' => FILTER_MODE_EXCLUDE + FILTER_MODE_SEARCHFULL, 'ComparisonCaption' => "does not equal", ); $ComparisonsString[] = array ('ComparisonBit' => FILTER_MODE_INCLUDE + FILTER_MODE_SEARCHREGEX, 'ComparisonCaption' => "matches regular expression", ); $ComparisonsString[] = array ('ComparisonBit' => FILTER_MODE_EXCLUDE + FILTER_MODE_SEARCHREGEX, 'ComparisonCaption' => "does not matches regular expression", ); $ComparisonsDate[] = array ('ComparisonBit' => DATEMODE_LASTX, 'ComparisonCaption' => "last", ); $ComparisonsDate[] = array ('ComparisonBit' => DATEMODE_RANGE_FROM, 'ComparisonCaption' => "From", ); $ComparisonsDate[] = array ('ComparisonBit' => DATEMODE_RANGE_TO, 'ComparisonCaption' => "To", ); // Prepare Filters for display if ( isset($content['SUBFILTERS']) ) { $i = 0; // Help counter! foreach( $content['SUBFILTERS'] as &$tmpFilter ) { // Set Field Displayname if ( isset($fields[ $tmpFilter['FilterFieldID'] ]['FieldCaption']) ) $tmpFilter['FilterFieldName'] = $fields[ $tmpFilter['FilterFieldID'] ]['FieldCaption']; else $tmpFilter['FilterFieldName'] = $tmpFilter['FilterFieldID']; // --- Set CSS Class if ( $i % 2 == 0 ) $tmpFilter['colcssclass'] = "line1"; else $tmpFilter['colcssclass'] = "line2"; $i++; // --- if ( $tmpFilter['FilterType'] == FILTER_TYPE_STRING ) $tmpFilter['Comparisons'] = $ComparisonsString; else if ( $tmpFilter['FilterType'] == FILTER_TYPE_NUMBER ) $tmpFilter['Comparisons'] = $ComparisonsNumber; else if ( $tmpFilter['FilterType'] == FILTER_TYPE_DATE ) $tmpFilter['Comparisons'] = $ComparisonsDate; // Set right checkbox item foreach( $tmpFilter['Comparisons'] as &$tmpComparisons ) { if ( $tmpFilter['FilterType'] == FILTER_TYPE_DATE ) { if ( $tmpComparisons['ComparisonBit'] == $tmpFilter['FilterDateMode'] ) $tmpComparisons['cp_selected'] = "selected"; else $tmpComparisons['cp_selected'] = ""; // Init Date Field Helpers! InitDatefieldHelpers( $tmpFilter ); } else { // print_r ( $tmpFilter ); // echo $tmpComparisons['ComparisonBit'] . " - " . FILTER_MODE_EXCLUDE . " - " . FILTER_MODE; // exit; if ( $tmpComparisons['ComparisonBit'] == $tmpFilter['FilterMode'] ) $tmpComparisons['cp_selected'] = "selected"; else $tmpComparisons['cp_selected'] = ""; } } } // print_r( $content['SUBFILTERS'] ); } // --- Copy fields data array $content['FIELDS'] = $fields; // set fieldcaption foreach ($content['FIELDS'] as $key => &$myField ) { // Set Fieldcaption if ( isset($myField['FieldCaption']) ) $myField['FieldCaption'] = $myField['FieldCaption']; else $myField['FieldCaption'] = $key; // Append Internal FieldID $myField['FieldCaption'] .= " (" . $fields[$key]['FieldDefine'] . ")"; } // --- } // Handle POST requests if ( isset($_POST['op']) ) { // Get ReportID! if ( isset($_POST['id']) ) { $content['ReportID'] = DB_RemoveBadChars($_POST['id']); } else {$content['ReportID'] = ""; } // Only Continue if reportid is valud! if ( isset($content['REPORTS'][ $content['ReportID'] ]) ) { // Get Reference to parser! $myReport = $content['REPORTS'][ $content['ReportID'] ]; // Get SavedReportID! if ( isset($_POST['savedreportid']) ) { $content['SavedReportID'] = DB_RemoveBadChars($_POST['savedreportid']); } else {$content['SavedReportID'] = ""; } // Read parameters if ( isset($_POST['SourceID']) ) { $content['SourceID'] = DB_RemoveBadChars($_POST['SourceID']); } if ( isset($_POST['report_customtitle']) ) { $content['customTitle'] = DB_RemoveBadChars($_POST['report_customtitle']); } else {$content['report_customtitle'] = ""; } if ( isset($_POST['report_customcomment']) ) { $content['customComment'] = DB_RemoveBadChars($_POST['report_customcomment']); } else {$content['report_customcomment'] = ""; } // Check for $content['ERROR_CODE'] if ( isset($content['ERROR_CODE']) && $content['ERROR_CODE'] == ERROR_SOURCENOTFOUND ) { // Disable Error Display in this case unset($content['ISERROR']); } if ( isset($_POST['outputFormat']) ) { $content['outputFormat'] = DB_RemoveBadChars($_POST['outputFormat']); } if ( isset($_POST['outputTarget']) ) { $content['outputTarget'] = DB_RemoveBadChars($_POST['outputTarget']); } if ( isset($_POST['outputTarget_filename']) ) { $content['outputTarget_filename'] = DB_RemoveBadChars($_POST['outputTarget_filename']); } // Read Custom Filters foreach ( $content['CUSTOMFILTERS'] as &$tmpCustomFilter ) { // Set fieldvalue if available from POST data if ( $tmpCustomFilter['filtertype'] == FILTER_TYPE_BOOL ) { if ( isset($_POST[ $tmpCustomFilter['fieldname'] ]) ) $tmpCustomFilter['fieldvalue'] = 1; else $tmpCustomFilter['fieldvalue'] = 0; } else { if ( isset($_POST[ $tmpCustomFilter['fieldname'] ]) ) { $tmpCustomFilter['fieldvalue'] = DB_RemoveBadChars($_POST[ $tmpCustomFilter['fieldname'] ]); } } } // Read done, now build "customFilters" string! $content['customFilters'] = ""; foreach ( $content['CUSTOMFILTERS'] as &$tmpCustomFilter ) { // Append comma if necessary if (strlen($content['customFilters']) > 0) $content['customFilters'] .= ", "; // Append customFilter! $content['customFilters'] .= $tmpCustomFilter['fieldname'] . "=>" . $tmpCustomFilter['fieldvalue']; } // TODO! // customFilters, outputTarget, scheduleSettings // $content['customFilters'] = ""; // $content['outputTarget'] = ""; $content['scheduleSettings'] = ""; // --- Check mandotary values if ( $content['customTitle'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_REPORTS_CUSTOMTITLE'] ); } else if ( !isset($content['SourceID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_REPORTS_SOURCEID'] ); } else if ( !isset($content['outputFormat']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_REPORTS_OUTPUTFORMAT'] ); } else if ( !isset($content['outputTarget']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_CHARTS_ERROR_MISSINGPARAM'], $content['LN_REPORTS_OUTPUTTARGET'] ); } // --- // --- Now Verify Report Source! // Create tmpSavedReport! $tmpSavedReport["SavedReportID"] = 0; $tmpSavedReport["sourceid"] = $content['SourceID']; $tmpSavedReport["customTitle"] = $content['customTitle']; $tmpSavedReport["customComment"] = $content['customComment']; $tmpSavedReport["filterString"] = $content['filterString']; $tmpSavedReport["customFilters"] = $content['customFilters']; $tmpSavedReport["outputFormat"] = $content['outputFormat']; $tmpSavedReport["outputTarget"] = $content['outputTarget']; $tmpSavedReport["scheduleSettings"] = $content['scheduleSettings']; $tmpSavedReport["outputTargetDetails"] = ""; // Init Value if ( isset($content['outputTarget_filename']) ) $tmpSavedReport["outputTargetDetails"] .= "filename=>" . $content['outputTarget_filename'] . ","; $content["outputTargetDetails"] = $tmpSavedReport["outputTargetDetails"]; // Copy into content var // Get Objectreference to report $myReportObj = $myReport["ObjRef"]; // Set SavedReport Settings! $myReportObj->InitFromSavedReport($tmpSavedReport); // Perform check $res = $myReportObj->verifyDataSource(); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_ERRORCHECKINGSOURCE'], GetAndReplaceLangStr( GetErrorMessage($res), $content['SourceID']) ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // --- // --- Now ADD/EDIT do the processing! if ( !isset($content['ISERROR']) ) { // Everything was alright, so we go to the next step! if ( strpos($_POST['op'], "addsavedreport") !== false ) { // Add custom search now! $sqlquery = "INSERT INTO " . DB_SAVEDREPORTS . " (reportid, sourceid, customTitle, customComment, filterString, customFilters, outputFormat, outputTarget, outputTargetDetails, scheduleSettings) VALUES ('" . $content['ReportID'] . "', " . $content['SourceID'] . ", '" . $content['customTitle'] . "', '" . $content['customComment'] . "', '" . $content['filterString'] . "', '" . $content['customFilters'] . "', '" . $content['outputFormat'] . "', '" . $content['outputTarget'] . "', '" . $content['outputTargetDetails'] . "', '" . $content['scheduleSettings'] . "' )"; // Perform INSERT $result = DB_Query($sqlquery); // Get INSERTID from query! $lastInsertID = mysql_insert_id(); // free ressources DB_FreeQuery($result); // Do the final redirect if ( strpos($_POST['op'], "_return") !== false ) RedirectResult( GetAndReplaceLangStr( $content['LN_REPORTS_HASBEENADDED'], DB_StripSlahes($content['customTitle']) ) , "reports.php" ); else { // Correct FormUrlAddUrl! $szRediUrl = str_replace( "op=addsavedreport", "op=editsavedreport", $content['FormUrlAddOP']); $szRediUrl .= "&savedreportid=" . $lastInsertID; // Redirect to editpage! RedirectResult( GetAndReplaceLangStr( $content['LN_REPORTS_HASBEENADDED'], DB_StripSlahes($content['customTitle']) ) , "reports.php" . $szRediUrl ); } } else if ( strpos($_POST['op'], "editsavedreport") !== false ) { $result = DB_Query("SELECT ID FROM " . DB_SAVEDREPORTS . " WHERE ID = " . $content['SavedReportID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_SAVEDREPORTIDNOTFOUND'], $content['SavedReportID'] ); } else { $sqlquery = "UPDATE " . DB_SAVEDREPORTS . " SET sourceid = " . $content['SourceID'] . ", customTitle = '" . $content['customTitle'] . "', customComment = '" . $content['customComment'] . "', filterString = '" . $content['filterString'] . "', customFilters = '" . $content['customFilters'] . "', outputFormat = '" . $content['outputFormat'] . "', outputTarget = '" . $content['outputTarget'] . "', outputTargetDetails = '" . $content['outputTargetDetails'] . "', scheduleSettings = '" . $content['scheduleSettings'] . "' WHERE ID = " . $content['SavedReportID']; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Done redirect! if ( strpos($_POST['op'], "_return") !== false ) RedirectResult( GetAndReplaceLangStr( $content['LN_REPORTS_HASBEENEDIT'], DB_StripSlahes($content['customTitle']) ) , "reports.php" ); else RedirectResult( GetAndReplaceLangStr( $content['LN_REPORTS_HASBEENEDIT'], DB_StripSlahes($content['customTitle']) ) , "reports.php" . $content['FormUrlAddOP'] ); } } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_IDNOTFOUND'], $content['ReportID'] ); } } // Default mode! if ( !isset($_POST['op']) && !isset($_GET['op']) ) { if ( isset($content['REPORTS']) ) { // Default Mode = List Searches $content['LISTREPORTS'] = "true"; $content['OPTIONAL_TITLE'] = " - " . $content['LN_REPORTMENU_LIST']; $i = 0; // Help counter! foreach ($content['REPORTS'] as &$myReport ) { // Set if help link is enabled if ( strlen($myReport['ReportHelpArticle']) > 0 ) $myReport['ReportHelpEnabled'] = true; else $myReport['ReportHelpEnabled'] = false; // check for custom fields if ( $myReport['NeedsInit'] ) // && count($myReport['CustomFieldsList']) > 0 ) { // Needs custom fields! $myReport['EnableNeedsInit'] = true; if ( $myReport['Initialized'] ) { $myReport['InitEnabled'] = false; $myReport['DeleteEnabled'] = true; } else { $myReport['InitEnabled'] = true; $myReport['DeleteEnabled'] = false; } } // --- Set CSS Class if ( $i % 2 == 0 ) $myReport['cssclass'] = "line1"; else $myReport['cssclass'] = "line2"; $i++; // --- // --- Check for saved reports! if ( isset($myReport['SAVEDREPORTS']) && count($myReport['SAVEDREPORTS']) > 0 ) { $myReport['HASSAVEDREPORTS'] = "true"; $myReport['SavedReportRowSpan'] = ( count($myReport['SAVEDREPORTS']) + 1); $j = 0; // Help counter! foreach ($myReport['SAVEDREPORTS'] as &$mySavedReport ) { // --- Set CSS Class if ( $j % 2 == 0 ) $mySavedReport['srcssclass'] = "line1"; else $mySavedReport['srcssclass'] = "line2"; $j++; // --- } } // --- } } else { $content['LISTREPORTS'] = "false"; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_REPORTS_ERROR_NOREPORTS']; } } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_REEPORTSOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_reports.html"); $page -> output(); // --- // --- // --- BEGIN Helper functions // --- /* * Helper function to init custom filters from report */ function CheckConfiguredLogStreamSource($myReport, $mySourceID) { global $content, $extraErrorDescription; // Get Objectreference to report $myReportObj = $myReport["ObjRef"]; // Handle GET and POST input! $content['MSG_WARNING_FORMURL'] = $_SERVER['SCRIPT_NAME'] . "?"; $content['MSG_CHECK_URL'] = $_SERVER['SCRIPT_NAME'] . "?"; foreach ($_GET as $varname => $varvalue) { // All variables! $content['MSG_WARNING_FORMURL'] .= $varname . "=" . $varvalue . "&"; // Skip the Optimize variable! if (strpos( $varname, "optimize" ) === false ) $content['MSG_CHECK_URL'] .= $varname . "=" . $varvalue . "&"; } foreach ($_POST as $varname => $varvalue) $content['POST_VARIABLES'][] = array( "varname" => $varname, "varvalue" => $varvalue ); // Append Force Optimice Paramater $content['MSG_CHECK_URL'] .= "forcecheckoptimize=true"; // Check if optimize variable is set! if ( isset($_GET['optimize']) ) { // Check what we have to do if ( $_GET['optimize'] == "addfields" ) { // This will create all INDEXES we need for this logstream! $res = $myReportObj->CreateMissingLogStreamFields( $mySourceID ); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_FAILED_ADDING_FIELDS'], $content['SOURCES'][$mySourceID]['Name'], $res ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // Show information in performance warning area $content['ISSOURCENOTOPTIMIZED'] = true; $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_FIELDS_CREATED']; $content['MSG_WARNING_CLASS'] = 'PriorityNotice'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_FIELDS_CREATED_SUCCESS'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "false"; // return result return $res; } else if ( $_GET['optimize'] == "indexes" ) { // This will create all INDEXES we need for this logstream! $res = $myReportObj->CreateLogStreamIndexes( $mySourceID ); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_FAILED_CREATE_INDEXES'], $content['SOURCES'][$mySourceID]['Name'], $res ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // Show information in performance warning area $content['ISSOURCENOTOPTIMIZED'] = true; $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_INDEX_CREATED']; $content['MSG_WARNING_CLASS'] = 'PriorityNotice'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_INDEX_CREATED_SUCCESS'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "false"; // return result return $res; } else if ( $_GET['optimize'] == "trigger" ) { // This will create all INDEXES we need for this logstream! $res = $myReportObj->CreateLogStreamTrigger( $mySourceID ); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_FAILED_CREATE_TRIGGER'], $content['SOURCES'][$mySourceID]['Name'], $res ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } else { // Show information in performance warning area $content['ISSOURCENOTOPTIMIZED'] = true; $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_TRIGGER_CREATED']; $content['MSG_WARNING_CLASS'] = 'PriorityNotice'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_TRIGGER_CREATED_SUCCESS'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "false"; } // return result return $res; } else if ( $_GET['optimize'] == "checksum" ) { // This will create all INDEXES we need for this logstream! $res = $myReportObj->ChangeChecksumFieldUnsigned( $mySourceID ); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_FAILED_CHANGE_CHECKSUM'], $content['SOURCES'][$mySourceID]['Name'], $res ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } else { // Show information in performance warning area $content['ISSOURCENOTOPTIMIZED'] = true; $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_CHECKSUM_CHANGED']; $content['MSG_WARNING_CLASS'] = 'PriorityNotice'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_CHECKSUM_CHANGED_SUCCESS'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "false"; } // return result return $res; } } // Use SESSION to check if Source needs to be checked for optimization $bForceCheck = false; if ( !isset($_SESSION['Sources'][$mySourceID]['optimized']) || $_SESSION['Sources'][$mySourceID]['optimized'] == false || ( isset($_GET['forcecheckoptimize']) && $_GET['forcecheckoptimize'] == "true" ) ) // Set Checking to true! $bForceCheck = true; // Lets see if we need to check if ( $bForceCheck ) { // Run checks $res = $myReportObj->CheckLogStreamSource( $mySourceID ); if ( $res != SUCCESS ) { // Current Logstream Source is not optimized! Show to user! $content['ISSOURCENOTOPTIMIZED'] = true; if ( $res == ERROR_DB_DBFIELDNOTFOUND ) { $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_PERFORMANCE_WARNING']; $content['MSG_WARNING_CLASS'] = 'PriorityWarning'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_ADD_MISSINGFIELDS'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "true"; $content['MSG_WARNING_FORMURL'] .= "optimize=addfields"; // Addmissing fields } else if ( $res == ERROR_DB_INDEXESMISSING ) { $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_PERFORMANCE_WARNING']; $content['MSG_WARNING_CLASS'] = 'PriorityWarning'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_OPTIMIZE_INDEXES'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "true"; $content['MSG_WARNING_FORMURL'] .= "optimize=indexes"; // Add missing INDEXES } else if ( $res == ERROR_DB_TRIGGERMISSING ) { $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_PERFORMANCE_WARNING']; $content['MSG_WARNING_CLASS'] = 'PriorityWarning'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_OPTIMIZE_TRIGGER'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "true"; $content['MSG_WARNING_FORMURL'] .= "optimize=trigger"; // Add missing TRIGGERS } else if ( $res == ERROR_DB_CHECKSUMERROR ) { $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_PERFORMANCE_WARNING']; $content['MSG_WARNING_CLASS'] = 'PriorityWarning'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_CHANGE_CHECKSUM'], $content['SOURCES'][$mySourceID]['Name'] ); $content['MSG_WARNING_SUBMITFORM'] = "true"; $content['MSG_WARNING_FORMURL'] .= "optimize=checksum"; // Change Checksum field! } else { $content['MSG_WARNING_TITLE'] = $content['LN_REPORTS_SOURCE_WARNING']; $content['MSG_WARNING_CLASS'] = 'PriorityWarning'; $content['MSG_WARNING_DETAILS'] = GetAndReplaceLangStr( $content['LN_REPORTS_ERROR_FAILED_SOURCE_CHECK'], $content['SOURCES'][$mySourceID]['Name'], GetErrorMessage($res) ); $content['MSG_WARNING_SUBMITFORM'] = "true"; $content['MSG_WARNING_FORMURL'] .= "forcecheckoptimize=true"; // Change Checksum field! } } else { // Check was successfull! Set Checked Property in LogStream Source $_SESSION['Sources'][$mySourceID]['optimized'] = true; } } } /* * Helper function to init custom filters from report */ function InitCustomFilterDefinitions($myReport, $CustomFilterValues) { global $content; // Get Objectreference to report $myReportObj = $myReport["ObjRef"]; // Get Array of Custom filter Defs $customFilterDefs = $myReportObj->GetCustomFiltersDefs(); // Include Custom language file if available $myReportObj->InitReportLanguageFile( $myReportObj->GetReportIncludePath() ); // Parse and Split CustomFilterValues if ( strlen($CustomFilterValues) > 0 ) { $tmpFilterValues = explode( ",", $CustomFilterValues ); //Loop through mappings foreach ($tmpFilterValues as &$myFilterValue ) { // Split subvalues $tmpArray = explode( "=>", $myFilterValue ); // Set into temporary array $tmpfilterid = trim($tmpArray[0]); $myFilterValues[$tmpfilterid] = trim($tmpArray[1]); } } // Loop through filters $i = 0; // Help counter! foreach( $customFilterDefs as $filterID => $tmpCustomFilter ) { // Check if value is available in $CustomFilterValues if ( isset($myFilterValues[$filterID]) ) $szDefaultValue = $myFilterValues[$filterID]; else $szDefaultValue = $tmpCustomFilter['DefaultValue']; // TODO Check MIN and MAX value! // --- Set CSS Class if ( $i % 2 == 0 ) $szColcssclass = "line1"; else $szColcssclass = "line2"; $i++; // --- // Set Checkbox value if ( $tmpCustomFilter['filtertype'] == FILTER_TYPE_BOOL && $szDefaultValue == 1 ) { $szFieldValueSelected = "checked"; } else { $szFieldValueSelected = ""; } // Add to Display Array of custom filters! $content['CUSTOMFILTERS'][] = array ( 'fieldname' => $filterID, 'fieldcaption' => $content[ $tmpCustomFilter['DisplayLangID'] ], 'fielddescription' => $content[ $tmpCustomFilter['DescriptLangID'] ], 'filtertype' => $tmpCustomFilter['filtertype'], 'fieldvalue' => $szDefaultValue, 'fieldvalue_selected' => $szFieldValueSelected, 'colcssclass' => $szColcssclass, ); } } function InitOutputtargetDefinitions($myReport, $outputTargetDetails) { global $content; // Get Objectreference to report $myReportObj = $myReport["ObjRef"]; // Init Detail variables manually $myReportObj->SetOutputTargetDetails($outputTargetDetails); // Get Array of Custom filter Defs $outputTargetArray = $myReportObj->GetOutputTargetDetails(); if ( isset($outputTargetArray) && count($outputTargetArray) > 0 ) { // Loop through Detail Properties $i = 0; // Help counter! foreach( $outputTargetArray as $propertyID => $propertyValue ) { // Set property Value by ID $content['outputTarget_' . $propertyID] = $propertyValue; } } } /* * Helper functions to init a Datefield */ function InitDatefieldHelpers( &$myFilter ) { global $content; global $currentTime, $currentDay, $currentMonth, $currentYear, $tomorrowTime, $tomorrowDay, $tomorrowMonth, $tomorrowYear; if ( $myFilter['FilterDateMode'] == DATEMODE_LASTX ) $myFilter['filter_lastx_default'] = intval($myFilter['FilterValue']); else $myFilter['filter_lastx_default'] = DATE_LASTX_7DAYS; $myFilter['MyFilter_daterange_last_x_list'][0]['LastXID'] = DATE_LASTX_HOUR; $myFilter['MyFilter_daterange_last_x_list'][0]['LastXDisplayName'] = $content['LN_DATE_LASTX_HOUR']; if ( $myFilter['filter_lastx_default'] == DATE_LASTX_HOUR ) { $myFilter['MyFilter_daterange_last_x_list'][0]['selected'] = "selected"; } else { $myFilter['MyFilter_daterange_last_x_list'][0]['selected'] = ""; } $myFilter['MyFilter_daterange_last_x_list'][1]['LastXID'] = DATE_LASTX_12HOURS; $myFilter['MyFilter_daterange_last_x_list'][1]['LastXDisplayName'] = $content['LN_DATE_LASTX_12HOURS']; if ( $myFilter['filter_lastx_default'] == DATE_LASTX_12HOURS ) { $myFilter['MyFilter_daterange_last_x_list'][1]['selected'] = "selected"; } else { $myFilter['MyFilter_daterange_last_x_list'][1]['selected'] = ""; } $myFilter['MyFilter_daterange_last_x_list'][2]['LastXID'] = DATE_LASTX_24HOURS; $myFilter['MyFilter_daterange_last_x_list'][2]['LastXDisplayName'] = $content['LN_DATE_LASTX_24HOURS']; if ( $myFilter['filter_lastx_default'] == DATE_LASTX_24HOURS ) { $myFilter['MyFilter_daterange_last_x_list'][2]['selected'] = "selected"; } else { $myFilter['MyFilter_daterange_last_x_list'][2]['selected'] = ""; } $myFilter['MyFilter_daterange_last_x_list'][3]['LastXID'] = DATE_LASTX_7DAYS; $myFilter['MyFilter_daterange_last_x_list'][3]['LastXDisplayName'] = $content['LN_DATE_LASTX_7DAYS']; if ( $myFilter['filter_lastx_default'] == DATE_LASTX_7DAYS ) { $myFilter['MyFilter_daterange_last_x_list'][3]['selected'] = "selected"; } else { $myFilter['MyFilter_daterange_last_x_list'][3]['selected'] = ""; } $myFilter['MyFilter_daterange_last_x_list'][4]['LastXID'] = DATE_LASTX_31DAYS; $myFilter['MyFilter_daterange_last_x_list'][4]['LastXDisplayName'] = $content['LN_DATE_LASTX_31DAYS']; if ( $myFilter['filter_lastx_default'] == DATE_LASTX_31DAYS ) { $myFilter['MyFilter_daterange_last_x_list'][4]['selected'] = "selected"; } else { $myFilter['MyFilter_daterange_last_x_list'][4]['selected'] = ""; } // --- // Init Date/Time values if ( GetDateTimeDetailsFromTimeString($myFilter['FilterValue'], $mysecond, $myminute, $myhour, $myday, $mymonth, $myyear) ) { $myFilter['filter_daterange_year'] = intval($myyear); $myFilter['filter_daterange_month'] = intval($mymonth); $myFilter['filter_daterange_day'] = intval($myday); $myFilter['filter_daterange_hour'] = intval($myhour); $myFilter['filter_daterange_minute'] = intval($myminute); $myFilter['filter_daterange_second'] = intval($mysecond); } else { $myFilter['filter_daterange_year'] = $tomorrowYear; $myFilter['filter_daterange_month'] = $tomorrowMonth; $myFilter['filter_daterange_day'] = $tomorrowDay; $myFilter['filter_daterange_hour'] = 0; $myFilter['filter_daterange_minute'] = 0; $myFilter['filter_daterange_second'] = 0; } ReportsFillDateRangeArray($content['years'], $myFilter, "filter_daterange_year_list", "filter_daterange_year"); ReportsFillDateRangeArray($content['months'], $myFilter, "filter_daterange_month_list", "filter_daterange_month"); ReportsFillDateRangeArray($content['days'], $myFilter, "filter_daterange_day_list", "filter_daterange_day"); ReportsFillDateRangeArray($content['hours'], $myFilter, "filter_daterange_hour_list", "filter_daterange_hour"); ReportsFillDateRangeArray($content['minutes'], $myFilter, "filter_daterange_minute_list", "filter_daterange_minute"); ReportsFillDateRangeArray($content['seconds'], $myFilter, "filter_daterange_second_list", "filter_daterange_second"); } function CreateTimeStampFromValues($iNum) { global $currentTime, $currentDay, $currentMonth, $currentYear, $tomorrowTime, $tomorrowDay, $tomorrowMonth, $tomorrowYear; // Read and parse Date if ( isset($_POST['filter_daterange_year_' . $iNum]) ) $tmpYear = DB_RemoveBadChars($_POST['filter_daterange_year_' . $iNum]); else $tmpYear = $currentYear; // Default value if ( isset($_POST['filter_daterange_month_' . $iNum]) ) $tmpMonth = DB_RemoveBadChars($_POST['filter_daterange_month_' . $iNum]); else $tmpMonth = $tomorrowMonth; // Default value if ( isset($_POST['filter_daterange_day_' . $iNum]) ) $tmpDay = DB_RemoveBadChars($_POST['filter_daterange_day_' . $iNum]); else $tmpDay = $currentDay; // Default value // Read and parse Time if ( isset($_POST['filter_daterange_hour_' . $iNum]) ) $tmpHour = DB_RemoveBadChars($_POST['filter_daterange_hour_' . $iNum]); else $tmpHour = 0; // Default value if ( isset($_POST['filter_daterange_minute_' . $iNum]) ) $tmpMinute = DB_RemoveBadChars($_POST['filter_daterange_minute_' . $iNum]); else $tmpMinute = 0; // Default value if ( isset($_POST['filter_daterange_second_' . $iNum]) ) $tmpSecond = DB_RemoveBadChars($_POST['filter_daterange_second_' . $iNum]); else $tmpSecond = 0; // Default value return $tmpYear . "-" . $tmpMonth . "-" . $tmpDay . "T" . $tmpHour . ":" . $tmpMinute . ":" . $tmpSecond; } function ReportsFillDateRangeArray($sourcearray, &$myFilter, $szArrayListName, $szFilterName) { global $content; $iCount = count($sourcearray); for ( $i = 0; $i < $iCount; $i++) { $myFilter[$szArrayListName][$i]['value'] = $sourcearray[$i]; if ( $myFilter[$szFilterName] == $sourcearray[$i] ) $myFilter[$szArrayListName][$i]['selected'] = "selected"; else $myFilter[$szArrayListName][$i]['selected'] = ""; } } // --- END Helper functions ?>loganalyzer-4.1.5/src/admin/result.php000066400000000000000000000064041277740250400177720ustar00rootroot00000000000000 Shows ... * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility // include($gl_root_path . 'classes/logstream.class.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // Configureable now! $content['REDIRSECONDS'] = GetConfigSetting("AdminChangeWaitTime", 2, CFGLEVEL_USER); // *** *** // // --- CONTENT Vars if ( isset($_GET['redir']) ) { // Only automatically redirect if above 0 if ( $content['REDIRSECONDS'] > 0 ) $content['EXTRA_METATAGS'] = ''; // Set redir string $content['SZREDIR'] = urldecode($_GET['redir']); } else { $_GET['redir'] = "index.php"; } if ( isset($_GET['msg']) ) $content['SZMSG'] = DB_StripSlahes($_GET['msg']); else $content['SZMSG'] = $content["LN_ADMIN_UNKNOWNSTATE"]; if ( $content['REDIRSECONDS'] > 0 ) { $content['TITLE'] = "LogAnalyzer - Redirecting to '" . $content['SZREDIR'] . "' in " . $content['REDIRSECONDS'] . " seconds"; // Title of the Page $content['LN_ADMIN_RESULTLINK'] = GetAndReplaceLangStr($content['LN_ADMIN_RESULTREDIRECT'], $content['SZREDIR'], $content['REDIRSECONDS']); } else { $content['TITLE'] = "LogAnalyzer - Redirecting to '" . $content['SZREDIR'] . "'"; // Title of the Page $content['LN_ADMIN_RESULTLINK'] = GetAndReplaceLangStr($content['LN_ADMIN_RESULTCLICK'], $content['SZREDIR']); } // --- // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/result.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/searches.php000066400000000000000000000301211277740250400202420ustar00rootroot00000000000000 Helps administrating custom searches * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "add" || $_GET['op'] == "delete" ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code // --- Set Helpervariable for non-ADMIN users if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $content['READONLY_ISUSERONLY'] = "disabled"; else $content['READONLY_ISUSERONLY'] = ""; // --- if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWSEARCH'] = "true"; $content['SEARCH_FORMACTION'] = "addnewsearch"; $content['SEARCH_SENDBUTTON'] = $content['LN_SEARCH_ADD']; //PreInit these values $content['DisplayName'] = ""; $content['SearchQuery'] = ""; // General stuff $content['userid'] = null; $content['CHECKED_ISUSERONLY'] = ""; $content['SEARCHID'] = ""; // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['CHECKED_ISUSERONLY'] = "checked"; } // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) $content['ISGROUPSAVAILABLE'] = true; else $content['ISGROUPSAVAILABLE'] = false; } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWSEARCH'] = "true"; $content['SEARCH_FORMACTION'] = "editsearch"; $content['SEARCH_SENDBUTTON'] = $content['LN_SEARCH_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['SEARCHID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); $sqlquery = "SELECT * " . " FROM " . DB_SEARCHES . " WHERE ID = " . $content['SEARCHID']; $result = DB_Query($sqlquery); $mysearch = DB_GetSingleRow($result, true); if ( isset($mysearch['DisplayName']) ) { $content['SEARCHID'] = $mysearch['ID']; $content['DisplayName'] = $mysearch['DisplayName']; $content['userid'] = $mysearch['userid']; $content['SearchQuery'] = $mysearch['SearchQuery']; if ( $content['userid'] != null ) $content['CHECKED_ISUSERONLY'] = "checked"; else $content['CHECKED_ISUSERONLY'] = ""; // --- Can only EDIT own views! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 && $content['userid'] == NULL ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWEDTOEDIT'] ); // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) { // Process All Groups for($i = 0; $i < count($content['SUBGROUPS']); $i++) { if ( $mysearch['groupid'] != null && $content['SUBGROUPS'][$i]['mygroupid'] == $mysearch['groupid'] ) $content['SUBGROUPS'][$i]['group_selected'] = "selected"; else $content['SUBGROUPS'][$i]['group_selected'] = ""; } // Enable Group Selection $content['ISGROUPSAVAILABLE'] = true; } else $content['ISGROUPSAVAILABLE'] = false; // --- } else { $content['ISEDITORNEWSEARCH'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SEARCH_ERROR_IDNOTFOUND'], $content['SEARCHID'] ); } } else { $content['ISEDITORNEWSEARCH'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SEARCH_ERROR_INVALIDID']; } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['SEARCHID'] = strip_tags(DB_RemoveBadChars($_GET['id'])); // Get UserInfo $result = DB_Query("SELECT DisplayName FROM " . DB_SEARCHES . " WHERE ID = " . $content['SEARCHID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['DisplayName']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SEARCH_ERROR_IDNOTFOUND'], $content['SEARCHID'] ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_SEARCH_WARNDELETESEARCH'], $myrow['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_SEARCHES . " WHERE ID = " . $content['SEARCHID'] ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SEARCH_ERROR_DELSEARCH'], $content['SEARCHID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_SEARCH_ERROR_HASBEENDEL'], $myrow['DisplayName'] ) , "searches.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SEARCH_ERROR_INVALIDID']; } } } if ( isset($_POST['op']) ) { if ( isset ($_POST['id']) ) { $content['SEARCHID'] = intval(DB_RemoveBadChars($_POST['id'])); } else {$content['SEARCHID'] = -1; } if ( isset ($_POST['DisplayName']) ) { $content['DisplayName'] = DB_RemoveBadChars($_POST['DisplayName']); } else {$content['DisplayName'] = ""; } if ( isset ($_POST['SearchQuery']) ) { $content['SearchQuery'] = DB_RemoveBadChars($_POST['SearchQuery']); } else {$content['SearchQuery'] = ""; } // User & Group handeled specially if ( isset ($_POST['isuseronly']) ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; // Either user or group not both! } else { // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; } else { $content['userid'] = "null"; if ( isset ($_POST['groupid']) && $_POST['groupid'] != -1 ) $content['groupid'] = intval($_POST['groupid']); else $content['groupid'] = "null"; } } // --- Check mandotary values if ( $content['DisplayName'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SEARCH_ERROR_DISPLAYNAMEEMPTY']; } else if ( $content['SearchQuery'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SEARCH_ERROR_SEARCHQUERYEMPTY']; } // --- if ( !isset($content['ISERROR']) ) { // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewsearch" ) { // Add custom search now! $sqlquery = "INSERT INTO " . DB_SEARCHES . " (DisplayName, SearchQuery, userid, groupid) VALUES ('" . $content['DisplayName'] . "', '" . $content['SearchQuery'] . "', " . $content['userid'] . ", " . $content['groupid'] . " )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_SEARCH_HASBEENADDED'], DB_StripSlahes($content['DisplayName']) ) , "searches.php" ); } else if ( $_POST['op'] == "editsearch" ) { $result = DB_Query("SELECT ID FROM " . DB_SEARCHES . " WHERE ID = " . $content['SEARCHID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SEARCH_ERROR_IDNOTFOUND'], $content['SEARCHID'] ); } else { // Edit the Search Entry now! $result = DB_Query("UPDATE " . DB_SEARCHES . " SET DisplayName = '" . $content['DisplayName'] . "', SearchQuery = '" . $content['SearchQuery'] . "', userid = " . $content['userid'] . ", groupid = " . $content['groupid'] . " WHERE ID = " . $content['SEARCHID']); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_SEARCH_HASBEENEDIT'], DB_StripSlahes($content['DisplayName']) ) , "searches.php" ); } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Searches $content['LISTSEARCHES'] = "true"; // Copy Search array for further modifications $content['SEARCHES'] = $content['Search']; $i = 0; // Help counter! foreach ($content['SEARCHES'] as &$mySearch ) { $mySearch['SearchQuery_Display'] = strlen($mySearch['SearchQuery']) > 25 ? substr($mySearch['SearchQuery'], 0, 25) . " ..." : $mySearch['SearchQuery']; // Allow EDIT $mySearch['ActionsAllowed'] = true; // --- Set Image for Type if ( $mySearch['userid'] != null ) { $mySearch['SearchTypeImage'] = $content["MENU_ADMINUSERS"]; $mySearch['SearchTypeText'] = $content["LN_GEN_USERONLY"]; } else if ( $mySearch['groupid'] != null ) { $mySearch['SearchTypeImage'] = $content["MENU_ADMINGROUPS"]; $mySearch['SearchTypeText'] = GetAndReplaceLangStr( $content["LN_GEN_GROUPONLYNAME"], $mySearch['groupname'] ); // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $mySearch['ActionsAllowed'] = false; } else { $mySearch['SearchTypeImage'] = $content["MENU_GLOBAL"]; $mySearch['SearchTypeText'] = $content["LN_GEN_GLOBAL"]; // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $mySearch['ActionsAllowed'] = false; } // --- // --- Set CSS Class if ( $i % 2 == 0 ) $mySearch['cssclass'] = "line1"; else $mySearch['cssclass'] = "line2"; $i++; // --- } // --- } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_SEARCHOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_searches.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/sources.php000066400000000000000000001157641277740250400201510ustar00rootroot00000000000000 Helps administrating LogAnalyzer datasources * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "add" || $_GET['op'] == "delete" || $_GET['op'] == "cleardata" ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- Special Case for ADMIN Users, they should see ALL sources in admin panel! if ( GetConfigSetting("UserDBEnabled", false) && isset($_SESSION['SESSION_ISADMIN']) && $_SESSION['SESSION_ISADMIN'] == 1 ) LoadSourcesFromDatabase(true); // --- // --- BEGIN Custom Code // --- Set Helpervariable for non-ADMIN users if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $content['READONLY_ISUSERONLY'] = "disabled"; else $content['READONLY_ISUSERONLY'] = ""; // --- if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWSOURCE'] = "true"; $content['SOURCE_FORMACTION'] = "addnewsource"; $content['SOURCE_SENDBUTTON'] = $content['LN_SOURCES_ADD']; //PreInit these values $content['Name'] = ""; $content['Description'] = ""; $content['SourceType'] = SOURCE_DISK; CreateSourceTypesList($content['SourceType']); $content['MsgParserList'] = ""; $content['MsgNormalize'] = 0; $content['MsgSkipUnparseable'] = 0; $content['defaultfilter'] = ""; $content['CHECKED_ISNORMALIZEMSG'] = ""; $content['CHECKED_ISSKIPUNPARSEABLE'] = ""; // Init View List! $content['SourceViewID'] = 'SYSLOG'; $content['VIEWS'] = $content['Views']; foreach ( $content['VIEWS'] as $myView ) { if ( $myView['ID'] == $content['SourceViewID'] ) $content['VIEWS'][ $myView['ID'] ]['selected'] = "selected"; else $content['VIEWS'][ $myView['ID'] ]['selected'] = ""; } // SOURCE_DISK specific $content['SourceLogLineType'] = ""; CreateLogLineTypesList($content['SourceLogLineType']); $content['SourceDiskFile'] = "/var/log/syslog"; // SOURCE_DB specific $content['SourceDBType'] = DB_MYSQL; CreateDBTypesList($content['SourceDBType']); $content['SourceDBTableType'] = "monitorware"; CreateDBMappingsList($content['SourceDBTableType']); $content['SourceDBName'] = "loganalyzer"; $content['SourceDBServer'] = "localhost"; $content['SourceDBTableName'] = "systemevents"; $content['SourceDBUser'] = "user"; $content['SourceDBPassword'] = ""; $content['SourceDBEnableRowCounting'] = "false"; $content['SourceDBEnableRowCounting_true'] = ""; $content['SourceDBEnableRowCounting_false'] = "checked"; $content['SourceDBRecordsPerQuery'] = "100"; // General stuff $content['userid'] = null; $content['CHECKED_ISUSERONLY'] = ""; $content['SOURCEID'] = ""; // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['CHECKED_ISUSERONLY'] = "checked"; } // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) $content['ISGROUPSAVAILABLE'] = true; else $content['ISGROUPSAVAILABLE'] = false; } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWSOURCE'] = "true"; $content['SOURCE_FORMACTION'] = "editsource"; $content['SOURCE_SENDBUTTON'] = $content['LN_SOURCES_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['SOURCEID'] = DB_RemoveBadChars($_GET['id']); // Check if exists if ( is_numeric($content['SOURCEID']) && isset($content['Sources'][ $content['SOURCEID'] ]) ) { // Get Source reference $mysource = $content['Sources'][ $content['SOURCEID'] ]; // Copy basic properties $content['Name'] = $mysource['Name']; $content['Description'] = $mysource['Description']; $content['SourceType'] = $mysource['SourceType']; CreateSourceTypesList($content['SourceType']); $content['MsgParserList'] = $mysource['MsgParserList']; $content['MsgNormalize'] = $mysource['MsgNormalize']; if ( $mysource['MsgNormalize'] == 1 ) $content['CHECKED_ISNORMALIZEMSG'] = "checked"; else $content['CHECKED_ISNORMALIZEMSG'] = ""; $content['MsgSkipUnparseable'] = $mysource['MsgSkipUnparseable']; if ( $mysource['MsgSkipUnparseable'] == 1 ) $content['CHECKED_ISSKIPUNPARSEABLE'] = "checked"; else $content['CHECKED_ISSKIPUNPARSEABLE'] = ""; $content['defaultfilter'] = $mysource['defaultfilter']; // Init View List! $content['SourceViewID'] = $mysource['ViewID']; $content['VIEWS'] = $content['Views']; foreach ( $content['VIEWS'] as $myView ) { if ( $myView['ID'] == $content['SourceViewID'] ) $content['VIEWS'][ $myView['ID'] ]['selected'] = "selected"; else $content['VIEWS'][ $myView['ID'] ]['selected'] = ""; } // SOURCE_DISK specific $content['SourceLogLineType'] = $mysource['LogLineType']; CreateLogLineTypesList($content['SourceLogLineType']); $content['SourceDiskFile'] = $mysource['DiskFile']; // SOURCE_DB specific $content['SourceDBType'] = $mysource['DBType']; CreateDBTypesList($content['SourceDBType']); $content['SourceDBTableType'] = $mysource['DBTableType']; CreateDBMappingsList($content['SourceDBTableType']); $content['SourceDBName'] = $mysource['DBName']; $content['SourceDBServer'] = $mysource['DBServer']; $content['SourceDBTableName'] = $mysource['DBTableName']; $content['SourceDBUser'] = $mysource['DBUser']; $content['SourceDBPassword'] = $mysource['DBPassword']; $content['SourceDBEnableRowCounting'] = $mysource['DBEnableRowCounting']; if ( $content['SourceDBEnableRowCounting'] == 1 ) { $content['SourceDBEnableRowCounting_true'] = "checked"; $content['SourceDBEnableRowCounting_false'] = ""; } else { $content['SourceDBEnableRowCounting_true'] = ""; $content['SourceDBEnableRowCounting_false'] = "checked"; } $content['SourceDBRecordsPerQuery'] = $mysource['DBRecordsPerQuery']; // Set UserID if set! $content['userid'] = $mysource['userid']; if ( $content['userid'] != null ) $content['CHECKED_ISUSERONLY'] = "checked"; else $content['CHECKED_ISUSERONLY'] = ""; // --- Can only EDIT own views! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 && $content['userid'] == NULL ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWEDTOEDIT'] ); // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) { // Process All Groups for($i = 0; $i < count($content['SUBGROUPS']); $i++) { if ( $mysource['groupid'] != null && $content['SUBGROUPS'][$i]['mygroupid'] == $mysource['groupid'] ) $content['SUBGROUPS'][$i]['group_selected'] = "selected"; else $content['SUBGROUPS'][$i]['group_selected'] = ""; } // Enable Group Selection $content['ISGROUPSAVAILABLE'] = true; } else $content['ISGROUPSAVAILABLE'] = false; // --- } else { $content['ISEDITORNEWSOURCE'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SOURCES_ERROR_INVALIDORNOTFOUNDID']; } } else { $content['ISEDITORNEWSEARCH'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SEARCH_ERROR_INVALIDID']; } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['SOURCEID'] = DB_RemoveBadChars($_GET['id']); // Get SourceInfo $result = DB_Query("SELECT Name FROM " . DB_SOURCES . " WHERE ID = " . $content['SOURCEID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['Name']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_IDNOTFOUND'], $content['SOURCEID'] ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_SOURCES_WARNDELETESEARCH'], $myrow['Name'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_SOURCES . " WHERE ID = " . $content['SOURCEID'] ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_DELSOURCE'], $content['SOURCEID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_HASBEENDEL'], $myrow['Name'] ) , "sources.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_SOURCES_ERROR_INVALIDORNOTFOUNDID']; } } else if ($_GET['op'] == "cleardata") { if ( isset($_GET['id']) ) { //PreInit these values $content['SOURCEID'] = DB_RemoveBadChars($_GET['id']); } // Check If source is available if ( !isset($content['Sources'][ $content['SOURCEID'] ]) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_IDNOTFOUND'], $content['SOURCEID'] ); } else { // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); // --- Init the source $tmpSource = $content['Sources'][ $content['SOURCEID'] ]; // Copy some default properties $content['DisplayName'] = $tmpSource['Name']; $content['SourceType'] = $tmpSource['SourceType']; CreateSourceTypesList($content['SourceType']); $content['SourceTypeName'] = $content['SOURCETYPES'][ $content['SourceType'] ]['DisplayName']; // Fix Filename manually for FILE LOGSTREAM! if ( $content['SourceType'] == SOURCE_DB || $content['SourceType'] == SOURCE_PDO || $content['SourceType'] == SOURCE_MONGODB ) { if ( !isset($tmpSource['ObjRef']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_DELDATA'], $content['SOURCEID'] ); } else { // Create LogStream Object $stream = $tmpSource['ObjRef']->LogStreamFactory($tmpSource['ObjRef']); // Verify if datasource is available $res = $stream->Verify(); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_WITHINSOURCE'], $tmpSource['Name'], GetErrorMessage($res) ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } else { // Display Stats $content['ISCLEARDATA'] = true; // Gather Database Stats $content['ROWCOUNT'] = $stream->GetLogStreamTotalRowCount(); if ( isset($content['ROWCOUNT']) ) { // Check for suboperations if ( isset($_POST['subop']) ) { if ( $_POST['subop'] == "all" ) { $timestamp = 0; } else if ( $_POST['subop'] == "since" && isset($_POST['olderthan']) ) { // Take current time and subtract Seconds $nSecondsSubtract = $_POST['olderthan']; $timestamp = time() - $nSecondsSubtract; } else if ( $_POST['subop'] == "date" && isset($_POST['olderdate_year']) && isset($_POST['olderdate_month']) && isset($_POST['olderdate_day']) ) { // Generate Timestamp $timestamp = mktime( 0, 0, 0, intval($_POST['olderdate_month']), intval($_POST['olderdate_day']), intval($_POST['olderdate_year']) ); } // Continue with delete only inif wherequery is set! if ( isset($timestamp) ) { // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_SOURCES_WARNDELETEDATA'], $content['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // Now perform the data cleanup! $content['affectedrows'] = $stream->CleanupLogdataByDate($timestamp); if ( !isset($content['affectedrows']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_DELDATA'], $content['SOURCEID'] ); } else { // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_SOURCES_HASBEENDELDATA'], $content['DisplayName'], $content['affectedrows'] ) , "sources.php" ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_INVALIDCLEANUP'], $content['DisplayName'] ); } } else { // Allow Deleting by Date $content['DELETE_ALLOWDETAIL'] = true; // Create Lists CreateOlderThanList( 3600 ); CreateOlderDateFields(); } } else $content['ROWCOUNT'] = "Unknown"; } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_NOCLEARSUPPORT'], $content['SOURCEID'] ); } } } else if ($_GET['op'] == "dbstats") { if ( isset($_GET['id']) ) { //PreInit these values $content['SOURCEID'] = DB_RemoveBadChars($_GET['id']); } // Check If source is available if ( !isset($content['Sources'][ $content['SOURCEID'] ]) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_IDNOTFOUND'], $content['SOURCEID'] ); } else { // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); // --- Init the source $tmpSource = $content['Sources'][ $content['SOURCEID'] ]; // Copy some default properties $content['DisplayName'] = $tmpSource['Name']; $content['Description'] = $tmpSource['Description']; $content['SourceType'] = $tmpSource['SourceType']; CreateSourceTypesList($content['SourceType']); $content['SourceTypeName'] = $content['SOURCETYPES'][ $content['SourceType'] ]['DisplayName']; // Fix Filename manually for FILE LOGSTREAM! if ( $content['SourceType'] == SOURCE_DISK ) { $tmpSource['DiskFile'] = CheckAndPrependRootPath(DB_StripSlahes($tmpSource['DiskFile'])); $tmpSource['ObjRef']->FileName = $tmpSource['DiskFile']; } // Init the source in case it hasn't InitSource($tmpSource); // Create LogStream Object if ( !isset($tmpSource['ObjRef']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_NOSTATSDATA'], $content['SOURCEID'] ); } else { $stream = $tmpSource['ObjRef']->LogStreamFactory($tmpSource['ObjRef']); $res = $stream->Verify(); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_WITHINSOURCE'], $tmpSource['Name'], GetErrorMessage($res) ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } else { // Gather Database Stats $content['STATS'] = $stream->GetLogStreamStats(); if ( isset($content['STATS']) ) { // Display Stats $content['ISSTATS'] = true; foreach( $content['STATS'] as &$myStats ) { $i = 0; foreach( $myStats['STATSDATA'] as &$myStatsData ) { // --- Set CSS Class if ( $i % 2 == 0 ) $myStatsData['cssclass'] = "line1"; else $myStatsData['cssclass'] = "line2"; $i++; // --- } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_NOSTATSDATA'], $content['SOURCEID'] ); } // print_r ( $content['STATS'] ); } } // --- } } } if ( isset($_POST['op']) ) { // Read parameters first! if ( isset($_POST['id']) ) { $content['SOURCEID'] = intval(DB_RemoveBadChars($_POST['id'])); } else {$content['SOURCEID'] = -1; } if ( isset($_POST['Name']) ) { $content['Name'] = DB_RemoveBadChars($_POST['Name']); } else {$content['Name'] = ""; } if ( isset($_POST['Description']) ) { $content['Description'] = DB_RemoveBadChars($_POST['Description']); } else {$content['Description'] = ""; } if ( isset($_POST['SourceType']) ) { $content['SourceType'] = DB_RemoveBadChars($_POST['SourceType']); } if ( isset($_POST['MsgParserList']) ) { $content['MsgParserList'] = DB_RemoveBadChars($_POST['MsgParserList']); } if ( isset($_POST['MsgNormalize']) ) { $content['MsgNormalize'] = intval(DB_RemoveBadChars($_POST['MsgNormalize'])); } else {$content['MsgNormalize'] = 0; } if ( isset($_POST['MsgSkipUnparseable']) ) { $content['MsgSkipUnparseable'] = intval(DB_RemoveBadChars($_POST['MsgSkipUnparseable'])); } else {$content['MsgSkipUnparseable'] = 0; } if ( isset($_POST['SourceViewID']) ) { $content['SourceViewID'] = DB_RemoveBadChars($_POST['SourceViewID']); } if ( isset($_POST['defaultfilter']) ) { $content['defaultfilter'] = DB_RemoveBadChars($_POST['defaultfilter']); } if ( isset($content['SourceType']) ) { // Disk Params if ( $content['SourceType'] == SOURCE_DISK ) { if ( isset($_POST['SourceLogLineType']) ) { $content['SourceLogLineType'] = DB_RemoveBadChars($_POST['SourceLogLineType']); } if ( isset($_POST['SourceDiskFile']) ) { $content['SourceDiskFile'] = DB_RemoveBadChars($_POST['SourceDiskFile']); } } // DB Params else if ( $content['SourceType'] == SOURCE_DB || $content['SourceType'] == SOURCE_PDO || $content['SourceType'] == SOURCE_MONGODB ) { if ( isset($_POST['SourceDBType']) ) { $content['SourceDBType'] = DB_RemoveBadChars($_POST['SourceDBType']); } if ( isset($_POST['SourceDBName']) ) { $content['SourceDBName'] = DB_RemoveBadChars($_POST['SourceDBName']); } if ( isset($_POST['SourceDBTableType']) ) { $content['SourceDBTableType'] = DB_RemoveBadChars($_POST['SourceDBTableType']); } if ( isset($_POST['SourceDBServer']) ) { $content['SourceDBServer'] = DB_RemoveBadChars($_POST['SourceDBServer']); } if ( isset($_POST['SourceDBTableName']) ) { $content['SourceDBTableName'] = DB_RemoveBadChars($_POST['SourceDBTableName']); } if ( isset($_POST['SourceDBUser']) ) { $content['SourceDBUser'] = DB_RemoveBadChars($_POST['SourceDBUser']); } if ( isset($_POST['SourceDBRecordsPerQuery']) ) { $content['SourceDBRecordsPerQuery'] = DB_RemoveBadChars($_POST['SourceDBRecordsPerQuery']); } if ( isset($_POST['SourceDBPassword']) ) { $content['SourceDBPassword'] = DB_RemoveBadChars($_POST['SourceDBPassword']); } else {$content['SourceDBPassword'] = ""; } if ( isset($_POST['SourceDBEnableRowCounting']) ) { $content['SourceDBEnableRowCounting'] = DB_RemoveBadChars($_POST['SourceDBEnableRowCounting']); } // Extra Check for this property if ( $content['SourceDBEnableRowCounting'] != "true" ) $content['SourceDBEnableRowCounting'] = "false"; } } // User & Group handeled specially if ( isset ($_POST['isuseronly']) ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; // Either user or group not both! } else { // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; } else { $content['userid'] = "null"; if ( isset ($_POST['groupid']) && $_POST['groupid'] != -1 ) $content['groupid'] = intval($_POST['groupid']); else $content['groupid'] = "null"; } } // --- Check mandotary values if ( $content['Name'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_NAMEOFTHESOURCE'] ); } else if ( !isset($content['SourceType']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_SOURCETYPE'] ); } else if ( !isset($content['SourceViewID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_VIEW'] ); } else { // Disk Params if ( $content['SourceType'] == SOURCE_DISK ) { if ( !isset($content['SourceLogLineType']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_LOGLINETYPE'] ); } else if ( !isset($content['SourceDiskFile']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_SYSLOGFILE'] ); } // Check if file is accessable! else { // Get plain filename for testing! $content['SourceDiskFileTesting'] = CheckAndPrependRootPath(DB_StripSlahes($content['SourceDiskFile'])); /* // Take as it is if rootpath! if ( ( ($pos = strpos($content['SourceDiskFileTesting'], "/")) !== FALSE && $pos == 0) || ( ($pos = strpos($content['SourceDiskFileTesting'], "\\\\")) !== FALSE && $pos == 0) || ( ($pos = strpos($content['SourceDiskFileTesting'], ":\\")) !== FALSE ) || ( ($pos = strpos($content['SourceDiskFileTesting'], ":/")) !== FALSE ) ) { // Nothing really todo true; } else // prepend basepath! $content['SourceDiskFileTesting'] = $gl_root_path . $content['SourceDiskFileTesting']; */ } } // DB Params else if ( $content['SourceType'] == SOURCE_DB || $content['SourceType'] == SOURCE_PDO || $content['SourceType'] == SOURCE_MONGODB ) { if ( !isset($content['SourceDBType']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_DATABASETYPEOPTIONS'] ); } else if ( !isset($content['SourceDBName']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_DBNAME'] ); } else if ( !isset($content['SourceDBTableType']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_DBTABLETYPE'] ); } else if ( !isset($content['SourceDBServer']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_DBSERVER'] ); } else if ( !isset($content['SourceDBTableName']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_DBTABLENAME'] ); } else if ( !isset($content['SourceDBUser']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_MISSINGPARAM'], $content['LN_CFG_DBUSER'] ); } else if ( !is_numeric($content['SourceDBRecordsPerQuery']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_INVALIDVALUE'], $content['LN_CFG_DBRECORDSPERQUERY'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_UNKNOWNSOURCE'], $content['SourceDBType'] ); } // --- Verify the Source and report and error if needed! // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); // First create a tmp source array $tmpSource['ID'] = $content['SOURCEID']; $tmpSource['Name'] = $content['Name']; $tmpSource['Description'] = $content['Description']; $tmpSource['SourceType'] = $content['SourceType']; $tmpSource['MsgParserList'] = $content['MsgParserList']; $tmpSource['MsgNormalize'] = $content['MsgNormalize']; $tmpSource['MsgSkipUnparseable']= $content['MsgSkipUnparseable']; $tmpSource['defaultfilter'] = $content['defaultfilter']; $tmpSource['ViewID'] = $content['SourceViewID']; if ( $tmpSource['SourceType'] == SOURCE_DISK ) { $tmpSource['LogLineType'] = $content['SourceLogLineType']; $tmpSource['DiskFile'] = $content['SourceDiskFileTesting']; // use SourceDiskFileTesting rather then SourceDiskFile as it is corrected } // DB Params else if ( $tmpSource['SourceType'] == SOURCE_DB || $tmpSource['SourceType'] == SOURCE_PDO || $tmpSource['SourceType'] == SOURCE_MONGODB ) { $tmpSource['DBType'] = DB_StripSlahes($content['SourceDBType']); $tmpSource['DBName'] = DB_StripSlahes($content['SourceDBName']); $tmpSource['DBTableType'] = DB_StripSlahes($content['SourceDBTableType']); $tmpSource['DBServer'] = DB_StripSlahes($content['SourceDBServer']); $tmpSource['DBTableName'] = DB_StripSlahes($content['SourceDBTableName']); $tmpSource['DBUser'] = DB_StripSlahes($content['SourceDBUser']); $tmpSource['DBPassword'] = DB_StripSlahes($content['SourceDBPassword']); $tmpSource['DBEnableRowCounting'] = $content['SourceDBEnableRowCounting']; $tmpSource['DBRecordsPerQuery'] = $content['SourceDBRecordsPerQuery']; $tmpSource['userid'] = $content['userid']; $tmpSource['groupid'] = $content['groupid']; } // Init the source InitSource($tmpSource); // Create LogStream Object $stream = $tmpSource['ObjRef']->LogStreamFactory($tmpSource['ObjRef']); $res = $stream->Verify(); if ( $res != SUCCESS ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_WITHINSOURCE'], $tmpSource['Name'], GetErrorMessage($res) ); if ( isset($extraErrorDescription) ) $content['ERROR_MSG'] .= "

" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // --- } // --- Now ADD/EDIT do the processing! if ( !isset($content['ISERROR']) ) { // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewsource" ) { // Add custom search now! if ( $content['SourceType'] == SOURCE_DISK ) { $sqlquery = "INSERT INTO " . DB_SOURCES . " (Name, Description, SourceType, MsgParserList, MsgNormalize, MsgSkipUnparseable, defaultfilter, ViewID, LogLineType, DiskFile, userid, groupid) VALUES ('" . $content['Name'] . "', '" . $content['Description'] . "', " . $content['SourceType'] . ", '" . $content['MsgParserList'] . "', " . $content['MsgNormalize'] . ", " . $content['MsgSkipUnparseable'] . ", '" . $content['defaultfilter'] . "', '" . $content['SourceViewID'] . "', '" . $content['SourceLogLineType'] . "', '" . $content['SourceDiskFile'] . "', " . $content['userid'] . ", " . $content['groupid'] . " )"; } else if ( $content['SourceType'] == SOURCE_DB || $content['SourceType'] == SOURCE_PDO || $content['SourceType'] == SOURCE_MONGODB ) { $sqlquery = "INSERT INTO " . DB_SOURCES . " (Name, Description, SourceType, MsgParserList, MsgNormalize, MsgSkipUnparseable, defaultfilter, ViewID, DBTableType, DBType, DBServer, DBName, DBUser, DBPassword, DBTableName, DBEnableRowCounting, DBRecordsPerQuery, userid, groupid) VALUES ('" . $content['Name'] . "', '" . $content['Description'] . "', " . $content['SourceType'] . ", '" . $content['MsgParserList'] . "', " . $content['MsgNormalize'] . ", " . $content['MsgSkipUnparseable'] . ", '" . $content['defaultfilter'] . "', '" . $content['SourceViewID'] . "', '" . $content['SourceDBTableType'] . "', " . $content['SourceDBType'] . ", '" . $content['SourceDBServer'] . "', '" . $content['SourceDBName'] . "', '" . $content['SourceDBUser'] . "', '" . $content['SourceDBPassword'] . "', '" . $content['SourceDBTableName'] . "', " . $content['SourceDBEnableRowCounting'] . ", " . $content['SourceDBRecordsPerQuery'] . ", " . $content['userid'] . ", " . $content['groupid'] . " )"; } $result = DB_Query($sqlquery); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_SOURCE_HASBEENADDED'], DB_StripSlahes($content['Name']) ) , "sources.php" ); } else if ( $_POST['op'] == "editsource" ) { $result = DB_Query("SELECT ID FROM " . DB_SOURCES . " WHERE ID = " . $content['SOURCEID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_IDNOTFOUND'], $content['SOURCEID'] ); } else { // Edit the Search Entry now! if ( $content['SourceType'] == SOURCE_DISK ) { $sqlquery = "UPDATE " . DB_SOURCES . " SET Name = '" . $content['Name'] . "', Description = '" . $content['Description'] . "', SourceType = " . $content['SourceType'] . ", MsgParserList = '" . $content['MsgParserList'] . "', MsgNormalize = " . $content['MsgNormalize'] . ", MsgSkipUnparseable = " . $content['MsgSkipUnparseable'] . ", defaultfilter = '" . $content['defaultfilter'] . "', ViewID = '" . $content['SourceViewID'] . "', LogLineType = '" . $content['SourceLogLineType'] . "', DiskFile = '" . $content['SourceDiskFile'] . "', userid = " . $content['userid'] . ", groupid = " . $content['groupid'] . " WHERE ID = " . $content['SOURCEID']; } else if ( $content['SourceType'] == SOURCE_DB || $content['SourceType'] == SOURCE_PDO || $content['SourceType'] == SOURCE_MONGODB ) { $sqlquery = "UPDATE " . DB_SOURCES . " SET Name = '" . $content['Name'] . "', Description = '" . $content['Description'] . "', SourceType = " . $content['SourceType'] . ", MsgParserList = '" . $content['MsgParserList'] . "', MsgNormalize = " . $content['MsgNormalize'] . ", MsgSkipUnparseable = " . $content['MsgSkipUnparseable'] . ", defaultfilter = '" . $content['defaultfilter'] . "', ViewID = '" . $content['SourceViewID'] . "', DBTableType = '" . $content['SourceDBTableType'] . "', DBType = " . $content['SourceDBType'] . ", DBServer = '" . $content['SourceDBServer'] . "', DBName = '" . $content['SourceDBName'] . "', DBUser = '" . $content['SourceDBUser'] . "', DBPassword = '" . $content['SourceDBPassword'] . "', DBTableName = '" . $content['SourceDBTableName'] . "', DBEnableRowCounting = " . $content['SourceDBEnableRowCounting'] . ", DBRecordsPerQuery = " . $content['SourceDBRecordsPerQuery'] . ", userid = " . $content['userid'] . ", groupid = " . $content['groupid'] . " WHERE ID = " . $content['SOURCEID']; } $result = DB_Query($sqlquery); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_SOURCES_HASBEENEDIT'], DB_StripSlahes($content['Name']) ) , "sources.php" ); } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Searches $content['LISTSOURCES'] = "true"; // Copy Sources array for further modifications $content['SOURCES'] = $content['Sources']; // --- Process Sources $i = 0; // Help counter! foreach ($content['SOURCES'] as &$mySource ) { // --- Set Image for Type // NonNUMERIC are config files Sources, can not be editied if ( is_numeric($mySource['ID']) ) { // Allow EDIT $mySource['ActionsAllowed'] = true; if ( $mySource['userid'] != null ) { $mySource['SourcesAssignedToImage'] = $content["MENU_ADMINUSERS"]; $mySource['SourcesAssignedToText'] = GetAndReplaceLangStr( $content["LN_GEN_USERONLYNAME"], $mySource['username'] ); } else if ( $mySource['groupid'] != null ) { $mySource['SourcesAssignedToImage'] = $content["MENU_ADMINGROUPS"]; $mySource['SourcesAssignedToText'] = GetAndReplaceLangStr( $content["LN_GEN_GROUPONLYNAME"], $mySource['groupname'] ); // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $mySource['ActionsAllowed'] = false; } else { $mySource['SourcesAssignedToImage'] = $content["MENU_GLOBAL"]; $mySource['SourcesAssignedToText'] = $content["LN_GEN_GLOBAL"]; // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $mySource['ActionsAllowed'] = false; } } else { // Disallow EDIT $mySource['ActionsAllowed'] = false; $mySource['SourcesAssignedToImage'] = $content["MENU_INTERNAL"]; $mySource['SourcesAssignedToText'] = $content["LN_GEN_CONFIGFILE"]; } // --- // --- Set SourceType if ( $mySource['SourceType'] == SOURCE_DISK ) { $mySource['SourcesTypeImage'] = $content["MENU_SOURCE_DISK"]; $mySource['SourcesTypeText'] = $content["LN_SOURCES_DISK"]; } else if ( $mySource['SourceType'] == SOURCE_DB ) { $mySource['SourcesTypeImage'] = $content["MENU_SOURCE_DB"]; $mySource['SourcesTypeText'] = $content["LN_SOURCES_DB"]; // Enabled Database Maintenance functions $mySource['IsDatabaseSource'] = true; } else if ( $mySource['SourceType'] == SOURCE_PDO ) { $mySource['SourcesTypeImage'] = $content["MENU_SOURCE_PDO"]; $mySource['SourcesTypeText'] = $content["LN_SOURCES_PDO"]; // Enabled Database Maintenance functions $mySource['IsDatabaseSource'] = true; } else if ( $mySource['SourceType'] == SOURCE_MONGODB ) { $mySource['SourcesTypeImage'] = $content["MENU_SOURCE_MONGODB"]; $mySource['SourcesTypeText'] = $content["LN_SOURCES_MONGODB"]; // Enabled Database Maintenance functions $mySource['IsDatabaseSource'] = true; } // --- // --- Set CSS Class if ( $i % 2 == 0 ) $mySource['cssclass'] = "line1"; else $mySource['cssclass'] = "line2"; $i++; // --- } // --- // print_r ( $content['SOURCES'] ); } /* * Helper function to read and init available msg parsers */ function ReadMsgParserList() { global $gl_root_path, $content; } /* * Helper function to create a OlderThan Listbox */ function CreateOlderThanList( $nDefaultSeconds ) { global $content; $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "1 minute", 'OlderThanSeconds' => 60 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "5 minutes", 'OlderThanSeconds' => 300 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "15 minutes", 'OlderThanSeconds' => 900 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "30 minutes", 'OlderThanSeconds' => 1800 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "1 hour", 'OlderThanSeconds' => 3600 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "12 hours", 'OlderThanSeconds' => 43200 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "1 day", 'OlderThanSeconds' => 86400 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "7 days", 'OlderThanSeconds' => 604800 ); $content['OLDERTHAN'][] = array( 'OlderThanDisplayName' => "31 days", 'OlderThanSeconds' => 2678400 ); foreach ( $content['OLDERTHAN'] as &$myTime ) { if ( $nDefaultSeconds == $myTime['OlderThanSeconds'] ) $myTime['selected'] = "selected"; else $myTime['selected'] = ""; } } /* * Helper function to create a OlderThan Listbox */ function CreateOlderDateFields() { global $content; $currentTime = time(); $currentDay = date("d", $currentTime); $currentMonth = date("m", $currentTime); $currentYear = date("Y", $currentTime); // Init Year, month and day array! for ( $i = $currentYear-5; $i <= $currentYear+5; $i++ ) { $content['olderdate_years'][$i]['value'] = $i; if ( $i == $currentYear ) { $content['olderdate_years'][$i]['selected'] = "selected"; } else { $content['olderdate_years'][$i]['selected'] = ""; } } for ( $i = 1; $i <= 12; $i++ ) { $content['olderdate_months'][$i]['value'] = $i; if ( $i == $currentMonth ) { $content['olderdate_months'][$i]['selected'] = "selected"; } else { $content['olderdate_months'][$i]['selected'] = ""; } } for ( $i = 1; $i <= 31; $i++ ) { $content['olderdate_days'][$i]['value'] = $i; if ( $i == $currentDay ) { $content['olderdate_days'][$i]['selected'] = "selected"; } else { $content['olderdate_days'][$i]['selected'] = ""; } } } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_SOURCEOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_sources.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/upgrade.php000066400000000000000000000134071277740250400201040ustar00rootroot00000000000000 Helps administrating LogAnalyzer datasources * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); //include($gl_root_path . 'include/functions_filters.php'); // Set Upgrade Page! define('IS_UPRGADEPAGE', true); $content['IS_UPRGADEPAGE'] = true; // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // *** *** // // Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); // --- BEGIN Custom Code if ( isset($content['database_forcedatabaseupdate']) && $content['database_forcedatabaseupdate'] == "yes" ) { if ( isset($_GET['op']) ) { if ($_GET['op'] == "upgrade") { // Lets start the uodating! $content['UPGRADE_RUNNING'] = "1"; $content['sql_sucess'] = 0; $content['sql_failed'] = 0; $totaldbdefs = ""; $tblPref = GetConfigSetting("UserDBPref", "logcon"); // +1 so we start at the right DB Version! for( $i = $content['database_installedversion']+1; $i <= $content['database_internalversion']; $i++ ) { $myfilename = "db_update_v" . $i . ".txt"; // Lets read the table definitions :) $handle = @fopen($content['BASEPATH'] . "include/" . $myfilename, "r"); if ($handle === false) { $content['ISERROR'] = "true"; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_DBUPGRADE_DBFILENOTFOUND'], $myfilename ); } else { while (!feof($handle)) { $buffer = fgets($handle, 4096); $pos = strpos($buffer, "--"); if ($pos === false) $totaldbdefs .= $buffer; else if ( $pos > 2 && strlen( trim($buffer) ) > 1 ) $totaldbdefs .= $buffer; } fclose($handle); } } if ( !isset($content['ISERROR']) ) { if ( strlen($totaldbdefs) <= 0 ) { $content['ISERROR'] = "true"; $content['ERROR_MSG'] = $content['LN_DBUPGRADE_DBDEFFILESHORT']; } // Replace stats_ with the custom one ;) $totaldbdefs = str_replace( "`logcon_", "`" . $tblPref, $totaldbdefs ); // Now split by sql command $mycommands = split( ";\r\n", $totaldbdefs ); // check for different linefeed if ( count($mycommands) <= 1 ) $mycommands = split( ";\n", $totaldbdefs ); //Still only one? Abort if ( count($mycommands) <= 1 ) { $content['ISERROR'] = "true"; $content['ERROR_MSG'] = $content['LN_DBUPGRADE_DBDEFFILESHORT']; } if ( !isset($content['ISERROR']) ) { // --- Now execute all commands ini_set('error_reporting', E_WARNING); // Enable Warnings! for($i = 0; $i < count($mycommands); $i++) { if ( strlen(trim($mycommands[$i])) > 1 ) { $result = DB_Query( $mycommands[$i], false ); if ($result == FALSE) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = DB_ReturnSimpleErrorMsg(); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = $mycommands[$i]; // --- Set CSS Class if ( $content['sql_failed'] % 2 == 0 ) $content['failedstatements'][ $content['sql_failed'] ]['cssclass'] = "line1"; else $content['failedstatements'][ $content['sql_failed'] ]['cssclass'] = "line2"; // --- $content['sql_failed']++; } else $content['sql_sucess']++; // Free result DB_FreeQuery($result); } } // --- // --- Upgrade Database Version in Config Table $content['database_installedversion'] = $content['database_internalversion']; WriteConfigValue( "database_installedversion", true ); // --- } } } else $content['UPGRADE_DEFAULT'] = "1"; } else $content['UPGRADE_DEFAULT'] = "1"; } else $content['UPGRADE_DEFAULT'] = "0"; // disable running to be save! ;) if ( isset($content['ISERROR']) ) $content['UPGRADE_RUNNING'] = "0"; // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_DBUPGRADE_TITLE']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_upgrade.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/users.php000066400000000000000000000370551277740250400176230ustar00rootroot00000000000000 Helps administrating users * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( ( isset($_GET['op']) && ( $_GET['op'] == "add" || $_GET['op'] == "delete" ) ) || ( isset($_GET['miniop']) && ( $_GET['miniop'] == "setisadmin" || $_GET['miniop'] == "setisreadonly" ) ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code // Only if the user is an admin! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); if ( isset($_GET['miniop']) ) { if ( isset($_GET['id']) && isset($_GET['newval']) ) { if ( $_GET['miniop'] == "setisadmin" ) { //PreInit these values $content['USERID'] = intval(DB_RemoveBadChars($_GET['id'])); $iNewVal = intval(DB_RemoveBadChars($_GET['newval'])); // --- handle special case if ( $content['USERID'] == $content['SESSION_USERID'] && (!isset($_GET['verify']) || $_GET['verify'] != "yes") && $iNewVal == 0) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( $content['LN_USER_WARNREMOVEADMIN'], $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // Perform SQL Query! $sqlquery = "SELECT * " . " FROM " . DB_USERS . " WHERE ID = " . $content['USERID']; $result = DB_Query($sqlquery); $myuser = DB_GetSingleRow($result, true); if ( isset($myuser['username']) ) { // Update is_admin setting! $result = DB_Query("UPDATE " . DB_USERS . " SET is_admin = $iNewVal WHERE ID = " . $content['USERID']); DB_FreeQuery($result); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } } else if ( $_GET['miniop'] == "setisreadonly" ) { //PreInit these values $content['USERID'] = intval(DB_RemoveBadChars($_GET['id'])); $iNewVal = intval(DB_RemoveBadChars($_GET['newval'])); // --- handle special case if ( $content['USERID'] == $content['SESSION_USERID'] && (!isset($_GET['verify']) || $_GET['verify'] != "yes") && $iNewVal == 1) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( $content['LN_USER_WARNRADYONLYADMIN'], $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // Perform SQL Query! $sqlquery = "SELECT * " . " FROM " . DB_USERS . " WHERE ID = " . $content['USERID']; $result = DB_Query($sqlquery); $myuser = DB_GetSingleRow($result, true); if ( isset($myuser['username']) ) { // Update is_admin setting! $result = DB_Query("UPDATE " . DB_USERS . " SET is_readonly = $iNewVal WHERE ID = " . $content['USERID']); DB_FreeQuery($result); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_SETTINGFLAG']; } } if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWUSER'] = "true"; $content['USER_FORMACTION'] = "addnewuser"; $content['USER_SENDBUTTON'] = $content['LN_USER_ADD']; //PreInit these values $content['USERNAME'] = ""; $content['PASSWORD1'] = ""; $content['PASSWORD2'] = ""; } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWUSER'] = "true"; $content['USER_FORMACTION'] = "edituser"; $content['USER_SENDBUTTON'] = $content['LN_USER_EDIT']; if ( isset($_GET['id']) ) { //PreInit these values $content['USERID'] = DB_RemoveBadChars($_GET['id']); $sqlquery = "SELECT * " . " FROM " . DB_USERS . " WHERE ID = " . $content['USERID']; $result = DB_Query($sqlquery); $myuser = DB_GetSingleRow($result, true); if ( isset($myuser['username']) ) { $content['USERID'] = $myuser['ID']; $content['USERNAME'] = $myuser['username']; // Set is_admin flag if ( $myuser['is_admin'] == 1 ) $content['CHECKED_ISADMIN'] = "checked"; else $content['CHECKED_ISADMIN'] = ""; // Set is_readonly flag if ( $myuser['is_readonly'] == 1 ) $content['CHECKED_ISREADONLY'] = "checked"; else $content['CHECKED_ISREADONLY'] = ""; } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_INVALIDID']; } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['USERID'] = DB_RemoveBadChars($_GET['id']); if ( !isset($_SESSION['SESSION_USERNAME']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_INVALIDSESSIONS']; } else { // Get UserInfo $result = DB_Query("SELECT username FROM " . DB_USERS . " WHERE ID = " . $content['USERID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['username']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } if ( $_SESSION['SESSION_USERNAME'] == $myrow['username'] ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_DONOTDELURSLF'], $content['USERID'] ); } else { // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_USER_WARNDELETEUSER'], $myrow['username'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // Delete User objects! PerformSQLDelete( "DELETE FROM " . DB_SOURCES . " WHERE userid = " . $content['USERID'], 'LN_SOURCES_ERROR_DELSOURCE', $content['USERID'] ); PerformSQLDelete( "DELETE FROM " . DB_VIEWS . " WHERE userid = " . $content['USERID'], 'LN_VIEWS_ERROR_DELSEARCH', $content['USERID'] ); PerformSQLDelete( "DELETE FROM " . DB_SEARCHES . " WHERE userid = " . $content['USERID'], 'LN_SEARCH_ERROR_DELSEARCH', $content['USERID'] ); PerformSQLDelete( "DELETE FROM " . DB_CHARTS . " WHERE userid = " . $content['USERID'], 'LN_CHARTS_ERROR_DELCHART', $content['USERID'] ); // Finally delete the Userobject! PerformSQLDelete( "DELETE FROM " . DB_USERS . " WHERE ID = " . $content['USERID'], 'LN_USER_ERROR_DELUSER', $content['USERID'] ); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_USER_ERROR_HASBEENDEL'], $myrow['username'] ) , "users.php" ); } } } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_INVALIDID']; } } } if ( isset($_POST['op']) ) { if ( isset ($_POST['id']) ) { $content['USERID'] = DB_RemoveBadChars($_POST['id']); } else {$content['USERID'] = ""; } if ( isset ($_POST['username']) ) { $content['USERNAME'] = DB_RemoveBadChars($_POST['username']); } else {$content['USERNAME'] = ""; } if ( isset ($_POST['password1']) ) { $content['PASSWORD1'] = DB_RemoveBadChars($_POST['password1']); } else {$content['PASSWORD1'] = ""; } if ( isset ($_POST['password2']) ) { $content['PASSWORD2'] = DB_RemoveBadChars($_POST['password2']); } else {$content['PASSWORD2'] = ""; } if ( isset ($_POST['isadmin']) ) { $content['ISADMIN'] = 1; } else {$content['ISADMIN'] = 0; } if ( isset ($_POST['isreadonly']) ) { $content['ISREADONLY'] = 1; } else {$content['ISREADONLY'] = 0; } // Check mandotary values if ( $content['USERNAME'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_USEREMPTY']; } if ( !isset($content['ISERROR']) ) { // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewuser" ) { $result = DB_Query("SELECT username FROM " . DB_USERS . " WHERE username = '" . $content['USERNAME'] . "'"); $myrow = DB_GetSingleRow($result, true); if ( isset($myrow['username']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_USERNAMETAKEN']; } else { // Check if Password is set! if ( strlen($content['PASSWORD1']) <= 0 || $content['PASSWORD1'] != $content['PASSWORD2'] ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_PASSSHORT']; } if ( !isset($content['ISERROR']) ) { // Create passwordhash now :)! $content['PASSWORDHASH'] = md5( $content['PASSWORD1'] ); // Add new User now! $result = DB_Query("INSERT INTO " . DB_USERS . " (username, password, is_admin, is_readonly) VALUES ('" . $content['USERNAME'] . "', '" . $content['PASSWORDHASH'] . "', " . $content['ISADMIN'] . ", " . $content['ISREADONLY'] . ")"); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_USER_ERROR_HASBEENADDED'], DB_StripSlahes($content['USERNAME']) ) , "users.php" ); } } } else if ( $_POST['op'] == "edituser" ) { $result = DB_Query("SELECT ID FROM " . DB_USERS . " WHERE ID = " . $content['USERID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_USER_ERROR_IDNOTFOUND'], $content['USERID'] ); } else { // Check if Password is enabled if ( isset($content['PASSWORD1']) && strlen($content['PASSWORD1']) > 0 ) { if ( $content['PASSWORD1'] != $content['PASSWORD2'] ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_USER_ERROR_PASSSHORT']; } if ( !isset($content['ISERROR']) ) { // Create passwordhash now :)! $content['PASSWORDHASH'] = md5( $content['PASSWORD1'] ); // Edit the User now! $result = DB_Query("UPDATE " . DB_USERS . " SET username = '" . $content['USERNAME'] . "', password = '" . $content['PASSWORDHASH'] . "', is_admin = " . $content['ISADMIN'] . ", is_readonly = " . $content['ISREADONLY'] . " WHERE ID = " . $content['USERID']); DB_FreeQuery($result); } } else { // Edit the User now! $result = DB_Query("UPDATE " . DB_USERS . " SET username = '" . $content['USERNAME'] . "', is_admin = " . $content['ISADMIN'] . ", is_readonly = " . $content['ISREADONLY'] . " WHERE ID = " . $content['USERID']); DB_FreeQuery($result); } // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_USER_ERROR_HASBEENEDIT'], DB_StripSlahes($content['USERNAME']) ) , "users.php" ); } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Users $content['LISTUSERS'] = "true"; // Set AddUsers TAB! if ( $content['UserDBAuthMode'] == USERDB_AUTH_LDAP ) $content["ALLOWADDUSERS"] = "false"; else $content["ALLOWADDUSERS"] = "true"; // Read all Serverentries $sqlquery = "SELECT ID, " . " username, " . " is_admin, " . " is_readonly " . " FROM " . DB_USERS . " ORDER BY ID "; $result = DB_Query($sqlquery); $content['USERS'] = DB_GetAllRows($result, true); // --- Process Users for($i = 0; $i < count($content['USERS']); $i++) { // --- Set Image for IsAdmin if ( $content['USERS'][$i]['is_admin'] == 1 ) { $content['USERS'][$i]['is_isadmin_string'] = $content['MENU_SELECTION_ENABLED']; $content['USERS'][$i]['set_isadmin'] = 0; } else { $content['USERS'][$i]['is_isadmin_string'] = $content['MENU_SELECTION_DISABLED']; $content['USERS'][$i]['set_isadmin'] = 1; } // --- // --- Set Image for IsReadonly if ( $content['USERS'][$i]['is_readonly'] == 1 ) { $content['USERS'][$i]['is_readonly_string'] = $content['MENU_SELECTION_ENABLED']; $content['USERS'][$i]['set_isreadonly'] = 0; } else { $content['USERS'][$i]['is_readonly_string'] = $content['MENU_SELECTION_DISABLED']; $content['USERS'][$i]['set_isreadonly'] = 1; } // --- // --- Set CSS Class if ( $i % 2 == 0 ) $content['USERS'][$i]['cssclass'] = "line1"; else $content['USERS'][$i]['cssclass'] = "line2"; // --- // --- Check if Enable/Disable Button was clicked and add Autofocus code! if ( isset($_GET['miniop']) && isset($content['USERID']) && $content['USERID'] == $content['USERS'][$i]['ID'] ) { if ( $_GET['miniop'] == "setisadmin" ) AddWindowLoadFocus("userisadminbutton" . $content['USERS'][$i]['ID']); else if ( $_GET['miniop'] == "setisreadonly" ) AddWindowLoadFocus("userisreadonlybutton" . $content['USERS'][$i]['ID']); } // --- } // --- } // Helper function to delete SQL Data function PerformSQLDelete( $szDeleteStm, $szErrMsg, $szUserID) { global $content; $result = DB_Query( $szDeleteStm ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content[$szErrMsg], $szUserID ); return false; } else DB_FreeQuery($result); // Success return true; } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_USEROPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_users.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/admin/views.php000066400000000000000000000475151277740250400176210ustar00rootroot00000000000000 Helps administrating custom user views * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Set PAGE to be ADMINPAGE! define('IS_ADMINPAGE', true); $content['IS_ADMINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // --- // --- Deny if DisableAdminUsers is enabled and User is not ADMIN if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1 ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); } // --- // --- Deny if User is READONLY! if ( !isset($_SESSION['SESSION_ISREADONLY']) || $_SESSION['SESSION_ISREADONLY'] == 1 ) { if ( isset($_POST['op']) || ( isset($_GET['op']) && ( $_GET['op'] == "add" || $_GET['op'] == "delete" ) ) ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_READONLY'] ); } // --- // --- BEGIN Custom Code // Only if the user is an admin! //if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) // DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWED'] ); // Init helper variable to empty string $content['FormUrlAddOP'] = ""; // --- Set Helpervariable for non-ADMIN users if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $content['READONLY_ISUSERONLY'] = "disabled"; else $content['READONLY_ISUSERONLY'] = ""; // --- if ( isset($_GET['op']) ) { if ($_GET['op'] == "add") { // Set Mode to add $content['ISEDITORNEWVIEW'] = "true"; $content['VIEW_FORMACTION'] = "addnewview"; $content['VIEW_SENDBUTTON'] = $content['LN_VIEWS_ADD']; //PreInit these values $content['DisplayName'] = ""; $content['VIEWID'] = ""; $content['FormUrlAddOP'] = "?op=add"; $content['userid'] = null; $content['CHECKED_ISUSERONLY'] = ""; // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['CHECKED_ISUSERONLY'] = "checked"; } // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) $content['ISGROUPSAVAILABLE'] = true; else $content['ISGROUPSAVAILABLE'] = false; // --- } else if ($_GET['op'] == "edit") { // Set Mode to edit $content['ISEDITORNEWVIEW'] = "true"; $content['VIEW_FORMACTION'] = "editview"; $content['VIEW_SENDBUTTON'] = $content['LN_VIEWS_EDIT']; // Copy Views array for further modifications $content['VIEWS'] = $content['Views']; // View must be loaded as well already! if ( isset($_GET['id']) && isset($content['VIEWS'][$_GET['id']]) ) { //PreInit these values $content['VIEWID'] = DB_RemoveBadChars($_GET['id']); if ( isset($content['VIEWS'][ $content['VIEWID'] ]) ) { //Set the FormAdd URL $content['FormUrlAddOP'] = "?op=edit&id=" . $content['VIEWID']; $myview = $content['VIEWS'][ $content['VIEWID'] ]; $content['DisplayName'] = $myview['DisplayName'] ; $content['userid'] = $myview['userid']; $content['COLUMNS'] = $myview['Columns']; if ( $content['userid'] != null ) $content['CHECKED_ISUSERONLY'] = "checked"; else $content['CHECKED_ISUSERONLY'] = ""; // --- Can only EDIT own views! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 && $content['userid'] == NULL ) DieWithFriendlyErrorMsg( $content['LN_ADMIN_ERROR_NOTALLOWEDTOEDIT'] ); // --- // --- Check if groups are available $content['SUBGROUPS'] = GetGroupsForSelectfield(); if ( is_array($content['SUBGROUPS']) ) { // Process All Groups for($i = 0; $i < count($content['SUBGROUPS']); $i++) { if ( $myview['groupid'] != null && $content['SUBGROUPS'][$i]['mygroupid'] == $myview['groupid'] ) $content['SUBGROUPS'][$i]['group_selected'] = "selected"; else $content['SUBGROUPS'][$i]['group_selected'] = ""; } // Enable Group Selection $content['ISGROUPSAVAILABLE'] = true; } else $content['ISGROUPSAVAILABLE'] = false; // --- } else { $content['ISEDITORNEWVIEW'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_VIEWS_ERROR_IDNOTFOUND'], $content['VIEWID'] ); } } else { $content['ISEDITORNEWVIEW'] = false; $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_VIEWS_ERROR_INVALIDID'], isset($_GET['id']) ? $_GET['id'] : "" ); } } else if ($_GET['op'] == "delete") { if ( isset($_GET['id']) ) { //PreInit these values $content['VIEWID'] = DB_RemoveBadChars($_GET['id']); // Get UserInfo $result = DB_Query("SELECT DisplayName FROM " . DB_VIEWS . " WHERE ID = " . $content['VIEWID'] ); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['DisplayName']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_VIEWS_ERROR_IDNOTFOUND'], $content['VIEWID'] ); } // --- Ask for deletion first! if ( (!isset($_GET['verify']) || $_GET['verify'] != "yes") ) { // This will print an additional secure check which the user needs to confirm and exit the script execution. PrintSecureUserCheck( GetAndReplaceLangStr( $content['LN_VIEWS_WARNDELETEVIEW'], $myrow['DisplayName'] ), $content['LN_DELETEYES'], $content['LN_DELETENO'] ); } // --- // do the delete! $result = DB_Query( "DELETE FROM " . DB_VIEWS . " WHERE ID = " . $content['VIEWID'] ); if ($result == FALSE) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_VIEWS_ERROR_DELSEARCH'], $content['VIEWID'] ); } else DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_VIEWS_ERROR_HASBEENDEL'], $myrow['DisplayName'] ) , "views.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_VIEWS_ERROR_INVALIDID']; } } } // --- Additional work todo for the edit view if ( isset($content['ISEDITORNEWVIEW']) && $content['ISEDITORNEWVIEW'] ) { // If Columns are send using POST we use them, otherwise we try to use from the view itself, if available if ( isset($_POST['Columns']) ) $AllColumns = DB_RemoveBadChars($_POST['Columns']); else if ( isset($content['COLUMNS']) ) $AllColumns = $content['COLUMNS']; // Read Columns from FORM data! if ( isset($AllColumns) ) { // --- Read Columns from Formdata if ( is_array($AllColumns) ) { // Copy columns ID's foreach ($AllColumns as $myColKey) $content['SUBCOLUMNS'][$myColKey]['ColFieldID'] = $myColKey; } else // One element only $content['SUBCOLUMNS'][$AllColumns]['ColFieldID'] = $AllColumns; // --- // --- Process Columns for display $i = 0; // Help counter! foreach ($content['SUBCOLUMNS'] as $key => &$myColumn ) { // Set Fieldcaption if ( isset($fields[$key]) && isset($fields[$key]['FieldCaption']) ) $myColumn['ColCaption'] = $fields[$key]['FieldCaption']; else $myColumn['ColCaption'] = $key; // Append Internal FieldID $myColumn['ColInternalID'] = $fields[$key]['FieldDefine']; // --- Set CSS Class if ( $i % 2 == 0 ) $myColumn['colcssclass'] = "line1"; else $myColumn['colcssclass'] = "line2"; $i++; // --- } // --- } // --- Copy fields data array $content['FIELDS'] = $fields; // removed already added fields if ( isset($content['SUBCOLUMNS']) ) { foreach ($content['SUBCOLUMNS'] as $key => &$myColumn ) { if ( isset($content['FIELDS'][$key]) ) unset($content['FIELDS'][$key]); } } // set fieldcaption foreach ($content['FIELDS'] as $key => &$myField ) { // Set Fieldcaption if ( isset($myField['FieldCaption']) ) $myField['FieldCaption'] = $myField['FieldCaption']; else $myField['FieldCaption'] = $key; // Append Internal FieldID $myField['FieldCaption'] .= " (" . $fields[$key]['FieldDefine'] . ")"; } // --- } // --- // --- Process POST Form Data if ( isset($_POST['op']) ) { if ( isset ($_POST['id']) ) { $content['VIEWID'] = DB_RemoveBadChars($_POST['id']); } else {$content['VIEWID'] = ""; } if ( isset ($_POST['DisplayName']) ) { $content['DisplayName'] = DB_StripSlahes($_POST['DisplayName']); } else {$content['DisplayName'] = ""; } // User & Group handeled specially if ( isset ($_POST['isuseronly']) ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; // Either user or group not both! } else { // --- Can only create a USER source! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) { $content['userid'] = $content['SESSION_USERID']; $content['groupid'] = "null"; } else { $content['userid'] = "null"; if ( isset ($_POST['groupid']) && $_POST['groupid'] != -1 ) $content['groupid'] = intval($_POST['groupid']); else $content['groupid'] = "null"; } } // --- Check mandotary values if ( $content['DisplayName'] == "" ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_VIEWS_ERROR_DISPLAYNAMEEMPTY']; } // --- if ( !isset($content['ISERROR']) ) { // --- Set SUBOP Helpers if ( $content['userid'] == "null" ) $content['CHECKED_ISUSERONLY'] = ""; else $content['CHECKED_ISUSERONLY'] = "checked"; if ( $content['ISGROUPSAVAILABLE'] && $content['groupid'] != "null" ) { // Process All Groups for($i = 0; $i < count($content['SUBGROUPS']); $i++) { if ( $content['SUBGROUPS'][$i]['mygroupid'] == $content['groupid'] ) $content['SUBGROUPS'][$i]['group_selected'] = "selected"; else $content['SUBGROUPS'][$i]['group_selected'] = ""; } } // --- // Check subop's first! if ( isset($_POST['subop']) ) { if ( isset($_POST['newcolumn']) ) { // Get NewColID $szColId = DB_RemoveBadChars($_POST['newcolumn']); // Add a new Column into our list! if ( $_POST['subop'] == $content['LN_VIEWS_ADDCOLUMN'] && isset($_POST['newcolumn']) ) { // Add New entry into columnlist $content['SUBCOLUMNS'][$szColId]['ColFieldID'] = $szColId; // Set Internal FieldID $content['SUBCOLUMNS'][$szColId]['ColInternalID'] = $fields[$szColId]['FieldDefine']; // Set Fieldcaption if ( isset($fields[$szColId]['FieldCaption']) ) $content['SUBCOLUMNS'][$szColId]['ColCaption'] = $fields[$szColId]['FieldCaption']; else $content['SUBCOLUMNS'][$szColId]['ColCaption'] = $szColId; // Set CSSClass $content['SUBCOLUMNS'][$szColId]['colcssclass'] = count($content['SUBCOLUMNS']) % 2 == 0 ? "line1" : "line2"; // Remove from fields list as well if ( isset($content['FIELDS'][$szColId]) ) unset($content['FIELDS'][$szColId]); } } } else if ( isset($_POST['subop_delete']) ) { // Get Column ID $szColId = DB_RemoveBadChars($_POST['subop_delete']); // Remove Entry from Columnslist if ( isset($content['SUBCOLUMNS'][$szColId]) ) unset($content['SUBCOLUMNS'][$szColId]); // Add removed entry to field list $content['FIELDS'][$szColId] = $szColId; // Set Fieldcaption if ( isset($fields[$szColId]) && isset($fields[$szColId]['FieldCaption']) ) $content['FIELDS'][$szColId]['FieldCaption'] = $fields[$szColId]['FieldCaption']; else $content['FIELDS'][$szColId]['FieldCaption'] = $szColId; } else if ( isset($_POST['subop_moveup']) ) { // Get Column ID $szColId = DB_RemoveBadChars($_POST['subop_moveup']); // --- Move Entry one UP in Columnslist // Find the entry in the array $iArrayNum = 0; foreach ($content['SUBCOLUMNS'] as $key => &$myColumn ) { if ( $key == $szColId ) break; $iArrayNum++; } // If found move up if ( $iArrayNum > 0 ) { // Extract Entry from the array $EntryTwoMove = array_slice($content['SUBCOLUMNS'], $iArrayNum, 1); // Unset Entry from the array unset( $content['SUBCOLUMNS'][$szColId] ); // Splice the array order! array_splice($content['SUBCOLUMNS'], $iArrayNum-1, 0, $EntryTwoMove); } // --- // Add Focus to MoveUp Button again AddWindowLoadFocus("subop_moveup_" . $szColId); } else if ( isset($_POST['subop_movedown']) ) { // Get Column ID $szColId = DB_RemoveBadChars($_POST['subop_movedown']); // --- Move Entry one DOWN in Columnslist // Find the entry in the array $iArrayNum = 0; foreach ($content['SUBCOLUMNS'] as $key => &$myColumn ) { if ( $key == $szColId ) break; $iArrayNum++; } // If found move down if ( $iArrayNum < count($content['SUBCOLUMNS']) ) { // Extract Entry from the array $EntryTwoMove = array_slice($content['SUBCOLUMNS'], $iArrayNum, 1); // Unset Entry from the array unset( $content['SUBCOLUMNS'][$szColId] ); // Splice the array order! array_splice($content['SUBCOLUMNS'], $iArrayNum+1, 0, $EntryTwoMove); } // --- // Add Focus to MoveDown Button again AddWindowLoadFocus("subop_movedown_" . $szColId); } else // Now SUBOP means normal processing! { // Now we convert fr DB insert! $content['DisplayName'] = DB_RemoveBadChars($_POST['DisplayName']); // Everything was alright, so we go to the next step! if ( $_POST['op'] == "addnewview" ) { // Create Columnlist comma seperated! if ( isset($_POST['Columns']) && is_array($_POST['Columns']) ) { // Copy columns ID's foreach ( $_POST['Columns'] as $myColKey) { if ( isset($content['COLUMNS']) ) $content['COLUMNS'] .= ", " . DB_RemoveBadChars($myColKey); else $content['COLUMNS'] = DB_RemoveBadChars($myColKey); } // Add custom search now! $sqlquery = "INSERT INTO " . DB_VIEWS. " (DisplayName, Columns, userid, groupid) VALUES ('" . $content['DisplayName'] . "', '" . $content['COLUMNS'] . "', " . $content['userid'] . ", " . $content['groupid'] . " )"; $result = DB_Query($sqlquery); DB_FreeQuery($result); // Do the final redirect RedirectResult( GetAndReplaceLangStr( $content['LN_VIEWS_HASBEENADDED'], DB_StripSlahes($content['DisplayName']) ) , "views.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_VIEWS_ERROR_NOCOLUMNS']; } } else if ( $_POST['op'] == "editview" ) { // Now we convert fr DB insert! $content['DisplayName'] = DB_RemoveBadChars($_POST['DisplayName']); $result = DB_Query("SELECT ID FROM " . DB_VIEWS . " WHERE ID = " . $content['VIEWID']); $myrow = DB_GetSingleRow($result, true); if ( !isset($myrow['ID']) ) { $content['ISERROR'] = true; $content['ERROR_MSG'] = GetAndReplaceLangStr( $content['LN_VIEWS_ERROR_IDNOTFOUND'], $content['VIEWID'] ); } else { // Create Columnlist comma seperated! if ( isset($_POST['Columns']) && is_array($_POST['Columns']) ) { // Copy columns ID's unset($content['COLUMNS']); foreach ($_POST['Columns'] as $myColKey) { if ( isset($content['COLUMNS']) ) $content['COLUMNS'] .= ", " . DB_RemoveBadChars($myColKey); else $content['COLUMNS'] = DB_RemoveBadChars($myColKey); } // Edit the Search Entry now! $result = DB_Query("UPDATE " . DB_VIEWS . " SET DisplayName = '" . $content['DisplayName'] . "', Columns = '" . $content['COLUMNS'] . "', userid = " . $content['userid'] . ", groupid = " . $content['groupid'] . " WHERE ID = " . $content['VIEWID']); DB_FreeQuery($result); // Done redirect! RedirectResult( GetAndReplaceLangStr( $content['LN_VIEWS_HASBEENEDIT'], DB_StripSlahes($content['DisplayName']) ) , "views.php" ); } else { $content['ISERROR'] = true; $content['ERROR_MSG'] = $content['LN_VIEWS_ERROR_NOCOLUMNS']; } } } } } } if ( !isset($_POST['op']) && !isset($_GET['op']) ) { // Default Mode = List Searches $content['LISTVIEWS'] = "true"; // Copy Views array for further modifications $content['VIEWS'] = $content['Views']; // --- Process Views $i = 0; // Help counter! foreach ($content['VIEWS'] as &$myView ) { // So internal Views can not be edited but seen if ( is_numeric($myView['ID']) ) { $myView['ActionsAllowed'] = true; // --- Set Image for Type if ( $myView['userid'] != null ) { $myView['ViewTypeImage'] = $content["MENU_ADMINUSERS"]; $myView['ViewTypeText'] = $content["LN_GEN_USERONLY"]; } else if ( $myView['groupid'] != null ) { $myView['ViewTypeImage'] = $content["MENU_ADMINGROUPS"]; $myView['ViewTypeText'] = GetAndReplaceLangStr( $content["LN_GEN_GROUPONLYNAME"], $myView['groupname'] ); // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $myView['ActionsAllowed'] = false; } else { $myView['ViewTypeImage'] = $content["MENU_GLOBAL"]; $myView['ViewTypeText'] = $content["LN_GEN_GLOBAL"]; // Check if is ADMIN User, deny if normal user! if ( !isset($_SESSION['SESSION_ISADMIN']) || $_SESSION['SESSION_ISADMIN'] == 0 ) $myView['ActionsAllowed'] = false; } // --- } else { $myView['ActionsAllowed'] = false; $myView['ViewTypeImage'] = $content["MENU_INTERNAL"]; $myView['ViewTypeText'] = $content["LN_GEN_INTERNAL"]; } // --- Add DisplayNames to columns $iBegin = true; foreach ($myView['Columns'] as $myCol ) { // Get Fieldcaption if ( isset($fields[$myCol]) && isset($fields[$myCol]['FieldCaption']) ) $myView['COLUMNS'][$myCol]['FieldCaption'] = $fields[$myCol]['FieldCaption']; else $myView['COLUMNS'][$myCol]['FieldCaption'] = $myCol; if ( $iBegin ) { $myView['COLUMNS'][$myCol]['FieldCaptionSeperator'] = ""; $iBegin = false; } else $myView['COLUMNS'][$myCol]['FieldCaptionSeperator'] = ", "; } // --- // --- Set CSS Class if ( $i % 2 == 0 ) $myView['cssclass'] = "line1"; else $myView['cssclass'] = "line2"; $i++; // --- } // --- } // --- END Custom Code // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: " . $content['LN_ADMINMENU_VIEWSOPT']; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_views.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/asktheoracle.php000066400000000000000000000126051277740250400200310ustar00rootroot00000000000000 This "oracle" is a helper page which generates and shows a bunch * of usefull links ;)! * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // --- // --- Define Extra Stylesheet! //$content['EXTRA_STYLESHEET'] = '' . "\r\n"; //$content['EXTRA_STYLESHEET'] .= ''; // --- // --- READ Vars if ( isset($_GET['type']) ) $content['oracle_type'] = $_GET['type']; else $content['oracle_type'] = ""; if ( isset($_GET['query']) ) $content['oracle_query'] = $_GET['query']; else $content['oracle_query'] = ""; if ( isset($_GET['uid']) ) $content['uid_current'] = $_GET['uid']; else $content['uid_current'] = "-1"; // Init // --- BEGIN Custom Code // Set readable type if ( $content['oracle_type'] == "ip" ) { $content['oracle_type_readable'] = "ip"; $content['oracle_kb_type'] = "ip"; if ( IsInternalIP($content['oracle_query']) ) $content['showonlinesearches'] = false; else $content['showonlinesearches'] = true; } else if ( $content['oracle_type'] == "domain" ) { $content['oracle_type_readable'] = "domain"; $content['oracle_kb_type'] = "name"; $content['showonlinesearches'] = true; } else if ( $content['oracle_type'] == "searchstr" ) { $content['oracle_type_readable'] = "custom search"; $content['oracle_kb_type'] = "misc"; $content['showonlinesearches'] = false; } else { $content['oracle_type_readable'] = "unknown type"; $content['oracle_kb_type'] = ""; $content['showonlinesearches'] = false; } $content['ORACLE_HELP_DETAIL'] = GetAndReplaceLangStr( $content['LN_ORACLE_HELP_DETAIL'], $content['oracle_type_readable'], urlencode($content['oracle_query']) ) ; $content['ORACLE_HELP_TEXT'] = GetAndReplaceLangStr( $content['LN_ORACLE_HELP_TEXT'], $content['oracle_type_readable'], urlencode($content['oracle_query']), $content['LN_ORACLE_HELP_TEXT_EXTERNAL'] ) ; $content['ORACLE_WHOIS'] = GetAndReplaceLangStr( $content['LN_ORACLE_WHOIS'], $content['oracle_type_readable'], urlencode($content['oracle_query']) ) ; $content['WhoisUrl'] = "http://kb.monitorware.com/kbsearch.php?sa=whois&oid=" . $content['oracle_kb_type'] . "&origin=phplogcon&q=" . urlencode($content['oracle_query']); // Set Field Captions! $content['LN_FIELDS_MESSAGE'] = $fields[SYSLOG_MESSAGE]['FieldCaption']; $content['LN_FIELDS_HOST'] = $fields[SYSLOG_HOST]['FieldCaption']; // Enable help links! $content['helplinksenabled'] = true; // Loop through all Sources $i = 0; foreach( $content['Sources'] as $mySource ) { $myHelpLink['SourceName'] = $mySource['Name']; $myHelpLink['MsgUrl'] = $content['BASEPATH'] . "index.php?filter=" . urlencode($content['oracle_query']) . "&search=Search&sourceid=" . $mySource['ID']; // $myHelpLink['MsgDisplayName'] = GetAndReplaceLangStr( $content['LN_ORACLE_SEARCHINFIELD'], "Message" ); $myHelpLink['SourceUrl'] = $content['BASEPATH'] . "index.php?filter=" . urlencode("source:=" . $content['oracle_query']) . "&search=Search&sourceid=" . $mySource['ID']; // $myHelpLink['SourceDisplayName'] = GetAndReplaceLangStr( $content['LN_ORACLE_SEARCHINFIELD'], "Source" ); // --- Set CSS Class if ( $i % 2 == 0 ) $myHelpLink['cssclass'] = "line1"; else $myHelpLink['cssclass'] = "line2"; $i++; // --- // Add to help Link array! $content['HelpLinks'][] = $myHelpLink; } // --- // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); // Append custom title part! $content['TITLE'] .= GetAndReplaceLangStr( $content['LN_ORACLE_TITLE'], urlencode($content['oracle_query'])); // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "asktheoracle.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/chartgenerator.php000066400000000000000000000444421277740250400204000ustar00rootroot00000000000000 This file will create gfx of charts, and handle image caching * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // if ( !defined('IN_PHPLOGCON') ) define('IN_PHPLOGCON', true); $gl_root_path = './'; // Now include necessary include files! include_once($gl_root_path . 'include/functions_common.php'); include_once($gl_root_path . 'include/functions_frontendhelpers.php'); include_once($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility include_once($gl_root_path . 'classes/logstream.class.php'); // Include basic jpgraph lib require_once ($gl_root_path . "classes/jpgraph/jpgraph.php"); InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // --- // --- READ CONTENT Vars $content['error_occured'] = false; $content['chart_success'] = false; if ( isset($_GET['type']) ) $content['chart_type'] = intval($_GET['type']); else $content['chart_type'] = CHART_CAKE; if ( isset($_GET['width']) ) { $content['chart_width'] = intval($_GET['width']); // Limit Chart Size for now if ( $content['chart_width'] < 100 ) $content['chart_width'] = 100; else if ( $content['chart_width'] > 1000 ) $content['chart_width'] = 1000; } else $content['chart_width'] = 100; if ( isset($_GET['byfield']) ) { if ( isset($fields[ $_GET['byfield'] ]) ) { $content['chart_field'] = $_GET['byfield']; $content['chart_fieldtype'] = $fields[ $content['chart_field'] ]['FieldType']; } else { $content['error_occured'] = true; $content['error_details'] = $content['LN_GEN_ERROR_INVALIDFIELD']; } } else { $content['error_occured'] = true; $content['error_details'] = $content['LN_GEN_ERROR_MISSINGCHARTFIELD']; } if ( isset($_GET['maxrecords']) ) { // read and verify value $content['maxrecords'] = intval($_GET['maxrecords']); if ( $content['maxrecords'] < 2 || $content['maxrecords'] > 100 ) $content['maxrecords'] = 10; } else $content['maxrecords'] = 10; if ( isset($_GET['showpercent']) ) { // read and verify value $content['showpercent'] = intval($_GET['showpercent']); if ( $content['showpercent'] >= 1 ) $content['showpercent'] = 1; else $content['showpercent'] = 0; } else $content['showpercent'] = 0; if ( isset($_GET['defaultfilter']) ) $content['chart_defaultfilter'] = $_GET['defaultfilter']; else $content['chart_defaultfilter'] = ""; if ( isset($_GET['basepath']) ) $content['custombasepath'] = $_GET['basepath']; else $content['custombasepath'] = ""; // --- // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); // --- END CREATE TITLE // --- BEGIN Custom Code // Do not BLOCK other Site Calls WriteClosePHPSession(); // Get data and print on the image! if ( !$content['error_occured'] ) { if ( isset($content['Sources'][$currentSourceID]) ) { // Obtain and get the Config Object $stream_config = $content['Sources'][$currentSourceID]['ObjRef']; // Create LogStream Object $stream = $stream_config->LogStreamFactory($stream_config); $stream->SetFilter($content['chart_defaultfilter']); // Set Columns we want to open! $content['ChartColumns'] = array(); // First add filter fields to array $aFilterFields = $stream->ReturnFieldsByFilters(); if ( $aFilterFields != null ) $content['ChartColumns'] = $aFilterFields; // Append mandetory fields if ( !in_array(SYSLOG_UID, $content['ChartColumns']) ) $content['ChartColumns'][] = SYSLOG_UID; if ( !in_array($content['chart_field'], $content['ChartColumns']) ) $content['ChartColumns'][] = $content['chart_field']; // Append fields from defaultfilter as well ! if ( strlen($content['chart_defaultfilter']) > 0 ) { $tmpFilters = explode(" ", $content['chart_defaultfilter']); foreach($tmpFilters as $myFilter) { if ( strlen(trim($myFilter)) <= 0 ) continue; if ( ($pos = strpos($myFilter, ":")) !== false && ($pos > 0 && substr($myFilter, $pos-1,1) != '\\') /* Only if character before is no backslash! */ ) { // Split key and value $tmpArray = explode(":", $myFilter, 2); // Check if keyfield is valid and add to our Columns array if available $newField = $stream->ReturnFilterKeyBySearchField($tmpArray[FILTER_TMP_KEY]); if ( $newField ) $content['ChartColumns'][] = $newField; } } } // Open Data Connection! $res = $stream->Open( $content['ChartColumns'], true ); if ( $res == SUCCESS ) { // Obtain data from the logstream! $chartData = $stream->GetCountSortedByField($content['chart_field'], $content['chart_fieldtype'], $content['maxrecords']); // If data is valid, we have an array! if ( is_array($chartData) && count($chartData) > 0 ) { // Create Y array! foreach( $chartData as $myKey => $myData) { // Convert into filter format for submenus $szEncodedKeyStr = str_replace(' ', '+', $myKey); // echo $myKey . "
"; $YchartData[] = intval($myData); $XchartData[] = strlen($myKey) > 0 ? $myKey : "Unknown"; if ( isset($fields[$content['chart_field']]['SearchField']) && strlen($myKey) > 0 ) $chartImageMapLinks[] = $content['custombasepath'] . "index.php?filter=" . $fields[$content['chart_field']]['SearchField'] . "%3A%3D" . urlencode($szEncodedKeyStr) . "&search=Search"; else $chartImageMapLinks[] = ""; $chartImageMapAlts[] = $fields[$content['chart_field']]['FieldCaption'] . ": " . htmlspecialchars($myKey); $chartImageMapTargets[] ="_top"; } if ( $content['chart_type'] == CHART_CAKE ) { // Include additional code filers for this chart! include_once ($gl_root_path . "classes/jpgraph/jpgraph_pie.php"); include_once ($gl_root_path . "classes/jpgraph/jpgraph_pie3d.php"); // Create Basic Image, and set basic properties! $graph = new PieGraph($content['chart_width'], $content['chart_width'], 'auto'); $graph->SetMargin(30,20,30,30); // Adjust margin area $graph->SetScale("textlin"); $graph->SetMarginColor('white'); $graph->SetBox(); // Box around plotarea // Set up the title for the graph // $graph->title->Set('Messagecount sorted by "' . $content[ $fields[$content['chart_field']]['FieldCaption'] ] . '"'); // $graph->title->SetFont(FF_VERDANA,FS_NORMAL,12); // $graph->title->SetColor("darkred"); // Setup the tab title $graph->tabtitle->Set( GetAndReplaceLangStr($content['LN_STATS_CHARTTITLE'], $content['maxrecords'], $fields[$content['chart_field']]['FieldCaption']) ); $graph->tabtitle->SetFont(FF_VERA,FS_BOLD,9); $graph->tabtitle->SetPos('left'); // Set Graph footer $graph->footer->left->Set ("LogAnalyzer v" . $content['BUILDNUMBER'] . "\n" . GetAndReplaceLangStr($content['LN_STATS_GENERATEDAT'], date("Y-m-d")) ); $graph->footer->left->SetFont( FF_VERA, FS_NORMAL, 7); // $graph->footer->right->Set ( GetAndReplaceLangStr($content['LN_STATS_GENERATEDAT'], date("Y-m-d")) ); // $graph->footer->right->SetFont( FF_VERA, FS_NORMAL, 8); // $graph->footer->left->Set ("LogAnalyzer v" . $content['BUILDNUMBER'] . "\n" . GetAndReplaceLangStr($content['LN_STATS_GENERATEDAT'], date("Y-m-d")) ); // $graph->footer->left->SetFont( FF_VERA, FS_NORMAL, 8); // $graph->footer->right->SetColor("darkred"); // Show 0 label on Y-axis (default is not to show) $graph->yscale->ticks->SupressZeroLabel(false); // Set Fonts for graph! $graph->xaxis->SetFont(FF_VERA,FS_NORMAL,8); $graph->yaxis->SetFont(FF_VERA,FS_NORMAL,8); $graph->legend->SetFont(FF_VERA,FS_NORMAL,8); // Create $p1 = new PiePlot3D($YchartData); $graph->Add($p1); $p1->SetLegends($XchartData); $p1->SetEdge('#333333', 1); $p1->SetTheme('earth'); /* "earth" * "pastel" * "sand" * "water" */ $p1->SetCSIMTargets($chartImageMapLinks, $chartImageMapAlts, $chartImageMapTargets); // Set label format if ( $content['showpercent'] == 1 ) { $p1->SetLabelType(0); $p1->value->SetFormat("%d%%"); } else { $p1->SetLabelType(1); $p1->value->SetFormat("%d"); } // Set label properties $p1->SetLabelPos(1.0); $p1->SetSliceColors(array('#FFF584','#CBFF84','#FF6B9E','#FF9584','#EAFF84','#7BFF51','#51FFA6','#51FF52','#6BCFFF','#5170FF','#519CFF','#EAE3AD','#FFF184','#8584FF','#E698FF','#C384FF','#FF84EC','#FF98A3','#E5C285','#FFDA98' )); $p1->value->SetFont(FF_VERA, FS_NORMAL, 8); $p1->value->SetColor("black"); // Adjust other Pie Properties $p1->SetLabelMargin(5); $p1->SetCenter(0.5,0.45); $p1->SetSize(0.3); $p1->SetAngle(60); } else if ( $content['chart_type'] == CHART_BARS_VERTICAL ) { // Include additional code filers for this chart! include_once ($gl_root_path . "classes/jpgraph/jpgraph_bar.php"); include_once ($gl_root_path . "classes/jpgraph/jpgraph_line.php"); // Create Basic Image, and set basic properties! $graph = new Graph($content['chart_width'], $content['chart_width'], 'auto'); $graph->SetMargin(60,20,30,50); // Adjust margin area $graph->SetScale("textlin"); $graph->SetMarginColor('white'); $graph->SetBox(); // Box around plotarea $graph->img->SetAlphaBlending(true); // Setup X-AXIS // $graph->xaxis->SetFont(FF_VERA,FS_NORMAL,10); $graph->xaxis->SetTickLabels($XchartData); if ( count($XchartData) > 5 ) { $graph->SetMargin(60,20,30,80); // Adjust margin area $graph->xaxis->SetLabelAngle(45); $graph->xaxis->SetLabelMargin(2); } else $graph->xaxis->SetLabelAngle(0); // Setup Y-AXIS $graph->yaxis->scale->SetGrace(10); // So the value is readable // Show 0 label on Y-axis (default is not to show) $graph->yscale->ticks->SupressZeroLabel(false); // Set Fonts for graph! $graph->xaxis->SetFont(FF_VERA,FS_NORMAL,7); $graph->yaxis->SetFont(FF_VERA,FS_NORMAL,8); // Setup the tab title $graph->tabtitle->Set( GetAndReplaceLangStr($content['LN_STATS_CHARTTITLE'], $content['maxrecords'], $fields[$content['chart_field']]['FieldCaption']) ); $graph->tabtitle->SetFont(FF_VERA,FS_BOLD,9); $graph->tabtitle->SetPos('left'); // Set Graph footer $graph->footer->left->Set ("LogAnalyzer v" . $content['BUILDNUMBER'] . "\n" . GetAndReplaceLangStr($content['LN_STATS_GENERATEDAT'], date("Y-m-d")) ); $graph->footer->left->SetFont( FF_VERA, FS_NORMAL, 7); // Setup the X and Y grid $graph->ygrid->SetFill(true,'#DDDDDD@0.5','#BBBBBB@0.5'); $graph->ygrid->SetLineStyle('dashed'); $graph->ygrid->SetColor('gray'); $graph->xgrid->Show(); $graph->xgrid->SetLineStyle('dashed'); $graph->xgrid->SetColor('gray'); // Create and Add bar pot $bplot = new BarPlot($YchartData); $graph->Add($bplot); // Fill properties of barpot $bplot->SetWidth(0.6); $fcol='#440000'; $tcol='#FF9090'; $bplot->SetFillGradient($fcol,$tcol,GRAD_LEFT_REFLECTION); // Display value in bars $bplot->value->Show(); $bplot->value->SetFont(FF_VERA,FS_NORMAL,8); $bplot->value->SetFormat('%d'); // Add links $bplot->SetCSIMTargets($chartImageMapLinks, $chartImageMapAlts, $chartImageMapTargets); // TODO: Make Optional! // Create and Add filled line plot $lplot = new LinePlot($YchartData); $graph->Add($lplot); // Fill properties of line plot $lplot->SetBarCenter(); $lplot->mark->SetType(MARK_SQUARE); $lplot->mark->SetSize(6); $lplot->SetFillColor('#7395b0@0.5'); $lplot->SetColor('#7395b0@0.5'); $lplot->mark->SetColor('blue@0.7'); $lplot->mark->SetFillColor('lightblue'); } else if ( $content['chart_type'] == CHART_BARS_HORIZONTAL ) { // Include additional code filers for this chart! include_once ($gl_root_path . "classes/jpgraph/jpgraph_bar.php"); include_once ($gl_root_path . "classes/jpgraph/jpgraph_line.php"); // Create Basic Image, and set basic properties! $graph = new Graph($content['chart_width'], $content['chart_width'], 'auto'); // $graph->SetMargin(60,20,30,50); $graph->SetScale("textlin"); $graph->Set90AndMargin(80,30,30,50); // Adjust margin area $graph->SetMarginColor('white'); $graph->SetBox(); // Box around plotarea // Setup X-AXIS $graph->xaxis->SetTickLabels($XchartData); $graph->xaxis->SetLabelAngle(0); // $graph->xaxis->SetLabelAlign('center','top'); $graph->xaxis->SetPos('min'); $graph->xaxis->SetLabelMargin(5); $graph->xaxis->SetLabelAlign('right','center'); // Setup Y-AXIS $graph->yaxis->scale->SetGrace(20); // So the value is readable $graph->yaxis->SetLabelAlign('center','top'); $graph->yaxis->SetLabelFormat('%d'); $graph->yaxis->SetLabelSide(SIDE_RIGHT); $graph->yaxis->SetTickSide(SIDE_LEFT); $graph->yaxis->SetPos('max'); $graph->yaxis->SetTextLabelInterval(2); // Show 0 label on Y-axis (default is not to show) $graph->yscale->ticks->SupressZeroLabel(false); // Set Fonts for graph! $graph->xaxis->SetFont(FF_VERA,FS_NORMAL,7); $graph->yaxis->SetFont(FF_VERA,FS_NORMAL,8); // Setup the tab title $graph->tabtitle->Set( GetAndReplaceLangStr($content['LN_STATS_CHARTTITLE'], $content['maxrecords'], $fields[$content['chart_field']]['FieldCaption']) ); $graph->tabtitle->SetFont(FF_VERA,FS_BOLD,9); $graph->tabtitle->SetPos('right'); $graph->tabtitle->SetTabAlign('right'); // Set Graph footer $graph->footer->left->Set ("LogAnalyzer v" . $content['BUILDNUMBER'] . "\n" . GetAndReplaceLangStr($content['LN_STATS_GENERATEDAT'], date("Y-m-d")) ); $graph->footer->left->SetFont( FF_VERA, FS_NORMAL, 7); // Setup the X and Y grid $graph->ygrid->SetFill(true,'#DDDDDD@0.5','#BBBBBB@0.5'); $graph->ygrid->SetLineStyle('dashed'); $graph->ygrid->SetColor('gray'); $graph->xgrid->Show(); $graph->xgrid->SetLineStyle('dashed'); $graph->xgrid->SetColor('gray'); // Create and Add bar pot $bplot = new BarPlot($YchartData); $graph->Add($bplot); // Fill properties of barpot $bplot->SetWidth(0.6); $fcol='#440000'; $tcol='#FF9090'; $bplot->SetFillGradient($fcol,$tcol,GRAD_LEFT_REFLECTION); // Display value in bars $bplot->value->Show(); $bplot->value->SetFont(FF_VERA,FS_NORMAL, 8); $bplot->value->SetFormat('%d'); // Add links $bplot->SetCSIMTargets($chartImageMapLinks, $chartImageMapAlts, $chartImageMapTargets); // TODO: Make Optional! // Create and Add filled line plot $lplot = new LinePlot($YchartData); $graph->Add($lplot); // Fill properties of line plot $lplot->SetBarCenter(); $lplot->mark->SetType(MARK_SQUARE); $lplot->mark->SetSize(6); $lplot->SetFillColor('#7395b0@0.5'); $lplot->SetColor('#7395b0@0.5'); $lplot->mark->SetColor('blue@0.7'); $lplot->mark->SetFillColor('lightblue'); } else { $content['error_occured'] = true; $content['error_details'] = $content['LN_GEN_ERROR_INVALIDTYPE']; } } else { $content['error_occured'] = true; $content['error_details'] = GetErrorMessage($chartData); if ( isset($extraErrorDescription) ) $content['error_details'] .= "\n\n" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } } else { // This will disable to Main SyslogView and show an error message $content['error_occured'] = true; $content['error_details'] = GetErrorMessage($res); if ( isset($extraErrorDescription) ) $content['error_details'] .= "\n\n" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // Close file! $stream->Close(); } else { $content['error_occured'] = true; $content['error_details'] = GetAndReplaceLangStr( $content['LN_GEN_ERROR_SOURCENOTFOUND'], $currentSourceID); } } // --- // Output error if necessary if ( $content['error_occured'] ) OutpuCustomErrorMessage(); // --- /* if ( $content['error_occured'] ) { // Use JpGraph to display errors! $myError = new JpGraphErrObjectImg(); $myError->SetTitle($content['LN_GEN_ERRORDETAILS']); if ( GetConfigSetting("MiscShowDebugMsg", 0, CFGLEVEL_USER) == 1 ) $myError->Raise($content['error_details'] . "\n\nDebug Details: \n" . var_export($content['DEBUGMSG'], true), true); else $myError->Raise($content['error_details'], true); // Exit in any case exit; } // --- */ // --- Output the image with HTML Code // Use Exception handling here to Show error's as well! try { $graph->StrokeCSIM( $content['custombasepath'] . basename(__FILE__), '', 0); } catch(JpGraphException $e) { $content['error_occured'] = true; $content['error_details'] = $e->GetMessage(); OutpuCustomErrorMessage(); } // --- function OutpuCustomErrorMessage() { global $page, $content; // Create template Parser and output results $content['TITLE'] .= " :: " . $content['LN_GEN_ERRORDETAILS']; InitTemplateParser(); $page -> parser($content, "chartgenerator.html"); $page -> output(); // Exit in any case exit; } ?>loganalyzer-4.1.5/src/classes/000077500000000000000000000000001277740250400163045ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/class_template.php000066400000000000000000000241501277740250400220170ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- class Template { var $path = ''; var $filename = ''; var $extension = ''; var $template, $vars, $page; function __construct ($fname = '') { if ($fname) $this->filename = $fname; } function Template ($fname = '') { self::__construct($fname); } function set_path ($path) { $this->path = $path; } function set_extension ($ext) { $this->extension = $ext; } function set_templatefile ($fname) { $this->filename = $fname; } function set_template ($template) { $this->template = $template; } function set_values ($vars) { $this->vars = $vars; } function add_value ($name, $value) { $this->vars[$name] = $value; } function add_array ($name, $values) { if (is_array($values)) $this->vars[$name][] = $values; } function add_list ($name, $values) { if (is_array($values)) foreach ($values as $value) $this->vars[$name][] = array($name => $value); } function parser ($vars = '', $filename = '') { // BEGIN DELTA MOD // For MiscShowPageRenderStats if ( GetConfigSetting("MiscShowPageRenderStats", 1, CFGLEVEL_USER) == 1 ) FinishPageRenderStats( $vars ); // END DELTA MOD if ($filename) $this->filename = $filename; if ($vars) $this->vars = $vars; if (!isset($this->template)) { $fname = $this->path . $this->filename . $this->extension; $this->template = $this->load_file($fname); } $this->page = $this->template_parser( $this->template, $this->vars, $this->path, $this->extension ); } function result () { return $this->page; } function output () { echo $this->page; } function create_file ($fname) { if ($datafile = @fopen($fname, 'w')) { fputs($datafile, $this->page); fclose($datafile); return true; } else { return false; } } // Moved into Class function load_file($fname) { if (@is_file($fname)) return join('', file($fname)); else { // BEGIN DELTA MOD DieWithErrorMsg( "Could not find the template ".$fname.""); // END DELTA MOD } } function template_parser($template, $values, $path = '', $ext = '') { while (preg_match("", $template, $matches)) $template = str_replace( "", $this->load_file( $path . $matches[1] . $ext), $template ); $template = $this->template_parser_sub($template, $values); $template = str_replace("\t", " ", $template); $template = preg_replace("/ +/", " ", $template); return $template; } function template_parser_sub($template, $values) { if (is_array($values)) { foreach ($values as $k => $v) { if (is_array($v)) { $len = strlen($k); $lp = strpos($template, ""); if (is_int($lp)) { if ($rp = strpos($template, "")) { $page = substr($template, 0, $lp); $iter = substr($template, $lp + 15 + $len, $rp - $lp - $len - 15); $rowcnt = 0; $zaehler = 1; foreach ($v as $subval) { $subval['COUNTER'] = $rowcnt%2; $subval['ODDROW'] = $rowcnt%2; $subval['ROWCNT'] = $rowcnt++; $subval['ZAEHLER'] = $zaehler++; $page .= $this->template_parser_sub($iter, $subval); } $template = $page . substr($template, $rp + 13 + $len); } } } else { // FIXED BY ANDRE | Do not convert OBJECTS into strings! if ( !is_object($k) && !is_object($v) ) { // Helper variable global $tmpValue; $tmpValue = $v; // Replace normal variables $template = str_replace('{'.$k.'}', "$v", $template); // Replace variables with options, use Callback function! // $template = preg_replace( '/{'.$k.':(.*?):(.*?)}/ie', 'InsertTemplateVariable("$v", "\\1", "\\2")', $template ); $template = preg_replace_callback( '/{'.$k.':(.*?):(.*?)}/i', "InsertTemplateVariable", $template ); } } } } if (preg_match_all("", $template, $matches)) { foreach ($matches[1] as $block) { if (isset($values[$block])) { $template = str_replace("", "", $template); $template = str_replace("", "", $template); } else if ($blockend = strpos($template, "")) { $blockbeg = strpos($template, ""); $template = substr($template, 0, $blockbeg) . substr($template, $blockend + 13 + strlen($block)); } } } // else if (preg_match_all( '', $template, $matches, PREG_SET_ORDER) ) { // echo $matches[0][0]; // exit; foreach ($matches as $block) { $blockname = $block[1]; $not = $block[2]; $blockvalue = $block[3]; if ((@$values[$blockname] == $blockvalue && !$not) || (@$values[$blockname] != $blockvalue && $not)) { $template = str_replace( "", "", $template ); $template = str_replace( "", "", $template ); } else if ($blockend = strpos( $template, "")) { $blockbeg = strpos($template, ""); $template = substr($template, 0, $blockbeg) . substr($template, $blockend + 18 + strlen($blockname) + strlen($blockvalue) + strlen($not)); } } } if (preg_match_all( '', $template, $matches, PREG_SET_ORDER) ) { // echo $matches[0][1]; // echo $matches[0][2]; // echo $matches[0][3]; // exit; foreach ($matches as $block) { $blockname = $block[1]; $cmp = $block[2]; $blockstrvalue = $block[3]; // If $ get from content variable! if ( strpos($blockstrvalue, "$") !== false ) { // Trunscate $ $szVarId = substr( $blockstrvalue, 1 ); if ( isset($this->vars[$szVarId]) ) $blockvalue = intval($this->vars[$szVarId]); else $blockvalue = intval($blockstrvalue); } else // Plain number value $blockvalue = intval($blockstrvalue); if ( isset($values[$blockname]) ) { //echo "$cmp == '>' && @$values[$blockname] > $blockvalue
"; // Perform comparison if ( ($cmp == '>' && @$values[$blockname] > $blockvalue) || ($cmp == '>=' && @$values[$blockname] >= $blockvalue) || ($cmp == '<' && @$values[$blockname] < $blockvalue) || ($cmp == '<=' && @$values[$blockname] <= $blockvalue) ) { $template = str_replace( "", "", $template ); $template = str_replace( "", "", $template ); } else if ($blockend = strpos( $template, "")) { $blockbeg = strpos($template, ""); $template = substr($template, 0, $blockbeg) . substr($template, $blockend + 18 + strlen($blockname) + strlen($blockstrvalue) + strlen($cmp)); } } else { $template = str_replace( "", "", $template ); $template = str_replace( "", "", $template ); } } } // return processed template return $template; } } function InsertTemplateVariableHelper($szValue, $matches) { } function InsertTemplateVariable($matches) // $szValue, $szOperation, $szOption) { // Helper variable because of preg_replace_callback global $tmpValue; // Set Defaults $szResult = $tmpValue; $szOperation = $matches[1]; $szOption = $matches[2]; switch ( $szOperation ) { case "trunscate": if ( is_numeric($szOption) && strlen($tmpValue) > $szOption) $szResult = substr($tmpValue, 0, $szOption) . " ..."; break; case "forcelinebreak": if ( is_numeric($szOption) && strlen($tmpValue) > $szOption) $szResult = wordwrap($tmpValue, $szOption, "
", true); break; case "wordwrap": if ( is_numeric($szOption) && strlen($tmpValue) > $szOption) $szResult = wordwrap($tmpValue, $szOption, " ", true); break; default: // Nothing break; } // return result return $szResult; } ?>loganalyzer-4.1.5/src/classes/enums.class.php000066400000000000000000000037421277740250400212560ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- /** * ENUM of available ReadDirection. */ abstract class EnumReadDirection { const Forward = 1; const Backward = 2; } /** * ENUM of available Sorting Orders. */ abstract class EnumSortingOrder { const Ascending = 1; const Descending = 2; } /** * Available modes of seek */ abstract class EnumSeek { const BOS = 1; // seek from begin stream const EOS = 2; // seek from end of stream const UID = 3; // seek from position uid (which MUST be a *valid* uid!) } ?> loganalyzer-4.1.5/src/classes/html2fpdf/000077500000000000000000000000001277740250400201725ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/html2fpdf/credits.txt000066400000000000000000000021351277740250400223710ustar00rootroot00000000000000 ********* *CREDITS* __________ ********* Thanks to: -Olivier Plathey for the fpdf.php class [http://www.fpdf.org] -Damon Kohler for the Flowing Block script [mailto:damonkohler@yahoo.com] -Clment Lavoillotte for HTML-oriented FPDF idea -Yamasoft for the gif.php class [http://www.yamasoft.com/] -Jrme Fenal for the _parsegif() function -"VIETCOM" for the PDFTable code [http://www.freepgs.com/vietcom/tool/pdftable/] [mailto:vncommando@yahoo.com] -Yukihiro O. for the SetDash() function [mailto:yukihiro_o@infoseek.jp] -Ron Korving for the WordWrap() function -Michel Poulain for the DisplayPreferences() function -Patrick Benny for the MultiCellBlt() function idea [no longer in use] -Seb for the _SetTextRendering() and SetTextOutline() functions [mailto:captainseb@wanadoo.fr] -MorphSoft for the colornames list idea -W3SCHOOLS for HTML-related reference info [http://www.w3schools.com/] __________________ Special Thanks to: --- Montfort Cultural Association - the site for which I generated this script [http://www.montfort.org.br] loganalyzer-4.1.5/src/classes/html2fpdf/font/000077500000000000000000000000001277740250400211405ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/html2fpdf/font/courier.php000066400000000000000000000004011277740250400233140ustar00rootroot00000000000000 loganalyzer-4.1.5/src/classes/html2fpdf/font/helvetica.php000066400000000000000000000061321277740250400236170ustar00rootroot00000000000000278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/helveticab.php000066400000000000000000000061321277740250400237610ustar00rootroot00000000000000278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/helveticabi.php000066400000000000000000000061331277740250400241330ustar00rootroot00000000000000278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/helveticai.php000066400000000000000000000061331277740250400237710ustar00rootroot00000000000000278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/000077500000000000000000000000001277740250400227445ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1250.map000066400000000000000000000107021277740250400243550ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !89 U+2030 perthousand !8A U+0160 Scaron !8B U+2039 guilsinglleft !8C U+015A Sacute !8D U+0164 Tcaron !8E U+017D Zcaron !8F U+0179 Zacute !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !99 U+2122 trademark !9A U+0161 scaron !9B U+203A guilsinglright !9C U+015B sacute !9D U+0165 tcaron !9E U+017E zcaron !9F U+017A zacute !A0 U+00A0 space !A1 U+02C7 caron !A2 U+02D8 breve !A3 U+0141 Lslash !A4 U+00A4 currency !A5 U+0104 Aogonek !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+015E Scedilla !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+017B Zdotaccent !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+02DB ogonek !B3 U+0142 lslash !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00B8 cedilla !B9 U+0105 aogonek !BA U+015F scedilla !BB U+00BB guillemotright !BC U+013D Lcaron !BD U+02DD hungarumlaut !BE U+013E lcaron !BF U+017C zdotaccent !C0 U+0154 Racute !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+0102 Abreve !C4 U+00C4 Adieresis !C5 U+0139 Lacute !C6 U+0106 Cacute !C7 U+00C7 Ccedilla !C8 U+010C Ccaron !C9 U+00C9 Eacute !CA U+0118 Eogonek !CB U+00CB Edieresis !CC U+011A Ecaron !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+010E Dcaron !D0 U+0110 Dcroat !D1 U+0143 Nacute !D2 U+0147 Ncaron !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+0150 Ohungarumlaut !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+0158 Rcaron !D9 U+016E Uring !DA U+00DA Uacute !DB U+0170 Uhungarumlaut !DC U+00DC Udieresis !DD U+00DD Yacute !DE U+0162 Tcommaaccent !DF U+00DF germandbls !E0 U+0155 racute !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+0103 abreve !E4 U+00E4 adieresis !E5 U+013A lacute !E6 U+0107 cacute !E7 U+00E7 ccedilla !E8 U+010D ccaron !E9 U+00E9 eacute !EA U+0119 eogonek !EB U+00EB edieresis !EC U+011B ecaron !ED U+00ED iacute !EE U+00EE icircumflex !EF U+010F dcaron !F0 U+0111 dcroat !F1 U+0144 nacute !F2 U+0148 ncaron !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+0151 ohungarumlaut !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+0159 rcaron !F9 U+016F uring !FA U+00FA uacute !FB U+0171 uhungarumlaut !FC U+00FC udieresis !FD U+00FD yacute !FE U+0163 tcommaaccent !FF U+02D9 dotaccent loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1251.map000066400000000000000000000112501277740250400243550ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0402 afii10051 !81 U+0403 afii10052 !82 U+201A quotesinglbase !83 U+0453 afii10100 !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !88 U+20AC Euro !89 U+2030 perthousand !8A U+0409 afii10058 !8B U+2039 guilsinglleft !8C U+040A afii10059 !8D U+040C afii10061 !8E U+040B afii10060 !8F U+040F afii10145 !90 U+0452 afii10099 !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !99 U+2122 trademark !9A U+0459 afii10106 !9B U+203A guilsinglright !9C U+045A afii10107 !9D U+045C afii10109 !9E U+045B afii10108 !9F U+045F afii10193 !A0 U+00A0 space !A1 U+040E afii10062 !A2 U+045E afii10110 !A3 U+0408 afii10057 !A4 U+00A4 currency !A5 U+0490 afii10050 !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+0401 afii10023 !A9 U+00A9 copyright !AA U+0404 afii10053 !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+0407 afii10056 !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+0406 afii10055 !B3 U+0456 afii10103 !B4 U+0491 afii10098 !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+0451 afii10071 !B9 U+2116 afii61352 !BA U+0454 afii10101 !BB U+00BB guillemotright !BC U+0458 afii10105 !BD U+0405 afii10054 !BE U+0455 afii10102 !BF U+0457 afii10104 !C0 U+0410 afii10017 !C1 U+0411 afii10018 !C2 U+0412 afii10019 !C3 U+0413 afii10020 !C4 U+0414 afii10021 !C5 U+0415 afii10022 !C6 U+0416 afii10024 !C7 U+0417 afii10025 !C8 U+0418 afii10026 !C9 U+0419 afii10027 !CA U+041A afii10028 !CB U+041B afii10029 !CC U+041C afii10030 !CD U+041D afii10031 !CE U+041E afii10032 !CF U+041F afii10033 !D0 U+0420 afii10034 !D1 U+0421 afii10035 !D2 U+0422 afii10036 !D3 U+0423 afii10037 !D4 U+0424 afii10038 !D5 U+0425 afii10039 !D6 U+0426 afii10040 !D7 U+0427 afii10041 !D8 U+0428 afii10042 !D9 U+0429 afii10043 !DA U+042A afii10044 !DB U+042B afii10045 !DC U+042C afii10046 !DD U+042D afii10047 !DE U+042E afii10048 !DF U+042F afii10049 !E0 U+0430 afii10065 !E1 U+0431 afii10066 !E2 U+0432 afii10067 !E3 U+0433 afii10068 !E4 U+0434 afii10069 !E5 U+0435 afii10070 !E6 U+0436 afii10072 !E7 U+0437 afii10073 !E8 U+0438 afii10074 !E9 U+0439 afii10075 !EA U+043A afii10076 !EB U+043B afii10077 !EC U+043C afii10078 !ED U+043D afii10079 !EE U+043E afii10080 !EF U+043F afii10081 !F0 U+0440 afii10082 !F1 U+0441 afii10083 !F2 U+0442 afii10084 !F3 U+0443 afii10085 !F4 U+0444 afii10086 !F5 U+0445 afii10087 !F6 U+0446 afii10088 !F7 U+0447 afii10089 !F8 U+0448 afii10090 !F9 U+0449 afii10091 !FA U+044A afii10092 !FB U+044B afii10093 !FC U+044C afii10094 !FD U+044D afii10095 !FE U+044E afii10096 !FF U+044F afii10097 loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1252.map000066400000000000000000000106751277740250400243700ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !83 U+0192 florin !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !88 U+02C6 circumflex !89 U+2030 perthousand !8A U+0160 Scaron !8B U+2039 guilsinglleft !8C U+0152 OE !8E U+017D Zcaron !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !98 U+02DC tilde !99 U+2122 trademark !9A U+0161 scaron !9B U+203A guilsinglright !9C U+0153 oe !9E U+017E zcaron !9F U+0178 Ydieresis !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+00A4 currency !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+00AA ordfeminine !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00B8 cedilla !B9 U+00B9 onesuperior !BA U+00BA ordmasculine !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00BF questiondown !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+00C3 Atilde !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+00CC Igrave !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+00D0 Eth !D1 U+00D1 Ntilde !D2 U+00D2 Ograve !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+00DD Yacute !DE U+00DE Thorn !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+00E3 atilde !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+00EC igrave !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+00F0 eth !F1 U+00F1 ntilde !F2 U+00F2 ograve !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+00FD yacute !FE U+00FE thorn !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1253.map000066400000000000000000000102371277740250400243630ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !83 U+0192 florin !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !89 U+2030 perthousand !8B U+2039 guilsinglleft !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !99 U+2122 trademark !9B U+203A guilsinglright !A0 U+00A0 space !A1 U+0385 dieresistonos !A2 U+0386 Alphatonos !A3 U+00A3 sterling !A4 U+00A4 currency !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+2015 afii00208 !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+0384 tonos !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+0388 Epsilontonos !B9 U+0389 Etatonos !BA U+038A Iotatonos !BB U+00BB guillemotright !BC U+038C Omicrontonos !BD U+00BD onehalf !BE U+038E Upsilontonos !BF U+038F Omegatonos !C0 U+0390 iotadieresistonos !C1 U+0391 Alpha !C2 U+0392 Beta !C3 U+0393 Gamma !C4 U+0394 Delta !C5 U+0395 Epsilon !C6 U+0396 Zeta !C7 U+0397 Eta !C8 U+0398 Theta !C9 U+0399 Iota !CA U+039A Kappa !CB U+039B Lambda !CC U+039C Mu !CD U+039D Nu !CE U+039E Xi !CF U+039F Omicron !D0 U+03A0 Pi !D1 U+03A1 Rho !D3 U+03A3 Sigma !D4 U+03A4 Tau !D5 U+03A5 Upsilon !D6 U+03A6 Phi !D7 U+03A7 Chi !D8 U+03A8 Psi !D9 U+03A9 Omega !DA U+03AA Iotadieresis !DB U+03AB Upsilondieresis !DC U+03AC alphatonos !DD U+03AD epsilontonos !DE U+03AE etatonos !DF U+03AF iotatonos !E0 U+03B0 upsilondieresistonos !E1 U+03B1 alpha !E2 U+03B2 beta !E3 U+03B3 gamma !E4 U+03B4 delta !E5 U+03B5 epsilon !E6 U+03B6 zeta !E7 U+03B7 eta !E8 U+03B8 theta !E9 U+03B9 iota !EA U+03BA kappa !EB U+03BB lambda !EC U+03BC mu !ED U+03BD nu !EE U+03BE xi !EF U+03BF omicron !F0 U+03C0 pi !F1 U+03C1 rho !F2 U+03C2 sigma1 !F3 U+03C3 sigma !F4 U+03C4 tau !F5 U+03C5 upsilon !F6 U+03C6 phi !F7 U+03C7 chi !F8 U+03C8 psi !F9 U+03C9 omega !FA U+03CA iotadieresis !FB U+03CB upsilondieresis !FC U+03CC omicrontonos !FD U+03CD upsilontonos !FE U+03CE omegatonos loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1254.map000066400000000000000000000106531277740250400243660ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !83 U+0192 florin !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !88 U+02C6 circumflex !89 U+2030 perthousand !8A U+0160 Scaron !8B U+2039 guilsinglleft !8C U+0152 OE !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !98 U+02DC tilde !99 U+2122 trademark !9A U+0161 scaron !9B U+203A guilsinglright !9C U+0153 oe !9F U+0178 Ydieresis !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+00A4 currency !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+00AA ordfeminine !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00B8 cedilla !B9 U+00B9 onesuperior !BA U+00BA ordmasculine !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00BF questiondown !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+00C3 Atilde !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+00CC Igrave !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+011E Gbreve !D1 U+00D1 Ntilde !D2 U+00D2 Ograve !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+0130 Idotaccent !DE U+015E Scedilla !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+00E3 atilde !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+00EC igrave !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+011F gbreve !F1 U+00F1 ntilde !F2 U+00F2 ograve !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+0131 dotlessi !FE U+015F scedilla !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1255.map000066400000000000000000000103121277740250400243570ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !83 U+0192 florin !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !88 U+02C6 circumflex !89 U+2030 perthousand !8B U+2039 guilsinglleft !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !98 U+02DC tilde !99 U+2122 trademark !9B U+203A guilsinglright !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+20AA afii57636 !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+00D7 multiply !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD sfthyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 middot !B8 U+00B8 cedilla !B9 U+00B9 onesuperior !BA U+00F7 divide !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00BF questiondown !C0 U+05B0 afii57799 !C1 U+05B1 afii57801 !C2 U+05B2 afii57800 !C3 U+05B3 afii57802 !C4 U+05B4 afii57793 !C5 U+05B5 afii57794 !C6 U+05B6 afii57795 !C7 U+05B7 afii57798 !C8 U+05B8 afii57797 !C9 U+05B9 afii57806 !CB U+05BB afii57796 !CC U+05BC afii57807 !CD U+05BD afii57839 !CE U+05BE afii57645 !CF U+05BF afii57841 !D0 U+05C0 afii57842 !D1 U+05C1 afii57804 !D2 U+05C2 afii57803 !D3 U+05C3 afii57658 !D4 U+05F0 afii57716 !D5 U+05F1 afii57717 !D6 U+05F2 afii57718 !D7 U+05F3 gereshhebrew !D8 U+05F4 gershayimhebrew !E0 U+05D0 afii57664 !E1 U+05D1 afii57665 !E2 U+05D2 afii57666 !E3 U+05D3 afii57667 !E4 U+05D4 afii57668 !E5 U+05D5 afii57669 !E6 U+05D6 afii57670 !E7 U+05D7 afii57671 !E8 U+05D8 afii57672 !E9 U+05D9 afii57673 !EA U+05DA afii57674 !EB U+05DB afii57675 !EC U+05DC afii57676 !ED U+05DD afii57677 !EE U+05DE afii57678 !EF U+05DF afii57679 !F0 U+05E0 afii57680 !F1 U+05E1 afii57681 !F2 U+05E2 afii57682 !F3 U+05E3 afii57683 !F4 U+05E4 afii57684 !F5 U+05E5 afii57685 !F6 U+05E6 afii57686 !F7 U+05E7 afii57687 !F8 U+05E8 afii57688 !F9 U+05E9 afii57689 !FA U+05EA afii57690 !FD U+200E afii299 !FE U+200F afii300 loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1257.map000066400000000000000000000105221277740250400243640ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !89 U+2030 perthousand !8B U+2039 guilsinglleft !8D U+00A8 dieresis !8E U+02C7 caron !8F U+00B8 cedilla !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !99 U+2122 trademark !9B U+203A guilsinglright !9D U+00AF macron !9E U+02DB ogonek !A0 U+00A0 space !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+00A4 currency !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00D8 Oslash !A9 U+00A9 copyright !AA U+0156 Rcommaaccent !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00C6 AE !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00F8 oslash !B9 U+00B9 onesuperior !BA U+0157 rcommaaccent !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00E6 ae !C0 U+0104 Aogonek !C1 U+012E Iogonek !C2 U+0100 Amacron !C3 U+0106 Cacute !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+0118 Eogonek !C7 U+0112 Emacron !C8 U+010C Ccaron !C9 U+00C9 Eacute !CA U+0179 Zacute !CB U+0116 Edotaccent !CC U+0122 Gcommaaccent !CD U+0136 Kcommaaccent !CE U+012A Imacron !CF U+013B Lcommaaccent !D0 U+0160 Scaron !D1 U+0143 Nacute !D2 U+0145 Ncommaaccent !D3 U+00D3 Oacute !D4 U+014C Omacron !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+0172 Uogonek !D9 U+0141 Lslash !DA U+015A Sacute !DB U+016A Umacron !DC U+00DC Udieresis !DD U+017B Zdotaccent !DE U+017D Zcaron !DF U+00DF germandbls !E0 U+0105 aogonek !E1 U+012F iogonek !E2 U+0101 amacron !E3 U+0107 cacute !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+0119 eogonek !E7 U+0113 emacron !E8 U+010D ccaron !E9 U+00E9 eacute !EA U+017A zacute !EB U+0117 edotaccent !EC U+0123 gcommaaccent !ED U+0137 kcommaaccent !EE U+012B imacron !EF U+013C lcommaaccent !F0 U+0161 scaron !F1 U+0144 nacute !F2 U+0146 ncommaaccent !F3 U+00F3 oacute !F4 U+014D omacron !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+0173 uogonek !F9 U+0142 lslash !FA U+015B sacute !FB U+016B umacron !FC U+00FC udieresis !FD U+017C zdotaccent !FE U+017E zcaron !FF U+02D9 dotaccent loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp1258.map000066400000000000000000000106151277740250400243700ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !82 U+201A quotesinglbase !83 U+0192 florin !84 U+201E quotedblbase !85 U+2026 ellipsis !86 U+2020 dagger !87 U+2021 daggerdbl !88 U+02C6 circumflex !89 U+2030 perthousand !8B U+2039 guilsinglleft !8C U+0152 OE !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !98 U+02DC tilde !99 U+2122 trademark !9B U+203A guilsinglright !9C U+0153 oe !9F U+0178 Ydieresis !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+00A4 currency !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+00AA ordfeminine !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00B8 cedilla !B9 U+00B9 onesuperior !BA U+00BA ordmasculine !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00BF questiondown !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+0102 Abreve !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+0300 gravecomb !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+0110 Dcroat !D1 U+00D1 Ntilde !D2 U+0309 hookabovecomb !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+01A0 Ohorn !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+01AF Uhorn !DE U+0303 tildecomb !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+0103 abreve !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+0301 acutecomb !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+0111 dcroat !F1 U+00F1 ntilde !F2 U+0323 dotbelowcomb !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+01A1 ohorn !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+01B0 uhorn !FE U+20AB dong !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/cp874.map000066400000000000000000000102471277740250400243140ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+20AC Euro !85 U+2026 ellipsis !91 U+2018 quoteleft !92 U+2019 quoteright !93 U+201C quotedblleft !94 U+201D quotedblright !95 U+2022 bullet !96 U+2013 endash !97 U+2014 emdash !A0 U+00A0 space !A1 U+0E01 kokaithai !A2 U+0E02 khokhaithai !A3 U+0E03 khokhuatthai !A4 U+0E04 khokhwaithai !A5 U+0E05 khokhonthai !A6 U+0E06 khorakhangthai !A7 U+0E07 ngonguthai !A8 U+0E08 chochanthai !A9 U+0E09 chochingthai !AA U+0E0A chochangthai !AB U+0E0B sosothai !AC U+0E0C chochoethai !AD U+0E0D yoyingthai !AE U+0E0E dochadathai !AF U+0E0F topatakthai !B0 U+0E10 thothanthai !B1 U+0E11 thonangmonthothai !B2 U+0E12 thophuthaothai !B3 U+0E13 nonenthai !B4 U+0E14 dodekthai !B5 U+0E15 totaothai !B6 U+0E16 thothungthai !B7 U+0E17 thothahanthai !B8 U+0E18 thothongthai !B9 U+0E19 nonuthai !BA U+0E1A bobaimaithai !BB U+0E1B poplathai !BC U+0E1C phophungthai !BD U+0E1D fofathai !BE U+0E1E phophanthai !BF U+0E1F fofanthai !C0 U+0E20 phosamphaothai !C1 U+0E21 momathai !C2 U+0E22 yoyakthai !C3 U+0E23 roruathai !C4 U+0E24 ruthai !C5 U+0E25 lolingthai !C6 U+0E26 luthai !C7 U+0E27 wowaenthai !C8 U+0E28 sosalathai !C9 U+0E29 sorusithai !CA U+0E2A sosuathai !CB U+0E2B hohipthai !CC U+0E2C lochulathai !CD U+0E2D oangthai !CE U+0E2E honokhukthai !CF U+0E2F paiyannoithai !D0 U+0E30 saraathai !D1 U+0E31 maihanakatthai !D2 U+0E32 saraaathai !D3 U+0E33 saraamthai !D4 U+0E34 saraithai !D5 U+0E35 saraiithai !D6 U+0E36 sarauethai !D7 U+0E37 saraueethai !D8 U+0E38 sarauthai !D9 U+0E39 sarauuthai !DA U+0E3A phinthuthai !DF U+0E3F bahtthai !E0 U+0E40 saraethai !E1 U+0E41 saraaethai !E2 U+0E42 saraothai !E3 U+0E43 saraaimaimuanthai !E4 U+0E44 saraaimaimalaithai !E5 U+0E45 lakkhangyaothai !E6 U+0E46 maiyamokthai !E7 U+0E47 maitaikhuthai !E8 U+0E48 maiekthai !E9 U+0E49 maithothai !EA U+0E4A maitrithai !EB U+0E4B maichattawathai !EC U+0E4C thanthakhatthai !ED U+0E4D nikhahitthai !EE U+0E4E yamakkanthai !EF U+0E4F fongmanthai !F0 U+0E50 zerothai !F1 U+0E51 onethai !F2 U+0E52 twothai !F3 U+0E53 threethai !F4 U+0E54 fourthai !F5 U+0E55 fivethai !F6 U+0E56 sixthai !F7 U+0E57 seventhai !F8 U+0E58 eightthai !F9 U+0E59 ninethai !FA U+0E5A angkhankhuthai !FB U+0E5B khomutthai loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-1.map000066400000000000000000000107751277740250400250200ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+00A4 currency !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+00AA ordfeminine !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00B8 cedilla !B9 U+00B9 onesuperior !BA U+00BA ordmasculine !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00BF questiondown !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+00C3 Atilde !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+00CC Igrave !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+00D0 Eth !D1 U+00D1 Ntilde !D2 U+00D2 Ograve !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+00DD Yacute !DE U+00DE Thorn !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+00E3 atilde !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+00EC igrave !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+00F0 eth !F1 U+00F1 ntilde !F2 U+00F2 ograve !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+00FD yacute !FE U+00FE thorn !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-11.map000066400000000000000000000111211277740250400250630ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+0E01 kokaithai !A2 U+0E02 khokhaithai !A3 U+0E03 khokhuatthai !A4 U+0E04 khokhwaithai !A5 U+0E05 khokhonthai !A6 U+0E06 khorakhangthai !A7 U+0E07 ngonguthai !A8 U+0E08 chochanthai !A9 U+0E09 chochingthai !AA U+0E0A chochangthai !AB U+0E0B sosothai !AC U+0E0C chochoethai !AD U+0E0D yoyingthai !AE U+0E0E dochadathai !AF U+0E0F topatakthai !B0 U+0E10 thothanthai !B1 U+0E11 thonangmonthothai !B2 U+0E12 thophuthaothai !B3 U+0E13 nonenthai !B4 U+0E14 dodekthai !B5 U+0E15 totaothai !B6 U+0E16 thothungthai !B7 U+0E17 thothahanthai !B8 U+0E18 thothongthai !B9 U+0E19 nonuthai !BA U+0E1A bobaimaithai !BB U+0E1B poplathai !BC U+0E1C phophungthai !BD U+0E1D fofathai !BE U+0E1E phophanthai !BF U+0E1F fofanthai !C0 U+0E20 phosamphaothai !C1 U+0E21 momathai !C2 U+0E22 yoyakthai !C3 U+0E23 roruathai !C4 U+0E24 ruthai !C5 U+0E25 lolingthai !C6 U+0E26 luthai !C7 U+0E27 wowaenthai !C8 U+0E28 sosalathai !C9 U+0E29 sorusithai !CA U+0E2A sosuathai !CB U+0E2B hohipthai !CC U+0E2C lochulathai !CD U+0E2D oangthai !CE U+0E2E honokhukthai !CF U+0E2F paiyannoithai !D0 U+0E30 saraathai !D1 U+0E31 maihanakatthai !D2 U+0E32 saraaathai !D3 U+0E33 saraamthai !D4 U+0E34 saraithai !D5 U+0E35 saraiithai !D6 U+0E36 sarauethai !D7 U+0E37 saraueethai !D8 U+0E38 sarauthai !D9 U+0E39 sarauuthai !DA U+0E3A phinthuthai !DF U+0E3F bahtthai !E0 U+0E40 saraethai !E1 U+0E41 saraaethai !E2 U+0E42 saraothai !E3 U+0E43 saraaimaimuanthai !E4 U+0E44 saraaimaimalaithai !E5 U+0E45 lakkhangyaothai !E6 U+0E46 maiyamokthai !E7 U+0E47 maitaikhuthai !E8 U+0E48 maiekthai !E9 U+0E49 maithothai !EA U+0E4A maitrithai !EB U+0E4B maichattawathai !EC U+0E4C thanthakhatthai !ED U+0E4D nikhahitthai !EE U+0E4E yamakkanthai !EF U+0E4F fongmanthai !F0 U+0E50 zerothai !F1 U+0E51 onethai !F2 U+0E52 twothai !F3 U+0E53 threethai !F4 U+0E54 fourthai !F5 U+0E55 fivethai !F6 U+0E56 sixthai !F7 U+0E57 seventhai !F8 U+0E58 eightthai !F9 U+0E59 ninethai !FA U+0E5A angkhankhuthai !FB U+0E5B khomutthai loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-15.map000066400000000000000000000107431277740250400251000ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+20AC Euro !A5 U+00A5 yen !A6 U+0160 Scaron !A7 U+00A7 section !A8 U+0161 scaron !A9 U+00A9 copyright !AA U+00AA ordfeminine !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+017D Zcaron !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+017E zcaron !B9 U+00B9 onesuperior !BA U+00BA ordmasculine !BB U+00BB guillemotright !BC U+0152 OE !BD U+0153 oe !BE U+0178 Ydieresis !BF U+00BF questiondown !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+00C3 Atilde !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+00CC Igrave !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+00D0 Eth !D1 U+00D1 Ntilde !D2 U+00D2 Ograve !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+00DD Yacute !DE U+00DE Thorn !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+00E3 atilde !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+00EC igrave !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+00F0 eth !F1 U+00F1 ntilde !F2 U+00F2 ograve !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+00FD yacute !FE U+00FE thorn !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-16.map000066400000000000000000000110211277740250400250670ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+0104 Aogonek !A2 U+0105 aogonek !A3 U+0141 Lslash !A4 U+20AC Euro !A5 U+201E quotedblbase !A6 U+0160 Scaron !A7 U+00A7 section !A8 U+0161 scaron !A9 U+00A9 copyright !AA U+0218 Scommaaccent !AB U+00AB guillemotleft !AC U+0179 Zacute !AD U+00AD hyphen !AE U+017A zacute !AF U+017B Zdotaccent !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+010C Ccaron !B3 U+0142 lslash !B4 U+017D Zcaron !B5 U+201D quotedblright !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+017E zcaron !B9 U+010D ccaron !BA U+0219 scommaaccent !BB U+00BB guillemotright !BC U+0152 OE !BD U+0153 oe !BE U+0178 Ydieresis !BF U+017C zdotaccent !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+0102 Abreve !C4 U+00C4 Adieresis !C5 U+0106 Cacute !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+00CC Igrave !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+0110 Dcroat !D1 U+0143 Nacute !D2 U+00D2 Ograve !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+0150 Ohungarumlaut !D6 U+00D6 Odieresis !D7 U+015A Sacute !D8 U+0170 Uhungarumlaut !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+0118 Eogonek !DE U+021A Tcommaaccent !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+0103 abreve !E4 U+00E4 adieresis !E5 U+0107 cacute !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+00EC igrave !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+0111 dcroat !F1 U+0144 nacute !F2 U+00F2 ograve !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+0151 ohungarumlaut !F6 U+00F6 odieresis !F7 U+015B sacute !F8 U+0171 uhungarumlaut !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+0119 eogonek !FE U+021B tcommaaccent !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-2.map000066400000000000000000000107311277740250400250110ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+0104 Aogonek !A2 U+02D8 breve !A3 U+0141 Lslash !A4 U+00A4 currency !A5 U+013D Lcaron !A6 U+015A Sacute !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+0160 Scaron !AA U+015E Scedilla !AB U+0164 Tcaron !AC U+0179 Zacute !AD U+00AD hyphen !AE U+017D Zcaron !AF U+017B Zdotaccent !B0 U+00B0 degree !B1 U+0105 aogonek !B2 U+02DB ogonek !B3 U+0142 lslash !B4 U+00B4 acute !B5 U+013E lcaron !B6 U+015B sacute !B7 U+02C7 caron !B8 U+00B8 cedilla !B9 U+0161 scaron !BA U+015F scedilla !BB U+0165 tcaron !BC U+017A zacute !BD U+02DD hungarumlaut !BE U+017E zcaron !BF U+017C zdotaccent !C0 U+0154 Racute !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+0102 Abreve !C4 U+00C4 Adieresis !C5 U+0139 Lacute !C6 U+0106 Cacute !C7 U+00C7 Ccedilla !C8 U+010C Ccaron !C9 U+00C9 Eacute !CA U+0118 Eogonek !CB U+00CB Edieresis !CC U+011A Ecaron !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+010E Dcaron !D0 U+0110 Dcroat !D1 U+0143 Nacute !D2 U+0147 Ncaron !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+0150 Ohungarumlaut !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+0158 Rcaron !D9 U+016E Uring !DA U+00DA Uacute !DB U+0170 Uhungarumlaut !DC U+00DC Udieresis !DD U+00DD Yacute !DE U+0162 Tcommaaccent !DF U+00DF germandbls !E0 U+0155 racute !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+0103 abreve !E4 U+00E4 adieresis !E5 U+013A lacute !E6 U+0107 cacute !E7 U+00E7 ccedilla !E8 U+010D ccaron !E9 U+00E9 eacute !EA U+0119 eogonek !EB U+00EB edieresis !EC U+011B ecaron !ED U+00ED iacute !EE U+00EE icircumflex !EF U+010F dcaron !F0 U+0111 dcroat !F1 U+0144 nacute !F2 U+0148 ncaron !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+0151 ohungarumlaut !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+0159 rcaron !F9 U+016F uring !FA U+00FA uacute !FB U+0171 uhungarumlaut !FC U+00FC udieresis !FD U+00FD yacute !FE U+0163 tcommaaccent !FF U+02D9 dotaccent loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-4.map000066400000000000000000000107541277740250400250200ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+0104 Aogonek !A2 U+0138 kgreenlandic !A3 U+0156 Rcommaaccent !A4 U+00A4 currency !A5 U+0128 Itilde !A6 U+013B Lcommaaccent !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+0160 Scaron !AA U+0112 Emacron !AB U+0122 Gcommaaccent !AC U+0166 Tbar !AD U+00AD hyphen !AE U+017D Zcaron !AF U+00AF macron !B0 U+00B0 degree !B1 U+0105 aogonek !B2 U+02DB ogonek !B3 U+0157 rcommaaccent !B4 U+00B4 acute !B5 U+0129 itilde !B6 U+013C lcommaaccent !B7 U+02C7 caron !B8 U+00B8 cedilla !B9 U+0161 scaron !BA U+0113 emacron !BB U+0123 gcommaaccent !BC U+0167 tbar !BD U+014A Eng !BE U+017E zcaron !BF U+014B eng !C0 U+0100 Amacron !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+00C3 Atilde !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+012E Iogonek !C8 U+010C Ccaron !C9 U+00C9 Eacute !CA U+0118 Eogonek !CB U+00CB Edieresis !CC U+0116 Edotaccent !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+012A Imacron !D0 U+0110 Dcroat !D1 U+0145 Ncommaaccent !D2 U+014C Omacron !D3 U+0136 Kcommaaccent !D4 U+00D4 Ocircumflex !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+0172 Uogonek !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+0168 Utilde !DE U+016A Umacron !DF U+00DF germandbls !E0 U+0101 amacron !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+00E3 atilde !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+012F iogonek !E8 U+010D ccaron !E9 U+00E9 eacute !EA U+0119 eogonek !EB U+00EB edieresis !EC U+0117 edotaccent !ED U+00ED iacute !EE U+00EE icircumflex !EF U+012B imacron !F0 U+0111 dcroat !F1 U+0146 ncommaaccent !F2 U+014D omacron !F3 U+0137 kcommaaccent !F4 U+00F4 ocircumflex !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+0173 uogonek !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+0169 utilde !FE U+016B umacron !FF U+02D9 dotaccent loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-5.map000066400000000000000000000111571277740250400250170ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+0401 afii10023 !A2 U+0402 afii10051 !A3 U+0403 afii10052 !A4 U+0404 afii10053 !A5 U+0405 afii10054 !A6 U+0406 afii10055 !A7 U+0407 afii10056 !A8 U+0408 afii10057 !A9 U+0409 afii10058 !AA U+040A afii10059 !AB U+040B afii10060 !AC U+040C afii10061 !AD U+00AD hyphen !AE U+040E afii10062 !AF U+040F afii10145 !B0 U+0410 afii10017 !B1 U+0411 afii10018 !B2 U+0412 afii10019 !B3 U+0413 afii10020 !B4 U+0414 afii10021 !B5 U+0415 afii10022 !B6 U+0416 afii10024 !B7 U+0417 afii10025 !B8 U+0418 afii10026 !B9 U+0419 afii10027 !BA U+041A afii10028 !BB U+041B afii10029 !BC U+041C afii10030 !BD U+041D afii10031 !BE U+041E afii10032 !BF U+041F afii10033 !C0 U+0420 afii10034 !C1 U+0421 afii10035 !C2 U+0422 afii10036 !C3 U+0423 afii10037 !C4 U+0424 afii10038 !C5 U+0425 afii10039 !C6 U+0426 afii10040 !C7 U+0427 afii10041 !C8 U+0428 afii10042 !C9 U+0429 afii10043 !CA U+042A afii10044 !CB U+042B afii10045 !CC U+042C afii10046 !CD U+042D afii10047 !CE U+042E afii10048 !CF U+042F afii10049 !D0 U+0430 afii10065 !D1 U+0431 afii10066 !D2 U+0432 afii10067 !D3 U+0433 afii10068 !D4 U+0434 afii10069 !D5 U+0435 afii10070 !D6 U+0436 afii10072 !D7 U+0437 afii10073 !D8 U+0438 afii10074 !D9 U+0439 afii10075 !DA U+043A afii10076 !DB U+043B afii10077 !DC U+043C afii10078 !DD U+043D afii10079 !DE U+043E afii10080 !DF U+043F afii10081 !E0 U+0440 afii10082 !E1 U+0441 afii10083 !E2 U+0442 afii10084 !E3 U+0443 afii10085 !E4 U+0444 afii10086 !E5 U+0445 afii10087 !E6 U+0446 afii10088 !E7 U+0447 afii10089 !E8 U+0448 afii10090 !E9 U+0449 afii10091 !EA U+044A afii10092 !EB U+044B afii10093 !EC U+044C afii10094 !ED U+044D afii10095 !EE U+044E afii10096 !EF U+044F afii10097 !F0 U+2116 afii61352 !F1 U+0451 afii10071 !F2 U+0452 afii10099 !F3 U+0453 afii10100 !F4 U+0454 afii10101 !F5 U+0455 afii10102 !F6 U+0456 afii10103 !F7 U+0457 afii10104 !F8 U+0458 afii10105 !F9 U+0459 afii10106 !FA U+045A afii10107 !FB U+045B afii10108 !FC U+045C afii10109 !FD U+00A7 section !FE U+045E afii10110 !FF U+045F afii10193 loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-7.map000066400000000000000000000105161277740250400250170ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+2018 quoteleft !A2 U+2019 quoteright !A3 U+00A3 sterling !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AF U+2015 afii00208 !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+0384 tonos !B5 U+0385 dieresistonos !B6 U+0386 Alphatonos !B7 U+00B7 periodcentered !B8 U+0388 Epsilontonos !B9 U+0389 Etatonos !BA U+038A Iotatonos !BB U+00BB guillemotright !BC U+038C Omicrontonos !BD U+00BD onehalf !BE U+038E Upsilontonos !BF U+038F Omegatonos !C0 U+0390 iotadieresistonos !C1 U+0391 Alpha !C2 U+0392 Beta !C3 U+0393 Gamma !C4 U+0394 Delta !C5 U+0395 Epsilon !C6 U+0396 Zeta !C7 U+0397 Eta !C8 U+0398 Theta !C9 U+0399 Iota !CA U+039A Kappa !CB U+039B Lambda !CC U+039C Mu !CD U+039D Nu !CE U+039E Xi !CF U+039F Omicron !D0 U+03A0 Pi !D1 U+03A1 Rho !D3 U+03A3 Sigma !D4 U+03A4 Tau !D5 U+03A5 Upsilon !D6 U+03A6 Phi !D7 U+03A7 Chi !D8 U+03A8 Psi !D9 U+03A9 Omega !DA U+03AA Iotadieresis !DB U+03AB Upsilondieresis !DC U+03AC alphatonos !DD U+03AD epsilontonos !DE U+03AE etatonos !DF U+03AF iotatonos !E0 U+03B0 upsilondieresistonos !E1 U+03B1 alpha !E2 U+03B2 beta !E3 U+03B3 gamma !E4 U+03B4 delta !E5 U+03B5 epsilon !E6 U+03B6 zeta !E7 U+03B7 eta !E8 U+03B8 theta !E9 U+03B9 iota !EA U+03BA kappa !EB U+03BB lambda !EC U+03BC mu !ED U+03BD nu !EE U+03BE xi !EF U+03BF omicron !F0 U+03C0 pi !F1 U+03C1 rho !F2 U+03C2 sigma1 !F3 U+03C3 sigma !F4 U+03C4 tau !F5 U+03C5 upsilon !F6 U+03C6 phi !F7 U+03C7 chi !F8 U+03C8 psi !F9 U+03C9 omega !FA U+03CA iotadieresis !FB U+03CB upsilondieresis !FC U+03CC omicrontonos !FD U+03CD upsilontonos !FE U+03CE omegatonos loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/iso-8859-9.map000066400000000000000000000110171277740250400250160ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+0080 .notdef !81 U+0081 .notdef !82 U+0082 .notdef !83 U+0083 .notdef !84 U+0084 .notdef !85 U+0085 .notdef !86 U+0086 .notdef !87 U+0087 .notdef !88 U+0088 .notdef !89 U+0089 .notdef !8A U+008A .notdef !8B U+008B .notdef !8C U+008C .notdef !8D U+008D .notdef !8E U+008E .notdef !8F U+008F .notdef !90 U+0090 .notdef !91 U+0091 .notdef !92 U+0092 .notdef !93 U+0093 .notdef !94 U+0094 .notdef !95 U+0095 .notdef !96 U+0096 .notdef !97 U+0097 .notdef !98 U+0098 .notdef !99 U+0099 .notdef !9A U+009A .notdef !9B U+009B .notdef !9C U+009C .notdef !9D U+009D .notdef !9E U+009E .notdef !9F U+009F .notdef !A0 U+00A0 space !A1 U+00A1 exclamdown !A2 U+00A2 cent !A3 U+00A3 sterling !A4 U+00A4 currency !A5 U+00A5 yen !A6 U+00A6 brokenbar !A7 U+00A7 section !A8 U+00A8 dieresis !A9 U+00A9 copyright !AA U+00AA ordfeminine !AB U+00AB guillemotleft !AC U+00AC logicalnot !AD U+00AD hyphen !AE U+00AE registered !AF U+00AF macron !B0 U+00B0 degree !B1 U+00B1 plusminus !B2 U+00B2 twosuperior !B3 U+00B3 threesuperior !B4 U+00B4 acute !B5 U+00B5 mu !B6 U+00B6 paragraph !B7 U+00B7 periodcentered !B8 U+00B8 cedilla !B9 U+00B9 onesuperior !BA U+00BA ordmasculine !BB U+00BB guillemotright !BC U+00BC onequarter !BD U+00BD onehalf !BE U+00BE threequarters !BF U+00BF questiondown !C0 U+00C0 Agrave !C1 U+00C1 Aacute !C2 U+00C2 Acircumflex !C3 U+00C3 Atilde !C4 U+00C4 Adieresis !C5 U+00C5 Aring !C6 U+00C6 AE !C7 U+00C7 Ccedilla !C8 U+00C8 Egrave !C9 U+00C9 Eacute !CA U+00CA Ecircumflex !CB U+00CB Edieresis !CC U+00CC Igrave !CD U+00CD Iacute !CE U+00CE Icircumflex !CF U+00CF Idieresis !D0 U+011E Gbreve !D1 U+00D1 Ntilde !D2 U+00D2 Ograve !D3 U+00D3 Oacute !D4 U+00D4 Ocircumflex !D5 U+00D5 Otilde !D6 U+00D6 Odieresis !D7 U+00D7 multiply !D8 U+00D8 Oslash !D9 U+00D9 Ugrave !DA U+00DA Uacute !DB U+00DB Ucircumflex !DC U+00DC Udieresis !DD U+0130 Idotaccent !DE U+015E Scedilla !DF U+00DF germandbls !E0 U+00E0 agrave !E1 U+00E1 aacute !E2 U+00E2 acircumflex !E3 U+00E3 atilde !E4 U+00E4 adieresis !E5 U+00E5 aring !E6 U+00E6 ae !E7 U+00E7 ccedilla !E8 U+00E8 egrave !E9 U+00E9 eacute !EA U+00EA ecircumflex !EB U+00EB edieresis !EC U+00EC igrave !ED U+00ED iacute !EE U+00EE icircumflex !EF U+00EF idieresis !F0 U+011F gbreve !F1 U+00F1 ntilde !F2 U+00F2 ograve !F3 U+00F3 oacute !F4 U+00F4 ocircumflex !F5 U+00F5 otilde !F6 U+00F6 odieresis !F7 U+00F7 divide !F8 U+00F8 oslash !F9 U+00F9 ugrave !FA U+00FA uacute !FB U+00FB ucircumflex !FC U+00FC udieresis !FD U+0131 dotlessi !FE U+015F scedilla !FF U+00FF ydieresis loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/koi8-r.map000066400000000000000000000112031277740250400245510ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+2500 SF100000 !81 U+2502 SF110000 !82 U+250C SF010000 !83 U+2510 SF030000 !84 U+2514 SF020000 !85 U+2518 SF040000 !86 U+251C SF080000 !87 U+2524 SF090000 !88 U+252C SF060000 !89 U+2534 SF070000 !8A U+253C SF050000 !8B U+2580 upblock !8C U+2584 dnblock !8D U+2588 block !8E U+258C lfblock !8F U+2590 rtblock !90 U+2591 ltshade !91 U+2592 shade !92 U+2593 dkshade !93 U+2320 integraltp !94 U+25A0 filledbox !95 U+2219 periodcentered !96 U+221A radical !97 U+2248 approxequal !98 U+2264 lessequal !99 U+2265 greaterequal !9A U+00A0 space !9B U+2321 integralbt !9C U+00B0 degree !9D U+00B2 twosuperior !9E U+00B7 periodcentered !9F U+00F7 divide !A0 U+2550 SF430000 !A1 U+2551 SF240000 !A2 U+2552 SF510000 !A3 U+0451 afii10071 !A4 U+2553 SF520000 !A5 U+2554 SF390000 !A6 U+2555 SF220000 !A7 U+2556 SF210000 !A8 U+2557 SF250000 !A9 U+2558 SF500000 !AA U+2559 SF490000 !AB U+255A SF380000 !AC U+255B SF280000 !AD U+255C SF270000 !AE U+255D SF260000 !AF U+255E SF360000 !B0 U+255F SF370000 !B1 U+2560 SF420000 !B2 U+2561 SF190000 !B3 U+0401 afii10023 !B4 U+2562 SF200000 !B5 U+2563 SF230000 !B6 U+2564 SF470000 !B7 U+2565 SF480000 !B8 U+2566 SF410000 !B9 U+2567 SF450000 !BA U+2568 SF460000 !BB U+2569 SF400000 !BC U+256A SF540000 !BD U+256B SF530000 !BE U+256C SF440000 !BF U+00A9 copyright !C0 U+044E afii10096 !C1 U+0430 afii10065 !C2 U+0431 afii10066 !C3 U+0446 afii10088 !C4 U+0434 afii10069 !C5 U+0435 afii10070 !C6 U+0444 afii10086 !C7 U+0433 afii10068 !C8 U+0445 afii10087 !C9 U+0438 afii10074 !CA U+0439 afii10075 !CB U+043A afii10076 !CC U+043B afii10077 !CD U+043C afii10078 !CE U+043D afii10079 !CF U+043E afii10080 !D0 U+043F afii10081 !D1 U+044F afii10097 !D2 U+0440 afii10082 !D3 U+0441 afii10083 !D4 U+0442 afii10084 !D5 U+0443 afii10085 !D6 U+0436 afii10072 !D7 U+0432 afii10067 !D8 U+044C afii10094 !D9 U+044B afii10093 !DA U+0437 afii10073 !DB U+0448 afii10090 !DC U+044D afii10095 !DD U+0449 afii10091 !DE U+0447 afii10089 !DF U+044A afii10092 !E0 U+042E afii10048 !E1 U+0410 afii10017 !E2 U+0411 afii10018 !E3 U+0426 afii10040 !E4 U+0414 afii10021 !E5 U+0415 afii10022 !E6 U+0424 afii10038 !E7 U+0413 afii10020 !E8 U+0425 afii10039 !E9 U+0418 afii10026 !EA U+0419 afii10027 !EB U+041A afii10028 !EC U+041B afii10029 !ED U+041C afii10030 !EE U+041D afii10031 !EF U+041E afii10032 !F0 U+041F afii10033 !F1 U+042F afii10049 !F2 U+0420 afii10034 !F3 U+0421 afii10035 !F4 U+0422 afii10036 !F5 U+0423 afii10037 !F6 U+0416 afii10024 !F7 U+0412 afii10019 !F8 U+042C afii10046 !F9 U+042B afii10045 !FA U+0417 afii10025 !FB U+0428 afii10042 !FC U+042D afii10047 !FD U+0429 afii10043 !FE U+0427 afii10041 !FF U+042A afii10044 loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/koi8-u.map000066400000000000000000000112031277740250400245540ustar00rootroot00000000000000!00 U+0000 .notdef !01 U+0001 .notdef !02 U+0002 .notdef !03 U+0003 .notdef !04 U+0004 .notdef !05 U+0005 .notdef !06 U+0006 .notdef !07 U+0007 .notdef !08 U+0008 .notdef !09 U+0009 .notdef !0A U+000A .notdef !0B U+000B .notdef !0C U+000C .notdef !0D U+000D .notdef !0E U+000E .notdef !0F U+000F .notdef !10 U+0010 .notdef !11 U+0011 .notdef !12 U+0012 .notdef !13 U+0013 .notdef !14 U+0014 .notdef !15 U+0015 .notdef !16 U+0016 .notdef !17 U+0017 .notdef !18 U+0018 .notdef !19 U+0019 .notdef !1A U+001A .notdef !1B U+001B .notdef !1C U+001C .notdef !1D U+001D .notdef !1E U+001E .notdef !1F U+001F .notdef !20 U+0020 space !21 U+0021 exclam !22 U+0022 quotedbl !23 U+0023 numbersign !24 U+0024 dollar !25 U+0025 percent !26 U+0026 ampersand !27 U+0027 quotesingle !28 U+0028 parenleft !29 U+0029 parenright !2A U+002A asterisk !2B U+002B plus !2C U+002C comma !2D U+002D hyphen !2E U+002E period !2F U+002F slash !30 U+0030 zero !31 U+0031 one !32 U+0032 two !33 U+0033 three !34 U+0034 four !35 U+0035 five !36 U+0036 six !37 U+0037 seven !38 U+0038 eight !39 U+0039 nine !3A U+003A colon !3B U+003B semicolon !3C U+003C less !3D U+003D equal !3E U+003E greater !3F U+003F question !40 U+0040 at !41 U+0041 A !42 U+0042 B !43 U+0043 C !44 U+0044 D !45 U+0045 E !46 U+0046 F !47 U+0047 G !48 U+0048 H !49 U+0049 I !4A U+004A J !4B U+004B K !4C U+004C L !4D U+004D M !4E U+004E N !4F U+004F O !50 U+0050 P !51 U+0051 Q !52 U+0052 R !53 U+0053 S !54 U+0054 T !55 U+0055 U !56 U+0056 V !57 U+0057 W !58 U+0058 X !59 U+0059 Y !5A U+005A Z !5B U+005B bracketleft !5C U+005C backslash !5D U+005D bracketright !5E U+005E asciicircum !5F U+005F underscore !60 U+0060 grave !61 U+0061 a !62 U+0062 b !63 U+0063 c !64 U+0064 d !65 U+0065 e !66 U+0066 f !67 U+0067 g !68 U+0068 h !69 U+0069 i !6A U+006A j !6B U+006B k !6C U+006C l !6D U+006D m !6E U+006E n !6F U+006F o !70 U+0070 p !71 U+0071 q !72 U+0072 r !73 U+0073 s !74 U+0074 t !75 U+0075 u !76 U+0076 v !77 U+0077 w !78 U+0078 x !79 U+0079 y !7A U+007A z !7B U+007B braceleft !7C U+007C bar !7D U+007D braceright !7E U+007E asciitilde !7F U+007F .notdef !80 U+2500 SF100000 !81 U+2502 SF110000 !82 U+250C SF010000 !83 U+2510 SF030000 !84 U+2514 SF020000 !85 U+2518 SF040000 !86 U+251C SF080000 !87 U+2524 SF090000 !88 U+252C SF060000 !89 U+2534 SF070000 !8A U+253C SF050000 !8B U+2580 upblock !8C U+2584 dnblock !8D U+2588 block !8E U+258C lfblock !8F U+2590 rtblock !90 U+2591 ltshade !91 U+2592 shade !92 U+2593 dkshade !93 U+2320 integraltp !94 U+25A0 filledbox !95 U+2022 bullet !96 U+221A radical !97 U+2248 approxequal !98 U+2264 lessequal !99 U+2265 greaterequal !9A U+00A0 space !9B U+2321 integralbt !9C U+00B0 degree !9D U+00B2 twosuperior !9E U+00B7 periodcentered !9F U+00F7 divide !A0 U+2550 SF430000 !A1 U+2551 SF240000 !A2 U+2552 SF510000 !A3 U+0451 afii10071 !A4 U+0454 afii10101 !A5 U+2554 SF390000 !A6 U+0456 afii10103 !A7 U+0457 afii10104 !A8 U+2557 SF250000 !A9 U+2558 SF500000 !AA U+2559 SF490000 !AB U+255A SF380000 !AC U+255B SF280000 !AD U+0491 afii10098 !AE U+255D SF260000 !AF U+255E SF360000 !B0 U+255F SF370000 !B1 U+2560 SF420000 !B2 U+2561 SF190000 !B3 U+0401 afii10023 !B4 U+0404 afii10053 !B5 U+2563 SF230000 !B6 U+0406 afii10055 !B7 U+0407 afii10056 !B8 U+2566 SF410000 !B9 U+2567 SF450000 !BA U+2568 SF460000 !BB U+2569 SF400000 !BC U+256A SF540000 !BD U+0490 afii10050 !BE U+256C SF440000 !BF U+00A9 copyright !C0 U+044E afii10096 !C1 U+0430 afii10065 !C2 U+0431 afii10066 !C3 U+0446 afii10088 !C4 U+0434 afii10069 !C5 U+0435 afii10070 !C6 U+0444 afii10086 !C7 U+0433 afii10068 !C8 U+0445 afii10087 !C9 U+0438 afii10074 !CA U+0439 afii10075 !CB U+043A afii10076 !CC U+043B afii10077 !CD U+043C afii10078 !CE U+043D afii10079 !CF U+043E afii10080 !D0 U+043F afii10081 !D1 U+044F afii10097 !D2 U+0440 afii10082 !D3 U+0441 afii10083 !D4 U+0442 afii10084 !D5 U+0443 afii10085 !D6 U+0436 afii10072 !D7 U+0432 afii10067 !D8 U+044C afii10094 !D9 U+044B afii10093 !DA U+0437 afii10073 !DB U+0448 afii10090 !DC U+044D afii10095 !DD U+0449 afii10091 !DE U+0447 afii10089 !DF U+044A afii10092 !E0 U+042E afii10048 !E1 U+0410 afii10017 !E2 U+0411 afii10018 !E3 U+0426 afii10040 !E4 U+0414 afii10021 !E5 U+0415 afii10022 !E6 U+0424 afii10038 !E7 U+0413 afii10020 !E8 U+0425 afii10039 !E9 U+0418 afii10026 !EA U+0419 afii10027 !EB U+041A afii10028 !EC U+041B afii10029 !ED U+041C afii10030 !EE U+041D afii10031 !EF U+041E afii10032 !F0 U+041F afii10033 !F1 U+042F afii10049 !F2 U+0420 afii10034 !F3 U+0421 afii10035 !F4 U+0422 afii10036 !F5 U+0423 afii10037 !F6 U+0416 afii10024 !F7 U+0412 afii10019 !F8 U+042C afii10046 !F9 U+042B afii10045 !FA U+0417 afii10025 !FB U+0428 afii10042 !FC U+042D afii10047 !FD U+0429 afii10043 !FE U+0427 afii10041 !FF U+042A afii10044 loganalyzer-4.1.5/src/classes/html2fpdf/font/makefont/makefont.php000066400000000000000000000243531277740250400252700ustar00rootroot00000000000000Error: encoding not found: '.$enc); $cc2gn=array(); foreach($a as $l) { if($l{0}=='!') { $e=preg_split('/[ \\t]+/',chop($l)); $cc=hexdec(substr($e[0],1)); $gn=$e[2]; $cc2gn[$cc]=$gn; } } for($i=0;$i<=255;$i++) if(!isset($cc2gn[$i])) $cc2gn[$i]='.notdef'; return $cc2gn; } function ReadAFM($file,&$map) { //Read a font metric file $a=file($file); if(empty($a)) die('File not found'); $widths=array(); $fm=array(); $fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent', 'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut', 'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent', 'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent', 'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent', 'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat', 'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb', 'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong'); foreach($a as $l) { $e=explode(' ',chop($l)); if(count($e)<2) continue; $code=$e[0]; $param=$e[1]; if($code=='C') { //Character metrics $cc=(int)$e[1]; $w=$e[4]; $gn=$e[7]; if(substr($gn,-4)=='20AC') $gn='Euro'; if(isset($fix[$gn])) { //Fix incorrect glyph name foreach($map as $c=>$n) if($n==$fix[$gn]) $map[$c]=$gn; } if(empty($map)) { //Symbolic font: use built-in encoding $widths[$cc]=$w; } else { $widths[$gn]=$w; if($gn=='X') $fm['CapXHeight']=$e[13]; } if($gn=='.notdef') $fm['MissingWidth']=$w; } elseif($code=='FontName') $fm['FontName']=$param; elseif($code=='Weight') $fm['Weight']=$param; elseif($code=='ItalicAngle') $fm['ItalicAngle']=(double)$param; elseif($code=='Ascender') $fm['Ascender']=(int)$param; elseif($code=='Descender') $fm['Descender']=(int)$param; elseif($code=='UnderlineThickness') $fm['UnderlineThickness']=(int)$param; elseif($code=='UnderlinePosition') $fm['UnderlinePosition']=(int)$param; elseif($code=='IsFixedPitch') $fm['IsFixedPitch']=($param=='true'); elseif($code=='FontBBox') $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); elseif($code=='CapHeight') $fm['CapHeight']=(int)$param; elseif($code=='StdVW') $fm['StdVW']=(int)$param; } if(!isset($fm['FontName'])) die('FontName not found'); if(!empty($map)) { if(!isset($widths['.notdef'])) $widths['.notdef']=600; if(!isset($widths['Delta']) and isset($widths['increment'])) $widths['Delta']=$widths['increment']; //Order widths according to map for($i=0;$i<=255;$i++) { if(!isset($widths[$map[$i]])) { echo 'Warning: character '.$map[$i].' is missing
'; $widths[$i]=$widths['.notdef']; } else $widths[$i]=$widths[$map[$i]]; } } $fm['Widths']=$widths; return $fm; } function MakeFontDescriptor($fm,$symbolic) { //Ascent $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); $fd="array('Ascent'=>".$asc; //Descent $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); $fd.=",'Descent'=>".$desc; //CapHeight if(isset($fm['CapHeight'])) $ch=$fm['CapHeight']; elseif(isset($fm['CapXHeight'])) $ch=$fm['CapXHeight']; else $ch=$asc; $fd.=",'CapHeight'=>".$ch; //Flags $flags=0; if(isset($fm['IsFixedPitch']) and $fm['IsFixedPitch']) $flags+=1<<0; if($symbolic) $flags+=1<<2; if(!$symbolic) $flags+=1<<5; if(isset($fm['ItalicAngle']) and $fm['ItalicAngle']!=0) $flags+=1<<6; $fd.=",'Flags'=>".$flags; //FontBBox if(isset($fm['FontBBox'])) $fbb=$fm['FontBBox']; else $fbb=array(0,$des-100,1000,$asc+100); $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; //ItalicAngle $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); $fd.=",'ItalicAngle'=>".$ia; //StemV if(isset($fm['StdVW'])) $stemv=$fm['StdVW']; elseif(isset($fm['Weight']) and eregi('(bold|black)',$fm['Weight'])) $stemv=120; else $stemv=70; $fd.=",'StemV'=>".$stemv; //MissingWidth if(isset($fm['MissingWidth'])) $fd.=",'MissingWidth'=>".$fm['MissingWidth']; $fd.=')'; return $fd; } function MakeWidthArray($fm) { //Make character width array $s="array(\n\t"; $cw=$fm['Widths']; for($i=0;$i<=255;$i++) { if(chr($i)=="'") $s.="'\\''"; elseif(chr($i)=="\\") $s.="'\\\\'"; elseif($i>=32 and $i<=126) $s.="'".chr($i)."'"; else $s.="chr($i)"; $s.='=>'.$fm['Widths'][$i]; if($i<255) $s.=','; if(($i+1)%22==0) $s.="\n\t"; } $s.=')'; return $s; } function MakeFontEncoding($map) { //Build differences from reference encoding $ref=ReadMap('cp1252'); $s=''; $last=0; for($i=32;$i<=255;$i++) { if($map[$i]!=$ref[$i]) { if($i!=$last+1) $s.=$i.' '; $last=$i; $s.='/'.$map[$i].' '; } } return chop($s); } function SaveToFile($file,$s,$mode='t') { $f=fopen($file,'w'.$mode); if(!$f) die('Can\'t write to file '.$file); fwrite($f,$s,strlen($s)); fclose($f); } function ReadShort($f) { $a=unpack('n1n',fread($f,2)); return $a['n']; } function ReadLong($f) { $a=unpack('N1N',fread($f,4)); return $a['N']; } function CheckTTF($file) { //Check if font license allows embedding $f=fopen($file,'rb'); if(!$f) die('Error: Can\'t open '.$file); //Extract number of tables fseek($f,4,SEEK_CUR); $nb=ReadShort($f); fseek($f,6,SEEK_CUR); //Seek OS/2 table $found=false; for($i=0;$i<$nb;$i++) { if(fread($f,4)=='OS/2') { $found=true; break; } fseek($f,12,SEEK_CUR); } if(!$found) { fclose($f); return; } fseek($f,4,SEEK_CUR); $offset=ReadLong($f); fseek($f,$offset,SEEK_SET); //Extract fsType flags fseek($f,8,SEEK_CUR); $fsType=ReadShort($f); $rl=($fsType & 0x02)!=0; $pp=($fsType & 0x04)!=0; $e=($fsType & 0x08)!=0; fclose($f); if($rl and !$pp and !$e) echo 'Warning: font license does not allow embedding'; } /******************************************************************************* * $fontfile: path to TTF file (or empty string if not to be embedded) * * $afmfile: path to AFM file * * $enc: font encoding (or empty string for symbolic fonts) * * $patch: optional patch for encoding * * $type : font type if $fontfile is empty * *******************************************************************************/ function MakeFont($fontfile,$afmfile,$enc='cp1252',$patch=array(),$type='TrueType') { //Generate a font definition file set_magic_quotes_runtime(0); if($enc) { $map=ReadMap($enc); foreach($patch as $cc=>$gn) $map[$cc]=$gn; } else $map=array(); if(!file_exists($afmfile)) die('Error: AFM file not found: '.$afmfile); $fm=ReadAFM($afmfile,$map); if($enc) $diff=MakeFontEncoding($map); else $diff=''; $fd=MakeFontDescriptor($fm,empty($map)); //Find font type if($fontfile) { $ext=strtolower(substr($fontfile,-3)); if($ext=='ttf') $type='TrueType'; elseif($ext=='pfb') $type='Type1'; else die('Error: unrecognized font file extension: '.$ext); } else { if($type!='TrueType' and $type!='Type1') die('Error: incorrect font type: '.$type); } //Start generation $s='Error: font file not found: '.$fontfile); if($type=='TrueType') CheckTTF($fontfile); $f=fopen($fontfile,'rb'); if(!$f) die('Error: Can\'t open '.$fontfile); $file=fread($f,filesize($fontfile)); fclose($f); if($type=='Type1') { //Find first two sections and discard third one $pos=strpos($file,'eexec'); if(!$pos) die('Error: font file does not seem to be valid Type1'); $size1=$pos+6; $pos=strpos($file,'00000000'); if(!$pos) die('Error: font file does not seem to be valid Type1'); $size2=$pos-$size1; $file=substr($file,0,$size1+$size2); } if(function_exists('gzcompress')) { $cmp=$basename.'.z'; SaveToFile($cmp,gzcompress($file),'b'); $s.='$file=\''.$cmp."';\n"; echo 'Font file compressed ('.$cmp.')
'; } else { $s.='$file=\''.basename($fontfile)."';\n"; echo 'Notice: font file could not be compressed (gzcompress not available)
'; } if($type=='Type1') { $s.='$size1='.$size1.";\n"; $s.='$size2='.$size2.";\n"; } else $s.='$originalsize='.filesize($fontfile).";\n"; } else { //Not embedded font $s.='$file='."'';\n"; } $s.="?>\n"; SaveToFile($basename.'.php',$s); echo 'Font definition file generated ('.$basename.'.php'.')
'; } ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/symbol.php000066400000000000000000000060161277740250400231610ustar00rootroot00000000000000250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/times.php000066400000000000000000000061221277740250400227730ustar00rootroot00000000000000250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/timesb.php000066400000000000000000000061301277740250400231340ustar00rootroot00000000000000250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/timesbi.php000066400000000000000000000061251277740250400233110ustar00rootroot00000000000000250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/timesi.php000066400000000000000000000061211277740250400231430ustar00rootroot00000000000000250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); ?> loganalyzer-4.1.5/src/classes/html2fpdf/font/zapfdingbats.php000066400000000000000000000057531277740250400243370ustar00rootroot000000000000000,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); ?> loganalyzer-4.1.5/src/classes/html2fpdf/fpdf.php000066400000000000000000002201041277740250400216210ustar00rootroot00000000000000_dochecks(); //Initialization of properties $this->page=0; $this->n=2; $this->buffer=''; $this->pages=array(); $this->OrientationChanges=array(); $this->state=0; $this->fonts=array(); $this->FontFiles=array(); $this->diffs=array(); $this->images=array(); $this->links=array(); $this->InFooter=false; $this->lasth=0; $this->FontFamily=''; $this->FontStyle=''; $this->FontSizePt=12; $this->underline=false; $this->DrawColor='0 G'; $this->FillColor='0 g'; $this->TextColor='0 g'; $this->ColorFlag=false; $this->ws=0; //Standard fonts $this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique', 'helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique', 'times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic', 'symbol'=>'Symbol','zapfdingbats'=>'ZapfDingbats'); //Scale factor if($unit=='pt') $this->k=1; elseif($unit=='mm') $this->k=72/25.4; elseif($unit=='cm') $this->k=72/2.54; elseif($unit=='in') $this->k=72; else $this->Error('Incorrect unit: '.$unit); //Page format if(is_string($format)) { $format=strtolower($format); if($format=='a3') $format=array(841.89,1190.55); elseif($format=='a4') $format=array(595.28,841.89); elseif($format=='a5') $format=array(420.94,595.28); elseif($format=='letter') $format=array(612,792); elseif($format=='legal') $format=array(612,1008); else $this->Error('Unknown page format: '.$format); $this->fwPt=$format[0]; $this->fhPt=$format[1]; } else { $this->fwPt=$format[0]*$this->k; $this->fhPt=$format[1]*$this->k; } $this->fw=$this->fwPt/$this->k; $this->fh=$this->fhPt/$this->k; //Page orientation $orientation=strtolower($orientation); if($orientation=='p' or $orientation=='portrait') { $this->DefOrientation='P'; $this->wPt=$this->fwPt; $this->hPt=$this->fhPt; } elseif($orientation=='l' or $orientation=='landscape') { $this->DefOrientation='L'; $this->wPt=$this->fhPt; $this->hPt=$this->fwPt; } else $this->Error('Incorrect orientation: '.$orientation); $this->CurOrientation=$this->DefOrientation; $this->w=$this->wPt/$this->k; $this->h=$this->hPt/$this->k; //Page margins (1 cm) $margin=28.35/$this->k; $this->SetMargins($margin,$margin); //Interior cell margin (1 mm) $this->cMargin=$margin/10; //Line width (0.2 mm) $this->LineWidth=.567/$this->k; //Automatic page break $this->SetAutoPageBreak(true,2*$margin); //Full width display mode $this->SetDisplayMode('fullwidth'); //Compression $this->SetCompression(true); } public function FPDF($orientation='P',$unit='mm',$format='A4') { self::__construct($orientation,$unit,$format); } function SetMargins($left,$top,$right=-1) { //Set left, top and right margins $this->lMargin=$left; $this->tMargin=$top; if($right==-1) $right=$left; $this->rMargin=$right; } function SetLeftMargin($margin) { //Set left margin $this->lMargin=$margin; if($this->page>0 and $this->x<$margin) $this->x=$margin; } function SetTopMargin($margin) { //Set top margin $this->tMargin=$margin; } function SetRightMargin($margin) { //Set right margin $this->rMargin=$margin; } function SetAutoPageBreak($auto,$margin=0) { //Set auto page break mode and triggering margin $this->AutoPageBreak=$auto; $this->bMargin=$margin; $this->PageBreakTrigger=$this->h-$margin; } function SetDisplayMode($zoom,$layout='continuous') { //Set display mode in viewer if($zoom=='fullpage' or $zoom=='fullwidth' or $zoom=='real' or $zoom=='default' or !is_string($zoom)) $this->ZoomMode=$zoom; else $this->Error('Incorrect zoom display mode: '.$zoom); if($layout=='single' or $layout=='continuous' or $layout=='two' or $layout=='default') $this->LayoutMode=$layout; else $this->Error('Incorrect layout display mode: '.$layout); } function SetCompression($compress) { //Set page compression if(function_exists('gzcompress')) $this->compress=$compress; else $this->compress=false; } function SetTitle($title) { //Title of document $this->title=$title; } function SetSubject($subject) { //Subject of document $this->subject=$subject; } function SetAuthor($author) { //Author of document $this->author=$author; } function SetKeywords($keywords) { //Keywords of document $this->keywords=$keywords; } function SetCreator($creator) { //Creator of document $this->creator=$creator; } function AliasNbPages($alias='{nb}') { //Define an alias for total number of pages $this->AliasNbPages=$alias; } function Error($msg) { //Fatal error die('FPDF error: '.$msg); } function Open() { //Begin document if($this->state==0) $this->_begindoc(); } function Close() { //Terminate document if($this->state==3) return; if($this->page==0) $this->AddPage(); //Page footer $this->InFooter=true; $this->Footer(); $this->InFooter=false; //Close page $this->_endpage(); //Close document $this->_enddoc(); } function AddPage($orientation='') { //Start a new page if($this->state==0) $this->Open(); $family=$this->FontFamily; $style=$this->FontStyle.($this->underline ? 'U' : ''); $size=$this->FontSizePt; $lw=$this->LineWidth; $dc=$this->DrawColor; $fc=$this->FillColor; $tc=$this->TextColor; $cf=$this->ColorFlag; if($this->page>0) { //Page footer $this->InFooter=true; $this->Footer(); $this->InFooter=false; //Close page $this->_endpage(); } //Start new page $this->_beginpage($orientation); //Set line cap style to square $this->_out('2 J'); //Set line width $this->LineWidth=$lw; $this->_out(sprintf('%.2f w',$lw*$this->k)); //Set font if($family) $this->SetFont($family,$style,$size); //Set colors $this->DrawColor=$dc; if($dc!='0 G') $this->_out($dc); $this->FillColor=$fc; if($fc!='0 g') $this->_out($fc); $this->TextColor=$tc; $this->ColorFlag=$cf; //Page header $this->Header(); //Restore line width if($this->LineWidth!=$lw) { $this->LineWidth=$lw; $this->_out(sprintf('%.2f w',$lw*$this->k)); } //Restore font if($family) $this->SetFont($family,$style,$size); //Restore colors if($this->DrawColor!=$dc) { $this->DrawColor=$dc; $this->_out($dc); } if($this->FillColor!=$fc) { $this->FillColor=$fc; $this->_out($fc); } $this->TextColor=$tc; $this->ColorFlag=$cf; } function Header() { //To be implemented in your own inherited class } function Footer() { //To be implemented in your own inherited class } function PageNo() { //Get current page number return $this->page; } function SetDrawColor($r,$g=-1,$b=-1) { //Set color for all stroking operations if(($r==0 and $g==0 and $b==0) or $g==-1) $this->DrawColor=sprintf('%.3f G',$r/255); else $this->DrawColor=sprintf('%.3f %.3f %.3f RG',$r/255,$g/255,$b/255); if($this->page>0) $this->_out($this->DrawColor); } function SetFillColor($r,$g=-1,$b=-1) { //Set color for all filling operations if(($r==0 and $g==0 and $b==0) or $g==-1) $this->FillColor=sprintf('%.3f g',$r/255); else$this->FillColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255); $this->ColorFlag = ($this->FillColor != $this->TextColor); if($this->page>0) $this->_out($this->FillColor); } function SetTextColor($r,$g=-1,$b=-1) { //Set color for text if(($r==0 and $g==0 and $b==0) or $g==-1) $this->TextColor=sprintf('%.3f g',$r/255); else $this->TextColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255); $this->ColorFlag = ($this->FillColor != $this->TextColor); } function GetStringWidth($s) { //Get width of a string in the current font $s=(string)$s; $cw=&$this->CurrentFont['cw']; $w=0; $l=strlen($s); for($i=0;$i<$l;$i++) $w+=$cw[$s{$i}]; return $w*$this->FontSize/1000; } function SetLineWidth($width) { //Set line width $this->LineWidth=$width; if($this->page>0) $this->_out(sprintf('%.2f w',$width*$this->k)); } function Line($x1,$y1,$x2,$y2) { //Draw a line $this->_out(sprintf('%.2f %.2f m %.2f %.2f l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); } function Rect($x,$y,$w,$h,$style='') { //Draw a rectangle if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='B'; else $op='S'; $this->_out(sprintf('%.2f %.2f %.2f %.2f re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); } function AddFont($family,$style='',$file='') { //Add a TrueType or Type1 font $family=strtolower($family); if($family=='arial') $family='helvetica'; $style=strtoupper($style); if($style=='IB') $style='BI'; if(isset($this->fonts[$family.$style])) $this->Error('Font already added: '.$family.' '.$style); if($file=='') $file=str_replace(' ','',$family).strtolower($style).'.php'; if(defined('FPDF_FONTPATH')) $file=FPDF_FONTPATH.$file; include($file); if(!isset($name)) $this->Error('Could not include font definition file'); $i=count($this->fonts)+1; $this->fonts[$family.$style]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file); if($diff) { //Search existing encodings $d=0; $nb=count($this->diffs); for($i=1;$i<=$nb;$i++) if($this->diffs[$i]==$diff) { $d=$i; break; } if($d==0) { $d=$nb+1; $this->diffs[$d]=$diff; } $this->fonts[$family.$style]['diff']=$d; } if($file) { if($type=='TrueType') $this->FontFiles[$file]=array('length1'=>$originalsize); else $this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2); } } function SetFont($family,$style='',$size=0) { //Select a font; size given in points global $fpdf_charwidths; $family=strtolower($family); if($family=='') $family=$this->FontFamily; //EDITEI - now understands: monospace,serif,sans [serif] if($family=='monospace') $family='courier'; if($family=='serif') $family='times'; if($family=='sans') $family='arial'; if($family=='arial') $family='helvetica'; elseif($family=='symbol' or $family=='zapfdingbats') $style=''; $style=strtoupper($style); if(is_int(strpos($style,'U'))) { $this->underline=true; $style=str_replace('U','',$style); } else $this->underline=false; if ($style=='IB') $style='BI'; if ($size==0) $size=$this->FontSizePt; //Test if font is already selected if($this->FontFamily==$family and $this->FontStyle==$style and $this->FontSizePt==$size) return; //Test if used for the first time $fontkey=$family.$style; if(!isset($this->fonts[$fontkey])) { //Check if one of the standard fonts if(isset($this->CoreFonts[$fontkey])) { if(!isset($fpdf_charwidths[$fontkey])) { //Load metric file $file=$family; if($family=='times' or $family=='helvetica') $file.=strtolower($style); $file.='.php'; if(defined('FPDF_FONTPATH')) $file=FPDF_FONTPATH.$file; include($file); if(!isset($fpdf_charwidths[$fontkey])) $this->Error('Could not include font metric file'); } $i=count($this->fonts)+1; $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]); } else $this->Error('Undefined font: '.$family.' '.$style); } //Select it $this->FontFamily=$family; $this->FontStyle=$style; $this->FontSizePt=$size; $this->FontSize=$size/$this->k; $this->CurrentFont=&$this->fonts[$fontkey]; if($this->page>0) $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); } function SetFontSize($size) { //Set font size in points if($this->FontSizePt==$size) return; $this->FontSizePt=$size; $this->FontSize=$size/$this->k; if($this->page>0) $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); } function AddLink() { //Create a new internal link $n=count($this->links)+1; $this->links[$n]=array(0,0); return $n; } function SetLink($link,$y=0,$page=-1) { //Set destination of internal link if($y==-1) $y=$this->y; if($page==-1) $page=$this->page; $this->links[$link]=array($page,$y); } function Link($x,$y,$w,$h,$link) { //Put a link on the page $this->PageLinks[$this->page][]=array($x*$this->k,$this->hPt-$y*$this->k,$w*$this->k,$h*$this->k,$link); } function Text($x,$y,$txt) { //Output a string $s=sprintf('BT %.2f %.2f Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); if($this->underline and $txt!='') $s.=' '.$this->_dounderline($x,$y,$txt); if($this->ColorFlag) $s='q '.$this->TextColor.' '.$s.' Q'; $this->_out($s); } function AcceptPageBreak() { //Accept automatic page break or not return $this->AutoPageBreak; } function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='',$currentx=0) //EDITEI { //Output a cell $k=$this->k; if($this->y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { //Automatic page break $x=$this->x;//Current X position $ws=$this->ws;//Word Spacing if($ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->AddPage($this->CurOrientation); $this->x=$x; if($ws>0) { $this->ws=$ws; $this->_out(sprintf('%.3f Tw',$ws*$k)); } } if($w==0) $w = $this->w-$this->rMargin-$this->x; $s=''; if($fill==1 or $border==1) { if ($fill==1) $op=($border==1) ? 'B' : 'f'; else $op='S'; //$op='S';//DEBUG $s=sprintf('%.2f %.2f %.2f %.2f re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); } if(is_string($border)) { $x=$this->x; $y=$this->y; if(is_int(strpos($border,'L'))) $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); if(is_int(strpos($border,'T'))) $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); if(is_int(strpos($border,'R'))) $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); if(is_int(strpos($border,'B'))) $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); } if($txt!='') { if($align=='R') $dx=$w-$this->cMargin-$this->GetStringWidth($txt); elseif($align=='C') $dx=($w-$this->GetStringWidth($txt))/2; elseif($align=='L' or $align=='J') $dx=$this->cMargin; else $dx = 0; if($this->ColorFlag) $s.='q '.$this->TextColor.' '; $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); //Check whether we are going to outline text or not if($this->outline_on) { $s.=' '.sprintf('%.2f w',$this->LineWidth*$this->k).' '; $s.=" $this->DrawColor "; $s.=" 2 Tr "; } //Superscript and Subscript Y coordinate adjustment $adjusty = 0; if($this->SUB) $adjusty = 1; if($this->SUP) $adjusty = -1; //End of coordinate adjustment $s.=sprintf('BT %.2f %.2f Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-(($this->y+$adjusty)+.5*$h+.3*$this->FontSize))*$k,$txt2); //EDITEI if($this->underline) $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize+$adjusty,$txt2); //Superscript and Subscript Y coordinate adjustment (now for striked-through texts) $adjusty = 1.6; if($this->SUB) $adjusty = 3.05; if($this->SUP) $adjusty = 1.1; //End of coordinate adjustment if($this->strike) //EDITEI $s.=' '.$this->_dounderline($this->x+$dx,$this->y+$adjusty,$txt); if($this->ColorFlag) $s.=' Q'; if($link!='') $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); } if($s) $this->_out($s); $this->lasth=$h; if( strpos($txt,"\n") !== false) $ln=1; //EDITEI - cell now recognizes \n! << comes from
tag if($ln>0) { //Go to next line $this->y += $h; if($ln==1) //EDITEI { //Move to next line if ($currentx != 0) $this->x=$currentx; else $this->x=$this->lMargin; } } else $this->x+=$w; } //EDITEI function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=0,$link='') { //Output text with automatic or explicit line breaks $cw=&$this->CurrentFont['cw']; if($w==0) $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); if($nb>0 and $s[$nb-1]=="\n") $nb--; $b=0; if($border) { if($border==1) { $border='LTRB'; $b='LRT'; $b2='LR'; } else { $b2=''; if(is_int(strpos($border,'L'))) $b2.='L'; if(is_int(strpos($border,'R'))) $b2.='R'; $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2; } } $sep=-1; $i=0; $j=0; $l=0; $ns=0; $nl=1; while($i<$nb) { //Get next character $c=$s{$i}; if($c=="\n") { //Explicit line break if($this->ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); $i++; $sep=-1; $j=$i; $l=0; $ns=0; $nl++; if($border and $nl==2) $b=$b2; continue; } if($c==' ') { $sep=$i; $ls=$l; $ns++; } $l+=$cw[$c]; if($l>$wmax) { //Automatic line break if($sep==-1) { if($i==$j) $i++; if($this->ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); } else { if($align=='J') { $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; $this->_out(sprintf('%.3f Tw',$this->ws*$this->k)); } $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill,$link); $i=$sep+1; } $sep=-1; $j=$i; $l=0; $ns=0; $nl++; if($border and $nl==2) $b=$b2; } else $i++; } //Last chunk if($this->ws>0) { $this->ws=0; $this->_out('0 Tw'); } if($border and is_int(strpos($border,'B'))) $b.='B'; $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); $this->x=$this->lMargin; } function Write($h,$txt,$currentx=0,$link='') //EDITEI { //Output text in flowing mode $cw=&$this->CurrentFont['cw']; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); $sep=-1; $i=0; $j=0; $l=0; $nl=1; while($i<$nb) { //Get next character $c=$s{$i}; if($c=="\n") { //Explicit line break $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); $i++; $sep=-1; $j=$i; $l=0; if($nl==1) { if ($currentx != 0) $this->x=$currentx;//EDITEI else $this->x=$this->lMargin; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; } $nl++; continue; } if($c == ' ') $sep=$i; $l += $cw[$c]; if($l > $wmax) { //Automatic line break if($sep==-1) { if($this->x > $this->lMargin) { //Move to next line if ($currentx != 0) $this->x=$currentx;//EDITEI else $this->x=$this->lMargin; $this->y+=$h; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $i++; $nl++; continue; } if($i==$j) $i++; $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); } else { $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); $i=$sep+1; } $sep=-1; $j=$i; $l=0; if($nl==1) { if ($currentx != 0) $this->x=$currentx;//EDITEI else $this->x=$this->lMargin; $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; } $nl++; } else $i++; } //Last chunk if($i!=$j) $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); } //-------------------------FLOWING BLOCK------------------------------------// //EDITEI some things (added/changed) // //The following functions were originally written by Damon Kohler // //--------------------------------------------------------------------------// function saveFont() { $saved = array(); $saved[ 'family' ] = $this->FontFamily; $saved[ 'style' ] = $this->FontStyle; $saved[ 'sizePt' ] = $this->FontSizePt; $saved[ 'size' ] = $this->FontSize; $saved[ 'curr' ] =& $this->CurrentFont; $saved[ 'color' ] = $this->TextColor; //EDITEI $saved[ 'bgcolor' ] = $this->FillColor; //EDITEI $saved[ 'HREF' ] = $this->HREF; //EDITEI $saved[ 'underline' ] = $this->underline; //EDITEI $saved[ 'strike' ] = $this->strike; //EDITEI $saved[ 'SUP' ] = $this->SUP; //EDITEI $saved[ 'SUB' ] = $this->SUB; //EDITEI $saved[ 'linewidth' ] = $this->LineWidth; //EDITEI $saved[ 'drawcolor' ] = $this->DrawColor; //EDITEI $saved[ 'is_outline' ] = $this->outline_on; //EDITEI return $saved; } function restoreFont( $saved ) { $this->FontFamily = $saved[ 'family' ]; $this->FontStyle = $saved[ 'style' ]; $this->FontSizePt = $saved[ 'sizePt' ]; $this->FontSize = $saved[ 'size' ]; $this->CurrentFont =& $saved[ 'curr' ]; $this->TextColor = $saved[ 'color' ]; //EDITEI $this->FillColor = $saved[ 'bgcolor' ]; //EDITEI $this->ColorFlag = ($this->FillColor != $this->TextColor); //Restore ColorFlag as well $this->HREF = $saved[ 'HREF' ]; //EDITEI $this->underline = $saved[ 'underline' ]; //EDITEI $this->strike = $saved[ 'strike' ]; //EDITEI $this->SUP = $saved[ 'SUP' ]; //EDITEI $this->SUB = $saved[ 'SUB' ]; //EDITEI $this->LineWidth = $saved[ 'linewidth' ]; //EDITEI $this->DrawColor = $saved[ 'drawcolor' ]; //EDITEI $this->outline_on = $saved[ 'is_outline' ]; //EDITEI if( $this->page > 0) $this->_out( sprintf( 'BT /F%d %.2f Tf ET', $this->CurrentFont[ 'i' ], $this->FontSizePt ) ); } function newFlowingBlock( $w, $h, $b = 0, $a = 'J', $f = 0 , $is_table = false ) { // cell width in points if ($is_table) $this->flowingBlockAttr[ 'width' ] = ($w * $this->k); else $this->flowingBlockAttr[ 'width' ] = ($w * $this->k) - (2*$this->cMargin*$this->k); // line height in user units $this->flowingBlockAttr[ 'is_table' ] = $is_table; $this->flowingBlockAttr[ 'height' ] = $h; $this->flowingBlockAttr[ 'lineCount' ] = 0; $this->flowingBlockAttr[ 'border' ] = $b; $this->flowingBlockAttr[ 'align' ] = $a; $this->flowingBlockAttr[ 'fill' ] = $f; $this->flowingBlockAttr[ 'font' ] = array(); $this->flowingBlockAttr[ 'content' ] = array(); $this->flowingBlockAttr[ 'contentWidth' ] = 0; } function finishFlowingBlock($outofblock=false) { if (!$outofblock) $currentx = $this->x; //EDITEI - in order to make the Cell method work better //prints out the last chunk $is_table = $this->flowingBlockAttr[ 'is_table' ]; $maxWidth =& $this->flowingBlockAttr[ 'width' ]; $lineHeight =& $this->flowingBlockAttr[ 'height' ]; $border =& $this->flowingBlockAttr[ 'border' ]; $align =& $this->flowingBlockAttr[ 'align' ]; $fill =& $this->flowingBlockAttr[ 'fill' ]; $content =& $this->flowingBlockAttr[ 'content' ]; $font =& $this->flowingBlockAttr[ 'font' ]; $contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ]; $lineCount =& $this->flowingBlockAttr[ 'lineCount' ]; // set normal spacing $this->_out( sprintf( '%.3f Tw', 0 ) ); $this->ws = 0; // the amount of space taken up so far in user units $usedWidth = 0; // Print out each chunk //EDITEI - Print content according to alignment $empty = $maxWidth - $contentWidth; $empty /= $this->k; $b = ''; //do not use borders $arraysize = count($content); $margins = (2*$this->cMargin); if ($outofblock) { $align = 'C'; $empty = 0; $margins = $this->cMargin; } switch($align) { case 'R': foreach ( $content as $k => $chunk ) { $this->restoreFont( $font[ $k ] ); $stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k ); // determine which borders should be used $b = ''; if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T'; if ( $k == count( $content ) - 1 && is_int( strpos( $border, 'R' ) ) ) $b .= 'R'; if ($k == $arraysize-1 and !$outofblock) $skipln = 1; else $skipln = 0; if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF , $currentx ); //mono-style line elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, $skipln, '', $fill, $this->HREF, $currentx );//last part else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part } break; case 'L': case 'J': foreach ( $content as $k => $chunk ) { $this->restoreFont( $font[ $k ] ); $stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k ); // determine which borders should be used $b = ''; if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T'; if ( $k == 0 && is_int( strpos( $border, 'L' ) ) ) $b .= 'L'; if ($k == $arraysize-1 and !$outofblock) $skipln = 1; else $skipln = 0; if (!$is_table and !$outofblock and !$fill and $align=='L' and $k == 0) {$align='';$margins=0;} //Remove margins in this special (though often) case if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF , $currentx ); //mono-style line elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF );//first part elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, $skipln, '', $fill, $this->HREF, $currentx );//last part else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, $skipln, '', $fill, $this->HREF );//middle part } break; case 'C': foreach ( $content as $k => $chunk ) { $this->restoreFont( $font[ $k ] ); $stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k ); // determine which borders should be used $b = ''; if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T'; if ($k == $arraysize-1 and !$outofblock) $skipln = 1; else $skipln = 0; if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF , $currentx ); //mono-style line elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, $skipln, 'L', $fill, $this->HREF, $currentx );//last part else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part } break; default: break; } } function WriteFlowingBlock( $s , $outofblock = false ) { if (!$outofblock) $currentx = $this->x; //EDITEI - in order to make the Cell method work better $is_table = $this->flowingBlockAttr[ 'is_table' ]; // width of all the content so far in points $contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ]; // cell width in points $maxWidth =& $this->flowingBlockAttr[ 'width' ]; $lineCount =& $this->flowingBlockAttr[ 'lineCount' ]; // line height in user units $lineHeight =& $this->flowingBlockAttr[ 'height' ]; $border =& $this->flowingBlockAttr[ 'border' ]; $align =& $this->flowingBlockAttr[ 'align' ]; $fill =& $this->flowingBlockAttr[ 'fill' ]; $content =& $this->flowingBlockAttr[ 'content' ]; $font =& $this->flowingBlockAttr[ 'font' ]; $font[] = $this->saveFont(); $content[] = ''; $currContent =& $content[ count( $content ) - 1 ]; // where the line should be cutoff if it is to be justified $cutoffWidth = $contentWidth; // for every character in the string for ( $i = 0; $i < strlen( $s ); $i++ ) { // extract the current character $c = $s{$i}; // get the width of the character in points $cw = $this->CurrentFont[ 'cw' ][ $c ] * ( $this->FontSizePt / 1000 ); if ( $c == ' ' ) { $currContent .= ' '; $cutoffWidth = $contentWidth; $contentWidth += $cw; continue; } // try adding another char if ( $contentWidth + $cw > $maxWidth ) { // it won't fit, output what we already have $lineCount++; //Readjust MaxSize in order to use the whole page width if ($outofblock and ($lineCount == 1) ) $maxWidth = $this->pgwidth * $this->k; // contains any content that didn't make it into this print $savedContent = ''; $savedFont = array(); // first, cut off and save any partial words at the end of the string $words = explode( ' ', $currContent ); // if it looks like we didn't finish any words for this chunk if ( count( $words ) == 1 ) { // save and crop off the content currently on the stack $savedContent = array_pop( $content ); $savedFont = array_pop( $font ); // trim any trailing spaces off the last bit of content $currContent =& $content[ count( $content ) - 1 ]; $currContent = rtrim( $currContent ); } else // otherwise, we need to find which bit to cut off { $lastContent = ''; for ( $w = 0; $w < count( $words ) - 1; $w++) $lastContent .= "{$words[ $w ]} "; $savedContent = $words[ count( $words ) - 1 ]; $savedFont = $this->saveFont(); // replace the current content with the cropped version $currContent = rtrim( $lastContent ); } // update $contentWidth and $cutoffWidth since they changed with cropping $contentWidth = 0; foreach ( $content as $k => $chunk ) { // BEGIN FIX BY ANDRE if ( isset($font[ $k ]) ) $this->restoreFont( $font[ $k ] ); // END FIX BY ANDRE $contentWidth += $this->GetStringWidth( $chunk ) * $this->k; } $cutoffWidth = $contentWidth; // if it's justified, we need to find the char spacing if( $align == 'J' ) { // count how many spaces there are in the entire content string $numSpaces = 0; foreach ( $content as $chunk ) $numSpaces += substr_count( $chunk, ' ' ); // if there's more than one space, find word spacing in points if ( $numSpaces > 0 ) $this->ws = ( $maxWidth - $cutoffWidth ) / $numSpaces; else $this->ws = 0; $this->_out( sprintf( '%.3f Tw', $this->ws ) ); } // otherwise, we want normal spacing else $this->_out( sprintf( '%.3f Tw', 0 ) ); //EDITEI - Print content according to alignment if (!isset($numSpaces)) $numSpaces = 0; $contentWidth -= ($this->ws*$numSpaces); $empty = $maxWidth - $contentWidth - 2*($this->ws*$numSpaces); $empty /= $this->k; $b = ''; //do not use borders /*'If' below used in order to fix "first-line of other page with justify on" bug*/ if($this->y+$this->divheight>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { $bak_x=$this->x;//Current X position $ws=$this->ws;//Word Spacing if($ws>0) { $this->ws=0; $this->_out('0 Tw'); } $this->AddPage($this->CurOrientation); $this->x=$bak_x; if($ws>0) { $this->ws=$ws; $this->_out(sprintf('%.3f Tw',$ws)); } } $arraysize = count($content); $margins = (2*$this->cMargin); if ($outofblock) { $align = 'C'; $empty = 0; $margins = $this->cMargin; } switch($align) { case 'R': foreach ( $content as $k => $chunk ) { // BEGIN FIX BY ANDRE if ( isset($font[ $k ]) ) $this->restoreFont( $font[ $k ] ); // END FIX BY ANDRE $stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k ); // determine which borders should be used $b = ''; if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T'; if ( $k == count( $content ) - 1 && is_int( strpos( $border, 'R' ) ) ) $b .= 'R'; if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, 1, $align, $fill, $this->HREF , $currentx ); //mono-style line elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, 1, '', $fill, $this->HREF, $currentx );//last part else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part } break; case 'L': case 'J': foreach ( $content as $k => $chunk ) { // BEGIN FIX BY ANDRE if ( isset($font[ $k ]) ) $this->restoreFont( $font[ $k ] ); // END FIX BY ANDRE $stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k ); // determine which borders should be used $b = ''; if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T'; if ( $k == 0 && is_int( strpos( $border, 'L' ) ) ) $b .= 'L'; if (!$is_table and !$outofblock and !$fill and $align=='L' and $k == 0) { //Remove margins in this special (though often) case $align=''; $margins=0; } if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, 1, $align, $fill, $this->HREF , $currentx ); //mono-style line elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, 0, $align, $fill, $this->HREF );//first part elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, 1, '', $fill, $this->HREF, $currentx );//last part else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part if (!$is_table and !$outofblock and !$fill and $align=='' and $k == 0) { $align = 'L'; $margins = (2*$this->cMargin); } } break; case 'C': foreach ( $content as $k => $chunk ) { // BEGIN FIX BY ANDRE if ( isset($font[ $k ]) ) $this->restoreFont( $font[ $k ] ); // END FIX BY ANDRE $stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k ); // determine which borders should be used $b = ''; if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T'; if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, 1, $align, $fill, $this->HREF , $currentx ); //mono-style line elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, 1, 'L', $fill, $this->HREF, $currentx );//last part else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part } break; default: break; } // move on to the next line, reset variables, tack on saved content and current char $this->restoreFont( $savedFont ); $font = array( $savedFont ); $content = array( $savedContent . $s{ $i } ); $currContent =& $content[ 0 ]; $contentWidth = $this->GetStringWidth( $currContent ) * $this->k; $cutoffWidth = $contentWidth; } // another character will fit, so add it on else { $contentWidth += $cw; $currContent .= $s{ $i }; } } } //----------------------END OF FLOWING BLOCK------------------------------------// //EDITEI //Thanks to Ron Korving for the WordWrap() function function WordWrap(&$text, $maxwidth) { $biggestword=0;//EDITEI $toonarrow=false;//EDITEI $text = trim($text); if ($text==='') return 0; $space = $this->GetStringWidth(' '); $lines = explode("\n", $text); $text = ''; $count = 0; foreach ($lines as $line) { $words = preg_split('/ +/', $line); $width = 0; foreach ($words as $word) { $wordwidth = $this->GetStringWidth($word); //EDITEI //Warn user that maxwidth is insufficient if ($wordwidth > $maxwidth) { if ($wordwidth > $biggestword) $biggestword = $wordwidth; $toonarrow=true;//EDITEI } if ($width + $wordwidth <= $maxwidth) { $width += $wordwidth + $space; $text .= $word.' '; } else { $width = $wordwidth + $space; $text = rtrim($text)."\n".$word.' '; $count++; } } $text = rtrim($text)."\n"; $count++; } $text = rtrim($text); //Return -(wordsize) if word is bigger than maxwidth if ($toonarrow) return -$biggestword; else return $count; } //EDITEI //Thanks to Seb(captainseb@wanadoo.fr) for the _SetTextRendering() and SetTextOutline() functions /** * Set Text Rendering Mode * @param int $mode Set the rendering mode.
  • 0 : Fill text (default)
  • 1 : Stroke
  • 2 : Fill & stroke
* @see SetTextOutline() */ //This function is not being currently used function _SetTextRendering($mode) { if (!(($mode == 0) || ($mode == 1) || ($mode == 2))) $this->Error("Text rendering mode should be 0, 1 or 2 (value : $mode)"); $this->_out($mode.' Tr'); } /** * Set Text Ouline On/Off * @param mixed $width If set to false the text rending mode is set to fill, else it's the width of the outline * @param int $r If g et b are given, red component; if not, indicates the gray level. Value between 0 and 255 * @param int $g Green component (between 0 and 255) * @param int $b Blue component (between 0 and 255) * @see _SetTextRendering() */ function SetTextOutline($width, $r=0, $g=-1, $b=-1) //EDITEI { if ($width == false) //Now resets all values { $this->outline_on = false; $this->SetLineWidth(0.2); $this->SetDrawColor(0); $this->_setTextRendering(0); $this->_out('0 Tr'); } else { $this->SetLineWidth($width); $this->SetDrawColor($r, $g , $b); $this->_out('2 Tr'); //Fixed } } //function Circle() thanks to Olivier PLATHEY //EDITEI function Circle($x,$y,$r,$style='') { $this->Ellipse($x,$y,$r,$r,$style); } //function Ellipse() thanks to Olivier PLATHEY //EDITEI function Ellipse($x,$y,$rx,$ry,$style='D') { if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='B'; else $op='S'; $lx=4/3*(M_SQRT2-1)*$rx; $ly=4/3*(M_SQRT2-1)*$ry; $k=$this->k; $h=$this->h; $this->_out(sprintf('%.2f %.2f m %.2f %.2f %.2f %.2f %.2f %.2f c', ($x+$rx)*$k,($h-$y)*$k, ($x+$rx)*$k,($h-($y-$ly))*$k, ($x+$lx)*$k,($h-($y-$ry))*$k, $x*$k,($h-($y-$ry))*$k)); $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c', ($x-$lx)*$k,($h-($y-$ry))*$k, ($x-$rx)*$k,($h-($y-$ly))*$k, ($x-$rx)*$k,($h-$y)*$k)); $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c', ($x-$rx)*$k,($h-($y+$ly))*$k, ($x-$lx)*$k,($h-($y+$ry))*$k, $x*$k,($h-($y+$ry))*$k)); $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c %s', ($x+$lx)*$k,($h-($y+$ry))*$k, ($x+$rx)*$k,($h-($y+$ly))*$k, ($x+$rx)*$k,($h-$y)*$k, $op)); } function Image($file,$x,$y,$w=0,$h=0,$type='',$link='',$paint=true) { //Put an image on the page if(!isset($this->images[$file])) { //First use of image, get info if($type=='') { $pos=strrpos($file,'.'); if(!$pos) $this->Error('Image file has no extension and no type was specified: '.$file); $type=substr($file,$pos+1); } $type=strtolower($type); $mqr=get_magic_quotes_runtime(); if(version_compare(PHP_VERSION, '5.3.0', '<')) set_magic_quotes_runtime(0); if($type=='jpg' or $type=='jpeg') $info=$this->_parsejpg($file); elseif($type=='png') $info=$this->_parsepng($file); elseif($type=='gif') $info=$this->_parsegif($file); //EDITEI - GIF format included else { //Allow for additional formats $mtd='_parse'.$type; if(!method_exists($this,$mtd)) $this->Error('Unsupported image type: '.$type); $info=$this->$mtd($file); } if(version_compare(PHP_VERSION, '5.3.0', '<')) set_magic_quotes_runtime($mqr); $info['i']=count($this->images)+1; $this->images[$file]=$info; } else $info=$this->images[$file]; //Automatic width and height calculation if needed if($w==0 and $h==0) { //Put image at 72 dpi $w=$info['w']/$this->k; $h=$info['h']/$this->k; } if($w==0) $w=$h*$info['w']/$info['h']; if($h==0) $h=$w*$info['h']/$info['w']; $changedpage = false; //EDITEI //Avoid drawing out of the paper(exceeding width limits). //EDITEI if ( ($x + $w) > $this->fw ) { $x = $this->lMargin; $y += 5; } //Avoid drawing out of the page. //EDITEI if ( ($y + $h) > $this->fh ) { $this->AddPage(); $y = $tMargin + 10; // +10 to avoid drawing too close to border of page $changedpage = true; } $outstring = sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i']); if($paint) //EDITEI { $this->_out($outstring); if($link) $this->Link($x,$y,$w,$h,$link); } //Avoid writing text on top of the image. //EDITEI if ($changedpage) $this->y = $y + $h; else $this->y = $y + $h; //Return width-height array //EDITEI $sizesarray['WIDTH'] = $w; $sizesarray['HEIGHT'] = $h; $sizesarray['X'] = $x; //Position before painting image $sizesarray['Y'] = $y; //Position before painting image $sizesarray['OUTPUT'] = $outstring; return $sizesarray; } //EDITEI - Done after reading a little about PDF reference guide function DottedRect($x=100,$y=150,$w=50,$h=50) { $x *= $this->k ; $y = ($this->h-$y)*$this->k; $w *= $this->k ; $h *= $this->k ;// - h? $herex = $x; $herey = $y; //Make fillcolor == drawcolor $bak_fill = $this->FillColor; $this->FillColor = $this->DrawColor; $this->FillColor = str_replace('RG','rg',$this->FillColor); $this->_out($this->FillColor); while ($herex < ($x + $w)) //draw from upper left to upper right { $this->DrawDot($herex,$herey); $herex += (3*$this->k); } $herex = $x + $w; while ($herey > ($y - $h)) //draw from upper right to lower right { $this->DrawDot($herex,$herey); $herey -= (3*$this->k); } $herey = $y - $h; while ($herex > $x) //draw from lower right to lower left { $this->DrawDot($herex,$herey); $herex -= (3*$this->k); } $herex = $x; while ($herey < $y) //draw from lower left to upper left { $this->DrawDot($herex,$herey); $herey += (3*$this->k); } $herey = $y; $this->FillColor = $bak_fill; $this->_out($this->FillColor); //return fillcolor back to normal } //EDITEI - Done after reading a little about PDF reference guide function DrawDot($x,$y) //center x y { $op = 'B'; // draw Filled Dots //F == fill //S == stroke //B == stroke and fill $r = 0.5 * $this->k; //raio //Start Point $x1 = $x - $r; $y1 = $y; //End Point $x2 = $x + $r; $y2 = $y; //Auxiliar Point $x3 = $x; $y3 = $y + (2*$r);// 2*raio to make a round (not oval) shape //Round join and cap $s="\n".'1 J'."\n"; $s.='1 j'."\n"; //Upper circle $s.=sprintf('%.3f %.3f m'."\n",$x1,$y1); //x y start drawing $s.=sprintf('%.3f %.3f %.3f %.3f %.3f %.3f c'."\n",$x1,$y1,$x3,$y3,$x2,$y2);//Bezier curve //Lower circle $y3 = $y - (2*$r); $s.=sprintf("\n".'%.3f %.3f m'."\n",$x1,$y1); //x y start drawing $s.=sprintf('%.3f %.3f %.3f %.3f %.3f %.3f c'."\n",$x1,$y1,$x3,$y3,$x2,$y2); $s.=$op."\n"; //stroke and fill //Draw in PDF file $this->_out($s); } function SetDash($black=false,$white=false) { if($black and $white) $s=sprintf('[%.3f %.3f] 0 d',$black*$this->k,$white*$this->k); else $s='[] 0 d'; $this->_out($s); } function Bookmark($txt,$level=0,$y=0) { if($y == -1) $y = $this->GetY(); $this->outlines[]=array('t'=>$txt,'l'=>$level,'y'=>$y,'p'=>$this->PageNo()); } function DisplayPreferences($preferences) { $this->DisplayPreferences .= $preferences; } function _putbookmarks() { $nb=count($this->outlines); if($nb==0) return; $lru=array(); $level=0; foreach($this->outlines as $i=>$o) { if($o['l']>0) { $parent=$lru[$o['l']-1]; //Set parent and last pointers $this->outlines[$i]['parent']=$parent; $this->outlines[$parent]['last']=$i; if($o['l']>$level) { //Level increasing: set first pointer $this->outlines[$parent]['first']=$i; } } else $this->outlines[$i]['parent']=$nb; if($o['l']<=$level and $i>0) { //Set prev and next pointers $prev=$lru[$o['l']]; $this->outlines[$prev]['next']=$i; $this->outlines[$i]['prev']=$prev; } $lru[$o['l']]=$i; $level=$o['l']; } //Outline items $n=$this->n+1; foreach($this->outlines as $i=>$o) { $this->_newobj(); $this->_out('<_textstring($o['t'])); $this->_out('/Parent '.($n+$o['parent']).' 0 R'); if(isset($o['prev'])) $this->_out('/Prev '.($n+$o['prev']).' 0 R'); if(isset($o['next'])) $this->_out('/Next '.($n+$o['next']).' 0 R'); if(isset($o['first'])) $this->_out('/First '.($n+$o['first']).' 0 R'); if(isset($o['last'])) $this->_out('/Last '.($n+$o['last']).' 0 R'); $this->_out(sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]',1+2*$o['p'],($this->h-$o['y'])*$this->k)); $this->_out('/Count 0>>'); $this->_out('endobj'); } //Outline root $this->_newobj(); $this->OutlineRoot=$this->n; $this->_out('<_out('/Last '.($n+$lru[0]).' 0 R>>'); $this->_out('endobj'); } function Ln($h='') { //Line feed; default value is last cell height $this->x=$this->lMargin; if(is_string($h)) $this->y+=$this->lasth; else $this->y+=$h; } function GetX() { //Get x position return $this->x; } function SetX($x) { //Set x position if($x >= 0) $this->x=$x; else $this->x = $this->w + $x; } function GetY() { //Get y position return $this->y; } function SetY($y) { //Set y position and reset x $this->x=$this->lMargin; if($y>=0) $this->y=$y; else $this->y=$this->h+$y; } function SetXY($x,$y) { //Set x and y positions $this->SetY($y); $this->SetX($x); } function Output($name='',$dest='') { //Finish document if necessary if($this->state < 3) $this->Close(); //Normalize parameters if(is_bool($dest)) $dest=$dest ? 'D' : 'F'; $dest=strtoupper($dest); if($dest=='') { if($name=='') { $name='doc.pdf'; $dest='I'; } else $dest='F'; } switch($dest) { case 'I': //Send to standard output if(isset($_SERVER['SERVER_NAME'])) { //We send to a browser Header('Content-Type: application/pdf'); if(headers_sent()) $this->Error('Some data has already been output to browser, can\'t send PDF file'); // Header('Content-Length: '.strlen($this->buffer)); Header('Content-disposition: inline; filename='.$name); } echo $this->buffer; break; case 'D': //Download file if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) Header('Content-Type: application/force-download'); else Header('Content-Type: application/octet-stream'); if(headers_sent()) $this->Error('Some data has already been output to browser, can\'t send PDF file'); Header('Content-Length: '.strlen($this->buffer)); Header('Content-disposition: attachment; filename='.$name); echo $this->buffer; break; case 'F': //Save to local file $f=fopen($name,'wb'); if(!$f) $this->Error('Unable to create output file: '.$name); fwrite($f,$this->buffer,strlen($this->buffer)); fclose($f); break; case 'S': //Return as a string return $this->buffer; default: $this->Error('Incorrect output destination: '.$dest); } return ''; } /******************************************************************************* * * * Protected methods * * * *******************************************************************************/ function _dochecks() { //Check for locale-related bug if(1.1==1) $this->Error('Don\'t alter the locale before including class file'); //Check for decimal separator if(sprintf('%.1f',1.0)!='1.0') setlocale(LC_NUMERIC,'C'); } function _begindoc() { //Start document $this->state=1; $this->_out('%PDF-1.3'); } function _putpages() { $nb=$this->page; if(!empty($this->AliasNbPages)) { //Replace number of pages for($n=1;$n<=$nb;$n++) $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); } if($this->DefOrientation=='P') { $wPt=$this->fwPt; $hPt=$this->fhPt; } else { $wPt=$this->fhPt; $hPt=$this->fwPt; } $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; for($n=1;$n<=$nb;$n++) { //Page $this->_newobj(); $this->_out('<_out('/Parent 1 0 R'); if(isset($this->OrientationChanges[$n])) $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$hPt,$wPt)); $this->_out('/Resources 2 0 R'); if(isset($this->PageLinks[$n])) { //Links $annots='/Annots ['; foreach($this->PageLinks[$n] as $pl) { $rect=sprintf('%.2f %.2f %.2f %.2f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); $annots.='<_textstring($pl[4]).'>>>>'; else { $l=$this->links[$pl[4]]; $h=isset($this->OrientationChanges[$l[0]]) ? $wPt : $hPt; $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>',1+2*$l[0],$h-$l[1]*$this->k); } } $this->_out($annots.']'); } $this->_out('/Contents '.($this->n+1).' 0 R>>'); $this->_out('endobj'); //Page content $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; $this->_newobj(); $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); $this->_putstream($p); $this->_out('endobj'); } //Pages root $this->offsets[1]=strlen($this->buffer); $this->_out('1 0 obj'); $this->_out('<_out($kids.']'); $this->_out('/Count '.$nb); $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$wPt,$hPt)); $this->_out('>>'); $this->_out('endobj'); } function _putfonts() { $nf=$this->n; foreach($this->diffs as $diff) { //Encodings $this->_newobj(); $this->_out('<>'); $this->_out('endobj'); } $mqr=get_magic_quotes_runtime(); if(version_compare(PHP_VERSION, '5.3.0', '<')) set_magic_quotes_runtime(0); foreach($this->FontFiles as $file=>$info) { //Font file embedding $this->_newobj(); $this->FontFiles[$file]['n']=$this->n; if(defined('FPDF_FONTPATH')) $file=FPDF_FONTPATH.$file; $size=filesize($file); if(!$size) $this->Error('Font file not found'); $this->_out('<_out('/Filter /FlateDecode'); $this->_out('/Length1 '.$info['length1']); if(isset($info['length2'])) $this->_out('/Length2 '.$info['length2'].' /Length3 0'); $this->_out('>>'); $f=fopen($file,'rb'); $this->_putstream(fread($f,$size)); fclose($f); $this->_out('endobj'); } if(version_compare(PHP_VERSION, '5.3.0', '<')) set_magic_quotes_runtime($mqr); foreach($this->fonts as $k=>$font) { //Font objects $this->fonts[$k]['n']=$this->n+1; $type=$font['type']; $name=$font['name']; if($type=='core') { //Standard font $this->_newobj(); $this->_out('<_out('/BaseFont /'.$name); $this->_out('/Subtype /Type1'); if($name!='Symbol' and $name!='ZapfDingbats') $this->_out('/Encoding /WinAnsiEncoding'); $this->_out('>>'); $this->_out('endobj'); } elseif($type=='Type1' or $type=='TrueType') { //Additional Type1 or TrueType font $this->_newobj(); $this->_out('<_out('/BaseFont /'.$name); $this->_out('/Subtype /'.$type); $this->_out('/FirstChar 32 /LastChar 255'); $this->_out('/Widths '.($this->n+1).' 0 R'); $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); if($font['enc']) { if(isset($font['diff'])) $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); else $this->_out('/Encoding /WinAnsiEncoding'); } $this->_out('>>'); $this->_out('endobj'); //Widths $this->_newobj(); $cw=&$font['cw']; $s='['; for($i=32;$i<=255;$i++) $s.=$cw[chr($i)].' '; $this->_out($s.']'); $this->_out('endobj'); //Descriptor $this->_newobj(); $s='<$v) $s.=' /'.$k.' '.$v; $file=$font['file']; if($file) $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; $this->_out($s.'>>'); $this->_out('endobj'); } else { //Allow for additional types $mtd='_put'.strtolower($type); if(!method_exists($this,$mtd)) $this->Error('Unsupported font type: '.$type); $this->$mtd($font); } } } function _putimages() { $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; reset($this->images); while(list($file,$info)=each($this->images)) { $this->_newobj(); $this->images[$file]['n']=$this->n; $this->_out('<_out('/Subtype /Image'); $this->_out('/Width '.$info['w']); $this->_out('/Height '.$info['h']); if($info['cs']=='Indexed') $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); else { $this->_out('/ColorSpace /'.$info['cs']); if($info['cs']=='DeviceCMYK') $this->_out('/Decode [1 0 1 0 1 0 1 0]'); } $this->_out('/BitsPerComponent '.$info['bpc']); $this->_out('/Filter /'.$info['f']); if(isset($info['parms'])) $this->_out($info['parms']); if(isset($info['trns']) and is_array($info['trns'])) { $trns=''; for($i=0;$i_out('/Mask ['.$trns.']'); } $this->_out('/Length '.strlen($info['data']).'>>'); $this->_putstream($info['data']); unset($this->images[$file]['data']); $this->_out('endobj'); //Palette if($info['cs']=='Indexed') { $this->_newobj(); $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); $this->_putstream($pal); $this->_out('endobj'); } } } function _putresources() { $this->_putfonts(); $this->_putimages(); //Resource dictionary $this->offsets[2]=strlen($this->buffer); $this->_out('2 0 obj'); $this->_out('<_out('/Font <<'); foreach($this->fonts as $font) $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); $this->_out('>>'); if(count($this->images)) { $this->_out('/XObject <<'); foreach($this->images as $image) $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); $this->_out('>>'); } $this->_out('>>'); $this->_out('endobj'); $this->_putbookmarks(); //EDITEI } function _putinfo() { $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); if(!empty($this->title)) $this->_out('/Title '.$this->_textstring($this->title)); if(!empty($this->subject)) $this->_out('/Subject '.$this->_textstring($this->subject)); if(!empty($this->author)) $this->_out('/Author '.$this->_textstring($this->author)); if(!empty($this->keywords)) $this->_out('/Keywords '.$this->_textstring($this->keywords)); if(!empty($this->creator)) $this->_out('/Creator '.$this->_textstring($this->creator)); $this->_out('/CreationDate '.$this->_textstring('D:'.date('YmdHis'))); } function _putcatalog() { $this->_out('/Type /Catalog'); $this->_out('/Pages 1 0 R'); if($this->ZoomMode=='fullpage') $this->_out('/OpenAction [3 0 R /Fit]'); elseif($this->ZoomMode=='fullwidth') $this->_out('/OpenAction [3 0 R /FitH null]'); elseif($this->ZoomMode=='real') $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); elseif(!is_string($this->ZoomMode)) $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); if($this->LayoutMode=='single') $this->_out('/PageLayout /SinglePage'); elseif($this->LayoutMode=='continuous') $this->_out('/PageLayout /OneColumn'); elseif($this->LayoutMode=='two') $this->_out('/PageLayout /TwoColumnLeft'); //EDITEI - added lines below if(count($this->outlines)>0) { $this->_out('/Outlines '.$this->OutlineRoot.' 0 R'); $this->_out('/PageMode /UseOutlines'); } if(is_int(strpos($this->DisplayPreferences,'FullScreen'))) $this->_out('/PageMode /FullScreen'); if($this->DisplayPreferences) { $this->_out('/ViewerPreferences<<'); if(is_int(strpos($this->DisplayPreferences,'HideMenubar'))) $this->_out('/HideMenubar true'); if(is_int(strpos($this->DisplayPreferences,'HideToolbar'))) $this->_out('/HideToolbar true'); if(is_int(strpos($this->DisplayPreferences,'HideWindowUI'))) $this->_out('/HideWindowUI true'); if(is_int(strpos($this->DisplayPreferences,'DisplayDocTitle'))) $this->_out('/DisplayDocTitle true'); if(is_int(strpos($this->DisplayPreferences,'CenterWindow'))) $this->_out('/CenterWindow true'); if(is_int(strpos($this->DisplayPreferences,'FitWindow'))) $this->_out('/FitWindow true'); $this->_out('>>'); } } function _puttrailer() { $this->_out('/Size '.($this->n+1)); $this->_out('/Root '.$this->n.' 0 R'); $this->_out('/Info '.($this->n-1).' 0 R'); } function _enddoc() { $this->_putpages(); $this->_putresources(); //Info $this->_newobj(); $this->_out('<<'); $this->_putinfo(); $this->_out('>>'); $this->_out('endobj'); //Catalog $this->_newobj(); $this->_out('<<'); $this->_putcatalog(); $this->_out('>>'); $this->_out('endobj'); //Cross-ref $o=strlen($this->buffer); $this->_out('xref'); $this->_out('0 '.($this->n+1)); $this->_out('0000000000 65535 f '); for($i=1; $i <= $this->n ; $i++) $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); //Trailer $this->_out('trailer'); $this->_out('<<'); $this->_puttrailer(); $this->_out('>>'); $this->_out('startxref'); $this->_out($o); $this->_out('%%EOF'); $this->state=3; } function _beginpage($orientation) { $this->page++; $this->pages[$this->page]=''; $this->state=2; $this->x=$this->lMargin; $this->y=$this->tMargin; $this->FontFamily=''; //Page orientation if(!$orientation) $orientation=$this->DefOrientation; else { $orientation=strtoupper($orientation{0}); if($orientation!=$this->DefOrientation) $this->OrientationChanges[$this->page]=true; } if($orientation!=$this->CurOrientation) { //Change orientation if($orientation=='P') { $this->wPt=$this->fwPt; $this->hPt=$this->fhPt; $this->w=$this->fw; $this->h=$this->fh; } else { $this->wPt=$this->fhPt; $this->hPt=$this->fwPt; $this->w=$this->fh; $this->h=$this->fw; } $this->PageBreakTrigger=$this->h-$this->bMargin; $this->CurOrientation=$orientation; } } function _endpage() { //End of page contents $this->state=1; } function _newobj() { //Begin a new object $this->n++; $this->offsets[$this->n]=strlen($this->buffer); $this->_out($this->n.' 0 obj'); } function _dounderline($x,$y,$txt) { //Underline text $up=$this->CurrentFont['up']; $ut=$this->CurrentFont['ut']; $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); return sprintf('%.2f %.2f %.2f %.2f re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); } function _parsejpg($file) { //Extract info from a JPEG file $a=GetImageSize($file); if(!$a) $this->Error('Missing or incorrect image file: '.$file); if($a[2]!=2) $this->Error('Not a JPEG file: '.$file); if(!isset($a['channels']) or $a['channels']==3) $colspace='DeviceRGB'; elseif($a['channels']==4) $colspace='DeviceCMYK'; else $colspace='DeviceGray'; $bpc=isset($a['bits']) ? $a['bits'] : 8; //Read whole file $f=fopen($file,'rb'); $data=''; while(!feof($f)) $data.=fread($f,4096); fclose($f); return array('w'=>$a[0],'h'=>$a[1],'cs'=>$colspace,'bpc'=>$bpc,'f'=>'DCTDecode','data'=>$data); } function _parsepng($file) { //Extract info from a PNG file $f=fopen($file,'rb'); //Extract info from a PNG file if(!$f) $this->Error('Can\'t open image file: '.$file); //Check signature if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) $this->Error('Not a PNG file: '.$file); //Read header chunk fread($f,4); if(fread($f,4)!='IHDR') $this->Error('Incorrect PNG file: '.$file); $w=$this->_freadint($f); $h=$this->_freadint($f); $bpc=ord(fread($f,1)); if($bpc>8) $this->Error('16-bit depth not supported: '.$file); $ct=ord(fread($f,1)); if($ct==0) $colspace='DeviceGray'; elseif($ct==2) $colspace='DeviceRGB'; elseif($ct==3) $colspace='Indexed'; else $this->Error('Alpha channel not supported: '.$file); if(ord(fread($f,1))!=0) $this->Error('Unknown compression method: '.$file); if(ord(fread($f,1))!=0) $this->Error('Unknown filter method: '.$file); if(ord(fread($f,1))!=0) $this->Error('Interlacing not supported: '.$file); fread($f,4); $parms='/DecodeParms <>'; //Scan chunks looking for palette, transparency and image data $pal=''; $trns=''; $data=''; do { $n=$this->_freadint($f); $type=fread($f,4); if($type=='PLTE') { //Read palette $pal=fread($f,$n); fread($f,4); } elseif($type=='tRNS') { //Read transparency info $t=fread($f,$n); if($ct==0) $trns=array(ord(substr($t,1,1))); elseif($ct==2) $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); else { $pos=strpos($t,chr(0)); if(is_int($pos)) $trns=array($pos); } fread($f,4); } elseif($type=='IDAT') { //Read image data block $data.=fread($f,$n); fread($f,4); } elseif($type=='IEND') break; else fread($f,$n+4); } while($n); if($colspace=='Indexed' and empty($pal)) $this->Error('Missing palette in '.$file); fclose($f); return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data); } function _parsegif($file) //EDITEI - GIF support is now included { //Function by Jrme Fenal require_once(RELATIVE_PATH.'gif.php'); //GIF class in pure PHP from Yamasoft (http://www.yamasoft.com/php-gif.zip) $h=0; $w=0; $gif=new CGIF(); if (!$gif->loadFile($file, 0)) $this->Error("GIF parser: unable to open file $file"); if($gif->m_img->m_gih->m_bLocalClr) { $nColors = $gif->m_img->m_gih->m_nTableSize; $pal = $gif->m_img->m_gih->m_colorTable->toString(); if($bgColor != -1) { $bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor); } $colspace='Indexed'; } elseif($gif->m_gfh->m_bGlobalClr) { $nColors = $gif->m_gfh->m_nTableSize; $pal = $gif->m_gfh->m_colorTable->toString(); if((isset($bgColor)) and $bgColor != -1) { $bgColor = $gif->m_gfh->m_colorTable->colorIndex($bgColor); } $colspace='Indexed'; } else { $nColors = 0; $bgColor = -1; $colspace='DeviceGray'; $pal=''; } $trns=''; if($gif->m_img->m_bTrans && ($nColors > 0)) { $trns=array($gif->m_img->m_nTrans); } $data=$gif->m_img->m_data; $w=$gif->m_gfh->m_nWidth; $h=$gif->m_gfh->m_nHeight; if($colspace=='Indexed' and empty($pal)) $this->Error('Missing palette in '.$file); if ($this->compress) { $data=gzcompress($data); return array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8, 'f'=>'FlateDecode', 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); } else { return array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); } } function _freadint($f) { //Read a 4-byte integer from file $i=ord(fread($f,1))<<24; $i+=ord(fread($f,1))<<16; $i+=ord(fread($f,1))<<8; $i+=ord(fread($f,1)); return $i; } function _textstring($s) { //Format a text string return '('.$this->_escape($s).')'; } function _escape($s) { //Add \ before \, ( and ) return str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$s))); } function _putstream($s) { $this->_out('stream'); $this->_out($s); $this->_out('endstream'); } function _out($s) { //Add a line to the document if($this->state==2) $this->pages[$this->page] .= $s."\n"; else $this->buffer .= $s."\n"; } }//End of class //Handle special IE contype request if(isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']) and $HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype') { Header('Content-Type: application/pdf'); exit; } } //end of 'if(!class_exists('FPDF'))'' ?> loganalyzer-4.1.5/src/classes/html2fpdf/gif.php000066400000000000000000000651361277740250400214630ustar00rootroot00000000000000 = gif_loadFile(filename, [index]) // = gif_getSize( or filename, &width, &height) // = gif_outputAsPng(, filename, [bgColor]) // = gif_outputAsBmp(, filename, [bgcolor]) // = gif_outputAsJpeg(, filename, [bgcolor]) - Requires cjpeg /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// function gif_loadFile($lpszFileName, $iIndex = 0) { $gif = new CGIF(); if(!$gif->loadFile($lpszFileName, $iIndex)) { return false; } return $gif; } /////////////////////////////////////////////////////////////////////////////////////////////////// function gif_outputAsBmp($gif, $lpszFileName, $bgColor = -1) { if(!isSet($gif) || (@get_class($gif) <> "cgif") || !$gif->loaded() || ($lpszFileName == "")) { return false; } $fd = $gif->getBmp($bgColor); if(strlen($fd) <= 0) { return false; } if(!($fh = @fOpen($lpszFileName, "wb"))) { return false; } @fWrite($fh, $fd, strlen($fd)); @fFlush($fh); @fClose($fh); return true; } /////////////////////////////////////////////////////////////////////////////////////////////////// function gif_outputAsPng($gif, $lpszFileName, $bgColor = -1) { if(!isSet($gif) || (@get_class($gif) <> "cgif") || !$gif->loaded() || ($lpszFileName == "")) { return false; } $fd = $gif->getPng($bgColor); if(strlen($fd) <= 0) { return false; } if(!($fh = @fOpen($lpszFileName, "wb"))) { return false; } @fWrite($fh, $fd, strlen($fd)); @fFlush($fh); @fClose($fh); return true; } /////////////////////////////////////////////////////////////////////////////////////////////////// function gif_outputAsJpeg($gif, $lpszFileName, $bgColor = -1) { if(gif_outputAsBmp($gif, "$lpszFileName.bmp", $gbColor)) { exec("cjpeg $lpszFileName.bmp >$lpszFileName 2>/dev/null"); @unLink("$lpszFileName.bmp"); if(@file_exists($lpszFileName)) { if(@fileSize($lpszFileName) > 0) { return true; } @unLink($lpszFileName); } } return false; } /////////////////////////////////////////////////////////////////////////////////////////////////// function gif_getSize($gif, &$width, &$height) { if(isSet($gif) && (@get_class($gif) == "cgif") && $gif->loaded()) { $width = $gif->width(); $height = $gif->height(); } else if(@file_exists($gif)) { $myGIF = new CGIF(); if(!$myGIF->getSize($gif, $width, $height)) { return false; } } else { return false; } return true; } /////////////////////////////////////////////////////////////////////////////////////////////////// class CGIFLZW { var $MAX_LZW_BITS; var $Fresh, $CodeSize, $SetCodeSize, $MaxCode, $MaxCodeSize, $FirstCode, $OldCode; var $ClearCode, $EndCode, $Next, $Vals, $Stack, $sp, $Buf, $CurBit, $LastBit, $Done, $LastByte; /////////////////////////////////////////////////////////////////////////// // Constructor public function __construct() { $this->MAX_LZW_BITS = 12; unSet($this->Next); unSet($this->Vals); unSet($this->Stack); unSet($this->Buf); $this->Next = range(0, (1 << $this->MAX_LZW_BITS) - 1); $this->Vals = range(0, (1 << $this->MAX_LZW_BITS) - 1); $this->Stack = range(0, (1 << ($this->MAX_LZW_BITS + 1)) - 1); $this->Buf = range(0, 279); } function CGIFLZW() { self::__construct(); } /////////////////////////////////////////////////////////////////////////// function deCompress($data, &$datLen) { $stLen = strlen($data); $datLen = 0; $ret = ""; // INITIALIZATION $this->LZWCommand($data, true); while(($iIndex = $this->LZWCommand($data, false)) >= 0) { $ret .= chr($iIndex); } $datLen = $stLen - strlen($data); if($iIndex != -2) { return false; } return $ret; } /////////////////////////////////////////////////////////////////////////// function LZWCommand(&$data, $bInit) { if($bInit) { $this->SetCodeSize = ord($data{0}); $data = substr($data, 1); $this->CodeSize = $this->SetCodeSize + 1; $this->ClearCode = 1 << $this->SetCodeSize; $this->EndCode = $this->ClearCode + 1; $this->MaxCode = $this->ClearCode + 2; $this->MaxCodeSize = $this->ClearCode << 1; $this->GetCode($data, $bInit); $this->Fresh = 1; for($i = 0; $i < $this->ClearCode; $i++) { $this->Next[$i] = 0; $this->Vals[$i] = $i; } for(; $i < (1 << $this->MAX_LZW_BITS); $i++) { $this->Next[$i] = 0; $this->Vals[$i] = 0; } $this->sp = 0; return 1; } if($this->Fresh) { $this->Fresh = 0; do { $this->FirstCode = $this->GetCode($data, $bInit); $this->OldCode = $this->FirstCode; } while($this->FirstCode == $this->ClearCode); return $this->FirstCode; } if($this->sp > 0) { $this->sp--; return $this->Stack[$this->sp]; } while(($Code = $this->GetCode($data, $bInit)) >= 0) { if($Code == $this->ClearCode) { for($i = 0; $i < $this->ClearCode; $i++) { $this->Next[$i] = 0; $this->Vals[$i] = $i; } for(; $i < (1 << $this->MAX_LZW_BITS); $i++) { $this->Next[$i] = 0; $this->Vals[$i] = 0; } $this->CodeSize = $this->SetCodeSize + 1; $this->MaxCodeSize = $this->ClearCode << 1; $this->MaxCode = $this->ClearCode + 2; $this->sp = 0; $this->FirstCode = $this->GetCode($data, $bInit); $this->OldCode = $this->FirstCode; return $this->FirstCode; } if($Code == $this->EndCode) { return -2; } $InCode = $Code; if($Code >= $this->MaxCode) { $this->Stack[$this->sp] = $this->FirstCode; $this->sp++; $Code = $this->OldCode; } while($Code >= $this->ClearCode) { $this->Stack[$this->sp] = $this->Vals[$Code]; $this->sp++; if($Code == $this->Next[$Code]) // Circular table entry, big GIF Error! return -1; $Code = $this->Next[$Code]; } $this->FirstCode = $this->Vals[$Code]; $this->Stack[$this->sp] = $this->FirstCode; $this->sp++; if(($Code = $this->MaxCode) < (1 << $this->MAX_LZW_BITS)) { $this->Next[$Code] = $this->OldCode; $this->Vals[$Code] = $this->FirstCode; $this->MaxCode++; if(($this->MaxCode >= $this->MaxCodeSize) && ($this->MaxCodeSize < (1 << $this->MAX_LZW_BITS))) { $this->MaxCodeSize *= 2; $this->CodeSize++; } } $this->OldCode = $InCode; if($this->sp > 0) { $this->sp--; return $this->Stack[$this->sp]; } } return $Code; } /////////////////////////////////////////////////////////////////////////// function GetCode(&$data, $bInit) { if($bInit) { $this->CurBit = 0; $this->LastBit = 0; $this->Done = 0; $this->LastByte = 2; return 1; } if(($this->CurBit + $this->CodeSize) >= $this->LastBit) { if($this->Done) { if($this->CurBit >= $this->LastBit) { // Ran off the end of my bits return 0; } return -1; } $this->Buf[0] = $this->Buf[$this->LastByte - 2]; $this->Buf[1] = $this->Buf[$this->LastByte - 1]; $Count = ord($data{0}); $data = substr($data, 1); if($Count) { for($i = 0; $i < $Count; $i++) { $this->Buf[2 + $i] = ord($data{$i}); } $data = substr($data, $Count); } else { $this->Done = 1; } $this->LastByte = 2 + $Count; $this->CurBit = ($this->CurBit - $this->LastBit) + 16; $this->LastBit = (2 + $Count) << 3; } $iRet = 0; for($i = $this->CurBit, $j = 0; $j < $this->CodeSize; $i++, $j++) { $iRet |= (($this->Buf[intval($i / 8)] & (1 << ($i % 8))) != 0) << $j; } $this->CurBit += $this->CodeSize; return $iRet; } } /////////////////////////////////////////////////////////////////////////////////////////////////// class CGIFCOLORTABLE { var $m_nColors; var $m_arColors; /////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR public function __construct() { unSet($this->m_nColors); unSet($this->m_arColors); } function CGIFCOLORTABLE() { self::__construct(); } /////////////////////////////////////////////////////////////////////////// function load($lpData, $num) { $this->m_nColors = 0; $this->m_arColors = array(); for($i = 0; $i < $num; $i++) { $rgb = substr($lpData, $i * 3, 3); if(strlen($rgb) < 3) { return false; } $this->m_arColors[] = (ord($rgb{2}) << 16) + (ord($rgb{1}) << 8) + ord($rgb{0}); $this->m_nColors++; } return true; } /////////////////////////////////////////////////////////////////////////// function toString() { $ret = ""; for($i = 0; $i < $this->m_nColors; $i++) { $ret .= chr(($this->m_arColors[$i] & 0x000000FF)) . // R chr(($this->m_arColors[$i] & 0x0000FF00) >> 8) . // G chr(($this->m_arColors[$i] & 0x00FF0000) >> 16); // B } return $ret; } /////////////////////////////////////////////////////////////////////////// function toRGBQuad() { $ret = ""; for($i = 0; $i < $this->m_nColors; $i++) { $ret .= chr(($this->m_arColors[$i] & 0x00FF0000) >> 16) . // B chr(($this->m_arColors[$i] & 0x0000FF00) >> 8) . // G chr(($this->m_arColors[$i] & 0x000000FF)) . // R "\x00"; } return $ret; } /////////////////////////////////////////////////////////////////////////// function colorIndex($rgb) { $rgb = intval($rgb) & 0xFFFFFF; $r1 = ($rgb & 0x0000FF); $g1 = ($rgb & 0x00FF00) >> 8; $b1 = ($rgb & 0xFF0000) >> 16; $idx = -1; for($i = 0; $i < $this->m_nColors; $i++) { $r2 = ($this->m_arColors[$i] & 0x000000FF); $g2 = ($this->m_arColors[$i] & 0x0000FF00) >> 8; $b2 = ($this->m_arColors[$i] & 0x00FF0000) >> 16; $d = abs($r2 - $r1) + abs($g2 - $g1) + abs($b2 - $b1); if(($idx == -1) || ($d < $dif)) { $idx = $i; $dif = $d; } } return $idx; } } /////////////////////////////////////////////////////////////////////////////////////////////////// class CGIFFILEHEADER { var $m_lpVer; var $m_nWidth; var $m_nHeight; var $m_bGlobalClr; var $m_nColorRes; var $m_bSorted; var $m_nTableSize; var $m_nBgColor; var $m_nPixelRatio; var $m_colorTable; /////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR public function __construct() { unSet($this->m_lpVer); unSet($this->m_nWidth); unSet($this->m_nHeight); unSet($this->m_bGlobalClr); unSet($this->m_nColorRes); unSet($this->m_bSorted); unSet($this->m_nTableSize); unSet($this->m_nBgColor); unSet($this->m_nPixelRatio); unSet($this->m_colorTable); } function CGIFFILEHEADER() { self::__construct(); } /////////////////////////////////////////////////////////////////////////// function load($lpData, &$hdrLen) { $hdrLen = 0; $this->m_lpVer = substr($lpData, 0, 6); if(($this->m_lpVer <> "GIF87a") && ($this->m_lpVer <> "GIF89a")) { return false; } $this->m_nWidth = $this->w2i(substr($lpData, 6, 2)); $this->m_nHeight = $this->w2i(substr($lpData, 8, 2)); if(!$this->m_nWidth || !$this->m_nHeight) { return false; } $b = ord(substr($lpData, 10, 1)); $this->m_bGlobalClr = ($b & 0x80) ? true : false; $this->m_nColorRes = ($b & 0x70) >> 4; $this->m_bSorted = ($b & 0x08) ? true : false; $this->m_nTableSize = 2 << ($b & 0x07); $this->m_nBgColor = ord(substr($lpData, 11, 1)); $this->m_nPixelRatio = ord(substr($lpData, 12, 1)); $hdrLen = 13; if($this->m_bGlobalClr) { $this->m_colorTable = new CGIFCOLORTABLE(); if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) { return false; } $hdrLen += 3 * $this->m_nTableSize; } return true; } /////////////////////////////////////////////////////////////////////////// function w2i($str) { return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8); } } /////////////////////////////////////////////////////////////////////////////////////////////////// class CGIFIMAGEHEADER { var $m_nLeft; var $m_nTop; var $m_nWidth; var $m_nHeight; var $m_bLocalClr; var $m_bInterlace; var $m_bSorted; var $m_nTableSize; var $m_colorTable; /////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR public function __construct() { unSet($this->m_nLeft); unSet($this->m_nTop); unSet($this->m_nWidth); unSet($this->m_nHeight); unSet($this->m_bLocalClr); unSet($this->m_bInterlace); unSet($this->m_bSorted); unSet($this->m_nTableSize); unSet($this->m_colorTable); } function CGIFIMAGEHEADER() { self::__construct(); } /////////////////////////////////////////////////////////////////////////// function load($lpData, &$hdrLen) { $hdrLen = 0; $this->m_nLeft = $this->w2i(substr($lpData, 0, 2)); $this->m_nTop = $this->w2i(substr($lpData, 2, 2)); $this->m_nWidth = $this->w2i(substr($lpData, 4, 2)); $this->m_nHeight = $this->w2i(substr($lpData, 6, 2)); if(!$this->m_nWidth || !$this->m_nHeight) { return false; } $b = ord($lpData{8}); $this->m_bLocalClr = ($b & 0x80) ? true : false; $this->m_bInterlace = ($b & 0x40) ? true : false; $this->m_bSorted = ($b & 0x20) ? true : false; $this->m_nTableSize = 2 << ($b & 0x07); $hdrLen = 9; if($this->m_bLocalClr) { $this->m_colorTable = new CGIFCOLORTABLE(); if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) { return false; } $hdrLen += 3 * $this->m_nTableSize; } return true; } /////////////////////////////////////////////////////////////////////////// function w2i($str) { return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8); } } /////////////////////////////////////////////////////////////////////////////////////////////////// class CGIFIMAGE { var $m_disp; var $m_bUser; var $m_bTrans; var $m_nDelay; var $m_nTrans; var $m_lpComm; var $m_gih; var $m_data; var $m_lzw; /////////////////////////////////////////////////////////////////////////// public function __construct() { unSet($this->m_disp); unSet($this->m_bUser); unSet($this->m_bTrans); unSet($this->m_nDelay); unSet($this->m_nTrans); unSet($this->m_lpComm); unSet($this->m_data); $this->m_gih = new CGIFIMAGEHEADER(); $this->m_lzw = new CGIFLZW(); } function CGIFIMAGE() { self::__construct(); } /////////////////////////////////////////////////////////////////////////// function load($data, &$datLen) { $datLen = 0; while(true) { $b = ord($data{0}); $data = substr($data, 1); $datLen++; switch($b) { case 0x21: // Extension if(!$this->skipExt($data, $len = 0)) { return false; } $datLen += $len; break; case 0x2C: // Image // LOAD HEADER & COLOR TABLE if(!$this->m_gih->load($data, $len = 0)) { return false; } $data = substr($data, $len); $datLen += $len; // ALLOC BUFFER if(!($this->m_data = $this->m_lzw->deCompress($data, $len = 0))) { return false; } $data = substr($data, $len); $datLen += $len; if($this->m_gih->m_bInterlace) { $this->deInterlace(); } return true; case 0x3B: // EOF default: return false; } } return false; } /////////////////////////////////////////////////////////////////////////// function skipExt(&$data, &$extLen) { $extLen = 0; $b = ord($data{0}); $data = substr($data, 1); $extLen++; switch($b) { case 0xF9: // Graphic Control $b = ord($data{1}); $this->m_disp = ($b & 0x1C) >> 2; $this->m_bUser = ($b & 0x02) ? true : false; $this->m_bTrans = ($b & 0x01) ? true : false; $this->m_nDelay = $this->w2i(substr($data, 2, 2)); $this->m_nTrans = ord($data{4}); break; case 0xFE: // Comment $this->m_lpComm = substr($data, 1, ord($data{0})); break; case 0x01: // Plain text break; case 0xFF: // Application break; } // SKIP DEFAULT AS DEFS MAY CHANGE $b = ord($data{0}); $data = substr($data, 1); $extLen++; while($b > 0) { $data = substr($data, $b); $extLen += $b; $b = ord($data{0}); $data = substr($data, 1); $extLen++; } return true; } /////////////////////////////////////////////////////////////////////////// function w2i($str) { return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8); } /////////////////////////////////////////////////////////////////////////// function deInterlace() { $data = $this->m_data; for($i = 0; $i < 4; $i++) { switch($i) { case 0: $s = 8; $y = 0; break; case 1: $s = 8; $y = 4; break; case 2: $s = 4; $y = 2; break; case 3: $s = 2; $y = 1; break; } for(; $y < $this->m_gih->m_nHeight; $y += $s) { $lne = substr($this->m_data, 0, $this->m_gih->m_nWidth); $this->m_data = substr($this->m_data, $this->m_gih->m_nWidth); $data = substr($data, 0, $y * $this->m_gih->m_nWidth) . $lne . substr($data, ($y + 1) * $this->m_gih->m_nWidth); } } $this->m_data = $data; } } /////////////////////////////////////////////////////////////////////////////////////////////////// class CGIF { var $m_gfh; var $m_lpData; var $m_img; var $m_bLoaded; /////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR public function __construct() { $this->m_gfh = new CGIFFILEHEADER(); $this->m_img = new CGIFIMAGE(); $this->m_lpData = ""; $this->m_bLoaded = false; } function CGIF() { self::__construct(); } /////////////////////////////////////////////////////////////////////////// function loadFile($lpszFileName, $iIndex) { if($iIndex < 0) { return false; } // READ FILE if(!($fh = @fOpen($lpszFileName, "rb"))) { return false; } //EDITEI - in order to read remote files (HTTP(s) and FTP protocols) if ( strpos($lpszFileName,"http") !== false or strpos($lpszFileName,"ftp") !== false ) { $contents = ''; while (!feof($fh)) $contents .= @fread($fh, 8192); } else { $contents = @fread($fh,@filesize($lpszFileName) ); } $this->m_lpData = $contents; // $this->m_lpData = @fRead($fh, @fileSize($lpszFileName)); fClose($fh); // GET FILE HEADER if(!$this->m_gfh->load($this->m_lpData, $len = 0)) { return false; } $this->m_lpData = substr($this->m_lpData, $len); do { if(!$this->m_img->load($this->m_lpData, $imgLen = 0)) { return false; } $this->m_lpData = substr($this->m_lpData, $imgLen); } while($iIndex-- > 0); $this->m_bLoaded = true; return true; } /////////////////////////////////////////////////////////////////////////// function getSize($lpszFileName, &$width, &$height) { if(!($fh = @fOpen($lpszFileName, "rb"))) { return false; } $data = @fRead($fh, @fileSize($lpszFileName)); @fClose($fh); $gfh = new CGIFFILEHEADER(); if(!$gfh->load($data, $len = 0)) { return false; } $width = $gfh->m_nWidth; $height = $gfh->m_nHeight; return true; } /////////////////////////////////////////////////////////////////////////// function getBmp($bgColor) { $out = ""; if(!$this->m_bLoaded) { return false; } // PREPARE COLOR TABLE (RGBQUADs) if($this->m_img->m_gih->m_bLocalClr) { $nColors = $this->m_img->m_gih->m_nTableSize; $rgbq = $this->m_img->m_gih->m_colorTable->toRGBQuad(); if($bgColor != -1) { $bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor); } } else if($this->m_gfh->m_bGlobalClr) { $nColors = $this->m_gfh->m_nTableSize; $rgbq = $this->m_gfh->m_colorTable->toRGBQuad(); if($bgColor != -1) { $bgColor = $this->m_gfh->m_colorTable->colorIndex($bgColor); } } else { $nColors = 0; $bgColor = -1; } // PREPARE BITMAP BITS $data = $this->m_img->m_data; $nPxl = ($this->m_gfh->m_nHeight - 1) * $this->m_gfh->m_nWidth; $bmp = ""; $nPad = ($this->m_gfh->m_nWidth % 4) ? 4 - ($this->m_gfh->m_nWidth % 4) : 0; for($y = 0; $y < $this->m_gfh->m_nHeight; $y++) { for($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) { if( ($x >= $this->m_img->m_gih->m_nLeft) && ($y >= $this->m_img->m_gih->m_nTop) && ($x < ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth)) && ($y < ($this->m_img->m_gih->m_nTop + $this->m_img->m_gih->m_nHeight))) { // PART OF IMAGE if($this->m_img->m_bTrans && (ord($data{$nPxl}) == $this->m_img->m_nTrans)) { // TRANSPARENT -> BACKGROUND if($bgColor == -1) { $bmp .= chr($this->m_gfh->m_nBgColor); } else { $bmp .= chr($bgColor); } } else { $bmp .= $data{$nPxl}; } } else { // BACKGROUND if($bgColor == -1) { $bmp .= chr($this->m_gfh->m_nBgColor); } else { $bmp .= chr($bgColor); } } } $nPxl -= $this->m_gfh->m_nWidth << 1; // ADD PADDING for($x = 0; $x < $nPad; $x++) { $bmp .= "\x00"; } } // BITMAPFILEHEADER $out .= "BM"; $out .= $this->dword(14 + 40 + ($nColors << 2) + strlen($bmp)); $out .= "\x00\x00"; $out .= "\x00\x00"; $out .= $this->dword(14 + 40 + ($nColors << 2)); // BITMAPINFOHEADER $out .= $this->dword(40); $out .= $this->dword($this->m_gfh->m_nWidth); $out .= $this->dword($this->m_gfh->m_nHeight); $out .= "\x01\x00"; $out .= "\x08\x00"; $out .= "\x00\x00\x00\x00"; $out .= "\x00\x00\x00\x00"; $out .= "\x12\x0B\x00\x00"; $out .= "\x12\x0B\x00\x00"; $out .= $this->dword($nColors % 256); $out .= "\x00\x00\x00\x00"; // COLOR TABLE if($nColors > 0) { $out .= $rgbq; } // DATA $out .= $bmp; return $out; } /////////////////////////////////////////////////////////////////////////// function getPng($bgColor) { $out = ""; if(!$this->m_bLoaded) { return false; } // PREPARE COLOR TABLE (RGBQUADs) if($this->m_img->m_gih->m_bLocalClr) { $nColors = $this->m_img->m_gih->m_nTableSize; $pal = $this->m_img->m_gih->m_colorTable->toString(); if($bgColor != -1) { $bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor); } } else if($this->m_gfh->m_bGlobalClr) { $nColors = $this->m_gfh->m_nTableSize; $pal = $this->m_gfh->m_colorTable->toString(); if($bgColor != -1) { $bgColor = $this->m_gfh->m_colorTable->colorIndex($bgColor); } } else { $nColors = 0; $bgColor = -1; } // PREPARE BITMAP BITS $data = $this->m_img->m_data; $nPxl = 0; $bmp = ""; for($y = 0; $y < $this->m_gfh->m_nHeight; $y++) { $bmp .= "\x00"; for($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) { if( ($x >= $this->m_img->m_gih->m_nLeft) && ($y >= $this->m_img->m_gih->m_nTop) && ($x < ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth)) && ($y < ($this->m_img->m_gih->m_nTop + $this->m_img->m_gih->m_nHeight))) { // PART OF IMAGE $bmp .= $data{$nPxl}; } else { // BACKGROUND if($bgColor == -1) { $bmp .= chr($this->m_gfh->m_nBgColor); } else { $bmp .= chr($bgColor); } } } } $bmp = gzcompress($bmp, 9); /////////////////////////////////////////////////////////////////////// // SIGNATURE $out .= "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"; /////////////////////////////////////////////////////////////////////// // HEADER $out .= "\x00\x00\x00\x0D"; $tmp = "IHDR"; $tmp .= $this->ndword($this->m_gfh->m_nWidth); $tmp .= $this->ndword($this->m_gfh->m_nHeight); $tmp .= "\x08\x03\x00\x00\x00"; $out .= $tmp; $out .= $this->ndword(crc32($tmp)); /////////////////////////////////////////////////////////////////////// // PALETTE if($nColors > 0) { $out .= $this->ndword($nColors * 3); $tmp = "PLTE"; $tmp .= $pal; $out .= $tmp; $out .= $this->ndword(crc32($tmp)); } /////////////////////////////////////////////////////////////////////// // TRANSPARENCY if($this->m_img->m_bTrans && ($nColors > 0)) { $out .= $this->ndword($nColors); $tmp = "tRNS"; for($i = 0; $i < $nColors; $i++) { $tmp .= ($i == $this->m_img->m_nTrans) ? "\x00" : "\xFF"; } $out .= $tmp; $out .= $this->ndword(crc32($tmp)); } /////////////////////////////////////////////////////////////////////// // DATA BITS $out .= $this->ndword(strlen($bmp)); $tmp = "IDAT"; $tmp .= $bmp; $out .= $tmp; $out .= $this->ndword(crc32($tmp)); /////////////////////////////////////////////////////////////////////// // END OF FILE $out .= "\x00\x00\x00\x00IEND\xAE\x42\x60\x82"; return $out; } /////////////////////////////////////////////////////////////////////////// function dword($val) { $val = intval($val); return chr($val & 0xFF).chr(($val & 0xFF00) >> 8).chr(($val & 0xFF0000) >> 16).chr(($val & 0xFF000000) >> 24); } /////////////////////////////////////////////////////////////////////////// function ndword($val) { $val = intval($val); return chr(($val & 0xFF000000) >> 24).chr(($val & 0xFF0000) >> 16).chr(($val & 0xFF00) >> 8).chr($val & 0xFF); } /////////////////////////////////////////////////////////////////////////// function width() { return $this->m_gfh->m_nWidth; } /////////////////////////////////////////////////////////////////////////// function height() { return $this->m_gfh->m_nHeight; } /////////////////////////////////////////////////////////////////////////// function comment() { return $this->m_img->m_lpComm; } /////////////////////////////////////////////////////////////////////////// function loaded() { return $this->m_bLoaded; } } /////////////////////////////////////////////////////////////////////////////////////////////////// ?> loganalyzer-4.1.5/src/classes/html2fpdf/html2fpdf.php000066400000000000000000003462271277740250400226070ustar00rootroot00000000000000currentfont - mine . $this->CurrentFont - fpdf's TODO (in the future...): - Make font-family, font-size, lineheight customizable - Increase number of HTML/CSS tags/properties, Image/Font Types, recognized/supported - allow BMP support? (tried with http://phpthumb.sourceforge.net/ but failed) - Improve CSS support - support image side-by-side or one-below-another or both? - Improve code clarity even more (modularize and get better var names like on textbuffer array's indexes for example) ////////////////////////////////////////////////////////////////////////////// //////////////DO NOT MODIFY THE CONTENTS OF THIS BOX////////////////////////// ////////////////////////////////////////////////////////////////////////////// // // // HTML2FPDF is a php script to read a HTML text and generate a PDF file. // // Copyright (C) 2004-2005 Renato Coelho // // This script may be distributed as long as the following files are kept // // together: // // // // fpdf.php, html2fpdf.php, gif.php,htmltoolkit.php,license.txt,credits.txt // // // ////////////////////////////////////////////////////////////////////////////// Misc. Observations: - CSS + align = bug! (?) OBS1: para textos de mais de 1 pgina, talvez tenha que juntar varios $texto_artigo antes de mandar gerar o PDF, para que o PDF gerado seja completo. OBS2: there are 2 types of spaces 32 and 160 (ascii values) OBS3: //! is a special comment to be used with source2doc.php, a script I created in order to generate the doc on the site html2fpdf.sf.net OBS4: var $LineWidth; // line width in user unit - use this to make css thin/medium/thick work OBS5: Images and Textareas: when they are inserted you can only type below them (==display:block) OBS6: Optimized to 'A4' paper (default font: Arial , normal , size 11 ) OBS7: Regexp + Perl ([preg]accepts non-greedy quantifiers while PHP[ereg] does not) Perl: '/regexp/x' where x == option ( x = i:ignore case , x = s: DOT gets \n as well) ========================END OF INITIAL COMMENTS================================= */ define('HTML2FPDF_VERSION','3.0(beta)'); if (!defined('RELATIVE_PATH')) define('RELATIVE_PATH',''); if (!defined('FPDF_FONTPATH')) define('FPDF_FONTPATH','font/'); require_once(RELATIVE_PATH.'fpdf.php'); require_once(RELATIVE_PATH.'htmltoolkit.php'); class HTML2FPDF extends FPDF { //internal attributes var $HREF; //! string var $pgwidth; //! float var $fontlist; //! array var $issetfont; //! bool var $issetcolor; //! bool var $titulo; //! string var $oldx; //! float var $oldy; //! float var $B; //! int var $U; //! int var $I; //! int var $tablestart; //! bool var $tdbegin; //! bool var $table; //! array var $cell; //! array var $col; //! int var $row; //! int var $divbegin; //! bool var $divalign; //! char var $divwidth; //! float var $divheight; //! float var $divbgcolor; //! bool var $divcolor; //! bool var $divborder; //! int var $divrevert; //! bool var $listlvl; //! int var $listnum; //! int var $listtype; //! string //array(lvl,# of occurrences) var $listoccur; //! array //array(lvl,occurrence,type,maxnum) var $listlist; //! array //array(lvl,num,content,type) var $listitem; //! array var $buffer_on; //! bool var $pbegin; //! bool var $pjustfinished; //! bool var $blockjustfinished; //! bool var $SUP; //! bool var $SUB; //! bool var $toupper; //! bool var $tolower; //! bool var $dash_on; //! bool var $dotted_on; //! bool var $strike; //! bool var $CSS; //! array var $cssbegin; //! bool var $backupcss; //! array var $textbuffer; //! array var $currentstyle; //! string var $currentfont; //! string var $colorarray; //! array var $bgcolorarray; //! array var $internallink; //! array var $enabledtags; //! string var $lineheight; //! int var $basepath; //! string // array('COLOR','WIDTH','OLDWIDTH') var $outlineparam; //! array var $outline_on; //! bool var $specialcontent; //! string var $selectoption; //! array //options attributes var $usecss; //! bool var $usepre; //! bool var $usetableheader; //! bool var $shownoimg; //! bool // Constructor public function __construct($orientation='P',$unit='mm',$format='A4') { //! @desc Constructor //! @return An object (a class instance) //Call parent constructor $this->FPDF($orientation,$unit,$format); //To make the function Footer() work properly $this->AliasNbPages(); //Enable all tags as default $this->DisableTags(); //Set default display preferences $this->DisplayPreferences(''); //Initialization of the attributes $this->SetFont('Arial','',10); // Changeable?(not yet...) $this->lineheight = 4; // Related to FontSizePt == 11 $this->pgwidth = $this->fw - $this->lMargin - $this->rMargin ; $this->SetFillColor(255); $this->HREF=''; $this->titulo=''; $this->oldx=-1; $this->oldy=-1; $this->B=0; $this->U=0; $this->I=0; $this->listlvl=0; $this->listnum=0; $this->listtype=''; $this->listoccur=array(); $this->listlist=array(); $this->listitem=array(); $this->tablestart=false; $this->tdbegin=false; $this->table=array(); $this->cell=array(); $this->col=-1; $this->row=-1; $this->divbegin=false; $this->divalign="L"; $this->divwidth=0; $this->divheight=0; $this->divbgcolor=false; $this->divcolor=false; $this->divborder=0; $this->divrevert=false; $this->fontlist=array("arial","times","courier","helvetica","symbol","monospace","serif","sans"); $this->issetfont=false; $this->issetcolor=false; $this->pbegin=false; $this->pjustfinished=false; $this->blockjustfinished = true; //in order to eliminate exceeding left-side spaces $this->toupper=false; $this->tolower=false; $this->dash_on=false; $this->dotted_on=false; $this->SUP=false; $this->SUB=false; $this->buffer_on=false; $this->strike=false; $this->currentfont=''; $this->currentstyle=''; $this->colorarray=array(); $this->bgcolorarray=array(); $this->cssbegin=false; $this->textbuffer=array(); $this->CSS=array(); $this->backupcss=array(); $this->internallink=array(); $this->basepath = ""; $this->outlineparam = array(); $this->outline_on = false; $this->specialcontent = ''; $this->selectoption = array(); $this->shownoimg=false; $this->usetableheader=false; $this->usecss=true; $this->usepre=true; } function HTML2FPDF($orientation='P',$unit='mm',$format='A4') { self::__construct($orientation,$unit,$format); } function setBasePath($str) { //! @desc Inform the script where the html file is (full path - e.g. http://www.google.com/dir1/dir2/dir3/file.html ) in order to adjust HREF and SRC links. No-Parameter: The directory where this script is. //! @return void $this->basepath = dirname($str) . "/"; $this->basepath = str_replace("\\","/",$this->basepath); //If on Windows } function ShowNOIMG_GIF($opt=true) { //! @desc Enable/Disable Displaying the no_img.gif when an image is not found. No-Parameter: Enable //! @return void $this->shownoimg=$opt; } function UseCSS($opt=true) { //! @desc Enable/Disable CSS recognition. No-Parameter: Enable //! @return void $this->usecss=$opt; } function UseTableHeader($opt=true) { //! @desc Enable/Disable Table Header to appear every new page. No-Parameter: Enable //! @return void $this->usetableheader=$opt; } function UsePRE($opt=true) { //! @desc Enable/Disable pre tag recognition. No-Parameter: Enable //! @return void $this->usepre=$opt; } //Page header function Header($content='') { //! @return void //! @desc The header is printed in every page. if($this->usetableheader and $content != '') { $y = $this->y; foreach($content as $tableheader) { $this->y = $y; //Set some cell values $x = $tableheader['x']; $w = $tableheader['w']; $h = $tableheader['h']; $va = $tableheader['va']; $mih = $tableheader['mih']; $fill = $tableheader['bgcolor']; $border = $tableheader['border']; $align = $tableheader['a']; //Align $this->divalign=$align; $this->x = $x; //Vertical align if (!isset($va) || $va=='M') $this->y += ($h-$mih)/2; elseif (isset($va) && $va=='B') $this->y += $h-$mih; if ($fill) { $color = ConvertColor($fill); $this->SetFillColor($color['R'],$color['G'],$color['B']); $this->Rect($x, $y, $w, $h, 'F'); } //Border if (isset($border) and $border != 'all') $this->_tableRect($x, $y, $w, $h, $border); elseif (isset($border) && $border == 'all') $this->Rect($x, $y, $w, $h); //Print cell content $this->divwidth = $w-2; $this->divheight = 1.1*$this->lineheight; $textbuffer = $tableheader['textbuffer']; if (!empty($textbuffer)) $this->printbuffer($textbuffer,false,true/*inside a table*/); $textbuffer = array(); } $this->y = $y + $h; //Update y coordinate }//end of 'if usetableheader ...' } //Page footer function Footer() { //! @return void //! @desc The footer is printed in every page! //Position at 1.0 cm from bottom $this->SetY(-10); //Copyright //especial para esta verso $this->SetFont('Arial','B',9); $this->SetTextColor(0); //Arial italic 9 $this->SetFont('Arial','I',9); //Page number $this->Cell(0,10,$this->PageNo().'/{nb}',0,0,'C'); //Return Font to normal $this->SetFont('Arial','',11); } /////////////////// /// HTML parser /// /////////////////// function WriteHTML($html) { //! @desc HTML parser //! @return void /* $e == content */ $this->ReadMetaTags($html); $html = AdjustHTML($html,$this->usepre); //Try to make HTML look more like XHTML if ($this->usecss) $html = $this->ReadCSS($html); //Add new supported tags in the DisableTags function $html=str_replace('enabledtags); //remove all unsupported tags, but the ones inside the 'enabledtags' string //Explode the string in order to parse the HTML code $a=preg_split('/<(.*?)>/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); foreach($a as $i => $e) { if($i%2==0) { //TEXT //Adjust lineheight // $this->lineheight = (5*$this->FontSizePt)/11; //should be inside printbuffer? //Adjust text, if needed if (strpos($e,"&") !== false) //HTML-ENTITIES decoding { if (strpos($e,"#") !== false) $e = value_entity_decode($e); // Decode value entities //Avoid crashing the script on PHP 4.0 $version = phpversion(); $version = str_replace('.','',$version); if ($version >= 430) $e = html_entity_decode($e,ENT_QUOTES,'cp1252'); // changes   and the like by their respective char else $e = lesser_entity_decode($e); } $e = str_replace(chr(160),chr(32),$e); //unify ascii code of spaces (in order to recognize all of them correctly) if (strlen($e) == 0) continue; if ($this->divrevert) $e = strrev($e); if ($this->toupper) $e = strtoupper($e); if ($this->tolower) $e = strtolower($e); //Start of 'if/elseif's if($this->titulo) $this->SetTitle($e); elseif($this->specialcontent) { if ($this->specialcontent == "type=select" and $this->selectoption['ACTIVE'] == true) //SELECT tag (form element) { $stringwidth = $this->GetStringWidth($e); if (!isset($this->selectoption['MAXWIDTH']) or $stringwidth > $this->selectoption['MAXWIDTH']) $this->selectoption['MAXWIDTH'] = $stringwidth; if (!isset($this->selectoption['SELECTED']) or $this->selectoption['SELECTED'] == '') $this->selectoption['SELECTED'] = $e; } else $this->textbuffer[] = array(""/*identifier*/.$this->specialcontent."".$e); } elseif($this->tablestart) { if($this->tdbegin) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e,$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cell[$this->row][$this->col]['text'][] = $e; // BEGIN FIX BY ANDRE if (!isset($this->cell[$this->row][$this->col]['s']) ) $this->cell[$this->row][$this->col]['s'] = 0; // END FIX BY ANDRE $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($e); } //Ignore content between , and a
tag (this content is usually only a bunch of spaces) } elseif($this->pbegin or $this->HREF or $this->divbegin or $this->SUP or $this->SUB or $this->strike or $this->buffer_on) $this->textbuffer[] = array($e,$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); //Accumulate text on buffer else { if ($this->blockjustfinished) $e = ltrim($e); if ($e != '') { $this->Write($this->lineheight,$e); //Write text directly in the PDF if ($this->pjustfinished) $this->pjustfinished = false; } } } else { //Tag if($e{0}=='/') $this->CloseTag(strtoupper(substr($e,1))); else { $regexp = '|=\'(.*?)\'|s'; // eliminate single quotes, if any $e = preg_replace($regexp,"=\"\$1\"",$e); $regexp = '| (\\w+?)=([^\\s>"]+)|si'; // changes anykey=anyvalue to anykey="anyvalue" (only do this when this happens inside tags) $e = preg_replace($regexp," \$1=\"\$2\"",$e); //Fix path values, if needed if ((stristr($e,"href=") !== false) or (stristr($e,"src=") !== false) ) { $regexp = '/ (href|src)="(.*?)"/i'; preg_match($regexp,$e,$auxiliararray); $path = $auxiliararray[2]; $path = str_replace("\\","/",$path); //If on Windows //Get link info and obtain its absolute path $regexp = '|^./|'; $path = preg_replace($regexp,'',$path); if($path{0} != '#') //It is not an Internal Link { if (strpos($path,"../") !== false ) //It is a Relative Link { $backtrackamount = substr_count($path,"../"); $maxbacktrack = substr_count($this->basepath,"/") - 1; $filepath = str_replace("../",'',$path); $path = $this->basepath; //If it is an invalid relative link, then make it go to directory root if ($backtrackamount > $maxbacktrack) $backtrackamount = $maxbacktrack; //Backtrack some directories for( $i = 0 ; $i < $backtrackamount + 1 ; $i++ ) $path = substr( $path, 0 , strrpos($path,"/") ); $path = $path . "/" . $filepath; //Make it an absolute path } elseif( strpos($path,":/") === false) //It is a Local Link { $path = $this->basepath . $path; } //Do nothing if it is an Absolute Link } $regexp = '/ (href|src)="(.*?)"/i'; $e = preg_replace($regexp,' \\1="'.$path.'"',$e); }//END of Fix path values //Extract attributes $contents=array(); preg_match_all('/\\S*=["\'][^"\']*["\']/',$e,$contents); preg_match('/\\S+/',$e,$a2); $tag=strtoupper($a2[0]); $attr=array(); if (!empty($contents)) { foreach($contents[0] as $v) { // FIXED BY ANDRE //if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3)) if(preg_match('/^([^=]*)=["\']?([^"\']*)["\']?$/',$v,$a3)) $attr[strtoupper($a3[1])]=$a3[2]; // FIXED BY ANDRE } } $this->OpenTag($tag,$attr); } } }//end of foreach($a as $i=>$e) //Create Internal Links, if needed if (!empty($this->internallink) ) { foreach($this->internallink as $k=>$v) { if (strpos($k,"#") !== false ) continue; //ignore $ypos = $v['Y']; $pagenum = $v['PAGE']; $sharp = "#"; while (array_key_exists($sharp.$k,$this->internallink)) { $internallink = $this->internallink[$sharp.$k]; $this->SetLink($internallink,$ypos,$pagenum); $sharp .= "#"; } } } } function OpenTag($tag,$attr) { //! @return void // What this gets: < $tag $attr['WIDTH']="90px" > does not get content here $align = array('left'=>'L','center'=>'C','right'=>'R','top'=>'T','middle'=>'M','bottom'=>'B','justify'=>'J'); $this->blockjustfinished=false; //Opening tag switch($tag){ case 'PAGE_BREAK': //custom-tag case 'NEWPAGE': //custom-tag $this->blockjustfinished = true; $this->AddPage(); break; case 'OUTLINE': //custom-tag (CSS2 property - browsers don't support it yet - Jan2005) //Usage: (default: width=normal color=white) //Text //Mix this tag with the tag to get mixed colors on outlined text! $this->buffer_on = true; if (isset($attr['COLOR'])) $this->outlineparam['COLOR'] = ConvertColor($attr['COLOR']); else $this->outlineparam['COLOR'] = array('R'=>255,'G'=>255,'B'=>255); //white $this->outlineparam['OLDWIDTH'] = $this->LineWidth; if (isset($attr['WIDTH'])) { switch(strtoupper($attr['WIDTH'])) { case 'THIN': $this->outlineparam['WIDTH'] = 0.75*$this->LineWidth; break; case 'MEDIUM': $this->outlineparam['WIDTH'] = $this->LineWidth; break; case 'THICK': $this->outlineparam['WIDTH'] = 1.75*$this->LineWidth; break; } } else $this->outlineparam['WIDTH'] = $this->LineWidth; //width == oldwidth break; case 'BDO': if (isset($attr['DIR']) and (strtoupper($attr['DIR']) == 'RTL' )) $this->divrevert = true; break; case 'S': case 'STRIKE': case 'DEL': $this->strike=true; break; case 'SUB': $this->SUB=true; break; case 'SUP': $this->SUP=true; break; case 'CENTER': $this->buffer_on = true; if ($this->tdbegin) $this->cell[$this->row][$this->col]['a'] = $align['center']; else { $this->divalign = $align['center']; if ($this->x != $this->lMargin) $this->Ln($this->lineheight); } break; case 'ADDRESS': $this->buffer_on = true; $this->SetStyle('I',true); if (!$this->tdbegin and $this->x != $this->lMargin) $this->Ln($this->lineheight); break; case 'TABLE': // TABLE-BEGIN if ($this->x != $this->lMargin) $this->Ln($this->lineheight); $this->tablestart = true; $this->table['nc'] = $this->table['nr'] = 0; if (isset($attr['REPEAT_HEADER']) and $attr['REPEAT_HEADER'] == true) $this->UseTableHeader(true); if (isset($attr['WIDTH'])) $this->table['w'] = ConvertSize($attr['WIDTH'],$this->pgwidth); if (isset($attr['HEIGHT'])) $this->table['h'] = ConvertSize($attr['HEIGHT'],$this->pgwidth); if (isset($attr['ALIGN'])) $this->table['a'] = $align[strtolower($attr['ALIGN'])]; if (isset($attr['BORDER'])) $this->table['border'] = $attr['BORDER']; if (isset($attr['BGCOLOR'])) $this->table['bgcolor'][-1] = $attr['BGCOLOR']; break; case 'TR': $this->row++; $this->table['nr']++; $this->col = -1; if (isset($attr['BGCOLOR']))$this->table['bgcolor'][$this->row] = $attr['BGCOLOR']; break; case 'TH': $this->SetStyle('B',true); if (!isset($attr['ALIGN'])) $attr['ALIGN'] = "center"; case 'TD': $this->tdbegin = true; $this->col++; while (isset($this->cell[$this->row][$this->col])) $this->col++; //Update number column if ($this->table['nc'] < $this->col+1) $this->table['nc'] = $this->col+1; $this->cell[$this->row][$this->col] = array(); $this->cell[$this->row][$this->col]['text'] = array(); $this->cell[$this->row][$this->col]['s'] = 3; if (isset($attr['WIDTH'])) $this->cell[$this->row][$this->col]['w'] = ConvertSize($attr['WIDTH'],$this->pgwidth); if (isset($attr['HEIGHT'])) $this->cell[$this->row][$this->col]['h'] = ConvertSize($attr['HEIGHT'],$this->pgwidth); if (isset($attr['ALIGN'])) $this->cell[$this->row][$this->col]['a'] = $align[strtolower($attr['ALIGN'])]; if (isset($attr['VALIGN'])) $this->cell[$this->row][$this->col]['va'] = $align[strtolower($attr['VALIGN'])]; if (isset($attr['BORDER'])) $this->cell[$this->row][$this->col]['border'] = $attr['BORDER']; if (isset($attr['BGCOLOR'])) $this->cell[$this->row][$this->col]['bgcolor'] = $attr['BGCOLOR']; $cs = $rs = 1; if (isset($attr['COLSPAN']) && $attr['COLSPAN']>1) $cs = $this->cell[$this->row][$this->col]['colspan'] = $attr['COLSPAN']; if (isset($attr['ROWSPAN']) && $attr['ROWSPAN']>1) $rs = $this->cell[$this->row][$this->col]['rowspan'] = $attr['ROWSPAN']; //Chiem dung vi tri de danh cho cell span (mais hein?) for ($k=$this->row ; $k < $this->row+$rs ;$k++) for($l=$this->col; $l < $this->col+$cs ;$l++) { if ($k-$this->row || $l-$this->col) $this->cell[$k][$l] = 0; } if (isset($attr['NOWRAP'])) $this->cell[$this->row][$this->col]['nowrap']= 1; break; case 'OL': if ( !isset($attr['TYPE']) or $attr['TYPE'] == '' ) $this->listtype = '1'; //OL default == '1' else $this->listtype = $attr['TYPE']; // ol and ul types are mixed here case 'UL': if ( (!isset($attr['TYPE']) or $attr['TYPE'] == '') and $tag=='UL') { //Insert UL defaults if ($this->listlvl == 0) $this->listtype = 'disc'; elseif ($this->listlvl == 1) $this->listtype = 'circle'; else $this->listtype = 'square'; } elseif (isset($attr['TYPE']) and $tag=='UL') $this->listtype = $attr['TYPE']; $this->buffer_on = false; if ($this->listlvl == 0) { //First of all, skip a line if (!$this->pjustfinished) { if ($this->x != $this->lMargin) $this->Ln($this->lineheight); $this->Ln($this->lineheight); } $this->oldx = $this->x; $this->listlvl++; // first depth level $this->listnum = 0; // reset $this->listoccur[$this->listlvl] = 1; $this->listlist[$this->listlvl][1] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); } else { if (!empty($this->textbuffer)) { $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl]); $this->listnum++; } $this->textbuffer = array(); $occur = $this->listoccur[$this->listlvl]; $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum $this->listlvl++; $this->listnum = 0; // reset if ($this->listoccur[$this->listlvl] == 0) $this->listoccur[$this->listlvl] = 1; else $this->listoccur[$this->listlvl]++; $occur = $this->listoccur[$this->listlvl]; $this->listlist[$this->listlvl][$occur] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); } break; case 'LI': //Observation: is ignored if ($this->listlvl == 0) //in case of malformed HTML code. Example:(...)

  • Content
  • Paragraph1

    (...) { //First of all, skip a line if (!$this->pjustfinished and $this->x != $this->lMargin) $this->Ln(2*$this->lineheight); $this->oldx = $this->x; $this->listlvl++; // first depth level $this->listnum = 0; // reset $this->listoccur[$this->listlvl] = 1; $this->listlist[$this->listlvl][1] = array('TYPE'=>'disc','MAXNUM'=>$this->listnum); } if ($this->listnum == 0) { $this->buffer_on = true; //activate list 'bufferization' $this->listnum++; $this->textbuffer = array(); } else { $this->buffer_on = true; //activate list 'bufferization' if (!empty($this->textbuffer)) { $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl]); $this->listnum++; } $this->textbuffer = array(); } break; case 'H1': // 2 * fontsize case 'H2': // 1.5 * fontsize case 'H3': // 1.17 * fontsize case 'H4': // 1 * fontsize case 'H5': // 0.83 * fontsize case 'H6': // 0.67 * fontsize //Values obtained from: http://www.w3.org/TR/REC-CSS2/sample.html if(isset($attr['ALIGN'])) $this->divalign = $align[strtolower($attr['ALIGN'])]; $this->buffer_on = true; if ($this->x != $this->lMargin) $this->Ln(2*$this->lineheight); elseif (!$this->pjustfinished) $this->Ln($this->lineheight); $this->SetStyle('B',true); switch($tag) { case 'H1': $this->SetFontSize(2*$this->FontSizePt); $this->lineheight *= 2; break; case 'H2': $this->SetFontSize(1.5*$this->FontSizePt); $this->lineheight *= 1.5; break; case 'H3': $this->SetFontSize(1.17*$this->FontSizePt); $this->lineheight *= 1.17; break; case 'H4': $this->SetFontSize($this->FontSizePt); break; case 'H5': $this->SetFontSize(0.83*$this->FontSizePt); $this->lineheight *= 0.83; break; case 'H6': $this->SetFontSize(0.67*$this->FontSizePt); $this->lineheight *= 0.67; break; } break; case 'HR': //Default values: width=100% align=center color=gray //Skip a line, if needed if ($this->x != $this->lMargin) $this->Ln($this->lineheight); $this->Ln(0.2*$this->lineheight); $hrwidth = $this->pgwidth; $hralign = 'C'; $hrcolor = array('R'=>200,'G'=>200,'B'=>200); if($attr['WIDTH'] != '') $hrwidth = ConvertSize($attr['WIDTH'],$this->pgwidth); if($attr['ALIGN'] != '') $hralign = $align[strtolower($attr['ALIGN'])]; if($attr['COLOR'] != '') $hrcolor = ConvertColor($attr['COLOR']); $this->SetDrawColor($hrcolor['R'],$hrcolor['G'],$hrcolor['B']); $x = $this->x; $y = $this->y; switch($hralign) { case 'L': case 'J': break; case 'C': $empty = $this->pgwidth - $hrwidth; $empty /= 2; $x += $empty; break; case 'R': $empty = $this->pgwidth - $hrwidth; $x += $empty; break; } $oldlinewidth = $this->LineWidth; $this->SetLineWidth(0.3); $this->Line($x,$y,$x+$hrwidth,$y); $this->SetLineWidth($oldlinewidth); $this->Ln(0.2*$this->lineheight); $this->SetDrawColor(0); $this->blockjustfinished = true; //Eliminate exceeding left-side spaces break; case 'INS': $this->SetStyle('U',true); break; case 'SMALL': $newsize = $this->FontSizePt - 1; $this->SetFontSize($newsize); break; case 'BIG': $newsize = $this->FontSizePt + 1; $this->SetFontSize($newsize); case 'STRONG': $this->SetStyle('B',true); break; case 'CITE': case 'EM': $this->SetStyle('I',true); break; case 'TITLE': $this->titulo = true; break; case 'B': case 'I': case 'U': if( isset($attr['CLASS']) or isset($attr['ID']) or isset($attr['STYLE']) ) { $this->cssbegin=true; if (isset($attr['CLASS'])) $properties = $this->CSS[$attr['CLASS']]; elseif (isset($attr['ID'])) $properties = $this->CSS[$attr['ID']]; //Read Inline CSS if (isset($attr['STYLE'])) $properties = $this->readInlineCSS($attr['STYLE']); //Look for name in the $this->CSS array $this->backupcss = $properties; if (!empty($properties)) $this->setCSS($properties); //name found in the CSS array! } $this->SetStyle($tag,true); break; case 'A': if (isset($attr['NAME']) and $attr['NAME'] != '') $this->textbuffer[] = array('','','',array(),'',false,false,$attr['NAME']); //an internal link (adds a space for recognition) if (isset($attr['HREF'])) $this->HREF=$attr['HREF']; break; case 'DIV': //in case of malformed HTML code. Example:(...)
  • Content
  • DIV1
    (...) if ($this->listlvl > 0) // We are closing (omitted) OL/UL tag(s) { $this->buffer_on = false; if (!empty($this->textbuffer)) $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl]); $this->textbuffer = array(); $this->listlvl--; $this->printlistbuffer(); $this->pjustfinished = true; //act as if a paragraph just ended } $this->divbegin=true; if ($this->x != $this->lMargin) $this->Ln($this->lineheight); if( isset($attr['ALIGN']) and $attr['ALIGN'] != '' ) $this->divalign = $align[strtolower($attr['ALIGN'])]; if( isset($attr['CLASS']) or isset($attr['ID']) or isset($attr['STYLE']) ) { $this->cssbegin=true; if (isset($attr['CLASS'])) $properties = $this->CSS[$attr['CLASS']]; elseif (isset($attr['ID'])) $properties = $this->CSS[$attr['ID']]; //Read Inline CSS if (isset($attr['STYLE'])) $properties = $this->readInlineCSS($attr['STYLE']); //Look for name in the $this->CSS array if (!empty($properties)) $this->setCSS($properties); //name found in the CSS array! } break; case 'IMG': if(!empty($this->textbuffer) and !$this->tablestart) { //Output previously buffered content and output image below //Set some default values $olddivwidth = $this->divwidth; $olddivheight = $this->divheight; if ( $this->divwidth == 0) $this->divwidth = $this->pgwidth - $x + $this->lMargin; if ( $this->divheight == 0) $this->divheight = $this->lineheight; //Print content $this->printbuffer($this->textbuffer,true/*is out of a block (e.g. DIV,P etc.)*/); $this->textbuffer=array(); //Reset values $this->divwidth = $olddivwidth; $this->divheight = $olddivheight; $this->textbuffer=array(); $this->Ln($this->lineheight); } if(isset($attr['SRC'])) { $srcpath = $attr['SRC']; if(!isset($attr['WIDTH'])) $attr['WIDTH'] = 0; else $attr['WIDTH'] = ConvertSize($attr['WIDTH'],$this->pgwidth);//$attr['WIDTH'] /= 4; if(!isset($attr['HEIGHT'])) $attr['HEIGHT'] = 0; else $attr['HEIGHT'] = ConvertSize($attr['HEIGHT'],$this->pgwidth);//$attr['HEIGHT'] /= 4; if ($this->tdbegin) { $bak_x = $this->x; $bak_y = $this->y; //Check whether image exists locally or on the URL $f_exists = @fopen($srcpath,"rb"); if (!$f_exists) //Show 'image not found' icon instead { if(!$this->shownoimg) break; $srcpath = str_replace("\\","/",dirname(__FILE__)) . "/"; $srcpath .= 'no_img.gif'; } $sizesarray = $this->Image($srcpath, $this->GetX(), $this->GetY(), $attr['WIDTH'], $attr['HEIGHT'],'','',false); $this->y = $bak_y; $this->x = $bak_x; } elseif($this->pbegin or $this->divbegin) { //In order to support
    $ypos = 0; $bak_x = $this->x; $bak_y = $this->y; //Check whether image exists locally or on the URL $f_exists = @fopen($srcpath,"rb"); if (!$f_exists) //Show 'image not found' icon instead { if(!$this->shownoimg) break; $srcpath = str_replace("\\","/",dirname(__FILE__)) . "/"; $srcpath .= 'no_img.gif'; } $sizesarray = $this->Image($srcpath, $this->GetX(), $this->GetY(), $attr['WIDTH'], $attr['HEIGHT'],'','',false); $this->y = $bak_y; $this->x = $bak_x; $xpos = ''; switch($this->divalign) { case "C": $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $empty = ($this->pgwidth - $sizesarray['WIDTH'])/2; $xpos = 'xpos='.$empty.','; break; case "R": $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $empty = ($this->pgwidth - $sizesarray['WIDTH']); $xpos = 'xpos='.$empty.','; break; default: break; } $numberoflines = (integer)ceil($sizesarray['HEIGHT']/$this->lineheight) ; $ypos = $numberoflines * $this->lineheight; $this->textbuffer[] = array(""/*identifier*/."type=image,ypos=$ypos,{$xpos}width=".$sizesarray['WIDTH'].",height=".$sizesarray['HEIGHT']."".$sizesarray['OUTPUT']); while($numberoflines) {$this->textbuffer[] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray);$numberoflines--;} } else { $imgborder = 0; if (isset($attr['BORDER'])) $imgborder = ConvertSize($attr['BORDER'],$this->pgwidth); //Check whether image exists locally or on the URL $f_exists = @fopen($srcpath,"rb"); if (!$f_exists) //Show 'image not found' icon instead { $srcpath = str_replace("\\","/",dirname(__FILE__)) . "/"; $srcpath .= 'no_img.gif'; } $sizesarray = $this->Image($srcpath, $this->GetX(), $this->GetY(), $attr['WIDTH'], $attr['HEIGHT'],'',$this->HREF); //Output Image $ini_x = $sizesarray['X']; $ini_y = $sizesarray['Y']; if ($imgborder) { $oldlinewidth = $this->LineWidth; $this->SetLineWidth($imgborder); $this->Rect($ini_x,$ini_y,$sizesarray['WIDTH'],$sizesarray['HEIGHT']); $this->SetLineWidth($oldlinewidth); } } if ($sizesarray['X'] < $this->x) $this->x = $this->lMargin; if ($this->tablestart) { $this->cell[$this->row][$this->col]['textbuffer'][] = array(""/*identifier*/."type=image,width=".$sizesarray['WIDTH'].",height=".$sizesarray['HEIGHT']."".$sizesarray['OUTPUT']); $this->cell[$this->row][$this->col]['s'] += $sizesarray['WIDTH'] + 1;// +1 == margin $this->cell[$this->row][$this->col]['form'] = true; // in order to make some width adjustments later if (!isset($this->cell[$this->row][$this->col]['w'])) $this->cell[$this->row][$this->col]['w'] = $sizesarray['WIDTH'] + 3; if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = $sizesarray['HEIGHT'] + 3; } } break; case 'BLOCKQUOTE': case 'BR': if($this->tablestart) { $this->cell[$this->row][$this->col]['textbuffer'][] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cell[$this->row][$this->col]['text'][] = "\n"; if (!isset($this->cell[$this->row][$this->col]['maxs'])) $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s'] +2; //+2 == margin elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']+2;//+2 == margin $this->cell[$this->row][$this->col]['s'] = 0;// reset } elseif($this->divbegin or $this->pbegin or $this->buffer_on) $this->textbuffer[] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); else {$this->Ln($this->lineheight);$this->blockjustfinished = true;} break; case 'P': //in case of malformed HTML code. Example:(...)

  • Content
  • Paragraph1

    (...) if ($this->listlvl > 0) // We are closing (omitted) OL/UL tag(s) { $this->buffer_on = false; if (!empty($this->textbuffer)) $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl]); $this->textbuffer = array(); $this->listlvl--; $this->printlistbuffer(); $this->pjustfinished = true; //act as if a paragraph just ended } if ($this->tablestart) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e,$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cell[$this->row][$this->col]['text'][] = "\n"; break; } $this->pbegin=true; if ($this->x != $this->lMargin) $this->Ln(2*$this->lineheight); elseif (!$this->pjustfinished) $this->Ln($this->lineheight); //Save x,y coords in case we need to print borders... $this->oldx = $this->x; $this->oldy = $this->y; if(isset($attr['ALIGN'])) $this->divalign = $align[strtolower($attr['ALIGN'])]; if(isset($attr['CLASS']) or isset($attr['ID']) or isset($attr['STYLE']) ) { $this->cssbegin=true; if (isset($attr['CLASS'])) $properties = $this->CSS[$attr['CLASS']]; elseif (isset($attr['ID'])) $properties = $this->CSS[$attr['ID']]; //Read Inline CSS if (isset($attr['STYLE'])) $properties = $this->readInlineCSS($attr['STYLE']); //Look for name in the $this->CSS array $this->backupcss = $properties; if (!empty($properties)) $this->setCSS($properties); //name(id/class/style) found in the CSS array! } break; case 'SPAN': $this->buffer_on = true; //Save x,y coords in case we need to print borders... $this->oldx = $this->x; $this->oldy = $this->y; if( isset($attr['CLASS']) or isset($attr['ID']) or isset($attr['STYLE']) ) { $this->cssbegin=true; if (isset($attr['CLASS'])) $properties = $this->CSS[$attr['CLASS']]; elseif (isset($attr['ID'])) $properties = $this->CSS[$attr['ID']]; //Read Inline CSS if (isset($attr['STYLE'])) $properties = $this->readInlineCSS($attr['STYLE']); //Look for name in the $this->CSS array $this->backupcss = $properties; if (!empty($properties)) $this->setCSS($properties); //name found in the CSS array! } break; case 'PRE': if($this->tablestart) { $this->cell[$this->row][$this->col]['textbuffer'][] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cell[$this->row][$this->col]['text'][] = "\n"; } elseif($this->divbegin or $this->pbegin or $this->buffer_on) $this->textbuffer[] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); else { if ($this->x != $this->lMargin) $this->Ln(2*$this->lineheight); elseif (!$this->pjustfinished) $this->Ln($this->lineheight); $this->buffer_on = true; //Save x,y coords in case we need to print borders... $this->oldx = $this->x; $this->oldy = $this->y; if(isset($attr['ALIGN'])) $this->divalign = $align[strtolower($attr['ALIGN'])]; if(isset($attr['CLASS']) or isset($attr['ID']) or isset($attr['STYLE']) ) { $this->cssbegin=true; if (isset($attr['CLASS'])) $properties = $this->CSS[$attr['CLASS']]; elseif (isset($attr['ID'])) $properties = $this->CSS[$attr['ID']]; //Read Inline CSS if (isset($attr['STYLE'])) $properties = $this->readInlineCSS($attr['STYLE']); //Look for name in the $this->CSS array $this->backupcss = $properties; if (!empty($properties)) $this->setCSS($properties); //name(id/class/style) found in the CSS array! } } case 'TT': case 'KBD': case 'SAMP': case 'CODE': $this->SetFont('courier'); $this->currentfont='courier'; break; case 'TEXTAREA': $this->buffer_on = true; $colsize = 20; //HTML default value $rowsize = 2; //HTML default value if (isset($attr['COLS'])) $colsize = $attr['COLS']; if (isset($attr['ROWS'])) $rowsize = $attr['ROWS']; if (!$this->tablestart) { if ($this->x != $this->lMargin) $this->Ln($this->lineheight); $this->col = $colsize; $this->row = $rowsize; } else //it is inside a table { $this->specialcontent = "type=textarea,lines=$rowsize,width=".((2.2*$colsize) + 3); //Activate form info in order to paint FORM elements within table $this->cell[$this->row][$this->col]['s'] += (2.2*$colsize) + 6;// +6 == margin if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = 1.1*$this->lineheight*$rowsize + 2.5; } break; case 'SELECT': $this->specialcontent = "type=select"; //Activate form info in order to paint FORM elements within table break; case 'OPTION': $this->selectoption['ACTIVE'] = true; if (empty($this->selectoption)) { $this->selectoption['MAXWIDTH'] = ''; $this->selectoption['SELECTED'] = ''; } if (isset($attr['SELECTED'])) $this->selectoption['SELECTED'] = ''; break; case 'FORM': if($this->tablestart) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e,$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cell[$this->row][$this->col]['text'][] = "\n"; } elseif ($this->x != $this->lMargin) $this->Ln($this->lineheight); //Skip a line, if needed break; case 'INPUT': if (!isset($attr['TYPE'])) $attr['TYPE'] == ''; //in order to allow default 'TEXT' form (in case of malformed HTML code) if (!$this->tablestart) { switch(strtoupper($attr['TYPE'])){ case 'CHECKBOX': //Draw Checkbox $checked = false; if (isset($attr['CHECKED'])) $checked = true; $this->SetFillColor(235,235,235); $this->x += 3; $this->Rect($this->x,$this->y+1,3,3,'DF'); if ($checked) { $this->Line($this->x,$this->y+1,$this->x+3,$this->y+1+3); $this->Line($this->x,$this->y+1+3,$this->x+3,$this->y+1); } $this->SetFillColor(255); $this->x += 3.5; break; case 'RADIO': //Draw Radio button $checked = false; if (isset($attr['CHECKED'])) $checked = true; $this->x += 4; $this->Circle($this->x,$this->y+2.2,1,'D'); $this->_out('0.000 g'); if ($checked) $this->Circle($this->x,$this->y+2.2,0.4,'DF'); $this->Write(5,$texto,$this->x); $this->x += 2; break; case 'BUTTON': // Draw a button case 'SUBMIT': case 'RESET': $texto=''; if (isset($attr['VALUE'])) $texto = $attr['VALUE']; $nihil = 2.5; $this->x += 2; $this->SetFillColor(190,190,190); $this->Rect($this->x,$this->y,$this->GetStringWidth($texto)+2*$nihil,4.5,'DF'); // 4.5 in order to avoid overlapping $this->x += $nihil; $this->Write(5,$texto,$this->x); $this->x += $nihil; $this->SetFillColor(255); break; case 'PASSWORD': if (isset($attr['VALUE'])) { $num_stars = strlen($attr['VALUE']); $attr['VALUE'] = str_repeat('*',$num_stars); } case 'TEXT': //Draw TextField default: //default == TEXT $texto=''; if (isset($attr['VALUE'])) $texto = $attr['VALUE']; $tamanho = 20; if (isset($attr['SIZE']) and ctype_digit($attr['SIZE']) ) $tamanho = $attr['SIZE']; $this->SetFillColor(235,235,235); $this->x += 2; $this->Rect($this->x,$this->y,2*$tamanho,4.5,'DF');// 4.5 in order to avoid overlapping if ($texto != '') { $this->x += 1; $this->Write(5,$texto,$this->x); $this->x -= $this->GetStringWidth($texto); } $this->SetFillColor(255); $this->x += 2*$tamanho; break; } } else //we are inside a table { $this->cell[$this->row][$this->col]['form'] = true; // in order to make some width adjustments later $type = ''; $text = ''; $height = 0; $width = 0; switch(strtoupper($attr['TYPE'])){ case 'CHECKBOX': //Draw Checkbox $checked = false; if (isset($attr['CHECKED'])) $checked = true; $text = $checked; $type = 'CHECKBOX'; $width = 4; $this->cell[$this->row][$this->col]['textbuffer'][] = array(""/*identifier*/."type=input,subtype=$type,width=$width,height=$height"."".$text); $this->cell[$this->row][$this->col]['s'] += $width; if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = $this->lineheight; break; case 'RADIO': //Draw Radio button $checked = false; if (isset($attr['CHECKED'])) $checked = true; $text = $checked; $type = 'RADIO'; $width = 3; $this->cell[$this->row][$this->col]['textbuffer'][] = array(""/*identifier*/."type=input,subtype=$type,width=$width,height=$height"."".$text); $this->cell[$this->row][$this->col]['s'] += $width; if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = $this->lineheight; break; case 'BUTTON': $type = 'BUTTON'; // Draw a button case 'SUBMIT': if ($type == '') $type = 'SUBMIT'; case 'RESET': if ($type == '') $type = 'RESET'; $texto=''; if (isset($attr['VALUE'])) $texto = " " . $attr['VALUE'] . " "; $text = $texto; $width = $this->GetStringWidth($texto)+3; $this->cell[$this->row][$this->col]['textbuffer'][] = array(""/*identifier*/."type=input,subtype=$type,width=$width,height=$height"."".$text); $this->cell[$this->row][$this->col]['s'] += $width; if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = $this->lineheight + 2; break; case 'PASSWORD': if (isset($attr['VALUE'])) { $num_stars = strlen($attr['VALUE']); $attr['VALUE'] = str_repeat('*',$num_stars); } $type = 'PASSWORD'; case 'TEXT': //Draw TextField default: //default == TEXT $texto=''; if (isset($attr['VALUE'])) $texto = $attr['VALUE']; $tamanho = 20; if (isset($attr['SIZE']) and ctype_digit($attr['SIZE']) ) $tamanho = $attr['SIZE']; $text = $texto; $width = 2*$tamanho; if ($type == '') $type = 'TEXT'; $this->cell[$this->row][$this->col]['textbuffer'][] = array(""/*identifier*/."type=input,subtype=$type,width=$width,height=$height"."".$text); $this->cell[$this->row][$this->col]['s'] += $width; if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = $this->lineheight + 2; break; } } break; case 'FONT': //Font size is ignored for now if (isset($attr['COLOR']) and $attr['COLOR']!='') { $cor = ConvertColor($attr['COLOR']); //If something goes wrong switch color to black $cor['R'] = (isset($cor['R'])?$cor['R']:0); $cor['G'] = (isset($cor['G'])?$cor['G']:0); $cor['B'] = (isset($cor['B'])?$cor['B']:0); $this->colorarray = $cor; $this->SetTextColor($cor['R'],$cor['G'],$cor['B']); $this->issetcolor = true; } if (isset($attr['FACE']) and in_array(strtolower($attr['FACE']), $this->fontlist)) { $this->SetFont(strtolower($attr['FACE'])); $this->issetfont=true; } //'If' disabled in this version due lack of testing (you may enable it if you want) // if (isset($attr['FACE']) and in_array(strtolower($attr['FACE']), $this->fontlist) and isset($attr['SIZE']) and $attr['SIZE']!='') { // $this->SetFont(strtolower($attr['FACE']),'',$attr['SIZE']); // $this->issetfont=true; // } break; }//end of switch $this->pjustfinished=false; } function CloseTag($tag) { //! @return void //Closing tag if($tag=='OPTION') $this->selectoption['ACTIVE'] = false; if($tag=='BDO') $this->divrevert = false; if($tag=='INS') $tag='U'; if($tag=='STRONG') $tag='B'; if($tag=='EM' or $tag=='CITE') $tag='I'; if($tag=='OUTLINE') { if(!$this->pbegin and !$this->divbegin and !$this->tablestart) { //Deactivate $this->outlineparam for its info is already stored inside $this->textbuffer //if (isset($this->outlineparam['OLDWIDTH'])) $this->SetTextOutline($this->outlineparam['OLDWIDTH']); $this->SetTextOutline(false); $this->outlineparam=array(); //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth - $x + $this->lMargin; //Print content $this->printbuffer($this->textbuffer,true/*is out of a block (e.g. DIV,P etc.)*/); $this->textbuffer=array(); //Reset values $this->Reset(); $this->buffer_on=false; } $this->SetTextOutline(false); $this->outlineparam=array(); } if($tag=='A') { if(!$this->pbegin and !$this->divbegin and !$this->tablestart and !$this->buffer_on) { //Deactivate $this->HREF for its info is already stored inside $this->textbuffer $this->HREF=''; //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth - $x + $this->lMargin; //Print content $this->printbuffer($this->textbuffer,true/*is out of a block (e.g. DIV,P etc.)*/); $this->textbuffer=array(); //Reset values $this->Reset(); } $this->HREF=''; } if($tag=='TH') $this->SetStyle('B',false); if($tag=='TH' or $tag=='TD') $this->tdbegin = false; if($tag=='SPAN') { if(!$this->pbegin and !$this->divbegin and !$this->tablestart) { if($this->cssbegin) { //Check if we have borders to print if ($this->cssbegin and ($this->divborder or $this->dash_on or $this->dotted_on or $this->divbgcolor)) { $texto=''; foreach($this->textbuffer as $vetor) $texto.=$vetor[0]; $tempx = $this->x; if($this->divbgcolor) $this->Cell($this->GetStringWidth($texto),$this->lineheight,'',$this->divborder,'','L',$this->divbgcolor); if ($this->dash_on) $this->Rect($this->oldx,$this->oldy,$this->GetStringWidth($texto),$this->lineheight); if ($this->dotted_on) $this->DottedRect($this->x - $this->GetStringWidth($texto),$this->y,$this->GetStringWidth($texto),$this->lineheight); $this->x = $tempx; $this->x -= 1; //adjust alignment } $this->cssbegin=false; $this->backupcss=array(); } //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth - $x + $this->lMargin; //Print content $this->printbuffer($this->textbuffer,true/*is out of a block (e.g. DIV,P etc.)*/); $this->textbuffer=array(); //Reset values $this->Reset(); } $this->buffer_on=false; } if($tag=='P' or $tag=='DIV') //CSS in BLOCK mode { $this->blockjustfinished = true; //Eliminate exceeding left-side spaces if(!$this->tablestart) { if ($this->divwidth == 0) $this->divwidth = $this->pgwidth; if ($tag=='P') { $this->pbegin=false; $this->pjustfinished=true; } else $this->divbegin=false; $content=''; foreach($this->textbuffer as $aux) $content .= $aux[0]; $numlines = $this->WordWrap($content,$this->divwidth); if ($this->divheight == 0) $this->divheight = $numlines * 5; //Print content $this->printbuffer($this->textbuffer); $this->textbuffer=array(); if ($tag=='P') $this->Ln($this->lineheight); }//end of 'if (!this->tablestart)' //Reset values $this->Reset(); $this->cssbegin=false; $this->backupcss=array(); } if($tag=='TABLE') { // TABLE-END // BEGIN FIX BY ANDRE if ( isset($this->table['nc']) && $this->table['nr'] ) { // END FIX BY ANDRE $this->blockjustfinished = true; //Eliminate exceeding left-side spaces $this->table['cells'] = $this->cell; $this->table['wc'] = array_pad(array(),$this->table['nc'],array('miw'=>0,'maw'=>0)); $this->table['hr'] = array_pad(array(),$this->table['nr'],0); $this->_tableColumnWidth($this->table); $this->_tableWidth($this->table); $this->_tableHeight($this->table); //Output table on PDF $this->_tableWrite($this->table); // BEGIN FIX BY ANDRE } // END FIX BY ANDRE //Reset values $this->tablestart=false; //bool $this->table=array(); //array $this->cell=array(); //array $this->col=-1; //int $this->row=-1; //int $this->Reset(); $this->Ln(0.5*$this->lineheight); } if(($tag=='UL') or ($tag=='OL')) { if ($this->buffer_on == false) $this->listnum--;//Adjust minor BUG (this happens when there are two together) if ($this->listlvl == 1) // We are closing the last OL/UL tag { $this->blockjustfinished = true; //Eliminate exceeding left-side spaces $this->buffer_on = false; if (!empty($this->textbuffer)) $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl]); $this->textbuffer = array(); $this->listlvl--; $this->printlistbuffer(); } else // returning one level { if (!empty($this->textbuffer)) $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl]); $this->textbuffer = array(); $occur = $this->listoccur[$this->listlvl]; $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum $this->listlvl--; $occur = $this->listoccur[$this->listlvl]; $this->listnum = $this->listlist[$this->listlvl][$occur]['MAXNUM']; // recover previous level's number $this->listtype = $this->listlist[$this->listlvl][$occur]['TYPE']; // recover previous level's type $this->buffer_on = false; } } if($tag=='H1' or $tag=='H2' or $tag=='H3' or $tag=='H4' or $tag=='H5' or $tag=='H6') { $this->blockjustfinished = true; //Eliminate exceeding left-side spaces if(!$this->pbegin and !$this->divbegin and !$this->tablestart) { //These 2 codelines are useless? $texto=''; foreach($this->textbuffer as $vetor) $texto.=$vetor[0]; //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth; //Print content $this->printbuffer($this->textbuffer); $this->textbuffer=array(); if ($this->x != $this->lMargin) $this->Ln($this->lineheight); //Reset values $this->Reset(); } $this->buffer_on=false; $this->lineheight = 5; $this->Ln($this->lineheight); $this->SetFontSize(11); $this->SetStyle('B',false); } if($tag=='TITLE') {$this->titulo=false; $this->blockjustfinished = true;} if($tag=='FORM') $this->Ln($this->lineheight); if($tag=='PRE') { if(!$this->pbegin and !$this->divbegin and !$this->tablestart) { if ($this->divwidth == 0) $this->divwidth = $this->pgwidth; $content=''; foreach($this->textbuffer as $aux) $content .= $aux[0]; $numlines = $this->WordWrap($content,$this->divwidth); if ($this->divheight == 0) $this->divheight = $numlines * 5; //Print content $this->textbuffer[0][0] = ltrim($this->textbuffer[0][0]); //Remove exceeding left-side space $this->printbuffer($this->textbuffer); $this->textbuffer=array(); if ($this->x != $this->lMargin) $this->Ln($this->lineheight); //Reset values $this->Reset(); $this->Ln(1.1*$this->lineheight); } if($this->tablestart) { $this->cell[$this->row][$this->col]['textbuffer'][] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cell[$this->row][$this->col]['text'][] = "\n"; } if($this->divbegin or $this->pbegin or $this->buffer_on) $this->textbuffer[] = array("\n",$this->HREF,$this->currentstyle,$this->colorarray,$this->currentfont,$this->SUP,$this->SUB,''/*internal link*/,$this->strike,$this->outlineparam,$this->bgcolorarray); $this->cssbegin=false; $this->backupcss=array(); $this->buffer_on = false; $this->blockjustfinished = true; //Eliminate exceeding left-side spaces $this->pjustfinished = true; //behaves the same way } if($tag=='CODE' or $tag=='PRE' or $tag=='TT' or $tag=='KBD' or $tag=='SAMP') { $this->currentfont=''; $this->SetFont('arial'); } if($tag=='B' or $tag=='I' or $tag=='U') { $this->SetStyle($tag,false); if ($this->cssbegin and !$this->divbegin and !$this->pbegin and !$this->buffer_on) { //Reset values $this->Reset(); $this->cssbegin=false; $this->backupcss=array(); } } if($tag=='TEXTAREA') { if (!$this->tablestart) //not inside a table { //Draw arrows too? $texto = ''; foreach($this->textbuffer as $v) $texto .= $v[0]; $this->SetFillColor(235,235,235); $this->SetFont('courier'); $this->x +=3; $linesneeded = $this->WordWrap($texto,($this->col*2.2)+3); if ( $linesneeded > $this->row ) //Too many words inside textarea { $textoaux = explode("\n",$texto); $texto = ''; for($i=0;$i < $this->row;$i++) { if ($i == $this->row-1) $texto .= $textoaux[$i]; else $texto .= $textoaux[$i] . "\n"; } //Inform the user that some text has been truncated $texto{strlen($texto)-1} = "."; $texto{strlen($texto)-2} = "."; $texto{strlen($texto)-3} = "."; } $backup_y = $this->y; $this->Rect($this->x,$this->y,(2.2*$this->col)+6,5*$this->row,'DF'); if ($texto != '') $this->MultiCell((2.2*$this->col)+6,$this->lineheight,$texto); $this->y = $backup_y + $this->row*$this->lineheight; $this->SetFont('arial'); } else //inside a table { $this->cell[$this->row][$this->col]['textbuffer'][] = $this->textbuffer[0]; $this->cell[$this->row][$this->col]['text'][] = $this->textbuffer[0]; $this->cell[$this->row][$this->col]['form'] = true; // in order to make some width adjustments later $this->specialcontent = ''; } $this->SetFillColor(255); $this->textbuffer=array(); $this->buffer_on = false; } if($tag=='SELECT') { $texto = ''; $tamanho = 0; if (isset($this->selectoption['MAXWIDTH'])) $tamanho = $this->selectoption['MAXWIDTH']; if ($this->tablestart) { $texto = "".$this->specialcontent."".$this->selectoption['SELECTED']; $aux = explode("",$texto); $texto = $aux[2]; $texto = "".$aux[1].",width=$tamanho,height=".($this->lineheight + 2)."".$texto; $this->cell[$this->row][$this->col]['s'] += $tamanho + 7; // margin + arrow box $this->cell[$this->row][$this->col]['form'] = true; // in order to make some width adjustments later if (!isset($this->cell[$this->row][$this->col]['h'])) $this->cell[$this->row][$this->col]['h'] = $this->lineheight + 2; $this->cell[$this->row][$this->col]['textbuffer'][] = array($texto); $this->cell[$this->row][$this->col]['text'][] = ''; } else //not inside a table { $texto = $this->selectoption['SELECTED']; $this->SetFillColor(235,235,235); $this->x += 2; $this->Rect($this->x,$this->y,$tamanho+2,5,'DF');//+2 margin $this->x += 1; if ($texto != '') $this->Write(5,$texto,$this->x); $this->x += $tamanho - $this->GetStringWidth($texto) + 2; $this->SetFillColor(190,190,190); $this->Rect($this->x-1,$this->y,5,5,'DF'); //Arrow Box $this->SetFont('zapfdingbats'); $this->Write(5,chr(116),$this->x); //Down arrow $this->SetFont('arial'); $this->SetFillColor(255); $this->x += 1; } $this->selectoption = array(); $this->specialcontent = ''; $this->textbuffer = array(); } if($tag=='SUB' or $tag=='SUP') //subscript or superscript { if(!$this->pbegin and !$this->divbegin and !$this->tablestart and !$this->buffer_on and !$this->strike) { //Deactivate $this->SUB/SUP for its info is already stored inside $this->textbuffer $this->SUB=false; $this->SUP=false; //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth - $x + $this->lMargin; //Print content $this->printbuffer($this->textbuffer,true/*is out of a block (e.g. DIV,P etc.)*/); $this->textbuffer=array(); //Reset values $this->Reset(); } $this->SUB=false; $this->SUP=false; } if($tag=='S' or $tag=='STRIKE' or $tag=='DEL') { if(!$this->pbegin and !$this->divbegin and !$this->tablestart) { //Deactivate $this->strike for its info is already stored inside $this->textbuffer $this->strike=false; //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth - $x + $this->lMargin; //Print content $this->printbuffer($this->textbuffer,true/*is out of a block (e.g. DIV,P etc.)*/); $this->textbuffer=array(); //Reset values $this->Reset(); } $this->strike=false; } if($tag=='ADDRESS' or $tag=='CENTER') //
    or
    tag { $this->blockjustfinished = true; //Eliminate exceeding left-side spaces if(!$this->pbegin and !$this->divbegin and !$this->tablestart) { //Save x,y coords ??? $x = $this->x; $y = $this->y; //Set some default values $this->divwidth = $this->pgwidth - $x + $this->lMargin; //Print content $this->printbuffer($this->textbuffer); $this->textbuffer=array(); //Reset values $this->Reset(); } $this->buffer_on=false; if ($tag == 'ADDRESS') $this->SetStyle('I',false); } if($tag=='BIG') { $newsize = $this->FontSizePt - 1; $this->SetFontSize($newsize); $this->SetStyle('B',false); } if($tag=='SMALL') { $newsize = $this->FontSizePt + 1; $this->SetFontSize($newsize); } if($tag=='FONT') { if ($this->issetcolor == true) { $this->colorarray = array(); $this->SetTextColor(0); $this->issetcolor = false; } if ($this->issetfont) { $this->SetFont('arial'); $this->issetfont=false; } if ($this->cssbegin) { //Get some attributes back! $this->setCSS($this->backupcss); } } } function printlistbuffer() { //! @return void //! @desc Prints all list-related buffered info //Save x coordinate $x = $this->oldx; foreach($this->listitem as $item) { //Set default width & height values $this->divwidth = $this->pgwidth; $this->divheight = $this->lineheight; //Get list's buffered data $lvl = $item[0]; $num = $item[1]; $this->textbuffer = $item[2]; $occur = $item[3]; $type = $this->listlist[$lvl][$occur]['TYPE']; $maxnum = $this->listlist[$lvl][$occur]['MAXNUM']; switch($type) //Format type { case 'A': $num = dec2alpha($num,true); $maxnum = dec2alpha($maxnum,true); $type = str_pad($num,strlen($maxnum),' ',STR_PAD_LEFT) . "."; break; case 'a': $num = dec2alpha($num,false); $maxnum = dec2alpha($maxnum,false); $type = str_pad($num,strlen($maxnum),' ',STR_PAD_LEFT) . "."; break; case 'I': $num = dec2roman($num,true); $maxnum = dec2roman($maxnum,true); $type = str_pad($num,strlen($maxnum),' ',STR_PAD_LEFT) . "."; break; case 'i': $num = dec2roman($num,false); $maxnum = dec2roman($maxnum,false); $type = str_pad($num,strlen($maxnum),' ',STR_PAD_LEFT) . "."; break; case '1': $type = str_pad($num,strlen($maxnum),' ',STR_PAD_LEFT) . "."; break; case 'disc': $type = chr(149); break; case 'square': $type = chr(110); //black square on Zapfdingbats font break; case 'circle': $type = chr(186); break; default: break; } $this->x = (5*$lvl) + $x; //Indent list //Get bullet width including margins $oldsize = $this->FontSize * $this->k; if ($type == chr(110)) $this->SetFont('zapfdingbats','',5); $type .= ' '; $blt_width = $this->GetStringWidth($type)+$this->cMargin*2; //Output bullet $this->Cell($blt_width,5,$type,'','','L'); $this->SetFont('arial','',$oldsize); $this->divwidth = $this->divwidth + $this->lMargin - $this->x; //Print content $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } //Reset all used values $this->listoccur = array(); $this->listitem = array(); $this->listlist = array(); $this->listlvl = 0; $this->listnum = 0; $this->listtype = ''; $this->textbuffer = array(); $this->divwidth = 0; $this->divheight = 0; $this->oldx = -1; //At last, but not least, skip a line $this->Ln($this->lineheight); } function printbuffer($arrayaux,$outofblock=false,$is_table=false) { //! @return headache //! @desc Prepares buffered text to be printed with FlowingBlock() //Save some previous parameters $save = array(); $save['strike'] = $this->strike; $save['SUP'] = $this->SUP; $save['SUB'] = $this->SUB; $save['DOTTED'] = $this->dotted_on; $save['DASHED'] = $this->dash_on; $this->SetDash(); //restore to no dash $this->dash_on = false; $this->dotted_on = false; $bak_y = $this->y; $bak_x = $this->x; $align = $this->divalign; $oldpage = $this->page; //Overall object size == $old_height //Line height == $this->divheight $old_height = $this->divheight; if ($is_table) { $this->divheight = 1.1*$this->lineheight; $fill = 0; } else { $this->divheight = $this->lineheight; if ($this->FillColor == '1.000 g') $fill = 0; //avoid useless background painting (1.000 g == white background color) else $fill = 1; } $this->newFlowingBlock( $this->divwidth,$this->divheight,$this->divborder,$align,$fill,$is_table); $array_size = count($arrayaux); for($i=0;$i < $array_size; $i++) { $vetor = $arrayaux[$i]; if ($i == 0 and $vetor[0] != "\n") $vetor[0] = ltrim($vetor[0]); if (empty($vetor[0]) and empty($vetor[7])) continue; //Ignore empty text and not carrying an internal link //Activating buffer properties if(isset($vetor[10]) and !empty($vetor[10])) //Background color { $cor = $vetor[10]; $this->SetFillColor($cor['R'],$cor['G'],$cor['B']); $this->divbgcolor = true; } if(isset($vetor[9]) and !empty($vetor[9])) // Outline parameters { $cor = $vetor[9]['COLOR']; $outlinewidth = $vetor[9]['WIDTH']; $this->SetTextOutline($outlinewidth,$cor['R'],$cor['G'],$cor['B']); $this->outline_on = true; } if(isset($vetor[8]) and $vetor[8] === true) // strike-through the text { $this->strike = true; } if(isset($vetor[7]) and $vetor[7] != '') // internal link: { $this->internallink[$vetor[7]] = array("Y"=>$this->y,"PAGE"=>$this->page ); $this->Bookmark($vetor[7]." (pg. $this->page)",0,$this->y); if (empty($vetor[0])) continue; //Ignore empty text } if(isset($vetor[6]) and $vetor[6] === true) // Subscript { $this->SUB = true; $this->SetFontSize(6); } if(isset($vetor[5]) and $vetor[5] === true) // Superscript { $this->SUP = true; $this->SetFontSize(6); } if(isset($vetor[4]) and $vetor[4] != '') $this->SetFont($vetor[4]); // Font Family if (!empty($vetor[3])) //Font Color { $cor = $vetor[3]; $this->SetTextColor($cor['R'],$cor['G'],$cor['B']); } if(isset($vetor[2]) and $vetor[2] != '') //Bold,Italic,Underline styles { if (strpos($vetor[2],"B") !== false) $this->SetStyle('B',true); if (strpos($vetor[2],"I") !== false) $this->SetStyle('I',true); if (strpos($vetor[2],"U") !== false) $this->SetStyle('U',true); } if(isset($vetor[1]) and $vetor[1] != '') //LINK { if (strpos($vetor[1],".") === false) //assuming every external link has a dot indicating extension (e.g: .html .txt .zip www.somewhere.com etc.) { //Repeated reference to same anchor? while(array_key_exists($vetor[1],$this->internallink)) $vetor[1]="#".$vetor[1]; $this->internallink[$vetor[1]] = $this->AddLink(); $vetor[1] = $this->internallink[$vetor[1]]; } $this->HREF = $vetor[1]; $this->SetTextColor(0,0,255); $this->SetStyle('U',true); } //Print-out special content if (isset($vetor[0]) and $vetor[0]{0} == '' and $vetor[0]{1} == '' and $vetor[0]{2} == '') //identifier has been identified! { $content = explode("",$vetor[0]); $texto = $content[2]; $content = explode(",",$content[1]); foreach($content as $value) { $value = explode("=",$value); $specialcontent[$value[0]] = $value[1]; } if ($this->flowingBlockAttr[ 'contentWidth' ] > 0) // Print out previously accumulated content { $width_used = $this->flowingBlockAttr[ 'contentWidth' ] / $this->k; //Restart Flowing Block $this->finishFlowingBlock($outofblock); $this->x = $bak_x + ($width_used % $this->divwidth) + 0.5;// 0.5 == margin $this->y -= ($this->lineheight + 0.5); $extrawidth = 0; //only to be used in case $specialcontent['width'] does not contain all used width (e.g. Select Box) if ($specialcontent['type'] == 'select') $extrawidth = 7; //arrow box + margin if(($this->x - $bak_x) + $specialcontent['width'] + $extrawidth > $this->divwidth ) { $this->x = $bak_x; $this->y += $this->lineheight - 1; } $this->newFlowingBlock( $this->divwidth,$this->divheight,$this->divborder,$align,$fill,$is_table ); } switch(strtoupper($specialcontent['type'])) { case 'IMAGE': //xpos and ypos used in order to support:
    $xpos = 0; $ypos = 0; if (isset($specialcontent['ypos']) and $specialcontent['ypos'] != '') $ypos = (float)$specialcontent['ypos']; if (isset($specialcontent['xpos']) and $specialcontent['xpos'] != '') $xpos = (float)$specialcontent['xpos']; $width_used = (($this->x - $bak_x) + $specialcontent['width'])*$this->k; //in order to adjust x coordinate later //Is this the best way of fixing x,y coordinates? $fix_x = ($this->x+2) * $this->k + ($xpos*$this->k); //+2 margin $fix_y = ($this->h - (($this->y+2) + $specialcontent['height'])) * $this->k;//+2 margin $imgtemp = explode(" ",$texto); $imgtemp[5]=$fix_x; // x $imgtemp[6]=$fix_y; // y $texto = implode(" ",$imgtemp); $this->_out($texto); //Readjust x coordinate in order to allow text to be placed after this form element $this->x = $bak_x; $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $spacenum = (integer)ceil(($width_used / $spacesize)); //Consider the space used so far in this line as a bunch of spaces if ($ypos != 0) $this->Ln($ypos); else $this->WriteFlowingBlock(str_repeat(' ',$spacenum)); break; case 'INPUT': switch($specialcontent['subtype']) { case 'PASSWORD': case 'TEXT': //Draw TextField $width_used = (($this->x - $bak_x) + $specialcontent['width'])*$this->k; //in order to adjust x coordinate later $this->SetFillColor(235,235,235); $this->x += 1; $this->y += 1; $this->Rect($this->x,$this->y,$specialcontent['width'],4.5,'DF');// 4.5 in order to avoid overlapping if ($texto != '') { $this->x += 1; $this->Write(5,$texto,$this->x); $this->x -= $this->GetStringWidth($texto); } $this->SetFillColor(255); $this->y -= 1; //Readjust x coordinate in order to allow text to be placed after this form element $this->x = $bak_x; $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $spacenum = (integer)ceil(($width_used / $spacesize)); //Consider the space used so far in this line as a bunch of spaces $this->WriteFlowingBlock(str_repeat(' ',$spacenum)); break; case 'CHECKBOX': //Draw Checkbox $width_used = (($this->x - $bak_x) + $specialcontent['width'])*$this->k; //in order to adjust x coordinate later $checked = $texto; $this->SetFillColor(235,235,235); $this->y += 1; $this->x += 1; $this->Rect($this->x,$this->y,3,3,'DF'); if ($checked) { $this->Line($this->x,$this->y,$this->x+3,$this->y+3); $this->Line($this->x,$this->y+3,$this->x+3,$this->y); } $this->SetFillColor(255); $this->y -= 1; //Readjust x coordinate in order to allow text to be placed after this form element $this->x = $bak_x; $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $spacenum = (integer)ceil(($width_used / $spacesize)); //Consider the space used so far in this line as a bunch of spaces $this->WriteFlowingBlock(str_repeat(' ',$spacenum)); break; case 'RADIO': //Draw Radio button $width_used = (($this->x - $bak_x) + $specialcontent['width']+0.5)*$this->k; //in order to adjust x coordinate later $checked = $texto; $this->x += 2; $this->y += 1.5; $this->Circle($this->x,$this->y+1.2,1,'D'); $this->_out('0.000 g'); if ($checked) $this->Circle($this->x,$this->y+1.2,0.4,'DF'); $this->y -= 1.5; //Readjust x coordinate in order to allow text to be placed after this form element $this->x = $bak_x; $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $spacenum = (integer)ceil(($width_used / $spacesize)); //Consider the space used so far in this line as a bunch of spaces $this->WriteFlowingBlock(str_repeat(' ',$spacenum)); break; case 'BUTTON': // Draw a button case 'SUBMIT': case 'RESET': $nihil = ($specialcontent['width']-$this->GetStringWidth($texto))/2; $this->x += 1.5; $this->y += 1; $this->SetFillColor(190,190,190); $this->Rect($this->x,$this->y,$specialcontent['width'],4.5,'DF'); // 4.5 in order to avoid overlapping $this->x += $nihil; $this->Write(5,$texto,$this->x); $this->x += $nihil; $this->SetFillColor(255); $this->y -= 1; break; default: break; } break; case 'SELECT': $width_used = (($this->x - $bak_x) + $specialcontent['width'] + 8)*$this->k; //in order to adjust x coordinate later $this->SetFillColor(235,235,235); //light gray $this->x += 1.5; $this->y += 1; $this->Rect($this->x,$this->y,$specialcontent['width']+2,$this->lineheight,'DF'); // +2 == margin $this->x += 1; if ($texto != '') $this->Write($this->lineheight,$texto,$this->x); //the combobox content $this->x += $specialcontent['width'] - $this->GetStringWidth($texto) + 2; $this->SetFillColor(190,190,190); //dark gray $this->Rect($this->x-1,$this->y,5,5,'DF'); //Arrow Box $this->SetFont('zapfdingbats'); $this->Write($this->lineheight,chr(116),$this->x); //Down arrow $this->SetFont('arial'); $this->SetFillColor(255); //Readjust x coordinate in order to allow text to be placed after this form element $this->x = $bak_x; $spacesize = $this->CurrentFont[ 'cw' ][ ' ' ] * ( $this->FontSizePt / 1000 ); $spacenum = (integer)ceil(($width_used / $spacesize)); //Consider the space used so far in this line as a bunch of spaces $this->WriteFlowingBlock(str_repeat(' ',$spacenum)); break; case 'TEXTAREA': //Setup TextArea properties $this->SetFillColor(235,235,235); $this->SetFont('courier'); $this->currentfont='courier'; $ta_lines = $specialcontent['lines']; $ta_height = 1.1*$this->lineheight*$ta_lines; $ta_width = $specialcontent['width']; //Adjust x,y coordinates $this->x += 1.5; $this->y += 1.5; $linesneeded = $this->WordWrap($texto,$ta_width); if ( $linesneeded > $ta_lines ) //Too many words inside textarea { $textoaux = explode("\n",$texto); $texto = ''; for($i=0;$i<$ta_lines;$i++) { if ($i == $ta_lines-1) $texto .= $textoaux[$i]; else $texto .= $textoaux[$i] . "\n"; } //Inform the user that some text has been truncated $texto{strlen($texto)-1} = "."; $texto{strlen($texto)-2} = "."; $texto{strlen($texto)-3} = "."; } $backup_y = $this->y; $backup_x = $this->x; $this->Rect($this->x,$this->y,$ta_width+3,$ta_height,'DF'); if ($texto != '') $this->MultiCell($ta_width+3,$this->lineheight,$texto); $this->y = $backup_y - 1.5; $this->x = $backup_x + $ta_width + 2.5; $this->SetFillColor(255); $this->SetFont('arial'); $this->currentfont=''; break; default: break; } } else //THE text { if ($vetor[0] == "\n") //We are reading a
    now turned into newline ("\n") { //Restart Flowing Block $this->finishFlowingBlock($outofblock); if($outofblock) $this->Ln($this->lineheight); $this->x = $bak_x; $this->newFlowingBlock( $this->divwidth,$this->divheight,$this->divborder,$align,$fill,$is_table ); } else $this->WriteFlowingBlock( $vetor[0] , $outofblock ); } //Check if it is the last element. If so then finish printing the block if ($i == ($array_size-1)) $this->finishFlowingBlock($outofblock); //Now we must deactivate what we have used if( (isset($vetor[1]) and $vetor[1] != '') or $this->HREF != '') { $this->SetTextColor(0); $this->SetStyle('U',false); $this->HREF = ''; } if(isset($vetor[2]) and $vetor[2] != '') { $this->SetStyle('B',false); $this->SetStyle('I',false); $this->SetStyle('U',false); } if(isset($vetor[3]) and $vetor[3] != '') { unset($cor); $this->SetTextColor(0); } if(isset($vetor[4]) and $vetor[4] != '') $this->SetFont('arial'); if(isset($vetor[5]) and $vetor[5] === true) { $this->SUP = false; $this->SetFontSize(11); } if(isset($vetor[6]) and $vetor[6] === true) { $this->SUB = false; $this->SetFontSize(11); } //vetor7-internal links if(isset($vetor[8]) and $vetor[8] === true) // strike-through the text { $this->strike = false; } if(isset($vetor[9]) and !empty($vetor[9])) // Outline parameters { $this->SetTextOutline(false); $this->outline_on = false; } if(isset($vetor[10]) and !empty($vetor[10])) //Background color { $this->SetFillColor(255); $this->divbgcolor = false; } }//end of for(i=0;istrike = $save['strike']; $this->SUP = $save['SUP']; $this->SUB = $save['SUB']; $this->dotted_on = $save['DOTTED']; $this->dash_on = $save['DASHED']; if ($this->dash_on) $this->SetDash(2,2); //Check whether we have borders to paint or not //(only works 100% if whole content spans only 1 page) if ($this->cssbegin and ($this->divborder or $this->dash_on or $this->dotted_on or $this->divbgcolor)) { if ($oldpage != $this->page) { //Only border on last page is painted (known bug) $x = $this->lMargin; $y = $this->tMargin; $old_height = $this->y - $y; } else { if ($this->oldx < 0) $x = $this->x; else $x = $this->oldx; if ($this->oldy < 0) $y = $this->y - $old_height; else $y = $this->oldy; } if ($this->divborder) $this->Rect($x,$y,$this->divwidth,$old_height); if ($this->dash_on) $this->Rect($x,$y,$this->divwidth,$old_height); if ($this->dotted_on) $this->DottedRect($x,$y,$this->divwidth,$old_height); $this->x = $bak_x; } } function Reset() { //! @return void //! @desc Resets several class attributes // if ( $this->issetcolor !== true ) // { $this->SetTextColor(0); $this->SetDrawColor(0); $this->SetFillColor(255); $this->colorarray = array(); $this->bgcolorarray = array(); $this->issetcolor = false; // } $this->HREF = ''; $this->SetTextOutline(false); //$this->strike = false; $this->SetFontSize(11); $this->SetStyle('B',false); $this->SetStyle('I',false); $this->SetStyle('U',false); $this->SetFont('arial'); $this->divwidth = 0; $this->divheight = 0; $this->divalign = "L"; $this->divrevert = false; $this->divborder = 0; $this->divbgcolor = false; $this->toupper = false; $this->tolower = false; $this->SetDash(); //restore to no dash $this->dash_on = false; $this->dotted_on = false; $this->oldx = -1; $this->oldy = -1; } function ReadMetaTags($html) { //! @return void //! @desc Pass meta tag info to PDF file properties $regexp = '/ (\\w+?)=([^\\s>"]+)/si'; // changes anykey=anyvalue to anykey="anyvalue" (only do this when this happens inside tags) $html = preg_replace($regexp," \$1=\"\$2\"",$html); $regexp = '//si'; preg_match_all($regexp,$html,$aux); $firstattr = $aux[1]; $secondattr = $aux[3]; for( $i = 0 ; $i < count($aux[0]) ; $i++) { $name = ( strtoupper($firstattr[$i]) == "NAME" )? strtoupper($aux[2][$i]) : strtoupper($aux[4][$i]); $content = ( strtoupper($firstattr[$i]) == "CONTENT" )? $aux[2][$i] : $aux[4][$i]; switch($name) { case "KEYWORDS": $this->SetKeywords($content); break; case "AUTHOR": $this->SetAuthor($content); break; case "DESCRIPTION": $this->SetSubject($content); break; } } //Comercial do Aplicativo usado (no caso um script): $this->SetCreator("HTML2FPDF >> http://html2fpdf.sf.net"); } ////////////////// /// CSS parser /// ////////////////// function ReadCSS($html) { //! @desc CSS parser //! @return string /* * This version ONLY supports: .class {...} / #id { .... } * It does NOT support: body{...} / a#hover { ... } / p.right { ... } / other mixed names * This function must read the CSS code (internal or external) and order its value inside $this->CSS. */ $match = 0; // no match for instance $regexp = ''; // This helps debugging: showing what is the REAL string being processed //CSS inside external files $regexp = '//si'; $match = preg_match_all($regexp,$html,$CSSext); $ind = 0; while($match){ //Fix path value $path = $CSSext[1][$ind]; $path = str_replace("\\","/",$path); //If on Windows //Get link info and obtain its absolute path $regexp = '|^./|'; $path = preg_replace($regexp,'',$path); if (strpos($path,"../") !== false ) //It is a Relative Link { $backtrackamount = substr_count($path,"../"); $maxbacktrack = substr_count($this->basepath,"/") - 1; $filepath = str_replace("../",'',$path); $path = $this->basepath; //If it is an invalid relative link, then make it go to directory root if ($backtrackamount > $maxbacktrack) $backtrackamount = $maxbacktrack; //Backtrack some directories for( $i = 0 ; $i < $backtrackamount + 1 ; $i++ ) $path = substr( $path, 0 , strrpos($path,"/") ); $path = $path . "/" . $filepath; //Make it an absolute path } elseif( strpos($path,":/") === false) //It is a Local Link { $path = $this->basepath . $path; } //Do nothing if it is an Absolute Link //END of fix path value $CSSextblock = file_get_contents($path); //Get class/id name and its characteristics from $CSSblock[1] $regexp = '/[.# ]([^.]+?)\\s*?\{(.+?)\}/s'; // '/s' PCRE_DOTALL including \n preg_match_all( $regexp, $CSSextblock, $extstyle); //Make CSS[Name-of-the-class] = array(key => value) $regexp = '/\\s*?(\\S+?):(.+?);/si'; for($i=0; $i < count($extstyle[1]) ; $i++) { preg_match_all( $regexp, $extstyle[2][$i], $extstyleinfo); $extproperties = $extstyleinfo[1]; $extvalues = $extstyleinfo[2]; for($j = 0; $j < count($extproperties) ; $j++) { //Array-properties and Array-values must have the SAME SIZE! $extclassproperties[strtoupper($extproperties[$j])] = trim($extvalues[$j]); } $this->CSS[$extstyle[1][$i]] = $extclassproperties; $extproperties = array(); $extvalues = array(); $extclassproperties = array(); } $match--; $ind++; } //end of match $match = 0; // reset value, if needed //CSS internal //Get content between tags and order it, using regexp $regexp = '/(.*?)<\/style>/si'; // it can be
    {report_title}
    {LN_REPORT_GENERATEDTIME} {report_gentime}
    {report_comment}
    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}


    {ln_report_summary}
    {ln_report_audit_summary}
    {DisplayName} {itemcount}
    {ln_report_consolidated_summary}
    {TargetLink}({itemcount}), {TargetLink}({itemcount}),


    {ln_report_consolidation}


    {DataCaption}
    {ln_report_number} {ln_report_count} {ln_report_firstevent} {ln_report_lastevent} {ln_report_user} {ln_report_severity} {ln_report_host}
    {ZAEHLER} {itemcount} {itemcount} {FirstEvent_Date_Formatted} {LastEvent_Date_Formatted} {user} {syslogseverity_text} {FROMHOST}


    {ln_report_detailactions}
    {report_detaildata_users_caption} {report_detaildata_hosts_caption}
    {ln_report_number} {ln_report_count} {ln_report_user}
    {ZAEHLER} {itemcount} {itemcount} {user}
    {ln_report_number} {ln_report_count} {ln_report_host}
    {ZAEHLER} {itemcount} {itemcount} {FROMHOST}
    Made by Adiscon GmbH (2009-2012)  Report Version {report_version}  Partners:  Rsyslog |  WinSyslog {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    report.eventlog.auditsummary.template.pdf000066400000000000000000000150161277740250400357730ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.auditsummary {report_title}

    {report_title}

    {LN_REPORT_GENERATEDTIME} {report_gentime}

    {report_comment}


    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}

    {ln_report_summary}

    {ln_report_audit_summary}
    {DisplayName} {itemcount}
    {ln_report_consolidated_summary}
    {TargetLink}({itemcount}), {TargetLink}({itemcount}),

    {ln_report_consolidation}

    {DataCaption}

    {ln_report_number} {ln_report_count} {ln_report_firstevent} {ln_report_lastevent} {ln_report_user} {ln_report_host}
    {ZAEHLER} {itemcount} {itemcount} {FirstEvent_Date_Formatted} {LastEvent_Date_Formatted} {user} {FROMHOST}

    {report_detaildata_users_caption}

    {ln_report_number} {ln_report_count} {ln_report_user}
    {ZAEHLER} {itemcount} {itemcount} {user}

    {report_detaildata_hosts_caption}

    {ln_report_number} {ln_report_count} {ln_report_host}
    {ZAEHLER} {itemcount} {itemcount} {FROMHOST}


    Made by Adiscon GmbH (2009-2012)  Report Version {report_version} Partners: Rsyslog |  WinSyslog
    {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    loganalyzer-4.1.5/src/classes/reports/report.eventlog.eventsummary.class.php000066400000000000000000000362541277740250400275240ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Basic Includes! require_once($gl_root_path . 'classes/reports/report.class.php'); // --- class Report_eventsummary extends Report { // Common Properties public $_reportVersion = 1; // Internally Version of the ReportEngine public $_reportID = "report.eventlog.eventsummary.class"; // ID for the report, needs to be unique! public $_reportFileBasicName = "report.eventlog.eventsummary"; // Basic Filename for reportfiles public $_reportTitle = "EventLog Summary Report"; // Display name for the report public $_reportDescription = "This is a EventLog Summary Report"; public $_reportHelpArticle = "http://loganalyzer.adiscon.com/plugins/reports/eventlog-eventsummary"; public $_reportNeedsInit = false; // True means that this report needs additional init stuff public $_reportInitialized = false; // True means report is installed // Advanced Report Options private $_maxHosts = 20; // Threshold for maximum hosts to analyse! private $_maxEventsPerHost = 100; // Threshold for maximum amount of events to analyse per host private $_colorThreshold = 10; // Threshold for coloured display of Eventcounter // Constructor public function __construct () { // Fill fields we need for this report $this->_arrProperties[] = SYSLOG_UID; $this->_arrProperties[] = SYSLOG_DATE; $this->_arrProperties[] = SYSLOG_HOST; $this->_arrProperties[] = SYSLOG_MESSAGETYPE; // $this->_arrProperties[] = SYSLOG_FACILITY; $this->_arrProperties[] = SYSLOG_SEVERITY; $this->_arrProperties[] = SYSLOG_EVENT_ID; // $this->_arrProperties[] = SYSLOG_EVENT_LOGTYPE; $this->_arrProperties[] = SYSLOG_EVENT_SOURCE; // $this->_arrProperties[] = SYSLOG_EVENT_CATEGORY; // $this->_arrProperties[] = SYSLOG_EVENT_USER; $this->_arrProperties[] = SYSLOG_MESSAGE; $this->_arrProperties[] = MISC_CHECKSUM; // Init Customfilters Array $this->_arrCustomFilters['_maxHosts'] = array ( 'InternalID' => '_maxHosts', 'DisplayLangID' => 'ln_report_maxHosts_displayname', 'DescriptLangID'=> 'ln_report_maxHosts_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 20, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); $this->_arrCustomFilters['_maxEventsPerHost'] = array ( 'InternalID' => '_maxEventsPerHost', 'DisplayLangID' => 'ln_report_maxEventsPerHost_displayname', 'DescriptLangID'=> 'ln_report_maxEventsPerHost_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 100, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); $this->_arrCustomFilters['_colorThreshold'] = array ( 'InternalID' => '_colorThreshold', 'DisplayLangID' => 'ln_report_colorThreshold_displayname', 'DescriptLangID'=> 'ln_report_colorThreshold_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 10, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); } public function Report_eventsummary() { self::__construct(); } /** * startDataProcessing, analysing data * * @param arrProperties array in: Properties wish list. * @return integer Error stat */ public function startDataProcessing() { global $content, $severity_colors, $gl_starttime, $fields; // Create Filter string, append filter for EventLog Type msgs! $szFilters = $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2; // Include EventLog v1 and v2 // Set Filter string $this->_streamObj->SetFilter( $szFilters ); // Need to Open stream first! $res = $this->_streamObj->Open( $this->_arrProperties, true ); if ( $res == SUCCESS ) { // Set to common content variables $this->SetCommonContentVariables(); // Set report specific content variables $content["_colorThreshold"] = $this->_colorThreshold; // --- Report logic starts here $content["report_rendertime"] = ""; // Step 1: Gather Summaries // Obtain data from the logstream! $content["report_summary"] = $this->_streamObj->ConsolidateDataByField( SYSLOG_SEVERITY, 0, SYSLOG_SEVERITY, SORTING_ORDER_DESC, null, false ); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; // If data is valid, we have an array! if ( is_array($content["report_summary"]) && count($content["report_summary"]) > 0 ) { // Count Total Events $iTotalEvents = 0; foreach ($content["report_summary"] as &$tmpReportData ) { $tmpReportData['DisplayName'] = GetSeverityDisplayName( $tmpReportData[SYSLOG_SEVERITY] ); $tmpReportData['bgcolor'] = $severity_colors[ $tmpReportData[SYSLOG_SEVERITY] ]; $iTotalEvents += $tmpReportData['itemcount']; } // Prepent Item with totalevents count $totalItem['DisplayName'] = "Total Events"; $totalItem['bgcolor'] = "#999999"; $totalItem['itemcount'] = $iTotalEvents; // Prepent to array array_unshift( $content["report_summary"], $totalItem ); } else return ERROR_REPORT_NODATA; // Get List of hosts $content["report_computers"] = $this->_streamObj->ConsolidateItemListByField( SYSLOG_HOST, $this->_maxHosts, SYSLOG_HOST, SORTING_ORDER_DESC ); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; if ( is_array($content["report_computers"]) && count($content["report_computers"]) > 0 ) { // Create plain hosts list for Consolidate function foreach ( $content["report_computers"] as &$tmpComputer ) { $arrHosts[] = $tmpComputer[SYSLOG_HOST]; $tmpComputer[SYSLOG_HOST] = htmlspecialchars($tmpComputer[SYSLOG_HOST]); // XSS Fix: Remove HTML Characters! } } else return ERROR_REPORT_NODATA; // This function will consolidate the Events based per Host! $res = $this->ConsolidateEventsPerHost($arrHosts); // if ( $res != SUCCESS ) { // // Abort on failure! // return $res; // } // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // --- } else return $ret; // Return success! return SUCCESS; } /** * InitReport, empty * */ public function InitReport() { // Nothing to do return SUCCESS; } /** * RemoveReport, empty * */ public function RemoveReport() { // Nothing to do return SUCCESS; } /** * validateLicense, check license code * */ public function validateLicense() { // This is a free report! return SUCCESS; } /** * Init advanced settings from _customFilters string */ public function InitAdvancedSettings() { // Parse and Split _customFilters if ( strlen($this->_customFilters) > 0 ) { // First of all split by comma $tmpFilterValues = explode( ",", $this->_customFilters ); //Loop through mappings foreach ($tmpFilterValues as &$myFilterValue ) { // Split subvalues $tmpArray = explode( "=>", $myFilterValue ); // Set into temporary array $tmpfilterid = trim($tmpArray[0]); // Set advanced property if ( isset($this->_arrCustomFilters[$tmpfilterid]) ) { // Copy New value first! $szNewVal = trim($tmpArray[1]); // Negated logic if ( $this->_arrCustomFilters[$tmpfilterid][FILTER_TYPE] == FILTER_TYPE_NUMBER && !(isset($this->_arrCustomFilters[$tmpfilterid]['MinValue']) && intval($szNewVal) < $this->_arrCustomFilters[$tmpfilterid]['MinValue']) && !(isset($this->_arrCustomFilters[$tmpfilterid]['MaxValue']) && intval($szNewVal) >= $this->_arrCustomFilters[$tmpfilterid]['MaxValue']) ) { if ( $tmpfilterid == '_maxHosts' ) $this->_maxHosts = intval($szNewVal); else if ( $tmpfilterid == '_maxEventsPerHost' ) $this->_maxEventsPerHost = intval($szNewVal); else if ( $tmpfilterid == '_colorThreshold' ) $this->_colorThreshold = intval($szNewVal); } else { // Write to debuglog OutputDebugMessage("Failed setting advanced report option property '" . $tmpfilterid . "', value not in value range!", DEBUG_ERROR); } } } } } /* * Implementation of CheckLogStreamSource */ public function CheckLogStreamSource( $mySourceID ) { // Call basic report Check function $res = $this->CheckLogStreamSourceByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE), SYSLOG_MESSAGE ); // return results! return $res; } /* * Implementation of CreateLogStreamIndexes | Will create missing INDEXES */ public function CreateLogStreamIndexes( $mySourceID ) { // Call basic report Check function $res = $this->CreateLogStreamIndexesByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE) ); // return results! return $res; } /* * Implementation of CreateLogStreamIndexes | Will create missing TRIGGER */ public function CreateLogStreamTrigger( $mySourceID ) { // Call basic report Check function $res = $this->CreateLogStreamTriggerByPropertyArray( $mySourceID, SYSLOG_MESSAGE, MISC_CHECKSUM ); // return results! return $res; } // --- Private functions... /** * Helper function to consolidate events */ private function ConsolidateEventsPerHost( $arrHosts ) { global $content, $gl_starttime, $fields; // Now open the stream for data processing $res = $this->_streamObj->Open( $this->_arrProperties, true ); if ( $res == SUCCESS ) { // --- New Method to consolidate data! // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // Update all Checksums first! $this->_streamObj->UpdateAllMessageChecksum(); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; foreach ( $arrHosts as $myHost ) { // Set custom filters $this->_streamObj->ResetFilters(); $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 ); $this->_streamObj->RemoveFilters( SYSLOG_HOST ); $this->_streamObj->AppendFilter( $fields[SYSLOG_HOST]['SearchField'] . ":=" . $myHost ); // Set Host Item Basics if not set yet $content["report_consdata"][ $myHost ][SYSLOG_HOST] = htmlspecialchars($myHost); // XSS Fix: Remove HTML Characters! // Get Data for single host $content["report_consdata"][ $myHost ]['cons_events'] = $this->_streamObj->ConsolidateDataByField( MISC_CHECKSUM, $this->_maxEventsPerHost, MISC_CHECKSUM, SORTING_ORDER_DESC, null, true, true ); if ( !is_array($content["report_consdata"][ $myHost ]['cons_events']) ) { // Return Error code! return $content["report_consdata"][ $myHost ]['cons_events']; } //print_r ($fields[SYSLOG_MESSAGE]); foreach ( $content["report_consdata"][ $myHost ]['cons_events'] as &$myConsData ) { // Set Basic data entries if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case } } // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // --- // --- Start Postprocessing foreach( $content["report_consdata"] as &$tmpConsolidatedComputer ) { // First use callback function to sort array uasort($tmpConsolidatedComputer['cons_events'], "MultiSortArrayByItemCountDesc"); // Remove entries according to _maxEventsPerHost if ( count($tmpConsolidatedComputer['cons_events']) > $this->_maxEventsPerHost ) { $iDropCount = 0; do { array_pop($tmpConsolidatedComputer['cons_events']); $iDropCount++; } while ( count($tmpConsolidatedComputer['cons_events']) > $this->_maxEventsPerHost ); // Append a dummy entry which shows count of all other events if ( $iDropCount > 0 ) { $lastEntry[SYSLOG_SEVERITY] = SYSLOG_NOTICE; $lastEntry[SYSLOG_EVENT_ID] = "-"; $lastEntry[SYSLOG_EVENT_SOURCE] = $content['LN_GEN_ALL_OTHER_EVENTS']; $lastEntry[SYSLOG_MESSAGE] = $content['LN_GEN_ALL_OTHER_EVENTS']; $lastEntry['itemcount'] = $iDropCount; $lastEntry['FirstEvent_Date'] = "-"; $lastEntry['LastEvent_Date'] = "-"; $tmpConsolidatedComputer['cons_events'][] = $lastEntry; } } // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // PostProcess Events! foreach( $tmpConsolidatedComputer["cons_events"] as &$tmpMyEvent ) { $tmpMyEvent['FirstEvent_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['firstoccurrence_date'] ); $tmpMyEvent['LastEvent_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['lastoccurrence_date'] ); $tmpMyEvent['syslogseverity_text'] = $content['filter_severity_list'][ $tmpMyEvent['syslogseverity'] ]["DisplayName"]; $tmpMyEvent['syslogseverity_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogseverity']); $tmpMyEvent['htmlmsg'] = htmlspecialchars($tmpMyEvent[SYSLOG_MESSAGE]); // XSS Fix: Remove HTML Characters! } } // --- } // Work done! return SUCCESS; } /* * Helper function to obtain Severity background color */ private function GetSeverityBGColor( $nSeverity ) { global $severity_colors; if ( isset( $severity_colors[$nSeverity] ) ) return $severity_colors[$nSeverity]; else return $severity_colors[SYSLOG_INFO]; //Default } } ?>loganalyzer-4.1.5/src/classes/reports/report.eventlog.eventsummary/000077500000000000000000000000001277740250400256755ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.eventsummary/report.eventlog.eventsummary.css000066400000000000000000000241071277740250400343060ustar00rootroot00000000000000/* Generell Tag Classes */ BODY { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #000000; background-color: #f9f9f9; scrollbar-face-color: #DEE3E7; scrollbar-highlight-color: #FFFFFF; scrollbar-shadow-color: #DEE3E7; scrollbar-3dlight-color: #D1D7DC; scrollbar-arrow-color: #006699; scrollbar-track-color: #EFEFEF; scrollbar-darkshadow-color: #98AAB1; } TD { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000 } /* Default Link Classes */ a:link,a:active,a:visited,a.postlink { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; text-decoration:none; background-color: transparent; color:#38140E; } a:hover { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; color:#CC0000; } /*---*/ /* Context Link Classes */ a.contextlink:link,a.contextlink:active,a.contextlink:visited,a.contextlink { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; background-color: transparent; color:#3814BB; text-decoration:underline; } a.contextlink:hover { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight:bold; color:#3844FF; text-decoration:none; } /*---*/ img { border: 0px; } /* Title Classes */ .title { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-weight:bold; background-color: #C6B097; color: #032D5D; border: 1px solid; border-color: #ACBED6 #3B679B #3B679B #ACBED6; height: 20px; text-align:center; vertical-align:middle; } A.title, A.title:active, A.title:visited { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-weight:bold; COLOR: #ED9D10; TEXT-DECORATION: none; } A.title:hover { COLOR: #982D00; TEXT-DECORATION: none; } .titleSecond { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #E3D2AE; background-image: url(images/bg_4.png); background-repeat: repeat-x; color: #1A3745; height: 18px; text-align:center; vertical-align:middle; } /* Default Font Classes */ font { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } /* Table / Border Classes */ .table_with_border { background-color:#EEF2F6; border:1px solid; border-color: #CCCCCC #000000 #000000 #CCCCCC; } .table_with_border_second { background-color:#D5E0E7; border:1px solid; border-color: #CCCCCC #000000 #000000 #CCCCCC; } .table_with_border_light { background-color:#CCCCCC; border:1px #AAAAAA solid; } .with_border { text-indent:3px; background-color:#CCCCCC; border:1px #AAAAAA solid; } .with_border_alternate { text-indent:3px; background-color:#CCCCCC; border:1px #AAAAAA ridge; } .mainheader { border:1px solid; background-color:#C7CBD1; border-color: #44617D #203040 #203040 #44617D; } .mainfooter { height: 20px; background-color:#DDDDDD; border-top: #97A8B9 1px solid; border-bottom: #6592BD 1px solid; } .imageborder { border:1px solid; border-color: #44617D #203040 #203040 #44617D; } /* Cells for listening */ .line0 { font-size: 7pt; color: #000000; background-color: #DDDDDD; } .line0:hover { background-color:#F9F9F9; } .line1 { font-size: 7pt; color: #000000; background-color: #EEEEEE; } .line1:hover { background-color:#F9F9F9; } .line2 { font-size: 7pt; color: #000000; background-color: #F5F5F5; } .line2:hover { background-color:#F9F9F9; } .tableBackground { font-size: 10px; color: #000000; background-color: #F5F5F5; } .lineColouredWhite, .lineColouredWhite:hover, a.lineColouredWhite { font-size: 10px; color: #FFFFFF; } .lineColouredBlack, .lineColouredBlack:hover, a.lineColouredBlack { font-size: 10px; color: #000000; } /* TOP Menu Classes */ .topmenu1begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #4E6485; } .topmenu1 { height: 16px; border:1px ridge; border-color: #79AABE #09506C #79AABE #79AABE; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #4E6485; } .topmenu1:hover { color: #FFFF99; border:1px inset; border-color: #79AABE #09506C #79AABE #79AABE; background-color: #6A88B8; text-decoration: none; } .topmenuend { height: 16px; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #4E6485; } .topmenuextra { height: 16px; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #B8D4E0; } .topmenu2begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #7A92A6; } .topmenu2 { height: 16px; border:1px ridge; border-color: #BDEEFF #79AABE #09506C #09506C; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #7A92A6; } .topmenu2:hover { color: #FFFF99; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; background-color: #6A88B8; text-decoration: none; } .topmenu2_link, A.topmenu2_link { color: #FFDD22; } .topmenu2_link:hover, A.topmenu2_link:hover { color: #FFFF99; text-decoration: none; } .topmenu2end { height: 16px; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #7A92A6; } .topmenu3begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #D4DAE3; } .topmenu3 { height: 16px; border:1px ridge; border-color: #BDEEFF #79AABE #09506C #09506C; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Arial, Verdana, Helvetica, sans-serif; color: #FFFFFF; background-color: #D4DAE3; } .topmenu3:hover { color: #FFFF99; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; background-color: #ACCBFD; text-decoration: none; } .topmenu3end { height: 16px; font: 10px Arial, Verdana, Helvetica, sans-serif; color: #FFFFFF; background-color: #D4DAE3; } .topmenu1_link, a.topmenu1_link, a.topmenu1_link:visited, .topmenu2_link, a.topmenu2_link, a.topmenu2_link:visited, .topmenu3_link, a.topmenu3_link, a.topmenu3_link:visited { vertical-align: middle; height: 16px; color: #FFDD22; font-weight:bold; text-decoration: none; } .topmenu1_link:hover, .topmenu2_link:hover, .topmenu3_link:hover { vertical-align: middle; color: #FFFF99; font-weight:bold; text-decoration: none; } /* Cell Columns */ .cellmenu1 { border:1px ridge; border-color: #79AABE #09506C #09506C #79AABE; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #2E79A0; color: #FFFFFF; } .cellmenu1_naked { border:1px ridge; border-color: #79AABE #09506C #09506C #79AABE; background-color: #2E79A0; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; color: #FFFFFF; } .cellmenu1:hover .cellmenu1_naked:hover { color: #FFFF99; text-decoration: none; } A.cellmenu1_link { color: #FFFF55; text-decoration: underline; } A.cellmenu1_link:hover { color: #FFBB55; text-decoration: none; } .cellmenu2 { border:1px inset; border-color: #79AABE #09506C #09506C #79AABE; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #9FDAF1; color: #393327; } .cellmenu2_naked { text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; color: #393327; border:1px inset; border-color: #79AABE #09506C #09506C #79AABE; background-color: #9FDAF1; } .cellmenu2:hover, .cellmenu2_naked:hover { color: #A31D32; text-decoration: none; } /* Usefull Text Classes */ .ErrorMsg { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-weight: bold; COLOR: #FF0000; } .PriorityEmergency { color: #FFFFFF; background-color: #ff4444; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityAlert { color: #FFFFFF; background-color: #dd00dd; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityCrit { color: #FFFFFF; background-color: #dd9900; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityError { color: #FFFFFF; background-color: #CC0000; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityWarning { color: #FFFFFF; background-color: #FFAA00; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityNotice { color: #FFFFFF; background-color: #66CC33; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityInfo { color: #000000; background-color: #ABF1FF; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityDebug { color: #FFFFFF; background-color: #3333ff; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } /* Form elements */ select, input, button, textarea { background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .SearchFormControl { height: 20px; margin: 2px; background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .SearchFormTextbox { height: 20px; margin: 2px; background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .highlighted { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; color: #BB0000 } report.eventlog.eventsummary.lang.en.php000066400000000000000000000046631277740250400355540ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.eventsummary. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ global $content; // Global Stuff $content['ln_report_event_summary'] = "Event Summary"; $content['ln_report_computer_summary'] = "Computer Summary"; $content['ln_report_consolidation'] = "Events Consolidated per Host"; $content['ln_report_summary'] = "Report Summary"; $content['ln_report_number'] = "No."; $content['ln_report_firstevent'] = "First Event"; $content['ln_report_lastevent'] = "Last Event"; $content['ln_report_process'] = "Process"; $content['ln_report_severity'] = "Type"; $content['ln_report_eventid'] = "Event ID"; $content['ln_report_description'] = "Description"; $content['ln_report_count'] = "Count"; $content['ln_report_maxHosts_displayname'] = "Max hosts"; $content['ln_report_maxHosts_description'] = "The maximum number of hosts which will be displayed."; $content['ln_report_maxEventsPerHost_displayname'] = "Max Events per host"; $content['ln_report_maxEventsPerHost_description'] = "The maximum number of events displayed per host."; $content['ln_report_colorThreshold_displayname'] = "Counter Threshold"; $content['ln_report_colorThreshold_description'] = "If the amount of consolidated events is higher then this threshold, the countfield will be marked red."; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; ?>report.eventlog.eventsummary.template.html000066400000000000000000000127601277740250400362170ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.eventsummary {report_title}
    {report_title}
    {LN_REPORT_GENERATEDTIME} {report_gentime}
    {report_comment}
    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}


    {ln_report_summary}
    {ln_report_event_summary}
    {DisplayName} {itemcount}
    {ln_report_computer_summary}
    {FROMHOST}({itemcount}),


    {ln_report_consolidation}

    {FROMHOST}

    {ln_report_number} {ln_report_count} {ln_report_firstevent} {ln_report_lastevent} {ln_report_process} {ln_report_severity} {ln_report_eventid} {ln_report_description}
    {ZAEHLER} {itemcount} {itemcount} {FirstEvent_Date_Formatted} {LastEvent_Date_Formatted} {sourceproc} {syslogseverity_text} {id} {htmlmsg}
    Made by Adiscon GmbH (2009-2011)  Report Version {report_version}  Partners:  Rsyslog |  WinSyslog {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    report.eventlog.eventsummary.template.pdf000066400000000000000000000114021277740250400360140ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.eventsummary {report_title}

    {report_title}

    {LN_REPORT_GENERATEDTIME} {report_gentime}

    {report_comment}


    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}

    {ln_report_summary}

    {ln_report_event_summary}
    {DisplayName} {itemcount}

    {ln_report_computer_summary}
    {FROMHOST}({itemcount}),

    {ln_report_consolidation}

    {FROMHOST}

    {ln_report_number} {ln_report_count} {ln_report_firstevent} {ln_report_lastevent} {ln_report_process} {ln_report_severity} {ln_report_eventid}
    {ZAEHLER} {itemcount} {itemcount} {FirstEvent_Date_Formatted} {LastEvent_Date_Formatted} {sourceproc} {syslogseverity_text} {id}
    {ln_report_description} {htmlmsg:wordwrap:32}


    Made by Adiscon GmbH (2009-2011)  Report Version {report_version} Partners: Rsyslog |  WinSyslog
    {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    loganalyzer-4.1.5/src/classes/reports/report.eventlog.logonlogoff.class.php000066400000000000000000000371011277740250400272700ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Basic Includes! require_once($gl_root_path . 'classes/reports/report.class.php'); // --- class Report_logonlogoff extends Report { // Common Properties public $_reportVersion = 1; // Internally Version of the ReportEngine public $_reportID = "report.eventlog.logonlogoff.class"; // ID for the report, needs to be unique! public $_reportFileBasicName = "report.eventlog.logonlogoff"; // Basic Filename for reportfiles public $_reportTitle = "EventLog Logon/Logoff Report"; // Display name for the report public $_reportDescription = "This is a EventLog Logon/Logoff Summary Report"; public $_reportHelpArticle = "http://loganalyzer.adiscon.com/plugins/reports/eventlog-logonlogoff"; public $_reportNeedsInit = false; // True means that this report needs additional init stuff public $_reportInitialized = false; // True means report is installed // Advanced Report Options private $_maxHosts = 20; // Threshold for maximum hosts to analyse! private $_maxLogOnLogOffsPerHost = 100; // Threshold for maximum amount of logon/logoffs to analyse per host private $_colorThreshold = 10; // Threshold for coloured display of Eventcounter // Constructor public function __construct () { // Fill fields we need for this report $this->_arrProperties[] = SYSLOG_UID; $this->_arrProperties[] = SYSLOG_DATE; $this->_arrProperties[] = SYSLOG_HOST; $this->_arrProperties[] = SYSLOG_MESSAGETYPE; $this->_arrProperties[] = SYSLOG_SEVERITY; $this->_arrProperties[] = SYSLOG_EVENT_ID; $this->_arrProperties[] = SYSLOG_EVENT_SOURCE; $this->_arrProperties[] = SYSLOG_EVENT_USER; // $this->_arrProperties[] = SYSLOG_MESSAGE; $this->_arrProperties[] = MISC_CHECKSUM; // Init Customfilters Array $this->_arrCustomFilters['_maxHosts'] = array ( 'InternalID' => '_maxHosts', 'DisplayLangID' => 'ln_report_maxHosts_displayname', 'DescriptLangID'=> 'ln_report_maxHosts_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 20, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); $this->_arrCustomFilters['_maxLogOnLogOffsPerHost'] = array ( 'InternalID' => '_maxLogOnLogOffsPerHost', 'DisplayLangID' => 'ln_report_maxLogOnLogOffsPerHost_displayname', 'DescriptLangID'=> 'ln_report_maxLogOnLogOffsPerHost_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 100, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); $this->_arrCustomFilters['_colorThreshold'] = array ( 'InternalID' => '_colorThreshold', 'DisplayLangID' => 'ln_report_colorThreshold_displayname', 'DescriptLangID'=> 'ln_report_colorThreshold_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 10, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); } public function Report_logonlogoff() { self::__construct(); } /** * startDataProcessing, analysing data * * @param arrProperties array in: Properties wish list. * @return integer Error stat */ public function startDataProcessing() { global $content, $severity_colors, $gl_starttime, $fields; // Create Filter string, append filter for EventLog Type msgs! $szFilters = $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " "; /* Include EventLog v1 and v2 */ // Set Filter string $this->_streamObj->SetFilter( $szFilters ); // Need to Open stream first! $res = $this->_streamObj->Open( $this->_arrProperties, true ); if ( $res == SUCCESS ) { // Set to common content variables $this->SetCommonContentVariables(); // Set report specific content variables $content["_colorThreshold"] = $this->_colorThreshold; // --- Report logic starts here $content["report_rendertime"] = ""; // Step 1: Gather Summaries // Obtain data from the logstream! $content["report_summary"] = $this->_streamObj->ConsolidateDataByField( SYSLOG_HOST, 0, SYSLOG_HOST, SORTING_ORDER_DESC, null, false ); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; // If data is valid, we have an array! if ( is_array($content["report_summary"]) && count($content["report_summary"]) > 0 ) { // Count Total Events $iTotalEvents = 0; foreach ($content["report_summary"] as &$tmpReportData ) { $tmpReportData['DisplayName'] = htmlspecialchars($tmpReportData[SYSLOG_HOST]); $tmpReportData['bgcolor'] = "#BBBBBB"; // $severity_colors[ $tmpReportData[SYSLOG_SEVERITY] ]; $iTotalEvents += $tmpReportData['itemcount']; } // Prepent Item with totalevents count $totalItem['DisplayName'] = "Total Events"; $totalItem['bgcolor'] = "#999999"; $totalItem['itemcount'] = $iTotalEvents; // Prepent to array array_unshift( $content["report_summary"], $totalItem ); } else return ERROR_REPORT_NODATA; // This function will consolidate the Events based per Host! $this->ConsolidateLogonLogoffs(); // ($arrHosts); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // --- } else return $ret; // Return success! return SUCCESS; } /** * InitReport, empty * */ public function InitReport() { // Nothing to do return SUCCESS; } /** * RemoveReport, empty * */ public function RemoveReport() { // Nothing to do return SUCCESS; } /** * validateLicense, check license code * */ public function validateLicense() { // This is a free report! return SUCCESS; } /** * Init advanced settings from _customFilters string */ public function InitAdvancedSettings() { // Parse and Split _customFilters if ( strlen($this->_customFilters) > 0 ) { // First of all split by comma $tmpFilterValues = explode( ",", $this->_customFilters ); //Loop through mappings foreach ($tmpFilterValues as &$myFilterValue ) { // Split subvalues $tmpArray = explode( "=>", $myFilterValue ); // Set into temporary array $tmpfilterid = trim($tmpArray[0]); // Set advanced property if ( isset($this->_arrCustomFilters[$tmpfilterid]) ) { // Copy New value first! $szNewVal = trim($tmpArray[1]); // Negated logic if ( $this->_arrCustomFilters[$tmpfilterid][FILTER_TYPE] == FILTER_TYPE_NUMBER && !(isset($this->_arrCustomFilters[$tmpfilterid]['MinValue']) && intval($szNewVal) < $this->_arrCustomFilters[$tmpfilterid]['MinValue']) && !(isset($this->_arrCustomFilters[$tmpfilterid]['MaxValue']) && intval($szNewVal) >= $this->_arrCustomFilters[$tmpfilterid]['MaxValue']) ) { if ( $tmpfilterid == '_maxHosts' ) $this->_maxHosts = intval($szNewVal); else if ( $tmpfilterid == '_maxLogOnLogOffsPerHost' ) $this->_maxLogOnLogOffsPerHost = intval($szNewVal); else if ( $tmpfilterid == '_colorThreshold' ) $this->_colorThreshold = intval($szNewVal); } else { // Write to debuglog OutputDebugMessage("Failed setting advanced report option property '" . $tmpfilterid . "', value not in value range!", DEBUG_ERROR); } } } } } /* * Implementation of CheckLogStreamSource */ public function CheckLogStreamSource( $mySourceID ) { // Call basic report Check function $res = $this->CheckLogStreamSourceByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_EVENT_ID, SYSLOG_MESSAGETYPE), null ); // return results! return $res; } /* * Implementation of CreateLogStreamIndexes | Will create missing INDEXES */ public function CreateLogStreamIndexes( $mySourceID ) { // Call basic report Check function $res = $this->CreateLogStreamIndexesByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_EVENT_ID, SYSLOG_MESSAGETYPE) ); // return results! return $res; } /* * Implementation of CreateLogStreamIndexes | Will create missing TRIGGER */ public function CreateLogStreamTrigger( $mySourceID ) { // Dummy return SUCCESS! return SUCCESS; } // --- Private functions... /** * Helper function to consolidate events */ private function ConsolidateLogonLogoffs() // ( $arrHosts ) { global $content, $gl_starttime, $fields; // Now open the stream for data processing $res = $this->_streamObj->Open( $this->_arrProperties, true ); if ( $res == SUCCESS ) { // --- New Method to consolidate data! // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // Get all LOGON Data // Set custom filters $this->_streamObj->ResetFilters(); $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " " . $fields[SYSLOG_EVENT_ID]['SearchField'] . ":=528,4624" ); /* Include EventIDs for new and old Eventlog API*/ $content["report_consdata"]['logon']['cons_events'] = $this->_streamObj->ConsolidateDataByField( SYSLOG_EVENT_USER, $this->_maxLogOnLogOffsPerHost, SYSLOG_EVENT_USER, SORTING_ORDER_DESC, null, true, true ); foreach ( $content["report_consdata"]['logon']['cons_events'] as &$myConsData ) { // Set Basic data entries if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case } // Set Basic properties $content["report_consdata"]['logon']['DataCaption'] = "Logon Events"; // Get all LOGOFF Data // Set custom filters $this->_streamObj->ResetFilters(); $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " " . $fields[SYSLOG_EVENT_ID]['SearchField'] . ":=538,4634" ); /* Include EventIDs for new and old Eventlog API*/ $content["report_consdata"]['logoff']['cons_events'] = $this->_streamObj->ConsolidateDataByField( SYSLOG_EVENT_USER, $this->_maxLogOnLogOffsPerHost, SYSLOG_EVENT_USER, SORTING_ORDER_DESC, null, true, true ); foreach ( $content["report_consdata"]['logoff']['cons_events'] as &$myConsData ) { // Set Basic data entries if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case } // Set Basic properties $content["report_consdata"]['logoff']['DataCaption'] = "Logoff Events"; /* foreach ( $arrHosts as $myHost ) { // Set custom filters $this->_streamObj->ResetFilters(); $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_NT_EventReport . ",=" . IUT_WEVTMONV2 . " " . $fields[SYSLOG_HOST]['SearchField'] . ":=" . $myHost ); // Set Host Item Basics if not set yet $content["report_consdata"][ $myHost ][SYSLOG_HOST] = $myHost; // Get Data for single host $content["report_consdata"][ $myHost ]['cons_events'] = $this->_streamObj->ConsolidateDataByField( SYSLOG_EVENT_ID, $this->_maxLogOnLogOffsPerHost, SYSLOG_EVENT_USER, SORTING_ORDER_DESC, null, true, true ); //print_r ($fields[SYSLOG_MESSAGE]); foreach ( $content["report_consdata"][ $myHost ]['cons_events'] as &$myConsData ) { // Set Basic data entries if (!isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case } } */ // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // --- // Start Postprocessing foreach( $content["report_consdata"] as &$tmpConsolidatedData ) { // First use callback function to sort array uasort($tmpConsolidatedData['cons_events'], "MultiSortArrayByItemCountDesc"); /* // Remove entries according to _maxLogOnLogOffsPerHost if ( count($tmpConsolidatedComputer['cons_events']) > $this->_maxLogOnLogOffsPerHost ) { $iDropCount = 0; do { array_pop($tmpConsolidatedComputer['cons_events']); $iDropCount++; } while ( count($tmpConsolidatedComputer['cons_events']) > $this->_maxLogOnLogOffsPerHost ); // Append a dummy entry which shows count of all other events if ( $iDropCount > 0 ) { $lastEntry[SYSLOG_SEVERITY] = SYSLOG_NOTICE; $lastEntry[SYSLOG_EVENT_ID] = "-"; $lastEntry[SYSLOG_EVENT_SOURCE] = $content['LN_GEN_ALL_OTHER_EVENTS']; $lastEntry[SYSLOG_MESSAGE] = $content['LN_GEN_ALL_OTHER_EVENTS']; $lastEntry['itemcount'] = $iDropCount; $lastEntry['FirstEvent_Date'] = "-"; $lastEntry['LastEvent_Date'] = "-"; $tmpConsolidatedComputer['cons_events'][] = $lastEntry; } } */ // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // PostProcess Events! foreach( $tmpConsolidatedData["cons_events"] as &$tmpMyEvent ) { $tmpMyEvent['FirstEvent_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['firstoccurrence_date'] ); $tmpMyEvent['LastEvent_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['lastoccurrence_date'] ); $tmpMyEvent['syslogseverity_text'] = $content['filter_severity_list'][ $tmpMyEvent['syslogseverity'] ]["DisplayName"]; $tmpMyEvent['syslogseverity_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogseverity']); } } // --- } // Work done! return SUCCESS; } /* * Helper function to obtain Severity background color */ private function GetSeverityBGColor( $nSeverity ) { global $severity_colors; if ( isset( $severity_colors[$nSeverity] ) ) return $severity_colors[$nSeverity]; else return $severity_colors[SYSLOG_INFO]; //Default } } ?>loganalyzer-4.1.5/src/classes/reports/report.eventlog.logonlogoff/000077500000000000000000000000001277740250400254515ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.logonlogoff/report.eventlog.logonlogoff.css000066400000000000000000000241071277740250400336360ustar00rootroot00000000000000/* Generell Tag Classes */ BODY { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #000000; background-color: #f9f9f9; scrollbar-face-color: #DEE3E7; scrollbar-highlight-color: #FFFFFF; scrollbar-shadow-color: #DEE3E7; scrollbar-3dlight-color: #D1D7DC; scrollbar-arrow-color: #006699; scrollbar-track-color: #EFEFEF; scrollbar-darkshadow-color: #98AAB1; } TD { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000 } /* Default Link Classes */ a:link,a:active,a:visited,a.postlink { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; text-decoration:none; background-color: transparent; color:#38140E; } a:hover { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; color:#CC0000; } /*---*/ /* Context Link Classes */ a.contextlink:link,a.contextlink:active,a.contextlink:visited,a.contextlink { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; background-color: transparent; color:#3814BB; text-decoration:underline; } a.contextlink:hover { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight:bold; color:#3844FF; text-decoration:none; } /*---*/ img { border: 0px; } /* Title Classes */ .title { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-weight:bold; background-color: #C6B097; color: #032D5D; border: 1px solid; border-color: #ACBED6 #3B679B #3B679B #ACBED6; height: 20px; text-align:center; vertical-align:middle; } A.title, A.title:active, A.title:visited { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-weight:bold; COLOR: #ED9D10; TEXT-DECORATION: none; } A.title:hover { COLOR: #982D00; TEXT-DECORATION: none; } .titleSecond { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #E3D2AE; background-image: url(images/bg_4.png); background-repeat: repeat-x; color: #1A3745; height: 18px; text-align:center; vertical-align:middle; } /* Default Font Classes */ font { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } /* Table / Border Classes */ .table_with_border { background-color:#EEF2F6; border:1px solid; border-color: #CCCCCC #000000 #000000 #CCCCCC; } .table_with_border_second { background-color:#D5E0E7; border:1px solid; border-color: #CCCCCC #000000 #000000 #CCCCCC; } .table_with_border_light { background-color:#CCCCCC; border:1px #AAAAAA solid; } .with_border { text-indent:3px; background-color:#CCCCCC; border:1px #AAAAAA solid; } .with_border_alternate { text-indent:3px; background-color:#CCCCCC; border:1px #AAAAAA ridge; } .mainheader { border:1px solid; background-color:#C7CBD1; border-color: #44617D #203040 #203040 #44617D; } .mainfooter { height: 20px; background-color:#DDDDDD; border-top: #97A8B9 1px solid; border-bottom: #6592BD 1px solid; } .imageborder { border:1px solid; border-color: #44617D #203040 #203040 #44617D; } /* Cells for listening */ .line0 { font-size: 7pt; color: #000000; background-color: #DDDDDD; } .line0:hover { background-color:#F9F9F9; } .line1 { font-size: 7pt; color: #000000; background-color: #EEEEEE; } .line1:hover { background-color:#F9F9F9; } .line2 { font-size: 7pt; color: #000000; background-color: #F5F5F5; } .line2:hover { background-color:#F9F9F9; } .tableBackground { font-size: 10px; color: #000000; background-color: #F5F5F5; } .lineColouredWhite, .lineColouredWhite:hover, a.lineColouredWhite { font-size: 10px; color: #FFFFFF; } .lineColouredBlack, .lineColouredBlack:hover, a.lineColouredBlack { font-size: 10px; color: #000000; } /* TOP Menu Classes */ .topmenu1begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #4E6485; } .topmenu1 { height: 16px; border:1px ridge; border-color: #79AABE #09506C #79AABE #79AABE; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #4E6485; } .topmenu1:hover { color: #FFFF99; border:1px inset; border-color: #79AABE #09506C #79AABE #79AABE; background-color: #6A88B8; text-decoration: none; } .topmenuend { height: 16px; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #4E6485; } .topmenuextra { height: 16px; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #B8D4E0; } .topmenu2begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #7A92A6; } .topmenu2 { height: 16px; border:1px ridge; border-color: #BDEEFF #79AABE #09506C #09506C; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #7A92A6; } .topmenu2:hover { color: #FFFF99; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; background-color: #6A88B8; text-decoration: none; } .topmenu2_link, A.topmenu2_link { color: #FFDD22; } .topmenu2_link:hover, A.topmenu2_link:hover { color: #FFFF99; text-decoration: none; } .topmenu2end { height: 16px; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #7A92A6; } .topmenu3begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #D4DAE3; } .topmenu3 { height: 16px; border:1px ridge; border-color: #BDEEFF #79AABE #09506C #09506C; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Arial, Verdana, Helvetica, sans-serif; color: #FFFFFF; background-color: #D4DAE3; } .topmenu3:hover { color: #FFFF99; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; background-color: #ACCBFD; text-decoration: none; } .topmenu3end { height: 16px; font: 10px Arial, Verdana, Helvetica, sans-serif; color: #FFFFFF; background-color: #D4DAE3; } .topmenu1_link, a.topmenu1_link, a.topmenu1_link:visited, .topmenu2_link, a.topmenu2_link, a.topmenu2_link:visited, .topmenu3_link, a.topmenu3_link, a.topmenu3_link:visited { vertical-align: middle; height: 16px; color: #FFDD22; font-weight:bold; text-decoration: none; } .topmenu1_link:hover, .topmenu2_link:hover, .topmenu3_link:hover { vertical-align: middle; color: #FFFF99; font-weight:bold; text-decoration: none; } /* Cell Columns */ .cellmenu1 { border:1px ridge; border-color: #79AABE #09506C #09506C #79AABE; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #2E79A0; color: #FFFFFF; } .cellmenu1_naked { border:1px ridge; border-color: #79AABE #09506C #09506C #79AABE; background-color: #2E79A0; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; color: #FFFFFF; } .cellmenu1:hover .cellmenu1_naked:hover { color: #FFFF99; text-decoration: none; } A.cellmenu1_link { color: #FFFF55; text-decoration: underline; } A.cellmenu1_link:hover { color: #FFBB55; text-decoration: none; } .cellmenu2 { border:1px inset; border-color: #79AABE #09506C #09506C #79AABE; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #9FDAF1; color: #393327; } .cellmenu2_naked { text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; color: #393327; border:1px inset; border-color: #79AABE #09506C #09506C #79AABE; background-color: #9FDAF1; } .cellmenu2:hover, .cellmenu2_naked:hover { color: #A31D32; text-decoration: none; } /* Usefull Text Classes */ .ErrorMsg { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-weight: bold; COLOR: #FF0000; } .PriorityEmergency { color: #FFFFFF; background-color: #ff4444; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityAlert { color: #FFFFFF; background-color: #dd00dd; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityCrit { color: #FFFFFF; background-color: #dd9900; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityError { color: #FFFFFF; background-color: #CC0000; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityWarning { color: #FFFFFF; background-color: #FFAA00; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityNotice { color: #FFFFFF; background-color: #66CC33; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityInfo { color: #000000; background-color: #ABF1FF; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityDebug { color: #FFFFFF; background-color: #3333ff; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } /* Form elements */ select, input, button, textarea { background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .SearchFormControl { height: 20px; margin: 2px; background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .SearchFormTextbox { height: 20px; margin: 2px; background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .highlighted { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; color: #BB0000 } report.eventlog.logonlogoff.lang.en.php000066400000000000000000000044331277740250400350770ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.logonlogoff. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ global $content; // Global Stuff $content['ln_report_logonoff_summary'] = "Summary of Logon/Logoff events"; $content['ln_report_consolidation'] = "Logon / Logoff Events consolidated per User"; $content['ln_report_summary'] = "Report Summary"; $content['ln_report_number'] = "No."; $content['ln_report_firstevent'] = "First Event"; $content['ln_report_lastevent'] = "Last Event"; $content['ln_report_user'] = "Domain & Username"; $content['ln_report_severity'] = "Type"; $content['ln_report_host'] = "Servername"; $content['ln_report_description'] = "Description"; $content['ln_report_count'] = "Count"; $content['ln_report_maxHosts_displayname'] = "Max hosts"; $content['ln_report_maxHosts_description'] = "The maximum number of hosts which will be displayed."; $content['ln_report_maxLogOnLogOffsPerHost_displayname'] = "Max Logon/Logoffs per host/user"; $content['ln_report_maxLogOnLogOffsPerHost_description'] = "The maximum number of Logon/Logoff events displayed per host/user."; $content['ln_report_colorThreshold_displayname'] = "Counter Threshold"; $content['ln_report_colorThreshold_description'] = "If the amount of consolidated events is higher then this threshold, the countfield will be marked red."; $content['ln_report_'] = ""; ?>report.eventlog.logonlogoff.template.html000066400000000000000000000113721277740250400355450ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.logonlogoff {report_title}
    {report_title}
    {LN_REPORT_GENERATEDTIME} {report_gentime}
    {report_comment}
    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}


    {ln_report_summary}
    {ln_report_logonoff_summary}
    {DisplayName} {itemcount}


    {ln_report_consolidation}

    {DataCaption}

    {ln_report_number} {ln_report_count} {ln_report_firstevent} {ln_report_lastevent} {ln_report_user} {ln_report_severity} {ln_report_host}
    {ZAEHLER} {itemcount} {itemcount} {FirstEvent_Date_Formatted} {LastEvent_Date_Formatted} {user} {syslogseverity_text} {FROMHOST}
    Made by Adiscon GmbH (2009-2011)  Report Version {report_version}  Partners:  Rsyslog |  WinSyslog {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    report.eventlog.logonlogoff.template.pdf000066400000000000000000000077251277740250400353610ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.eventlog.logonlogoff {report_title}

    {report_title}

    {LN_REPORT_GENERATEDTIME} {report_gentime}

    {report_comment}


    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}

    {ln_report_summary}

    {ln_report_logonoff_summary}
    {DisplayName} {itemcount}

    {ln_report_consolidation}

    {DataCaption}

    {ln_report_number} {ln_report_count} {ln_report_firstevent} {ln_report_lastevent} {ln_report_user} {ln_report_severity} {ln_report_host}
    {ZAEHLER} {itemcount} {itemcount} {FirstEvent_Date_Formatted} {LastEvent_Date_Formatted} {user} {syslogseverity_text} {FROMHOST}


    Made by Adiscon GmbH (2009-2011)  Report Version {report_version} Partners: Rsyslog |  WinSyslog
    {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    loganalyzer-4.1.5/src/classes/reports/report.syslog.syslogsummary.class.php000066400000000000000000000427411277740250400274160ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Basic Includes! require_once($gl_root_path . 'classes/reports/report.class.php'); // --- class Report_syslogsummary extends Report { // Common Properties public $_reportVersion = 1; // Internally Version of the ReportEngine public $_reportID = "report.syslog.syslogsummary.class"; // ID for the report, needs to be unique! public $_reportFileBasicName = "report.syslog.syslogsummary"; // Basic Filename for reportfiles public $_reportTitle = "Syslog Summary Report"; // Display name for the report public $_reportDescription = "This is a Syslog Summary Report"; public $_reportHelpArticle = "http://loganalyzer.adiscon.com/plugins/reports/syslog-syslogsummary"; public $_reportNeedsInit = false; // True means that this report needs additional init stuff public $_reportInitialized = false; // True means report is installed // Advanced Report Options private $_maxHosts = 20; // Threshold for maximum hosts to analyse! private $_maxMsgsPerHost = 100; // Threshold for maximum amount of syslogmessages to analyse per host private $_colorThreshold = 10; // Threshold for coloured display of Eventcounter // Constructor public function __construct () { // Fill fields we need for this report $this->_arrProperties[] = SYSLOG_UID; $this->_arrProperties[] = SYSLOG_DATE; $this->_arrProperties[] = SYSLOG_HOST; $this->_arrProperties[] = SYSLOG_MESSAGETYPE; $this->_arrProperties[] = SYSLOG_FACILITY; $this->_arrProperties[] = SYSLOG_SEVERITY; $this->_arrProperties[] = SYSLOG_SYSLOGTAG; // $this->_arrProperties[] = SYSLOG_PROCESSID; $this->_arrProperties[] = SYSLOG_MESSAGE; $this->_arrProperties[] = MISC_CHECKSUM; // Init Customfilters Array $this->_arrCustomFilters['_maxHosts'] = array ( 'InternalID' => '_maxHosts', 'DisplayLangID' => 'ln_report_maxHosts_displayname', 'DescriptLangID'=> 'ln_report_maxHosts_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 20, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); $this->_arrCustomFilters['_maxMsgsPerHost'] = array ( 'InternalID' => '_maxMsgsPerHost', 'DisplayLangID' => 'ln_report_maxMsgsPerHost_displayname', 'DescriptLangID'=> 'ln_report_maxMsgsPerHost_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 100, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); $this->_arrCustomFilters['_colorThreshold'] = array ( 'InternalID' => '_colorThreshold', 'DisplayLangID' => 'ln_report_colorThreshold_displayname', 'DescriptLangID'=> 'ln_report_colorThreshold_description', FILTER_TYPE => FILTER_TYPE_NUMBER, 'DefaultValue' => 10, 'MinValue' => 1, /* 'MaxValue' => 0,*/ ); } public function Report_syslogsummary() { self::__construct(); } /** * startDataProcessing, analysing data * * @param arrProperties array in: Properties wish list. * @return integer Error stat */ public function startDataProcessing() { global $content, $severity_colors, $gl_starttime, $fields; // Create Filter string, append filter for EventLog Type msgs! $szFilters = $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_Syslog; // Set Filter string $this->_streamObj->SetFilter( $szFilters ); // Need to Open stream first! $res = $this->_streamObj->Open( $this->_arrProperties, true ); if ( $res == SUCCESS ) { // Set to common content variables $this->SetCommonContentVariables(); // Set report specific content variables $content["_colorThreshold"] = $this->_colorThreshold; // --- Report logic starts here $content["report_rendertime"] = ""; // Step 1: Gather Summaries // Obtain data from the logstream! $content["report_summary"] = $this->_streamObj->ConsolidateDataByField( SYSLOG_SEVERITY, 0, SYSLOG_SEVERITY, SORTING_ORDER_DESC, null, false ); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; // If data is valid, we have an array! if ( is_array($content["report_summary"]) && count($content["report_summary"]) > 0 ) { // Count Total Events $iTotalEvents = 0; foreach ($content["report_summary"] as &$tmpReportData ) { $tmpReportData['DisplayName'] = $this->GetSeverityDisplayName( $tmpReportData[SYSLOG_SEVERITY] ); $tmpReportData['bgcolor'] = $this->GetSeverityBGColor( $tmpReportData[SYSLOG_SEVERITY] ); // $severity_colors[ $tmpReportData[SYSLOG_SEVERITY] ]; $iTotalEvents += $tmpReportData['itemcount']; } // Prepent Item with totalevents count $totalItem['DisplayName'] = "Total Events"; $totalItem['bgcolor'] = "#999999"; $totalItem['itemcount'] = $iTotalEvents; // Prepent to array array_unshift( $content["report_summary"], $totalItem ); } else return ERROR_REPORT_NODATA; // Get List of hosts $content["report_computers"] = $this->_streamObj->ConsolidateItemListByField( SYSLOG_HOST, $this->_maxHosts, SYSLOG_HOST, SORTING_ORDER_DESC ); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s, "; if ( is_array($content["report_computers"]) && count($content["report_computers"]) > 0 ) { // Create plain hosts list for Consolidate function foreach ( $content["report_computers"] as $tmpComputer ) { $arrHosts[] = $tmpComputer[SYSLOG_HOST]; $tmpComputer[SYSLOG_HOST] = htmlspecialchars($tmpComputer[SYSLOG_HOST]); // XSS Fix: Remove HTML Characters! } } else return ERROR_REPORT_NODATA; // This function will consolidate the Events based per Host! $this->ConsolidateSyslogmessagesPerHost($arrHosts); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // --- } else return $ret; // Return success! return SUCCESS; } /** * InitReport, empty * */ public function InitReport() { // Nothing to do return SUCCESS; } /** * RemoveReport, empty * */ public function RemoveReport() { // Nothing to do return SUCCESS; } /** * validateLicense, check license code * */ public function validateLicense() { // This is a free report! return SUCCESS; } /** * Init advanced settings from _customFilters string */ public function InitAdvancedSettings() { // Parse and Split _customFilters if ( strlen($this->_customFilters) > 0 ) { // First of all split by comma $tmpFilterValues = explode( ",", $this->_customFilters ); //Loop through mappings foreach ($tmpFilterValues as &$myFilterValue ) { // Split subvalues $tmpArray = explode( "=>", $myFilterValue ); // Set into temporary array $tmpfilterid = trim($tmpArray[0]); // Set advanced property if ( isset($this->_arrCustomFilters[$tmpfilterid]) ) { // Copy New value first! $szNewVal = trim($tmpArray[1]); // Negated logic if ( $this->_arrCustomFilters[$tmpfilterid][FILTER_TYPE] == FILTER_TYPE_NUMBER && !(isset($this->_arrCustomFilters[$tmpfilterid]['MinValue']) && intval($szNewVal) < $this->_arrCustomFilters[$tmpfilterid]['MinValue']) && !(isset($this->_arrCustomFilters[$tmpfilterid]['MaxValue']) && intval($szNewVal) >= $this->_arrCustomFilters[$tmpfilterid]['MaxValue']) ) { if ( $tmpfilterid == '_maxHosts' ) $this->_maxHosts = intval($szNewVal); else if ( $tmpfilterid == '_maxMsgsPerHost' ) $this->_maxMsgsPerHost = intval($szNewVal); else if ( $tmpfilterid == '_colorThreshold' ) $this->_colorThreshold = intval($szNewVal); } else { // Write to debuglog OutputDebugMessage("Failed setting advanced report option property '" . $tmpfilterid . "', value not in value range!", DEBUG_ERROR); } } } } } /* * Implementation of CheckLogStreamSource */ public function CheckLogStreamSource( $mySourceID ) { // Call basic report Check function $res = $this->CheckLogStreamSourceByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE), SYSLOG_MESSAGE ); // return results! return $res; } /* * Implementation of CreateLogStreamIndexes | Will create missing INDEXES */ public function CreateLogStreamIndexes( $mySourceID ) { // Call basic report Check function $res = $this->CreateLogStreamIndexesByPropertyArray( $mySourceID, array(SYSLOG_HOST, MISC_CHECKSUM, SYSLOG_DATE, SYSLOG_SEVERITY, SYSLOG_MESSAGETYPE) ); // return results! return $res; } /* * Implementation of CreateLogStreamIndexes | Will create missing INDEXES */ public function CreateLogStreamTrigger( $mySourceID ) { // Call basic report Check function $res = $this->CreateLogStreamTriggerByPropertyArray( $mySourceID, SYSLOG_MESSAGE, MISC_CHECKSUM ); // return results! return $res; } // --- Private functions... /** * Helper function to consolidate syslogmessages */ private function ConsolidateSyslogmessagesPerHost( $arrHosts ) { global $content, $gl_starttime, $fields; // Now open the stream for data processing $res = $this->_streamObj->Open( $this->_arrProperties, true ); if ( $res == SUCCESS ) { // --- New Method to consolidate data! // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // Update all Checksums first! $this->_streamObj->UpdateAllMessageChecksum(); // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; foreach ( $arrHosts as $myHost ) { // Set custom filters $this->_streamObj->ResetFilters(); $this->_streamObj->SetFilter( $this->_filterString . " " . $fields[SYSLOG_MESSAGETYPE]['SearchField'] . ":=" . IUT_Syslog ); $this->_streamObj->RemoveFilters( SYSLOG_HOST ); $this->_streamObj->AppendFilter( $fields[SYSLOG_HOST]['SearchField'] . ":=" . $myHost ); // Set Host Item Basics if not set yet $content["report_consdata"][ $myHost ][SYSLOG_HOST] = htmlspecialchars($myHost); // XSS Fix: Remove HTML Characters! // Get Data for single host $content["report_consdata"][ $myHost ]['cons_msgs'] = $this->_streamObj->ConsolidateDataByField( MISC_CHECKSUM, $this->_maxMsgsPerHost, MISC_CHECKSUM, SORTING_ORDER_DESC, null, true, true ); // Only process results if valid! if ( is_array($content["report_consdata"][ $myHost ]['cons_msgs']) ) { foreach ( $content["report_consdata"][ $myHost ]['cons_msgs'] as &$myConsData ) { // Set Basic data entries if (!isset($myConsData[SYSLOG_FACILITY]) || !isset( $content['filter_facility_list'][$myConsData[SYSLOG_FACILITY]] )) $myConsData[SYSLOG_FACILITY] = SYSLOG_LOCAL0; // Set default in this case if (!isset($myConsData[SYSLOG_SEVERITY]) || !isset( $content['filter_severity_list'][$myConsData[SYSLOG_SEVERITY]] )) $myConsData[SYSLOG_SEVERITY] = SYSLOG_NOTICE; // Set default in this case } } else { // Write to debuglog OutputDebugMessage("Failed consolidating data for '" . $myHost . "' with error " . $content["report_consdata"][ $myHost ]['cons_msgs'], DEBUG_ERROR); // Set to empty array $content["report_consdata"][ $myHost ]['cons_msgs'] = array(); } } // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // --- // --- Start Postprocessing foreach( $content["report_consdata"] as &$tmpConsolidatedComputer ) { // First use callback function to sort array uasort($tmpConsolidatedComputer['cons_msgs'], "MultiSortArrayByItemCountDesc"); // Remove entries according to _maxMsgsPerHost if ( count($tmpConsolidatedComputer['cons_msgs']) > $this->_maxMsgsPerHost ) { $iDropCount = 0; do { array_pop($tmpConsolidatedComputer['cons_msgs']); $iDropCount++; } while ( count($tmpConsolidatedComputer['cons_msgs']) > $this->_maxMsgsPerHost ); // Append a dummy entry which shows count of all other events if ( $iDropCount > 0 ) { $lastEntry[SYSLOG_SEVERITY] = SYSLOG_NOTICE; $lastEntry[SYSLOG_FACILITY] = SYSLOG_LOCAL0; $lastEntry[SYSLOG_SYSLOGTAG] = $content['LN_GEN_ALL_OTHER_EVENTS']; $lastEntry[SYSLOG_MESSAGE] = $content['LN_GEN_ALL_OTHER_EVENTS']; $lastEntry['itemcount'] = $iDropCount; $lastEntry['firstoccurrence_date'] = "-"; $lastEntry['lastoccurrence_date'] = "-"; $tmpConsolidatedComputer['cons_msgs'][] = $lastEntry; } } // TimeStats $nowtime = microtime_float(); $content["report_rendertime"] .= number_format($nowtime - $gl_starttime, 2, '.', '') . "s "; // PostProcess Events! foreach( $tmpConsolidatedComputer["cons_msgs"] as &$tmpMyEvent ) { $tmpMyEvent['FirstOccurrence_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['firstoccurrence_date'] ); $tmpMyEvent['LastOccurrence_Date_Formatted'] = GetFormatedDate( $tmpMyEvent['lastoccurrence_date'] ); $tmpMyEvent['syslogseverity_text'] = $this->GetSeverityDisplayName($tmpMyEvent['syslogseverity']); //$content['filter_severity_list'][ $tmpMyEvent['syslogseverity'] ]["DisplayName"]; $tmpMyEvent['syslogfacility_text'] = $this->GetFacilityDisplayName($tmpMyEvent['syslogfacility']); //$content['filter_facility_list'][ $tmpMyEvent['syslogfacility'] ]["DisplayName"]; $tmpMyEvent['syslogseverity_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogseverity']); $tmpMyEvent['syslogfacility_bgcolor'] = $this->GetSeverityBGColor($tmpMyEvent['syslogfacility']); $tmpMyEvent['htmlmsg'] = htmlspecialchars($tmpMyEvent[SYSLOG_MESSAGE]); // XSS Fix: Remove HTML Characters! } } // --- } // Work done! return SUCCESS; } /* * Helper function to convert a facility string into a facility number */ private function GetFacilityDisplayName($nFacility) { global $content; if ( isset($nFacility) && is_numeric($nFacility) ) { foreach ( $content['filter_facility_list'] as $myfacility ) { // check if valid! if ( $myfacility['ID'] == $nFacility ) return $myfacility['DisplayName']; } } // If we reach this point, facility is not valid return $content['LN_GEN_UNKNOWN']; } /* * Helper function to convert a severity string into a severity number */ private function GetSeverityDisplayName($nSeverity) { global $content; if ( isset($nSeverity) && is_numeric($nSeverity) ) { foreach ( $content['filter_severity_list'] as $myseverity ) { // check if valid! if ( $myseverity['ID'] == $nSeverity ) return $myseverity['DisplayName']; } } // If we reach this point, severity is not valid return $content['LN_GEN_UNKNOWN']; } /* * Helper function to obtain Severity background color */ private function GetSeverityBGColor( $nSeverity ) { global $severity_colors; if ( isset( $severity_colors[$nSeverity] ) ) return $severity_colors[$nSeverity]; else return $severity_colors[SYSLOG_INFO]; //Default } /* * Helper function to obtain Severity background color */ private function GetFacilityBGColor( $nFacility ) { global $facility_colors; if ( isset( $facility_colors[$nFacility] ) ) return $facility_colors[$nFacility]; else return $facility_colors[SYSLOG_LOCAL0]; //Default } //--- } ?>loganalyzer-4.1.5/src/classes/reports/report.syslog.syslogsummary/000077500000000000000000000000001277740250400255715ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.syslog.syslogsummary/report.syslog.syslogsummary.css000066400000000000000000000241071277740250400340760ustar00rootroot00000000000000/* Generell Tag Classes */ BODY { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #000000; background-color: #f9f9f9; scrollbar-face-color: #DEE3E7; scrollbar-highlight-color: #FFFFFF; scrollbar-shadow-color: #DEE3E7; scrollbar-3dlight-color: #D1D7DC; scrollbar-arrow-color: #006699; scrollbar-track-color: #EFEFEF; scrollbar-darkshadow-color: #98AAB1; } TD { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000 } /* Default Link Classes */ a:link,a:active,a:visited,a.postlink { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; text-decoration:none; background-color: transparent; color:#38140E; } a:hover { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; color:#CC0000; } /*---*/ /* Context Link Classes */ a.contextlink:link,a.contextlink:active,a.contextlink:visited,a.contextlink { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight: bold; background-color: transparent; color:#3814BB; text-decoration:underline; } a.contextlink:hover { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-weight:bold; color:#3844FF; text-decoration:none; } /*---*/ img { border: 0px; } /* Title Classes */ .title { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-weight:bold; background-color: #C6B097; color: #032D5D; border: 1px solid; border-color: #ACBED6 #3B679B #3B679B #ACBED6; height: 20px; text-align:center; vertical-align:middle; } A.title, A.title:active, A.title:visited { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-weight:bold; COLOR: #ED9D10; TEXT-DECORATION: none; } A.title:hover { COLOR: #982D00; TEXT-DECORATION: none; } .titleSecond { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #E3D2AE; background-image: url(images/bg_4.png); background-repeat: repeat-x; color: #1A3745; height: 18px; text-align:center; vertical-align:middle; } /* Default Font Classes */ font { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } /* Table / Border Classes */ .table_with_border { background-color:#EEF2F6; border:1px solid; border-color: #CCCCCC #000000 #000000 #CCCCCC; } .table_with_border_second { background-color:#D5E0E7; border:1px solid; border-color: #CCCCCC #000000 #000000 #CCCCCC; } .table_with_border_light { background-color:#CCCCCC; border:1px #AAAAAA solid; } .with_border { text-indent:3px; background-color:#CCCCCC; border:1px #AAAAAA solid; } .with_border_alternate { text-indent:3px; background-color:#CCCCCC; border:1px #AAAAAA ridge; } .mainheader { border:1px solid; background-color:#C7CBD1; border-color: #44617D #203040 #203040 #44617D; } .mainfooter { height: 20px; background-color:#DDDDDD; border-top: #97A8B9 1px solid; border-bottom: #6592BD 1px solid; } .imageborder { border:1px solid; border-color: #44617D #203040 #203040 #44617D; } /* Cells for listening */ .line0 { font-size: 7pt; color: #000000; background-color: #DDDDDD; } .line0:hover { background-color:#F9F9F9; } .line1 { font-size: 7pt; color: #000000; background-color: #EEEEEE; } .line1:hover { background-color:#F9F9F9; } .line2 { font-size: 7pt; color: #000000; background-color: #F5F5F5; } .line2:hover { background-color:#F9F9F9; } .tableBackground { font-size: 10px; color: #000000; background-color: #F5F5F5; } .lineColouredWhite, .lineColouredWhite:hover, a.lineColouredWhite { font-size: 10px; color: #FFFFFF; } .lineColouredBlack, .lineColouredBlack:hover, a.lineColouredBlack { font-size: 10px; color: #000000; } /* TOP Menu Classes */ .topmenu1begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #4E6485; } .topmenu1 { height: 16px; border:1px ridge; border-color: #79AABE #09506C #79AABE #79AABE; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #4E6485; } .topmenu1:hover { color: #FFFF99; border:1px inset; border-color: #79AABE #09506C #79AABE #79AABE; background-color: #6A88B8; text-decoration: none; } .topmenuend { height: 16px; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #4E6485; } .topmenuextra { height: 16px; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #B8D4E0; } .topmenu2begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #7A92A6; } .topmenu2 { height: 16px; border:1px ridge; border-color: #BDEEFF #79AABE #09506C #09506C; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #7A92A6; } .topmenu2:hover { color: #FFFF99; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; background-color: #6A88B8; text-decoration: none; } .topmenu2_link, A.topmenu2_link { color: #FFDD22; } .topmenu2_link:hover, A.topmenu2_link:hover { color: #FFFF99; text-decoration: none; } .topmenu2end { height: 16px; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; font: 10px Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; background-color: #7A92A6; } .topmenu3begin { height: 16px; border:0px; padding: 2px 2px 0px 2px; vertical-align: middle; background-color: #D4DAE3; } .topmenu3 { height: 16px; border:1px ridge; border-color: #BDEEFF #79AABE #09506C #09506C; padding: 2px 2px 0px 2px; vertical-align: middle; font: 10px Arial, Verdana, Helvetica, sans-serif; color: #FFFFFF; background-color: #D4DAE3; } .topmenu3:hover { color: #FFFF99; border:1px inset; border-color: #BDEEFF #79AABE #09506C #09506C; background-color: #ACCBFD; text-decoration: none; } .topmenu3end { height: 16px; font: 10px Arial, Verdana, Helvetica, sans-serif; color: #FFFFFF; background-color: #D4DAE3; } .topmenu1_link, a.topmenu1_link, a.topmenu1_link:visited, .topmenu2_link, a.topmenu2_link, a.topmenu2_link:visited, .topmenu3_link, a.topmenu3_link, a.topmenu3_link:visited { vertical-align: middle; height: 16px; color: #FFDD22; font-weight:bold; text-decoration: none; } .topmenu1_link:hover, .topmenu2_link:hover, .topmenu3_link:hover { vertical-align: middle; color: #FFFF99; font-weight:bold; text-decoration: none; } /* Cell Columns */ .cellmenu1 { border:1px ridge; border-color: #79AABE #09506C #09506C #79AABE; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #2E79A0; color: #FFFFFF; } .cellmenu1_naked { border:1px ridge; border-color: #79AABE #09506C #09506C #79AABE; background-color: #2E79A0; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; color: #FFFFFF; } .cellmenu1:hover .cellmenu1_naked:hover { color: #FFFF99; text-decoration: none; } A.cellmenu1_link { color: #FFFF55; text-decoration: underline; } A.cellmenu1_link:hover { color: #FFBB55; text-decoration: none; } .cellmenu2 { border:1px inset; border-color: #79AABE #09506C #09506C #79AABE; text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; background-color: #9FDAF1; color: #393327; } .cellmenu2_naked { text-indent:0px; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight:bold; color: #393327; border:1px inset; border-color: #79AABE #09506C #09506C #79AABE; background-color: #9FDAF1; } .cellmenu2:hover, .cellmenu2_naked:hover { color: #A31D32; text-decoration: none; } /* Usefull Text Classes */ .ErrorMsg { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-weight: bold; COLOR: #FF0000; } .PriorityEmergency { color: #FFFFFF; background-color: #ff4444; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityAlert { color: #FFFFFF; background-color: #dd00dd; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityCrit { color: #FFFFFF; background-color: #dd9900; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityError { color: #FFFFFF; background-color: #CC0000; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityWarning { color: #FFFFFF; background-color: #FFAA00; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityNotice { color: #FFFFFF; background-color: #66CC33; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityInfo { color: #000000; background-color: #ABF1FF; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } .PriorityDebug { color: #FFFFFF; background-color: #3333ff; border-top: black 1px solid; border-bottom: black 1px solid; border-right: gray 1px solid; } /* Form elements */ select, input, button, textarea { background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .SearchFormControl { height: 20px; margin: 2px; background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .SearchFormTextbox { height: 20px; margin: 2px; background-color: #E8E7E2; color:#000000; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .highlighted { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; color: #BB0000 } report.syslog.syslogsummary.lang.en.php000066400000000000000000000051201277740250400353310ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.syslog.syslogsummary. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ global $content; // Global Stuff $content['ln_report_event_summary'] = "Syslog Summary"; $content['ln_report_computer_summary'] = "Computer Summary"; $content['ln_report_consolidation'] = "Syslogmessages consolidated per Host"; $content['ln_report_summary'] = "Report Summary"; $content['ln_report_number'] = "No."; $content['ln_report_firstoccurrence'] = "First Occurrence"; $content['ln_report_lastoccurrence'] = "Last Occurrence"; $content['ln_report_process'] = "Process"; $content['ln_report_facility'] = "Facility"; $content['ln_report_severity'] = "Severity"; $content['ln_report_syslogtag'] = "Syslogtag"; $content['ln_report_description'] = "Description"; $content['ln_report_count'] = "Count"; $content['ln_report_maxHosts_displayname'] = "Max hosts"; $content['ln_report_maxHosts_description'] = "The maximum number of hosts which will be displayed."; $content['ln_report_maxMsgsPerHost_displayname'] = "Max Syslogmessages per host"; $content['ln_report_maxMsgsPerHost_description'] = "The maximum number of syslogmessages displayed per host."; $content['ln_report_colorThreshold_displayname'] = "Counter Threshold"; $content['ln_report_colorThreshold_description'] = "If the amount of consolidated events is higher then this threshold, the countfield will be marked red."; $content['ln_report_unknown_facility'] = "Unknown Facility"; $content['ln_report_unknown_severity'] = "Unknown Severity"; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; $content['ln_report_'] = ""; ?>report.syslog.syslogsummary.template.html000066400000000000000000000143651277740250400360120ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.syslog.syslogsummary {report_title}
    {report_title}
    {LN_REPORT_GENERATEDTIME} {report_gentime}
    {report_comment}
    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}


    {ln_report_summary}
    {ln_report_event_summary}
    {DisplayName} {itemcount}
    {ln_report_computer_summary}
    {FROMHOST}({itemcount}),


    {ln_report_consolidation}

    {FROMHOST}

    {ln_report_number} {ln_report_count} {ln_report_firstoccurrence} {ln_report_lastoccurrence} {ln_report_severity} {ln_report_facility} {ln_report_syslogtag} {ln_report_description}
    {ZAEHLER} {itemcount} {itemcount} {FirstOccurrence_Date_Formatted} {LastOccurrence_Date_Formatted} {syslogseverity_text} {syslogfacility_text} {syslogtag} {htmlmsg}
    Made by Adiscon GmbH (2009-2011)  Report Version {report_version}  Partners:  Rsyslog |  WinSyslog {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    {LN_DEBUGLEVEL} {LN_DEBUGMESSAGE}
    {DBGLEVELTXT}
    {DBGMSG}
    report.syslog.syslogsummary.template.pdf000066400000000000000000000114771277740250400356200ustar00rootroot00000000000000loganalyzer-4.1.5/src/classes/reports/report.syslog.syslogsummary {report_title}

    {report_title}

    {LN_REPORT_GENERATEDTIME} {report_gentime}

    {report_comment}


    {LN_REPORT_FILTERS}
    {FilterType} {FilterDisplay}

    {ln_report_summary}

    {ln_report_event_summary}
    {DisplayName} {itemcount}

    {ln_report_computer_summary}
    {FROMHOST}({itemcount}),

    {ln_report_consolidation}

    {FROMHOST}

    {ln_report_number} {ln_report_count} {ln_report_firstoccurrence} {ln_report_lastoccurrence} {ln_report_severity} {ln_report_facility} {ln_report_syslogtag}
    {ZAEHLER} {itemcount} {itemcount} {FirstOccurrence_Date_Formatted} {LastOccurrence_Date_Formatted} {syslogseverity_text} {syslogfacility_text} {syslogtag}
    {ln_report_description} {htmlmsg:wordwrap:32}


    Made by Adiscon GmbH (2009-2011)  Report Version {report_version} Partners: Rsyslog |  WinSyslog
    {LN_REPORT_FOOTER_ENDERED}: {report_rendertime}  | {LN_FOOTER_DBQUERIES}: {TOTALQUERIES}
    loganalyzer-4.1.5/src/convert.php000066400000000000000000000217651277740250400170530ustar00rootroot00000000000000 Helps to convert from config file to userdb if desired * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); define('IN_PHPLOGCON_CONVERT', true); // Extra for CONVERT Script! define('STEPSCRIPTNAME', "convert.php"); // Helper variable for the STEP helper functions $gl_root_path = './'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_installhelpers.php'); // This site can not require LOGIN define('IS_NOLOGINPAGE', true); $content['IS_NOLOGINPAGE'] = true; InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd // --- PreCheck if conversion is allowed! if ( GetConfigSetting("UserDBEnabled", false) && GetConfigSetting("UserDBConvertAllowed", false) ) { // Setup static values define('MAX_STEPS', 6); $content['web_theme'] = "default"; $content['user_theme'] = "default"; } else DieWithErrorMsg( $content['LN_CONVERT_ERRORINSTALLED'] ); // --- // --- CONTENT Vars $content['TITLE'] = "LogAnalyzer :: " . $content['LN_CONVERT_TITLE']; // --- // --- Read Vars if ( isset($_GET['step']) ) { $content['CONVERT_STEP'] = intval(DB_RemoveBadChars($_GET['step'])); if ( $content['CONVERT_STEP'] > MAX_STEPS ) $content['CONVERT_STEP'] = 1; } else $content['CONVERT_STEP'] = 1; // Set Next Step $content['CONVERT_NEXT_STEP'] = $content['CONVERT_STEP']; if ( MAX_STEPS > $content['CONVERT_STEP'] ) { $content['NEXT_ENABLED'] = "true"; $content['FINISH_ENABLED'] = "false"; $content['CONVERT_NEXT_STEP']++; } else { $content['NEXT_ENABLED'] = "false"; $content['FINISH_ENABLED'] = "true"; } // --- // --- BEGIN Custom Code // Set Bar Images $content['BarImagePlus'] = $gl_root_path . "images/bars/bar-middle/green_middle_17.png"; $content['BarImageLeft'] = $gl_root_path . "images/bars/bar-middle/green_left_17.png"; $content['BarImageRight'] = $gl_root_path . "images/bars/bar-middle/green_right_17.png"; $content['WidthPlus'] = intval( $content['CONVERT_STEP'] * (100 / MAX_STEPS) ) - 8; $content['WidthPlusText'] = "Installer Step " . $content['CONVERT_STEP']; // --- Set Title $content['TITLE'] = GetAndReplaceLangStr( $content['TITLE'], $content['CONVERT_STEP'] ); $content['LN_CONVERT_TITLETOP'] = GetAndReplaceLangStr( $content['LN_CONVERT_TITLETOP'], $content['CONVERT_STEP'] ); // --- // --- Start Setup Processing if ( $content['CONVERT_STEP'] == 2 ) { // Check the database connect $link_id = mysql_connect( GetConfigSetting("UserDBServer"), GetConfigSetting("UserDBUser"), GetConfigSetting("UserDBPass") ); if (!$link_id) RevertOneStep( $content['CONVERT_STEP']-1, GetAndReplaceLangStr( $content['LN_INSTALL_ERRORCONNECTFAILED'], GetConfigSetting("UserDBServer") . "
    " . DB_ReturnSimpleErrorMsg() ) ); // Try to select the DB! $db_selected = mysql_select_db(GetConfigSetting("UserDBName"), $link_id); if(!$db_selected) RevertOneStep( $content['CONVERT_STEP']-1,GetAndReplaceLangStr( $content['LN_INSTALL_ERRORACCESSDENIED'], GetConfigSetting("UserDBName") . "
    " . DB_ReturnSimpleErrorMsg() ) ); } else if ( $content['CONVERT_STEP'] == 3 ) { // Predefine sql helper vars $content['sql_sucess'] = 0; $content['sql_failed'] = 0; // Init $totaldbdefs $totaldbdefs = ""; // Read the table GLOBAL definitions ImportDataFile( $content['BASEPATH'] . "include/db_template.txt" ); // Process definitions ^^ if ( strlen($totaldbdefs) <= 0 ) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = GetAndReplaceLangStr( $content['LN_INSTALL_ERRORINVALIDDBFILE'], $content['BASEPATH'] . "include/db_template.txt"); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = ""; $content['sql_failed']++; } // Replace stats_ with the custom one ;) $totaldbdefs = str_replace( "`logcon_", "`" . GetConfigSetting("UserDBPref"), $totaldbdefs ); // Now split by sql command $mycommands = split( ";\n", $totaldbdefs ); // // check for different linefeed // if ( count($mycommands) <= 1 ) // $mycommands = split( ";\n", $totaldbdefs ); //Still only one? Abort if ( count($mycommands) <= 1 ) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = GetAndReplaceLangStr( $content['LN_INSTALL_ERRORINSQLCOMMANDS'], $content['BASEPATH'] . "include/db_template.txt"); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = ""; $content['sql_failed']++; } // Append INSERT Statement for Config Table to set the Database Version ^^! $mycommands[count($mycommands)] = "INSERT INTO `" . GetConfigSetting("UserDBPref") . "config` (`propname`, `propvalue`, `is_global`) VALUES ('database_installedversion', '" . $content['database_internalversion'] . "', 1)"; // --- Now execute all commands ini_set('error_reporting', E_WARNING); // Enable Warnings! // Establish DB Connection DB_Connect(); for($i = 0; $i < count($mycommands); $i++) { if ( strlen(trim($mycommands[$i])) > 1 ) { $result = DB_Query( $mycommands[$i], false ); if ($result == FALSE) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = DB_ReturnSimpleErrorMsg(); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = $mycommands[$i]; // --- Set CSS Class if ( $content['sql_failed'] % 2 == 0 ) $content['failedstatements'][ $content['sql_failed'] ]['cssclass'] = "line1"; else $content['failedstatements'][ $content['sql_failed'] ]['cssclass'] = "line2"; // --- $content['sql_failed']++; } else $content['sql_sucess']++; // Free result DB_FreeQuery($result); } } } else if ( $content['CONVERT_STEP'] == 4 ) { if ( isset($_SESSION['MAIN_Username']) ) $content['MAIN_Username'] = $_SESSION['MAIN_Username']; else $content['MAIN_Username'] = ""; $content['MAIN_Password1'] = ""; $content['MAIN_Password2'] = ""; // Check for Error Msg if ( isset($_GET['errormsg']) ) { $content['iserror'] = "true"; $content['errormsg'] = DB_StripSlahes( urldecode($_GET['errormsg']) ); } } else if ( $content['CONVERT_STEP'] == 5 ) { // Verify Username and Password Input if ( isset($_POST['username']) ) $_SESSION['MAIN_Username'] = DB_RemoveBadChars($_POST['username']); else RevertOneStep( $content['CONVERT_STEP']-1, $content['LN_INSTALL_MISSINGUSERNAME'] ); if ( isset($_POST['password1']) ) $_SESSION['MAIN_Password1'] = DB_RemoveBadChars($_POST['password1']); else $_SESSION['MAIN_Password1'] = ""; if ( isset($_POST['password2']) ) $_SESSION['MAIN_Password2'] = DB_RemoveBadChars($_POST['password2']); else $_SESSION['MAIN_Password2'] = ""; if ( strlen($_SESSION['MAIN_Password1']) < 4 || $_SESSION['MAIN_Password1'] != $_SESSION['MAIN_Password2'] ) RevertOneStep( $content['CONVERT_STEP']-1, $content['LN_INSTALL_PASSWORDNOTMATCH'] ); // --- Now execute all commands ini_set('error_reporting', E_WARNING); // Enable Warnings! // Establish DB Connection DB_Connect(); // Everything is fine, lets go create the User! CreateUserName( $_SESSION['MAIN_Username'], $_SESSION['MAIN_Password1'], 1 ); // Show User success! $content['MAIN_Username'] = $_SESSION['MAIN_Username']; $content['createduser'] = true; } else if ( $content['CONVERT_STEP'] == 6 ) { // To be on the save side, establish DB Connection DB_Connect(); // Perform conversion of settings into the database now! ConvertCustomSearches(); ConvertCustomViews(); ConvertCustomSources(); ConvertCustomCharts(); // Import General Settings in the last step! ConvertGeneralSettings(); } // --- // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "convert.html"); $page -> output(); // --- // --- Helper functions // --- ?>loganalyzer-4.1.5/src/cron/000077500000000000000000000000001277740250400156105ustar00rootroot00000000000000loganalyzer-4.1.5/src/cron/.htaccess000066400000000000000000000000371277740250400174060ustar00rootroot00000000000000order deny,allow deny from all loganalyzer-4.1.5/src/cron/cmdreportgen.php000066400000000000000000000167101277740250400210170ustar00rootroot00000000000000 This file is meant to run on command line, or via CRON / task Scheduler * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // --- IMPORTANT, read the script filename from argv! // Operation argv if ( isset($_SERVER["argv"][0]) ) $myscriptname = $_SERVER["argv"][0]; else die( "Error, this script can only be run from the command prompt." ); // Extract OS! $pos = strpos( strtoupper(PHP_OS), "WIN"); if ($pos !== false) // Running on Windows { // Extract Global root path from scriptname $gl_root_path = substr( $myscriptname, 0, strrpos($myscriptname, "\\")+1 ); $gl_root_path = str_replace("\\", "/", $gl_root_path); } else // Running on LINUX { // Extract Global root path from scriptname $gl_root_path = substr( $myscriptname, 0, strrpos($myscriptname, "/")+1 ); } // Remove cron folder as well! $gl_root_path = str_replace("cron/", "", $gl_root_path); // --- // Now include necessary include files! include_once($gl_root_path . 'include/functions_common.php'); include_once($gl_root_path . 'include/functions_frontendhelpers.php'); include_once($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility include_once($gl_root_path . 'classes/logstream.class.php'); // Set commandline mode for the script define('IN_PHPLOGCON_COMMANDLINE', true); $content['IN_PHPLOGCON_COMMANDLINE'] = true; InitPhpLogCon(); InitFilterHelpers(); // Helpers for frontend filtering! LoadSourcesFromDatabase(true); // Make sure we load ALL sources from DB! InitSourceConfigs(); // Firts of all init List of Reports! InitReportModules(); // --- // --- Helper functions /* * Cleans data in desired logstream */ function RunReport() { global $content, $gl_root_path; // Get Reference to report! $myReport = $content['REPORTS'][ $content['reportid'] ]; // Get reference to savedreport $mySavedReport = $myReport['SAVEDREPORTS'][ $content['savedreportid'] ]; // Get Objectreference to report $myReportObj = $myReport["ObjRef"]; // Set SavedReport Settings! $myReportObj->InitFromSavedReport($mySavedReport); //Debug Output PrintHTMLDebugInfo( DEBUG_INFO, "RunReport", GetAndReplaceLangStr($content["LN_CMD_RUNREPORT"], $mySavedReport['customTitle']) ); // Perform check $res = $myReportObj->verifyDataSource(); if ( $res != SUCCESS ) { // Print error and die! $szError = GetAndReplaceLangStr( $content['LN_GEN_ERROR_REPORTGENFAILED'], $mySavedReport['customTitle'], GetAndReplaceLangStr( GetErrorMessage($res), $mySavedReport['sourceid']) ); if ( isset($extraErrorDescription) ) $szError .= "

    " . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); DieWithErrorMsg( $szError ); } else { // Call processing part now! $res = $myReportObj->startDataProcessing(); if ( $res != SUCCESS ) DieWithErrorMsg( GetAndReplaceLangStr($content['LN_GEN_ERROR_REPORTGENFAILED'], $mySavedReport['customTitle'], GetErrorMessage($res)) ); else { // --- Perform report output // Init IncludePath $reportIncludePath = $myReportObj->GetReportIncludePath(); // Include Custom language file if available $myReportObj->InitReportLanguageFile($reportIncludePath); // Init template Parser $page = new Template(); $page -> set_path ( $reportIncludePath ); // Parse template $page -> parser($content, $myReportObj->GetBaseFileName()); // Output the result $res = $myReportObj->OutputReport( $page ->result(), $szErrorStr ); if ( $res == SUCCESS && $myReportObj->GetOutputTarget() != REPORT_TARGET_STDOUT ) { //Debug Output PrintHTMLDebugInfo( DEBUG_INFO, "RunReport", GetAndReplaceLangStr($content["LN_GEN_SUCCESS_REPORTWASGENERATED_DETAILS"], $szErrorStr) ); } else if ( $res == ERROR ) { // Debug Error PrintHTMLDebugInfo( DEBUG_ERROR, "RunReport", GetAndReplaceLangStr($content["LN_GEN_ERROR_REPORTFAILEDTOGENERATE"], $szErrorStr) ); } // --- } } } // --- // --- BEGIN Custom Code //Additional Includes include($gl_root_path . 'include/functions_debugoutput.php'); // Run into Commandline part now! /* Only run if we are in command line mode * * Possible Operation Types: * runreport = To create a report, use this operation type. * Sample 1: Run report from type "monilog" with savedreportid 3 * php cmdreportgen.php runreport monilog 3 * */ // Init DebugHeader PrintDebugInfoHeader(); // --- Now read command line args! // Operation argv if ( isset($_SERVER["argv"][1]) ) $operation = $_SERVER["argv"][1]; else DieWithErrorMsg( $content["LN_CMD_NOOP"] ); // SavedReportID argv if ( isset($_SERVER["argv"][2]) ) { // Set to SourceID property! $content['reportid'] = $_SERVER["argv"][2]; // Check if exists if ( !isset($content['REPORTS'][ $content['reportid'] ]) ) DieWithErrorMsg( GetAndReplaceLangStr($content["LN_CMD_REPORTIDNOTFOUND"], $content['reportid']) ); // Get Reference to report! $myReport = $content['REPORTS'][ $content['reportid'] ]; } else DieWithErrorMsg( $content["LN_CMD_NOREPORTID"] ); // SavedReportID argv if ( isset($_SERVER["argv"][3]) ) { // Set to SourceID property! $content['savedreportid'] = intval( $_SERVER["argv"][3] ); // Check if exists if ( !isset($myReport['SAVEDREPORTS'][ $content['savedreportid'] ]) ) DieWithErrorMsg( GetAndReplaceLangStr($content["LN_CMD_SAVEDREPORTIDNOTFOUND"], $content['savedreportid']) ); } else DieWithErrorMsg( $content["LN_CMD_NOSAVEDREPORTID"] ); // Run Optional Params first: userid/groupid if ( isset($_SERVER["argv"][4]) ) { // Set to SourceID property! $tmpvar = $_SERVER["argv"][4]; if ( strpos($tmpvar, "=") !== false ) { $tmparr = explode("=", $tmpvar); if ( $tmparr[0] == "userid" ) { // Set logged in state for LogAnalyzer System $_SESSION['SESSION_LOGGEDIN'] = true; $content['SESSION_LOGGEDIN'] = true; $_SESSION['SESSION_USERID'] = $tmparr[1]; $content['SESSION_USERID'] = $tmparr[1]; } else if ( $tmparr[0] == "groupid" ) { $_SESSION['SESSION_GROUPIDS'] = $tmparr[1]; $content['SESSION_GROUPIDS'] = $tmparr[1]; } } // Reload Configured Sources LoadSourcesFromDatabase(); InitSourceConfigs(); } // --- // --- Operation Handling now if ( $operation == "runreport" ) { // Create Report RunReport(); } // --- // --- ?>loganalyzer-4.1.5/src/cron/maintenance.bat000066400000000000000000000001041277740250400205550ustar00rootroot00000000000000 C:\php\php.exe -q -a .\maintenance.php cleardata 2 olderthan 86400 loganalyzer-4.1.5/src/cron/maintenance.php000066400000000000000000000162221277740250400206060ustar00rootroot00000000000000 This file is meant for command line maintenance * * All directives are explained within this file * * Copyright (C) 2008 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './../'; // Now include necessary include files! include_once($gl_root_path . 'include/functions_common.php'); include_once($gl_root_path . 'include/functions_frontendhelpers.php'); //include_once($gl_root_path . 'include/functions_debugoutput.php'); // Set commandline mode for the script define('IN_PHPLOGCON_COMMANDLINE', true); $content['IN_PHPLOGCON_COMMANDLINE'] = true; InitPhpLogCon(); LoadSourcesFromDatabase(true); // Make sure we load ALL sources from DB! InitSourceConfigs(); // Init admin langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/admin.php' ); // *** *** // // --- Helper functions /* * Cleans data in desired logstream */ function CleanData($optParam1, $optParam2, $optParam3, $optParam4) { global $content, $gl_root_path; // Get Source reference! $mySource = $content['Sources'][ $content['SOURCEID'] ]; // Check Source Type if ( $mySource['SourceType'] == SOURCE_DB || $mySource['SourceType'] == SOURCE_PDO ) { // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); //Debug Output PrintHTMLDebugInfo( DEBUG_INFO, "CleanData", GetAndReplaceLangStr($content["LN_CMD_CLEANINGDATAFOR"], $mySource['Name']) ); // Create LogStream Object $stream = $mySource['ObjRef']->LogStreamFactory($mySource['ObjRef']); $res = $stream->Verify(); if ( $res == SUCCESS ) { // Gather Database Stats $content['ROWCOUNT'] = $stream->GetLogStreamTotalRowCount(); if ( isset($content['ROWCOUNT']) ) { //Debug Output PrintHTMLDebugInfo( DEBUG_INFO, "CleanData", GetAndReplaceLangStr($content["LN_CMD_ROWSFOUND"], $content['ROWCOUNT'], $mySource['Name']) ); if ( $optParam1 != NULL ) { if ( $optParam1 == "all" ) { $timestamp = 0; } else if ( $optParam1 == "olderthan" && $optParam2 != NULL ) { // Take current time and subtract Seconds $nSecondsSubtract = intval($optParam2); $timestamp = time() - $nSecondsSubtract; } else if ( $optParam1 == "date" && $optParam2 != NULL && $optParam3 != NULL && $optParam4 != NULL ) { // Generate Timestamp $timestamp = mktime( 0, 0, 0, intval($optParam2), intval($optParam3), intval($optParam4) ); } else // Print error and die! DieWithErrorMsg( $content["LN_CMD_WRONGSUBOPORMISSING"] ); // Continue with delete only if $timestamp is set! if ( isset($timestamp) ) { //Debug Output PrintHTMLDebugInfo( DEBUG_INFO, "CleanData", GetAndReplaceLangStr($content["LN_CMD_DELETINGOLDERTHEN"], date("Y-m-d", $timestamp) ) ); // Now perform the data cleanup! $content['affectedrows'] = $stream->CleanupLogdataByDate($timestamp); if ( isset($content['affectedrows']) ) { //Debug Output PrintHTMLDebugInfo( DEBUG_INFO, "CleanData", GetAndReplaceLangStr($content["LN_CMD_DELETEDROWS"], $content['affectedrows']) ); } else // Print error and die! DieWithErrorMsg( GetAndReplaceLangStr($content["LN_CMD_FAILEDTOCLEANDATA"], $mySource['Name']) ); } } else // Print error and die! DieWithErrorMsg( $content["LN_CMD_SUBPARAM1MISSING"] ); } else // Print error and die! DieWithErrorMsg( GetAndReplaceLangStr($content["LN_CMD_COULDNOTGETROWCOUNT"], $mySource['Name']) ); } else { // Print error and die! $szErroMsg = GetAndReplaceLangStr($content["LN_SOURCES_ERROR_WITHINSOURCE"],$mySource['Name'], GetErrorMessage($res)); if ( isset($extraErrorDescription) ) $szErroMsg .= "\r\n\r\n" . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); DieWithErrorMsg( $szErroMsg ); } } else // Print error and die! DieWithErrorMsg( GetAndReplaceLangStr($content["LN_SOURCES_ERROR_NOCLEARSUPPORT"], $content['SOURCEID']) ); } // --- // --- BEGIN Custom Code //Additional Includes include($gl_root_path . 'include/functions_debugoutput.php'); // Run into Commandline part now! /* Only run if we are in command line mode * * Possible Operation Types: * cleandata = If you want to clear data from a logstream source, you can use the operation type. * Be carefull using this option, any deletion process cannot be undone! * Sample 1: Delete all data in the logstream with id 2 * php maintenance.php cleandata 2 all * Sample 2: Delete all data older then 60 seconds in the logstream with id 2 * php maintenance.php cleandata 2 olderthan 60 * Sample 3: Delete all data before 2008-11-18 in the logstream with id 2 * php maintenance.php cleandata 2 date 11 18 2008 * */ // Init DebugHeader PrintDebugInfoHeader(); // --- Now read command line args! // Operation argv if ( isset($_SERVER["argv"][1]) ) $operation = $_SERVER["argv"][1]; else DieWithErrorMsg( $content["LN_CMD_NOOP"] ); // SourceID argv if ( isset($_SERVER["argv"][2]) ) { // Set to SourceID property! $content['SOURCEID'] = $_SERVER["argv"][2]; // Check if exists if ( !isset($content['Sources'][ $content['SOURCEID'] ]) ) DieWithErrorMsg( GetAndReplaceLangStr($content["LN_CMD_LOGSTREAMNOTFOUND"], $content['SOURCEID']) ); } else DieWithErrorMsg( $content["LN_CMD_NOLOGSTREAM"] ); // First Optional Parameter if ( isset($_SERVER["argv"][3]) ) $optparam1 = $_SERVER["argv"][3]; else $optparam1 = NULL; // Second Optional Parameter if ( isset($_SERVER["argv"][4]) ) $optparam2 = $_SERVER["argv"][4]; else $optparam2 = NULL; // Third Optional Parameter if ( isset($_SERVER["argv"][5]) ) $optParam3 = $_SERVER["argv"][5]; else $optParam3 = NULL; // fourth Optional Parameter if ( isset($_SERVER["argv"][6]) ) $optParam4 = $_SERVER["argv"][6]; else $optParam4 = NULL; // --- // --- Operation Handling now if ( $operation == "cleandata" ) { // Run Parser only CleanData($optparam1, $optparam2, $optParam3, $optParam4); } // --- // --- ?>loganalyzer-4.1.5/src/cron/maintenance.sh000066400000000000000000000001311277740250400204210ustar00rootroot00000000000000#!/bin/sh cd /var/www/phplogcon/cron/ php ./maintenance.php cleandata 2 olderthan 86400 loganalyzer-4.1.5/src/css/000077500000000000000000000000001277740250400154375ustar00rootroot00000000000000loganalyzer-4.1.5/src/css/defaults.css000066400000000000000000000045101277740250400177600ustar00rootroot00000000000000/* Generic Style definitions */ .ExpansionPlus { background-image: url("../images/icons/navigate_plus.png"); background-repeat: no-repeat; background-position: left center; padding-left: 20px; } .ExpansionMinus { background-image: url("../images/icons/navigate_minus.png"); background-repeat: no-repeat; background-position: left center; padding-left: 20px; } .HiddenContent { visibility: hidden; /* position: relative; */ display: none; } .ShownContent { visibility: visible; display: inline; } .borderless { border:0px solid; background-color: transparent; } .borderlessbuttons { border:0px solid; background-color: transparent; width:20px; padding: 0px; } .inlinebutton { float:left; position: relative; border:0px solid; background-color: transparent; padding: 0px; margin: 0px; } .SelectSavedFilter { margin-top: 2px; border: 1px solid; border-color: #233B51 #124A7C #124A7C #233B51; } .syslogdetails, a.syslogdetails, a.syslogdetails:link, a.syslogdetails:active, a.syslogdetails:visited { font-weight:normal; text-decoration:none; position:relative; overflow:visible; } .syslogdetails { position:relative; overflow:visible; z-index:4; } .syslogdetails:hover { position:relative; /*this is the key*/ font-weight:normal; z-index:5; } .syslogdetails span { position:relative; overflow:visible; display: none; z-index:-1; } /*the span will display just on :hover state*/ .syslogdetails_popup span { display:block; position:absolute; overflow:auto; z-index:5; /* top:15px; */ /* left:15px; */ } .gridline { vertical-align: middle; height: 16px; } /* * POPUP Helper Styles */ .popupdetails { position: absolute; visibility: hidden; z-index:1 } .popupdetails:hover { position: absolute; visibility: hidden; z-index: 2; } .popupdetails_popup { position: absolute; visibility: visible; z-index: 2; } .maxwidth { width: 100%; } .ui-dialog .ui-dialog-content.ui-dialog-spinner{ background: url("../images/ajax-loader.gif") no-repeat scroll 30px 30px transparent; padding: 50px 0 0px 110px; border: 0px solid #999999; font-weight: bold; line-height: 1em; font-size: 1.3em; color: #737373; } loganalyzer-4.1.5/src/css/highlight.css000066400000000000000000000020101277740250400201110ustar00rootroot00000000000000/* Generic Style definitions */ .highlight_1 { color: #F61313; background-color: #FFFFFF; } .highlight_2 { color: #F66913; background-color: #FFFFFF; } .highlight_3 { color: #17911C; background-color: #FFFFFF; } .highlight_4 { color: #C01695; background-color: #FFFFFF; } .highlight_5 { color: #1D618B; background-color: #FFFFFF; } .highlight_6 { color: #6C9117; background-color: #FFFFFF; } .highlight_7 { color: #0F2B7F; background-color: #FFFFFF; } .highlight_8 { color: #541791; background-color: #FFFFFF; } .highlight_9 { color: #146043; background-color: #FFFFFF; } .highlight_10 { color: #FF5451; background-color: #333333; } .highlight_11 { color: #F8C858; background-color: #333333; } .highlight_12 { color: #FCFF84; background-color: #333333; } .highlight_13 { color: #CEF07A; background-color: #333333; } .highlight_14 { color: #7AF0C2; background-color: #333333; } .highlight_15 { color: #84AFFF; background-color: #333333; } .highlight_16 { color: #A684FF; background-color: #333333; } loganalyzer-4.1.5/src/css/jquery-ui-structure.css000066400000000000000000000432451277740250400221510ustar00rootroot00000000000000/*! * jQuery UI CSS Framework 1.11.1 * http://jqueryui.com * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/category/theming/ */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; } .ui-helper-clearfix:after { clear: both; } .ui-helper-clearfix { min-height: 0; /* support: IE7 */ } .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); /* support: IE8 */ } .ui-front { z-index: 100; } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .ui-draggable-handle { -ms-touch-action: none; touch-action: none; } .ui-resizable { position: relative; } .ui-resizable-handle { position: absolute; font-size: 0.1px; display: block; -ms-touch-action: none; touch-action: none; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px; } .ui-selectable { -ms-touch-action: none; touch-action: none; } .ui-selectable-helper { position: absolute; z-index: 100; border: 1px dotted black; } .ui-sortable-handle { -ms-touch-action: none; touch-action: none; } .ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin: 2px 0 0 0; padding: .5em .5em .5em .7em; min-height: 0; /* support: IE7 */ font-size: 100%; } .ui-accordion .ui-accordion-icons { padding-left: 2.2em; } .ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; } .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; } .ui-button { display: inline-block; position: relative; padding: 0; line-height: normal; margin-right: .1em; cursor: pointer; vertical-align: middle; text-align: center; overflow: visible; /* removes extra width in IE */ } .ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; } /* to make room for the icon, a width needs to be set here */ .ui-button-icon-only { width: 2.2em; } /* button elements seem to need a little more width */ button.ui-button-icon-only { width: 2.4em; } .ui-button-icons-only { width: 3.4em; } button.ui-button-icons-only { width: 3.7em; } /* button text element */ .ui-button .ui-button-text { display: block; line-height: normal; } .ui-button-text-only .ui-button-text { padding: .1em 0.5em; } .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } /* no icon support for input elements, provide padding by default */ input.ui-button { padding: .4em 1em; } /* button icon element(s) */ .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } /* button sets */ .ui-buttonset { margin-right: 7px; } .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } /* workarounds */ /* reset extra padding in Firefox, see h5bp.com/l */ input.ui-button::-moz-focus-inner, button.ui-button::-moz-focus-inner { border: 0; padding: 0; } .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position: relative; padding: .2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position: absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left: 2px; } .ui-datepicker .ui-datepicker-next { right: 2px; } .ui-datepicker .ui-datepicker-prev-hover { left: 1px; } .ui-datepicker .ui-datepicker-next-hover { right: 1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size: 1em; margin: 1px 0; } .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 45%; } .ui-datepicker table { width: 100%; font-size: .9em; border-collapse: collapse; margin: 0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding: 0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width: auto; overflow: visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float: left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width: auto; } .ui-datepicker-multi .ui-datepicker-group { float: left; } .ui-datepicker-multi .ui-datepicker-group table { width: 95%; margin: 0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width: 50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width: 33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width: 25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width: 0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear: left; } .ui-datepicker-row-break { clear: both; width: 100%; font-size: 0; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear: right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, .ui-datepicker-rtl .ui-datepicker-group { float: right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0; border-left-width: 1px; } .ui-dialog { overflow: hidden; position: absolute; top: 0; left: 0; padding: .2em; outline: 0; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0; white-space: nowrap; width: 90%; overflow: hidden; text-overflow: ellipsis; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 20px; margin: -10px 0 0 0; padding: 1px; height: 20px; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin-top: .5em; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-se { width: 12px; height: 12px; right: -5px; bottom: -5px; background-position: 16px 16px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } .ui-menu { list-style: none; padding: 0; margin: 0; display: block; outline: none; } .ui-menu .ui-menu { position: absolute; } .ui-menu .ui-menu-item { position: relative; margin: 0; padding: 3px 1em 3px .4em; cursor: pointer; min-height: 0; /* support: IE7 */ /* support: IE10, see #8844 */ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); } .ui-menu .ui-menu-divider { margin: 5px 0; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { margin: -1px; } /* icon support */ .ui-menu-icons { position: relative; } .ui-menu-icons .ui-menu-item { padding-left: 2em; } /* left-aligned */ .ui-menu .ui-icon { position: absolute; top: 0; bottom: 0; left: .2em; margin: auto 0; } /* right-aligned */ .ui-menu .ui-menu-icon { left: auto; right: 0; } .ui-progressbar { height: 2em; text-align: left; overflow: hidden; } .ui-progressbar .ui-progressbar-value { margin: -1px; height: 100%; } .ui-progressbar .ui-progressbar-overlay { background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); height: 100%; filter: alpha(opacity=25); /* support: IE8 */ opacity: 0.25; } .ui-progressbar-indeterminate .ui-progressbar-value { background-image: none; } .ui-selectmenu-menu { padding: 0; margin: 0; position: absolute; top: 0; left: 0; display: none; } .ui-selectmenu-menu .ui-menu { overflow: auto; /* Support: IE7 */ overflow-x: hidden; padding-bottom: 1px; } .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { font-size: 1em; font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; height: auto; border: 0; } .ui-selectmenu-open { display: block; } .ui-selectmenu-button { display: inline-block; overflow: hidden; position: relative; text-decoration: none; cursor: pointer; } .ui-selectmenu-button span.ui-icon { right: 0.5em; left: auto; margin-top: -8px; position: absolute; top: 50%; } .ui-selectmenu-button span.ui-selectmenu-text { text-align: left; padding: 0.4em 2.1em 0.4em 1em; display: block; line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; -ms-touch-action: none; touch-action: none; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } /* support: IE8 - See #6727 */ .ui-slider.ui-state-disabled .ui-slider-handle, .ui-slider.ui-state-disabled .ui-slider-range { filter: inherit; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; } .ui-spinner { position: relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } .ui-spinner-input { border: none; background: none; color: inherit; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; } .ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } /* more specificity required here to override default borders */ .ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* vertically center icon */ .ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } .ui-spinner-up { top: 0; } .ui-spinner-down { bottom: 0; } /* TR overrides */ .ui-spinner .ui-icon-triangle-1-s { /* need to fix icons sprite */ background-position: -65px -16px; } .ui-tabs { position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ padding: .2em; } .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom-width: 0; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav .ui-tabs-anchor { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { cursor: text; } .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { cursor: pointer; } .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tooltip { padding: 8px; position: absolute; z-index: 9999; max-width: 300px; -webkit-box-shadow: 0 0 5px #aaa; box-shadow: 0 0 5px #aaa; } body .ui-tooltip { border-width: 2px; } /* Custom CSS added by AL */ .ui-button img { margin:0px; } loganalyzer-4.1.5/src/css/menu.css000066400000000000000000000022601277740250400171150ustar00rootroot00000000000000 #menu { z-index: 10; /* width: 16px; /* set width of menu */ } #menu ul { /* remove bullets and list indents */ z-index: 10; position: relative; /* position: absolute;*/ display: block; list-style: none; white-space:nowrap; margin: 0; padding: 0; vertical-align: text-top; } /* style, color and size links and headings to suit */ #menu a, #menu h2 { display: block; margin: 0px; padding: 1px 1px; } #menu h2 { /* font-size: 10px; */ font-weight: bold; text-align: center; } #menu a { text-decoration: none; } #menu a:hover { text-decoration: none; } #menu li { text-align: left; /* make the list elements a containing block for the nested lists */ position: relative; } #menu ul li ul li { border-width: 1px; border-style: solid; border-color: #44617D #203040 #203040 #44617D; } #menu ul ul { z-index: 2; white-space: nowrap; position: absolute; top: 12px; /*14px; */ left: 0px; /* to position them to the right of their containing block */ width: auto; min-width: 250px; /* workaround for FF */ height: 16px; } div#menu ul ul, div#menu ul li:hover ul ul { display: none; } div#menu ul li:hover ul, div#menu ul ul li:hover ul { display: block; } loganalyzer-4.1.5/src/details.php000066400000000000000000000407621277740250400170160ustar00rootroot00000000000000 Shows all possible details of a syslog message * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // --- // --- Define Extra Stylesheet! //$content['EXTRA_STYLESHEET'] = '' . "\r\n"; //$content['EXTRA_STYLESHEET'] .= ''; // --- // --- CONTENT Vars if ( isset($_GET['uid']) ) { // Now check by numeric as uid can be larger than INT values if ( is_numeric($_GET['uid']) ) $content['uid_current'] = $_GET['uid']; else $content['uid_current'] = UID_UNKNOWN; } else $content['uid_current'] = UID_UNKNOWN; // Helper variable to decide if header and footer has to be included $content['layout'] = "full"; if ( isset($_GET['layout']) ) { if ( $_GET['layout'] == "naked" ) $content['layout'] = "naked"; } // Copy UID for later use ... $content['uid_fromgetrequest'] = $content['uid_current']; // Init Pager variables $content['uid_previous'] = UID_UNKNOWN; $content['uid_next'] = UID_UNKNOWN; $content['uid_first'] = UID_UNKNOWN; $content['uid_last'] = UID_UNKNOWN; $content['main_pagerenabled'] = false; $content['main_pager_first_found'] = false; $content['main_pager_previous_found'] = false; $content['main_pager_next_found'] = false; $content['main_pager_last_found'] = false; // --- // --- If set read direction property! // Set direction default $content['read_direction'] = EnumReadDirection::Backward; if ( isset($_GET['direction']) ) { if ( $_GET['direction'] == "next" ) { $content['skiprecords'] = 1; $content['read_direction'] = EnumReadDirection::Backward; } else if ( $_GET['direction'] == "previous" ) { $content['skiprecords'] = 1; $content['read_direction'] = EnumReadDirection::Forward; } else if ( $_GET['direction'] == "desc" ) { $content['read_direction'] = EnumReadDirection::Forward; } } // Read filter property in if ( isset($_POST['filter']) ) $myfilter = $_POST['filter']; else if ( isset($_GET['filter']) ) $myfilter = $_GET['filter']; else $myfilter = ""; // --- // Init Sorting variables $content['sorting'] = ""; $content['searchstr'] = $myfilter; $content['highlightstr'] = ""; $content['EXPAND_HIGHLIGHT'] = "false"; // --- BEGIN Custom Code if ( isset($content['Sources'][$currentSourceID]) ) // && $content['uid_current'] != UID_UNKNOWN ) // && $content['Sources'][$currentSourceID]['SourceType'] == SOURCE_DISK ) { // Obtain and get the Config Object $stream_config = $content['Sources'][$currentSourceID]['ObjRef']; // Create LogStream Object $stream = $stream_config->LogStreamFactory($stream_config); $stream->SetFilter($content['searchstr']); // --- Init the fields we need foreach($fields as $mycolkey => $myfield) { $content['fields'][$mycolkey]['FieldID'] = $mycolkey; $content['fields'][$mycolkey]['FieldCaption'] = $myfield['FieldCaption']; $content['fields'][$mycolkey]['FieldType'] = $myfield['FieldType']; $content['fields'][$mycolkey]['DefaultWidth'] = $myfield['DefaultWidth']; // Append to columns array $content['AllColumns'][] = $mycolkey; } // --- $res = $stream->Open( $content['AllColumns'], true ); if ( $res == SUCCESS ) { // Set Read direction $stream->SetReadDirection($content['read_direction']); // Set current ID and init Counter $uID = $content['uid_current']; if ( $uID != UID_UNKNOWN ) // We know the UID, so read from where we know $ret = $stream->Read($uID, $logArray); else // Unknown UID, so we start from first! $ret = $stream->ReadNext($uID, $logArray); // --- If set we move forward / backward! if ( isset($content['skiprecords']) && $content['skiprecords'] >= 1 ) { $counter = 0; while( $counter < $content['skiprecords'] && ($ret = $stream->ReadNext($uID, $logArray)) == SUCCESS) { // Increment Counter $counter++; } } // --- // Set new current uid! if ( isset($uID) && $uID != UID_UNKNOWN ) $content['uid_current'] = $uID; // now we know enough to set the page title! $content['TITLE'] = "LogAnalyzer :: " . $content['LN_DETAILS_DETAILSFORMSG'] . " '" . $uID . "'"; // We found matching records, so continue if ( $ret == SUCCESS ) { // --- PreChecks to be done // Set Record Count $content['main_recordcount'] = $stream->GetMessageCount(); if ( $content['main_recordcount'] != -1 ) $content['main_recordcount_found'] = true; else $content['main_recordcount_found'] = false; // --- // Loop through fields - Copy value into fields list! We are going to use this list here $counter = 0; foreach($content['fields'] as $mycolkey => $myfield) { if ( isset($logArray[$mycolkey]) && ( is_array($logArray[$mycolkey]) || (is_string($logArray[$mycolkey]) && strlen($logArray[$mycolkey]) > 0)) || (is_numeric($logArray[$mycolkey])) ) { $content['fields'][$mycolkey]['fieldenabled'] = true; // // Default copy value into array! // $content['fields'][$mycolkey]['FieldValue'] = $logArray[$mycolkey]; // --- Set CSS Class if ( $counter % 2 == 0 ) { $content['fields'][$mycolkey]['cssclass'] = "line1"; $content['fields'][$mycolkey]['cssclassfont'] = "line1"; } else { $content['fields'][$mycolkey]['cssclass'] = "line2"; $content['fields'][$mycolkey]['cssclassfont'] = "line2"; } if ( $mycolkey == SYSLOG_MESSAGE ) $content['fields'][$mycolkey]['menucssclass'] = "cellmenu1_naked"; else $content['fields'][$mycolkey]['menucssclass'] = "cellmenu1"; // --- // Set defaults $content['fields'][$mycolkey]['fieldbgcolor'] = ""; $content['fields'][$mycolkey]['hasdetails'] = "false"; if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_DATE ) { $content['fields'][$mycolkey]['fieldvalue'] = GetFormatedDate($logArray[$mycolkey]); // TODO: Show more! } else if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_NUMBER ) { $content['fields'][$mycolkey]['fieldvalue'] = $logArray[$mycolkey]; // Special style classes and colours for SYSLOG_FACILITY if ( $mycolkey == SYSLOG_FACILITY ) { // if ( isset($logArray[$mycolkey][SYSLOG_FACILITY]) && strlen($logArray[$mycolkey][SYSLOG_FACILITY]) > 0) if ( isset($logArray[$mycolkey]) && is_numeric($logArray[$mycolkey]) ) { $content['fields'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $facility_colors[ $logArray[SYSLOG_FACILITY] ] . '" '; $content['fields'][$mycolkey]['cssclass'] = "lineColouredBlack"; // Set Human readable Facility! $content['fields'][$mycolkey]['fieldvalue'] = GetFacilityDisplayName( $logArray[$mycolkey] ); } else { // Use default colour! $content['fields'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $facility_colors[SYSLOG_LOCAL0] . '" '; } } else if ( $mycolkey == SYSLOG_SEVERITY ) { // if ( isset($logArray[$mycolkey][SYSLOG_SEVERITY]) && strlen($logArray[$mycolkey][SYSLOG_SEVERITY]) > 0) if ( isset($logArray[$mycolkey]) && is_numeric($logArray[$mycolkey]) ) { $content['fields'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $severity_colors[ $logArray[SYSLOG_SEVERITY] ] . '" '; $content['fields'][$mycolkey]['cssclass'] = "lineColouredWhite"; // Set Human readable Facility! $content['fields'][$mycolkey]['fieldvalue'] = GetSeverityDisplayName( $logArray[$mycolkey] ); } else { // Use default colour! $content['fields'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $severity_colors[SYSLOG_INFO] . '" '; } } else if ( $mycolkey == SYSLOG_MESSAGETYPE ) { // if ( isset($logArray[$mycolkey][SYSLOG_MESSAGETYPE]) ) if ( isset($logArray[$mycolkey]) && is_numeric($logArray[$mycolkey]) ) { $content['fields'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $msgtype_colors[ $logArray[SYSLOG_MESSAGETYPE] ] . '" '; $content['fields'][$mycolkey]['cssclass'] = "lineColouredBlack"; // Set Human readable Facility! $content['fields'][$mycolkey]['fieldvalue'] = GetMessageTypeDisplayName( $logArray[$mycolkey] ); } else { // Use default colour! $content['fields'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $msgtype_colors[IUT_Unknown] . '" '; } } } else if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_STRING ) { if ( $mycolkey == SYSLOG_MESSAGE ) $content['fields'][$mycolkey]['fieldvalue'] = ReplaceLineBreaksInString( GetStringWithHTMLCodes($logArray[$mycolkey]) ); else // kindly copy! $content['fields'][$mycolkey]['fieldvalue'] = ReplaceLineBreaksInString( GetStringWithHTMLCodes($logArray[$mycolkey]) ); // --- HOOK here to add context links! AddContextLinks($content['fields'][$mycolkey]['fieldvalue']); // --- } // Increment helpcounter $counter++; } else $content['fields'][$mycolkey]['fieldenabled'] = false; } // --- Now Check for dynamic fields! $counter = 0; foreach($logArray as $mydynkey => $mydynvalue) { // Check if field is already in fields array if ( !isset($content['fields'][$mydynkey]) && isset($mydynvalue) && strlen($mydynvalue) > 0 ) { $content['dynamicfields'][$mydynkey]['dynfieldkey'] = $mydynkey; $content['dynamicfields'][$mydynkey]['dynfieldvalue'] = $mydynvalue; // --- Set CSS Class if ( $counter % 2 == 0 ) $content['dynamicfields'][$mydynkey]['dyncssclass'] = "line1"; else $content['dynamicfields'][$mydynkey]['dyncssclass'] = "line2"; // --- // Increment helpcounter $counter++; } } // Enable dynamic Fields if ( isset($content['dynamicfields']) ) $content['dynamicfieldsenabled'] = "true"; // --- // echo "
    ";
    //	var_dump($content['dynamicfields']);
    //	echo "
    "; // Enable pager if the count is above 1 or we don't know the record count! if ( $content['main_recordcount'] > 1 || $content['main_recordcount'] == -1 ) { // Enable Pager in any case here! $content['main_pagerenabled'] = true; // --- Handle uid_first page button if ( $content['uid_fromgetrequest'] == $content['uid_first'] && $content['read_direction'] != EnumReadDirection::Forward ) $content['main_pager_first_found'] = false; else { // Probe next item ! $ret = $stream->ReadNext($uID, $tmpArray); if ( $content['read_direction'] == EnumReadDirection::Backward ) { if ( $content['uid_fromgetrequest'] != UID_UNKNOWN ) $content['main_pager_first_found'] = true; else $content['main_pager_first_found'] = false; } else { if ( $ret == SUCCESS && $uID != $content['uid_fromgetrequest']) $content['main_pager_first_found'] = true; else $content['main_pager_first_found'] = false; } } // --- // --- Handle uid_last page button if ( $content['uid_fromgetrequest'] == $content['uid_last'] && $content['read_direction'] != EnumReadDirection::Backward ) $content['main_pager_last_found'] = false; else { // Probe next item ! $ret = $stream->ReadNext($uID, $tmpArray); if ( $content['read_direction'] == EnumReadDirection::Forward ) { if ( $ret != SUCCESS || $uID != $content['uid_current'] ) $content['main_pager_last_found'] = true; else $content['main_pager_last_found'] = false; } else { if ( $ret == SUCCESS && $uID != $content['uid_current'] ) $content['main_pager_last_found'] = true; else $content['main_pager_last_found'] = false; } } // --- // --- Handle uid_last page button // Option the last UID from the stream! // $content['uid_last'] = $stream->GetLastPageUID(); // $content['uid_first'] = $stream->GetFirstPageUID(); // --- Handle uid_first and uid_previousbutton if ( $content['uid_current'] == $content['uid_first'] || !$content['main_pager_first_found'] ) { $content['main_pager_first_found'] = false; $content['main_pager_previous_found'] = false; } else { $content['main_pager_first_found'] = true; $content['main_pager_previous_found'] = true; } // --- // --- Handle uid_next and uid_last button if ( /*$content['uid_current'] == $content['uid_last'] ||*/ !$content['main_pager_last_found'] ) { $content['main_pager_next_found'] = false; $content['main_pager_last_found'] = false; } else { $content['main_pager_next_found'] = true; $content['main_pager_last_found'] = true; } // --- } else // Disable pager in this case! $content['main_pagerenabled'] = false; // This will enable to Main SyslogView $content['messageenabled'] = "true"; } else { // Disable view and print error state! $content['messageenabled'] = "false"; // Set error code $content['error_code'] = $ret; if ( $ret == ERROR_UNDEFINED ) $content['detailederror'] = "Undefined error happened within the logstream."; else $content['detailederror'] = "Unknown or unhandeled error occured."; // Add extra error stuff if ( isset($extraErrorDescription) ) $content['detailederror'] .= "

    " . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } } else { // This will disable to Main SyslogView and show an error message $content['messageenabled'] = "false"; // Set error code $content['error_code'] = $ret; if ( $ret == ERROR_FILE_NOT_FOUND ) $content['detailederror'] = $content['LN_ERROR_FILE_NOT_FOUND']; else if ( $ret == ERROR_FILE_NOT_READABLE ) $content['detailederror'] = $content['LN_ERROR_FILE_NOT_READABLE']; else $content['detailederror'] = $content['LN_ERROR_UNKNOWN']; } // Close file! $stream->Close(); } // --- // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); if ( $content['messageenabled'] == "true" ) { // Append custom title part! $content['TITLE'] .= " :: Details for '" . $content['uid_current'] . "'"; } else { // APpend to title Page title $content['TITLE'] .= " :: Unknown uid"; } // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "details.html"); $page -> output(); // --- ?>loganalyzer-4.1.5/src/export.php000066400000000000000000000307141277740250400167060ustar00rootroot00000000000000 Exports data from a search and site into a data format * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // --- // --- READ CONTENT Vars if ( isset($_GET['uid']) ) $content['uid_current'] = intval($_GET['uid']); else $content['uid_current'] = UID_UNKNOWN; // Read direction parameter if ( isset($_GET['direction']) && $_GET['direction'] == "desc" ) $content['read_direction'] = EnumReadDirection::Forward; else $content['read_direction'] = EnumReadDirection::Backward; // If direction is DESC, should we SKIP one? if ( isset($_GET['skipone']) && $_GET['skipone'] == "true" ) $content['skipone'] = true; else $content['skipone'] = false; // Init variables $content['searchstr'] = ""; $content['error_occured'] = false; // Check required input parameters if ( (isset($_GET['op']) && $_GET['op'] == "export") && (isset($_GET['exporttype']) && array_key_exists($_GET['exporttype'], $content['EXPORTTYPES'])) ) { $content['exportformat'] = $_GET['exporttype']; /* // Check for extensions if ( $content['exportformat'] == EXPORT_PDF && !$content['PDF_IS_ENABLED'] ) { $content['error_occured'] = true; $content['error_details'] = $content['LN_GEN_ERROR_PDFMISSINGEXTENSION']; } */ } else { $content['error_occured'] = true; $content['error_details'] = $content['LN_GEN_ERROR_INVALIDEXPORTTYPE']; } // --- // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); // Append custom title part! if ( isset($content['searchstr']) && strlen($content['searchstr']) > 0 ) $content['TITLE'] .= " :: Results for the search '" . $content['searchstr'] . "'"; // Append search else $content['TITLE'] .= " :: Syslogmessages"; // --- END CREATE TITLE // --- Read and process filters from search dialog! if ( (isset($_POST['search']) || isset($_GET['search'])) || (isset($_POST['filter']) || isset($_GET['filter'])) ) { // Copy search over if ( isset($_POST['search']) ) $mysearch = $_POST['search']; else if ( isset($_GET['search']) ) $mysearch = $_GET['search']; if ( isset($_POST['filter']) ) $myfilter = $_POST['filter']; else if ( isset($_GET['filter']) ) $myfilter = $_GET['filter']; // Message is just appended if ( isset($myfilter) && strlen($myfilter) > 0 ) $content['searchstr'] = $myfilter; } // --- // --- BEGIN Custom Code if ( !$content['error_occured'] ) { if ( isset($content['Sources'][$currentSourceID]) ) { // Obtain and get the Config Object $stream_config = $content['Sources'][$currentSourceID]['ObjRef']; // Create LogStream Object $stream = $stream_config->LogStreamFactory($stream_config); $stream->SetFilter($content['searchstr']); // Copy current used columns here! $content['Columns'] = $content['Views'][$currentViewID]['Columns']; // --- Init the fields we need foreach($content['Columns'] as $mycolkey) { if ( isset($fields[$mycolkey]) ) { $content['fields'][$mycolkey]['FieldID'] = $mycolkey; $content['fields'][$mycolkey]['FieldCaption'] = $fields[$mycolkey]['FieldCaption']; $content['fields'][$mycolkey]['FieldType'] = $fields[$mycolkey]['FieldType']; $content['fields'][$mycolkey]['DefaultWidth'] = $fields[$mycolkey]['DefaultWidth']; } } // --- $res = $stream->Open( $content['Columns'], true ); if ( $res == SUCCESS ) { // TODO Implement ORDER $stream->SetReadDirection($content['read_direction']); // Set current ID and init Counter $uID = $content['uid_current']; $counter = 0; // If uID is known, we need to init READ first - this will also seek for available records first! if ($uID != UID_UNKNOWN) { // First read will also set the start position of the Stream! $ret = $stream->Read($uID, $logArray); } else $ret = $stream->ReadNext($uID, $logArray); // --- Check if Read was successfull! if ( $ret == SUCCESS ) { // If Forward direction is used, we need to SKIP one entry! if ( $content['read_direction'] == EnumReadDirection::Forward ) { if ( $content['skipone'] ) { // Skip this entry and move to the next $stream->ReadNext($uID, $logArray); } } } else { // This will disable to Main SyslogView and show an error message $content['error_occured'] = true; $content['error_details'] = $content['LN_ERROR_NORECORDS']; } // --- // We found matching records, so continue if ( $ret == SUCCESS ) { //Loop through the messages! do { // --- Extra stuff for suppressing messages if ( GetConfigSetting("SuppressDuplicatedMessages", 0, CFGLEVEL_USER) == 1 && isset($logArray[SYSLOG_MESSAGE]) ) { if ( !isset($szLastMessage) ) // Only set lastmgr $szLastMessage = $logArray[SYSLOG_MESSAGE]; else { // Skip if same msg if ( $szLastMessage == $logArray[SYSLOG_MESSAGE] ) { // Set last mgr $szLastMessage = $logArray[SYSLOG_MESSAGE]; // Skip entry continue; } } } // --- // --- Now we populate the values array! foreach($content['Columns'] as $mycolkey) { if ( isset($fields[$mycolkey]) && isset($logArray[$mycolkey]) ) { // Set defaults $content['syslogmessages'][$counter][$mycolkey]['FieldColumn'] = $mycolkey; $content['syslogmessages'][$counter][$mycolkey]['uid'] = $uID; // Copy value as it is first! $content['syslogmessages'][$counter][$mycolkey]['fieldvalue'] = $logArray[$mycolkey]; // Now handle fields types differently if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_DATE ) { $content['syslogmessages'][$counter][$mycolkey]['fieldvalue'] = GetFormatedDate($logArray[$mycolkey]); } else if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_NUMBER ) { // Special style classes and colours for SYSLOG_FACILITY if ( $mycolkey == SYSLOG_FACILITY ) { if ( isset($logArray[$mycolkey][SYSLOG_FACILITY]) && strlen($logArray[$mycolkey][SYSLOG_FACILITY]) > 0) { // Set Human readable Facility! $content['syslogmessages'][$counter][$mycolkey]['fieldvalue'] = GetFacilityDisplayName( $logArray[$mycolkey] ); } } else if ( $mycolkey == SYSLOG_SEVERITY ) { if ( isset($logArray[$mycolkey][SYSLOG_SEVERITY]) && strlen($logArray[$mycolkey][SYSLOG_SEVERITY]) > 0) { // Set Human readable Facility! $content['syslogmessages'][$counter][$mycolkey]['fieldvalue'] = GetSeverityDisplayName( $logArray[$mycolkey] ); } } else if ( $mycolkey == SYSLOG_MESSAGETYPE ) { if ( isset($logArray[$mycolkey][SYSLOG_MESSAGETYPE]) ) { // Set Human readable Facility! $content['syslogmessages'][$counter][$mycolkey]['fieldvalue'] = GetMessageTypeDisplayName( $logArray[$mycolkey] ); } } } /* else if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_STRING ) { } */ } } // --- // Increment Counter $counter++; } while ($counter < $content['CurrentViewEntriesPerPage'] && ($ret = $stream->ReadNext($uID, $logArray)) == SUCCESS); if ( $content['read_direction'] == EnumReadDirection::Forward ) { // Back Button was clicked, so we need to flip the array $content['syslogmessages'] = array_reverse ( $content['syslogmessages'] ); } // DEBUG //print_r ( $content['syslogmessages'] ); } } else { // This will disable to Main SyslogView and show an error message $content['error_occured'] = true; $content['error_details'] = GetErrorMessage($res); if ( isset($extraErrorDescription) ) $content['error_details'] .= "

    " . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // Close file! $stream->Close(); } else { $content['error_occured'] = true; $content['error_details'] = GetAndReplaceLangStr( $content['LN_GEN_ERROR_SOURCENOTFOUND'], $currentSourceID); } } // --- // --- Convert and Output if ( $content['error_occured'] ) { InitTemplateParser(); $page -> parser($content, "export.html"); $page -> output(); } else { // Create a CVS File! $szOutputContent = ""; $szOutputMimeType = "text/plain"; $szOutputCharset = ""; $szOutputFileName = "ExportMessages"; $szOutputFileExtension = ".txt"; if ( $content['exportformat'] == EXPORT_CVS ) { // Set MIME TYPE and File Extension $szOutputMimeType = "text/csv"; $szOutputFileExtension = ".csv"; // Set Column line in cvs file! foreach($content['Columns'] as $mycolkey) { if ( isset($fields[$mycolkey]) ) { // Prepend Comma if needed if (strlen($szOutputContent) > 0) $szOutputContent .= ","; // Append column name $szOutputContent .= $fields[$mycolkey]['FieldCaption']; } } // Append line break $szOutputContent .= "\n"; // Append messages into output foreach ( $content['syslogmessages'] as $myIndex => $mySyslogMessage ) { $szLine = ""; // --- Process columns foreach($mySyslogMessage as $myColkey => $mySyslogField) { // Prepend Comma if needed if (strlen($szLine) > 0) $szLine .= ","; // Append field contents $szLine .= '"' . str_replace('"', '\\"', $mySyslogField['fieldvalue']) . '"'; } // --- // Append line! $szOutputContent .= $szLine . "\n"; } } else if ( $content['exportformat'] == EXPORT_XML ) { // Set MIME TYPE and File Extension $szOutputMimeType = "application/xml"; $szOutputFileExtension = ".xml"; $szOutputCharset = "charset=UTF-8"; // Create XML Header and first node!! $szOutputContent .= "\xef\xbb\xbf"; $szOutputContent .= "\n"; $szOutputContent .= "\n"; // Append messages into output foreach ( $content['syslogmessages'] as $myIndex => $mySyslogMessage ) { $szXmlLine = "\t\n"; // --- Process columns foreach($mySyslogMessage as $myColkey => $mySyslogField) { // Append field content | first run htmlentities,tnen utf8 encoding!! $szXmlLine .= "\t\t<" . $myColkey . ">" . utf8_encode( htmlentities($mySyslogField['fieldvalue']) ) . "\n"; } // --- $szXmlLine .= "\t\n"; // Append line! $szOutputContent .= $szXmlLine; } // End first XML Node $szOutputContent .= ""; } // Set needed Header properties header('Content-type: ' . $szOutputMimeType . "; " . $szOutputCharset); header("Content-Length: " . strlen($szOutputContent) ); header('Content-Disposition: attachment; filename="' . $szOutputFileName . $szOutputFileExtension . '"'); // Output Content! print( $szOutputContent ); } // --- ?>loganalyzer-4.1.5/src/favicon.ico000066400000000000000000000021761277740250400167760ustar00rootroot00000000000000 h(  |XA<|XAww|XA:|XA|[E}zu{{zxo||U=wtH.{q^Wz{zz{{{kWD|P7{p]I{{{z{{z{{o\4{zz{{r_{ra{zz{|lXVzz{{V?|XA|XA{U>{zz|M4A|XAx|XAh{tb{{{t|XA|XA||W@|XA{{{{{gS|XA^|XAT{kzz{{XA|W@|XA{W@{zz{|j[|XA|;6z{z|Q8{W@{W@|R;z{z|!{z{z{{z{z{|n[|Q8 {z{{{{z{|A& |ZD|V?|N4 {~zzzz{{|8 |X@} |M4c|F,J~|T<|XA;|XA|XA4|XAloganalyzer-4.1.5/src/images/000077500000000000000000000000001277740250400161145ustar00rootroot00000000000000loganalyzer-4.1.5/src/images/ajax-loader.gif000066400000000000000000000145361277740250400210030ustar00rootroot00000000000000GIF89a22! NETSCAPE2.0!Created with ajaxload.info! ,220I8%+[ B (*BW1-n2; ߐWB 8 fVپdL=uƴz;SAy&s} `{K ^j8TM1&B+V8; jsK˵ۚᆟ٢TT5^Z#‡#JHEk ! ,220I8a B " L h$3@h|ѱz+ ;KS2Ʈs- I@u[Nx)p@E5<)&1URG3rg$t ~ i]MBeOu=drjI;Ruh jhG(*hGށSh^  ̸k[: +RdhNh,x,E1,T>-`Mry?3#oD^Ur,*rr t xy:LC*G>.dsZMQhhMj #^XTP-1J).eJk H*\ȰÇ#JHŋ3j1a! ,220I8`crqp*gX҂9E=A;h >R֩ !ɉ͜_PXIWvM$@5P0Q{`oI15*y {}`ogWvR_s/G? KXvp0e1e ʲ #sTJqѯpU *2ipC멮 H*\ȰÇ#JHŋ3jȱǃ ! ,220I8EKqD^ t!qi` 0 00/p+Ng@ SR{3A&&& T8c÷Y-N!u xB;-/2*N@uv Q$~*rYTjgT.J6RjJ+8z "GP1 jX/]CO\Ѫr:P HA ! ,220I8eKqx AF^.P+$&wZq|2`n/W֌A | \\ȋ@d. =Fxa ) cecV3y+gHoe\NqpzKc# o6o*/4/\Hiid0t15(te ҝ2iҜL`\ H*\ȰÇ! ,220I8U)E$ tTA.Cqs?0/b ~6aF$Mߋl Dy5)]eoQn G.pZ|oT3Ax =]@S>.6G=è$EM1\٫|=ͻ>(X5Ԕܮ˴5"*\ȰÇ#K! ,220I8U)hhVFZ-1P>bl I8\H/5ϨCY,i 2u_q +p@v^yn<#Og}\nmc x cр)#%  ـ$y2P0e 4Hŋ! ,220I8ͻU`1yɸlkOa,-;E'ΐIru: gim407*&7gV|чz tH5wq\V}7ox79a_L1s,sB,#aQATD07+5Ś!: ʬm]I䚜ݛӽ|f|ᒽC"7:( ! ,220I8ͻ`(dVi̴c62 BXx˅ ' ibYC~ tjc6Z} W`z|#bC$W6b"Q>o{1x(o- Z%s%6 $1 ;) d&ܓ(Ѭ >Ԕ9-h107L-':RI! ,220I8ͻ`(dihl+ѵv20`$Q($25+zTL`P9@`ra2 p{ Vs!SMk'z5u&9h!"z "Sso~lj~$ˣv%5ʙl$ Ɨ ) (9hjޛv u>lFY 54)hH"a"J<! ,220I8ͻ`(dihlp,xm+y= dR:*̢ P`e0n !5K "@8 d]~k4v#_:}4d|xZ\} dgLbtTo$<\pZ" Tbnb\q T5[ | զpv5үnn!Ӛwwe5m*uP΂v-PCHŋ! ,220I8ͻ`(dihlp,tmX|B G a:8)\Q0Xp@C! p?yp;lm |ufs Bc fUH uu}GGO XĿe EєB t˒Ϝ!NtQ р[ Y, ЫWh|HqC! ,220I8ͻ`(dihlp,tmxP܂*(02:-P`8Cp`ƌAIΛ)GqŸ oqwqzU?AujKo {R?R RKUceQLLIUAll<DZD} Y ¶̛Ş ^Ge?uŮlI{Ie!e" pkr7JG,5QTd ! ,220I8ͻ`(dihlp,tmxDq`PIeof @xU|f!Ka)HXfkHR/7+ W_|v q>{>@Ii}~MLVE HrSE~qMGiae dh jsДz bYUM!<ҭؼ"-mx A9CM},f[(?CoY[  6?;o; s5YHMHBP#hHxo!;ϼPªخGgW i `'sQ("! ,220I8ͻ`(dihhmTPQ0oQhhXZP jɓ8 qZ*bZla⒇k~^-}xyk{xao1U(d/&3jq )7U=87 `~Z H"7M3=d#_M/eőT ȠIĽl`q$͵ lUtmYT늫S?qC*! ,220I8ͻ`(d&)& BkL 338E0~ P\!;58<pD MC n)>@pvIʅ]SqU*Q l~2Woc|VOSm|mkWki?(lis&= ssbke'((=GζӦw2ʹr߫G  jBݼ]r~k#t_$! ,220I8ͻPa 17 cnZ,:S‰İ^wDBLG&rjTQel 0H0|`@Ow8y=7H+ha:Wy.PfL)X 03=2Hfq nzC" V"qжmWɣB"h.̆yhN"٦y΋ ׸nk:觰Ç! ,220I8kXH D Dh2`,߹ 2.f ӵuߡI} P"rpT:-X*E!0+dxWdi+ @ީ^2)pNd,z Sgi G?|`[U.?2<y{Dnz&715vXgn Šo įУǼ|_ gowJ=p Wϝ<Nap1Yʼn3jȑZ;loganalyzer-4.1.5/src/images/bars/000077500000000000000000000000001277740250400170435ustar00rootroot00000000000000loganalyzer-4.1.5/src/images/bars/balken_25/000077500000000000000000000000001277740250400206055ustar00rootroot00000000000000loganalyzer-4.1.5/src/images/bars/balken_25/balken.ufo000066400000000000000000000710001277740250400225520ustar00rootroot00000000000000ࡱ>   +! ")#$%&'(*0,-./1623457Root EntryFY+@RLtfHeaderLtfPreviewImage  FOS-0  CBY+DY+  !"#$%&'(./012345678:;<=>?@ABCDEFGHIJKLMNOPQRTUVWXYZ[\]^_`abcdefgijklmnorstuvwxyz{~LTFXN /mxcjxcHHNeԇԇԇԈԇԇԇԅywwԇԇԇԈԇԇԇԅڃԂԂwwԈԇԇԇԇԇԇԇԈԇԇԇԇԇԇԇԂ""ԂԂ|wԇԇԇԈԇԇԇԅԇԇԇԈԇԇԇԅY|ԇԇԇԈԇԇԇԅObj-6 (Tagged Image File Format)UFO (Ulead-Datei fr Objekte)WBMOS-0 (Wireless Bitmap)WMF (WinObj-6s Metafile)OS-1Obj-6OS-1 CBY+DY+OS-2 CBY+FY+OS-3 CBY+FY+LtfObjectList &SpOS-2rn-689402454.kmzObj-6OS-3e xKhQp.-5Xߡ*)ДmӨMyi.AAz3=xxAܢmUQ<335QYy6b t8g/G !:llCyJ.? s@#Z8,z؄'.&]guI_CX옥vc3C6G96 Z""v%Fx^dggy^Nu1Z2Ɯc ѧW04nMf2+]2-V;@5˻59H:?S/5@_zkEyo6|f Tf4ZbXE|QN6+{)፳8{2:yn55y hoaonKQ@";ȱ!)wnsÝݹ@=~˾[  ~w88NN wffw77wwwwwwwwwݗ}w җwƘwʁցzwywwwzwwwwwwxwwwwww wwwwww$Obj-6MwP_KFMwfPj Qwfy:QwHxQop_onnffXxfgf d 2RKfzp%VkoooooolY,`o%,2;LifoiQo'D *F#2GB0B  PXObjZMergeStream p PathStreamqPathCutBorderStream(|ObjectImage}N-Lwx=ha'6ZkJkoX)Ju (*b#B D8XD();(trP\'BqpR\ܤ EoU,F0:h=yy*'O=% vkKzvg oK|NxOXY{NOVͷ Nh(ZD: Iu g-wtFٻB>qED>Y5sgV|6b.)ϵM5nvoG|s<u/2-}j6vb촽-8d*zu>κ3w;9ӍUf !8V8Bzϳݯ2#/} r90&P߶Z +X 3+X=m9T-mWgݳȇn?6رԻJ7woo~様N7QҺK~~6DųߧS ݧ~leumYq|8 Ԡ;*uz:Ԭ7r[\^t) MZt$mu{t @ǽ⧄_:PNM +i=?m7е߯>Y]C~ݞ1Е6i: kܯ!Y]W=j: +VY]o?z?/c:;X8GEe+V͘T+_5ѬH@5=ηCt)[!V^i:PHV$&>Zj PathCutBorderStream(ObjectImageNObjectData$ObjectMask0  ~ww8N wwfww7wwwwwwwwwwwwwww}}ww wwwwzzwwyywwwwwwzzwwwwwwwwwwwwxxwwwwwwwwwwww wwwwwwwwwwww$Obj-6MwKFMwfPj Qwfy:QwH wv$=$Xx$%=$= d 2RI$zp%VkoooooolY,`o%,2;LifoiQo'D *F#2GB0B  PXObjZMergeStream  PathStreamPathCutBorderStream(ObjectImage "N-LwxMHaehXa-A Z@Nu@4:$e:]N]Щ-"N[$mZP3;>efnbD\u"!q[Z`gIYo[g{"bcy9V#w>kojVh2x{5~Hz^$a-j$ZI7Qv}ufvzkm+%jp1/$/+K]wVkWse!U|-osv0jTwXd}<)?{~3ݾ[s7-p^yz6QXd,CPO.Q3      !"#$%&'()*+,-./012356789:;>?@ABCDEFGYboڧs {6l71 (kB ӑ>4ϭk:ϽKe:or2s/XM˶t@W_ Y]~ݞ5Е2uïAY]W=n: v,C_LMi=1:񜲕S~WM,c:Pa)P=Vdsގ)[ʾ1"N6Z@%] j  ~w88NN wffw77wwwwwwwww}w wwzwywwwzwwwwwwxwwwwww wwwwww$Obj-6Mw@KFMwfPj QwObjectData#$ObjectMask04ObjZMergeStream !$< PathStream=fy:QwH ;`;::NXx d 2RHzp%VkoooooolY,`o%,2;LifoiQo'D *F#2GB0B  PX-Lwx=ha'i5 1VET R`"uCJ+TR :(trP\'B]'EU+`4]yy*'s=ǥФE{di9:.Z%QL}F@Eq$K='αt X\w8#0`Ut1Zl M0E܃E1ʳ{U"gلwB cH>)ߑxM!NnHY <dKڳl :U"NIENDB`loganalyzer-4.1.5/src/images/bars/bar-small/red_middle_9.png000066400000000000000000000001721277740250400237430ustar00rootroot00000000000000PNG  IHDR FF pHYs  ~,IDATx-1 H"c $ptrDk%.9dL[TIENDB`loganalyzer-4.1.5/src/images/bars/bar-small/red_right_9.png000066400000000000000000000002751277740250400236260ustar00rootroot00000000000000PNG  IHDR o pHYs  ~oIDATxEȱ @@l"85nsp 28 66"XdH$Ń?ĝۉEʅ7$v6ĕփ8a]vjEb_i4)?c//IENDB`loganalyzer-4.1.5/src/images/bars/bar-small/yellow_left_9.png000066400000000000000000000003011277740250400241720ustar00rootroot00000000000000PNG  IHDR o pHYs  ~sIDATx=1 @ 6v.`Z?#XX!TPEr?Q J.t9#Zƶ gqau| Ui+%K,UóBIENDB`loganalyzer-4.1.5/src/images/bars/bar-small/yellow_middle_9.png000066400000000000000000000001741277740250400245060ustar00rootroot00000000000000PNG  IHDR FF pHYs  ~.IDATx%10:,3 $ptrEfn D"$J+qϮIENDB`loganalyzer-4.1.5/src/images/bars/bar-small/yellow_right_9.png000066400000000000000000000003131277740250400243600ustar00rootroot00000000000000PNG  IHDR o pHYs  ~}IDATx=ȱ PEы2oENL!@6iDp 1)..5_;G>]-3nUŅeÀK<&ܶ,ě)a KH DNX)q.    '! "*#$%&(;)+2,-./013:456789<C=>?@ABDERoot Entry#Qo1a2l3?  !"#$%&'(*+,-./012345789:;<=>?@ABCEFGHIJKLMNOPQSTUVWXYZ[\]^_abcdefghijklmopqrstuvwxyz{}~ UJFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?RT55  /{ bx,&dJd;+8o2?<+u_yIeThv+:666grCWį <)q?kxl{*UPpy9|6 <4[}]k[o^:88.[s))i 3JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ߵԷz|#m\=XY$8EMC ív>;{g][үUG rV탕؇þ)ռK=VtwQ3G^07o6rB${~O<_2%'?eh\~Y5`0ڟ{jw^WaqWp}_?c *JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz 4)656R6DC7RYw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?_5=Ve(LP:X9eMm9Mo?Ux\ݖϾl+\$Qq[9u/ugB.jw{leSrHiL w/}YoxuJ~NG;PǪK]kZG1XzNm}? FJFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?^umq{Giе2@u=`eB ԐU_|5đcԴ:MarzH+6Uo<%? :υ Q6珑sQ .A* p=omgg7ϛ4ݓKrI>Sis76h}il>1c.Is_ޓR[{v 7JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?cUըxIާ}]mWhڻF {q⭼ežYkZؾ#Gͭ͞< 1q/tV۹ƗTg[i>dZܺ~]NR@^ o]Sԝܢ98zJQV;- nTSխ~ MJFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?UտiYC-ٵ[K+-mlyceIY\d(P2>m'>C^8]q zm=rL[%uG |3}~Ri}65Qg-+78>'|K]-- ;ءq Nxl6NJJi2-}:vٍ2ŕւ Q-N 3lV?˙(8 `D9nF01 |D11G 8JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?&'uZumY5f`P3scw7e| */w75=as$o(|~Pt 3>t前r H=2qW'ϋ5Yxt-5 E~F5iEP5Wtɭ5IYe -fjӲi}? :JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?KQSZuo NfZ% ;JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?{ ,eEdXL|눙o9~9|Y7^KroY\.Gr v|CDVkwbk)lHX4C)S>9sڧӾ E-Tdnױ% #F@N 1Ou_$'VRW׹5>J kU]21 D31G41 V51D 8JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?NWfU|Sb(Pۘ!vETi|aT[SKKծK=ȷv!aNUAv I}c/>;>rF'?4H Kzf 嵶i2ARcڣ;O8 ~1n;m.(ԯu1ʑ0`A!O9\N)N |w]TqTR5awc JJFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?cQO.{hkډy%ֶP 4m%?uQzg'oA >srvW .vz-ɀ)Vާo &1.I`HoET8$a#<_~$j5{[IOfm2ݫ<+/\6~ӌ}۫*aʗ,RW}Z-,,S{+hMm? 8JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?[yi/ ]Bup1 IvEL >;P&ym ~֭,Eh 4bᦐFU`vGL폈-|[[Kegic܂>֠&K+s`G\$hE0?``"ISoNadd.png0=Oalarmclock.png<ZNarrow_right_blue.png>_)Narrow_right_green.png& vNcheck.png. Mdate-time.png(vpNdelete.png,'3'Ldownload.png$ ;,hNedit.png( Nfolder.png6 Nfolder_closed.png6 Ngarbage_empty.png. ,Ngears_run.png$&Lhome.png0Z 1Mline-chart.png$'3'Llink.png2:Nprefere NJFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ƖWm|)k7:Ư ֚n_1MAb1C~m|9orյޢ}A,@Rہ199eׇxR[m^"΂h.nRd;d)# Mim'g!y[1hh3W%WԜ'MYsOvtZ1xoQ v[|y[]޷]S溷 MJFIF``C       !"#$%&'()*+,./0123456789;<=>?@ABCDEFHIJKLMNOPQRSUVWXYZ[\]^_`bcdefuhijklmnopqrstwxyz{|}~    C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?kX'[D>nVG|W<;\20+W|;?%-S %I8$bbܤu4連֟`b#)IR溒 @JFIF``C     C   "91L02=12 522-! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?-#ďw:njMjBqaM v1c -MK#!{iTѴ%ɦ˩G+ȥtLCFF7Ɣ_w{kI`E 휒668+> x]&FMך|ȓhRdqdOJ .E8~D*z>C)aqZtjVm[ӯ 1JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ??7)5XEa`^fARapPu5O?7e:>gVqZܙ&xp0,{;wľ>Dn,^O "D_MsI:rq#lxV}9}X]y:'rUNA_SZyԭһס#kwe_l )JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?t٢Ztcq*'eն4vdvdzmǓߜ`k𗉵O[{oP1y4;$ew4''~ ;0气iF.e$]\uV] t]|].SXo? JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?]Ӗ&1kӖl j*ܞN 5௎v?k}Vsiʹvųߜs<-}GxwoP1y4;$Qrm;ANN*O/4_Z^kFBvYbIU!UerBһ${;bu 1JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz32:=42G;52T>62gR w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Oi-Z}rܒ(?mP[ NむrjŸkO} wPk7D2K']`Hb2}3\ľ5xwKxu$;@/&Y3qZ_+O|6,cD>Sޠ|eovԖG 2JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?k/#R|-Wij,nynByΈo4Q5k 4&WMG@rs^EƗ. !,)ilu1 E ‡bv ['4?YK0RU\rp{d{YZҧ]c^ܶV<M_#[^Y-Z%$dՀ?:D~^[W;CNi*2ȟ:| p8FO{~6Z*1Ԭ݌qHNCdq>NF2zhp,,O?JV[;?KF]ͱX4,?#i[]_{?sman_preferences.png([Lse &JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?_m#zދ7h%X}`!\m##rpŃ-j4 7Nkm/P2siNS&dׯ5NT'H/;KnO$233+VqB?(ٿ7M/=oFҬ{@>*`V |m.y03R\ڮrver.png$jNview.png< JFIF``C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ZhO{h\9{8 z0 FW~Z_߻Mp 2#G.LjR__ӋY41+ş XXj[\KxH׭H/~Vm]'ƖqA-ng(;:`fwvP/Aᯋ4Ikv=IPGoqnXgyeBI ߹QV"'իV=:{ۭ.]}5z*PZs6}t+% GJFIF``C     C   13S" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?u>uC:Mi <HW3dğqkNԤH\ ZI/0[.ʈ H> Jվ|?7xrVK778a$iDea`g'rH7Ծ*k^ԧŸXn`( ̇VfsԔ{OtJ:^G"nNselection_delete.png."nNselection.pngloganalyzer-4.1.5/src/images/icons/add.png000066400000000000000000000016031277740250400204650ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 15 Nov 2002 10:08:29 +0100btIME'h?y pHYs B4gAMA aIDATxMSMOQ=ETWCX"D qAJ.ܹ HLK&.(w$*5 !ZJә}mxysΝs=P1XWMvJ,W@Щv(nu >we - vFï\6ZK4`4!_o#/kag[PHzԚ/Hիי:~/K34z}WtaޝLEHu p4 {]|Pu UH34L7- iX4eOd+e`v`Cya])0}h\~wMpUx[xOuE2A~.W%8Non#$ * .=S ڐTZe\0ХuӃ&EWq`X%")gMm)JN(lFgU\pl E0DDh1ljXo`_ QWp̡Hp[P|e>,<Hl.OXUc3Vƚ|dPQ!|U. gmϻ33$?U#9Fh6c^?iHt\y#/IAK]60@oc7>9[,:IXA"` PF:~D!BՁ+e ح<cvā:EpZCx1wh&@e5g݉ bӗbinA,­;qq [L)v` "g ]pjTr͂?Ƀ2\i#5 `ќ FoePO)hOƸyizHHbxoNZvO",l}~au~T *% ,g'\2 =E7ĉл%iT*iPEA Pn%,A5K#PKF"hkDOe?{ &͆0& RtY8J}YslMRtQ ᫢dxG3T]8o\%ZvSQg4HLjzǥ}ylL/ܚhJ\}]fL>Hz%r(.N }oS;5c59AGu^UcP - R<0FJU*5>kO&Qd#?@A7].J7.\ʅZP.(5Z|T M4]f9scjRDS$h%Ou/wfw íDF]]W'-}F]F7A9 (~? o/p W!Ίtd`qARDȔ,9jO]>10 ܖ"t.[d@Jj*N JZ ;zz!YzpkQx5)8JRxtl;Rlf sy:J^ BU֖R?TvlHKĺ@YOBfBΉ", B=dFZcg*Se#&+n8I:$>UUic IENDB`loganalyzer-4.1.5/src/images/icons/books.png000066400000000000000000000017551277740250400210620ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeSa 9 Feb 2002 16:01:51 +0100Z9tIME 1%b pHYs B4gAMA aFIDATx]]leo߷]vtG} L ^h+Ѩ77&^Hl 7&(ZK6jئkk]}Yx"Ǐp I$'`yAZ.4O?ήXI]q9oG2Cy9sE-Obog'~'ohz?C7}>:Ww.Mr6 Sk`r)7FX&RS ǯs9\9*N v5Ўye'-'#ׂ /Bsp+{_Q}U9Wyg݆iC2ON)F2tqN BB++ZrI \_$ h}9֧+_y8,~tQߛE߫'SW$yسGevf]%%9unwZei n`|=n" ɸ+30W';0;M9H}ʺLb2L!8_œkHf/0/P[fZVc$V'՞PwfR]Yzʛ>qIENDB`loganalyzer-4.1.5/src/images/icons/bullet_ball_glass_blue.png000066400000000000000000000012251277740250400244160ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 13 Okt 2003 00:03:49 +0100jtIME 1)I pHYs B4gAMA aIDATxڵSKOQ=wfJځ&EQ*(M& +aŸ /ܐqAta[ƍB#hYBX"} L;@`$ƛ{w]8Ş;uC"Qۅ켙[9+n-]%5]kj jIv1)uW^`f-Yfȑ8O[SñrM ]UwRr(`D}5`T"E\ GA2{0Pq9t&Tӳ[SxGE/'>:RtZo O4F YϬS9G;(dBma "jre%˵fmS}юrY}ddtR9jnx5muO^R (\Whu_ܐcϱ>#sq\#U7]qV[W84KLP߉^N}>-"I[;-56}^~ 'I/N9IENDB`loganalyzer-4.1.5/src/images/icons/bullet_ball_glass_green.png000066400000000000000000000012411277740250400245650ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 13 Okt 2003 00:02:23 +0100'W6tIME 1)I pHYs B4gAMA aIDATxڵkAǿ;OwҖx"x97{RE*V&V6ld7o㦤"oc%NU DOrimo'xs]nݍ37L$ug-d=A\xq܉Nc,C*l͆"g>=Q/tKb^}[QGB~ Q+MBQ8$ace2=I=?'ui&W CSqȓ,G3'/@ЉلavO|u;K1?Ȇ4[YuB# 8F~}Q#4١}KDa VI쟂,*s=sS8M{xJ>~.%m"n`W i%c(b_&]IORDѰ svRs f[8 pݺCìIENDB`loganalyzer-4.1.5/src/images/icons/bullet_ball_glass_grey.png000066400000000000000000000012031277740250400244310ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 22 Jul 2005 17:35:16 +0100 tIME 1)I pHYs B4gAMA aIDATxڥSNP@K)PX;KF/ .X"`ؠ"1>J$Uh-%1FMNzg陙{\?f"(J0mYVئiVv6T!xfըT*ǝn7 B|skK lld8ho)7, AOU,Y 4À ݩaƓd^  iei0@N0#$xH$RGIENDB`loganalyzer-4.1.5/src/images/icons/bullet_ball_glass_red.png000066400000000000000000000012111277740250400242340ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 13 Okt 2003 00:02:56 +0100qtIME 1)I pHYs B4gAMA aIDATxڵMkQ;Ij'RDBhu,tK'P ]\u'bARJtU[R jM4mN&sǓtE/ ,o}{'޾n뿰&T, IENDB`loganalyzer-4.1.5/src/images/icons/bullet_ball_glass_yellow.png000066400000000000000000000012321277740250400250000ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 13 Okt 2003 00:03:22 +0100n7tIME 1)I pHYs B4gAMA aIDATxڵSAKa~ogvfgT,`S<xSy_nINAt K*b3=3̈)IyE>0=;^ȝǘd&S xjc4\{*?\}2EF5=;6^F<@9P:HIXb;[YB>$$#}܏'PU(nX*֐H컁LMFT(mj;;J=@_)نe8hu>uYBZM;P)Qń J^5踕Ot[g)Aa0_VOI1,Nȃ|\նV+yx#ooDF3(vt㕔$J 識WѷSAbA^?Laj{B=bs|$2hj7$Ith i~H p5=/?/ I@%IENDB`loganalyzer-4.1.5/src/images/icons/bullet_triangle_green.png000066400000000000000000000010641277740250400242720ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 13 Okt 2003 13:52:51 +0100ntIME 1)I pHYs B4gAMA aIDATxڭK/QS(!E"6MHSaew۳HH%h )z3:tsϹ9bV/k q=n2yTK'F<%ΧUr \Sh˔2>tqX Ï$N@eB3K`V"e;,lu!qH4QOrA?션v`gkp =y R b돽jh*$K$$"䲂NN&dA$scewDd1lbڧ>m0\D<b ^Bs☸%Mh C*YƍkѸiZN, أ'J>$=HtXL52H @҅1<^OӛIENDB`loganalyzer-4.1.5/src/images/icons/businessman.png000066400000000000000000000014701277740250400222660ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 16:43:06 +0100PtIME 1* pHYs  d_gAMA aIDATx}SMOQ=NNKii@KP!*D Ƅ@ąF qanX+&ʝF&&&q#46 NҙNaڎwpH("/9ɛyw;2ر^\G?DBxIG3޼= TFdqC(m{[BW+ L(E=(G>2%PpMM8u kr1pc{B{Mhi?Ij9,o=02)5L璨j.x2}7i9M E23<_X7&АUa#wKM^u[\ы6[=KZ?=cHFu5joW@~|t9-J<;`OQd.A!O }uRI?Zow$h:f44 XL pV k"xJ$pN\}vf 5W솬`u*FV$+ ݨYq!ĭt:H VӅuUw }c Qo6r.hN6Y[^XQ?L$EA#iƖ%eZB#ƨNóNB0K7B)kH+7-E6cec9 r䞓IENDB`loganalyzer-4.1.5/src/images/icons/businessman_add.png000066400000000000000000000015331277740250400230760ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 16:43:06 +0100PtIME 1* pHYs B4gAMA aIDATx}mHSQw^{uܰt6` M a}" DKo_RB~JP,|Ü:ܦw^B:;\yy:hQk]~Ci)HıMKIN7fOy(4j ZT clgT(H[9p:hH)06ګqʁ9+sHDҖxdPx(Fc0a1erP+,s:X氶J5НELĬ yMsh۾΂GNAA ${ jX***j[r(#7zl(;ڈ\2z;d?DzaWQHWv=tvk&l_`ǺEXx `.`nE"j09,K'rR \vG^XBkg̱u~0B6"G[]פ[Q`lPHu.)8Ux<;oD73kKT`ݥy\̪R͏$ l炙@tKd-_$?YJuZ1lYqz> iF !p8PG? AS^aN!ˤj5su@C2P+e=tP&^C{#!iT(f~NLILZV)",d$]+G1n)AIENDB`loganalyzer-4.1.5/src/images/icons/businessman_delete.png000066400000000000000000000015501277740250400236070ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 16:43:06 +0100PtIME 1* pHYs B4gAMA aIDATx}YHTa8[MZe"BTD>(e=-=db EAE9.K^mftvvn\{9]yCT, `p։h%]+/~}xd4`T VIѵjF0J)A_Η>gd2? M"PKt # y'Q~y=@WL]9{  N }TIˉcP񢤸^f3 09ve?0wpA_h2,xgoqbURkJJI:vTȜiMd$E?3(=|]e5o/mg8k8~ӮK_!hE~u0 L@'Gzʝ xc {T#AfѬ(mm@^{gg"xuds":i o 9"dBl;pví tBP`ښ`LK'Ks#70 ,"ڴ 위mwxy9=>{l9]Ф0! 쉬aN#(An迃˹6BBVAQf98IH@@ipExi(FFb}'"H ajq\V$B*xX +PYSOäF.-& V+"AkYYp6tz Q) |RGϼW.= }O*rM?$x-G^`HXĈ>IIq+vB|a18Igm?-h_(@YRJf=m#]Rp>f`=~ Q\^y1<~(7 MF\}@RN`Ðä ,Fng"Yˠ-ʘڰ]DŻPpzB71rGsy\+fbYIFxEgႵ $l=VP ֜oiy"4}C_s EpjL[ws1A-70dlp:"("OW@-/1`[`A7V6[^2vK 1F@%J$VIENDB`loganalyzer-4.1.5/src/images/icons/businessmen.png000066400000000000000000000015531277740250400222740ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 16:43:06 +0100PtIME 1* pHYs  d_gAMA aIDATxœ[HSqǿ;6ݙNi^25PА@"eEQA]^"(BKo2Ostz|O>"{1GDړŴ;-&<Gj>kii}j{`s4u !e CxB(D$ ZvJR(!H.ІY {#!yg0kEֶvfTP& B~]L#|MBzg2J@A:o ?$}p e|IENDB`loganalyzer-4.1.5/src/images/icons/check.png000066400000000000000000000016321277740250400210140ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 15 Nov 2002 10:08:29 +0100btIME@ pHYs B4gAMA aIDATxMS]Ha~o?9gjHmnIB]t#Axׅ]yeE]TxHUtc$QfBkhos[:fnkc$9SB0r-Q6I Dʮ@^b;5T(+I2P:[-\!:k'#v!(FQIQ>{&`rX+шN"W < 謯r?GJ#MȊ"v!|lisz`:Y@T2,|KbBRAL&}@XKj\%Pe[ so/Hul̥xCP$:KE.#pt n?D\JkpZ܇uJ< i<$[΍fp<QG7;3HCG٫RX'aJ/VׄDz" &oQُq{;.b(mf(DnKџYY$31beZ0H%l):5 qj`2fB/VQuOF!!~rGNW@&q`3VC8Z?~+5ڥ9%R/^X c&)Hbhr`_)&t 'eI}m'X#jl3U7/Qk2%mkjXϷW)1F YQ&k+mȋ8,3z1k.q*QM)dG`}X:6Xbl4o[<4S;`9]sU[e)aO2P`/ 2Yr!v-f}}p w YH$= atEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/column-chart.png000066400000000000000000000016131277740250400223320ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 18 Aug 2005 22:34:06 +0100XtIME 10 pHYs B4gAMA aIDATxMSjA=N&8I(=T:i6QqZv%]P)Ru(zTP4 ~u xu$PB1~hV߲"BAaw'mm!5k!jۂz|Ige,pUAwFti>IՆ^נA @PDW+slۢ-*]d~=CLV&&Ú%<ޘۥ^{2v}$GV.];SX.Vw)[L ©x,µY몄N$܍<?(  q[_/fIENDB`loganalyzer-4.1.5/src/images/icons/data_delete.png000066400000000000000000000014771277740250400222010ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeMi 5 Mrz 2003 17:01:05 +0100jtIME 14Ր pHYs B4gAMA aIDATx};lP8:iBꋆ ,,Ja!t`GT@C˂b!H"T <@Ln8Ǖ]q=؃Ãgev$84͠VUR.rlvy:]*ay+ik5f0\gi]v+ycAEKK`P"q^Jf 97kxTUTE(ҮUPIH(d}0#0"߸·ű"]=FhD#uOwnbl===fdufqGWxGgX\"c}=ߏ6zst%"\qLӌD"e GWhhhxj6~?'&&vD"X,Yz~ k7 ) \ųQ\.z{{suuund4 :FyWSShyo8<>‡;^0x Guyh/jpE$LIENDB`loganalyzer-4.1.5/src/images/icons/data_edit.png000066400000000000000000000016401277740250400216540ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeMi 5 Mrz 2003 17:01:05 +0100jtIME 15 pHYs B4gAMA aIDATxuKhQyi&5VUZ](*э{W.Bu]BW؍|@ӅiRmSvLfɼ2T+Dž?=3 CCoFAKSiVJ 3Éģw$7? :;[^_xq}e8>\oPU=*ʾ1#2`Y!TUCd絵5Z˘LѪ$ L[ `r]8UuaQ6ADMgNt :`іz䢣C4mXY I`,ڐ2-| +* smZFk0%AD#S3N3t4}KjZ@q>pBz%Sp>)X(FN.geS:>MܖF 2hI+jcψ..ϳXE n'-K͐n@n5ظ-`TM{?}Ln!l[3ãiij E#H62qCŠ+[X1lhܱCnj5 bigyxflM1I{{s OKKo3LuYAcZzNgRp;[:ypVqy^AѐMbŖ @S"P,Iq>Ǿh"vRmuAQ,+FeAc`qqN# ^FiN l63b ށd4>кFXVY''2WA'1:1|nbrrn;002#`4*E (TN C? PZ:33##S֧fqFdy88(C0腭T*5p]r9p>R;Z:(py0wd2y򡘄0=}Q0^ ! B 4d,C.WEA VW7 pNSא֫ވHFo<2tQب]Ӎ_[М _N&s\$#)_1Lg~f/H8"!7 S= =[3϶h^+IB>"_IRajYߋ b 8U*,a7 6k[2IENDB`loganalyzer-4.1.5/src/images/icons/data_table.png000066400000000000000000000014241277740250400220160ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeMi 5 Mrz 2003 17:01:05 +0100jtIME 15 pHYs B4gAMA amIDATxmSKA}lScQ4ڔR5g[ϥxSZڋ! %N&ٍ7&ogH͢(¿@q?zF!ccl0`4k;d1feFk2|B;;_!I AOt5Q- rHB1ُٸ'3,dQe97Ls@bt'.*#hhDDh2`#R J5@VHU9񱲢`~ F P29 ?ㄞ㤴!k#m ~_X7 á=E;Ir$E8wd@|! 4xwuYLAbu5GY(lLjX\K|Pw]CZ>˲}4:rS)Z\ɦ-D>Mw!K&4wY)i-F:vw?LA@HŷssMO\z%sg.V/ QBL{Fi\ q}|ϓdig{IENDB`loganalyzer-4.1.5/src/images/icons/date-time.png000066400000000000000000000016231277740250400216100ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeSo 28 Sep 2003 23:53:20 +0100^nTtIME4\` pHYs B4gAMA aIDATxu]HQ;;jT&V(ZIe=RQ"E/ EA$>DBJ`CJii931;;3JH]qϹ6 0=ܚRs'/{:}> hF{ V5XRSYC)-Hsګ >4M? jj8CaA6v< .MSh[#e9یut~n5—wȭ6LR\)+++zWWvU-777|r|>޸݇N`.0FNG|cA2G-o+VIAY7GT wa&= N5 $v˵eOGǥ7RYiq"T]x 'ߓ8d(1lv=7VIKx|sYG`ٔYGc^W"WÄğv_>z zȍq fgg>~NL1FQ:`5Ef;˔17Sun14] QDX&]?%K/߁U S7Tjܰ+MAb1C' ZvV &( )h1P&k-)OC@ae:V3xqy385JA"7N-]]}vQBp(b Ir$HDZ,(o41F78Mz/SڷQ1Fh`t3HIb}@XEw4SIENDB`loganalyzer-4.1.5/src/images/icons/delete.png000066400000000000000000000016631277740250400212050ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 15 Nov 2002 10:08:29 +0100btIME7:U pHYs B4gAMA a IDATxMoSu?眞Z texu@/Fwx"7f7J0/H 1Q/uAI #\F7pun;=o?ӵ|O~/Wot=VôkK0_y. :\[xNw\hinSY(aq'Y2#yK&ZOGWv5R(i\'m70uIfQ"t? 26`m$]KfK`stf )_r)HG_9K(AnhߧD_~%Nsx[/nAD}.?L#E6cE$9yP:6eA"I&0=!*iDڋ~BtKu< !uW4T+GT9H*-yQ:;+5`&WC\)eb򳓔PXI,^C{w$*&\MRdͶq^݉hW؄:k%uJBnz@Ʃ)@?-KEESEjrrr &m^ {zzGGGGFF F}.~zʯԏ~u/L_@t0ա7wIgtEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/document_chart.png000066400000000000000000000012701277740250400227340ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 15 Aug 2005 11:31:14 +0100ztIME 18 pHYs B4gAMA aIDATxڍRkAfܝ(6BB8 -Q v6!!DDJbb; cbӃ;;;;ݛu1wofnޛ}ok8&@([7&V>m@LP)o-wg!ks=ʁlmpi wVՋGn8% X/=Gamڎ H_0^ _*9:M\'JF-C!ڐਠr'"IAPAoH !X5D܁myiN2Ny-$|zہjb2sEx_D(|R8\$`Shmܕ\AV@쯎tp`"C@[_tAnOt͉t  ~l!t& V7Rk1!(APG̵ZXUlK5 Nh h&:usA$=7޲nV!a7Ou[B'~3!TȿIENDB`loganalyzer-4.1.5/src/images/icons/document_text.png000066400000000000000000000011311277740250400226130ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 15 Aug 2005 11:31:14 +0100ztIME 19- pHYs B4gAMA aIDATxڍQKPצ*࠸"6\MT'q8hb-UEtPM=Ҥ/}=jؕ-x{}Zl^ⲁ $/v.ፘ]ÈՠG`%Bfh 3+ 0uIc ϝy o8b0t8.$Źx(Є5mM }*a 6r/hqTOaL*n<<%A54@a.䅂s 2yDWZzǁZ>C܁\ΠbYa}*$|;xw⁘EW>hjՊzkg.PM|1;о%I5CQz睿N@=D bTPa"ӴM:6[o@M&^{_ g ephFE$PBA4n!խc$Bk =Нa49v#rvY#!X9 z)MIdX~ ɮ+ъAcx+BIHލuY!#L6G ",cIENDB`loganalyzer-4.1.5/src/images/icons/documents.png000066400000000000000000000010711277740250400217350ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 15 Aug 2005 11:31:14 +0100ztIME 19- pHYs B4gAMA aIDATxڍJAO Xx+L JRi@,MU je#Z;#Z(!Xѽ ;;3$edL ӢקB|Km!Up(]ʝ;9-Y(ʏccI>PZY0@$tCPCah$Ex^#e2Y7+`SQxp] wMNfY{\$ /nLr@CZP)=,Tlm{Jj$n;÷ﮦ{q=wImu%h5ypU pрZ+2ى`"[ #bpDB/oh[g;#VIENDB`loganalyzer-4.1.5/src/images/icons/download.png000066400000000000000000000016221277740250400215450ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMi 17 Aug 2005 11:45:11 +0100>̫7tIME- pHYs B4gAMA aIDATx}kQƿ446Xb7Ap ܈(Bw\tcTD MjK}%Z% &{&3Cх{aP3*g''Ry[^^_ɛg -S6_X`,+6At =G\ʓI ]pnz,-/ c?(uڮbm^piYEY@ 60Z&ç#p1t9zd:/#c+!?ژ/?G ˒tiJ%!͐!isi )W,q<BI.GZY>m ] yljb,*P\ l%"e,$QQXT]Vb'80G-xg_k#4*D .A',.% LSkYA ˞6X kZD Bf3SVC4Vө`wr,mqv pzx9;O(U*cj1:+T9w:ق'B<C>W#T2(*؋T(!K(0zm lDHO_t3yZIpqIc̋,gEA»rwa#+P鋺RMHzlp};~ߒ AR556䬂U jaS\}4>[IENDB`loganalyzer-4.1.5/src/images/icons/earth.png000066400000000000000000000017361277740250400210470ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMi 17 Aug 2005 11:45:11 +0100>̫7tIME 1;r pHYs B4gAMA a6IDATxMoSUǿ?zK]K-dleLY dbB0Q4xcbW5&&2!hx  FDQF0 ؏ޭms\ls={9D[REj0N൴ǽ3gf,SC ߙmYSOgIA#y8Q|==>J޵ngY ?wEORA|PdO *OHf&?9׉>d pm4IЀ7Ql}0JOVw ]w,ًs ԖRAEw`{,H$D&qHа\x"6j ; ߂̫7tIME 1;r pHYs B4gAMA a`IDATxMkhSgƟsKjNXS{qiCNgbLDA2l(_~[ nDL bWk\V[%b[N&ͥiIN# y0o\G3a*.'x!.tr߹8)KMɭ=?tSeph2\Pg2;mK 7hЛ_9r3JUh⓲.țɴhFX K`7D60{b ⹿`6 FBG8@܂e%pgץs48ѹi:Mx)crq3PKJ{,:l/C2iHDDFigbh]ȧ(ptcbl]#QXbŚM;L$VA*NJ>;p*N'L2(7@Q<Jkpf nf6#ZH?^icX,p\ mz\+݋W7uSꤥUhn>RTۖͅcܝ(a›IDs?_]"e00q.D 8sK :Bct>()/16K];<` <{aZ%2̫7tIME 1;r pHYs B4gAMA aIDATxeKLQmPj) WA1E (IF lqaX`b6&E 6&(+LdCBCTH%Ek𔇴h;i53r/ss{mBhȟଡIv=sw?vZb&uXаv`7 :̽ RD:a0"rICĦڢzobXj[ s] !d Fw7Sy*SrCCF5`8)Hf;Y/Z0iRs4O RFXw"#n`IENDB`loganalyzer-4.1.5/src/images/icons/edit.png000066400000000000000000000016401277740250400206630ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeMo 6 Okt 2003 00:10:08 +01006tIME|. pHYs B4gAMA aIDATxmKLAޝug >"bDĨ+zx`G^YMѐ8M3AA# DA$ KX}ٙٙ&VUWwUׯvr]Bs%rDwophV.g> ENDWp{:uVNN|P{~ O%l (1&X;{r*azjQ1;\0#tRp9M}("si4mlD*U-=* T'8Q<`4-<ǎvd޼˅Wn_ %<y^UHH2cO#/#nŶ͹i | 2PiC11Cǣ?}$5t!$a`L54|PL'ʵ.݁ X@U&[rm`{ \O%q]rB!XZqF`)#3@j<}ff<=??HfyN~tdɌ]/̰\,Lm7qÇ*M,>S' m~`2}G]IENDB`loganalyzer-4.1.5/src/images/icons/edit_disabled.png000066400000000000000000000015761277740250400225220ustar00rootroot00000000000000PNG  IHDRa pHYs  Z IDATxmAH[t=XqՃ+e1 ߄"!I%\6a7&NE4U04o8 KP%}G(/Jggyvv:---vmHTUUp py0|)BZ[[[3mmmlSScEQ$Y|lhhx!'L $ID"H^cv{PewwwM.WVVǩ( ( wvvz_#ȲV>g6ao399V o>-FPLd6eX eY Fr_| .k$)q||lRUUsuu\^^4X]]@c"/Ya0N0 qii,555/< $ gbt:M]9>>Ξvtt񰾾>^S^$e&UU!988ȹ9jƟx& ?ܴt]g*iTUiRut.PvIa\__su]JM&If23J12\ Fт$I;.+QWW///f`pܼ$/ %|vgJp -x\` tEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/exit.png000066400000000000000000000015021277740250400207040ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeDi 6 Jul 2004 12:35:19 +0100` tIME7 pHYs  d_gAMA aIDATxu_HSQǿܭۦi8Q#̢%4b =B/E EBAAJ=K=$"zi%sS֚{=rk:s߽ %˵0 fg^ojaY¾([cna䖀We]]>4MFRՖK`u,p~ &B%%0nuwh'ډCc ` SȗE!a3o6էq݃D„0)eOoDxJϹoO|S ȥLt0Oay'eRSt:&$Ik@0 Bܙ]{韠1@, OOxO"]ΰv愈}|$2%z5泝"&RTDif&YiAq6.r EA2,eBJIENDB`loganalyzer-4.1.5/src/images/icons/export1.png000066400000000000000000000015311277740250400213370ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 18 Feb 2003 13:12:58 +0100tIME 22Bp pHYs B4gAMA aIDATxڅOQL;B"qMJJ Gl0q ]ȟAHč1dҤ Hcb-MijiP:xƴMOKfΜw﹗c aJY[WVW2'DlЬ3#?o\ojL+8;]ghļ*JP=2~>Ky9e?Fv&ZKR&C+l1eZhJJX)+ujw6ݏ6wS !3D k& rߡ>LLL0djt/,^wQba?P$X~kVP68kH#x{gAniU^uqrr)TlFS~xc @Kt[֚LѨl6p>ָuj6C l0??\xW6 Y `:0 $I]HN'b1P܉L&T|6T BM}v]MQ}4 P($Iy=z)l*CC%,>77ǡ6\Jb!G2q+c5JE+WPc,reٛϗg'$\/ZlJ3GvQxGP9Rn,3IENDB`loganalyzer-4.1.5/src/images/icons/find.png000066400000000000000000000013571277740250400206630ustar00rootroot00000000000000PNG  IHDRa-tEXtCreation Timejeu. 5 dc. 2002 12:21:10 +0100`;҆tIME 2; pHYs B4gAMA aEIDATx͒kPOicf4:TX7VQDD&R&'O>>u(+XVlBQu$m_BZW=!rs{9:O8pFf>JT*\.Cvpn Ğ?C1g $Hc" "ۨח- +\ ]`ųTr[>5w]y(b>zls=llk4m}bx4E]Î\TJev:+7192 .\}M}Lmnn{;FMAtǠ|Pc&Ij,CS֡]eꨫ=yD?50f@J?}^\" 5@n:.q{wǺO5l }'3p0L>l_Y%H [Ô 4eg;V+5MشhLP.{-F!g9mڲۖ ,7Hl䄰us!Z8(OA4ss`݁Vr{l;]&dr ahVX{!Wvc9hrXulLG9|yATK{7]Z?7jNb(09zn1F}w?uOd#p{!b(H4ϲ48D>!o M? YX8֪sIENDB`loganalyzer-4.1.5/src/images/icons/folder_closed.png000066400000000000000000000013731277740250400225450ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 21 Nov 2002 11:45:45 +0100tIMEAM pHYs  d_gAMA aSIDATxڍSKkSA7M(Y] WqKn]7ݕ.D >J Mb-b4$w9sΙmX^lL! ޘ] 5`{vC l> 'r4.; 9MO$>Ix?Lg;#sҙ'p5X98 #C<`C\6.A#Xa4yCѢ˷~Ũ n $Bz@(PHEA Ĉ1%GeTi~pw߶~ueB@8p[U*i/LxW:%~pafӿ^#NHݖI,:v@"4kB`ѳl-IH5߮\#BN)0 + uDdbo?L.$S JwצV@j%+D!W埼6-3 B(D8z:@0Dncn_"vD&`Cͤ;3"!OhQr0x6[-H$a<' ~C69=IENDB`loganalyzer-4.1.5/src/images/icons/garbage_empty.png000066400000000000000000000016741277740250400225530ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 19 Dez 2003 14:59:45 +0100tIME!ך= pHYs B4gAMA aIDATxmIhQ3$&Vuw" U\PѓT&zEP@AЃrP+mtMf,ofd&o|{3[~וűrif5KTpřYT=w׋xo2h]ɂoN!,F?N2l^_<F٣+kHŝ6͉-):T-BL ԄlU#C}DPnsg٢Y^TT(P$@/Q/M7[&8Fs{?#T{Ҧo+#{} vޯZZ:^UW86,tΟY,=lewW KvJܿ?y[xf;n6kF.(Ъl}&E MqN։D}}Xk5s3 KK1H2ӱ[}4tZǻ>dDEaHMSPP|DV(,=F4F(]ذ㛸|x44|aK,P)x (*R 8)B~a7M9mf5 U$A"ILsđ#s,K y458~d/tV{-H$JsS^V(HϠߠכݻUb`=2q1NRTF %)XY c/B | wXwL# cv1V HC wAa!Ϻݯx97T޽ i,syꚚ2r||FG'$րPLT7c"$uVѴO&޼WffH$˷ "WI$GB akk[qogg_{qnLddR0'2?,U}0AN.DD#$S`{E\@I?dgwIENDB`loganalyzer-4.1.5/src/images/icons/gear_delete.png000066400000000000000000000020371277740250400221770ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeSo 4 Jan 2004 19:08:40 +0100[xtIME 2 pHYs B4gAMA axIDATx]mH[Wǟ{jcIm֩5V6  }ֲu>RZH$PZReC` زeaV-F(Z5,]lYI/9sCOTW'=Vc ͍Hny*L=uj\niyf{8_VfjZݸ1.)Iޯ=TYsL:^Sl;wlj@"4R .C8X((!}?ytz^C&#ɏ_g뙙E'hPUU (P*iYV!AS JK m !NF3hc.\:*JҸ:;}RsZ[9"t cp32زE~;OL]]ElNFz? i$Tj(FmQ`耣3}{w:Ԕ0/[w44v10C}w!rG}"Ww_{=RzV ob 0-˅ ^O!ॠ-#'Nkm:awoi-:^#{&^u+4׾Ük2k/#wͽ"?yb礙1jԗf#_>fI2r t4 lRC;D̙i:x_e=yͮѠ@%# ʅ@uSNa#WSrmpMk@Q(hCq Y{{o8H ?X^}{巠\r:+,C$ 7nfgo 8|_!B!?Fxo"y@{GË 4Vkpw|nȔamʸϲ~Y:|>%x]4Qv{g9[8"YIvtt446I=M %5ػe4顡~O'̈)aޒTV$`LDRdq|hdD[_IrL xd "o 2݊Fm0Ԇp%A> 稩X6+(JbqqEcAATX^HlnJ+Obj$ݻ/s EIǻ66RmΪUZ%bFf'&vԸ鎎g ,b|femPׯ5PRR_qxŹ ٹ---+UTarRaӦjyۛaaAHdVr:Toz7 ti̙jk 4%ܺ*t6V6x2D"Kd}J l^ytHDJ6׆V+kl*<]$iAJpy{NSױiBAHFՈTAeeNA }$jMCCreeb" pJ] I;h*ظQ`k4"߼h! p ƁbLLF'n1_BNv=@q/q{GF^rGOxdPPiX];a :xލzZk !  nO;ڽ7h^#w" -Ha#XDFĴ(UjhvIENDB`loganalyzer-4.1.5/src/images/icons/grey/media_end.png000066400000000000000000000013211277740250400226050ustar00rootroot00000000000000PNG  IHDRa pHYs  Z]IDATxKkP,tµïB\.\bQB 2qffd6MbGJ V\XntUhѩ]Hg.s98!,pugX^~f@U5.#E#5>֋|9,<  TQ$Y!B\z@Y;I`Dž sOhHZ)PUuJ)(y>|UU @Rz`,hA>d, @RjzE.Bh X=;"EA #np~nCDcqzIvCg`,kS6 qpضsab9&z>+ (=qo 0_Iv0|i- (~y`kբQD= Jz[U>tEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/grey/media_fast_forward.png000066400000000000000000000012331277740250400245220ustar00rootroot00000000000000PNG  IHDRa pHYs  Z'IDATxkA7 =x??ƒ]oE5 `0|lv76t-)DHŋ^Dx(EJhJ.σl{z^w Y`L+( v0{Lrjr} v:Ԧ fh:LgW,`p^̈́8NK!]]G$#ʱSiw {|پBҕ|T_]X\F'BRbm.7+R*>ųV:0-2h4[)\K330_U(cPJbZ}"{R1 qRBHJizimTM{I2`R*(BG (e\sبj78{*:t@) 8ec|OC%P'-q*iòɧ[J f'a@E2!acy[~ 뇅Ft{Oٲ΃ QgOYt 10`4tEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/grey/media_rewind.png000066400000000000000000000012771277740250400233410ustar00rootroot00000000000000PNG  IHDRa pHYs  ZKIDATxO@-ozxBĻD  ni۶m},DF.bL4 x K`<<&3){oDgqxoe]:z@|4ތ_|6n=Ű6 =IBԭ[4?BzJQ ?g0tRNzweQCcr:eR}C(ژM!#HI`0-ǣԢI\χLqЈڜE-B)%=̮x-6hNzu JQjI7j2F2a2P`Q!\XB9Mw Fp3`&,DžRK4'ZVv<9͘*Lӂe;](1c?$Z.H\" *z0 (e;q(Mɏqq/d; ,?A);DY?"򯜠nn{HW@ "0fĝRNOhjЂZHQ>ix ]k~&MMĘѽem&/a9ƕ>@tEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/help.png000066400000000000000000000017651277740250400206760ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 12 Dez 2003 21:42:02 +01001tIME 2Ƿ pHYs B4gAMA aMIDATx]{hSwǿ&i4dYӇ]]16DT`2XB`c?_cX0ƆcbtkZ6ͣ7&ݹ%Bفυ{ 6;;aeك#+t0=j72N>DVDbϬ.sؿ!h㺑ڂ7S$d<86LN3tZ$qbXӉ;4zk6^_uD~ty%Q$IdbwG/wx:[^B+Qhk&&fn`&62~}* _%fk0Z؈-^wO05m4 \ v-]oV WYӿ4C/n~Fɤa*rDt/)){ZEqucyd0:?[b)oHaVZUvHYoLTEtEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/help3.png000066400000000000000000000016031277740250400207500ustar00rootroot00000000000000PNG  IHDRa pHYs  ZIDATx]H N.fus/ /uae,XTȱ֬NyL}Q.si-DPʓeKgmnkLJ9^0;<s{H xy^>__nj+,](xgҜqJ 193h ӒSzz/љ=|{5g#Ì6R[ F,Avabaj[5Et6rʦ| : $('/6I>Fy&ު)bC Nmz]ǑQ ^1c>__7󬥝:NR[aqF{,byG:c|ڶXvv]"%(춅@$CBܿ/jVR>|X)]Ш@\AcWoH5ȁg}{B˦h0bZsJC" rrr6\*^Eqb]bN4-Sd)O$7#m[fH7erk}9P̮tEXtAuthorUlead Systems, Inc.>vIENDB`loganalyzer-4.1.5/src/images/icons/home.png000066400000000000000000000015631277740250400206720ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 22 Feb 2002 09:06:41 +0100UtIME,+Aw pHYs B4gAMA aIDATx}kQL&J EZ|(*XJDt!+uB+QDԍPAUJŢR+mm5&1Gf;eV?8̅9o{?`rCvޚ 45]EEʋ-LOގ7̤qǟ^\ ĢjT[&3R7&U lV~!֪6)Utѩ (#xb XP|)^~ _$Ed̀l%oٱYpL3 ?Sm9TijQbsu`?nY:0FFMӠOnKp 2 c= E{}G턆{](mM!+:nOװIu6ꢸċ8ױ o܁aFCa.pebҒcz 64$ HP EID.'LpĆYs͐w) 8_a TUE$E5UIQöxRjy'HSp^ssskT*d2uA#_G6I5&1F:;;vwwB!y۶AAǃ$b(p~HY>˓C,0-f'* BKoy(54Sō!*TapvOugi crޅ1uIb*13NTU`U9k?O:Uvj%;IENDB`loganalyzer-4.1.5/src/images/icons/information2.png000066400000000000000000000015641277740250400223520ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 13 Okt 2005 18:02:32 +0100etIME 2^& pHYs  d_gAMA aIDATx]SIha}N23I,$MbKŃXT(^BMس(<{HKx1ںFNI4I3$5xw9G22-T -9)|y(FpϞg`Ԑdۥl 3_^)8ona KښC3 <ޥT6~`TÊB!=H_T,~'.ˤ Wǻ/ e\7>aF`Ё@?`6ɁA&FNίPu*rEQ"A$mzw ĺ=7F}/a"VdfNO YCNuW T"ȼ|Dz>jeaY.j41OD oY ez4ȁf.8\&SfŁSbʹbI뮑H~>DdWsۘrEČN"24GQӤ-r9ò,lOpllbNbB EBKN lWi:ST*5I7\.Dr ?nvK%TSSR$D_Q<2 $X,e |l@*nj:?PQ!*+8iPha*+Bs~D)4 dꠙr *8ubn<(@ҐJe0Á*Ae?6ۊ= $8CnOOY0].תLJs!eWPaY ic9cc].)킅Gp lq\A$!dq޽*xFp<7kՈ3!bb1$S94 ʢbo,KG oM8 IENDB`loganalyzer-4.1.5/src/images/icons/media_beginning.png000066400000000000000000000015421277740250400230360ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 24 Feb 2003 17:53:58 +0100tIME 2 [R. pHYs B4gAMA aIDATxMS]KQ~ٙ ]7Sv."1B"~Dt!DxQAAtQu!EBDBE*j5;;3ggV}ać恱{wzNOjx`(g(jQ,T"Zgm_3D0$.4?x0V :RrNE`8}TcUUos0U%mi$Lp/+9|Sx&(\2džNʳrΦNk^6byBHJ$nkǍcIm|!c%'!NQHO'8bp2.azo@qt3'$i@1&z94`n Uy6r$+xH~cod|^Tm(-}Q JsN 3Jz[.܂B*Xo" 7iu. _) Ȳ.VѐE Ç qbp˒z_)cF%f?"6QmVS6?&$Ԏ;#$_cA%?#sxR쮪 U;H2N ZI.GnIENDB`loganalyzer-4.1.5/src/images/icons/media_end.png000066400000000000000000000015441277740250400216460ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 24 Feb 2003 17:53:58 +0100tIME 2 [R. pHYs B4gAMA aIDATxUKhSA{o}KŅS Z)(n wFE\T]ݹPtaERD0mm m6*ڇy1Im^1ɵ39gf.C˝GZb8V|P$ߡ'pl֩7/!zc"y}_7GwwS`^=r|b!#Oi٤> B{Z/݂k10"""Wam%|l|舦(hF nphZd:mqqe9gaXHWw:ׯPB )^3Y314Qd*UqL-2nҙ=({p_D %x5`d EEMp2v[,Ȫ^::/^j( 6<*54d7(FfPj"%PM'(G][vHa#n웅(6S3ƝŽ9WUh.] zDŃ=Hv Tu@P"]U4y:rFp1gLTk|lH$arM՛A 4ʎz:2C}i$]-KBrP> y߄bt~ۈc&B].]gOW.~~ڵu~;(a4oh.񇵆%9,ǸW .ٞ~oXby,S/dWCY37$BsHw f`n]7CeS*[(o$1g ϩT":6uLjOQ}6}nbXPұrxnR^aNҡKM-V`IC*:RJ.+(bѰ>َ "`PE*hQJ@+f;.bsPuǒCr R'5 HJZYE؜OL.ed:h1 b&ޝP^m5fϸIxȍg Dd`ϣ 'vld_;&'I3; rn@B7#M?Ov[HJ(u|(dd9v\xыu:'~'J"ը\]eX[G̈́Y07o8'@&9.w ɡhIENDB`loganalyzer-4.1.5/src/images/icons/media_rewind.png000066400000000000000000000015761277740250400223750ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 24 Feb 2003 17:55:48 +0100A%VtIME 2 [R. pHYs B4gAMA aIDATx]ILSa{k[ZPRE jP [4A/BAc<&jH`&nW z!5dՃD(UY!"TPJXuy]s%tfh|J^?d(5&XCKkZi5[ŃM%)v@KT/1kXξ4MeӪݤ۹ ZdBqa^2t:}N@L|7<njD/iʶpbmuO?9ʼne!l",=g-X @(5Zku }_BAH\?vOaoعĢ&yO+qK1 e*؟s nIm]-Rq[}Rښ lRS? kg@Py8a1,b q6!v$34`wɊшu'^Y?q+Đ7h4 xmE/d֝L|9GMØ|1$F=^NuT{UЉaa򗡯Ft+P1-ۦsɼJaAӢ;>q3:6.lQLzԷL;mjjVܥ@*D`Rh Ma+h(W=aK^x>x57TCȞ@σ.M>JVT"d q >mrGu7'c&b.&w@Ԅ"|aMIENDB`loganalyzer-4.1.5/src/images/icons/media_step_back.png000066400000000000000000000015001277740250400230230ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 24 Feb 2003 17:53:58 +0100tIME 2 [R. pHYs B4gAMA aIDATxeSKhAvvM>D*P4BQ𢧊AAE POEPT>ZAMŶCH64׾wo<EgߘcQ$ۄ˺i23OC';3F9Ev.#|djo?4NS&Vy`5ܙNdٲ%R.#)%;)(5]0 tLPBz{~#k2-:C4$5윟q'=g;c9 ґ6%JKe"gݸ*66"/"4X$]0hQBʰ`H*mnu+̧ ,4FDE!WJpe6jG' +VȘ"ʌʢCT 1c;wJhIә[q 9 Uu P22u-_P*~BOyEzi-.@,`߸fɅB?ZH^:`搸Ʋ ";^s|W9W^q02| Mʹj?kʾ|2@0F(>==0͔gAd)ޢ=8Dh'ؤ#%\﬽0V/Pue-!]J땧@<[IENDB`loganalyzer-4.1.5/src/images/icons/media_step_forward.png000066400000000000000000000015301277740250400235720ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeMo 24 Feb 2003 17:53:58 +0100tIME 2 [R. pHYs B4gAMA aIDATxekQƿsg&i RRRԴnDDtF  "TJqU/؅ҍbW QMVC6I&d =997r1DR0 ?rM=#6 gFӳI1:Wͬ˯\}熦pR:4^4l|})|h0HS+*^30aZ|k3GJ'%t{>2Ҵr*ӠdwC*wi.oL'$JM ҁ3 ߀A.SXߢ C< rw@ZרC45nL,p\2"%1McŖ4FVYEu<aơD"EL ±H@Ī/ϼ RpLl^.p|IENDB`loganalyzer-4.1.5/src/images/icons/mongodb.png000066400000000000000000000007531277740250400213670ustar00rootroot00000000000000PNG  IHDRagAMA a pHYs  ~IDAT8Oc`%?,;Gh{eD Ihbs[s$`%e-ZmbHM>77_a DnFp/7B]~{ͶRo}d~u6|#AxXKγjSKwl_,lsLEZ|P[jf6MN/aJf|sn),oDm{Kv6w4U:W/e_RQ1J=fzMKH`IR?&$N )\\1? ɚA,}044߿2 !_IENDB`loganalyzer-4.1.5/src/images/icons/nav_down_blue.png000066400000000000000000000016101277740250400225550ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeFr 15 Nov 2002 10:08:29 +0100btIME 2#JR pHYs  d_gAMA aIDATxeS]HSa~9;K榒[eED)X]DA]DQQQDQE(XPЕtPF?*t9SvNͭh;>;Ώ h7ZU\ N#-L{)+EPV(\|l1keIIƐ/XL"ȣ_.Å7!Ȍ&d7g[j4={)AJBۑ(E@W~7L *rwE#Nb|V5dZQtFzc`s &sD U'|K !%b3BUzMRpDzKQ XDEL!IMvRjq;Fc:xPk]< A LA$FæЈyJ\9T;la!RQhdzX0<Ƨ%t~˩lQ_ˑbH$ɕ NIPNN"w|a;Dfl##VmN8?sޘ:}vzIQR8 i]fєftMt)EƷa?vw 2rR0)?BFw ( @4Cܝ;dzi*H0C1[i*ֺZaہ"2gwa/9lDpLyνӹ3wFs`TTV2fF G[k럱2sȋ'd!L!s 7+xAĢ;o4A #l?{0~#yG?v5gK'~NnUՓB2FF@Wy UJH(psFBQnߟ,6 V)XQ(lR,MF1qX2^X4*{{}? )c. h&]"S-AŖ] Z-֞F9^\F_&4ebfժT=qל x:惘=;L}xYRTOWYFFrI/;+g`ڍb@E2%P#=]׫*(uNwK@yS4!ýa'&I f$S\^R*,dSkjLA>7 A!PIbr$O1j}({-6` 'X ZG& 'OغnƄJǂдD${&~V MTJ`(q~#iF%բ$BKmN~>$Ld=a%%&i2a',veܳx7vx/~H57&%jP Dg^Rt}OOzCl?R-ݍ?ܪ@ v3K61ȧX&Q[씽Gڋܔ3Fj&-/6Ǧx<b-AV#.'Q_f*hվ;?b.׍DZݺ4zqηܼmT(-b]_;c0(pOb6+~8Zn鿬Lnw:kܼK?P Uv>1= D |3ꫂDjJ5) 5O yh@3!JZ'Klge3^}dKB# 9Ug[/>rn IENDB`loganalyzer-4.1.5/src/images/icons/navigate_down.png000066400000000000000000000013161277740250400225630ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 18 Feb 2003 23:15:10 +0100ۭtIME 2%1 pHYs B4gAMA a&IDATx͒kRqƟi˩ǣ&zNlMW M`,.vA@tSu%u+XUs+,Vs?)2JVj$&nz6~.p̖bJ=xGʰna7 R4;`EJS ] oȪf(iV&N_@&#<`[mg>UoLzަ, mٍ ^h♶A^3hUʊڴ_L6MLݾ k+97 [#c(C8Dk7C3)C },Z=B qm/0޺&f=cnݲf>rh>Nn_3 ۉ u_IENDB`loganalyzer-4.1.5/src/images/icons/navigate_down2.png000066400000000000000000000017201277740250400226440ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 18 Feb 2003 23:15:10 +0100ۭtIME 2%1 pHYs B4gAMA a(IDATxuILaU1 Rq &-1*rp&^hxYˆc;G#(y*gΫ"j1gPƻcxVۈ-V̈d b֎qLf8FewMAɋhC U "_{ 0wHVoTaʵSEdA6 p'Y5Z$_c7SeO%Q`koTjGa0G<0"+VzRsai]Dh @OA;1ĨX &k#6KoTCI_J(@.e@B"‰6xwCR&6g u.{B?dD?<$yDbTHg`<&r"?7-#IENDB`loganalyzer-4.1.5/src/images/icons/navigate_left.png000066400000000000000000000013301277740250400225420ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 18 Feb 2003 23:15:10 +0100ۭtIME 2%1 pHYs B4gAMA a0IDATxڅRORq|/?6LP/0̈FZCoՓ=S륇^ʷzZ[mnm2VYM rDŽ"^sLls糳hpX]wڼ3X[{9|m&^\s,,Ce$&i",pmSy~h?j2%! U4%_U|trӋy,h|i!J(48n$/=X:"6b5Z<0ߧ}n3H̦J01A68a |zެc3I?WL?BF`9+ D:$K`3r or%UY3 @g S@6R.ݘF0^̶AtH+\NN#;b*K{*§9p<$ 8{]*쾤1H-ւ0 <ۡXB;;nK1ZEx&3p EAy}\:5|Ҕ(K)QNA[Vਦ0BIDATxRJAyD/ ?Ɵ3 HnuoVp6=3SSS3%b]%i_bbJ!!2!0s˨cax~*̿K'/ @(r#lu0gaY1́brYLୃ~#2( 終8#0`L~ wU;uv9)EM#pdpe4#^Ek ,)[n }K&W D@:$ŕ3@Z:t¾Ԭd3)ᾒ|>gLRzl^wHHDLRkPɚM@jDݭNہ.#gK^+CQ7)oHR0=KڶI:{i'8㪩.ټFXZGoz KS*ZQ.A,NO緲ayNF0=6gZA4aΰ:cs *2 ԄIENDB`loganalyzer-4.1.5/src/images/icons/navigate_right.png000066400000000000000000000013241277740250400227300ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 18 Feb 2003 23:15:10 +0100ۭtIME 2%1 pHYs B4gAMA a,IDATxڅkQƿ䝦UR$%&R]\Y]"ܺtՍ?hV0hci1b(<ڤ<&xNj{skQF&1xq ߟ&!a`}6s}GIurUJ>`FoU`lrV`D┭d@kYnZ\@7f tn f*Lv Rd[}<הּYC T1Q) ?Swi E}#Ps%#F'$J)/mpk}1=U3S;zcq=h`*2Q5`Ce0^LϷK2נw\㕗͙O )(SCsӯmX8-ϭҡA)!R>'r0W=-#GqdWhٛdjioǁ}sIENDB`loganalyzer-4.1.5/src/images/icons/navigate_up.png000066400000000000000000000012751277740250400222440ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 18 Feb 2003 23:15:10 +0100ۭtIME 2%1 pHYs B4gAMA aIDATx͒=Lawqhr-b[]l 6iј03i¤qfqq3ND?H ʕ =3V']<هSV6o7t妯us7=m$0mq[s$ .˵)W`: rph(Un\z=.6NÚnЮ:Ea;0lEoV)]%)0.۪{ZGU̻Ei(nv28..$Ma,|no<*xR7Kx{+2$?':I`a/h_['qUNNū4a3ۣ@Am-z ?&>1 Z.Gx4:cX3@o"QmF7sտAuvF<ۼIENDB`loganalyzer-4.1.5/src/images/icons/pie-chart.png000066400000000000000000000015601277740250400216130ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 18 Aug 2005 22:17:47 +0100tIME 2*30 pHYs B4gAMA aIDATxڍKQƟ9gffRRVnYAQtQAPF`QA?eUAPI A'DETXZR[nszϲ ]X4; C̏{Ek\ mu!.aJ̏u$^PXp=ϝqo|H;AƵY.X5>zw_SI 7}Zyw`f<-B924BhvZ+,U5u7[/v6Bd50c5 (`bh"glZ_ZvgK CЩ:w`Qv\_jƈ`*[kS9[ʬ3mrBwTmm埂]g9So~WIENDB`loganalyzer-4.1.5/src/images/icons/pie-chart_view.png000066400000000000000000000016651277740250400226530ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 18 Aug 2005 22:17:47 +0100tIME 2*30 pHYs B4gAMA a IDATx}MlLQ77әfIhSC;AA`XXI llH,X!T!觪A -3M;ժjg3}"&ܓs7{S묐z*u6J=2 ʋ1=Wz@2K֜ە7h#;J#'|@eĝ:VR^pAZl1s%:pn .B_X { *? Iu"?UC#UO2oFKqB4F*= v ŷSpMle!]C Il.SP9TA6b}X-H b8Bi2000J;;0%<fVtI3+v?UNäg[N]Mg5MEE4&M4]Q I8ںufvm`#N(atN^VF{oce+ءݘ>xq' @(.x9B*3-#~d =oVQڰ@' !=F (E@ ժ&h9w璨п O~PkɇϛYa=rY$ R2# x܊ua]{sYYP@T*8H %](Ф3rׇĭA"B)D.LZjjF78`SY`34(--cL4d&'')+T$ZanHλl q\nQ is^:cDZXSaT&C%[Q*at)|?v|V<"80B uw7CQ d0պBDۛF RFH/T@ˣ_dS<6H3+ϞI `a~HxFP0-${U(^paSk IR JA?ps:E\Z 4 2ְLCQr@աn{7@˹wi>/Ȳ(4t]/\ b(}ei[R4P4PL4DRft/ z\܂^9v׷ ;t +i*CB Da^+%)`"Y&a^X'J G\낹U{+ZOl8FVKJV@h4~@޵f mw> 6rRd>O/;}d)nyy[: ^mDbDvwsxGkggg 4M64J|&0@.511H(x tB KpvvS&sILma]#9oպjۭeuޫQiacDei>IENDB`loganalyzer-4.1.5/src/images/icons/recycle.png000066400000000000000000000016731277740250400213720ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeFr 9 Jan 2004 00:11:48 +0100tIME* pHYs B4gAMA aIDATx}OWǿ첰+Pՠ?ѐMI?@}D>5}hii%' IA *?,na]`uwgp%Z'L9]ES8R-s͜"W<%AOB{iuyYzXyMillwdψSu` ?fuy E_Ly9TQ?>1vv;_WnM,U96W%3va\Z e mcՊ|7yUlaE m˃wq"'gx*uəYŀ  3N_i ? PZa6es E4Rݭ3!#a/LgZG(NFJde~ưegE([9q1n >DPmRbi_,irBgs=xoyY*hXn.1M/Ӈ\F:"Js)ϙSV1L{KIENDB`loganalyzer-4.1.5/src/images/icons/redo.png000066400000000000000000000015771277740250400207000ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 23:31:44 +0100PHtIME* pHYs  d_gAMA aIDATxڍkHSaǟ3ۜW̙SeDDE]ď}  *+A"PFYlf6\ӝ]nyv3 ?yyy{ %7\-M2Үqz#H|m}}ת״؞I@Fϛz U[m@BC†buaC {9iWigP4:1D6(9z9wo΁G#_eQV&TN{ӳϐSS 5bC%eW 2 nf_&:d嵺b94%z5+<-FX,W#P(~xL@z_ݰ :k$2) ʚ d+H/>ZI]A!Pz$K˨t29x ךw5:U[Wl.r%$H!N 2Ԙh=dlszjs(#[JKjiD)Yז'+5qb7f;#l[sdX̲l+4 #&8TKeL\;F=p4$X׃ζ:-2^}CLP7{\A^^@;Ia=G$k|㣍 UGKH zH5Ue[" íyͦ o6MI.6XDM˹gN)nscbax+ R~,9-JpH(9C K}֚s-?G h*zk=KUK.8[ڻ}JC`B@W@ `Ck>tdS~US'XW#ИyLƞWUWwy{h%ԭ[hLLL^۲u2cFL(+m۝i4^z]壩OIIe45;:z|i0 !BSdu=ضzZ gIDp#3DU2;7)_%Nj;|E v(J/3s MfX3~`߭%(% K @$J/sܟaqŰα(Aa?TN?>;I[/YET"ROe7K*)9@-`)pPwQcUr<;>1Tv94O m[= 93ةL#h* H:l;'}7?d"kv*D0ԅGH_^\n~hl:30LW7Ǝ^nYlKNya*ruD_3901Nd|D?w%Fb079<J"cʃn1IENDB`loganalyzer-4.1.5/src/images/icons/star_blue.png000066400000000000000000000015551277740250400217230ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 22:23:07 +0100)WtIME" pHYs  d_gAMA aIDATxڕYHTaY8L S >XERBC=`ZYaY!D V28xgqҹ6}s||&wLh_מyd9N+&]hӲ7LEjd'J,sї[;0`VPl;bLx$yU/XLPJ2$IY4Br~3ĜhHg7Ͼ!ᨈ/2dY2p]# AF G.|J0ežafK c@XdØW;DBZ2މEqjy ]B%g}sEĨlN DdSި%}u1`1 1 vXj25̐;^Y E!_?يy&^^VEb:o̅0aM@U4=r$=?`]3qy1zL#5M=\lw+5D)EL^UM*~ ԾNQ"L+H @H̏}IENDB`loganalyzer-4.1.5/src/images/icons/star_green.png000066400000000000000000000015721277740250400220730ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 22:23:07 +0100)WtIME" pHYs  d_gAMA aIDATxڕKLatB6ʛE n($M DݸҰ&&;W.1 I%QHDD ike;-tfE`M&gν _{]wUP?Xm5 <JNl7ﮢ7_+-"KP@j@HVwAgBp oڜȱUt~60 z"#9Rm+Nf NY,!W!4DV4!E>' *x!&l~c=ų=qjRʈUǁ")`:`T:`\_p5šE|ޙ5ϗ9bޭk"HP) dB@&Tl]{yy yW<'MTN*D]A9WZs #]* a`mbB/)/oQW³|߭wkQ KegNZd am yH v&YIq(!%nP Fm G!rPZ F\J"f_]aҾ-E4Da?[za>@ IENDB`loganalyzer-4.1.5/src/images/icons/star_grey.png000066400000000000000000000015551277740250400217420ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 22:23:07 +0100)WtIME" pHYs  d_gAMA aIDATxڕKq?ww6 6m8A#_ >,AOB'>(* aZPMۼ9mw>gJ^~~{82rMYCC=!)"xU'Şdɤ%VrՀhUٛ^o%N)A-Q{eUV͒ğqU<_r(b㒱x<{ wvfsP* <@h4`4VxR6HP(b((rg `pY{J%P90*ΆVDȝ =B]Q,w+;S(.D"\*B$FjiXgطA> H<8\;A3d=^V1ʱy$)Npa ղR B m5l4^`&@wJi|4*q<&PimMM=IӴ  \0-XwޡQWxj[qtҧY Y_j)캃[̌o-I^B ~\M&s{Q\ !QdMyW9Ƃ4!r'Y@~/=GT(gXE:Q>IENDB`loganalyzer-4.1.5/src/images/icons/star_red.png000066400000000000000000000015551277740250400215460ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 22:23:07 +0100)WtIME" pHYs  d_gAMA aIDATxڕKLQL[Z[@Z \hbt<#n$سvgNҸ1qFBqA G))J+m)vhk`7N=?shۙǞ7?k,߼JIӑ`U+br*s"P"0c(/M}C\mhi4a_riEc.Kj14EHc}ĕd"Q{;4! <li"!%ȴ2 *h8BZ 95=IN,,hVk8ۇ**%X6`g6kRG`O $ExnrNKW&&?vP>75 .]Xw&Z-DbXe#J|Vh0)YjBrS&^w?$Čq 0lۊw7=),SVH&lP->$QbPR Y%v5t(fFv5ru:/WKktVb.,f; ^yK 6ebEumc?̂`~fte̍8=o7@r΅uKRu), saY79a|Ba5[_[a>-n#sf8GJH* BU`3d,aV B^$|Dl2IENDB`loganalyzer-4.1.5/src/images/icons/star_yellow.png000066400000000000000000000015551277740250400223070ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDo 14 Nov 2002 22:23:07 +0100)WtIME pHYs  d_gAMA aIDATxڕMLQG?ؖ! M h5 4_$4T VT}ܾ!1uZD|tP-[>$c+3k.Gۺ-6x)>3_W@$2a討s;(AmNq lgݦPC]{*Pzv8~t36?$,8L!Ӫ&%&&Q_0#N %B"f#~YdW[TClꝍfx5 $~_NzIENDB`loganalyzer-4.1.5/src/images/icons/table_selection_all.png000066400000000000000000000004511277740250400237210ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeDi 4 Mrz 2003 00:24:04 +0100ItIME tW pHYs B4gAMA aIDATxc`0ə݁z03drv4&^璇 ߀-ddAH8xx88LdSDDH&>[ w(Ecuß|+q  (L$']tR% IENDB`loganalyzer-4.1.5/src/images/icons/table_selection_block.png000066400000000000000000000007731277740250400242520ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeDi 4 Mrz 2003 00:24:04 +0100ItIMEBz pHYs B4gAMA aTIDATxڥS=OA}G `sMl5ML WOʿ`Ca'#!4 0q L1ogޛ]`ðt(rY{^ՙ@7lW^ڦ*5'I)#VKhDTKj5IA@TJj4C)qu| 8.Saz2h#bD*7'tm.H`(AB`:wwx 4vxt!N&@$tv |ܱ ZL{ H܍6׼Pij;Ȅ\nqfv 6~L\#ͷ:mGIENDB`loganalyzer-4.1.5/src/images/icons/tables.png000066400000000000000000000011441277740250400212070ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 25 Feb 2003 22:13:36 +0100tIME 38,9 pHYs B4gAMA aIDATxڅSjAQKE,d!Bl,Rnk,,>:QA#ٙq7$™=sxlz|r8zPד'*ш$/7M1( ~AZ D囒mlWpȖw\_p%= S Aoŋ{89ᕹR>jjd{AAiI>De=Da.Dϙ^4d7X^6#Z yt514˅56Et:]Ѐ]Rb(\ILN|^!!a/BP = آXZH$B̞݈JQSSNnzpQ^^R Á)@aa!22NjYQh&+mF#ҎXHd]SMOٽ>A"l6H,Қɧe gp#9.AA*++%b$GOLQZz]d#;\_Oܾe&3pS;86eGq¨c˞DĠ.$jߖV#E:摞Fãϟp]?10 2J%X4L4Y[>>z~ӄgp)3ۄ f~,wpG ?}9P[IENDB`loganalyzer-4.1.5/src/images/icons/view.png000066400000000000000000000015141277740250400207100ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation TimeDi 16 Aug 2005 13:57:50 +0100цGtIME 3y:z pHYs B4gAMA aIDATxڕKhQϝ<&Mkikű *Ђԕ>+( WҽWN\QD.B kZEӚ&Ś&q&3<2d!P{sl=}f/j}:g&gDnOCТ l b4j /l"tgOMͮ޽n?ɳ?Q-mӽg_ߵnx *a'~#i ghWT/4a@,PPu2hBs:{R`ںy A@'ConŪlJ4 ˚CwP ydن^CKu Y+h4\$!9rEEr񯗰8j]K zT +3CN,G-KLJAZbPX~n m645ܺsXhˆ[ !\>dZ[b8^?o,d!mhd ~*C1,X./,KO+q7v@c,bBl Yv!I" x|cG{[9w](DO6:_ŻGx3N9+H,";?dWsӡT* }SXx*k@72-t?IENDB`loganalyzer-4.1.5/src/images/icons/windows.png000066400000000000000000000010341277740250400214250ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation TimeDi 4 Mrz 2003 00:24:04 +0100ItIME 4 ީ pHYs B4gAMA auIDATxڝR=O@ }IU]b)+_ P s #EbB*i{ؗ8)Amޝug?qȳ]m"@C pS3*rĂ4;K Aq۲rXWI,/Ah\' )n{2|AuRܢy.ۦ _BAGhf>n*fĂZ#4uDA?\7 q۵PAAGiD눂>?Lqr Rq۷AA_Z .'m,f(p+x`k-DPЗĂA3ZG̾*h l2gjPЗĂqہ BtRHD>'"JǙ o{6˃ r}@`%cB[ЉEIK(9S~#)> |:> :CRtw"I -x\tV:d&:Pϛ-#|dz9?/u'EGH"BtZ'i7!2>aRteaa1ȗNsH%{=˙4WE/t Qi(.#D#&\0+0RU+U&"i /#r'Z~˗cG(ڦQ=(Vfïgq_xFlY"Ք38h>ҕEڵ&'aG4M/<_D̳}o((s ,ki |B>bAOxLFaNV`ΐiŠKT V:{t8K͊AE0 qƩ=)« 8^#e=C Hr>ܨ__ :^juFG?\ K| "ad0⣈+a.i!- ǝona8!] H.!}s.]xz|;> iK-{ѿWBZ8do] ,n(E3c 'SН| Fv8.| q٩#tY:BDWz4(Hy/2g">8{y 9o=l0z~ۻimrٻKpܹxet_d)uA}Jv]3.g6\{O첱q|6I^{-gN] LЛf$p+=@fm0h{Z{n*m'F }(eEƋtzҊXaA ZǨ!˖L Hכ溠ZmV A7t! l "ĩY Ҽ|sQ+KWE:>mT!8KZ~\){[ K. υYh#t(:մ= BWWzqWB/΃ۣm&#'9NFB#q0̒@[H&ϡOw+I[/ēMӱ; ^7\ }% Z> =ctjy'|+l#bGQXŌ_3nN~]rwul:*kfޤ/ _I, a[hCZwN96 WJ1 w\LIIC0:&!I,R~陟ID= pqʳjYfU3:0hc lgg/ω9 T:cUnMSh(R kp;SneosI r;[9xCL;mhc 1_M! BA^tm JGM[ PKt:I4u3qxGz^mKWmXiKo}+%zm]'2ws׺ƫt2+'#zZr?`W.[XRmWt#^GxDAe;w,T*SgI?i{Lmnv9I ywOӓu wұd?LIFuUYz٦w\w= H\n@\,:+/_' ipV "ٓ?H#ʔ Yީ]ptb[ '~Ӥ1D+#g052Jp ~&Lާ%{b7Z.Ou{q(4=eqEĂICXi-8>C/.|"S fS l^X( ?˒r7i,T]׭s"Ă&)d?t\ Mi4175}X i|3a;_td݀4޸s)M: ꯅH[%7Kb X} .Sz`^zݍK@\(K,XG,wb*?+`=]yzpt- ?'|>2E"v,X6'>uϙ__ wdDDSpgĂOKT='wy H\n@+>#cW/&r&:[Yt'+]O@^++۔== >֔롸5}(K f*6Az-]D} -DbKh턯n~֪e{c9Lk +s۸ TJC-3Q8rwy H\n@~/QQ_Ɋu/'Rm.3U}rKn׿N)_+5pv q K m Bf5& r }/] NMj>{Z'áN8-諺_ݖGRV-S3ږ{.  @dnZ_:6JYDO<<Z;~%W عkaj{MgtqNUqI iu}WSn.:z&8pPj=y=~8ohfRJç.#Oap}_rD04x2p =O ű;t:Q^mدGYyYd]fp%Hۡ&\"^mUqr-o թ D'Izb>Z߄q?}u.AZDQGq(=~m0 `FOM:{AXfpծ|fp8mwYfp񴙇Is* ϓ½'y]_❤c^}fp8YfG-<| ux&y'=ðx3ö&BfpxHW7ErڍKY" ԓA[I 9ӄ˹o#2܄k*ό4حc](tSYn<2[ U\̈́Zl&8Wd*="臟toFfdu4;6:fOPV+SGc[ 7/0mA*auN:Ia-aPs?|`/?AwfZ].:O=H_v2(:[CNPb ucix VUo&mZtSL(Oǯ8\oYĺ2n[:nC[ۻc(( m # !w4p$ bp l%5e IgLvnnvfwg͘+{vvw&z>S{ek'm|?~^6>66yWtfڅoo|IIU)QL;Ra{#U-[ =k;PL)R8+^3)R@z|]!INM:RZe$"8?.}fհ^r)Y:_[s{lr*uu2j]Kmk2q]KlFҠE\N%̟F᛿HQv=vV!Et '_nIHI͕2Մ.$zF!m1W< ]l2\/yMB:"q ]tm3LM4x3T@/NryNib<+:% xC`z)3% *m=$􎭑4,/剓o?N쎴l/+ŏmabƔ'Kה6k7[8.4S }C: BT+jѮ$c,uF%Y<ԾS.|(kk`y'4,0ojz7r%cK<. zҹa=g*ů'e]L2`w|]]V= l|ޔ.Z94ѐחn%[STs &%]?ďlZAH.?Q $EjpE߿]*hc~$T/CYAs]$tw@Bp=$tw@Bp= AHMqfBTa=p=p=p=p=p=p=p=p=pX\gaMIENDB`loganalyzer-4.1.5/src/images/spacer.gif000066400000000000000000000014471277740250400200660ustar00rootroot00000000000000GIF89a3f3333f333ff3fffff3f̙3f3f3333f3333333333f333333f3f33f3ff3f3f33333f33̙33333f3333333f333ff3fffff3f3f33ff3f3f3fffff3fffffffffff3ffff̙fff3fffffff3fffff3f3333f333ff3fffff3f̙̙̙3̙f̙̙̙3f3f̙3333f3̙33ff3fff̙ff3f̙̙3f̙3f̙3f3333f333ff3fffff3f̙3f3f!u,;loganalyzer-4.1.5/src/include/000077500000000000000000000000001277740250400162725ustar00rootroot00000000000000loganalyzer-4.1.5/src/include/config.sample.php000066400000000000000000000254061277740250400215370ustar00rootroot00000000000000 Configuration need variables for the Database connection * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- UserDB options /* If UserDB is enabled, all options will and have to be configured in the database. * All Options below the UserDB options here will not be used, unless a setting * is missing in the database. */ $CFG['UserDBEnabled'] = false; $CFG['UserDBServer'] = ""; $CFG['UserDBPort'] = 3306; $CFG['UserDBName'] = ""; $CFG['UserDBPref'] = ""; $CFG['UserDBUser'] = ""; $CFG['UserDBPass'] = ""; $CFG['UserDBLoginRequired'] = false; $CFG['UserDBAuthMode'] = USERDB_AUTH_INTERNAL; // USERDB_AUTH_INTERNAL means LogAnalyzer Internal Auth // USERDB_AUTH_LDAP means Auth via LDAP Server // LDAP Auth options $CFG['LDAPServer'] = "127.0.0.1"; // LDAP server hostname or IP $CFG['LDAPPort'] = 389; // LDAP port, 389 or 636 for SSL $CFG['LDAPBaseDN'] = 'CN=Users,DC=domain,DC=local'; // Base DN for LDAP Search, this is a typical ActiveDirectory sample $CFG['LDAPSearchFilter'] = '(objectClass=user)'; // Basic Search filter $CFG['LDAPUidAttribute'] = "sAMAccountName"; // The LDAP attribute used in the search to find the user, example: uid, cn or sAMAccountName (Active Directory) // DN of the privileged user for the search $CFG['LDAPBindDN'] = 'CN=Searchuser,CN=Users,DC=domain,DC=local'; // "Searchuser" = the privilegied user used to query LDAP Directory $CFG['LDAPBindPassword'] = 'Password'; // Password of the privilegied user // --- // --- Misc Options $CFG['MiscShowDebugMsg'] = 0; // if enabled, you will get additional output on certain places $CFG['MiscDebugToSyslog'] = 0; // if enabled, debug messages from LogAnalyzer will be send to syslog on linux, and into the EventLog on Windows $CFG['MiscShowDebugGridCounter'] = 0; // Only for debugging purposes, will add a counter column into the grid! $CFG["MiscShowPageRenderStats"] = 1; // If enabled, you will see Pagerender Settings $CFG['MiscEnableGzipCompression'] = 1; // If enabled, LogAnalyzer will use gzip compression for output, we recommend // to have this option enabled, it will highly reduce bandwith usage. $CFG['MiscMaxExecutionTime'] = 30; // LogAnalyzer will try to overwrite the default script timeout with this value during runtime! // This can of course only work if LogAnalyzer is allowed to changed the script timeout. $CFG['DebugUserLogin'] = 0; // if enabled, you will see additional informations on failed logins // --- // --- Default Frontend Options $CFG['PrependTitle'] = ""; // If set, this text will be prepended withint the title tag $CFG['ViewUseTodayYesterday'] = 1; // If enabled, the date from today and yesterday is displayed as "today" and "yesterday" $CFG['ViewMessageCharacterLimit'] = 80; // Default character limit for the message gets trunscated! 0 means NO trunscation. $CFG['ViewStringCharacterLimit'] = 30; // Default character limit for all other string type fields before they get trunscated! 0 means NO trunscation. $CFG['ViewEntriesPerPage'] = 50; // Default number of syslog entries shown per page $CFG['ViewEnableDetailPopups'] = 1; // If enabled, you will see additional Details for each syslog message on mouse over. $CFG['ViewDefaultTheme'] = "default"; // This sets the default theme the user is going to see when he opens LogAnalyzer the first time. // Currently only "default" and "dark" are available. $CFG['ViewDefaultLanguage'] = "en"; // Sets the default display language $CFG['ViewEnableAutoReloadSeconds'] = 0; // If "ViewEnableAutoReloadSeconds" is set to anything higher the 0 (which means disabled), this means auto reload is enabled by default. $CFG['SearchCustomButtonCaption'] = "I'd like to feel sad"; // Default caption for the custom fast search button $CFG['SearchCustomButtonSearch'] = "error"; // Default search string for the custom search button $CFG['EnableContextLinks'] = 1; // if enabled, context links within the messages will automatically be created and added. Set this to 0 to disable all context links. $CFG['EnableIPAddressResolve'] = 1; // If enabled, IP Addresses inline messages are automatically resolved and the result is added in brackets {} behind the IP Address $CFG['SuppressDuplicatedMessages'] = 0; // If enabled, duplicated messages will be suppressed in the main display. $CFG['TreatNotFoundFiltersAsTrue'] = 0; // If you filter / search for messages, and the fields you are filtering for is not found, the filter result is treaten as TRUE! $CFG['PopupMenuTimeout'] = 3000; // This variable defines the default timeout value for popup menus in milliseconds. (those menus which popup when you click on the value of a field. $CFG['PhplogconLogoUrl'] = ""; // Put an Url to a custom toplogo you want to use. $CFG['InlineOnlineSearchIcons'] = 1; // Show online search icons $CFG['UseProxyServerForRemoteQueries'] = "";// If empty no proxy server will be used. If set to a proxy server url like 127.0.0.1:8080, LogAnalyzer will use this server for url queries like the updatecheck. $CFG['HeaderDefaultEncoding'] = ENC_ISO_8859_1; // Set default character encoding $CFG['DefaultFont'] = "Arial"; // Sets the default Font to be used in Loganalyzer $CFG['DefaultFontSize'] = "100"; // Sets the percentage font size, default is 100 (Percent). Can be changed up to 200 and down to 50 with good results. // --- // --- Custom HTML Code $CFG['InjectHtmlHeader'] = ""; // Use this variable to inject custom html into the html area! $CFG['InjectBodyHeader'] = ""; // Use this variable to inject custom html into the begin of the area! $CFG['InjectBodyFooter'] = ""; // Use this variable to inject custom html into the end of the area! // --- // --- Define which fields you want to see //$CFG['ShowMessage'] = true; // If enabled, the Message column will be appended to the columns list. //Eventlog based fields: $CFG['Columns'] = array ( SYSLOG_DATE, SYSLOG_HOST, SYSLOG_EVENT_LOGTYPE, SYSLOG_EVENT_SOURCE, /*SYSLOG_EVENT_CATEGORY, */SYSLOG_EVENT_ID, SYSLOG_MESSAGE ); //$CFG['Columns'] = array ( SYSLOG_DATE, SYSLOG_FACILITY, SYSLOG_SEVERITY, SYSLOG_HOST, SYSLOG_SYSLOGTAG, SYSLOG_MESSAGETYPE, SYSLOG_MESSAGE ); $CFG['DefaultViewsID'] = ""; // --- // --- Predefined Searches! $CFG['Search'][] = array ( "DisplayName" => "Syslog Warnings and Errors", "SearchQuery" => "filter=severity%3A0%2C1%2C2%2C3%2C4&search=Search" ); $CFG['Search'][] = array ( "DisplayName" => "Syslog Errors", "SearchQuery" => "filter=severity%3A0%2C1%2C2%2C3&search=Search" ); $CFG['Search'][] = array ( "DisplayName" => "All messages from the last hour", "SearchQuery" => "filter=datelastx%3A1&search=Search" ); $CFG['Search'][] = array ( "DisplayName" => "All messages from last 12 hours", "SearchQuery" => "filter=datelastx%3A2&search=Search" ); $CFG['Search'][] = array ( "DisplayName" => "All messages from last 24 hours", "SearchQuery" => "filter=datelastx%3A3&search=Search" ); $CFG['Search'][] = array ( "DisplayName" => "All messages from last 7 days", "SearchQuery" => "filter=datelastx%3A4&search=Search" ); $CFG['Search'][] = array ( "DisplayName" => "All messages from last 31 days", "SearchQuery" => "filter=datelastx%3A5&search=Search" ); // $CFG['Search'][] = array ( "DisplayName" => "", "SearchQuery" => "" ); // --- // --- Predefined Charts! $CFG['Charts'][] = array ( "DisplayName" => "Top Hosts", "chart_type" => CHART_BARS_HORIZONTAL, "chart_width" => 400, "chart_field" => SYSLOG_HOST, "maxrecords" => 10, "showpercent" => 0, "chart_enabled" => 1 ); $CFG['Charts'][] = array ( "DisplayName" => "SyslogTags", "chart_type" => CHART_CAKE, "chart_width" => 400, "chart_field" => SYSLOG_SYSLOGTAG, "maxrecords" => 10, "showpercent" => 0, "chart_enabled" => 1 ); $CFG['Charts'][] = array ( "DisplayName" => "Severity Occurences", "chart_type" => CHART_BARS_VERTICAL, "chart_width" => 400, "chart_field" => SYSLOG_SEVERITY, "maxrecords" => 10, "showpercent" => 1, "chart_enabled" => 1 ); $CFG['Charts'][] = array ( "DisplayName" => "Usage by Day", "chart_type" => CHART_CAKE, "chart_width" => 400, "chart_field" => SYSLOG_DATE, "maxrecords" => 10, "showpercent" => 1, "chart_enabled" => 1 ); // --- // --- Configure allowed directories for File base logstream sources $CFG['DiskAllowed'][] = "/var/log/"; // --- // --- Source Options /* Example for DiskType Source: $CFG['Sources']['Source1']['ID'] = "Source1"; $CFG['Sources']['Source1']['Name'] = "Syslog Disk File"; $CFG['Sources']['Source1']['Description'] = "More details you want to see about this source"; $CFG['Sources']['Source1']['SourceType'] = SOURCE_DISK; $CFG['Sources']['Source1']['LogLineType'] = "syslog"; $CFG['Sources']['Source1']['MsgParserList'] = ""; $CFG['Sources']['Source1']['MsgNormalize'] = 0; $CFG['Sources']['Source1']['DiskFile'] = "/var/log/syslog"; $CFG['Sources']['Source1']['ViewID'] = "SYSLOG"; $CFG['Sources']['Source2']['ID'] = "Source5"; $CFG['Sources']['Source2']['Name'] = "WinSyslog DB"; $CFG['Sources']['Source1']['Description'] = ""; $CFG['Sources']['Source2']['SourceType'] = SOURCE_DB; $CFG['Sources']['Source1']['MsgParserList'] = ""; $CFG['Sources']['Source2']['DBTableType'] = "winsyslog"; $CFG['Sources']['Source2']['DBType'] = DB_MYSQL; $CFG['Sources']['Source2']['DBServer'] = "localhost"; $CFG['Sources']['Source2']['DBName'] = "loganalyzer"; $CFG['Sources']['Source2']['DBUser'] = "root"; $CFG['Sources']['Source2']['DBPassword'] = ""; $CFG['Sources']['Source2']['DBTableName'] = "systemevents"; $CFG['Sources']['Source2']['ViewID'] = "SYSLOG"; */ // --- %Insert Source Here% // --- ?>loganalyzer-4.1.5/src/include/constants_errors.php000066400000000000000000000056061277740250400224220ustar00rootroot00000000000000 Stuff which has to be static and predefined * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- define('SUCCESS', 0); define('ERROR', 1); // This is a simple helper constant! which we can use to check if there even was an error! Any result code above 0 is an error! define('ERROR_FILE_NOT_FOUND', 2); define('ERROR_FILE_CANT_CLOSE', 3); define('ERROR_FILE_EOF', 4); define('ERROR_FILE_BOF', 5); define('ERROR_FILE_NOT_READABLE', 15); define('ERROR_FILE_NOMORETIME', 22); define('ERROR_UNDEFINED', 6); define('ERROR_EOS', 7); define('ERROR_NOMORERECORDS', 8); define('ERROR_FILTER_NOT_MATCH', 9); define('ERROR_SOURCENOTFOUND', 24); define('ERROR_DB_CONNECTFAILED', 10); define('ERROR_DB_CANNOTSELECTDB', 11); define('ERROR_DB_QUERYFAILED', 12); define('ERROR_DB_NOPROPERTIES', 13); define('ERROR_DB_INVALIDDBMAPPING', 14); define('ERROR_DB_INVALIDDBDRIVER', 16); define('ERROR_DB_TABLENOTFOUND', 17); define('ERROR_DB_DBFIELDNOTFOUND', 19); define('ERROR_MSG_NOMATCH', 18); define('ERROR_CHARTS_NOTCONFIGURED', 20); define('ERROR_MSG_SKIPMESSAGE', 21); define('ERROR_MSG_SCANABORTED', 23); define('ERROR_REPORT_NODATA', 25); define('ERROR_DB_INDEXESMISSING', 26); define('ERROR_DB_TRIGGERMISSING', 27); define('ERROR_DB_INDEXFAILED', 28); define('ERROR_DB_TRIGGERFAILED', 29); define('ERROR_DB_CHECKSUMERROR', 30); define('ERROR_DB_CHECKSUMCHANGEFAILED', 31); define('ERROR_DB_ADDDBFIELDFAILED', 32); define('ERROR_DB_TIMEOUTFAILED', 34); define('ERROR_PATH_NOT_ALLOWED', 33); ?>loganalyzer-4.1.5/src/include/constants_filters.php000066400000000000000000000151021277740250400225460ustar00rootroot00000000000000 Stuff which has to be static and predefined * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Some custom defines define('DATEMODE_ALL', 1); define('DATEMODE_RANGE', 2); define('DATEMODE_LASTX', 3); define('DATEMODE_RANGE_FROM', 4); define('DATEMODE_RANGE_TO', 5); define('DATEMODE_RANGE_DATE', 6); define('DATE_LASTX_HOUR', 1); define('DATE_LASTX_12HOURS', 2); define('DATE_LASTX_24HOURS', 3); define('DATE_LASTX_7DAYS', 4); define('DATE_LASTX_31DAYS', 5); // --- // Helper constants needed for parsing filters define('FILTER_TMP_KEY', 0); define('FILTER_TMP_VALUE', 1); define('FILTER_TMP_MODE', 2); define('FILTER_DATEMODE', 'datemode'); define('FILTER_TYPE', 'filtertype'); define('FILTER_DATEMODENAME', 'datemodename'); define('FILTER_VALUE', 'value'); define('FILTER_MODE', 'filtermode'); define('FILTER_MODE_INCLUDE', 1); define('FILTER_MODE_EXCLUDE', 2); define('FILTER_MODE_SEARCHFULL', 4); define('FILTER_MODE_SEARCHREGEX', 8); // --- Init Facility LIST $content['filter_facility_list'][] = array( "ID" => SYSLOG_KERN, "DisplayName" => "KERN", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_USER, "DisplayName" => "USER", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_MAIL, "DisplayName" => "MAIL", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_DAEMON, "DisplayName" => "DAEMON", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_AUTH, "DisplayName" => "AUTH", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_SYSLOG, "DisplayName" => "SYSLOG", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LPR, "DisplayName" => "LPR", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_NEWS, "DisplayName" => "NEWS", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_UUCP, "DisplayName" => "UUCP", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_CRON, "DisplayName" => "CRON", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_SECURITY, "DisplayName" => "SECURITY", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_FTP, "DisplayName" => "FTP", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_NTP, "DisplayName" => "NTP", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOGAUDIT, "DisplayName" => "LOGAUDIT", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOGALERT, "DisplayName" => "LOGALERT", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_CLOCK, "DisplayName" => "CLOCK", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL0, "DisplayName" => "LOCAL0", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL1, "DisplayName" => "LOCAL1", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL2, "DisplayName" => "LOCAL2", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL3, "DisplayName" => "LOCAL3", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL4, "DisplayName" => "LOCAL4", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL5, "DisplayName" => "LOCAL5", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL6, "DisplayName" => "LOCAL6", "selected" => "" ); $content['filter_facility_list'][] = array( "ID" => SYSLOG_LOCAL7, "DisplayName" => "LOCAL7", "selected" => "" ); // --- // Init Severity LIST $content['filter_severity_list'][] = array( "ID" => SYSLOG_EMERG, "DisplayName" => "EMERG", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_ALERT, "DisplayName" => "ALERT", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_CRIT, "DisplayName" => "CRIT", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_ERR, "DisplayName" => "ERR", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_WARNING, "DisplayName" => "WARNING", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_NOTICE, "DisplayName" => "NOTICE", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_INFO, "DisplayName" => "INFO", "selected" => "" ); $content['filter_severity_list'][] = array( "ID" => SYSLOG_DEBUG, "DisplayName" => "DEBUG", "selected" => "" ); // --- // Init MessageType LIST //$content['filter_messagetype_list'][] = array( "ID" => IUT_Unknown, "DisplayName" => "Unknown", "selected" => "" ); $content['filter_messagetype_list'][] = array( "ID" => IUT_Syslog, "DisplayName" => "Syslog", "selected" => "" ); $content['filter_messagetype_list'][] = array( "ID" => IUT_NT_EventReport, "DisplayName" => "WinEventLog", "selected" => "" ); $content['filter_messagetype_list'][] = array( "ID" => IUT_File_Monitor, "DisplayName" => "File Monitor", "selected" => "" ); $content['filter_messagetype_list'][] = array( "ID" => IUT_WEBSERVERLOG, "DisplayName" => "Webserver Logfile", "selected" => "" ); ?>loganalyzer-4.1.5/src/include/constants_general.php000066400000000000000000000164201277740250400225170ustar00rootroot00000000000000 Stuff which has to be static and predefined * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Some custom defines define('RUNMODE_COMMANDLINE', 1); define('RUNMODE_WEBSERVER', 2); define('DEBUG_ULTRADEBUG', 5); define('DEBUG_DEBUG', 4); define('DEBUG_INFO', 3); define('DEBUG_WARN', 2); define('DEBUG_ERROR', 1); define('DEBUG_ERROR_WTF', 0); define('STR_DEBUG_ULTRADEBUG', "UltraDebug"); define('STR_DEBUG_DEBUG', "Debug"); define('STR_DEBUG_INFO', "Information"); define('STR_DEBUG_WARN', "Warning"); define('STR_DEBUG_ERROR', "Error"); define('STR_DEBUG_ERROR_WTF', "WTF OMFG"); // --- Config Level defines define('CFGLEVEL_GLOBAL', 0); define('CFGLEVEL_GROUP', 1); define('CFGLEVEL_USER', 2); // --- // --- Source Type defines define('SOURCE_DISK', '1'); define('SOURCE_DB', '2'); define('SOURCE_PDO', '3'); define('SOURCE_MONGODB', '4'); // --- // --- Exportformat defines define('EXPORT_CVS', 'CVS'); define('EXPORT_XML', 'XML'); // --- // --- GFX Chart Types define('CHART_CAKE', 1); define('CHART_BARS_VERTICAL', 2); define('CHART_BARS_HORIZONTAL', 3); define('CHARTDATA_NAME', 'NAME'); define('CHARTDATA_COUNT', 'COUNT'); // --- // --- define('UID_UNKNOWN', -1); // --- // --- Define possible database types define('DB_MYSQL', 0); define('DB_MSSQL', 1); define('DB_ODBC', 2); define('DB_PGSQL', 3); define('DB_OCI', 4); define('DB_DB2', 5); define('DB_FIREBIRD', 6); define('DB_INFORMIX', 7); define('DB_SQLITE', 8); // --- // --- Define supported AUTH Methods define('USERDB_AUTH_INTERNAL', 0); define('USERDB_AUTH_LDAP', 1); // --- // --- Syslog specific defines! define('SYSLOG_KERN', 0); define('SYSLOG_USER', 1); define('SYSLOG_MAIL', 2); define('SYSLOG_DAEMON', 3); define('SYSLOG_AUTH', 4); define('SYSLOG_SYSLOG', 5); define('SYSLOG_LPR', 6); define('SYSLOG_NEWS', 7); define('SYSLOG_UUCP', 8); define('SYSLOG_CRON', 9); define('SYSLOG_SECURITY', 10); define('SYSLOG_FTP', 11); define('SYSLOG_NTP', 12); define('SYSLOG_LOGAUDIT', 13); define('SYSLOG_LOGALERT', 14); define('SYSLOG_CLOCK', 15); define('SYSLOG_LOCAL0', 16); define('SYSLOG_LOCAL1', 17); define('SYSLOG_LOCAL2', 18); define('SYSLOG_LOCAL3', 19); define('SYSLOG_LOCAL4', 20); define('SYSLOG_LOCAL5', 21); define('SYSLOG_LOCAL6', 22); define('SYSLOG_LOCAL7', 23); $facility_colors[SYSLOG_KERN] = "#F1BEA7"; $facility_colors[SYSLOG_USER] = "#F1D0A7"; $facility_colors[SYSLOG_MAIL] = "#F1E3A7"; $facility_colors[SYSLOG_DAEMON] = "#E5F1A7"; $facility_colors[SYSLOG_AUTH] = "#D3F1A7"; $facility_colors[SYSLOG_SYSLOG] = "#C1F1A7"; $facility_colors[SYSLOG_LPR] = "#A7F1D6"; $facility_colors[SYSLOG_NEWS] = "#A7F1E8"; $facility_colors[SYSLOG_UUCP] = "#A7E1F1"; $facility_colors[SYSLOG_CRON] = "#A7C8F1"; $facility_colors[SYSLOG_SECURITY] = "#F2ECD8"; $facility_colors[SYSLOG_FTP] = "#ECE3C4"; $facility_colors[SYSLOG_NTP] = "#E7DAB1"; $facility_colors[SYSLOG_LOGAUDIT] = "#F2D8E2"; $facility_colors[SYSLOG_LOGALERT] = "#ECC4D3"; $facility_colors[SYSLOG_CLOCK] = "#E7B1C5"; $facility_colors[SYSLOG_LOCAL0] = "#F2F2F2"; $facility_colors[SYSLOG_LOCAL1] = "#E4E5E6"; $facility_colors[SYSLOG_LOCAL2] = "#D6D9DA"; $facility_colors[SYSLOG_LOCAL3] = "#C9CDCF"; $facility_colors[SYSLOG_LOCAL4] = "#BEC2C4"; $facility_colors[SYSLOG_LOCAL5] = "#B1B6B9"; $facility_colors[SYSLOG_LOCAL6] = "#A3AAAD"; $facility_colors[SYSLOG_LOCAL7] = "#969DA1"; define('SYSLOG_EMERG', 0); define('SYSLOG_ALERT', 1); define('SYSLOG_CRIT', 2); define('SYSLOG_ERR', 3); define('SYSLOG_WARNING', 4); define('SYSLOG_NOTICE', 5); define('SYSLOG_INFO', 6); define('SYSLOG_DEBUG', 7); $severity_colors[SYSLOG_EMERG] = "#840A15"; $severity_colors[SYSLOG_ALERT] = "#BA0716"; $severity_colors[SYSLOG_CRIT] = "#CE0819"; $severity_colors[SYSLOG_ERR] = "#BB0A1F"; $severity_colors[SYSLOG_WARNING] = "#EF8200"; $severity_colors[SYSLOG_NOTICE] = "#14AD42"; $severity_colors[SYSLOG_INFO] = "#0C9C91"; $severity_colors[SYSLOG_DEBUG] = "#119BDE"; // --- // --- MonitorWare InfoUnit Defines | Messagetypes define('IUT_Unknown', '0'); define('IUT_Syslog', '1'); define('IUT_Heartbeat', '2'); define('IUT_NT_EventReport', '3'); define('IUT_SNMP_Trap', '4'); define('IUT_File_Monitor', '5'); define('IUT_PingProbe', '8'); define('IUT_Port_Probe', '9'); define('IUT_NTService_Monitor', '10'); define('IUT_DiskSpace_Monitor', '11'); define('IUT_DB_Monitor', '12'); define('IUT_Serial_Monitor', '13'); define('IUT_CPU_Monitor', '14'); define('IUT_AliveMonRequest', '16'); define('IUT_SMTPProbe', '17'); define('IUT_FTPProbe', '18'); define('IUT_HTTPProbe', '19'); define('IUT_POP3Probe', '20'); define('IUT_IMAPProbe', '21'); define('IUT_NNTPProbe', '22'); define('IUT_WEVTMONV2', '23'); define('IUT_SMTPLISTENER', '24'); define('IUT_WEBSERVERLOG', '10001'); $msgtype_colors[IUT_Unknown] = "#D0FBDC"; $msgtype_colors[IUT_Syslog] = "#D0FBF1"; $msgtype_colors[IUT_Heartbeat] = "#D0EEFB"; $msgtype_colors[IUT_NT_EventReport] = "#D0E5FB"; $msgtype_colors[IUT_SNMP_Trap] = "#D0DBFB"; $msgtype_colors[IUT_File_Monitor] = "#DAD0FB"; $msgtype_colors[IUT_PingProbe] = "#E0D0FB"; $msgtype_colors[IUT_Port_Probe] = "#F6D0FB"; $msgtype_colors[IUT_NTService_Monitor] = "#FBD0E7"; $msgtype_colors[IUT_DiskSpace_Monitor] = "#FBD0D3"; $msgtype_colors[IUT_DB_Monitor] = "#FBD8D0"; $msgtype_colors[IUT_Serial_Monitor] = "#FBE0D0"; $msgtype_colors[IUT_CPU_Monitor] = "#FBEBD0"; $msgtype_colors[IUT_AliveMonRequest] = "#FBF6D0"; $msgtype_colors[IUT_SMTPProbe] = "#F5FBD0"; $msgtype_colors[IUT_FTPProbe] = "#EBFBD0"; $msgtype_colors[IUT_HTTPProbe] = "#E1FBD0"; $msgtype_colors[IUT_POP3Probe] = "#D0FBD4"; $msgtype_colors[IUT_IMAPProbe] = "#D0FBE8"; $msgtype_colors[IUT_NNTPProbe] = "#D0F7FB"; $msgtype_colors[IUT_WEVTMONV2] = "#CCE4D2"; $msgtype_colors[IUT_SMTPLISTENER] = "#CCE4DE"; $msgtype_colors[IUT_WEBSERVERLOG] = "#E1FBD0"; // --- // Supported Encodings define('ENC_ISO_8859_1', "ISO-8859-1"); define('ENC_UTF8', "utf-8"); $encodings[ENC_ISO_8859_1] = array("ID" => ENC_ISO_8859_1); $encodings[ENC_UTF8] = array("ID" => ENC_UTF8); ?>loganalyzer-4.1.5/src/include/constants_logstream.php000066400000000000000000000471011277740250400230770ustar00rootroot00000000000000 Stuff which has to be static and predefined * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Define properties names of all know fields define('SYSLOG_UID', 'uID'); define('SYSLOG_DATE', 'timereported'); define('SYSLOG_HOST', 'FROMHOST'); define('SYSLOG_MESSAGETYPE', 'IUT'); define('SYSLOG_MESSAGE', 'msg'); // Syslog specific define('SYSLOG_FACILITY', 'syslogfacility'); define('SYSLOG_SEVERITY', 'syslogseverity'); define('SYSLOG_SYSLOGTAG', 'syslogtag'); define('SYSLOG_PROCESSID', 'procid'); // EventLog specific define('SYSLOG_EVENT_ID', 'id'); define('SYSLOG_EVENT_LOGTYPE', 'NTEventLogType'); define('SYSLOG_EVENT_SOURCE', 'sourceproc'); define('SYSLOG_EVENT_CATEGORY', 'category'); define('SYSLOG_EVENT_USER', 'user'); // Weblog specific define('SYSLOG_WEBLOG_USER', 'http_user'); define('SYSLOG_WEBLOG_METHOD', 'http_method'); define('SYSLOG_WEBLOG_URL', 'http_url'); define('SYSLOG_WEBLOG_QUERYSTRING', 'http_querystring'); define('SYSLOG_WEBLOG_PVER', 'http_ver'); define('SYSLOG_WEBLOG_STATUS', 'http_status'); define('SYSLOG_WEBLOG_BYTESSEND', 'http_bytessend'); define('SYSLOG_WEBLOG_REFERER', 'http_referer'); define('SYSLOG_WEBLOG_USERAGENT', 'http_useragent'); // Other fields define('MISC_SYSTEMID', 'misc_systenid'); define('MISC_CHECKSUM', 'misc_checksum'); // --- // Define possible FIELD Types define('FILTER_TYPE_STRING', 0); define('FILTER_TYPE_NUMBER', 1); define('FILTER_TYPE_DATE', 2); define('FILTER_TYPE_BOOL', 3); define('FILTER_TYPE_UNKNOWN', 99); // Define possible alignments define('ALIGN_CENTER', 'center'); define('ALIGN_LEFT', 'left'); define('ALIGN_RIGHT', 'right'); // Defines for Report output types define('REPORT_OUTPUT_HTML', 'html'); define('REPORT_OUTPUT_PDF', 'pdf'); // Defines for Report output targets define('REPORT_TARGET_STDOUT', 'stdout'); define('REPORT_TARGET_FILE', 'file'); define('REPORT_TARGET_EMAIL', 'mail'); // Further helper defines for output targets define('REPORT_TARGET_TYPE', 'type'); define('REPORT_TARGET_FILENAME', 'filename'); // Defines for sorting define('SORTING_ORDER_ASC', 'asc'); define('SORTING_ORDER_DESC', 'desc'); // --- Predefine fields array! $fields[SYSLOG_UID]['FieldID'] = SYSLOG_UID; $fields[SYSLOG_UID]['FieldDefine'] = 'SYSLOG_UID'; $fields[SYSLOG_UID]['FieldCaption'] = 'uID'; $fields[SYSLOG_UID]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_UID]['Sortable'] = false; $fields[SYSLOG_UID]['DefaultWidth'] = "50"; $fields[SYSLOG_UID]['FieldAlign'] = "center"; $fields[SYSLOG_UID]['SearchOnline'] = false; $fields[SYSLOG_DATE]['FieldID'] = SYSLOG_DATE; $fields[SYSLOG_DATE]['FieldDefine'] = 'SYSLOG_DATE'; $fields[SYSLOG_DATE]['FieldCaption'] = 'Date'; $fields[SYSLOG_DATE]['FieldType'] = FILTER_TYPE_DATE; $fields[SYSLOG_DATE]['Sortable'] = true; $fields[SYSLOG_DATE]['DefaultWidth'] = "115"; $fields[SYSLOG_DATE]['FieldAlign'] = "center"; $fields[SYSLOG_DATE]['SearchOnline'] = false; $fields[SYSLOG_HOST]['FieldID'] = SYSLOG_HOST; $fields[SYSLOG_HOST]['FieldDefine'] = 'SYSLOG_HOST'; $fields[SYSLOG_HOST]['FieldCaption'] = 'Host'; $fields[SYSLOG_HOST]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_HOST]['Sortable'] = true; $fields[SYSLOG_HOST]['DefaultWidth'] = "80"; $fields[SYSLOG_HOST]['FieldAlign'] = "left"; $fields[SYSLOG_HOST]['SearchField'] = "source"; $fields[SYSLOG_HOST]['SearchOnline'] = false; $fields[SYSLOG_MESSAGETYPE]['FieldID'] = SYSLOG_MESSAGETYPE; $fields[SYSLOG_MESSAGETYPE]['FieldDefine'] = 'SYSLOG_MESSAGETYPE'; $fields[SYSLOG_MESSAGETYPE]['FieldCaption'] = 'Messagetype'; $fields[SYSLOG_MESSAGETYPE]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_MESSAGETYPE]['Sortable'] = true; $fields[SYSLOG_MESSAGETYPE]['DefaultWidth'] = "90"; $fields[SYSLOG_MESSAGETYPE]['FieldAlign'] = "center"; $fields[SYSLOG_MESSAGETYPE]['SearchField'] = "messagetype"; $fields[SYSLOG_MESSAGETYPE]['SearchOnline'] = false; // Syslog specific $fields[SYSLOG_FACILITY]['FieldID'] = SYSLOG_FACILITY; $fields[SYSLOG_FACILITY]['FieldDefine'] = 'SYSLOG_FACILITY'; $fields[SYSLOG_FACILITY]['FieldCaption'] = 'Facility'; $fields[SYSLOG_FACILITY]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_FACILITY]['Sortable'] = true; $fields[SYSLOG_FACILITY]['DefaultWidth'] = "50"; $fields[SYSLOG_FACILITY]['FieldAlign'] = "center"; $fields[SYSLOG_FACILITY]['SearchField'] = "facility"; $fields[SYSLOG_FACILITY]['SearchOnline'] = true; $fields[SYSLOG_SEVERITY]['FieldID'] = SYSLOG_SEVERITY; $fields[SYSLOG_SEVERITY]['FieldDefine'] = 'SYSLOG_SEVERITY'; $fields[SYSLOG_SEVERITY]['FieldCaption'] = 'Severity'; $fields[SYSLOG_SEVERITY]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_SEVERITY]['Sortable'] = true; $fields[SYSLOG_SEVERITY]['DefaultWidth'] = "50"; $fields[SYSLOG_SEVERITY]['FieldAlign'] = "center"; $fields[SYSLOG_SEVERITY]['SearchField'] = "severity"; $fields[SYSLOG_SEVERITY]['SearchOnline'] = true; $fields[SYSLOG_SYSLOGTAG]['FieldID'] = SYSLOG_SYSLOGTAG; $fields[SYSLOG_SYSLOGTAG]['FieldDefine'] = 'SYSLOG_SYSLOGTAG'; $fields[SYSLOG_SYSLOGTAG]['FieldCaption'] = 'Syslogtag'; $fields[SYSLOG_SYSLOGTAG]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_SYSLOGTAG]['Sortable'] = true; $fields[SYSLOG_SYSLOGTAG]['DefaultWidth'] = "85"; $fields[SYSLOG_SYSLOGTAG]['FieldAlign'] = "left"; $fields[SYSLOG_SYSLOGTAG]['SearchField'] = "syslogtag"; $fields[SYSLOG_SYSLOGTAG]['SearchOnline'] = true; $fields[SYSLOG_PROCESSID]['FieldID'] = SYSLOG_PROCESSID; $fields[SYSLOG_PROCESSID]['FieldDefine'] = 'SYSLOG_PROCESSID'; $fields[SYSLOG_PROCESSID]['FieldCaption'] = 'ProcessID'; $fields[SYSLOG_PROCESSID]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_PROCESSID]['Sortable'] = true; $fields[SYSLOG_PROCESSID]['DefaultWidth'] = "65"; $fields[SYSLOG_PROCESSID]['FieldAlign'] = "center"; $fields[SYSLOG_PROCESSID]['SearchField'] = "processid"; $fields[SYSLOG_PROCESSID]['SearchOnline'] = false; // EventLog specific $fields[SYSLOG_EVENT_ID]['FieldID'] = SYSLOG_EVENT_ID; $fields[SYSLOG_EVENT_ID]['FieldDefine'] = 'SYSLOG_EVENT_ID'; $fields[SYSLOG_EVENT_ID]['FieldCaption'] = 'Event ID'; $fields[SYSLOG_EVENT_ID]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_EVENT_ID]['Sortable'] = true; $fields[SYSLOG_EVENT_ID]['DefaultWidth'] = "65"; $fields[SYSLOG_EVENT_ID]['FieldAlign'] = "center"; $fields[SYSLOG_EVENT_ID]['SearchField'] = "eventid"; $fields[SYSLOG_EVENT_ID]['SearchOnline'] = true; $fields[SYSLOG_EVENT_LOGTYPE]['FieldID'] = SYSLOG_EVENT_LOGTYPE; $fields[SYSLOG_EVENT_LOGTYPE]['FieldDefine'] = 'SYSLOG_EVENT_LOGTYPE'; $fields[SYSLOG_EVENT_LOGTYPE]['FieldCaption'] = 'Eventlog Type'; $fields[SYSLOG_EVENT_LOGTYPE]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_EVENT_LOGTYPE]['Sortable'] = true; $fields[SYSLOG_EVENT_LOGTYPE]['DefaultWidth'] = "100"; $fields[SYSLOG_EVENT_LOGTYPE]['FieldAlign'] = "left"; $fields[SYSLOG_EVENT_LOGTYPE]['SearchField'] = "eventlogtype"; $fields[SYSLOG_EVENT_LOGTYPE]['SearchOnline'] = true; $fields[SYSLOG_EVENT_SOURCE]['FieldID'] = SYSLOG_EVENT_SOURCE; $fields[SYSLOG_EVENT_SOURCE]['FieldDefine'] = 'SYSLOG_EVENT_SOURCE'; $fields[SYSLOG_EVENT_SOURCE]['FieldCaption'] = 'Event Source'; $fields[SYSLOG_EVENT_SOURCE]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_EVENT_SOURCE]['Sortable'] = true; $fields[SYSLOG_EVENT_SOURCE]['DefaultWidth'] = "100"; $fields[SYSLOG_EVENT_SOURCE]['FieldAlign'] = "left"; $fields[SYSLOG_EVENT_SOURCE]['SearchField'] = "eventlogsource"; $fields[SYSLOG_EVENT_SOURCE]['SearchOnline'] = true; $fields[SYSLOG_EVENT_CATEGORY]['FieldID'] = SYSLOG_EVENT_CATEGORY; $fields[SYSLOG_EVENT_CATEGORY]['FieldDefine'] = 'SYSLOG_EVENT_CATEGORY'; $fields[SYSLOG_EVENT_CATEGORY]['FieldCaption'] = 'Event Category'; $fields[SYSLOG_EVENT_CATEGORY]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_EVENT_CATEGORY]['Sortable'] = true; $fields[SYSLOG_EVENT_CATEGORY]['DefaultWidth'] = "50"; $fields[SYSLOG_EVENT_CATEGORY]['FieldAlign'] = "center"; $fields[SYSLOG_EVENT_CATEGORY]['SearchField'] = "eventcategory"; $fields[SYSLOG_EVENT_CATEGORY]['SearchOnline'] = false; $fields[SYSLOG_EVENT_USER]['FieldID'] = SYSLOG_EVENT_USER; $fields[SYSLOG_EVENT_USER]['FieldDefine'] = 'SYSLOG_EVENT_USER'; $fields[SYSLOG_EVENT_USER]['FieldCaption'] = 'Event User'; $fields[SYSLOG_EVENT_USER]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_EVENT_USER]['Sortable'] = true; $fields[SYSLOG_EVENT_USER]['DefaultWidth'] = "85"; $fields[SYSLOG_EVENT_USER]['FieldAlign'] = "left"; $fields[SYSLOG_EVENT_USER]['SearchField'] = "eventuser"; $fields[SYSLOG_EVENT_USER]['SearchOnline'] = false; // Weblogfile specific $fields[SYSLOG_WEBLOG_USER]['FieldID'] = SYSLOG_WEBLOG_USER; $fields[SYSLOG_WEBLOG_USER]['FieldDefine'] = 'SYSLOG_WEBLOG_USER'; $fields[SYSLOG_WEBLOG_USER]['FieldCaption'] = 'HTTP User'; $fields[SYSLOG_WEBLOG_USER]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_USER]['Sortable'] = false; $fields[SYSLOG_WEBLOG_USER]['DefaultWidth'] = "75"; $fields[SYSLOG_WEBLOG_USER]['FieldAlign'] = "left"; $fields[SYSLOG_WEBLOG_USER]['SearchField'] = SYSLOG_WEBLOG_USER; $fields[SYSLOG_WEBLOG_USER]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_METHOD]['FieldID'] = SYSLOG_WEBLOG_METHOD; $fields[SYSLOG_WEBLOG_METHOD]['FieldDefine'] = 'SYSLOG_WEBLOG_METHOD'; $fields[SYSLOG_WEBLOG_METHOD]['FieldCaption'] = 'Method'; $fields[SYSLOG_WEBLOG_METHOD]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_METHOD]['Sortable'] = false; $fields[SYSLOG_WEBLOG_METHOD]['DefaultWidth'] = "50"; $fields[SYSLOG_WEBLOG_METHOD]['FieldAlign'] = "center"; $fields[SYSLOG_WEBLOG_METHOD]['SearchField'] = SYSLOG_WEBLOG_METHOD; $fields[SYSLOG_WEBLOG_METHOD]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_URL]['FieldID'] = SYSLOG_WEBLOG_URL; $fields[SYSLOG_WEBLOG_URL]['FieldDefine'] = 'SYSLOG_WEBLOG_URL'; $fields[SYSLOG_WEBLOG_URL]['FieldCaption'] = 'URL'; $fields[SYSLOG_WEBLOG_URL]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_URL]['Sortable'] = false; $fields[SYSLOG_WEBLOG_URL]['DefaultWidth'] = "200"; $fields[SYSLOG_WEBLOG_URL]['FieldAlign'] = "left"; $fields[SYSLOG_WEBLOG_URL]['SearchField'] = SYSLOG_WEBLOG_URL; $fields[SYSLOG_WEBLOG_URL]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_QUERYSTRING]['FieldID'] = SYSLOG_WEBLOG_QUERYSTRING; $fields[SYSLOG_WEBLOG_QUERYSTRING]['FieldDefine'] = 'SYSLOG_WEBLOG_QUERYSTRING'; $fields[SYSLOG_WEBLOG_QUERYSTRING]['FieldCaption'] = 'Querystring'; $fields[SYSLOG_WEBLOG_QUERYSTRING]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_QUERYSTRING]['Sortable'] = false; $fields[SYSLOG_WEBLOG_QUERYSTRING]['DefaultWidth'] = "200"; $fields[SYSLOG_WEBLOG_QUERYSTRING]['FieldAlign'] = "left"; $fields[SYSLOG_WEBLOG_QUERYSTRING]['SearchField'] = SYSLOG_WEBLOG_QUERYSTRING; $fields[SYSLOG_WEBLOG_QUERYSTRING]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_PVER]['FieldID'] = SYSLOG_WEBLOG_PVER; $fields[SYSLOG_WEBLOG_PVER]['FieldDefine'] = 'SYSLOG_WEBLOG_PVER'; $fields[SYSLOG_WEBLOG_PVER]['FieldCaption'] = 'Version'; $fields[SYSLOG_WEBLOG_PVER]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_PVER]['Sortable'] = false; $fields[SYSLOG_WEBLOG_PVER]['DefaultWidth'] = "50"; $fields[SYSLOG_WEBLOG_PVER]['FieldAlign'] = "center"; $fields[SYSLOG_WEBLOG_PVER]['SearchField'] = SYSLOG_WEBLOG_PVER; $fields[SYSLOG_WEBLOG_PVER]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_STATUS]['FieldID'] = SYSLOG_WEBLOG_STATUS; $fields[SYSLOG_WEBLOG_STATUS]['FieldDefine'] = 'SYSLOG_WEBLOG_STATUS'; $fields[SYSLOG_WEBLOG_STATUS]['FieldCaption'] = 'Status'; $fields[SYSLOG_WEBLOG_STATUS]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_WEBLOG_STATUS]['Sortable'] = false; $fields[SYSLOG_WEBLOG_STATUS]['DefaultWidth'] = "50"; $fields[SYSLOG_WEBLOG_STATUS]['FieldAlign'] = "center"; $fields[SYSLOG_WEBLOG_STATUS]['SearchField'] = SYSLOG_WEBLOG_STATUS; $fields[SYSLOG_WEBLOG_STATUS]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_BYTESSEND]['FieldID'] = SYSLOG_WEBLOG_BYTESSEND; $fields[SYSLOG_WEBLOG_BYTESSEND]['FieldDefine'] = 'SYSLOG_WEBLOG_BYTESSEND'; $fields[SYSLOG_WEBLOG_BYTESSEND]['FieldCaption'] = 'Bytes Send'; $fields[SYSLOG_WEBLOG_BYTESSEND]['FieldType'] = FILTER_TYPE_NUMBER; $fields[SYSLOG_WEBLOG_BYTESSEND]['Sortable'] = false; $fields[SYSLOG_WEBLOG_BYTESSEND]['DefaultWidth'] = "75"; $fields[SYSLOG_WEBLOG_BYTESSEND]['FieldAlign'] = "left"; $fields[SYSLOG_WEBLOG_BYTESSEND]['SearchField'] = SYSLOG_WEBLOG_BYTESSEND; $fields[SYSLOG_WEBLOG_BYTESSEND]['SearchOnline'] = false; $fields[SYSLOG_WEBLOG_REFERER]['FieldID'] = SYSLOG_WEBLOG_REFERER; $fields[SYSLOG_WEBLOG_REFERER]['FieldDefine'] = 'SYSLOG_WEBLOG_REFERER'; $fields[SYSLOG_WEBLOG_REFERER]['FieldCaption'] = 'Referer'; $fields[SYSLOG_WEBLOG_REFERER]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_REFERER]['Sortable'] = false; $fields[SYSLOG_WEBLOG_REFERER]['DefaultWidth'] = "200"; $fields[SYSLOG_WEBLOG_REFERER]['FieldAlign'] = "left"; $fields[SYSLOG_WEBLOG_REFERER]['SearchField'] = SYSLOG_WEBLOG_REFERER; $fields[SYSLOG_WEBLOG_REFERER]['SearchOnline'] = true; $fields[SYSLOG_WEBLOG_USERAGENT]['FieldID'] = SYSLOG_WEBLOG_USERAGENT; $fields[SYSLOG_WEBLOG_USERAGENT]['FieldDefine'] = 'SYSLOG_WEBLOG_USERAGENT'; $fields[SYSLOG_WEBLOG_USERAGENT]['FieldCaption'] = 'User Agent'; $fields[SYSLOG_WEBLOG_USERAGENT]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_WEBLOG_USERAGENT]['Sortable'] = false; $fields[SYSLOG_WEBLOG_USERAGENT]['DefaultWidth'] = "100"; $fields[SYSLOG_WEBLOG_USERAGENT]['FieldAlign'] = "left"; $fields[SYSLOG_WEBLOG_USERAGENT]['SearchField'] = SYSLOG_WEBLOG_USERAGENT; $fields[SYSLOG_WEBLOG_USERAGENT]['SearchOnline'] = true; // Misc fields $fields[MISC_SYSTEMID]['FieldID'] = MISC_SYSTEMID; $fields[MISC_SYSTEMID]['FieldDefine'] = 'MISC_SYSTEMID'; $fields[MISC_SYSTEMID]['FieldCaption'] = 'SystemID'; $fields[MISC_SYSTEMID]['FieldType'] = FILTER_TYPE_NUMBER; $fields[MISC_SYSTEMID]['Sortable'] = false; $fields[MISC_SYSTEMID]['DefaultWidth'] = "50"; $fields[MISC_SYSTEMID]['FieldAlign'] = "center"; $fields[MISC_SYSTEMID]['SearchField'] = MISC_SYSTEMID; $fields[MISC_SYSTEMID]['SearchOnline'] = false; $fields[MISC_CHECKSUM]['FieldID'] = MISC_CHECKSUM; $fields[MISC_CHECKSUM]['FieldDefine'] = 'MISC_CHECKSUM'; $fields[MISC_CHECKSUM]['FieldCaption'] = 'Checksum'; $fields[MISC_CHECKSUM]['FieldType'] = FILTER_TYPE_NUMBER; $fields[MISC_CHECKSUM]['Sortable'] = false; $fields[MISC_CHECKSUM]['DefaultWidth'] = "50"; $fields[MISC_CHECKSUM]['FieldAlign'] = "center"; $fields[MISC_CHECKSUM]['SearchField'] = MISC_CHECKSUM; $fields[MISC_CHECKSUM]['SearchOnline'] = false; // Message is the last element, this order is important for the Detail page for now! $fields[SYSLOG_MESSAGE]['FieldID'] = SYSLOG_MESSAGE; $fields[SYSLOG_MESSAGE]['FieldDefine'] = 'SYSLOG_MESSAGE'; $fields[SYSLOG_MESSAGE]['FieldCaption'] = 'Message'; $fields[SYSLOG_MESSAGE]['FieldType'] = FILTER_TYPE_STRING; $fields[SYSLOG_MESSAGE]['Sortable'] = false; $fields[SYSLOG_MESSAGE]['DefaultWidth'] = "100%"; $fields[SYSLOG_MESSAGE]['FieldAlign'] = "left"; // $fields[SYSLOG_MESSAGE]['SearchField'] = ""; $fields[SYSLOG_MESSAGE]['SearchField'] = SYSLOG_MESSAGE; $fields[SYSLOG_MESSAGE]['SearchOnline'] = false; // --- // --- Define default Database field mappings! $dbmapping['monitorware']['ID'] = "monitorware"; $dbmapping['monitorware']['DisplayName'] = "MonitorWare"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_UID] = "ID"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_DATE] = "DeviceReportedTime"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_HOST] = "FromHost"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_MESSAGETYPE] = "InfoUnitID"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_MESSAGE] = "Message"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_FACILITY] = "Facility"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_SEVERITY] = "Priority"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_SYSLOGTAG] = "SysLogTag"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_PROCESSID] = "ProcessID"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_ID] = "EventID"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_LOGTYPE] = "EventLogType"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_SOURCE] = "EventSource"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_CATEGORY] = "EventCategory"; $dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_USER] = "EventUser"; $dbmapping['monitorware']['DBMAPPINGS'][MISC_SYSTEMID] = "SystemID"; $dbmapping['monitorware']['DBMAPPINGS'][MISC_CHECKSUM] = "Checksum"; //$dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_PROCESSID] = "ProcessID"; $dbmapping['syslogng']['ID'] = "syslogng"; $dbmapping['syslogng']['DisplayName'] = "SyslogNG"; $dbmapping['syslogng']['DBMAPPINGS'][SYSLOG_UID] = "seq"; $dbmapping['syslogng']['DBMAPPINGS'][SYSLOG_DATE] = "datetime"; $dbmapping['syslogng']['DBMAPPINGS'][SYSLOG_HOST] = "host"; $dbmapping['syslogng']['DBMAPPINGS'][SYSLOG_MESSAGE] = "msg"; //NOT POSSIBLE YET $dbmapping['syslogng'][SYSLOG_FACILITY] = "Facility"; //NOT POSSIBLE YET $dbmapping['syslogng'][SYSLOG_SEVERITY] = "Priority"; $dbmapping['syslogng']['DBMAPPINGS'][SYSLOG_SYSLOGTAG] = "tag"; $dbmapping['syslogng']['DBMAPPINGS'][SYSLOG_PROCESSID] = "program"; $dbmapping['mongodb']['ID'] = "mongodb"; $dbmapping['mongodb']['DisplayName'] = "MongoDB"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_UID] = "_id"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_DATE] = "time"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_HOST] = "sys"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_MESSAGE] = "msg"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_FACILITY] = "syslog_fac"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_SEVERITY] = "syslog_sever"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_SYSLOGTAG] = "procid"; // not using syslog_tag because of PID in it $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_PROCESSID] = "pid"; $dbmapping['mongodb']['DBMAPPINGS'][MISC_CHECKSUM] = "Checksum"; $dbmapping['mongodb']['DBMAPPINGS'][SYSLOG_EVENT_LOGTYPE] = "nteventlogtype"; // Convert all fieldnames to lowercase to avoid problems with case sensitive array keys later foreach( $dbmapping as &$myMapping ) { foreach( $myMapping['DBMAPPINGS'] as &$myField ) $myField = strtolower($myField); } // --- // EventTime Constants define('EVTIME_TIMESTAMP', '0'); define('EVTIME_TIMEZONE', '1'); define('EVTIME_MICROSECONDS', '2'); ?>loganalyzer-4.1.5/src/include/db_template.txt000066400000000000000000000137471277740250400213270ustar00rootroot00000000000000-- phpMyAdmin SQL Dump -- version 2.10.1 -- http://www.phpmyadmin.net SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Table structure for table `logcon_config` -- DROP TABLE IF EXISTS `logcon_config`; CREATE TABLE `logcon_config` ( `propname` varchar(32) NOT NULL, `propvalue` varchar(255) NULL, `propvalue_text` text NULL, `is_global` tinyint(1) NOT NULL, `userid` int(11) default NULL, `groupid` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table to store global and user specific configurations'; -- -- Table structure for table `logcon_groupmembers` -- DROP TABLE IF EXISTS `logcon_groupmembers`; CREATE TABLE IF NOT EXISTS `logcon_groupmembers` ( `userid` int(11) NOT NULL, `groupid` int(11) NOT NULL, `is_member` tinyint(1) NOT NULL default '1' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Helpertable to store which users are in which group'; -- -- Table structure for table `logcon_groups` -- DROP TABLE IF EXISTS `logcon_groups`; CREATE TABLE IF NOT EXISTS `logcon_groups` ( `ID` int(11) NOT NULL auto_increment, `groupname` varchar(32) NOT NULL, `groupdescription` varchar(255) NOT NULL, `grouptype` int(11) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table for phplogcon groups' AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_searches` -- DROP TABLE IF EXISTS `logcon_searches`; CREATE TABLE IF NOT EXISTS `logcon_searches` ( `ID` int(11) NOT NULL auto_increment, `DisplayName` varchar(255) NOT NULL, `SearchQuery` varchar(1024) NOT NULL, `userid` int(11) default NULL, `groupid` int(11) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Stores custom user searches' AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_sources` -- DROP TABLE IF EXISTS `logcon_sources`; CREATE TABLE `logcon_sources` ( `ID` int(11) NOT NULL auto_increment, `Name` varchar(255) NOT NULL, `Description` text NOT NULL, `SourceType` tinyint(4) NOT NULL, `MsgParserList` varchar(255) NOT NULL, `MsgNormalize` tinyint(1) NOT NULL default '0', `MsgSkipUnparseable` tinyint(1) NOT NULL default '0', `ViewID` varchar(64) NOT NULL, `LogLineType` varchar(64) default NULL, `DiskFile` varchar(255) default NULL, `DBTableType` varchar(64) default NULL, `DBType` tinyint(4) default NULL, `DBServer` varchar(255) default NULL, `DBName` varchar(64) default NULL, `DBUser` varchar(64) default NULL, `DBPassword` varchar(255) default NULL, `DBTableName` varchar(64) default NULL, `DBEnableRowCounting` tinyint(1) default NULL, `DBRecordsPerQuery` int(11) NOT NULL default '100', `defaultfilter` VARCHAR(1024) NOT NULL, `userid` int(11) default NULL, `groupid` int(11) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table to store datasources in phplogcon' AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_users` -- DROP TABLE IF EXISTS `logcon_users`; CREATE TABLE IF NOT EXISTS `logcon_users` ( `ID` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL, `password` varchar(32) NOT NULL, `is_admin` tinyint(1) NOT NULL default '0', `is_readonly` tinyint(1) NOT NULL DEFAULT '0', `last_login` int(4) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table for the phplogcon users' AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_views` -- DROP TABLE IF EXISTS `logcon_views`; CREATE TABLE IF NOT EXISTS `logcon_views` ( `ID` int(11) NOT NULL auto_increment, `DisplayName` varchar(255) NOT NULL, `Columns` text NOT NULL, `userid` int(11) default NULL, `groupid` int(11) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Stores custom defined user views.' AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_charts` -- DROP TABLE IF EXISTS `logcon_charts`; CREATE TABLE IF NOT EXISTS `logcon_charts` ( `ID` int(11) NOT NULL auto_increment, `DisplayName` varchar(255) NOT NULL, `chart_enabled` tinyint(1) NOT NULL default '1', `chart_type` int(11) NOT NULL, `chart_width` int(11) NOT NULL, `chart_field` varchar(255) NOT NULL, `chart_defaultfilter` VARCHAR(1024) NOT NULL, `maxrecords` int(11) NOT NULL, `showpercent` tinyint(1) NOT NULL, `userid` int(11) default NULL, `groupid` int(11) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table contains all configured charts' AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_fields` -- DROP TABLE IF EXISTS `logcon_fields`; CREATE TABLE `logcon_fields` ( `FieldID` varchar(64) NOT NULL, `FieldDefine` varchar(64) NOT NULL, `FieldCaption` varchar(255) NOT NULL, `FieldType` int(11) NOT NULL, `Sortable` tinyint(1) NOT NULL, `DefaultWidth` int(11) NOT NULL, `FieldAlign` varchar(32) NOT NULL, `SearchField` varchar(64) NOT NULL, `SearchOnline` tinyint(1) NOT NULL, `Trunscate` int(11) NOT NULL, PRIMARY KEY (`FieldID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table stores custom fields'; -- -- Table structure for table `logcon_dbmappings` -- DROP TABLE IF EXISTS `logcon_dbmappings`; CREATE TABLE `logcon_dbmappings` ( `ID` int(11) NOT NULL auto_increment, `DisplayName` varchar(64) NOT NULL, `Mappings` varchar(1024) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -- Table structure for table `logcon_savedreports` -- DROP TABLE IF EXISTS `logcon_savedreports`; CREATE TABLE `logcon_savedreports` ( `ID` int(11) NOT NULL auto_increment, `reportid` varchar(255) NOT NULL, `sourceid` int(11) NOT NULL, `customTitle` varchar(255) NOT NULL, `customComment` text NOT NULL, `filterString` text NOT NULL, `customFilters` text NOT NULL, `outputFormat` varchar(64) NOT NULL, `outputTarget` varchar(64) NOT NULL, `outputTargetDetails` text NOT NULL, `scheduleSettings` text NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT = 'Table to store saved reports' AUTO_INCREMENT=1 ; loganalyzer-4.1.5/src/include/db_update_v0.txt000066400000000000000000000001031277740250400213610ustar00rootroot00000000000000-- New Database Structure Updates -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v1.txt000066400000000000000000000001031277740250400213620ustar00rootroot00000000000000-- New Database Structure Updates -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v10.txt000066400000000000000000000004161277740250400214510ustar00rootroot00000000000000-- New Database Structure Updates ALTER TABLE `logcon_charts` ADD `chart_defaultfilter` VARCHAR( 1024 ) NOT NULL AFTER `chart_field` ; ALTER TABLE `logcon_sources` ADD `defaultfilter` VARCHAR( 1024 ) NOT NULL AFTER `DBRecordsPerQuery` ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v2.txt000066400000000000000000000004031277740250400213660ustar00rootroot00000000000000-- New Database Structure Updates ALTER TABLE `logcon_sources` ADD `MsgParserList` VARCHAR( 255 ) NOT NULL AFTER `SourceType` ; ALTER TABLE `logcon_sources` ADD `MsgNormalize` BOOL NOT NULL DEFAULT '0' AFTER `MsgParserList` ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v3.txt000066400000000000000000000030221277740250400213670ustar00rootroot00000000000000-- New Database Structure Updates CREATE TABLE IF NOT EXISTS `logcon_charts` ( `ID` int(11) NOT NULL auto_increment, `DisplayName` varchar(255) NOT NULL, `chart_enabled` tinyint(1) NOT NULL default '1', `chart_type` int(11) NOT NULL, `chart_width` int(11) NOT NULL, `chart_field` varchar(255) NOT NULL, `maxrecords` int(11) NOT NULL, `showpercent` tinyint(1) NOT NULL, `userid` int(11) default NULL, `groupid` int(11) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table contains all configured charts' AUTO_INCREMENT=1 ; -- Insert data INSERT INTO `logcon_charts` (`ID`, `DisplayName`, `chart_enabled`, `chart_type`, `chart_width`, `chart_field`, `maxrecords`, `showpercent`, `userid`, `groupid`) VALUES (1, 'Top Hosts', 1, 3, 400, 'FROMHOST', 10, 0, NULL, NULL); INSERT INTO `logcon_charts` (`ID`, `DisplayName`, `chart_enabled`, `chart_type`, `chart_width`, `chart_field`, `maxrecords`, `showpercent`, `userid`, `groupid`) VALUES (2, 'SyslogTags', 1, 1, 400, 'syslogtag', 10, 0, NULL, NULL); INSERT INTO `logcon_charts` (`ID`, `DisplayName`, `chart_enabled`, `chart_type`, `chart_width`, `chart_field`, `maxrecords`, `showpercent`, `userid`, `groupid`) VALUES (3, 'Severity Occurences', 1, 2, 400, 'syslogseverity', 10, 1, NULL, NULL); INSERT INTO `logcon_charts` (`ID`, `DisplayName`, `chart_enabled`, `chart_type`, `chart_width`, `chart_field`, `maxrecords`, `showpercent`, `userid`, `groupid`) VALUES (4, 'Usage by Day', 1, 1, 400, 'timereported', 10, 1, NULL, NULL); -- Updated Data loganalyzer-4.1.5/src/include/db_update_v4.txt000066400000000000000000000002171277740250400213730ustar00rootroot00000000000000-- New Database Structure Updates ALTER TABLE `logcon_sources` ADD `Description` TEXT NOT NULL AFTER `Name` ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v5.txt000066400000000000000000000010661277740250400213770ustar00rootroot00000000000000-- New Database Structure Updates CREATE TABLE `logcon_fields` ( `FieldID` varchar(64) NOT NULL, `FieldDefine` varchar(64) NOT NULL, `FieldCaption` varchar(255) NOT NULL, `FieldType` int(11) NOT NULL, `Sortable` tinyint(1) NOT NULL, `DefaultWidth` int(11) NOT NULL, `FieldAlign` varchar(32) NOT NULL, `SearchField` varchar(64) NOT NULL, `SearchOnline` tinyint(1) NOT NULL, `Trunscate` int(11) NOT NULL, PRIMARY KEY (`FieldID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table stores custom fields'; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v6.txt000066400000000000000000000002261277740250400213750ustar00rootroot00000000000000-- New Database Structure Updates ALTER TABLE `logcon_config` ADD `propvalue_text` TEXT NOT NULL AFTER `propvalue` ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v7.txt000066400000000000000000000004301277740250400213730ustar00rootroot00000000000000-- New Database Structure Updates ALTER TABLE `logcon_sources` ADD `MsgSkipUnparseable` BOOL NOT NULL DEFAULT '0' AFTER `MsgNormalize` ; ALTER TABLE `logcon_sources` ADD `DBRecordsPerQuery` INT NOT NULL DEFAULT '100' AFTER `DBEnableRowCounting` ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v8.txt000066400000000000000000000004511277740250400213770ustar00rootroot00000000000000-- New Database Structure Updates CREATE TABLE `logcon_dbmappings` ( `ID` int(11) NOT NULL auto_increment, `DisplayName` varchar(64) NOT NULL, `Mappings` varchar(1024) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/db_update_v9.txt000066400000000000000000000013171277740250400214020ustar00rootroot00000000000000-- New Database Structure Updates CREATE TABLE `logcon_savedreports` ( `ID` int(11) NOT NULL auto_increment, `reportid` varchar(255) NOT NULL, `sourceid` int(11) NOT NULL, `customTitle` varchar(255) NOT NULL, `customComment` text NOT NULL, `filterString` text NOT NULL, `customFilters` text NOT NULL, `outputFormat` varchar(64) NOT NULL, `outputTarget` varchar(64) NOT NULL, `outputTargetDetails` text NOT NULL, `scheduleSettings` text NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT = 'Table to store saved reports' AUTO_INCREMENT=1 ; ALTER TABLE `logcon_users` ADD `is_readonly` tinyint(1) NOT NULL DEFAULT '0' AFTER `is_admin` ; -- Insert data -- Updated Data loganalyzer-4.1.5/src/include/functions_common.php000066400000000000000000002466351277740250400224030ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Basic Includes require_once($gl_root_path . 'include/constants_errors.php'); include_once($gl_root_path . 'include/constants_general.php'); include_once($gl_root_path . 'include/constants_logstream.php'); include_once($gl_root_path . 'classes/class_template.php'); include_once($gl_root_path . 'include/functions_themes.php'); include_once($gl_root_path . 'include/functions_db.php'); include_once($gl_root_path . 'include/functions_config.php'); // --- // --- Define Basic vars $RUNMODE = RUNMODE_WEBSERVER; $DEBUGMODE = DEBUG_INFO; // --- Change some runtime variables // Disable ARGV setting @webserver! @ini_set( "register_argc_argv", "Off" ); // Enable error tracking @ini_set( "track_errors", "On" ); // --- // Default language $LANG_EN = "en"; // Used for fallback $LANG = "en"; // Default language // Default Template vars $content['BUILDNUMBER'] = "4.1.5"; $content['UPDATEURL'] = "http://loganalyzer.adiscon.com/files/version.txt"; $content['TITLE'] = "Adiscon LogAnalyzer :: Release " . $content['BUILDNUMBER']; // Default page title $content['BASEPATH'] = $gl_root_path; $content['SHOW_DONATEBUTTON'] = true; // Default = true! // Hardcoded DEFINES define('URL_ONLINEREPORTS', 'http://tools.adiscon.net/listreports.php'); // PreInit overall user variables $content['EXTRA_PHPLOGCON_LOGO'] = $content['BASEPATH'] . "images/main/Header-Logo.png"; $content['EXTRA_METATAGS'] = ""; $content['EXTRA_JAVASCRIPT'] = ""; $content['EXTRA_STYLESHEET'] = ""; $content['EXTRA_HTMLHEAD'] = ""; $content['EXTRA_HEADER'] = ""; $content['EXTRA_FOOTER'] = ""; $content['CURRENTURL'] = ""; // --- // --- Check PHP Version! If lower the 5, LogAnalyzer will not work proberly! $myPhpVer = phpversion(); $myPhpVerArray = explode('.', $myPhpVer); if ( $myPhpVerArray[0] < 5 ) DieWithErrorMsg( 'Error, the PHP Version on this Server does not meet the installation requirements.
    PHP5 or higher is needed. Current installed Version is: ' . $myPhpVer . ''); // --- function InitBasicPhpLogCon() { // Needed to make global global $gl_root_path, $content; // Check RunMode first! CheckAndSetRunMode(); // Set the default line sep SetLineBreakVar(); // Start the PHP Session StartPHPSession(); // Init View Configs prior loading config.php! InitViewConfigs(); } function InitUserSystemPhpLogCon() { // global vars needed global $gl_root_path, $content; if ( GetConfigSetting("UserDBEnabled", false) ) { // Include User Functions include_once($gl_root_path . 'include/functions_users.php'); } } function CheckForInstallPhp() { global $content; // Check for installscript! if ( file_exists($content['BASEPATH'] . "install.php") ) $strinstallmsg = '

    ' . '
    Click here to Install Adiscon LogAnalyzer!

    ' // . 'See the Installation Guides for more Details!
    ' // . 'English Installation Guide | ' // . 'German Installation Guide

    ' // . 'Also take a look to the Readme for some basics around LogAnalyzer!
    ' . '
    '; else $strinstallmsg = ""; DieWithErrorMsg( 'Error, main configuration file is missing!' . $strinstallmsg ); } function GetFileLength($szFileName) { if ( is_file($szFileName) ) return filesize($szFileName); else return 0; } function InitPhpLogCon() { // Needed to make global global $gl_root_path, $content, $CFG; // Abort if already defined if ( defined('PHPLOGCON_INITIALIZED') ) return; // Init Basics which do not need a database InitBasicPhpLogCon(); // Will init the config file! InitPhpLogConConfigFile(); // Init UserDB related stuff! InitUserSystemPhpLogCon(); // Establish DB Connection if ( GetConfigSetting("UserDBEnabled", false) ) DB_Connect(); // Now load the Page configuration values InitConfigurationValues(); // Moved here, because we do not need if GZIP needs to be enabled before the config is loaded! InitRuntimeInformations(); // Now Create Themes List because we haven't the config before! CreateThemesList(); // Create Language List CreateLanguageList(); // Init Predefined Searches List CreatePredefinedSearches(); // Init predefined paging sizes CreatePagesizesList(); // Init predefined reload times CreateReloadTimesList(); // Init predefined reload times CreateExportFormatList(); // --- Enable PHP Debug Mode InitPhpDebugMode(); // --- // --- Init Allowed directories for DiskSources InitDiskAllowedSources(); // --- // --- Check and Remove Magic Quotes! RemoveMagicQuotes(); // --- // Finally defined PHPLOGCON_INITIALIZED! define( 'PHPLOGCON_INITIALIZED', TRUE ); } function CreateLogLineTypesList( $selectedType ) { global $content; // syslog $content['LOGLINETYPES']["syslog"]['type'] = "syslog"; $content['LOGLINETYPES']["syslog"]['DisplayName'] = "Syslog / RSyslog"; if ( $selectedType == $content['LOGLINETYPES']["syslog"]['type'] ) { $content['LOGLINETYPES']["syslog"]['selected'] = "selected"; } else { $content['LOGLINETYPES']["syslog"]['selected'] = ""; } // Adiscon Winsyslog $content['LOGLINETYPES']["winsyslog"]['type'] = "winsyslog"; $content['LOGLINETYPES']["winsyslog"]['DisplayName'] = "Adiscon WinSyslog"; if ( $selectedType == $content['LOGLINETYPES']["winsyslog"]['type'] ) { $content['LOGLINETYPES']["winsyslog"]['selected'] = "selected"; } else { $content['LOGLINETYPES']["winsyslog"]['selected'] = ""; } // Misc logline Types $content['LOGLINETYPES']["misc"]['type'] = "misc"; $content['LOGLINETYPES']["misc"]['DisplayName'] = "Miscellaneous logfiles"; if ( $selectedType == $content['LOGLINETYPES']["misc"]['type'] ) { $content['LOGLINETYPES']["misc"]['selected'] = "selected"; } else { $content['LOGLINETYPES']["misc"]['selected'] = ""; } // RSyslog Format23 $content['LOGLINETYPES']["syslog23"]['type'] = "syslog23"; $content['LOGLINETYPES']["syslog23"]['DisplayName'] = "RSyslog Format23 (RFC 5424)"; if ( $selectedType == $content['LOGLINETYPES']["syslog23"]['type'] ) { $content['LOGLINETYPES']["syslog23"]['selected'] = "selected"; } else { $content['LOGLINETYPES']["syslog23"]['selected'] = ""; } // Syslog-NG $content['LOGLINETYPES']["syslogng"]['type'] = "syslogng"; $content['LOGLINETYPES']["syslogng"]['DisplayName'] = "Syslog NG Format (Custom)"; if ( $selectedType == $content['LOGLINETYPES']["syslogng"]['type'] ) { $content['LOGLINETYPES']["syslogng"]['selected'] = "selected"; } else { $content['LOGLINETYPES']["syslogng"]['selected'] = ""; } } function CreateSourceTypesList( $selectedSource ) { global $content; // SOURCE_DISK $content['SOURCETYPES'][SOURCE_DISK]['type'] = SOURCE_DISK; $content['SOURCETYPES'][SOURCE_DISK]['DisplayName'] = $content['LN_GEN_SOURCE_DISK']; if ( $selectedSource == $content['SOURCETYPES'][SOURCE_DISK]['type'] ) { $content['SOURCETYPES'][SOURCE_DISK]['selected'] = "selected"; } else { $content['SOURCETYPES'][SOURCE_DISK]['selected'] = ""; } // SOURCE_DB ( MYSQL NATIVE ) $content['SOURCETYPES'][SOURCE_DB]['type'] = SOURCE_DB; $content['SOURCETYPES'][SOURCE_DB]['DisplayName'] = $content['LN_GEN_SOURCE_DB']; if ( $selectedSource == $content['SOURCETYPES'][SOURCE_DB]['type'] ) { $content['SOURCETYPES'][SOURCE_DB]['selected'] = "selected"; } else { $content['SOURCETYPES'][SOURCE_DB]['selected'] = ""; } // SOURCE_PDO ( PDO DB Wrapper) $content['SOURCETYPES'][SOURCE_PDO]['type'] = SOURCE_PDO; $content['SOURCETYPES'][SOURCE_PDO]['DisplayName'] = $content['LN_GEN_SOURCE_PDO']; if ( $selectedSource == $content['SOURCETYPES'][SOURCE_PDO]['type'] ) { $content['SOURCETYPES'][SOURCE_PDO]['selected'] = "selected"; } else { $content['SOURCETYPES'][SOURCE_PDO]['selected'] = ""; } // SOURCE_MONGODB ( MONGODB Wrapper) $content['SOURCETYPES'][SOURCE_MONGODB]['type'] = SOURCE_MONGODB; $content['SOURCETYPES'][SOURCE_MONGODB]['DisplayName'] = $content['LN_GEN_SOURCE_MONGODB']; if ( $selectedSource == $content['SOURCETYPES'][SOURCE_MONGODB]['type'] ) { $content['SOURCETYPES'][SOURCE_MONGODB]['selected'] = "selected"; } else { $content['SOURCETYPES'][SOURCE_MONGODB]['selected'] = ""; } } function CreateAuthTypesList( $selectedAuth ) { global $content; // SOURCE_DISK $content['AUTHTYPES'][USERDB_AUTH_INTERNAL]['type'] = USERDB_AUTH_INTERNAL; $content['AUTHTYPES'][USERDB_AUTH_INTERNAL]['DisplayName'] = $content['LN_GEN_AUTH_INTERNAL']; if ( $selectedAuth == $content['AUTHTYPES'][USERDB_AUTH_INTERNAL]['type'] ) { $content['AUTHTYPES'][USERDB_AUTH_INTERNAL]['selected'] = "selected"; } else { $content['AUTHTYPES'][USERDB_AUTH_INTERNAL]['selected'] = ""; } // SOURCE_DB ( MYSQL NATIVE ) $content['AUTHTYPES'][USERDB_AUTH_LDAP]['type'] = USERDB_AUTH_LDAP; $content['AUTHTYPES'][USERDB_AUTH_LDAP]['DisplayName'] = $content['LN_GEN_AUTH_LDAP']; if ( $selectedAuth == $content['AUTHTYPES'][USERDB_AUTH_LDAP]['type'] ) { $content['AUTHTYPES'][USERDB_AUTH_LDAP]['selected'] = "selected"; } else { $content['AUTHTYPES'][USERDB_AUTH_LDAP]['selected'] = ""; } } function CreateFieldAlignmentList( $selectedAlignment ) { global $content; // ALIGN_CENTER $content['ALIGMENTS'][ALIGN_CENTER]['type'] = ALIGN_CENTER; $content['ALIGMENTS'][ALIGN_CENTER]['DisplayName'] = $content['LN_ALIGN_CENTER']; if ( $selectedAlignment == $content['ALIGMENTS'][ALIGN_CENTER]['type'] ) { $content['ALIGMENTS'][ALIGN_CENTER]['selected'] = "selected"; } else { $content['ALIGMENTS'][ALIGN_CENTER]['selected'] = ""; } // ALIGN_LEFT $content['ALIGMENTS'][ALIGN_LEFT]['type'] = ALIGN_LEFT; $content['ALIGMENTS'][ALIGN_LEFT]['DisplayName'] = $content['LN_ALIGN_LEFT']; if ( $selectedAlignment == $content['ALIGMENTS'][ALIGN_LEFT]['type'] ) { $content['ALIGMENTS'][ALIGN_LEFT]['selected'] = "selected"; } else { $content['ALIGMENTS'][ALIGN_LEFT]['selected'] = ""; } // ALIGN_RIGHT $content['ALIGMENTS'][ALIGN_RIGHT]['type'] = ALIGN_RIGHT; $content['ALIGMENTS'][ALIGN_RIGHT]['DisplayName'] = $content['LN_ALIGN_RIGHT']; if ( $selectedAlignment == $content['ALIGMENTS'][ALIGN_RIGHT]['type'] ) { $content['ALIGMENTS'][ALIGN_RIGHT]['selected'] = "selected"; } else { $content['ALIGMENTS'][ALIGN_RIGHT]['selected'] = ""; } } function CreateFieldTypesList( $selectedType ) { global $content; // FILTER_TYPE_STRING $content['FILTERTYPES'][FILTER_TYPE_STRING]['type'] = FILTER_TYPE_STRING; $content['FILTERTYPES'][FILTER_TYPE_STRING]['DisplayName'] = $content['LN_FILTER_TYPE_STRING']; if ( $selectedType == $content['FILTERTYPES'][FILTER_TYPE_STRING]['type'] ) { $content['FILTERTYPES'][FILTER_TYPE_STRING]['selected'] = "selected"; } else { $content['FILTERTYPES'][FILTER_TYPE_STRING]['selected'] = ""; } // FILTER_TYPE_NUMBER $content['FILTERTYPES'][FILTER_TYPE_NUMBER]['type'] = FILTER_TYPE_NUMBER; $content['FILTERTYPES'][FILTER_TYPE_NUMBER]['DisplayName'] = $content['LN_FILTER_TYPE_NUMBER']; if ( $selectedType == $content['FILTERTYPES'][FILTER_TYPE_NUMBER]['type'] ) { $content['FILTERTYPES'][FILTER_TYPE_NUMBER]['selected'] = "selected"; } else { $content['FILTERTYPES'][FILTER_TYPE_NUMBER]['selected'] = ""; } // FILTER_TYPE_DATE $content['FILTERTYPES'][FILTER_TYPE_DATE]['type'] = FILTER_TYPE_DATE; $content['FILTERTYPES'][FILTER_TYPE_DATE]['DisplayName'] = $content['LN_FILTER_TYPE_DATE']; if ( $selectedType == $content['FILTERTYPES'][FILTER_TYPE_DATE]['type'] ) { $content['FILTERTYPES'][FILTER_TYPE_DATE]['selected'] = "selected"; } else { $content['FILTERTYPES'][FILTER_TYPE_DATE]['selected'] = ""; } } function CreateChartTypesList( $selectedChart ) { global $content; // CHART_CAKE $content['CHARTTYPES'][CHART_CAKE]['type'] = CHART_CAKE; $content['CHARTTYPES'][CHART_CAKE]['DisplayName'] = $content['LN_CHART_TYPE_CAKE']; if ( $selectedChart == $content['CHARTTYPES'][CHART_CAKE]['type'] ) { $content['CHARTTYPES'][CHART_CAKE]['selected'] = "selected"; } else { $content['CHARTTYPES'][CHART_CAKE]['selected'] = ""; } // CHART_BARS_VERTICAL $content['CHARTTYPES'][CHART_BARS_VERTICAL]['type'] = CHART_BARS_VERTICAL; $content['CHARTTYPES'][CHART_BARS_VERTICAL]['DisplayName'] = $content['LN_CHART_TYPE_BARS_VERTICAL']; if ( $selectedChart == $content['CHARTTYPES'][CHART_BARS_VERTICAL]['type'] ) { $content['CHARTTYPES'][CHART_BARS_VERTICAL]['selected'] = "selected"; } else { $content['CHARTTYPES'][CHART_BARS_VERTICAL]['selected'] = ""; } // CHART_BARS_HORIZONTAL $content['CHARTTYPES'][CHART_BARS_HORIZONTAL]['type'] = CHART_BARS_HORIZONTAL; $content['CHARTTYPES'][CHART_BARS_HORIZONTAL]['DisplayName'] = $content['LN_CHART_TYPE_BARS_HORIZONTAL']; if ( $selectedChart == $content['CHARTTYPES'][CHART_BARS_HORIZONTAL]['type'] ) { $content['CHARTTYPES'][CHART_BARS_HORIZONTAL]['selected'] = "selected"; } else { $content['CHARTTYPES'][CHART_BARS_HORIZONTAL]['selected'] = ""; } } function CreateChartFields( $selectedChartField) { global $content, $fields; // Process all fields foreach ( $fields as $myField ) { $myFieldID = $myField['FieldID']; // Add new entry to array $content['CHARTFIELDS'][$myFieldID]['ID'] = $myFieldID; if ( isset($myField['FieldCaption']) ) $content['CHARTFIELDS'][$myFieldID]['DisplayName'] = $myField['FieldCaption']; else $content['CHARTFIELDS'][$myFieldID]['DisplayName'] = $myFieldID; // set selected state if ( $selectedChartField == $content['CHARTFIELDS'][$myFieldID]['ID'] ) { $content['CHARTFIELDS'][$myFieldID]['selected'] = "selected"; } else { $content['CHARTFIELDS'][$myFieldID]['selected'] = ""; } } } /* * Helper function to generate a dbmappings list */ function CreateDBMappingsList( $selectedDBTableType ) { global $content, $dbmapping; // Process all mappings foreach ( $dbmapping as $mykey => $myMapping ) { $content['DBMAPPINGS'][$mykey]['type'] = $mykey; if ( isset($myMapping['DisplayName']) ) {$content['DBMAPPINGS'][$mykey]['DisplayName'] = $myMapping['DisplayName']; } else { $content['DBMAPPINGS'][$mykey]['DisplayName'] = $mykey; } if ( $selectedDBTableType == $mykey ) { $content['DBMAPPINGS'][$mykey]['selected'] = "selected"; } else { $content['DBMAPPINGS'][$mykey]['selected'] = ""; } } } function CreateDBTypesList( $selectedDBType ) { global $content; // DB_MYSQL $content['DBTYPES'][DB_MYSQL]['type'] = DB_MYSQL; $content['DBTYPES'][DB_MYSQL]['typeastext'] = "DB_MYSQL"; $content['DBTYPES'][DB_MYSQL]['DisplayName'] = $content['LN_GEN_DB_MYSQL']; if ( $selectedDBType == $content['DBTYPES'][DB_MYSQL]['type'] ) { $content['DBTYPES'][DB_MYSQL]['selected'] = "selected"; } else { $content['DBTYPES'][DB_MYSQL]['selected'] = ""; } // DB_MSSQL $content['DBTYPES'][DB_MSSQL]['type'] = DB_MSSQL; $content['DBTYPES'][DB_MSSQL]['typeastext'] = "DB_MSSQL"; $content['DBTYPES'][DB_MSSQL]['DisplayName'] = $content['LN_GEN_DB_MSSQL']; if ( $selectedDBType == $content['DBTYPES'][DB_MSSQL]['type'] ) { $content['DBTYPES'][DB_MSSQL]['selected'] = "selected"; } else { $content['DBTYPES'][DB_MSSQL]['selected'] = ""; } // DB_ODBC $content['DBTYPES'][DB_ODBC]['type'] = DB_ODBC; $content['DBTYPES'][DB_ODBC]['typeastext'] = "DB_ODBC"; $content['DBTYPES'][DB_ODBC]['DisplayName'] = $content['LN_GEN_DB_ODBC']; if ( $selectedDBType == $content['DBTYPES'][DB_ODBC]['type'] ) { $content['DBTYPES'][DB_ODBC]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_ODBC]['selected'] = ""; } // DB_PGSQL $content['DBTYPES'][DB_PGSQL]['type'] = DB_PGSQL; $content['DBTYPES'][DB_PGSQL]['typeastext'] = "DB_PGSQL"; $content['DBTYPES'][DB_PGSQL]['DisplayName'] = $content['LN_GEN_DB_PGSQL']; if ( $selectedDBType == $content['DBTYPES'][DB_PGSQL]['type'] ) { $content['DBTYPES'][DB_PGSQL]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_PGSQL]['selected'] = ""; } // DB_OCI $content['DBTYPES'][DB_OCI]['type'] = DB_OCI; $content['DBTYPES'][DB_OCI]['typeastext'] = "DB_OCI"; $content['DBTYPES'][DB_OCI]['DisplayName'] = $content['LN_GEN_DB_OCI']; if ( $selectedDBType == $content['DBTYPES'][DB_OCI]['type'] ) { $content['DBTYPES'][DB_OCI]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_OCI]['selected'] = ""; } // DB_DB2 $content['DBTYPES'][DB_DB2]['type'] = DB_DB2; $content['DBTYPES'][DB_DB2]['typeastext'] = "DB_DB2"; $content['DBTYPES'][DB_DB2]['DisplayName'] = $content['LN_GEN_DB_DB2']; if ( $selectedDBType == $content['DBTYPES'][DB_DB2]['type'] ) { $content['DBTYPES'][DB_DB2]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_DB2]['selected'] = ""; } // DB_FIREBIRD $content['DBTYPES'][DB_FIREBIRD]['type'] = DB_FIREBIRD; $content['DBTYPES'][DB_FIREBIRD]['typeastext'] = "DB_FIREBIRD"; $content['DBTYPES'][DB_FIREBIRD]['DisplayName'] = $content['LN_GEN_DB_FIREBIRD']; if ( $selectedDBType == $content['DBTYPES'][DB_FIREBIRD]['type'] ) { $content['DBTYPES'][DB_FIREBIRD]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_FIREBIRD]['selected'] = ""; } // DB_INFORMIX $content['DBTYPES'][DB_INFORMIX]['type'] = DB_INFORMIX; $content['DBTYPES'][DB_INFORMIX]['typeastext'] = "DB_INFORMIX"; $content['DBTYPES'][DB_INFORMIX]['DisplayName'] = $content['LN_GEN_DB_INFORMIX']; if ( $selectedDBType == $content['DBTYPES'][DB_INFORMIX]['type'] ) { $content['DBTYPES'][DB_INFORMIX]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_INFORMIX]['selected'] = ""; } // DB_SQLITE $content['DBTYPES'][DB_SQLITE]['type'] = DB_SQLITE; $content['DBTYPES'][DB_SQLITE]['typeastext'] = "DB_SQLITE"; $content['DBTYPES'][DB_SQLITE]['DisplayName'] = $content['LN_GEN_DB_SQLITE']; if ( $selectedDBType == $content['DBTYPES'][DB_SQLITE]['type'] ) { $content['DBTYPES'][DB_SQLITE]['selected'] = "selected"; } else { $content['DB_ODBC'][DB_SQLITE]['selected'] = ""; } } function CreateOutputformatList( $selectedOutputformat ) { global $content; // REPORT_OUTPUT_HTML $content['OUTPUTFORMATS'][REPORT_OUTPUT_HTML]['formatid'] = REPORT_OUTPUT_HTML; $content['OUTPUTFORMATS'][REPORT_OUTPUT_HTML]['formatdisplayname'] = $content['LN_GEN_REPORT_OUTPUT_HTML']; if ( $selectedOutputformat == $content['OUTPUTFORMATS'][REPORT_OUTPUT_HTML]['formatid'] ) { $content['OUTPUTFORMATS'][REPORT_OUTPUT_HTML]['formatselected'] = "selected"; } else { $content['OUTPUTFORMATS'][REPORT_OUTPUT_HTML]['formatselected'] = ""; } // REPORT_OUTPUT_PDF $content['OUTPUTFORMATS'][REPORT_OUTPUT_PDF]['formatid'] = REPORT_OUTPUT_PDF; $content['OUTPUTFORMATS'][REPORT_OUTPUT_PDF]['formatdisplayname'] = $content['LN_GEN_REPORT_OUTPUT_PDF']; if ( $selectedOutputformat == $content['OUTPUTFORMATS'][REPORT_OUTPUT_PDF]['formatid'] ) { $content['OUTPUTFORMATS'][REPORT_OUTPUT_PDF]['formatselected'] = "selected"; } else { $content['OUTPUTFORMATS'][REPORT_OUTPUT_PDF]['formatselected'] = ""; } } function CreateOutputtargetList( $selectedOutputtarget ) { global $content; // REPORT_TARGET_STDOUT $content['OUTPUTTARGETS'][REPORT_TARGET_STDOUT]['targetid'] = REPORT_TARGET_STDOUT; $content['OUTPUTTARGETS'][REPORT_TARGET_STDOUT]['targetdisplayname'] = $content['LN_GEN_REPORT_TARGET_STDOUT']; if ( $selectedOutputtarget == $content['OUTPUTTARGETS'][REPORT_TARGET_STDOUT]['targetid'] ) { $content['OUTPUTTARGETS'][REPORT_TARGET_STDOUT]['targetselected'] = "selected"; } else { $content['OUTPUTTARGETS'][REPORT_TARGET_STDOUT]['targetselected'] = ""; } // REPORT_TARGET_FILE $content['OUTPUTTARGETS'][REPORT_TARGET_FILE]['targetid'] = REPORT_TARGET_FILE; $content['OUTPUTTARGETS'][REPORT_TARGET_FILE]['targetdisplayname'] = $content['LN_GEN_REPORT_TARGET_FILE']; if ( $selectedOutputtarget == $content['OUTPUTTARGETS'][REPORT_TARGET_FILE]['targetid'] ) { $content['OUTPUTTARGETS'][REPORT_TARGET_FILE]['targetselected'] = "selected"; } else { $content['OUTPUTTARGETS'][REPORT_TARGET_FILE]['targetselected'] = ""; } // // REPORT_TARGET_EMAIL // $content['OUTPUTTARGETS'][REPORT_TARGET_EMAIL]['targetid'] = REPORT_TARGET_EMAIL; // $content['OUTPUTTARGETS'][REPORT_TARGET_EMAIL]['targetdisplayname'] = $content['LN_GEN_REPORT_TARGET_EMAIL']; // if ( $selectedOutputtarget == $content['OUTPUTTARGETS'][REPORT_TARGET_EMAIL]['targetid'] ) { $content['OUTPUTTARGETS'][REPORT_TARGET_EMAIL]['targetselected'] = "selected"; } else { $content['OUTPUTTARGETS'][REPORT_TARGET_EMAIL]['targetselected'] = ""; } } function CreatePagesizesList() { global $content; $tmpViewsPerPage = GetConfigSetting("ViewEntriesPerPage", 50, CFGLEVEL_USER); $iCounter = 0; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => $content['LN_GEN_PRECONFIGURED'] . " (" . $tmpViewsPerPage . ")", "Value" => $tmpViewsPerPage ); $iCounter++; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 25 " . $content['LN_GEN_RECORDSPERPAGE'], "Value" => 25 ); $iCounter++; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 50 " . $content['LN_GEN_RECORDSPERPAGE'], "Value" => 50 ); $iCounter++; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 75 " . $content['LN_GEN_RECORDSPERPAGE'], "Value" => 75 ); $iCounter++; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 100 " . $content['LN_GEN_RECORDSPERPAGE'], "Value" => 100 ); $iCounter++; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 250 " . $content['LN_GEN_RECORDSPERPAGE'], "Value" => 250 ); $iCounter++; $content['pagesizes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 500 " . $content['LN_GEN_RECORDSPERPAGE'], "Value" => 500 ); $iCounter++; // Set default selected pagesize $content['pagesizes'][ $_SESSION['PAGESIZE_ID'] ]["Selected"] = "selected"; // The content variable will now contain the user selected oaging size $content["CurrentViewEntriesPerPage"] = $content['pagesizes'][ $_SESSION['PAGESIZE_ID'] ]["Value"]; } function CreateReloadTimesList() { global $content; $iCounter = 0; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => $content['LN_AUTORELOAD_DISABLED'], "Value" => 0 ); $iCounter++; $tmpReloadSeconds = GetConfigSetting("ViewEnableAutoReloadSeconds", "", CFGLEVEL_USER); if ( $tmpReloadSeconds > 0 ) { $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => $content['LN_AUTORELOAD_PRECONFIGURED'] . " (" . $tmpReloadSeconds . " " . $content['LN_AUTORELOAD_SECONDS'] . ") ", "Value" => $tmpReloadSeconds ); $iCounter++; } $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 5 " . $content['LN_AUTORELOAD_SECONDS'], "Value" => 5 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 10 " . $content['LN_AUTORELOAD_SECONDS'], "Value" => 10 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 15 " . $content['LN_AUTORELOAD_SECONDS'], "Value" => 15 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 30 " . $content['LN_AUTORELOAD_SECONDS'], "Value" => 30 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 60 " . $content['LN_AUTORELOAD_SECONDS'], "Value" => 60 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 5 " . $content['LN_AUTORELOAD_MINUTES'], "Value" => 300 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 10 " . $content['LN_AUTORELOAD_MINUTES'], "Value" => 600 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 15 " . $content['LN_AUTORELOAD_MINUTES'], "Value" => 900 ); $iCounter++; $content['reloadtimes'][$iCounter] = array( "ID" => $iCounter, "Selected" => "", "DisplayName" => " 30 " . $content['LN_AUTORELOAD_MINUTES'], "Value" => 1800 ); $iCounter++; // Set default selected autoreloadid $content['reloadtimes'][ $_SESSION['AUTORELOAD_ID'] ]["Selected"] = "selected"; // The content variable will now contain the user selected oaging size $content["ViewEnableAutoReloadSeconds"] = $content['reloadtimes'][ $_SESSION['AUTORELOAD_ID'] ]["Value"]; } function CreateExportFormatList() { global $content; // Add basic formats! $content['EXPORTTYPES'][EXPORT_CVS] = array( "ID" => EXPORT_CVS, "Selected" => "", "DisplayName" => $content['LN_GEN_EXPORT_CVS'] ); $content['EXPORTTYPES'][EXPORT_XML] = array( "ID" => EXPORT_XML, "Selected" => "", "DisplayName" => $content['LN_GEN_EXPORT_XML'] ); // TODO: Add formats by loaded extensions } function CreatePredefinedSearches() { global $CFG, $content; if ( isset($CFG['Search']) ) { // Enable predefined searches $content['EnablePredefinedSearches'] = true; // Loop through all predefined searches! foreach ($CFG['Search'] as $mykey => $mySearch) { // Copy configured searches into content array! $content['Search'][$mykey]["ID"] = $mykey; $content['Search'][$mykey]["Selected"] = false; // --- Set CSS Class if ( $mykey % 2 == 0 ) $content['Search'][$mykey]['cssclass'] = "line1"; else $content['Search'][$mykey]['cssclass'] = "line2"; // --- } } else // Disable predefined searches $content['EnablePredefinedSearches'] = false; } function InitPhpDebugMode() { global $content; // --- Set Global DEBUG Level! if ( GetConfigSetting("MiscShowDebugMsg", 0, CFGLEVEL_USER) == 1 ) ini_set( "error_reporting", E_ALL ); // ALL PHP MESSAGES! else ini_set( "error_reporting", E_ERROR ); // ONLY PHP ERROR'S! // --- } function CheckAndSetRunMode() { global $content, $RUNMODE; // Set to command line mode if argv is set! if ( !isset($_SERVER["SERVER_SOFTWARE"]) ) $RUNMODE = RUNMODE_COMMANDLINE; // Check if we require the command line mode! if ( defined("IN_PHPLOGCON_COMMANDLINE") && $RUNMODE != RUNMODE_COMMANDLINE ) DieWithErrorMsg( "This PHP Script cannot be run within the webserver process, it designed to run over command line." ); // Obtain max_execution_time $content['MaxExecutionTime'] = ini_get("max_execution_time"); // Define and Inits Syslog variables now! // DEPRECIATED! define_syslog_variables(); // Syslog Constants are defined by default anyway! $syslogOpened = openlog("LogAnalyzer", LOG_PID, LOG_USER); // --- Check necessary PHP Extensions! $loadedExtensions = get_loaded_extensions(); // Check for GD libary if ( in_array("gd", $loadedExtensions) ) $content['GD_IS_ENABLED'] = true; else $content['GD_IS_ENABLED'] = false; // Check MYSQL Extension if ( in_array("mysql", $loadedExtensions) ) { $content['MYSQL_IS_ENABLED'] = true; } else { $content['MYSQL_IS_ENABLED'] = false; } // Check PDO Extension if ( in_array("PDO", $loadedExtensions) ) { $content['PDO_IS_ENABLED'] = true; } else { $content['PDO_IS_ENABLED'] = false; } // Check sockets Extension if ( in_array("sockets", $loadedExtensions) ) { $content['SOCKETS_IS_ENABLED'] = true; } else { $content['SOCKETS_IS_ENABLED'] = false; } // --- } /* * This helper function removes all magic quotes from input Parameters! */ function RemoveMagicQuotes() { if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } } function InitRuntimeInformations() { global $gl_root_path, $content; // Enable GZIP Compression if enabled! if ( isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && GetConfigSetting("MiscEnableGzipCompression", 1, CFGLEVEL_USER) == 1 ) { // This starts gzip compression! ob_start("ob_gzhandler"); $content['GzipCompressionEnmabled'] = "yes"; } else $content['GzipCompressionEnmabled'] = "no"; // --- Check and Set manual link if ( is_dir($gl_root_path . "doc") ) $content['PHPLOGCON_HELPLINK'] = $content['BASEPATH'] . "doc/manual.html"; else $content['PHPLOGCON_HELPLINK'] = "http://loganalyzer.adiscon.com/doc"; // --- // --- Try to extend the script timeout if possible! $iTmp = GetConfigSetting("MiscMaxExecutionTime", 30, CFGLEVEL_GLOBAL); if ( $iTmp != $content['MaxExecutionTime'] && $iTmp > 10 ) { //Try to extend the runtime in this case! if ( !isset($content['IN_PHPLOGCON_COMMANDLINE']) ) @ini_set("max_execution_time", $iTmp); // Get ini setting $content['MaxExecutionTime'] = ini_get("max_execution_time"); } // --- // --- Set Database Update Warning if necessary if ( GetConfigSetting("UserDBEnabled", false) && $content['database_internalversion'] > $content['database_installedversion'] && !defined('IS_UPRGADEPAGE') ) { $content['dbupgrade_warning'] = true; $content['WARNING_DBUPGRADE_TEXT'] = GetAndReplaceLangStr( $content['LN_WARNING_DBUPGRADE_TEXT'], $content['database_installedversion'], $content['database_internalversion'] ); } } function CreateDebugModes() { global $content; $content['DBGMODES'][0]['DisplayName'] = STR_DEBUG_ULTRADEBUG; if ( $content['parser_debugmode'] == $content['DBGMODES'][0]['DisplayName'] ) { $content['DBGMODES'][0]['selected'] = "selected"; } else { $content['DBGMODES'][0]['selected'] = ""; } $content['DBGMODES'][1]['DisplayName'] = STR_DEBUG_DEBUG; if ( $content['parser_debugmode'] == $content['DBGMODES'][1]['DisplayName'] ) { $content['DBGMODES'][1]['selected'] = "selected"; } else { $content['DBGMODES'][1]['selected'] = ""; } $content['DBGMODES'][2]['DisplayName'] = STR_DEBUG_INFO; if ( $content['parser_debugmode'] == $content['DBGMODES'][2]['DisplayName'] ) { $content['DBGMODES'][2]['selected'] = "selected"; } else { $content['DBGMODES'][2]['selected'] = ""; } $content['DBGMODES'][3]['DisplayName'] = STR_DEBUG_WARN; if ( $content['parser_debugmode'] == $content['DBGMODES'][3]['DisplayName'] ) { $content['DBGMODES'][3]['selected'] = "selected"; } else { $content['DBGMODES'][3]['selected'] = ""; } $content['DBGMODES'][4]['DisplayName'] = STR_DEBUG_ERROR; if ( $content['parser_debugmode'] == $content['DBGMODES'][4]['DisplayName'] ) { $content['DBGMODES'][4]['selected'] = "selected"; } else { $content['DBGMODES'][4]['selected'] = ""; } } function InitFrontEndVariables() { global $content; $content['IMG_SPACER'] = $content['BASEPATH'] . "images/spacer.gif"; $content['MENU_FOLDER_OPEN'] = $content['BASEPATH'] . "images/icons/folder_closed.png"; $content['MENU_FOLDER_CLOSED'] = $content['BASEPATH'] . "images/icons/folder.png"; $content['MENU_HOMEPAGE'] = $content['BASEPATH'] . "images/icons/home.png"; $content['MENU_LINK'] = $content['BASEPATH'] . "images/icons/link.png"; $content['MENU_LINK_VIEW'] = $content['BASEPATH'] . "images/icons/link_view.png"; $content['MENU_VIEW'] = $content['BASEPATH'] . "images/icons/view.png"; $content['MENU_PREFERENCES'] = $content['BASEPATH'] . "images/icons/preferences.png"; $content['MENU_ADMINENTRY'] = $content['BASEPATH'] . "images/icons/star_blue.png"; $content['MENU_ADMINLOGOFF'] = $content['BASEPATH'] . "images/icons/exit.png"; $content['MENU_ADMINUSERS'] = $content['BASEPATH'] . "images/icons/businessman.png"; $content['MENU_ADMINGROUPS'] = $content['BASEPATH'] . "images/icons/businessmen.png"; $content['MENU_SEARCH'] = $content['BASEPATH'] . "images/icons/view.png"; $content['MENU_SELECTION_DISABLED'] = $content['BASEPATH'] . "images/icons/selection.png"; $content['MENU_SELECTION_ENABLED'] = $content['BASEPATH'] . "images/icons/selection_delete.png"; $content['MENU_TEXT_FIND'] = $content['BASEPATH'] . "images/icons/text_find.png"; $content['MENU_EARTH_FIND'] = $content['BASEPATH'] . "images/icons/earth_find.png"; $content['MENU_FIND'] = $content['BASEPATH'] . "images/icons/find.png"; $content['MENU_NEXT_FIND'] = $content['BASEPATH'] . "images/icons/find_next.png"; $content['MENU_NETWORK'] = $content['BASEPATH'] . "images/icons/earth_network.png"; $content['MENU_HELP'] = $content['BASEPATH'] . "images/icons/help.png"; $content['MENU_HELP_BLUE'] = $content['BASEPATH'] . "images/icons/help2.png"; $content['MENU_HELP_ORANGE'] = $content['BASEPATH'] . "images/icons/help3.png"; $content['MENU_KB'] = $content['BASEPATH'] . "images/icons/books.png"; $content['MENU_DOCUMENTVIEW'] = $content['BASEPATH'] . "images/icons/document_view.png"; $content['MENU_DATAEDIT'] = $content['BASEPATH'] . "images/icons/data_edit.png"; $content['MENU_ADDUSER'] = $content['BASEPATH'] . "images/icons/businessman_add.png"; $content['MENU_DELUSER'] = $content['BASEPATH'] . "images/icons/businessman_delete.png"; $content['MENU_ADD'] = $content['BASEPATH'] . "images/icons/add.png"; $content['MENU_EDIT'] = $content['BASEPATH'] . "images/icons/edit.png"; $content['MENU_DELETE'] = $content['BASEPATH'] . "images/icons/delete.png"; $content['MENU_GLOBAL'] = $content['BASEPATH'] . "images/icons/earth.png"; $content['MENU_INTERNAL'] = $content['BASEPATH'] . "images/icons/gear.png"; $content['MENU_EDIT_DISABLED'] = $content['BASEPATH'] . "images/icons/edit_disabled.png"; $content['MENU_DELETE_DISABLED'] = $content['BASEPATH'] . "images/icons/delete_disabled.png"; $content['MENU_MOVE_UP'] = $content['BASEPATH'] . "images/icons/nav_up_blue.png"; $content['MENU_MOVE_DOWN'] = $content['BASEPATH'] . "images/icons/nav_down_blue.png"; $content['MENU_SOURCE_DISK'] = $content['BASEPATH'] . "images/icons/document_text.png"; $content['MENU_SOURCE_DB'] = $content['BASEPATH'] . "images/icons/data_table.png"; $content['MENU_SOURCE_PDO'] = $content['BASEPATH'] . "images/icons/data_gear.png"; $content['MENU_SOURCE_MONGODB'] = $content['BASEPATH'] . "images/icons/mongodb.png"; $content['MENU_MAXIMIZE'] = $content['BASEPATH'] . "images/icons/table_selection_all.png"; $content['MENU_NORMAL'] = $content['BASEPATH'] . "images/icons/table_selection_block.png"; $content['MENU_USEROPTIONS'] = $content['BASEPATH'] . "images/icons/businessman_preferences.png"; $content['MENU_EXPORT'] = $content['BASEPATH'] . "images/icons/export1.png"; $content['MENU_CHARTS'] = $content['BASEPATH'] . "images/icons/line-chart.png"; $content['MENU_CHART_CAKE'] = $content['BASEPATH'] . "images/icons/pie-chart.png"; $content['MENU_CHART_BARSVERT'] = $content['BASEPATH'] . "images/icons/column-chart.png"; $content['MENU_CHART_BARSHORI'] = $content['BASEPATH'] . "images/icons/column-chart-hori.png"; $content['MENU_CHART_PREVIEW'] = $content['BASEPATH'] . "images/icons/pie-chart_view.png"; $content['MENU_FIELDS'] = $content['BASEPATH'] . "images/icons/tables.png"; $content['MENU_DELETE_FROMDB'] = $content['BASEPATH'] . "images/icons/data_delete.png"; $content['MENU_DELETE_FROMDB_DISABLED'] = $content['BASEPATH'] . "images/icons/data_delete_disabled.png"; $content['MENU_INFORMATION'] = $content['BASEPATH'] . "images/icons/information2.png"; $content['MENU_PARSER_DELETE'] = $content['BASEPATH'] . "images/icons/gear_delete.png"; $content['MENU_PARSER_INIT'] = $content['BASEPATH'] . "images/icons/gear_new.png"; $content['MENU_RECYCLE'] = $content['BASEPATH'] . "images/icons/recycle.png"; $content['MENU_TRASH'] = $content['BASEPATH'] . "images/icons/garbage_empty.png"; $content['MENU_REPORTS'] = $content['BASEPATH'] . "images/icons/document_chart.png"; $content['MENU_CHARTPRESENTATION'] = $content['BASEPATH'] . "images/icons/presentation_chart.png"; $content['MENU_NETDOWNLOAD'] = $content['BASEPATH'] . "images/icons/download.png"; $content['MENU_DOCUMENTLIST'] = $content['BASEPATH'] . "images/icons/documents.png"; $content['MENU_WINDOWLIST'] = $content['BASEPATH'] . "images/icons/windows.png"; $content['MENU_CHECKED'] = $content['BASEPATH'] . "images/icons/check.png"; $content['MENU_PLAY_GREEN'] = $content['BASEPATH'] . "images/icons/bullet_triangle_green.png"; $content['MENU_PLAY_GREEN_WINDOW'] = $content['BASEPATH'] . "images/icons/table_sql_run.png"; $content['MENU_PAGER_BEGIN'] = $content['BASEPATH'] . "images/icons/media_beginning.png"; $content['MENU_PAGER_PREVIOUS'] = $content['BASEPATH'] . "images/icons/media_rewind.png"; $content['MENU_PAGER_NEXT'] = $content['BASEPATH'] . "images/icons/media_fast_forward.png"; $content['MENU_PAGER_END'] = $content['BASEPATH'] . "images/icons/media_end.png"; $content['MENU_NAV_LEFT'] = $content['BASEPATH'] . "images/icons/navigate_left.png"; $content['MENU_NAV_RIGHT'] = $content['BASEPATH'] . "images/icons/navigate_right.png"; $content['MENU_NAV_CLOSE'] = $content['BASEPATH'] . "images/icons/navigate_close.png"; $content['MENU_NAV_OPEN'] = $content['BASEPATH'] . "images/icons/navigate_open.png"; $content['MENU_PAGER_BEGIN_GREY'] = $content['BASEPATH'] . "images/icons/grey/media_beginning.png"; $content['MENU_PAGER_PREVIOUS_GREY'] = $content['BASEPATH'] . "images/icons/grey/media_rewind.png"; $content['MENU_PAGER_NEXT_GREY'] = $content['BASEPATH'] . "images/icons/grey/media_fast_forward.png"; $content['MENU_PAGER_END_GREY'] = $content['BASEPATH'] . "images/icons/grey/media_end.png"; $content['MENU_BULLET_BLUE'] = $content['BASEPATH'] . "images/icons/bullet_ball_glass_blue.png"; $content['MENU_BULLET_GREEN'] = $content['BASEPATH'] . "images/icons/bullet_ball_glass_green.png"; $content['MENU_BULLET_RED'] = $content['BASEPATH'] . "images/icons/bullet_ball_glass_red.png"; $content['MENU_BULLET_YELLOW'] = $content['BASEPATH'] . "images/icons/bullet_ball_glass_yellow.png"; $content['MENU_BULLET_GREY'] = $content['BASEPATH'] . "images/icons/bullet_ball_glass_grey.png"; $content['MENU_ICON_GOOGLE'] = $content['BASEPATH'] . "images/icons/googleicon.png"; } // Lang Helper for Strings with ONE variable function GetAndReplaceLangStr( $strlang, $param1 = "", $param2 = "", $param3 = "", $param4 = "", $param5 = "" ) { $strfinal = str_replace ( "%1", $param1, $strlang ); if ( strlen($param2) > 0 ) $strfinal = str_replace ( "%2", $param2, $strfinal ); if ( strlen($param3) > 0 ) $strfinal = str_replace ( "%3", $param3, $strfinal ); if ( strlen($param4) > 0 ) $strfinal = str_replace ( "%4", $param4, $strfinal ); if ( strlen($param5) > 0 ) $strfinal = str_replace ( "%5", $param5, $strfinal ); // And return return $strfinal; } function InitConfigurationValues() { global $content, $CFG, $LANG, $gl_root_path; // To avoid this code in case of conversion if ( !defined('IN_PHPLOGCON_CONVERT') ) { // If Database is enabled, try to read from database! if ( GetConfigSetting("UserDBEnabled", false) ) { // Get configuration variables $result = DB_Query("SELECT * FROM `" . DB_CONFIG . "` WHERE is_global = true"); if ( $result ) { $rows = DB_GetAllRows($result, true); // Read results from DB and overwrite in $CFG Array! if ( isset($rows ) ) { for($i = 0; $i < count($rows); $i++) { // Obtain the right value if ( isset($rows[$i]['propvalue_text']) && strlen($rows[$i]['propvalue_text']) > 0 ) $myValue = $rows[$i]['propvalue_text']; else $myValue = $rows[$i]['propvalue']; $CFG[ $rows[$i]['propname'] ] = $myValue; $content[ $rows[$i]['propname'] ] = $myValue; } } } else // Critical ERROR HERE! DieWithFriendlyErrorMsg( "Critical Error occured while trying to access the database in table '" . DB_CONFIG . "'" ); // Database Version Checker! if ( $content['database_internalversion'] > $content['database_installedversion'] ) { // Database is out of date, we need to upgrade $content['database_forcedatabaseupdate'] = "yes"; } // Now we init the user session stuff InitUserSession(); if ( !$content['SESSION_LOGGEDIN'] ) { // Check if user needs to be logged in if ( GetConfigSetting("UserDBLoginRequired", false) ) { // Redirect USER if not on loginpage or installpage! if ( !defined("IS_NOLOGINPAGE") && !defined("IN_PHPLOGCON_INSTALL") && !defined("IN_PHPLOGCON_COMMANDLINE") ) RedirectToUserLogin(); } else if ( defined('IS_ADMINPAGE') ) { // Language System not initialized yet DieWithFriendlyErrorMsg( "You need to be logged in in order to access the admin pages.", "login.php", "Click here to login" ); } } else { // Set Admin Panel Button Status if ( $content['SESSION_ISADMIN'] == 0) { if ( GetConfigSetting("DisableAdminUsers", 0, CFGLEVEL_GLOBAL) == 1) $content['SHOW_ADMINPANEL'] = "false"; } } // Load field definitions from DB, very first thing todo! LoadFieldsFromDatabase(); // Load Configured Searches LoadSearchesFromDatabase(); // Load Configured Charts LoadChartsFromDatabase(); // Load Configured Views LoadViewsFromDatabase(); // Load Configured Mappings LoadDBMappingsFromDatabase(); // Load Configured Sources LoadSourcesFromDatabase(); } else { if ( defined('IS_ADMINPAGE') || defined("IS_NOLOGINPAGE") ) // Language System not initialized yet DieWithFriendlyErrorMsg( "The LogAnalyzer user system is currently disabled or not installed." ); } } // --- Init Fonttype and size by config setting InitFontSettings(); // --- // --- Language Handling // Set gen language default $content['gen_lang'] = GetConfigSetting("ViewDefaultLanguage", "en", CFGLEVEL_GLOBAL); // Now check for current used language if ( isset($_SESSION['CUSTOM_LANG']) && VerifyLanguage($_SESSION['CUSTOM_LANG']) ) { $content['user_lang'] = $_SESSION['CUSTOM_LANG']; $LANG = $content['user_lang']; } else if ( isset($content['gen_lang']) && VerifyLanguage($content['gen_lang'])) { // Get use language $content['user_lang'] = GetConfigSetting("ViewDefaultLanguage", "en", CFGLEVEL_USER); if ( isset($content['user_lang']) ) $LANG = $content['user_lang']; else { $content['user_lang'] = $content['gen_lang']; $LANG = $content['user_lang']; } } else // Failsave! { // Get use language $content['user_lang'] = GetConfigSetting("ViewDefaultLanguage", "en", CFGLEVEL_USER) /*"en"*/; $LANG = $content['user_lang']; $content['gen_lang'] = $content['user_lang']; } // --- // Paging Size handling! if ( !isset($_SESSION['PAGESIZE_ID']) ) { // Default is 0! $_SESSION['PAGESIZE_ID'] = 0; } // Auto reload handling! if ( !isset($_SESSION['AUTORELOAD_ID']) ) { if ( GetConfigSetting("ViewEnableAutoReloadSeconds", 0, CFGLEVEL_USER) > 0 ) $_SESSION['AUTORELOAD_ID'] = 1; // Autoreload ID will be the first item! else // Default is 0, which means auto reload disabled $_SESSION['AUTORELOAD_ID'] = 0; } // --- Theme Handling if ( !isset($content['web_theme']) ) { $content['web_theme'] = GetConfigSetting("ViewDefaultTheme", "default", CFGLEVEL_USER); } if ( isset($_SESSION['CUSTOM_THEME']) && VerifyTheme($_SESSION['CUSTOM_THEME']) ) $content['user_theme'] = $_SESSION['CUSTOM_THEME']; else $content['user_theme'] = $content['web_theme']; /* // Init Theme About Info ^^ InitThemeAbout($content['user_theme']); // --- */ // --- Handle HTML Injection stuff if ( strlen(GetConfigSetting("InjectHtmlHeader", false)) > 0 ) $content['EXTRA_HTMLHEAD'] .= $CFG['InjectHtmlHeader']; else $content['InjectHtmlHeader'] = ""; // Init Option if ( strlen(GetConfigSetting("InjectBodyHeader", false)) > 0 ) $content['EXTRA_HEADER'] .= $CFG['InjectBodyHeader']; else $content['InjectBodyHeader'] = ""; // Init Option if ( strlen(GetConfigSetting("InjectBodyFooter", false)) > 0 ) $content['EXTRA_FOOTER'] .= $CFG['InjectBodyFooter']; else $content['InjectBodyFooter'] = ""; // Init Option // --- // --- Handle Optional Logo URL! if ( strlen(GetConfigSetting("PhplogconLogoUrl", false)) > 0 ) $content['EXTRA_PHPLOGCON_LOGO'] = $CFG['PhplogconLogoUrl']; else $content['PhplogconLogoUrl'] = ""; // Init Option // --- // --- Set Proxy Option if ( strlen(GetConfigSetting("UseProxyServerForRemoteQueries", false)) <= 0 ) $content['UseProxyServerForRemoteQueries'] = ""; // Init Option // --- // --- Read Encoding Option, and set default! $content['HeaderDefaultEncoding'] = GetConfigSetting("HeaderDefaultEncoding", ENC_ISO_8859_1); // --- // --- Read ContextLinks Option, and set default! $content['EnableContextLinks'] = GetConfigSetting("EnableContextLinks", 1); // --- // Init main langauge file now! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/main.php' ); // Init other things which are needed InitFrontEndVariables(); } function SetDebugModeFromString( $facility ) { global $DEBUGMODE; switch ( $facility ) { case STR_DEBUG_ULTRADEBUG: $DEBUGMODE = DEBUG_ULTRADEBUG; break; case STR_DEBUG_DEBUG: $DEBUGMODE = DEBUG_DEBUG; break; case STR_DEBUG_INFO: $DEBUGMODE = DEBUG_INFO; break; case STR_DEBUG_WARN: $DEBUGMODE = DEBUG_WARN; break; case STR_DEBUG_ERROR: $DEBUGMODE = DEBUG_ERROR; break; } } function InitPageRenderStats() { global $gl_starttime, $querycount; $gl_starttime = microtime_float(); $querycount = 0; } function FinishPageRenderStats( &$mycontent) { global $gl_starttime, $querycount; $endtime = microtime_float(); $mycontent['PAGERENDERTIME'] = number_format($endtime - $gl_starttime, 4, '.', ''); $mycontent['TOTALQUERIES'] = $querycount; } function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } function SetLineBreakVar() { // Used for some functions global $RUNMODE, $linesep; if ( $RUNMODE == RUNMODE_COMMANDLINE ) $linesep = "\r\n"; else if ( $RUNMODE == RUNMODE_WEBSERVER ) $linesep = "
    "; } function CheckUrlOrIP($ip) { $long = ip2long($ip); if ( $long == -1 ) return false; else return true; } function DieWithErrorMsg( $szerrmsg ) { global $RUNMODE, $content, $gl_root_path; if ( $RUNMODE == RUNMODE_COMMANDLINE ) { print("\n\n\tCritical Error occured\t-\tErrordetails:\n"); print("\t" . $szerrmsg . "\n\n"); print("\tTerminating now!\n"); } else if ( $RUNMODE == RUNMODE_WEBSERVER ) { // Print main error! print ( "Adiscon LogAnalyzer :: Critical Error occured" . "

    " . "". "" . "" . "
    " . "

    Critical Error occured

    " . "
    Errordetails:
    " . $szerrmsg . "

    "); // Print Detail error's if available if ( isset($content['detailederror']) ) { print ("". "" . "
    Additional Errordetails:
    " . $content['detailederror'] . "

    "); } // End HTML Body print( "" ); } // Abort further execution exit; } function DieWithFriendlyErrorMsg( $szerrmsg, $szLink = "", $szLinkLable = "" ) { global $RUNMODE, $content, $gl_root_path, $DEBUGMODE; if ( $RUNMODE == RUNMODE_COMMANDLINE ) { print("\n\n\t\tError occured\n"); print("\t\tErrordetails:\t" . $szerrmsg . "\n"); print("\t\tTerminating now!\n"); } else if ( $RUNMODE == RUNMODE_WEBSERVER ) { echo "Adiscon LogAnalyzer :: Error occured" . "

    " . "". "" . "" . ""; if ( GetConfigSetting("MiscShowDebugMsg", 0, CFGLEVEL_USER) == 1 && isset($content['detailederror']) && strlen($content['detailederror']) > 0) { echo "" . ""; } if ( strlen($szLink) > 0 && strlen($szLinkLable) > 0 ) echo ""; echo "
    " . "

    Error occured

    " . "
    Error:
    " . $szerrmsg . "

    Details:
    " . $content['detailederror'] . "

    $szLinkLable
    " . ""; } // Abort further execution exit; } /* * Helper function to initialize the page title! */ function InitPageTitle() { global $content, $currentSourceID; $tmpTitle = GetConfigSetting("PrependTitle", "", CFGLEVEL_USER); if ( strlen($tmpTitle) > 0 ) $szReturn = $tmpTitle . " :: "; else $szReturn = ""; if ( !defined('IS_ADMINPAGE') ) { if ( isset($currentSourceID) && isset($content['Sources'][$currentSourceID]['Name']) ) $szReturn .= "Source '" . $content['Sources'][$currentSourceID]['Name'] . "' :: "; } // Append LogAnalyzer $szReturn .= "Adiscon LogAnalyzer"; if ( defined('IS_ADMINPAGE') ) $szReturn .= " :: " . $content['LN_ADMIN_CENTER'] . " :: "; // return result return $szReturn; } function ReplaceLineBreaksInString($myStr) { // Add linebreaks! return str_replace( "\n", "
    ", $myStr ); } function EscapeQuotesFromString($myStr) { // return htmlspecialchars($myStr, ENT_QUOTES); return str_replace( array( "'", "\""), array ("\\x27", "\\x22"), $myStr ); } function GetStringWithHTMLCodes($myStr) { global $content; // Replace all special characters with valid html representations return htmlentities($myStr, ENT_NOQUOTES, $content['HeaderDefaultEncoding']); //"UTF-8"); } function InitTemplateParser() { global $page, $gl_root_path, $content; // ----------------------------------------------- // Create Template Object and set some variables for the templates // ----------------------------------------------- $page = new Template(); $page -> set_path ( $gl_root_path . "templates/" ); // Append correct Character encoding to HTML Header $content['EXTRA_METATAGS'] .= ''; } function VerifyLanguage( $mylang ) { global $gl_root_path; if ( is_dir( $gl_root_path . 'lang/' . $mylang ) ) return true; else return false; } function IncludeLanguageFile( $langfile, $failOnError = true ) { global $LANG, $LANG_EN; // If english is not selected, we load ENGLISH first - then overwrite with configured language if ( $LANG != "en" ) $langengfile = str_replace( $LANG, $LANG_EN, $langfile ); else $langengfile = $langfile; if ( file_exists($langengfile) ) include( $langengfile ); else { if ( $failOnError ) DieWithErrorMsg( "FATAL Error initialzing sublanguage system. Please make sure that all files have been uploaded correctly." ); else return false; } // If nto english, load the additional translations if ( $LANG != "en" ) { if ( file_exists( $langfile ) ) include( $langfile ); else { if ( $failOnError ) OutputDebugMessage("FATAL Error reading the configured language $LANG. Please make sure that all files have been uploaded correctly.", DEBUG_ERROR); else return false; } } } function RedirectPage( $newpage ) { header("Location: $newpage"); exit; } function RedirectResult( $szMsg, $newpage ) { global $content; if ( defined('PHPLOGCON_INERROR') ) DieWithErrorMsg( GetAndReplaceLangStr($content["LN_ERROR_REDIRECTABORTED"], $newpage) ); // Perform redirect! header("Location: result.php?msg=" . urlencode($szMsg) . "&redir=" . urlencode($newpage)); exit; } /* * GetEventTime * * Helper function to parse and obtain a valid EventTime Array from the input string. * Return value: EventTime Array! * */ function GetEventTime($szTimStr) { // Sample: Mar 10 14:45:44 if ( preg_match("/(...) ([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[3], $out[4], $out[5], GetMonthFromString($out[1]), $out[2], date("Y") ); // If the current time is if ( $eventtime[EVTIME_TIMESTAMP] > time() ) { // rare case on new year only! $eventtime[EVTIME_TIMESTAMP] = mktime($out[3], $out[4], $out[5], GetMonthFromString($out[1]), $out[2], date("Y")-1 ); } $eventtime[EVTIME_TIMEZONE] = date('O'); // Get default Offset $eventtime[EVTIME_MICROSECONDS] = 0; // echo gmdate(DATE_RFC822, $eventtime[EVTIME_TIMESTAMP]) . "
    "; // print_r ( $eventtime ); // exit; } // Sample: 2008-04-02T11:12:32+02:00 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})([+-])([0-9]{1,2}):([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); $eventtime[EVTIME_TIMEZONE] = $out[7] . $out[8] . $out[9]; $eventtime[EVTIME_MICROSECONDS] = 0; } // Sample: 2008-04-02T11:12:32.380449+02:00 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})\.([0-9]{1,6})([+-])([0-9]{1,2}):([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); $eventtime[EVTIME_TIMEZONE] = $out[8] . $out[9] . $out[10]; $eventtime[EVTIME_MICROSECONDS] = $out[7]; } // Sample: 2008-04-02,15:19:06 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2}),([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); $eventtime[EVTIME_TIMEZONE] = date('O'); // Get default Offset $eventtime[EVTIME_MICROSECONDS] = 0; } // Sample: 2008-02-19 12:52:37 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); $eventtime[EVTIME_TIMEZONE] = date('O'); // Get default Offset $eventtime[EVTIME_MICROSECONDS] = 0; } // Sample: 2007-4-18T00:00:00 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); $eventtime[EVTIME_TIMEZONE] = date('O'); // Get default Offset $eventtime[EVTIME_MICROSECONDS] = 0; } // Sample: 16/Sep/2008:13:37:47 +0200 else if ( preg_match("/([0-9]{1,2})\/(...)\/([0-9]{1,4}):([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}) ([+-])([0-9]{1,4})/", $szTimStr, $out ) ) { // Apache Logfile typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime($out[4], $out[5], $out[6], GetMonthFromString($out[2]), $out[1], $out[3]); $eventtime[EVTIME_TIMEZONE] = $out[7] . $out[8]; // Get Offset from MSG $eventtime[EVTIME_MICROSECONDS] = 0; } // Sample: 2008-02-19 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})/", $szTimStr, $out ) ) { // RFC 3164 typical timestamp $eventtime[EVTIME_TIMESTAMP] = mktime(0, 0, 0, $out[2], $out[3], $out[1]); $eventtime[EVTIME_TIMEZONE] = date('O'); // Get default Offset $eventtime[EVTIME_MICROSECONDS] = 0; } else { $eventtime[EVTIME_TIMESTAMP] = 0; $eventtime[EVTIME_TIMEZONE] = date('O'); // Get default Offset $eventtime[EVTIME_MICROSECONDS] = 0; // Print Error! OutputDebugMessage("GetEventTime got an unparsable time '" . $szTimStr . "', returning 0", DEBUG_WARN); } // return result! return $eventtime; } /* * Helper function to output debug messages */ function OutputDebugMessage($szDbg, $szDbgLevel = DEBUG_INFO) { global $content; // Check if we should print the Error! if ( GetConfigSetting("MiscShowDebugMsg", 0, CFGLEVEL_USER) == 1 ) { // Also enable the template helper variable here! $content['SHOWDEBUGMSG'] = true; $content['DEBUGMSG'][] = array( "DBGLEVEL" => $szDbgLevel, "DBGLEVELTXT" => GetDebugModeString($szDbgLevel), "DBGLEVELBG" => GetDebugBgColor($szDbgLevel), "DBGMSG" => strip_dangerous_html_tags($szDbg) ); } // Check if the user wants to syslog the error! if ( GetConfigSetting("MiscDebugToSyslog", 0, CFGLEVEL_GLOBAL) == 1 ) { if ( $content['SOCKETS_IS_ENABLED'] ) { // Send using UDP ourself! $sock = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $stprifac = (SYSLOG_LOCAL0 << 3); if ( $szDbgLevel == DEBUG_ERROR_WTF ) $stprifac += SYSLOG_CRIT; else if ( $szDbgLevel == DEBUG_ERROR ) $stprifac += SYSLOG_ERR; else if ( $szDbgLevel == DEBUG_WARN ) $stprifac += SYSLOG_WARNING; else if ( $szDbgLevel == DEBUG_INFO ) $stprifac += SYSLOG_NOTICE; else if ( $szDbgLevel == DEBUG_DEBUG ) $stprifac += SYSLOG_INFO; else if ( $szDbgLevel == DEBUG_ULTRADEBUG ) $stprifac += SYSLOG_DEBUG; // Generate RFC5424 Syslog MSG $szsyslogmsg = "<" . $stprifac . ">" . date("c") . " " . php_uname ("n") . " " . "loganalyzer - - - " . $szDbg ; @socket_sendto($sock, $szsyslogmsg, strlen($szsyslogmsg), 0, '127.0.0.1', 514); @socket_close($sock); } else // Use PHP System function to send via syslog $syslogSend = syslog(GetPriorityFromDebugLevel($szDbgLevel), $szDbg); } } /* * GetMonthFromString * * Simple Helper function to obtain the numeric represantation of the month */ function GetMonthFromString($szMonth) { switch($szMonth) { case "Jan": return 1; case "Feb": return 2; case "Mar": return 3; case "Apr": return 4; case "May": return 5; case "Jun": return 6; case "Jul": return 7; case "Aug": return 8; case "Sep": return 9; case "Oct": return 10; case "Nov": return 11; case "Dec": return 12; } } /* * AddContextHighlights */ function AddContextHighlights(&$sourceTxt) { global $szTLDDomains; // Return if not enabled! if ( GetConfigSetting("EnableIPAddressResolve", 0, CFGLEVEL_USER) == 1 ) { // Search for IP's and Add Reverse Lookup first! // oldcode ! $sourceTxt = preg_replace( '/([^\[])\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/ie', "'\\1\\2.\\3.\\4.\\5' . ReverseResolveIP('\\2.\\3.\\4.\\5', ' {', '} ')", $sourceTxt ); $sourceTxt = preg_replace_callback( '/([^\[])\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/i', 'ReverseResolveIP', $sourceTxt ); } // check if user disabled Context Links. if ( GetConfigSetting("EnableContextLinks", 1, CFGLEVEL_USER) == 0 ) return; // Create if not set! if ( !isset($szTLDDomains) ) CreateTopLevelDomainSearch(); // Create Search Array $search = array ( '/\.([\w\d\_\-]+)\.(' . $szTLDDomains . ')([^a-zA-Z0-9\.])/i', '/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/i', ); // Create Replace Array $replace = array ( ".\\1.\\2\\3", "\\1.\\2.\\3.\\4", ); // Replace and return! $sourceTxt = preg_replace( $search, $replace, $sourceTxt ); } /* * AddContextLinks */ function AddContextLinks(&$sourceTxt) { global $szTLDDomains; // Return if not enabled! if ( GetConfigSetting("EnableIPAddressResolve", 0, CFGLEVEL_USER) == 1 ) { // Search for IP's and Add Reverse Lookup first! // $sourceTxt = preg_replace( '/([^\[])\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/ie', "'\\1\\2.\\3.\\4.\\5' . ReverseResolveIP('\\2.\\3.\\4.\\5', ' {', '} ')", $sourceTxt ); $sourceTxt = preg_replace_callback( '/([^\[])\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/i', "ReverseResolveIP", $sourceTxt ); } // check if user disabled Context Links. if ( GetConfigSetting("EnableContextLinks", 1, CFGLEVEL_USER) == 0 ) return; // Create if not set! if ( !isset($szTLDDomains) ) CreateTopLevelDomainSearch(); // Replace and return! $sourceTxt = preg_replace_callback( '/\.([\w\d\_\-]+)\.(' . $szTLDDomains . ')([^a-zA-Z0-9\.])/i', "InsertLookupLinkDomain", $sourceTxt ); $sourceTxt = preg_replace_callback( '/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/i', "InsertLookupLinkIP", $sourceTxt ); } /* * AddContextLinks */ function AddWindowLoadFocus($szFieldID) { global $content; // Add Javascript to Focus a specific element $content['EXTRA_JAVASCRIPT'] .= ""; } /* * Helper to create a Lookup Link! */ function InsertLookupLinkIP( $matches ) // $szIP, $szDomain, $prepend, $append ) { global $content, $uID; $szIP = $matches[1] . "." . $matches[2] . "." . $matches[3] . "." . $matches[4]; $prepend = ""; $append = ""; // Create string $szReturn = $prepend; // Set IUD property if available if ( isset($uID) ) $includeLinkUID = "&uid=" . $uID; else $includeLinkUID = ""; if ( IsInternalIP($szIP) ) // Do not create a LINK in this case! $szReturn .= '' . $szIP . ''; else // Normal LINK! $szReturn .= '' . $szIP . ''; // Add InfoSearch Link $szReturn .= ''; // Append the append string now $szReturn .= $append; // return result return $szReturn; } /* * Helper to create a Lookup Link! */ function InsertLookupLinkDomain( $matches ) // $szIP, $szDomain, $prepend, $append ) { global $content, $uID; $szDomain = $matches[1] . "." . $matches[2]; $prepend = "."; $append = $matches[3]; // Create string $szReturn = $prepend; // Set IUD property if available if ( isset($uID) ) $includeLinkUID = "&uid=" . $uID; else $includeLinkUID = ""; $szReturn .= '' . $szDomain . ''; // Add InfoSearch Link $szReturn .= ''; // Append the append string now $szReturn .= $append; // return result return $szReturn; } /* * Helper function to check, if an IP Address is within private address space! */ function IsInternalIP($szIPAddress) { // Split IP into array $IPArray = explode(".", $szIPAddress); if ( (intval($IPArray[0]) == 10 ) || (intval($IPArray[0]) == 127 ) || (intval($IPArray[0]) == 172 && intval($IPArray[1]) >= 16 && intval($IPArray[1]) <= 31) || (intval($IPArray[0]) == 192 && intval($IPArray[1]) == 168) || (intval($IPArray[0]) == 255 ) ) // return true in this case return true; else // This is an external IP return false; } /* * Reserve Resolve IP Address! */ function ReverseResolveIP( $matches ) // $szIP, $prepend, $append ) { global $gl_starttime, $content; // Callback functions seem to always call sessionstart @session_start(); // Set Properties here now! $szIP = $matches[2] . "." . $matches[3] . "." . $matches[4] . "." . $matches[5]; $prepend = $matches[1] . $szIP . ' {'; $append = '} '; // Substract 5 seconds we need to finish processing! $scriptruntime = intval(microtime_float() - $gl_starttime); if ( $content['MaxExecutionTime'] > 0 && $scriptruntime > ($content['MaxExecutionTime']-5) ) return $matches[0]; // Abort if these IP's are postet if ( strpos($szIP, "0.0.0.0") !== false | strpos($szIP, "127.") !== false | strpos($szIP, "255.255.255.255") !== false ) return $matches[0]; else { // Resolve name if needed if ( !isset($_SESSION['dns_cache'][$szIP]) ) $_SESSION['dns_cache'][$szIP] = @gethostbyaddr($szIP); // Suppress error messages by gethostbyaddr // Abort if IP and RESOLVED name are the same ^^! if ( $_SESSION['dns_cache'][$szIP] == $szIP || strlen($_SESSION['dns_cache'][$szIP]) <= 0 ) return $matches[0]; // Create string $szReturn = $prepend; $szReturn .= $_SESSION['dns_cache'][$szIP]; $szReturn .= $append; // echo $szReturn; // exit; // return result return $szReturn; } } /* * Helper function to create a top level domain search string ONCE per process! */ function CreateTopLevelDomainSearch() { // Current list taken from http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains! global $szTLDDomains; $szTLDDomains = "co.th|com.au|co.uk|co.jp"; $szTLDDomains .= "aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|cTLD|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw"; } /* * This Functions starts the main PHP Session if necessary */ function StartPHPSession() { global $RUNMODE; if ( $RUNMODE == RUNMODE_WEBSERVER ) { // This will start the session @session_start(); if ( !isset($_SESSION['SESSION_STARTED']) ) $_SESSION['SESSION_STARTED'] = "true"; } } /* * This Functions starts the main PHP Session if necessary */ function WriteClosePHPSession() { global $RUNMODE; if ( $RUNMODE == RUNMODE_WEBSERVER ) { @session_write_close(); } } function PrintSecureUserCheck( $warningtext, $yesmsg, $nomsg ) { global $content, $page; // Copy properties $content['warningtext'] = $warningtext; $content['yesmsg'] = $yesmsg; $content['nomsg'] = $nomsg; // Handle GET and POST input! $content['form_url'] = $_SERVER['SCRIPT_NAME'] . "?"; foreach ($_GET as $varname => $varvalue) $content['form_url'] .= $varname . "=" . $varvalue . "&"; $content['form_url'] .= "verify=yes"; // Append verify! foreach ($_POST as $varname => $varvalue) $content['POST_VARIABLES'][] = array( "varname" => $varname, "varvalue" => $varvalue ); // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); $content['TITLE'] .= " :: Confirm Action"; // --- END CREATE TITLE // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "admin/admin_securecheck.html"); $page -> output(); // --- // Exit script execution exit; } function SaveGeneralSettingsIntoDB($bForceStripSlahes = false) { WriteConfigValue( "ViewDefaultLanguage", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewDefaultTheme", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewUseTodayYesterday", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewEnableDetailPopups", true, null, null,$bForceStripSlahes ); WriteConfigValue( "EnableContextLinks", true, null, null,$bForceStripSlahes ); WriteConfigValue( "EnableIPAddressResolve", true, null, null,$bForceStripSlahes ); WriteConfigValue( "MiscShowDebugMsg", true, null, null,$bForceStripSlahes ); WriteConfigValue( "MiscShowDebugGridCounter", true, null, null,$bForceStripSlahes ); WriteConfigValue( "MiscShowPageRenderStats", true, null, null,$bForceStripSlahes ); WriteConfigValue( "MiscEnableGzipCompression", true, null, null,$bForceStripSlahes ); WriteConfigValue( "SuppressDuplicatedMessages", true, null, null,$bForceStripSlahes ); WriteConfigValue( "TreatNotFoundFiltersAsTrue", true, null, null,$bForceStripSlahes ); WriteConfigValue( "InlineOnlineSearchIcons", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewMessageCharacterLimit", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewStringCharacterLimit", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewEntriesPerPage", true, null, null,$bForceStripSlahes ); WriteConfigValue( "ViewEnableAutoReloadSeconds", true, null, null,$bForceStripSlahes ); WriteConfigValue( "AdminChangeWaitTime", true, null, null,$bForceStripSlahes ); WriteConfigValue( "PopupMenuTimeout", true, null, null,$bForceStripSlahes ); WriteConfigValue( "PrependTitle", true, null, null,$bForceStripSlahes ); WriteConfigValue( "SearchCustomButtonCaption", true, null, null,$bForceStripSlahes ); WriteConfigValue( "SearchCustomButtonSearch", true, null, null,$bForceStripSlahes ); // Extra Fields WriteConfigValue( "DefaultViewsID", true, null, null,$bForceStripSlahes ); WriteConfigValue( "DefaultSourceID", true, null, null,$bForceStripSlahes ); WriteConfigValue( "DefaultFont", true, null, null,$bForceStripSlahes ); WriteConfigValue( "DefaultFontSize", true, null, null,$bForceStripSlahes ); // GLOBAL ONLY WriteConfigValue( "DebugUserLogin", true, null, null,$bForceStripSlahes ); WriteConfigValue( "MiscDebugToSyslog", true, null, null,$bForceStripSlahes ); WriteConfigValue( "MiscMaxExecutionTime", true, null, null,$bForceStripSlahes ); WriteConfigValue( "UseProxyServerForRemoteQueries", true, null, null,$bForceStripSlahes ); WriteConfigValue( "HeaderDefaultEncoding", true, null, null,$bForceStripSlahes ); WriteConfigValue( "DisableAdminUsers", true, null, null,$bForceStripSlahes ); // Custom HTML Code WriteConfigValue( "InjectHtmlHeader", true, null, null,$bForceStripSlahes ); WriteConfigValue( "InjectBodyHeader", true, null, null,$bForceStripSlahes ); WriteConfigValue( "InjectBodyFooter", true, null, null ,$bForceStripSlahes ); WriteConfigValue( "PhplogconLogoUrl", true, null, null ,$bForceStripSlahes ); } function SaveUserGeneralSettingsIntoDB() { global $content; WriteConfigValue( "ViewDefaultLanguage", false, $content['SESSION_USERID']); WriteConfigValue( "ViewDefaultTheme", false, $content['SESSION_USERID'] ); WriteConfigValue( "ViewUseTodayYesterday", false, $content['SESSION_USERID'] ); WriteConfigValue( "ViewEnableDetailPopups", false, $content['SESSION_USERID'] ); WriteConfigValue( "EnableContextLinks", false, $content['SESSION_USERID'] ); WriteConfigValue( "EnableIPAddressResolve", false, $content['SESSION_USERID'] ); WriteConfigValue( "MiscShowDebugMsg", false, $content['SESSION_USERID'] ); WriteConfigValue( "MiscShowDebugGridCounter", false, $content['SESSION_USERID'] ); WriteConfigValue( "MiscShowPageRenderStats", false, $content['SESSION_USERID'] ); WriteConfigValue( "MiscEnableGzipCompression", false, $content['SESSION_USERID'] ); WriteConfigValue( "SuppressDuplicatedMessages", false, $content['SESSION_USERID'] ); WriteConfigValue( "TreatNotFoundFiltersAsTrue", false, $content['SESSION_USERID'] ); WriteConfigValue( "InlineOnlineSearchIcons", false, $content['SESSION_USERID'] ); WriteConfigValue( "ViewMessageCharacterLimit", false, $content['SESSION_USERID'] ); WriteConfigValue( "ViewStringCharacterLimit", false, $content['SESSION_USERID'] ); WriteConfigValue( "ViewEntriesPerPage", false, $content['SESSION_USERID'] ); WriteConfigValue( "ViewEnableAutoReloadSeconds", false, $content['SESSION_USERID'] ); WriteConfigValue( "AdminChangeWaitTime", false, $content['SESSION_USERID'] ); WriteConfigValue( "PopupMenuTimeout", false, $content['SESSION_USERID'] ); WriteConfigValue( "PrependTitle", false, $content['SESSION_USERID'] ); WriteConfigValue( "SearchCustomButtonCaption", false, $content['SESSION_USERID'] ); WriteConfigValue( "SearchCustomButtonSearch", false, $content['SESSION_USERID'] ); // Extra Fields WriteConfigValue( "DefaultViewsID", false, $content['SESSION_USERID'] ); WriteConfigValue( "DefaultSourceID", false, $content['SESSION_USERID'] ); WriteConfigValue( "DefaultFont", false, $content['SESSION_USERID'] ); WriteConfigValue( "DefaultFontSize", false, $content['SESSION_USERID'] ); } function GetConfigSetting($szSettingName, $szDefaultValue = "", $DesiredConfigLevel = CFGLEVEL_GLOBAL) { global $content, $CFG, $USERCFG; if ( isset($CFG['UserDBEnabled']) && $CFG['UserDBEnabled'] ) { if ( $DesiredConfigLevel == CFGLEVEL_USER ) { // only use user settings if desired by the user if ( isset($USERCFG['UserOverwriteOptions']) && $USERCFG['UserOverwriteOptions'] == 1 ) { // return user specific setting if available if ( isset($USERCFG[$szSettingName]) ) return $USERCFG[$szSettingName]; } } } // Either UserDB disabled, or global setting wanted - easier handling if ( isset($CFG[$szSettingName]) ) return $CFG[$szSettingName]; else return $szDefaultValue; } /* * Helper function to get all directory from a folder */ function list_directories($directory, $failOnError = true) { $result = array(); if ( !$directoryHandler = @opendir ($directory) ) { if ( $failOnError ) DieWithFriendlyErrorMsg( "list_directories: directory \"$directory\" doesn't exist!"); else return null; } while (false !== ($fileName = @readdir ($directoryHandler))) { if ( is_dir( $directory . $fileName ) && ( $fileName != "." && $fileName != ".." )) @array_push ($result, $fileName); } if ( @count ($result) === 0 ) { if ( $failOnError ) DieWithFriendlyErrorMsg( "list_directories: no directories in \"$directory\" found!"); else return null; } else { sort ($result); return $result; } } /* * Helper function to get all files from a directory */ function list_files($directory, $failOnError = true) { $result = array(); if ( !$directoryHandler = @opendir ($directory) ) { if ( $failOnError ) DieWithFriendlyErrorMsg( "list_directories: directory \"$directory\" doesn't exist!"); else return null; } while (false !== ($fileName = @readdir ($directoryHandler))) { if ( is_file( $directory . $fileName ) && ( $fileName != "." && $fileName != ".." )) @array_push ($result, $fileName); } if ( @count ($result) === 0 ) { if ( $failOnError ) DieWithFriendlyErrorMsg( "list_directories: no files in \"$directory\" found!"); else return null; } else { sort ($result); return $result; } } /* * Helper function to prepend the current global root path if necessary! */ function CheckAndPrependRootPath( $szFileName) { global $gl_root_path; // Get plain filename for testing! $szNewFileName = $szFileName; // Take as it is if rootpath! if ( ( ($pos = strpos($szFileName, "/")) !== FALSE && $pos == 0) || ( ($pos = strpos($szFileName, "\\\\")) !== FALSE && $pos == 0) || ( ($pos = strpos($szFileName, ":\\")) !== FALSE ) || ( ($pos = strpos($szFileName, ":/")) !== FALSE ) ) { // Nothing really todo true; } else { // replace ./ with gl_root_path in this case if ( ($pos = strpos($szFileName, "./")) !== FALSE ) $szNewFileName = str_replace( "./", $gl_root_path, $szFileName ); else // prepend basepath! $szNewFileName = $gl_root_path . $szFileName; } // return result return $szNewFileName; } /* * Helper function to flush html output to avoid redirects if errors happen! */ function FlushHtmlOutput() { global $RUNMODE; // not needed in console mode if ( $RUNMODE == RUNMODE_COMMANDLINE ) return; //Flush php output @flush(); @ob_flush(); } /* * Helper function to get the errorCode */ function GetErrorMessage($errorCode) { global $content; switch( $errorCode ) { case ERROR_FILE_NOT_FOUND: return $content['LN_ERROR_FILE_NOT_FOUND']; case ERROR_FILE_NOT_READABLE: return $content['LN_ERROR_FILE_NOT_READABLE']; case ERROR_FILE_EOF: return $content['LN_ERROR_FILE_EOF']; case ERROR_FILE_BOF: return $content['LN_ERROR_FILE_BOF']; case ERROR_FILE_CANT_CLOSE: return $content['LN_ERROR_FILE_CANT_CLOSE']; case ERROR_UNDEFINED: return $content['LN_ERROR_UNDEFINED']; case ERROR_EOS: return $content['LN_ERROR_EOS']; case ERROR_NOMORERECORDS: return $content['LN_ERROR_NORECORDS']; case ERROR_FILTER_NOT_MATCH: return $content['LN_ERROR_FILTER_NOT_MATCH']; case ERROR_DB_CONNECTFAILED: return $content['LN_ERROR_DB_CONNECTFAILED']; case ERROR_DB_CANNOTSELECTDB: return $content['LN_ERROR_DB_CANNOTSELECTDB']; case ERROR_DB_QUERYFAILED: return isset($content['LN_ERROR_DB_QUERYFAILED']) ? $content['LN_ERROR_DB_QUERYFAILED'] : $errorCode; case ERROR_DB_NOPROPERTIES: return $content['LN_ERROR_DB_NOPROPERTIES']; case ERROR_DB_INVALIDDBMAPPING: return $content['LN_ERROR_DB_INVALIDDBMAPPING']; case ERROR_DB_INVALIDDBDRIVER: return $content['LN_ERROR_DB_INVALIDDBDRIVER']; case ERROR_DB_TABLENOTFOUND: return $content['LN_ERROR_DB_TABLENOTFOUND']; case ERROR_DB_DBFIELDNOTFOUND: return $content['LN_ERROR_DB_DBFIELDNOTFOUND']; case ERROR_CHARTS_NOTCONFIGURED: return $content['LN_ERROR_CHARTS_NOTCONFIGURED']; case ERROR_FILE_NOMORETIME: return $content['LN_ERROR_FILE_NOMORETIME']; case ERROR_SOURCENOTFOUND: return $content['LN_GEN_ERROR_SOURCENOTFOUND']; case ERROR_REPORT_NODATA: return $content['LN_GEN_ERROR_REPORT_NODATA']; case ERROR_PATH_NOT_ALLOWED: return $content['LN_ERROR_PATH_NOT_ALLOWED']; default: return GetAndReplaceLangStr( $content['LN_ERROR_UNKNOWN'], $errorCode ); } } // --- Static Sorter helper function! /** * Helper function for multisorting multidimensional arrays */ function MultiSortArrayByItemCountDesc( $arrayFirst, $arraySecond ) { // Do not sort in this case if ($arrayFirst['itemcount'] == $arraySecond['itemcount']) return 0; // Move up or down return ($arrayFirst['itemcount'] < $arraySecond['itemcount']) ? 1 : -1; } /** * Helper function for multisorting multidimensional arrays */ function MultiSortArrayByItemCountAsc( $arrayFirst, $arraySecond ) { // Do not sort in this case if ($arrayFirst['itemcount'] == $arraySecond['itemcount']) return 0; // Move up or down return ($arrayFirst['itemcount'] < $arraySecond['itemcount']) ? -1 : 1; } /** * Helper function to remove dangerous HTML Tags */ function strip_dangerous_html_tags( $text ) { $text = preg_replace( array( // Remove invisible content '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@/script>@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', '@]*?>@siu', '@@siu', ), array( ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ), $text ); return $text; } // Creates a list of supported available fonts! function InitFontList() { global $content; $content["fonts"]["Arial"]["Name"] = "Arial"; $content["fonts"]["Century"]["Name"] = "Century"; $content["fonts"]["Courier"]["Name"] = "Courier"; $content["fonts"]["Courier New"]["Name"] = "Courier New"; $content["fonts"]["Georgia"]["Name"] = "Georgia"; $content["fonts"]["Impact"]["Name"] = "Impact"; $content["fonts"]["Lucida Console"]["Name"] = "Lucida Console"; $content["fonts"]["serif"]["Name"] = "serif"; $content["fonts"]["sans-serif"]["Name"] = "sans-serif"; $content["fonts"]["Tahoma"]["Name"] = "Tahoma"; $content["fonts"]["Times"]["Name"] = "Times"; $content["fonts"]["Times New Roman"]["Name"]= "Times New Roman"; $content["fonts"]["Trebuchet MS"]["Name"] = "Trebuchet MS"; $content["fonts"]["Verdana"]["Name"] = "Verdana"; } // Creates a list of supported available fonts! function InitFontSizeList() { global $content; $content["fontsizes"]["50"]["Name"] = "50%"; $content["fontsizes"]["60"]["Name"] = "60%"; $content["fontsizes"]["70"]["Name"] = "70%"; $content["fontsizes"]["80"]["Name"] = "80%"; $content["fontsizes"]["90"]["Name"] = "90%"; $content["fontsizes"]["100"]["Name"] = "100%"; $content["fontsizes"]["110"]["Name"] = "110%"; $content["fontsizes"]["120"]["Name"] = "120%"; $content["fontsizes"]["130"]["Name"] = "130%"; $content["fontsizes"]["140"]["Name"] = "140%"; $content["fontsizes"]["150"]["Name"] = "150%"; $content["fontsizes"]["160"]["Name"] = "160%"; $content["fontsizes"]["170"]["Name"] = "170%"; $content["fontsizes"]["180"]["Name"] = "180%"; $content["fontsizes"]["190"]["Name"] = "190%"; $content["fontsizes"]["200"]["Name"] = "200%"; } // --- /* Helper function to set dynamic css */ function InitFontSettings() { global $content; // --- Set dynamic stylesheet options like Font Type and Sizes if ( isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], "Windows") !== false ) // Use other default on Windows $userdefaultfont = GetConfigSetting("DefaultFont", "Trebuchet MS", CFGLEVEL_USER); else $userdefaultfont = GetConfigSetting("DefaultFont", "Arial", CFGLEVEL_USER); $userdefaultfontsize = GetConfigSetting("DefaultFontSize", "100", CFGLEVEL_USER); /* Set Defaults if not set already! */ if ( strlen($userdefaultfont) <= 0 ) $userdefaultfont = "Arial"; if ( strlen($userdefaultfontsize) <= 0 ) $userdefaultfontsize = "100"; $content['DYN_STYLESHEET'] = ''; // --- } function ReplaceDollarChar($myValue) { if ( is_array($myValue) ) { // Array value $retArray = array(); foreach( $myValue as $mykey => $myString ) { // Add slashes before $ characters $retArray[$mykey] = addcslashes ( $retArray[$mykey], "$" ); } // Return fixed array! return $retArray; } else { // Add slashes before $ characters return addcslashes( $myValue, "$" ); } } ?>loganalyzer-4.1.5/src/include/functions_config.php000066400000000000000000001032071277740250400223430ustar00rootroot00000000000000 Configuration need variables for the Database connection * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Perform necessary includes require_once($gl_root_path . 'classes/logstreamconfig.class.php'); // --- function InitSource(&$mysource) { global $CFG, $content, $gl_root_path, $currentSourceID; if ( isset($mysource['SourceType']) ) { // Set Array Index, TODO: Check for invalid characters! $iSourceID = $mysource['ID']; // --- Set defaults if not set! if ( !isset($mysource['LogLineType']) ) { $CFG['Sources'][$iSourceID]['LogLineType'] = "syslog"; $content['Sources'][$iSourceID]['LogLineType'] = "syslog"; } if ( !isset($mysource['userid']) ) { $CFG['Sources'][$iSourceID]['userid'] = null; $content['Sources'][$iSourceID]['userid'] = null; } if ( !isset($mysource['groupid']) ) { $CFG['Sources'][$iSourceID]['groupid'] = null; $content['Sources'][$iSourceID]['groupid'] = null; } if ( !isset($mysource['MsgParserList']) ) { $CFG['Sources'][$iSourceID]['MsgParserList'] = null; $content['Sources'][$iSourceID]['MsgParserList'] = null; } if ( !isset($mysource['MsgNormalize']) ) { $CFG['Sources'][$iSourceID]['MsgNormalize'] = 0; $content['Sources'][$iSourceID]['MsgNormalize'] = 0; } if ( !isset($mysource['MsgSkipUnparseable']) ) { $CFG['Sources'][$iSourceID]['MsgSkipUnparseable'] = 0; $content['Sources'][$iSourceID]['MsgSkipUnparseable'] = 0; } if ( !isset($mysource['Description']) ) { $CFG['Sources'][$iSourceID]['Description'] = ""; $content['Sources'][$iSourceID]['Description'] = ""; } if ( !isset($mysource['defaultfilter']) ) { $CFG['Sources'][$iSourceID]['defaultfilter'] = ""; $content['Sources'][$iSourceID]['defaultfilter'] = ""; } // --- // Set default view id to source $tmpVar = GetConfigSetting("DefaultViewsID", "", CFGLEVEL_USER); $szDefaultViewID = strlen($tmpVar) > 0 ? $tmpVar : "SYSLOG"; if ( isset($_SESSION[$iSourceID . "-View"]) ) { // check if view is valid $UserSessionViewID = $_SESSION[$iSourceID . "-View"]; if ( isset($content['Views'][$UserSessionViewID]) ) { // Overwrite configured view! $content['Sources'][$iSourceID]['ViewID'] = $_SESSION[$iSourceID . "-View"]; } else $content['Sources'][$iSourceID]['ViewID'] = $szDefaultViewID; } else { if ( isset($mysource['ViewID']) && strlen($mysource['ViewID']) > 0 && isset($content['Views'][ $mysource['ViewID'] ]) ) // Set to configured Source ViewID $content['Sources'][$iSourceID]['ViewID'] = $mysource['ViewID']; else // Not configured, maybe old legacy cfg. Set default view. $content['Sources'][$iSourceID]['ViewID'] = $szDefaultViewID; } // Only for the display box $content['Sources'][$iSourceID]['selected'] = ""; // Create Config instance! if ( $mysource['SourceType'] == SOURCE_DISK ) { // Perform necessary include require_once($gl_root_path . 'classes/logstreamconfigdisk.class.php'); $mysource['ObjRef'] = new LogStreamConfigDisk(); $mysource['ObjRef']->SetFileName( $mysource['DiskFile'] ); $mysource['ObjRef']->LineParserType = $mysource['LogLineType']; } else if ( $mysource['SourceType'] == SOURCE_DB ) { // Perform necessary include require_once($gl_root_path . 'classes/logstreamconfigdb.class.php'); $mysource['ObjRef'] = new LogStreamConfigDB(); $mysource['ObjRef']->DBServer = $mysource['DBServer']; $mysource['ObjRef']->DBName = $mysource['DBName']; // Workaround a little bug from the installer script if ( isset($mysource['DBType']) ) $mysource['ObjRef']->DBType = $mysource['DBType']; else $mysource['ObjRef']->DBType = DB_MYSQL; $mysource['ObjRef']->DBTableName = $mysource['DBTableName']; // Legacy handling for tabletype! if ( isset($mysource['DBTableType']) && strtolower($mysource['DBTableType']) == "winsyslog" ) $mysource['ObjRef']->DBTableType = "monitorware"; // Convert to MonitorWare! else $mysource['ObjRef']->DBTableType = strtolower($mysource['DBTableType']); // Optional parameters! if ( isset($mysource['DBPort']) ) { $mysource['ObjRef']->DBPort = $mysource['DBPort']; } if ( isset($mysource['DBUser']) ) { $mysource['ObjRef']->DBUser = $mysource['DBUser']; } if ( isset($mysource['DBPassword']) ) { $mysource['ObjRef']->DBPassword = $mysource['DBPassword']; } if ( isset($mysource['DBEnableRowCounting']) ) { $mysource['ObjRef']->DBEnableRowCounting = $mysource['DBEnableRowCounting']; } if ( isset($mysource['DBRecordsPerQuery']) ) { $mysource['ObjRef']->RecordsPerQuery = $mysource['DBRecordsPerQuery']; } } else if ( $mysource['SourceType'] == SOURCE_PDO ) { // Perform necessary include require_once($gl_root_path . 'classes/logstreamconfigpdo.class.php'); $mysource['ObjRef'] = new LogStreamConfigPDO(); $mysource['ObjRef']->DBServer = $mysource['DBServer']; $mysource['ObjRef']->DBName = $mysource['DBName']; $mysource['ObjRef']->DBType = $mysource['DBType']; $mysource['ObjRef']->DBTableName = $mysource['DBTableName']; $mysource['ObjRef']->DBTableType = strtolower($mysource['DBTableType']); // Optional parameters! if ( isset($mysource['DBPort']) ) { $mysource['ObjRef']->DBPort = $mysource['DBPort']; } if ( isset($mysource['DBUser']) ) { $mysource['ObjRef']->DBUser = $mysource['DBUser']; } if ( isset($mysource['DBPassword']) ) { $mysource['ObjRef']->DBPassword = $mysource['DBPassword']; } if ( isset($mysource['DBEnableRowCounting']) ) { $mysource['ObjRef']->DBEnableRowCounting = $mysource['DBEnableRowCounting']; } } else if ( $mysource['SourceType'] == SOURCE_MONGODB) { // Perform necessary include require_once($gl_root_path . 'classes/logstreamconfigmongodb.class.php'); $mysource['ObjRef'] = new LogStreamConfigMongoDB(); $mysource['ObjRef']->DBServer = $mysource['DBServer']; $mysource['ObjRef']->DBName = $mysource['DBName']; $mysource['ObjRef']->DBCollection = $mysource['DBTableName']; $mysource['ObjRef']->DBTableType = strtolower($mysource['DBTableType']); // Optional parameters! if ( isset($mysource['DBPort']) ) { $mysource['ObjRef']->DBPort = $mysource['DBPort']; } if ( isset($mysource['DBUser']) ) { $mysource['ObjRef']->DBUser = $mysource['DBUser']; } if ( isset($mysource['DBPassword']) ) { $mysource['ObjRef']->DBPassword = $mysource['DBPassword']; } // if ( isset($mysource['DBEnableRowCounting']) ) { $mysource['ObjRef']->DBEnableRowCounting = $mysource['DBEnableRowCounting']; } } else { // UNKNOWN, remove config entry! unset($content['Sources'][$iSourceID]); // Output Debug Warning only! OutputDebugMessage( GetAndReplaceLangStr($content['LN_GEN_CRITERROR_UNKNOWNTYPE'], $mysource['SourceType']), DEBUG_ERROR); // DieWithFriendlyErrorMsg( GetAndReplaceLangStr($content['LN_GEN_CRITERROR_UNKNOWNTYPE'], $mysource['SourceType']) ); return ERROR; } // Set generic configuration options $mysource['ObjRef']->_pageCount = GetConfigSetting("ViewEntriesPerPage", 50); if ( isset($mysource['MsgParserList']) ) $mysource['ObjRef']->SetMsgParserList( $mysource['MsgParserList'] ); if ( isset($mysource['MsgNormalize']) ) $mysource['ObjRef']->SetMsgNormalize( $mysource['MsgNormalize'] ); if ( isset($mysource['MsgSkipUnparseable']) ) $mysource['ObjRef']->SetSkipUnparseable( $mysource['MsgSkipUnparseable'] ); if ( isset($mysource['defaultfilter']) ) $mysource['ObjRef']->SetDefaultfilter( $mysource['defaultfilter'] ); // Set default SourceID here! if ( isset($content['Sources'][$iSourceID]) && !isset($currentSourceID) ) $currentSourceID = $iSourceID; // Copy Object REF into CFG and content Array as well! $content['Sources'][$iSourceID]['ObjRef'] = $mysource['ObjRef']; $CFG['Sources'][$iSourceID]['ObjRef'] = $mysource['ObjRef']; } } /* * This function reads and generates a list of available message parsers */ function InitMessageParsers() { global $content, $gl_root_path; $szDirectory = $gl_root_path . 'classes/msgparsers/'; // msgparser.' . $szParser . '.class.php'; $aFiles = list_files($szDirectory, true); if ( isset($aFiles) && count($aFiles) > 0 ) { foreach( $aFiles as $myFile ) { // Check if file is valid msg parser! if ( preg_match("/msgparser\.(.*?)\.class\.php$/", $myFile, $out ) ) { // Set ParserID! $myParserID = $out[1]; // Check if parser file include exists $szIncludeFile = $szDirectory . $myFile; if ( file_exists($szIncludeFile) ) { // Try to include if ( include_once($szIncludeFile) ) { // Set ParserClassName $szParserClass = "MsgParser_" . $myParserID; /// echo $szParserClass . "
    "; // Create Instance and get properties $tmpParser = new $szParserClass(); // Create an instance $szParserName = $tmpParser->_ClassName; $szParserDescription = $tmpParser->_ClassDescription; $szParserHelpArticle = $tmpParser->_ClassHelpArticle; // check for required fields! if ( $tmpParser->_ClassRequiredFields != null && count($tmpParser->_ClassRequiredFields) > 0 ) { $bCustomFields = true; $aCustomFieldList = $tmpParser->_ClassRequiredFields; // print_r ( $aCustomFieldList ); } else { $bCustomFields = false; $aCustomFieldList = null; } // Add entry to msg parser list! $content['PARSERS'][$myParserID] = array ( "ID" => $myParserID, "DisplayName" => $szParserName, "Description" => $szParserDescription, "CustomFields" => $bCustomFields, "CustomFieldsList" => $aCustomFieldList, "ParserHelpArticle" => $szParserHelpArticle, ); } else { // DEBUG ERROR OutputDebugMessage("InitMessageParsers: Failed including msgparser file '" . $szIncludeFile . "' with error: '" . $php_errormsg . "'", DEBUG_ERROR); } } else { // DEBUG ERROR OutputDebugMessage("InitMessageParsers: MsgParserfile '" . $szIncludeFile . "' does not exist!", DEBUG_ERROR); } } } } } /* * This function generates a list of available reports modules and custom reports */ function InitReportModules($szRootPath = "") { global $content, $gl_root_path; // Check for parameter if ( strlen($szRootPath) == 0 ) $szRootPath = $gl_root_path; $szDirectory = $szRootPath . 'classes/reports/'; $aFiles = list_files($szDirectory, true); if ( isset($aFiles) && count($aFiles) > 0 ) { foreach( $aFiles as $myFile ) { // Check if file is valid msg parser! if ( preg_match("/report\.(.*?)\.(.*?)\.class\.php$/", $myFile, $out ) ) { // Set ParserID! $myReportCat = $out[1]; $myReportID = $out[2]; // Check if parser file include exists $szIncludeFile = $szDirectory . $myFile; if ( file_exists($szIncludeFile) ) { // Try to include if ( include_once($szIncludeFile) ) { // Set ParserClassName $szReportClass = "Report_" . $myReportID; // Create Instance and get properties $tmpReport = new $szReportClass(); // Create an instance $szReportName = $tmpReport->_reportTitle; $szReportDescription = $tmpReport->_reportDescription; $szReportVersion= $tmpReport->_reportVersion; $szReportHelpArticle = $tmpReport->_reportHelpArticle; $bNeedsInit = $tmpReport->_reportNeedsInit; $bInitialized = $tmpReport->_reportInitialized; $aRequiredFieldsList = $tmpReport->GetRequiredProperties(); /* // check for required fields! if ( $tmpReport->_ClassRequiredFields != null && count($tmpParser->_ClassRequiredFields) > 0 ) { $bCustomFields = true; $aCustomFieldList = $tmpParser->_ClassRequiredFields; // print_r ( $aCustomFieldList ); } else { $bCustomFields = false; $aCustomFieldList = null; } */ // Add entry to report modules list! $content['REPORTS'][$myReportID] = array ( "ID" => $myReportID, "Category" => $myReportCat, "DisplayName" => $szReportName, "Description" => $szReportDescription, "ReportVersion" => $szReportVersion, "ReportHelpArticle" => $szReportHelpArticle, "NeedsInit" => $bNeedsInit, "Initialized" => $bInitialized, "ObjRef" => $tmpReport, // "CustomFields" => $bCustomFields, "RequiredFieldsList" => $aRequiredFieldsList, ); // --- Now Search and populate savedReports | but only if DB Version is 9 or higher. if ( $content['database_installedversion'] >= 9 ) { // --- Create SQL Query $sqlquery = " SELECT " . DB_SAVEDREPORTS . ".ID as SavedReportID, " . DB_SAVEDREPORTS . ".sourceid, " . DB_SAVEDREPORTS . ".customTitle, " . DB_SAVEDREPORTS . ".customComment, " . DB_SAVEDREPORTS . ".filterString, " . DB_SAVEDREPORTS . ".customFilters, " . DB_SAVEDREPORTS . ".outputFormat, " . DB_SAVEDREPORTS . ".outputTarget, " . DB_SAVEDREPORTS . ".outputTargetDetails, " . DB_SAVEDREPORTS . ".scheduleSettings " . " FROM `" . DB_SAVEDREPORTS . "`" . " WHERE `" . DB_SAVEDREPORTS . "`.reportid = '" . $myReportID . "' " . " ORDER BY `" . DB_SAVEDREPORTS . "`.customTitle"; // Get Views from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows) && count($myrows) > 0 ) { // Set to true! $content['REPORTS'][$myReportID]['HASSAVEDREPORTS'] = true; // Add all savedreports foreach ($myrows as &$mySavedReport) { // Set default properties if not set! if (!isset($mySavedReport['outputTarget']) || strlen($mySavedReport['outputTarget']) <= 0 ) $mySavedReport['outputTarget'] = REPORT_TARGET_STDOUT; // Add saved report into global array $content['REPORTS'][$myReportID]['SAVEDREPORTS'][ $mySavedReport['SavedReportID'] ] = $mySavedReport; } } } // --- } else { // DEBUG ERROR OutputDebugMessage("InitReportModules: Failed including report file '" . $szIncludeFile . "' with error: '" . $php_errormsg . "'", DEBUG_ERROR); } } else { // DEBUG ERROR OutputDebugMessage("InitReportModules: Reportfile '" . $szIncludeFile . "' does not exist!", DEBUG_ERROR); } } } } // TODO: compare update report modules registered in database } /* * Init Source configs */ function InitSourceConfigs() { global $CFG, $content, $currentSourceID; // Init Source Configs! if ( isset($CFG['Sources']) ) { foreach( $CFG['Sources'] as &$mysource ) { // Init each source using this function! InitSource($mysource); } } // Read SourceID from GET Querystring if ( isset($_GET['sourceid']) && isset($content['Sources'][$_GET['sourceid']]) ) { $currentSourceID = $_GET['sourceid']; $_SESSION['currentSourceID'] = $currentSourceID; } else { // Set Source from session if available! if ( isset($_SESSION['currentSourceID']) && isset($content['Sources'][$_SESSION['currentSourceID']]) ) $currentSourceID = $_SESSION['currentSourceID']; else { $tmpVar = GetConfigSetting("DefaultSourceID", "", CFGLEVEL_USER); if ( isset($content['Sources'][ $tmpVar ]) ) { // Set Source to preconfigured sourceID! $_SESSION['currentSourceID'] = $tmpVar; $currentSourceID = $tmpVar; } else // No Source stored in session, then to so now! $_SESSION['currentSourceID'] = $currentSourceID; } } // Set for the selection box in the header $content['Sources'][$currentSourceID]['selected'] = "selected"; // Set Description properties! if ( isset($content['Sources'][$currentSourceID]['Description']) && strlen($content['Sources'][$currentSourceID]['Description']) > 0 ) { $content['SourceDescriptionEnabled'] = true; $content['SourceDescription'] = $content['Sources'][$currentSourceID]['Description']; } // --- Additional handling needed for the current view! global $currentViewID; $currentViewID = $content['Sources'][$currentSourceID]['ViewID']; // Set selected state for correct View, for selection box ^^ $content['Views'][ $currentViewID ]['selected'] = "selected"; // If DEBUG Mode is enabled, we prepend the UID field into the col list! if ( GetConfigSetting("MiscShowDebugMsg", 0, CFGLEVEL_USER) == 1 && isset($content['Views'][$currentViewID]) ) array_unshift( $content['Views'][$currentViewID]['Columns'], SYSLOG_UID); // --- } /* * This function Inits preconfigured Views. */ function InitViewConfigs() { global $CFG, $content, $currentViewID; // Predefined LogAnalyzer Views $CFG['Views']['SYSLOG']= array( 'ID' => "SYSLOG", 'DisplayName' =>"Syslog Fields", 'Columns' => array ( SYSLOG_DATE, SYSLOG_FACILITY, SYSLOG_SEVERITY, SYSLOG_HOST, SYSLOG_SYSLOGTAG, SYSLOG_PROCESSID, SYSLOG_MESSAGETYPE, SYSLOG_MESSAGE ), 'userid' => null, 'groupid' => null, ); $CFG['Views']['EVTRPT']= array( 'ID' => "EVTRPT", 'DisplayName' =>"EventLog Fields", 'Columns' => array ( SYSLOG_DATE, SYSLOG_HOST, SYSLOG_SEVERITY, SYSLOG_EVENT_LOGTYPE, SYSLOG_EVENT_SOURCE, SYSLOG_EVENT_ID, SYSLOG_EVENT_USER, SYSLOG_MESSAGE ), 'userid' => null, 'groupid' => null, ); $CFG['Views']['WEBLOG']= array( 'ID' => "WEBLOG", 'DisplayName' =>"Webserver Fields", 'Columns' => array ( SYSLOG_DATE, SYSLOG_HOST, SYSLOG_WEBLOG_URL, SYSLOG_WEBLOG_USERAGENT, SYSLOG_WEBLOG_STATUS, SYSLOG_WEBLOG_BYTESSEND, SYSLOG_MESSAGE ), 'userid' => null, 'groupid' => null, ); // Set default of 'DefaultViewsID' only if not set already! if ( !isset($CFG['DefaultViewsID']) ) $CFG['DefaultViewsID'] = "SYSLOG"; // Loop through views now and copy into content array! foreach ( $CFG['Views'] as $key => $view ) $content['Views'][$key] = $view; } /* * This function Inits preconfigured Views. */ function AppendLegacyColumns() { global $CFG, $content; // Init View from legacy Columns $CFG['Views']['LEGACY']= array( 'ID' => "LEGACY", 'DisplayName' =>"Legacy Columns Configuration", 'Columns' => $CFG['Columns'], ); // set default to legacy of no default view is specified! $tmpVar = GetConfigSetting("DefaultViewsID", "", CFGLEVEL_USER); if ( strlen($tmpVar) <= 0 ) $CFG['DefaultViewsID'] = "LEGACY"; } function InitPhpLogConConfigFile($bHandleMissing = true) { // Needed to make global global $CFG, $gl_root_path, $content; // Bugfix for race conditions, clear file stats cache! clearstatcache(); if ( file_exists($gl_root_path . 'config.php') && GetFileLength($gl_root_path . 'config.php') > 0 ) { // Include the main config include_once($gl_root_path . 'config.php'); // Easier DB Access $tblPref = GetConfigSetting("UserDBPref", "logcon"); define('DB_CONFIG', $tblPref . "config"); define('DB_GROUPS', $tblPref . "groups"); define('DB_GROUPMEMBERS', $tblPref . "groupmembers"); define('DB_FIELDS', $tblPref . "fields"); define('DB_SEARCHES', $tblPref . "searches"); define('DB_SOURCES', $tblPref . "sources"); define('DB_USERS', $tblPref . "users"); define('DB_VIEWS', $tblPref . "views"); define('DB_CHARTS', $tblPref . "charts"); define('DB_MAPPINGS', $tblPref . "dbmappings"); define('DB_SAVEDREPORTS', $tblPref . "savedreports"); // Legacy support for old columns definition format! if ( isset($CFG['Columns']) && is_array($CFG['Columns']) ) AppendLegacyColumns(); // --- Now Copy all entries into content variable foreach ($CFG as $key => $value ) $content[$key] = $value; // --- // For MiscShowPageRenderStats if ( GetConfigSetting("MiscShowPageRenderStats", 1) ) { $content['ShowPageRenderStats'] = "true"; InitPageRenderStats(); } // return result return true; } else { // if handled ourselfe, we die in CheckForInstallPhp. if ( $bHandleMissing == true ) { // Check for installscript! CheckForInstallPhp(); } else return false; } } /* * Helper function to load configured dbmappings from the database */ function InitDiskAllowedSources() { global $CFG, $content; // Init Source Configs! if ( isset($CFG['DiskAllowed']) ) { // Copy Array to content array $content['DiskAllowed'] = $CFG['DiskAllowed']; } else { // Set default $content['DiskAllowed'][] = "/var/log/"; } } /* * Helper function to load configured dbmappings from the database */ function LoadDBMappingsFromDatabase() { // Needed to make global global $dbmapping, $content, $fields; // Abort reading fields if the database version is below version 8!, because prior v8, there were no dbmappings table if ( $content['database_installedversion'] < 8 ) return; // --- Preprocess fields in loop foreach ($dbmapping as &$myMapping ) { // Set Field to be internal! $myMapping['IsInternalMapping'] = true; $myMapping['MappingFromDB'] = false; } // --- // --- Create SQL Query $sqlquery = " SELECT " . DB_MAPPINGS . ".ID, " . DB_MAPPINGS . ".DisplayName, " . DB_MAPPINGS . ".Mappings " . " FROM `" . DB_MAPPINGS . "`" . " ORDER BY `" . DB_MAPPINGS . "`.DisplayName"; // Get Views from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows) && count($myrows) > 0 ) { // Unpack the Columns and append to Views Array foreach ($myrows as &$myMappings) { // Split into array $tmpMappings = explode( ",", $myMappings['Mappings'] ); //Loop through mappings foreach ($tmpMappings as &$myMapping ) { // Split subvalues $tmpMapping = explode( "=>", $myMapping ); // check if field is valid $fieldId = trim($tmpMapping[0]); if ( isset($fields[$fieldId]) ) { // Assign mappings $myMappings['DBMAPPINGS'][$fieldId] = trim($tmpMapping[1]); } } // Add Mapping to array $dbmapping[ $myMappings['ID'] ] = $myMappings; // Set FromDB to true $dbmapping[ $myMappings['ID'] ]['MappingFromDB'] = true; } } // --- } /* * Helper function to load configured fields from the database */ function LoadFieldsFromDatabase() { // Needed to make global global $fields, $content; // Abort reading fields if the database version is below version 5!, because prior v5, there were no fields table if ( $content['database_installedversion'] < 5 ) return; // --- Preprocess fields in loop foreach ($fields as &$myField ) { // Set Field to be internal! $myField['IsInternalField'] = true; $myField['FieldFromDB'] = false; // Set some other defaults! if ( !isset($myField['Trunscate']) ) $myField['Trunscate'] = 30; if ( !isset($myField['SearchOnline']) ) $myField['SearchOnline'] = false; if ( !isset($myField['SearchField']) ) $myField['SearchField'] = $myField['FieldID']; } // --- // --- Create SQL Query $sqlquery = " SELECT " . DB_FIELDS . ".FieldID, " . DB_FIELDS . ".FieldDefine, " . DB_FIELDS . ".FieldCaption, " . DB_FIELDS . ".FieldType, " . DB_FIELDS . ".FieldAlign, " . DB_FIELDS . ".SearchField, " . DB_FIELDS . ".DefaultWidth, " . DB_FIELDS . ".SearchOnline, " . DB_FIELDS . ".Trunscate, " . DB_FIELDS . ".Sortable " . " FROM `" . DB_FIELDS . "`" . " ORDER BY `" . DB_FIELDS . "`.FieldCaption"; // --- // Get Searches from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows ) && count($myrows) > 0 ) { // Loop through all data rows foreach ($myrows as &$myField ) { // Read and Set from db! $fieldId = $myField['FieldID']; $fieldDefine = $myField['FieldDefine']; // Set define needed in certain code places! if ( !defined($fieldDefine) ) { define($fieldDefine, $fieldId); $fields[$fieldId]['IsInternalField'] = false; } // Copy values $fields[$fieldId]['FieldID'] = $myField['FieldID']; $fields[$fieldId]['FieldDefine'] = $myField['FieldDefine']; $fields[$fieldId]['FieldCaption'] = $myField['FieldCaption']; $fields[$fieldId]['FieldType'] = $myField['FieldType']; $fields[$fieldId]['FieldAlign'] = $myField['FieldAlign']; $fields[$fieldId]['SearchField'] = $myField['SearchField']; $fields[$fieldId]['DefaultWidth'] = $myField['DefaultWidth']; $fields[$fieldId]['SearchOnline'] = $myField['SearchOnline']; $fields[$fieldId]['Trunscate'] = $myField['Trunscate']; $fields[$fieldId]['Sortable'] = $myField['Sortable']; // Set FromDB to true $fields[$fieldId]['FieldFromDB'] = true; } // print_r ( $fields ); } } /* * Helper function to load configured Searches from the database */ function LoadSearchesFromDatabase() { // Needed to make global global $CFG, $content; // --- Create SQL Query // Create Where for USERID if ( isset($content['SESSION_LOGGEDIN']) && $content['SESSION_LOGGEDIN'] ) $szWhereUser = " OR `" . DB_SEARCHES . "`.userid = " . $content['SESSION_USERID'] . " "; else $szWhereUser = ""; if ( isset($content['SESSION_GROUPIDS']) ) $szGroupWhere = " OR `" . DB_SEARCHES . "`.groupid IN (" . $content['SESSION_GROUPIDS'] . ")"; else $szGroupWhere = ""; $sqlquery = " SELECT " . DB_SEARCHES . ".ID, " . DB_SEARCHES . ".DisplayName, " . DB_SEARCHES . ".SearchQuery, " . DB_SEARCHES . ".userid, " . DB_SEARCHES . ".groupid, " . DB_USERS . ".username, " . DB_GROUPS . ".groupname " . " FROM `" . DB_SEARCHES . "`" . " LEFT OUTER JOIN (`" . DB_USERS . "`) ON (`" . DB_SEARCHES . "`.userid=`" . DB_USERS . "`.ID ) " . " LEFT OUTER JOIN (`" . DB_GROUPS . "`) ON (`" . DB_SEARCHES . "`.groupid=`" . DB_GROUPS . "`.ID ) " . " WHERE (`" . DB_SEARCHES . "`.userid IS NULL AND `" . DB_SEARCHES . "`.groupid IS NULL) " . $szWhereUser . $szGroupWhere . " ORDER BY `" . DB_SEARCHES . "`.userid, `" . DB_SEARCHES . "`.groupid, `" . DB_SEARCHES . "`.DisplayName"; // --- // Get Searches from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows ) && count($myrows) > 0 ) { // Overwrite existing Charts array unset($CFG['Search']); // Loop through all data rows foreach ($myrows as &$mySearch ) { // Append to Chart Array $CFG['Search'][ $mySearch['ID'] ] = $mySearch; } // Copy to content array! $content['Search'] = $CFG['Search']; // // Overwrite Search Array with Database one // $CFG['Search'] = $myrows; // $content['Search'] = $myrows; } } /* * Helper function to load configured Searches from the database */ function LoadChartsFromDatabase() { // Needed to make global global $CFG, $content; // Abort reading charts if the database version is below 3, because prior v3, there were no charts table if ( $content['database_installedversion'] < 3 ) return; // Add new fields depending on DB Version! // --- Create SQL Query // Create Where for USERID if ( isset($content['SESSION_LOGGEDIN']) && $content['SESSION_LOGGEDIN'] ) $szWhereUser = " OR `" . DB_CHARTS . "`.userid = " . $content['SESSION_USERID'] . " "; else $szWhereUser = ""; if ( isset($content['SESSION_GROUPIDS']) ) $szGroupWhere = " OR `" . DB_CHARTS . "`.groupid IN (" . $content['SESSION_GROUPIDS'] . ")"; else $szGroupWhere = ""; $sqlquery = " SELECT " . DB_CHARTS . ".ID, " . DB_CHARTS . ".DisplayName, " . DB_CHARTS . ".chart_enabled, " . DB_CHARTS . ".chart_type, " . DB_CHARTS . ".chart_width, " . DB_CHARTS . ".chart_field, " . DB_CHARTS . ".chart_defaultfilter, " . DB_CHARTS . ".maxrecords, " . DB_CHARTS . ".showpercent, " . DB_CHARTS . ".userid, " . DB_CHARTS . ".groupid, " . DB_USERS . ".username, " . DB_GROUPS . ".groupname " . " FROM `" . DB_CHARTS . "`" . " LEFT OUTER JOIN (`" . DB_USERS . "`) ON (`" . DB_CHARTS . "`.userid=`" . DB_USERS . "`.ID ) " . " LEFT OUTER JOIN (`" . DB_GROUPS . "`) ON (`" . DB_CHARTS . "`.groupid=`" . DB_GROUPS . "`.ID ) " . " WHERE (`" . DB_CHARTS . "`.userid IS NULL AND `" . DB_CHARTS . "`.groupid IS NULL) " . $szWhereUser . $szGroupWhere . " ORDER BY `" . DB_CHARTS . "`.userid, `" . DB_CHARTS . "`.groupid, `" . DB_CHARTS . "`.DisplayName"; // --- // Get Searches from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows ) && count($myrows) > 0 ) { // Overwrite existing Charts array unset($CFG['Charts']); // Loop through all data rows foreach ($myrows as &$myChart ) { // Append to Chart Array $CFG['Charts'][ $myChart['ID'] ] = $myChart; } // Copy to content array! $content['Charts'] = $CFG['Charts']; } } function LoadViewsFromDatabase() { // Needed to make global global $CFG, $content; // --- Create SQL Query // Create Where for USERID if ( isset($content['SESSION_LOGGEDIN']) && $content['SESSION_LOGGEDIN'] ) $szWhereUser = " OR `" . DB_VIEWS . "`.userid = " . $content['SESSION_USERID'] . " "; else $szWhereUser = ""; if ( isset($content['SESSION_GROUPIDS']) ) $szGroupWhere = " OR `" . DB_VIEWS . "`.groupid IN (" . $content['SESSION_GROUPIDS'] . ")"; else $szGroupWhere = ""; $sqlquery = " SELECT " . DB_VIEWS . ".ID, " . DB_VIEWS . ".DisplayName, " . DB_VIEWS . ".Columns, " . DB_VIEWS . ".userid, " . DB_VIEWS . ".groupid, " . DB_USERS . ".username, " . DB_GROUPS . ".groupname " . " FROM `" . DB_VIEWS . "`" . " LEFT OUTER JOIN (`" . DB_USERS . "`) ON (`" . DB_VIEWS . "`.userid=`" . DB_USERS . "`.ID ) " . " LEFT OUTER JOIN (`" . DB_GROUPS . "`) ON (`" . DB_VIEWS . "`.groupid=`" . DB_GROUPS . "`.ID ) " . " WHERE (`" . DB_VIEWS . "`.userid IS NULL AND `" . DB_VIEWS . "`.groupid IS NULL) " . $szWhereUser . $szGroupWhere . " ORDER BY `" . DB_VIEWS . "`.userid, `" . DB_VIEWS . "`.groupid, `" . DB_VIEWS . "`.DisplayName"; // --- // Get Views from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows) && count($myrows) > 0 ) { // Overwrite existing Views array unset($CFG['Views']); // ReINIT Views Array InitViewConfigs(); // Unpack the Columns and append to Views Array foreach ($myrows as &$myView ) { // Split into array $myView['Columns'] = explode( ",", $myView['Columns'] ); // remove spaces foreach ($myView['Columns'] as &$myCol ) $myCol = trim($myCol); // Append to Views Array $CFG['Views'][ $myView['ID'] ] = $myView; } // Merge into existing Views Array! // $CFG['Views'] = array_merge ( $CFG['Views'], $myrows ); $content['Views'] = $CFG['Views']; } } function LoadSourcesFromDatabase($ForceloadAllSources = false) { // Needed to make global global $CFG, $content; // --- Create SQL Query // Create Where for USERID $szWhereNoUserOrGroups = " WHERE (`" . DB_SOURCES . "`.userid IS NULL AND `" . DB_SOURCES . "`.groupid IS NULL) "; if ( $ForceloadAllSources ) { // Remove any WHERE stuff and show ALL sources $szWhereNoUserOrGroups = ""; $szWhereUser = ""; $szGroupWhere = ""; } else { if ( isset($content['SESSION_LOGGEDIN']) && $content['SESSION_LOGGEDIN'] ) $szWhereUser = " OR `" . DB_SOURCES . "`.userid = " . $content['SESSION_USERID'] . " "; else $szWhereUser = ""; if ( isset($content['SESSION_GROUPIDS']) ) $szGroupWhere = " OR `" . DB_SOURCES . "`.groupid IN (" . $content['SESSION_GROUPIDS'] . ")"; else $szGroupWhere = ""; } // Create SQL Query $sqlquery = " SELECT " . DB_SOURCES . ".*, " . DB_USERS . ".username, " . DB_GROUPS . ".groupname " . " FROM `" . DB_SOURCES . "`" . " LEFT OUTER JOIN (`" . DB_USERS . "`) ON (`" . DB_SOURCES . "`.userid=`" . DB_USERS . "`.ID ) " . " LEFT OUTER JOIN (`" . DB_GROUPS . "`) ON (`" . DB_SOURCES . "`.groupid=`" . DB_GROUPS . "`.ID ) " . $szWhereNoUserOrGroups . $szWhereUser . $szGroupWhere . " ORDER BY `" . DB_SOURCES . "`.userid, `" . DB_SOURCES . "`.groupid, `" . DB_SOURCES . "`.Name"; // --- // Get Sources from DB now! $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows) && count($myrows) > 0 ) { // Overwrite existing Sources array unset($CFG['Sources']); // Append to Source Array foreach ($myrows as &$mySource ) { // Append to Source Array $CFG['Sources'][ $mySource['ID'] ] = $mySource; //['ID']; } // Copy to content array! $content['Sources'] = $CFG['Sources']; } } ?>loganalyzer-4.1.5/src/include/functions_db.php000066400000000000000000000305521277740250400214650ustar00rootroot00000000000000 Needed to establish and maintain the DB connetion * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- $userdbconn = 0; $errdesc = ""; $errno = 0; // --- Current Database Version, this is important for automated database Updates! $content['database_internalversion'] = "10"; // Whenever incremented, a database upgrade is needed $content['database_installedversion'] = "0"; // 0 is default which means Prior Versioning Database // --- function DB_Connect() { global $userdbconn; // Avoid if already OPEN if ($userdbconn) return; $userdbconn = @mysqli_connect( GetConfigSetting("UserDBServer"), GetConfigSetting("UserDBUser"), GetConfigSetting("UserDBPass"), GetConfigSetting("UserDBName"), GetConfigSetting("UserDBPort")); if (!$userdbconn) { // Create Error Msg $szErrorMsg = "Failed to establish a connection to the configured MYSQL Server.
    LogAnalyzer is not able to initialize the user system."; if ( isset($php_errormsg) ) $szErrorMsg .= "

    Extra Error Details:
    " . $php_errormsg; DieWithErrorMsg( $szErrorMsg ); } //TODO: Check variables first // --- Now, check Mysql DB Version! $strmysqlver = mysqli_get_server_info($userdbconn); if ( strpos($strmysqlver, "-") !== false ) { $sttmp = explode("-", $strmysqlver ); $szVerInfo = $sttmp[0]; } else $szVerInfo = $strmysqlver; $szVerSplit = explode(".", $szVerInfo ); //Now check for Major Version if ( $szVerSplit[0] <= 3 ) { //Unfortunatelly MYSQL 3.x is NOT Supported dude! DieWithFriendlyErrorMsg( "You are running an MySQL 3.x Database Server Version. Unfortunately MySQL 3.x is NOT supported by LogAnalyzer due the limited SQL Statement support. If this is a commercial webspace, contact your webhoster in order to upgrade to a higher MySQL Database Version. If this is your own rootserver, consider updating your MySQL Server."); } // --- $db_selected = mysqli_select_db( $userdbconn, GetConfigSetting("UserDBName") ); if(!$db_selected) DB_PrintError("Cannot use database '" .GetConfigSetting("UserDBName") . "'", true); // :D Success connecting to db // TODO Do some more validating on the database } function DB_Disconnect() { global $userdbconn; mysqli_close($userdbconn); } function DB_Query($query_string, $bProcessError = true, $bCritical = false) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- global $userdbconn, $querycount; $query_id = mysqli_query($userdbconn, $query_string); if (!$query_id && $bProcessError) DB_PrintError("Invalid SQL: ".$query_string, $bCritical); // For the Stats ;) $querycount++; return $query_id; } function DB_FreeQuery($query_id) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- if ($query_id !== FALSE && $query_id !== TRUE ) mysqli_free_result($query_id); } function DB_GetRow($query_id) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- $tmp = mysqli_fetch_row($query_id); $results[] = $tmp; return $results[0]; } function DB_GetSingleRow($query_id, $bClose) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- if ($query_id !== FALSE ) { $row = mysqli_fetch_array($query_id, MYSQLI_ASSOC); if ( $bClose ) DB_FreeQuery ($query_id); if ( isset($row) ) // Return array return $row; else return; } } function DB_GetAllRows($query_id, $bClose) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- if ($query_id !== FALSE ) { while ($row = mysqli_fetch_array($query_id, MYSQLI_ASSOC)) $var[] = $row; if ( $bClose ) DB_FreeQuery ($query_id); if ( isset($var) ) { // Return array return $var; } else return; } } function DB_GetMysqlStats() { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- global $userdbconn; $status = explode(' ', mysqli_stat($userdbconn)); return $status; } function DB_ReturnSimpleErrorMsg() { global $userdbconn; // Return Mysql Error return "Mysql Error " . mysqli_errno($userdbconn) . " - Description: " . mysqli_error($userdbconn); } function DB_PrintError($MyErrorMsg, $DieOrNot) { global $content, $n,$HTTP_COOKIE_VARS, $errdesc, $errno, $linesep; global $userdbconn; $errdesc = mysqli_error($userdbconn); $errno = mysqli_errno($userdbconn); // Define global variable so we know an error has occured! if ( !defined('PHPLOGCON_INERROR') ) define('PHPLOGCON_INERROR', true); $errormsg="Database error: $MyErrorMsg $linesep"; $errormsg.="mysql error: $errdesc $linesep"; $errormsg.="mysql error number: $errno $linesep"; $errormsg.="Date: ".date("d.m.Y @ H:i").$linesep; $errormsg.="Script: ".getenv("REQUEST_URI").$linesep; $errormsg.="Referer: ".getenv("HTTP_REFERER").$linesep; if ($DieOrNot == true) DieWithErrorMsg( "$linesep" . $errormsg ); else { OutputDebugMessage("DB_PrintError: $errormsg", DEBUG_ERROR); if ( !isset($content['detailederror']) ) { $content['detailederror_code'] = ERROR_DB_QUERYFAILED; $content['detailederror'] = GetErrorMessage(ERROR_DB_QUERYFAILED); } else $content['detailederror'] .= "

    " . GetErrorMessage(ERROR_DB_QUERYFAILED); // Append SQL Detail Error $content['detailederror'] .= "

    " . $errormsg; } } function DB_RemoveParserSpecialBadChars($myString) { // DO NOT REPLACE! $returnstr = str_replace("\\","\\\\",$myString); $returnstr = str_replace("'","\\'",$myString); return $returnstr; } function DB_RemoveBadChars($myValue, $dbEngine = DB_MYSQL, $bForceStripSlahes = false) { // Check if Array if ( is_array($myValue) ) { // Array value $retArray = array(); foreach( $myValue as $mykey => $myString ) { if ( $dbEngine == DB_MSSQL ) { // MSSQL needs special treatment -.- $retArray[$mykey] = str_replace("'","''",$myString); } else { // Replace with internal PHP Functions! $retArray[$mykey] = addslashes($myString); } } // Return fixed array! return $retArray; } else { // Single value if ( $dbEngine == DB_MSSQL ) { // MSSQL needs special treatment -.- return str_replace("'","''",$myValue); } else { // Replace with internal PHP Functions! return addslashes($myValue); } } } function DB_StripSlahes($myString) { // Replace with internal PHP Functions! // if ( get_magic_quotes_gpc() ) return stripslashes($myString); // else // return $myString; } function DB_ReturnLastInsertID($myResult = false) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- global $userdbconn; return mysqli_insert_id($userdbconn); } function DB_GetRowCount($query) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- global $userdbconn; if ($result = mysqli_query($userdbconn, $query)) { $num_rows = mysqli_num_rows($result); mysqli_free_result ($result); } return $num_rows; } function DB_GetRowCountByResult($myresult) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- if ($myresult) return mysqli_num_rows($myresult); } function DB_Exec($query) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- global $userdbconn; if(mysqli_query($userdbconn, $query)) return true; else return false; } function PrepareValueForDB($szValue, $bForceStripSlahes = false) { // Wrapper for this function return DB_RemoveBadChars($szValue, null, $bForceStripSlahes); } function WriteConfigValue($szPropName, $is_global = true, $userid = false, $groupid = false, $bForceStripSlahes = false) { global $content; // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- if ( $is_global ) { if ( isset($content[$szPropName]) ) { // Copy value for DB and check for BadDB Chars! $szDbValue = PrepareValueForDB( $content[$szPropName], $bForceStripSlahes ); } else { // Set empty in this case $szDbValue = ""; $content[$szPropName] = ""; } // Copy to $CFG array as well $CFG[$szPropName] = $content[$szPropName]; // Check if we need to INSERT or UPDATE $result = DB_Query("SELECT propname FROM `" . DB_CONFIG . "` WHERE propname = '" . $szPropName . "' AND is_global = " . $is_global); $rows = DB_GetAllRows($result, true); if ( !isset($rows) ) { // New Entry if ( strlen($szDbValue) < 255 ) $result = DB_Query("INSERT INTO `" . DB_CONFIG . "` (propname, propvalue, is_global) VALUES ( '" . $szPropName . "', '" . $szDbValue . "', " . $is_global . ")"); else $result = DB_Query("INSERT INTO `" . DB_CONFIG . "` (propname, propvalue_text, is_global) VALUES ( '" . $szPropName . "', '" . $szDbValue . "', " . $is_global . ")"); DB_FreeQuery($result); } else { // Update Entry if ( strlen($szDbValue) < 255 ) $result = DB_Query("UPDATE `" . DB_CONFIG . "` SET propvalue = '" . $szDbValue . "', propvalue_text = '' WHERE propname = '" . $szPropName . "' AND is_global = " . $is_global); else $result = DB_Query("UPDATE `" . DB_CONFIG . "` SET propvalue_text = '" . $szDbValue . "', propvalue = '' WHERE propname = '" . $szPropName . "' AND is_global = " . $is_global); DB_FreeQuery($result); } } else if ( $userid != false ) { global $USERCFG; if ( isset($USERCFG[$szPropName]) ) { // Copy value for DB and check for BadDB Chars! $szDbValue = PrepareValueForDB( $USERCFG[$szPropName], $bForceStripSlahes ); } else { // Set empty in this case $szDbValue = ""; $USERCFG[$szPropName] = ""; } // Check if we need to INSERT or UPDATE $result = DB_Query("SELECT propname FROM `" . DB_CONFIG . "` WHERE propname = '" . $szPropName . "' AND userid = " . $userid); $rows = DB_GetAllRows($result, true); if ( !isset($rows) ) { // New Entry $result = DB_Query("INSERT INTO `" . DB_CONFIG . "` (propname, propvalue, userid) VALUES ( '" . $szPropName . "', '" . $szDbValue . "', " . $userid . ")"); DB_FreeQuery($result); } else { // Update Entry $result = DB_Query("UPDATE `" . DB_CONFIG . "` SET propvalue = '" . $szDbValue . "' WHERE propname = '" . $szPropName . "' AND userid = " . $userid); DB_FreeQuery($result); } } else if ( $groupid != false ) DieWithFriendlyErrorMsg( "Critical Error occured in WriteConfigValue, writing GROUP specific properties is not supported yet!" ); } function GetSingleDBEntryOnly( $myqry ) { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- $result = DB_Query( $myqry ); $row = DB_GetRow($result); DB_FreeQuery ($query_id); if ( isset($row) ) return $row[0]; else return -1; } function GetRowsAffected() { // --- Abort in this case! if ( GetConfigSetting("UserDBEnabled", false) == false ) return; // --- global $userdbconn; return mysqli_affected_rows($userdbconn); } ?>loganalyzer-4.1.5/src/include/functions_debugoutput.php000066400000000000000000000133131277740250400234430ustar00rootroot00000000000000 * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- function CreateHTMLHeader() { global $RUNMODE, $content, $gl_root_path; // not needed in console mode if ( $RUNMODE == RUNMODE_COMMANDLINE ) return; global $currentclass, $currentmenuclass; $currentclass = "line0"; $currentmenuclass = "cellmenu1"; print ('
    '); } function PrintDebugInfoHeader() { global $RUNMODE; global $currentmenuclass; if ( $RUNMODE == RUNMODE_COMMANDLINE ) print ( "Num.\tFacility . \tDebug Message\n" ); else if ( $RUNMODE == RUNMODE_WEBSERVER ) { print('
    Number DebugLevel Facility DebugMessage
    '); } } function PrintHTMLDebugInfo( $facility, $fromwhere, $szDbgInfo ) { global $content, $currentclass, $currentmenuclass, $gldbgcounter, $DEBUGMODE, $RUNMODE; // No output in this case if ( $facility > $DEBUGMODE ) return; if ( !isset($gldbgcounter) ) $gldbgcounter = 0; $gldbgcounter++; if ( $RUNMODE == RUNMODE_COMMANDLINE ) print ( $gldbgcounter . ". \t" . GetFacilityAsString($facility) . ". \t" . $fromwhere . ". \t" . $szDbgInfo . "\n" ); else if ( $RUNMODE == RUNMODE_WEBSERVER ) { print ('
    ' . $gldbgcounter . ' ' . GetFacilityAsString($facility) . ' ' . $fromwhere . '   ' . $szDbgInfo . '
    '); // Set StyleSheetclasses if ( $currentclass == "line0" ) $currentclass = "line1"; else $currentclass = "line0"; if ( $currentmenuclass == "cellmenu1" ) $currentmenuclass = "cellmenu2"; else $currentmenuclass = "cellmenu1"; } //Flush output FlushHtmlOutput(); } function GetFacilityAsString( $facility ) { switch ( $facility ) { case DEBUG_ULTRADEBUG: return STR_DEBUG_ULTRADEBUG; case DEBUG_DEBUG: return STR_DEBUG_DEBUG; case DEBUG_INFO: return STR_DEBUG_INFO; case DEBUG_WARN: return STR_DEBUG_WARN; case DEBUG_ERROR: return STR_DEBUG_ERROR; case DEBUG_ERROR_WTF: return STR_DEBUG_ERROR_WTF; } // reach here = unknown return "*Unknown*"; } function GetDebugClassFacilityAsString( $facility ) { switch ( $facility ) { case DEBUG_ULTRADEBUG: return "debugultradebug"; case DEBUG_DEBUG: return "debugdebug"; case DEBUG_INFO: return "debuginfo"; case DEBUG_WARN: return "debugwarn"; case DEBUG_ERROR: return "debugerror"; case DEBUG_ERROR_WTF: return "debugerrorwtf"; } // reach here = unknown return "*Unknown*"; } function CreateHTMLFooter() { global $content, $ParserStart, $RUNMODE; $RenderTime = number_format( microtime_float() - $ParserStart, 4, '.', ''); // not needed in console mode if ( $RUNMODE == RUNMODE_COMMANDLINE ) return; print ('

    Finished

    Total running time was ' . $RenderTime . ' seconds


    '); } ?>loganalyzer-4.1.5/src/include/functions_filters.php000066400000000000000000000344141277740250400225510ustar00rootroot00000000000000. * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Perform necessary includes require_once($gl_root_path . 'include/constants_filters.php'); // --- function InitFilterHelpers() { global $content, $filters; // Init Default DateMode from SESSION! if ( isset($_SESSION['filter_datemode']) ) $filters['filter_datemode'] = intval($_SESSION['filter_datemode']); else $filters['filter_datemode'] = DATEMODE_ALL; // Init TimeFilter Helper Array $content['datemodes'][0]['ID'] = DATEMODE_ALL; $content['datemodes'][0]['DisplayName'] = $content['LN_DATEMODE_ALL']; if ( $filters['filter_datemode'] == DATEMODE_ALL ) { $content['datemodes'][0]['selected'] = "selected"; } else { $content['datemodes'][0]['selected'] = ""; } $content['datemodes'][1]['ID'] = DATEMODE_RANGE; $content['datemodes'][1]['DisplayName'] = $content['LN_DATEMODE_RANGE']; if ( $filters['filter_datemode'] == DATEMODE_RANGE ) { $content['datemodes'][1]['selected'] = "selected"; } else { $content['datemodes'][1]['selected'] = ""; } $content['datemodes'][2]['ID'] = DATEMODE_LASTX; $content['datemodes'][2]['DisplayName'] = $content['LN_DATEMODE_LASTX']; if ( $filters['filter_datemode'] == DATEMODE_LASTX ) { $content['datemodes'][2]['selected'] = "selected"; } else { $content['datemodes'][2]['selected'] = ""; } // Init Date Range Parameters global $currentTime, $currentDay, $currentMonth, $currentYear, $tomorrowTime, $tomorrowDay, $tomorrowMonth, $tomorrowYear; $currentTime = time(); $currentDay = date("d", $currentTime); $currentMonth = date("m", $currentTime); $currentYear = date("Y", $currentTime); $tomorrowTime = time(); // + 86400; // Add one day! $tomorrowDay = date("d", $tomorrowTime); $tomorrowMonth = date("m", $tomorrowTime); $tomorrowYear = date("Y", $tomorrowTime); // Init Year, month and day array! for ( $i = $currentYear-5; $i <= $currentYear+5; $i++ ) $content['years'][] = $i; for ( $i = 1; $i <= 12; $i++ ) $content['months'][] = $i; for ( $i = 1; $i <= 31; $i++ ) $content['days'][] = $i; // Init Hour, minute and second array for ( $i = 0; $i <= 23; $i++ ) { if ($i < 10) $content['hours'][] = '0' . $i; else $content['hours'][] = $i; } for ( $i = 0; $i <= 59; $i++ ) { if ($i < 10) $content['minutes'][] = '0' . $i; else $content['minutes'][] = $i; } for ( $i = 0; $i <= 59; $i++ ) { if ($i < 10) $content['seconds'][] = '0' . $i; else $content['seconds'][] = $i; } // Init filter_daterange_from_year if ( isset($_SESSION['filter_daterange_from_year']) ) $filters['filter_daterange_from_year'] = intval($_SESSION['filter_daterange_from_year']); else $filters['filter_daterange_from_year'] = $currentYear-1; FillDateRangeArray($content['years'], "filter_daterange_from_year_list", "filter_daterange_from_year"); // Init filter_daterange_from_month if ( isset($_SESSION['filter_daterange_from_month']) ) $filters['filter_daterange_from_month'] = intval($_SESSION['filter_daterange_from_month']); else $filters['filter_daterange_from_month'] = $currentMonth; FillDateRangeArray($content['months'], "filter_daterange_from_month_list", "filter_daterange_from_month"); // Init filter_daterange_from_day if ( isset($_SESSION['filter_daterange_from_day']) ) $filters['filter_daterange_from_day'] = intval($_SESSION['filter_daterange_from_day']); else $filters['filter_daterange_from_day'] = $currentDay; FillDateRangeArray($content['days'], "filter_daterange_from_day_list", "filter_daterange_from_day"); // Init filter_daterange_to_year if ( isset($_SESSION['filter_daterange_to_year']) ) $filters['filter_daterange_to_year'] = intval($_SESSION['filter_daterange_to_year']); else $filters['filter_daterange_to_year'] = $tomorrowYear; FillDateRangeArray($content['years'], "filter_daterange_to_year_list", "filter_daterange_to_year"); // Init filter_daterange_to_month if ( isset($_SESSION['filter_daterange_to_month']) ) $filters['filter_daterange_to_month'] = intval($_SESSION['filter_daterange_to_month']); else $filters['filter_daterange_to_month'] = $tomorrowMonth; FillDateRangeArray($content['months'], "filter_daterange_to_month_list", "filter_daterange_to_month"); // Init filter_daterange_to_day if ( isset($_SESSION['filter_daterange_to_day']) ) $filters['filter_daterange_to_day'] = intval($_SESSION['filter_daterange_to_day']); else $filters['filter_daterange_to_day'] = $tomorrowDay; FillDateRangeArray($content['days'], "filter_daterange_to_day_list", "filter_daterange_to_day"); // Init filter_daterange_from_hour if ( isset($_SESSION['filter_daterange_from_hour']) ) $filters['filter_daterange_from_hour'] = intval($_SESSION['filter_daterange_from_hour']); else $filters['filter_daterange_from_hour'] = 0; FillDateRangeArray($content['hours'], "filter_daterange_from_hour_list", "filter_daterange_from_hour"); // Init filter_daterange_from_minute if ( isset($_SESSION['filter_daterange_from_minute']) ) $filters['filter_daterange_from_minute'] = intval($_SESSION['filter_daterange_from_minute']); else $filters['filter_daterange_from_minute'] = 0; FillDateRangeArray($content['minutes'], "filter_daterange_from_minute_list", "filter_daterange_from_minute"); // Init filter_daterange_from_second if ( isset($_SESSION['filter_daterange_from_second']) ) $filters['filter_daterange_from_second'] = intval($_SESSION['filter_daterange_from_second']); else $filters['filter_daterange_from_second'] = 0; FillDateRangeArray($content['seconds'], "filter_daterange_from_second_list", "filter_daterange_from_second"); // Init filter_daterange_to_hour if ( isset($_SESSION['filter_daterange_to_hour']) ) $filters['filter_daterange_to_hour'] = intval($_SESSION['filter_daterange_to_hour']); else $filters['filter_daterange_to_hour'] = 23; FillDateRangeArray($content['hours'], "filter_daterange_to_hour_list", "filter_daterange_to_hour"); // Init filter_daterange_to_minute if ( isset($_SESSION['filter_daterange_to_minute']) ) $filters['filter_daterange_to_minute'] = intval($_SESSION['filter_daterange_to_minute']); else $filters['filter_daterange_to_minute'] = 59; FillDateRangeArray($content['minutes'], "filter_daterange_to_minute_list", "filter_daterange_to_minute"); // Init filter_daterange_to_second if ( isset($_SESSION['filter_daterange_to_second']) ) $filters['filter_daterange_to_second'] = intval($_SESSION['filter_daterange_to_second']); else $filters['filter_daterange_to_second'] = 59; FillDateRangeArray($content['seconds'], "filter_daterange_to_second_list", "filter_daterange_to_second"); // --- Define LASTX Array // Init Default DateMode from SESSION! if ( isset($_SESSION['filter_lastx_default']) ) $filters['filter_lastx_default'] = intval($_SESSION['filter_lastx_default']); else $filters['filter_lastx_default'] = DATE_LASTX_24HOURS; $content['filter_daterange_last_x_list'][0]['ID'] = DATE_LASTX_HOUR; $content['filter_daterange_last_x_list'][0]['DisplayName'] = $content['LN_DATE_LASTX_HOUR']; if ( $filters['filter_lastx_default'] == DATE_LASTX_HOUR ) { $content['filter_daterange_last_x_list'][0]['selected'] = "selected"; } else { $content['filter_daterange_last_x_list'][0]['selected'] = ""; } $content['filter_daterange_last_x_list'][1]['ID'] = DATE_LASTX_12HOURS; $content['filter_daterange_last_x_list'][1]['DisplayName'] = $content['LN_DATE_LASTX_12HOURS']; if ( $filters['filter_lastx_default'] == DATE_LASTX_12HOURS ) { $content['filter_daterange_last_x_list'][1]['selected'] = "selected"; } else { $content['filter_daterange_last_x_list'][1]['selected'] = ""; } $content['filter_daterange_last_x_list'][2]['ID'] = DATE_LASTX_24HOURS; $content['filter_daterange_last_x_list'][2]['DisplayName'] = $content['LN_DATE_LASTX_24HOURS']; if ( $filters['filter_lastx_default'] == DATE_LASTX_24HOURS ) { $content['filter_daterange_last_x_list'][2]['selected'] = "selected"; } else { $content['filter_daterange_last_x_list'][2]['selected'] = ""; } $content['filter_daterange_last_x_list'][3]['ID'] = DATE_LASTX_7DAYS; $content['filter_daterange_last_x_list'][3]['DisplayName'] = $content['LN_DATE_LASTX_7DAYS']; if ( $filters['filter_lastx_default'] == DATE_LASTX_7DAYS ) { $content['filter_daterange_last_x_list'][3]['selected'] = "selected"; } else { $content['filter_daterange_last_x_list'][3]['selected'] = ""; } $content['filter_daterange_last_x_list'][4]['ID'] = DATE_LASTX_31DAYS; $content['filter_daterange_last_x_list'][4]['DisplayName'] = $content['LN_DATE_LASTX_31DAYS']; if ( $filters['filter_lastx_default'] == DATE_LASTX_31DAYS ) { $content['filter_daterange_last_x_list'][4]['selected'] = "selected"; } else { $content['filter_daterange_last_x_list'][4]['selected'] = ""; } // --- // --- Init Default Syslog Facility from SESSION! if ( isset($_SESSION['filter_facility']) ) $filters['filter_facility'] = intval($_SESSION['filter_facility']); else $filters['filter_facility'] = array ( SYSLOG_KERN, SYSLOG_USER, SYSLOG_MAIL, SYSLOG_DAEMON, SYSLOG_AUTH, SYSLOG_SYSLOG, SYSLOG_LPR, SYSLOG_NEWS, SYSLOG_UUCP, SYSLOG_CRON, SYSLOG_SECURITY, SYSLOG_FTP, SYSLOG_NTP, SYSLOG_LOGAUDIT, SYSLOG_LOGALERT, SYSLOG_CLOCK, SYSLOG_LOCAL0, SYSLOG_LOCAL1, SYSLOG_LOCAL2, SYSLOG_LOCAL3, SYSLOG_LOCAL4, SYSLOG_LOCAL5, SYSLOG_LOCAL6, SYSLOG_LOCAL7 ); $iCount = count($content['filter_facility_list']); for ( $i = 0; $i < $iCount; $i++ ) { if ( in_array($content['filter_facility_list'][$i]["ID"], $filters['filter_facility']) ) $content['filter_facility_list'][$i]["selected"] = "selected"; } // --- // --- Init Default Syslog Severity from SESSION! if ( isset($_SESSION['filter_severity']) ) $filters['filter_severity'] = intval($_SESSION['filter_severity']); else $filters['filter_severity'] = array ( SYSLOG_EMERG, SYSLOG_ALERT, SYSLOG_CRIT, SYSLOG_ERR, SYSLOG_WARNING, SYSLOG_NOTICE, SYSLOG_INFO, SYSLOG_DEBUG ); $iCount = count($content['filter_severity_list']); for ( $i = 0; $i < $iCount; $i++ ) { if ( in_array( $content['filter_severity_list'][$i]["ID"], $filters['filter_severity']) ) $content['filter_severity_list'][$i]["selected"] = "selected"; } // --- // --- Init Default Message Type from SESSION! if ( isset($_SESSION['filter_messagetype']) ) $filters['filter_messagetype'] = intval($_SESSION['filter_messagetype']); else $filters['filter_messagetype'] = array ( IUT_Syslog, IUT_NT_EventReport, IUT_File_Monitor, IUT_WEBSERVERLOG ); $iCount = count($content['filter_messagetype_list']); for ( $i = 0; $i < $iCount; $i++ ) { if ( in_array( $content['filter_messagetype_list'][$i]["ID"], $filters['filter_messagetype']) ) $content['filter_messagetype_list'][$i]["selected"] = "selected"; } // --- } function FillDateRangeArray($sourcearray, $szArrayListName, $szFilterName) // $content['years'], "filter_daterange_from_year_list", "filter_daterange_from_year") { global $content, $filters; $iCount = count($sourcearray); for ( $i = 0; $i < $iCount; $i++) { $content[$szArrayListName][$i]['value'] = $sourcearray[$i]; if ( $filters[$szFilterName] == $sourcearray[$i] ) $content[$szArrayListName][$i]['selected'] = "selected"; else $content[$szArrayListName][$i]['selected'] = ""; } } function GetFacilityDisplayName( $nFacilityID ) { global $content; foreach( $content['filter_facility_list'] as $myfacility ) { if ( $myfacility['ID'] == $nFacilityID ) return $myfacility['DisplayName']; } // Default return "Unknown Facility($nFacilityID)"; } function GetSeverityDisplayName( $nSeverityID ) { global $content; foreach( $content['filter_severity_list'] as $myseverity ) { if ( $myseverity['ID'] == $nSeverityID ) return $myseverity['DisplayName']; } // Default return "Unknown Severity($nSeverityID)"; } function GetMessageTypeDisplayName( $nMsgTypeID ) { global $content; foreach( $content['filter_messagetype_list'] as $mymsgtype ) { if ( $mymsgtype['ID'] == $nMsgTypeID ) return $mymsgtype['DisplayName']; } // Default return "Unknown MessageType($nMsgTypeID)"; } function GetTimeStampFromTimeString($szTimeString) { //Sample: 2008-4-1T00:00:00 if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$/", $szTimeString, $out) ) { // return new timestamp return mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); } //Sample: 2008-04-01 else if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})$/", $szTimeString, $out) ) { // return new timestamp return mktime(0,0,0, $out[2], $out[3], $out[1]); } else { OutputDebugMessage("Unparseable Time in GetTimeStampFromTimeString - '" . $szTimeString . "'", DEBUG_WARN); return $szTimeString; } } function GetDateTimeDetailsFromTimeString($szTimeString, &$second, &$minute, &$hour, &$day, &$month, &$year) { //Sample: 2008-4-1T00:00:00 if ( preg_match("/([0-9]{4,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$/", $szTimeString, $out) ) { // Assign parameters $second = $out[6]; $minute = $out[5]; $hour = $out[4]; $day = $out[3]; $month = $out[2]; $year = $out[1]; // Success! return true; } else // Failed return false; } ?>loganalyzer-4.1.5/src/include/functions_frontendhelpers.php000066400000000000000000000213121277740250400242740ustar00rootroot00000000000000 * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- function InitFrontEndDefaults() { global $content; // To create the current URL CreateCurrentUrl(); // --- BEGIN Main Info Area $content['MAXURL'] = $content['BASEPATH'] . "userchange.php?"; if ( isset($_SESSION['SESSION_MAXIMIZED']) && $_SESSION['SESSION_MAXIMIZED'] == true ) { $content['MAXIMIZED'] = true; $content['MAXIMAGE'] = $content['MENU_NORMAL']; $content['MAXLANGTEXT'] = $content['LN_MENU_NORMALVIEW']; $content['MAXURL'] .= "op=maximize&max=0"; } else { $content['MAXIMIZED'] = false; $content['MAXIMAGE'] = $content['MENU_MAXIMIZE']; $content['MAXLANGTEXT'] = $content['LN_MENU_MAXVIEW']; $content['MAXURL'] .= "op=maximize&max=1"; } // --- END Main Info Area // Check if install file still exists // NOT NEEDED ANYMORE InstallFileReminder(); } function InstallFileReminder() { global $content; if ( is_file($content['BASEPATH'] . "install.php") ) { // No Servers - display warning! $content['error_installfilereminder'] = "true"; } } function GetAdditionalUrl($skipParam, $appendParam = "") { global $content; //echo $content['additional_url_full']; if ( isset($content['additional_url_full']) && strlen($content['additional_url_full']) > 0 ) { if ( strlen($skipParam) > 0 ) { // remove parameters from string! $szReturn = preg_replace("#(&{$skipParam}=[\w]+)#is", '', $content['additional_url_full']); if ( strlen($szReturn) > 0 ) { if ( strlen($appendParam) > 0 ) return $szReturn . "&" . $appendParam; else return $szReturn; } else if ( strlen($appendParam) > 0 ) return "?" . $appendParam; else return ""; } else return $content['additional_url_full']; } else { if ( strlen($appendParam) > 0 ) return "?" . $appendParam; else return ""; } } function CreateCurrentUrl() { global $content; $content['CURRENTURL'] = $_SERVER['PHP_SELF']; // . "?" . $_SERVER['QUERY_STRING'] // Init additional_url helper variable $content['additional_url'] = ""; $content['additional_url_full'] = ""; $content['additional_url_uidonly'] = ""; $content['additional_url_sortingonly'] = ""; $content['additional_url_sourceonly'] = ""; // Hidden Vars Counter $hvCounter = 0; // Append SourceID into everything! $tmpDefSourceID = GetConfigSetting("DefaultSourceID", "", CFGLEVEL_USER); if ( isset($content['Sources'][ $tmpDefSourceID ]) && isset($_SESSION['currentSourceID']) ) { // If the DefaultSourceID differes from the SourceID in our Session, we will append the sourceid within all URL's! if ( $tmpDefSourceID != $_SESSION['currentSourceID'] ) { // $content['additional_url'] .= "&sourceid=" . $_SESSION['currentSourceID']; $content['additional_url_uidonly'] = "&sourceid=" . $_SESSION['currentSourceID']; $content['additional_url_sortingonly'] = "&sourceid=" . $_SESSION['currentSourceID']; $content['additional_url_sourceonly'] = "&sourceid=" . $_SESSION['currentSourceID']; // For forms! $content['HIDDENVARS_SOURCE'][$hvCounter]['varname'] = "sourceid"; $content['HIDDENVARS_SOURCE'][$hvCounter]['varvalue'] = $_SESSION['currentSourceID']; $hvCounter++; } } // Now the query string: if ( isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) { // Append ? $content['CURRENTURL'] .= "?"; $queries = explode ("&", $_SERVER['QUERY_STRING']); for ( $i = 0; $i < count($queries); $i++ ) { // Some properties need to be filtered out. if ( strpos($queries[$i], "direction") === false && strpos($queries[$i], "skipone") === false ) { // --- Using regex to split query properly // Thanks to TK - 2016-01-20 preg_match('/^([^=]*)=(.*)$/', $queries[$i], $m); if ( isset($m[1]) && isset($m[2]) ) $tmpvars = array($m[1], $m[2]); // OLD Code $tmpvars = explode ("=", $queries[$i]); // --- if ( isset($tmpvars[1]) ) // Only if value param is set! { // For forms! $content['HIDDENVARS'][$hvCounter]['varname'] = $tmpvars[0]; $content['HIDDENVARS'][$hvCounter]['varvalue'] = $tmpvars[1]; if ( strlen($tmpvars[1]) > 0 ) { // Append For URL's if ( $tmpvars[0] == "uid" ) { // only add once if ( strlen($content['additional_url_uidonly']) <= 0 ) $content['additional_url_uidonly'] .= "&" . $tmpvars[0] . "=" . $tmpvars[1]; } else if ( $tmpvars[0] == "sorting" ) { // only add once if ( strlen($content['additional_url_sortingonly']) <= 0 ) $content['additional_url_sortingonly'] .= "&" . $tmpvars[0] . "=" . $tmpvars[1]; } else if ( $tmpvars[0] == "sourceid" ) { // Skip this entry continue; } else $content['additional_url'] .= "&" . $tmpvars[0] . "=" . $tmpvars[1]; // always append to this URL! $content['additional_url_full'] .= "&" . $tmpvars[0] . "=" . $tmpvars[1]; } $hvCounter++; } } } } // done } function GetFormatedDate($evttimearray) { global $content; if ( is_array($evttimearray) ) { if ( GetConfigSetting("ViewUseTodayYesterday", 0, CFGLEVEL_USER) == 1 && ( date('m', $evttimearray[EVTIME_TIMESTAMP]) == date('m') && date('Y', $evttimearray[EVTIME_TIMESTAMP]) == date('Y') ) ) { if ( date('d', $evttimearray[EVTIME_TIMESTAMP]) == date('d') ) return "Today " . date("H:i:s", $evttimearray[EVTIME_TIMESTAMP] ); else if ( date('d', $evttimearray[EVTIME_TIMESTAMP] + 86400) == date('d') ) return "Yesterday " . date("H:i:s", $evttimearray[EVTIME_TIMESTAMP] ); } // Copy to local variable $nMyTimeStamp = $evttimearray[EVTIME_TIMESTAMP]; } else { $nMyTimeStamp = strtotime($evttimearray); if ( $nMyTimeStamp === FALSE ) // Could not convert into timestamp so return original! return $evttimearray; } // Reach return normal format! return $szDateFormatted = date("Y-m-d H:i:s", $nMyTimeStamp ); } function GetDebugBgColor( $szDebugMode ) { global $severity_colors; switch ( $szDebugMode ) { case DEBUG_ULTRADEBUG: $szReturn = $severity_colors[SYSLOG_DEBUG]; break; case DEBUG_DEBUG: $szReturn = $severity_colors[SYSLOG_INFO]; break; case DEBUG_INFO: $szReturn = $severity_colors[SYSLOG_NOTICE]; break; case DEBUG_WARN: $szReturn = $severity_colors[SYSLOG_WARNING]; break; case DEBUG_ERROR: $szReturn = $severity_colors[SYSLOG_ERR]; break; default: $szReturn = $severity_colors[SYSLOG_NOTICE]; } // Return string result return $szReturn; } function GetDebugModeString( $szDebugMode ) { switch ( $szDebugMode ) { case DEBUG_ULTRADEBUG: $szReturn = STR_DEBUG_ULTRADEBUG; break; case DEBUG_DEBUG: $szReturn = STR_DEBUG_DEBUG; break; case DEBUG_INFO: $szReturn = STR_DEBUG_INFO; break; case DEBUG_WARN: $szReturn = STR_DEBUG_WARN; break; case DEBUG_ERROR: $szReturn = STR_DEBUG_ERROR; break; default: $szReturn = STR_DEBUG_INFO; } // Return string result return $szReturn; } function GetPriorityFromDebugLevel( $DebugLevel ) { switch ( $DebugLevel ) { case DEBUG_ULTRADEBUG: return LOG_DEBUG; case DEBUG_DEBUG: return LOG_INFO; case DEBUG_INFO: return LOG_NOTICE; case DEBUG_WARN: return LOG_WARNING; case DEBUG_ERROR: return LOG_ERR; case DEBUG_ERROR_WTF: return LOG_CRIT; } } ?>loganalyzer-4.1.5/src/include/functions_installhelpers.php000066400000000000000000000204771277740250400241360ustar00rootroot00000000000000 Functions in this file are only used by the installer * and converter script. * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- BEGIN Installer Helper Functions --- function ImportDataFile($szFileName) { global $content, $totaldbdefs; // Lets read the table definitions :) $handle = @fopen($szFileName, "r"); if ($handle === false) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr($content['LN_INSTALL_ERRORREADINGDBFILE'], $szFileName) ); else { while (!feof($handle)) { $buffer = fgets($handle, 4096); $pos = strpos($buffer, "--"); if ($pos === false) $totaldbdefs .= $buffer; else if ( $pos > 2 && strlen( trim($buffer) ) > 1 ) $totaldbdefs .= $buffer; } fclose($handle); } } function RevertOneStep($stepback, $errormsg) { header("Location: " . STEPSCRIPTNAME . "?step=" . $stepback . "&errormsg=" . urlencode($errormsg) ); exit; } function ForwardOneStep() { global $content; header("Location: " . STEPSCRIPTNAME . "?step=" . ($content['INSTALL_STEP']+1) ); exit; } function ConvertGeneralSettings() { global $content; // Only call the same function as in admin index! SaveGeneralSettingsIntoDB(true); } /* * Convert Custom searches into DB */ function ConvertCustomSearches() { global $CFG, $content; // Insert all searches into the DB! foreach($CFG['Search'] as $searchid => &$mySearch) { // New Entry $result = DB_Query("INSERT INTO `" . DB_SEARCHES . "` (DisplayName, SearchQuery) VALUES ( '" . PrepareValueForDB($mySearch['DisplayName']) . "', '" . PrepareValueForDB($mySearch['SearchQuery']) . "')"); $mySearch['DBID'] = DB_ReturnLastInsertID($result); DB_FreeQuery($result); } } /* * Convert Custom Charts into DB */ function ConvertCustomCharts() { global $CFG, $content; // Insert all searches into the DB! foreach($CFG['Charts'] as $chartid => &$myChart) { // New Entry $result = DB_Query("INSERT INTO `" . DB_CHARTS . "` (DisplayName, chart_enabled, chart_type, chart_width, chart_field, maxrecords, showpercent) VALUES ( '" . PrepareValueForDB($myChart['DisplayName']) . "', " . intval($myChart['chart_enabled']) . ", " . intval($myChart['chart_type']) . ", " . intval($myChart['chart_width']) . ", '" . PrepareValueForDB($myChart['chart_field']) . "', " . intval($myChart['maxrecords']) . ", " . intval($myChart['showpercent']) . " )"); $myChart['DBID'] = DB_ReturnLastInsertID($result); DB_FreeQuery($result); } } /* * Convert Custom Views into DB */ function ConvertCustomViews() { global $CFG, $content; // Insert all searches into the DB! foreach($CFG['Views'] as $viewid => &$myView) { if ( is_numeric($viewid) || $viewid == "LEGACY" ) { // Create Columns String foreach ($myView['Columns'] as $myCol ) { if ( isset($myView['ColumnsAsString']) ) $myView['ColumnsAsString'] .= ", " . $myCol; else $myView['ColumnsAsString'] = $myCol; } // New Entry $result = DB_Query("INSERT INTO `" . DB_VIEWS . "` (DisplayName, Columns) VALUES ( '" . PrepareValueForDB($myView['DisplayName']) . "', '" . PrepareValueForDB($myView['ColumnsAsString']) . "')"); $myView['DBID'] = DB_ReturnLastInsertID($result); DB_FreeQuery($result); } } // --- Check and set DefaultViewID! if ( (isset($content['DefaultViewsID']) && strlen($content['DefaultViewsID']) > 0) && (isset($CFG['Views'][$content['DefaultViewsID']]['DBID'])) ) { // Copy the new DefaultViewID back! $content['DefaultViewsID'] = $CFG['Views'][$content['DefaultViewsID']]['DBID']; $CFG['DefaultViewsID'] = $content['DefaultViewsID']; } // --- } function ConvertCustomSources() { global $CFG, $content; // Insert all searches into the DB! foreach($CFG['Sources'] as $sourceid => &$mySource) { // Correct VIEWID! if ( isset($mySource['ViewID']) ) { if ( isset($CFG['Views'][$mySource['ViewID']]['DBID']) ) $mySource['ViewID'] = $CFG['Views'][$mySource['ViewID']]['DBID']; } else $mySource['ViewID'] = ""; // Set empty default // Add New Entry if ( $mySource['SourceType'] == SOURCE_DISK ) { $result = DB_Query("INSERT INTO `" . DB_SOURCES . "` (Name, Description, SourceType, MsgParserList, MsgNormalize, ViewID, LogLineType, DiskFile) VALUES ( " . "'" . PrepareValueForDB($mySource['Name']) . "', " . "'" . PrepareValueForDB($mySource['Description']) . "', " . " " . PrepareValueForDB($mySource['SourceType']) . " , " . "'" . PrepareValueForDB($mySource['MsgParserList']) . "', " . " " . PrepareValueForDB($mySource['MsgNormalize']) . " , " . "'" . PrepareValueForDB($mySource['ViewID']) . "', " . "'" . PrepareValueForDB($mySource['LogLineType']) . "', " . "'" . PrepareValueForDB($mySource['DiskFile']) . "'" . ")"); } else if ( $mySource['SourceType'] == SOURCE_DB || $mySource['SourceType'] == SOURCE_PDO ) { // Set Default for number fields if ( !isset($mySource['DBEnableRowCounting']) ) $mySource['DBEnableRowCounting'] = 0; else // Force to number $mySource['DBEnableRowCounting'] = intval($mySource['DBEnableRowCounting']); if ( !isset($mySource['DBType']) ) $mySource['DBType'] = DB_MYSQL; // Perform the insert $result = DB_Query("INSERT INTO `" . DB_SOURCES . "` (Name, Description, SourceType, MsgParserList, MsgNormalize, ViewID, DBTableType, DBType, DBServer, DBName, DBUser, DBPassword, DBTableName, DBEnableRowCounting) VALUES ( " . "'" . PrepareValueForDB($mySource['Name']) . "', " . "'" . PrepareValueForDB($mySource['Description']) . "', " . " " . PrepareValueForDB($mySource['SourceType']) . " , " . "'" . PrepareValueForDB($mySource['MsgParserList']) . "', " . " " . PrepareValueForDB($mySource['MsgNormalize']) . " , " . "'" . PrepareValueForDB($mySource['ViewID']) . "', " . "'" . PrepareValueForDB($mySource['DBTableType']) . "', " . " " . PrepareValueForDB($mySource['DBType']) . " , " . "'" . PrepareValueForDB($mySource['DBServer']) . "', " . "'" . PrepareValueForDB($mySource['DBName']) . "', " . "'" . PrepareValueForDB($mySource['DBUser']) . "', " . "'" . PrepareValueForDB($mySource['DBPassword']) . "', " . "'" . PrepareValueForDB($mySource['DBTableName']) . "', " . " " . PrepareValueForDB($mySource['DBEnableRowCounting']) . " " . ")"); } else DieWithFriendlyErrorMsg( GetAndReplaceLangStr($content['LN_CONVERT_ERROR_SOURCEIMPORT'], $mySource['SourceType']) ); // Copy DBID! $mySource['DBID'] = DB_ReturnLastInsertID($result); DB_FreeQuery($result); } // --- Check and set DefaultSourceID! if ( (isset($content['DefaultSourceID']) && strlen($content['DefaultSourceID']) > 0) && (isset($CFG['Sources'][$content['DefaultSourceID']]['DBID'])) ) { // Copy the new DefaultSourceID back! $content['DefaultSourceID'] = $CFG['Sources'][$content['DefaultSourceID']]['DBID']; $CFG['DefaultSourceID'] = $content['DefaultSourceID']; } // --- } // --- ?>loganalyzer-4.1.5/src/include/functions_reports.php000066400000000000000000000205141277740250400225730ustar00rootroot00000000000000 * * * * All directives are explained within this file * * * Copyright (C) 2008-2011 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- // --- BEGIN Helper functions // --- function CreateCronCommand( $myReportID, $mySavedReportID = null ) { global $content, $gl_root_path, $myReport; if ( isset($mySavedReportID) ) { // Get Reference to report! $myReport = $content['REPORTS'][ $myReportID ]; // Get reference to savedreport $mySavedReport = $myReport['SAVEDREPORTS'][ $mySavedReportID ]; // Get configured Source for savedreport $myReportSource = null; if ( isset($content['Sources'][ $mySavedReport['sourceid'] ]) ) $myReportSource = $content['Sources'][ $mySavedReport['sourceid'] ]; $pos = strpos( strtoupper(PHP_OS), "WIN"); if ($pos !== false) { // Running on Windows $phpCmd = PHP_BINDIR . "\\php.exe"; $phpScript = realpath($gl_root_path) . "\\cron\\cmdreportgen.php"; } else { // Running on LINUX $phpCmd = PHP_BINDIR . "/php"; $phpScript = realpath($gl_root_path) . "/cron/cmdreportgen.php"; } // Enable display of report command $content['enableCronCommand'] = true; $szCommand = $phpCmd . " " . $phpScript . " runreport " . $myReportID . " " . $mySavedReportID; // --- Check for user or group sources if ( $myReportSource['userid'] != null ) { $szCommand .= " " . "userid=" . $myReportSource['userid']; } else if ( $myReportSource['groupid'] != null ) { $szCommand .= " " . "groupid=" . $myReportSource['groupid']; } // --- } else { // Disable display of report command $content['enableCronCommand'] = false; $szCommand = ""; } // return result return $szCommand; } function InitOnlineReports() { global $content; $xmlArray = xml2array( URL_ONLINEREPORTS ); if ( is_array($xmlArray) && isset($xmlArray['reports']['report']) && count($xmlArray['reports']['report']) > 0 ) { foreach( $xmlArray['reports']['report'] as $myOnlineReport ) { // Copy to OnlineReports Array $content['ONLINEREPORTS'][] = $myOnlineReport; } // Success! return true; } else // Failure return false; } // Helper function from php doc function xml2array($url, $get_attributes = 1, $priority = 'tag') { $contents = ""; if (!function_exists('xml_parser_create')) { return false; } $parser = xml_parser_create(''); if (!($fp = @ fopen($url, 'rb'))) { return false; } while (!feof($fp)) { $contents .= fread($fp, 8192); } fclose($fp); xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($parser, trim($contents), $xml_values); xml_parser_free($parser); if (!$xml_values) return; //Hmm... $xml_array = array (); $parents = array (); $opened_tags = array (); $arr = array (); $current = & $xml_array; $repeated_tag_index = array (); foreach ($xml_values as $data) { unset ($attributes, $value); extract($data); $result = array (); $attributes_data = array (); if (isset ($value)) { if ($priority == 'tag') $result = $value; else $result['value'] = $value; } if (isset ($attributes) and $get_attributes) { foreach ($attributes as $attr => $val) { if ($priority == 'tag') $attributes_data[$attr] = $val; else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' } } if ($type == "open") { $parent[$level -1] = & $current; if (!is_array($current) or (!in_array($tag, array_keys($current)))) { $current[$tag] = $result; if ($attributes_data) $current[$tag . '_attr'] = $attributes_data; $repeated_tag_index[$tag . '_' . $level] = 1; $current = & $current[$tag]; } else { if (isset ($current[$tag][0])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 2; if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } } $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1; $current = & $current[$tag][$last_item_index]; } } elseif ($type == "complete") { if (!isset ($current[$tag])) { $current[$tag] = $result; $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $attributes_data) $current[$tag . '_attr'] = $attributes_data; } else { if (isset ($current[$tag][0]) and is_array($current[$tag])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; if ($priority == 'tag' and $get_attributes and $attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $get_attributes) { if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } if ($attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } } $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken } } } elseif ($type == 'close') { $current = & $parent[$level -1]; } } return ($xml_array); } ?>loganalyzer-4.1.5/src/include/functions_themes.php000066400000000000000000000127011277740250400223610ustar00rootroot00000000000000 * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- function CreateLanguageList() { global $gl_root_path, $content; $alldirectories = list_directories( $gl_root_path . "lang/"); for($i = 0; $i < count($alldirectories); $i++) { // --- gen_lang $content['LANGUAGES'][$i]['langcode'] = $alldirectories[$i]; if ( $content['gen_lang'] == $alldirectories[$i] ) $content['LANGUAGES'][$i]['selected'] = "selected"; else $content['LANGUAGES'][$i]['selected'] = ""; // --- // --- user_lang $content['USERLANG'][$i]['langcode'] = $alldirectories[$i]; if ( $content['user_lang'] == $alldirectories[$i] ) $content['USERLANG'][$i]['is_selected'] = "selected"; else $content['USERLANG'][$i]['is_selected'] = ""; // --- // Init Language DisplayName $content['USERLANG'][$i]['DisplayName'] = GetLanguageDisplayName( $alldirectories[$i] ); $content['LANGUAGES'][$i]['DisplayName'] = GetLanguageDisplayName( $alldirectories[$i] ); } } function CreateThemesList() { global $gl_root_path, $content; $alldirectories = list_directories( $gl_root_path . "themes/"); for($i = 0; $i < count($alldirectories); $i++) { // Init Theme Settings $themename = $alldirectories[$i]; $content['STYLES'][$themename]['StyleName'] = $themename; // Init stuff from abvout InitThemeAbout($themename); // Copy to userstyles array $content['USERSTYLES'][$themename] = $content['STYLES'][$themename]; // --- web_theme if ( $content['web_theme'] == $themename ) $content['STYLES'][$themename]['selected'] = "selected"; else $content['STYLES'][$themename]['selected'] = ""; // --- // --- user_theme if ( $content['user_theme'] == $themename ) $content['USERSTYLES'][$themename]['is_selected'] = "selected"; else $content['USERSTYLES'][$themename]['is_selected'] = ""; // --- } } function VerifyTheme( $newtheme ) { global $gl_root_path; if ( is_dir( $gl_root_path . "themes/" . $newtheme ) ) return true; else return false; } function InitThemeAbout( $themename ) { global $content, $gl_root_path; $szAboutFile = $gl_root_path . "themes/" . $themename . "/about.txt"; // Init variables $content['STYLES'][$themename]['Author'] = ""; $content['STYLES'][$themename]['Link'] = ""; $content['STYLES'][$themename]['DisplayName'] = $themename; if ( is_file( $szAboutFile ) ) { //Read About Info! $aboutfile = fopen($szAboutFile, 'r'); if (!feof ($aboutfile)) { while (!feof ($aboutfile)) { $tmpline = fgets($aboutfile, 1024); if ( strpos($tmpline, ":") !== false ) { // Split array $aLine = explode(":", $tmpline); switch ( $aLine[0] ) { case "Author": $content['STYLES'][$themename]['Author'] = trim($aLine[1]); break; case "Link": $content['STYLES'][$themename]['Link'] = trim($aLine[1]); break; case "DisplayName": $content['STYLES'][$themename]['DisplayName'] = trim($aLine[1]); break; } } /* if (!isset($content["theme_madeby"]) ) $content["theme_madeby"] = substr( trim($tmpline), 0, 25); else if (!isset($content["theme_madebylink"]) ) $content["theme_madebylink"] = substr( trim($tmpline), 0, 256); else if (!isset($content["theme_name"]) ) $content["theme_name"] = substr( trim($tmpline), 0, 256); else { $content["theme_madebyenable"] = "true"; break; } */ } // Enable madeby display $content["theme_madebyenable"] = "true"; } fclose($aboutfile); } else $content["theme_madebyenable"] = "false"; } function GetLanguageDisplayName( $szLangID ) { global $content, $gl_root_path; $szInfoFile = $gl_root_path . "lang/" . $szLangID . "/info.txt"; if ( is_file( $szInfoFile ) ) { //Read InfoFile! $infofile = fopen($szInfoFile, 'r'); if (!feof ($infofile)) { while (!feof ($infofile)) { // Return max 32 characters $tmpline = fgets($infofile, 1024); return substr( trim($tmpline), 0, 32); } } fclose($infofile); } else // No Info, return ID as DisplayName return $szLangID; } ?> loganalyzer-4.1.5/src/include/functions_users.php000066400000000000000000000403141277740250400222360ustar00rootroot00000000000000 * * * * All directives are explained within this file * * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution. * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Basic Includes //include($gl_root_path . 'include/constants_general.php'); ///include($gl_root_path . 'include/constants_logstream.php'); // --- // --- Define User System initialized! define('IS_USERSYSTEMENABLED', true); $content['IS_USERSYSTEMENABLED'] = true; // --- // --- BEGIN Usermanagement Function --- function InitUserSession() { global $USERCFG, $content; // --- Hide donate Button if not on Admin Page if ( !defined('IS_ADMINPAGE') ) $content['SHOW_DONATEBUTTON'] = false; // --- if ( isset($_SESSION['SESSION_LOGGEDIN']) ) { if ( !$_SESSION['SESSION_LOGGEDIN'] || !isset($_SESSION['SESSION_USERID']) /* Check if UserID is set! */ ) { $content['SESSION_LOGGEDIN'] = false; // Not logged in return false; } else { // Copy variables from session! $content['SESSION_LOGGEDIN'] = true; $content['SESSION_USERNAME'] = $_SESSION['SESSION_USERNAME']; $content['SESSION_USERID'] = $_SESSION['SESSION_USERID']; $content['SESSION_ISADMIN'] = $_SESSION['SESSION_ISADMIN']; $content['SESSION_ISREADONLY'] = $_SESSION['SESSION_ISREADONLY']; if ( isset($_SESSION['SESSION_GROUPIDS']) ) $content['SESSION_GROUPIDS'] = $_SESSION['SESSION_GROUPIDS']; // Set some variable defaults here $content['SHOW_ADMINPANEL'] = "true"; // --- Now we obtain user specific general settings from the DB for the user! $result = DB_Query("SELECT * FROM `" . DB_CONFIG . "` WHERE userid = " . $content['SESSION_USERID']); if ( $result ) { $rows = DB_GetAllRows($result, true); // Read results from DB and overwrite in $CFG Array! if ( isset($rows ) ) { for($i = 0; $i < count($rows); $i++) { // Store and overwrite settings from the user here! $USERCFG[ $rows[$i]['propname'] ] = $rows[$i]['propvalue']; // $content[ $rows[$i]['propname'] ] = $rows[$i]['propvalue']; } } } else // Critical ERROR HERE! DieWithFriendlyErrorMsg( "Critical Error occured while trying to access the database in table '" . DB_CONFIG . "'" ); // --- if ( isset($_SESSION['UPDATEAVAILABLE']) && $_SESSION['UPDATEAVAILABLE'] ) { // Check Version numbers again to avoid update notification if update was done during meantime! if ( CompareVersionNumbers($content['BUILDNUMBER'], $_SESSION['UPDATEVERSION']) ) { $content['UPDATEVERSION'] = $_SESSION['UPDATEVERSION']; $content['isupdateavailable'] = true; $content['isupdateavailable_updatelink'] = $_SESSION['UPDATELINK']; $content['UPDATE_AVAILABLETEXT'] = GetAndReplaceLangStr($content['LN_UPDATE_AVAILABLETEXT'], $content['BUILDNUMBER'], $_SESSION['UPDATEVERSION']); } } // --- Extracheck for available database updates! if ( isset($content['database_forcedatabaseupdate']) && $content['database_forcedatabaseupdate'] == "yes" && !defined('IS_UPRGADEPAGE') ) RedirectToDatabaseUpgrade(); // --- // Successfully logged in return true; } } else { $content['SESSION_LOGGEDIN'] = false; // Not logged in ^^ return false; } } function CreateUserName( $username, $password, $is_admin ) { /* DB_RemoveBadChars() needs to be done here to maintain backwards compatibility even if it is not needed here*/ $md5pass = md5(DB_RemoveBadChars($password)); $result = DB_Query("SELECT username FROM `" . DB_USERS . "` WHERE username = '" . $username . "'"); $rows = DB_GetAllRows($result, true); if ( isset($rows) ) { DieWithFriendlyErrorMsg( "User $username already exists!" ); // User not created! return false; } else { // Create User $result = DB_Query("INSERT INTO `" . DB_USERS . "` (username, password, is_admin) VALUES ('$username', '$md5pass', $is_admin)"); DB_FreeQuery($result); // Success return true; } } function CheckUserLogin( $username, $password ) { global $content; // Check if LDAP Auth has to be used! if ( GetConfigSetting("UserDBAuthMode", USERDB_AUTH_INTERNAL) == USERDB_AUTH_LDAP) { // perform user auth using LDAP, will add user record to loganalyzer DB if necessary $myrow = CheckLDAPUserLogin( $username, $password ); } else // Normal MYSQL Login! { // TODO: SessionTime and AccessLevel check $md5pass = md5(DB_RemoveBadChars($password)); /* DB_RemoveBadChars() needs to be done here to maintain backwards compatibility even if it is not needed here*/ $sqlquery = "SELECT * FROM `" . DB_USERS . "` WHERE username = '" . $username . "' and password = '" . $md5pass . "'"; $result = DB_Query($sqlquery); $myrow = DB_GetSingleRow($result, true); } // The admin field must be set! if ( isset($myrow['is_admin']) ) { $_SESSION['SESSION_LOGGEDIN'] = true; $_SESSION['SESSION_USERNAME'] = $username; $_SESSION['SESSION_USERID'] = $myrow['ID']; $_SESSION['SESSION_ISADMIN'] = $myrow['is_admin']; // Check Readonly setting if ( $content['database_installedversion'] > 8 ) $_SESSION['SESSION_ISREADONLY'] = $myrow['is_readonly']; else $_SESSION['SESSION_ISREADONLY'] = false; $content['SESSION_LOGGEDIN'] = $_SESSION['SESSION_LOGGEDIN']; $content['SESSION_USERNAME'] = $_SESSION['SESSION_USERNAME']; $content['SESSION_USERID'] = $_SESSION['SESSION_USERID']; $content['SESSION_ISADMIN'] = $_SESSION['SESSION_ISADMIN']; $content['SESSION_ISREADONLY'] = $_SESSION['SESSION_ISREADONLY']; // --- Read Groupmember ship for the user! $sqlquery = "SELECT " . DB_GROUPMEMBERS . ".groupid, " . DB_GROUPMEMBERS . ".is_member " . "FROM `" . DB_GROUPMEMBERS . "` WHERE userid = " . $content['SESSION_USERID'] . " AND `" . DB_GROUPMEMBERS . "`.is_member = 1"; $result = DB_Query($sqlquery); $myrows = DB_GetAllRows($result, true); if ( isset($myrows ) && count($myrows) > 0 ) { for($i = 0; $i < count($myrows); $i++) { if ( isset($content['SESSION_GROUPIDS']) ) $content['SESSION_GROUPIDS'] .= ", " . $myrows[$i]['groupid']; else $content['SESSION_GROUPIDS'] = $myrows[$i]['groupid']; } } // Copy into session as well $_SESSION['SESSION_GROUPIDS'] = $content['SESSION_GROUPIDS']; // --- // ---Set LASTLOGIN Time! $result = DB_Query("UPDATE `" . DB_USERS . "` SET last_login = " . time() . " WHERE ID = " . $content['SESSION_USERID']); DB_FreeQuery($result); // --- // --- Extracheck for available database updates! if ( isset($content['database_forcedatabaseupdate']) && $content['database_forcedatabaseupdate'] == "yes" && !defined('IS_UPRGADEPAGE') ) RedirectToDatabaseUpgrade(); // --- // --- Now we check for an PhpLogCon Update $iProxyLen = strlen(GetConfigSetting("UseProxyServerForRemoteQueries", "")); if ( $iProxyLen > 0 ) { // Proxy Server configured, create a context with proxy option! $opts = array('http' => array('proxy' => 'tcp://' . GetConfigSetting("UseProxyServerForRemoteQueries", ""), 'request_fulluri' => true)); $context = stream_context_create($opts); // Create handle with my context! $myHandle = @fopen($content['UPDATEURL'], "r", false, $context); } else $myHandle = @fopen($content['UPDATEURL'], "r"); if( $myHandle ) { $myBuffer = ""; while (!feof ($myHandle)) $myBuffer .= fgets($myHandle, 4096); fclose($myHandle); $myLines = explode("\n", $myBuffer); // Compare Version numbers! if ( CompareVersionNumbers($content['BUILDNUMBER'], $myLines[0]) ) { // True means new version available! $_SESSION['UPDATEAVAILABLE'] = true; $_SESSION['UPDATEVERSION'] = $myLines[0]; if ( isset($myLines[1]) ) $_SESSION['UPDATELINK'] = $myLines[1]; else $_SESSION['UPDATELINK'] = "http://www.phplogcon.org"; } } // --- // Success ! return true; } else { /* if (isset($myrow) && is_numeric($myrow) ) { //return error code! return $myrow; } */ if ( GetConfigSetting("DebugUserLogin", 0) == 1 ) DieWithFriendlyErrorMsg( "Debug Error: Could not find user '" . $username . "'

    Sessionarray
    " . var_export($_SESSION, true) . "
    "); // Default return false return false; } } function DoLDAPConnect() { global $content; // Open LDAP connection if (!($ldapConn=@ldap_connect($content['LDAPServer'],$content['LDAPPort']))) return false; ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3); // reached this point means success! return $ldapConn; } function DoLDAPBind($ldapConn) { global $content; // Bind as the privilegied user return ldap_bind($ldapConn, $content['LDAPBindDN'], $content['LDAPBindPassword']); } function CheckLDAPUserLogin( $username, $password ) { global $content; // Create LDAP Searchfilter $ldap_filter='(&'.$content['LDAPSearchFilter'].'('.$content['LDAPUidAttribute'].'='.$username.'))'; // Get LDAP Connection $ldapConn = DoLDAPConnect(); if ( $ldapConn ) { if ( !DoLDAPBind($ldapConn) ) { if ( GetConfigSetting("DebugUserLogin", 0) == 1 ) { // Die with error DebugLDAPErrorAndDie( GetAndReplaceLangStr($content['LN_LOGIN_LDAP_USERBINDFAILED'], $content['LDAPBindDN'], ldap_err2str(ldap_errno($ldapConn))), $ldap_filter ); } return false; } } else { if ( GetConfigSetting("DebugUserLogin", 0) == 1 ) { // Die with error DebugLDAPErrorAndDie( GetAndReplaceLangStr($content['LN_LOGIN_LDAP_SERVERFAILED'], $content['LDAPServer'] . ":" . $content['LDAPPort'], ldap_err2str(ldap_errno($ldapConn))), $ldap_filter ); } // return false in this case return false; } // Search for the user if (!($r=@ldap_search( $ldapConn, $content['LDAPBaseDN'], $ldap_filter, array("uid","cn","localentryid","userpassword") ))) { if ( GetConfigSetting("DebugUserLogin", 0) == 1 ) { // Die with error DebugLDAPErrorAndDie( GetAndReplaceLangStr($content['LN_LOGIN_LDAP_USERCOULDNOTLOGIN'], $username, ldap_err2str(ldap_errno($ldapConn))), $ldap_filter ); } // return false in this case return false; } $info = ldap_get_entries($ldapConn, $r); if (!$info || $info["count"] != 1) { if ( GetConfigSetting("DebugUserLogin", 0) == 1 ) { // Die with error DebugLDAPErrorAndDie( GetAndReplaceLangStr( $content['LN_LOGIN_LDAP_USERNOTFOUND'], $username ), $ldap_filter ); } // return false in this case return false; } // now we have the user data. Do a bind to check for his password if (!($r=@ldap_bind( $ldapConn, $info[0]['dn'],$password))) { if ( GetConfigSetting("DebugUserLogin", 0) == 1 ) { // Die with error DebugLDAPErrorAndDie( GetAndReplaceLangStr( $content['LN_LOGIN_LDAP_PASSWORDFAIL'], $username ), $ldap_filter ); } // return false in this case return false; } // for the moment when a user logs in from LDAP, create it in the DB. // then the prefs and group management is done in the DB and we don't rewrite the whole Loganalyzer code /* DB_RemoveBadChars() needs to be done here to maintain backwards compatibility even if it is not needed here*/ $md5pass = md5(DB_RemoveBadChars($password)); // check if the user already exist $sqlquery = "SELECT * FROM `" . DB_USERS . "` WHERE username = '" . $username . "'"; $result = DB_Query($sqlquery); $myrow = DB_GetSingleRow($result, true); if (!isset($myrow['is_admin']) ) { // Create User | use password to create MD5 Hash, so technically the user could login without LDAP as well $sqlcmd = "INSERT INTO `" . DB_USERS . "` (username, password, is_admin, is_readonly) VALUES ('" . $username . "', '" . $md5pass . "', 0, 1)"; $result = DB_Query($sqlcmd); DB_FreeQuery($result); $myrow['is_admin'] = 0; $myrow['last_login'] = 0; $myrow['is_readonly'] = 1; } // Construct Row and return $myrowfinal['username'] = $username; $myrowfinal['password'] = $md5pass; $myrowfinal['dn'] = $info[0]['dn']; if ( isset($myrow['ID']) ) $myrowfinal['ID'] = $myrow['ID']; // Get from SELECT else $myrowfinal['ID'] = DB_ReturnLastInsertID(); // Get from last insert! $myrowfinal['is_admin'] = $myrow['is_admin']; $myrowfinal['is_readonly'] = $myrow['is_readonly']; $myrowfinal['last_login'] = $myrow['last_login']; return $myrowfinal; } /* * LDAP Debug Helpre function */ function DebugLDAPErrorAndDie($szErrorMsg, $szLdapFilter) { global $content; // Add extra debug if wanted! if ( GetConfigSetting("MiscShowDebugMsg", 0, CFGLEVEL_USER) == 1 ) { $szErrorMsg .= "

    LDAPBind DN: " . $content['LDAPBindDN'] . "
    Search Filter: " . $szLdapFilter . "
    Session Array: 
    " . var_export($_SESSION, true) . "
    "; } // USER NOT FOUND DieWithFriendlyErrorMsg( $szErrorMsg ); } function DoLogOff() { global $content; unset( $_SESSION['SESSION_LOGGEDIN'] ); unset( $_SESSION['SESSION_USERNAME'] ); unset( $_SESSION['SESSION_USERID'] ); unset( $_SESSION['SESSION_ACCESSLEVEL'] ); // Redir to Index Page RedirectPage( "index.php"); } function RedirectToUserLogin() { global $content; // build referer $referer = $_SERVER['PHP_SELF']; if ( isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) $referer .= "?" . $_SERVER['QUERY_STRING']; header("Location: " . $content['BASEPATH'] . "login.php?referer=" . urlencode($referer) ); exit; } function RedirectToDatabaseUpgrade() { global $content; // build referer $referer = $_SERVER['PHP_SELF']; if ( isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) $referer .= "?" . $_SERVER['QUERY_STRING']; header("Location: " . $content['BASEPATH'] . "admin/upgrade.php?referer=" . urlencode($referer) ); exit; } // --- END Usermanagement Function --- /* * Helper function to obtain a list of groups for display */ function GetGroupsForSelectfield() { global $content; $sqlquery = "SELECT " . DB_GROUPS . ".ID as mygroupid, " . DB_GROUPS . ".groupname " . "FROM `" . DB_GROUPS . "`" . " ORDER BY `" . DB_GROUPS . "`.groupname"; $result = DB_Query($sqlquery); $mygroups = DB_GetAllRows($result, true); if ( isset($mygroups) && count($mygroups) > 0 ) { // Process All Groups for($i = 0; $i < count($mygroups); $i++) $mygroups[$i]['group_selected'] = ""; // Enable Group Selection array_unshift( $mygroups, array ("mygroupid" => -1, "groupname" => $content['LN_SEARCH_SELGROUPENABLE'], "group_selected" => "") ); // return result return $mygroups; } else return false; // --- } // Helper function to compare versions function CompareVersionNumbers( $oldVer, $newVer ) { // Split version numbers $currentVersion = explode(".", trim($oldVer) ); $newVersion = explode(".", trim($newVer) ); // Check if the format is correct! if ( count($newVersion) != 3 ) return false; // check for update if ( isset($newVersion[0]) && $newVersion[0] > $currentVersion[0] ) return true; else if ( isset($newVersion[1]) && $newVersion[0] == $currentVersion[0] && $newVersion[1] > $currentVersion[1] ) return true; else if ( isset($newVersion[2]) && $newVersion[0] == $currentVersion[0] && $newVersion[1] == $currentVersion[1] && $newVersion[2] > $currentVersion[2] ) return true; else return false; } ?>loganalyzer-4.1.5/src/index.php000066400000000000000000001141601277740250400164720ustar00rootroot00000000000000 Loads the main LogAnalyzer Site * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); $gl_root_path = './'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_filters.php'); // Include LogStream facility include($gl_root_path . 'classes/logstream.class.php'); InitPhpLogCon(); InitSourceConfigs(); InitFrontEndDefaults(); // Only in WebFrontEnd InitFilterHelpers(); // Helpers for frontend filtering! // --- // --- Define Extra Stylesheet! $content['EXTRA_STYLESHEET'] = '' . "\r\n"; // --- // --- CONTENT Vars if ( isset($_GET['uid']) ) { // Now check by numeric as uid can be larger than INT values if ( is_numeric($_GET['uid']) ) $content['uid_current'] = $_GET['uid']; else $content['uid_current'] = UID_UNKNOWN; } else $content['uid_current'] = UID_UNKNOWN; // copy needed for export function $content['uid_original'] = $content['uid_current']; // --- Set Autoreload as meta refresh if ( $content['uid_current'] == UID_UNKNOWN ) { $content['ViewEnableAutoReloadSeconds_visible'] = true; if ( $content['ViewEnableAutoReloadSeconds'] > 0 ) $content['EXTRA_METATAGS'] = '' . "\r\n"; } else $content['ViewEnableAutoReloadSeconds_visible'] = false; // --- Read direction parameter if ( isset($_GET['direction']) ) { // Copy to content array $content['direction'] = $_GET['direction']; } else $content['direction'] = ""; // Check for reading direction if ( $content['direction'] == "desc" ) $content['read_direction'] = EnumReadDirection::Forward; else $content['read_direction'] = EnumReadDirection::Backward; // --- // If direction is DESC, should we SKIP one? if ( isset($_GET['skipone']) && $_GET['skipone'] == "true" ) $content['skipone'] = true; else $content['skipone'] = false; // --- // Init Export Stuff! $content['EXPORT_ENABLED'] = true; // Init Pager variables $content['uid_previous'] = UID_UNKNOWN; $content['uid_next'] = UID_UNKNOWN; $content['uid_first'] = UID_UNKNOWN; $content['uid_last'] = UID_UNKNOWN; $content['main_pagerenabled'] = false; $content['main_pager_first_found'] = false; $content['main_pager_previous_found'] = false; $content['main_pager_next_found'] = false; $content['main_pager_last_found'] = false; // Init Sorting variables $content['sorting'] = ""; $content['searchstr'] = ""; $content['searchstr_htmlform'] = ""; $content['highlightstr'] = ""; $content['highlightstr_htmlform'] = ""; $content['EXPAND_HIGHLIGHT'] = "false"; // --- Read and process filters from search dialog! if ( (isset($_POST['search']) || isset($_GET['search'])) || (isset($_POST['filter']) || isset($_GET['filter'])) ) { // Copy search over if ( isset($_POST['search']) ) $mysearch = $_POST['search']; else if ( isset($_GET['search']) ) $mysearch = $_GET['search']; if ( isset($_POST['filter']) ) $myfilter = $_POST['filter']; else if ( isset($_GET['filter']) ) $myfilter = $_GET['filter']; // Optionally read highlight words if ( isset($_POST['highlight']) ) { $content['highlightstr'] = $_POST['highlight']; $content['highlightstr_htmlform'] = htmlspecialchars($_POST['highlight']); } else if ( isset($_GET['highlight']) ) { $content['highlightstr'] = $_GET['highlight']; $content['highlightstr_htmlform'] = htmlspecialchars($_GET['highlight']); } // Message is just appended if ( isset($myfilter) && strlen($myfilter) > 0 ) { $content['searchstr'] = $myfilter; $content['searchstr_htmlform'] = htmlspecialchars($myfilter); } if ( strlen($content['highlightstr']) > 0 ) { $searchArray = array("\\", "/", ".", ">"); $replaceArray = array("\\\\", "\/", "\.", ">"); // user also wants to highlight words! if ( strpos($content['highlightstr'], ",") === false) { $content['highlightwords'][0]['highlight_html'] = htmlspecialchars($content['highlightstr']); $content['highlightwords'][0]['highlight'] = str_replace( $searchArray, $replaceArray, $content['highlightstr']); $content['highlightwords'][0]['cssclass'] = "highlight_1"; $content['highlightwords'][0]['htmlcode'] = '' . $content['highlightwords'][0]['highlight']. ''; } else { // Split array into words $tmparray = explode( ",", $content['highlightstr'] ); foreach( $tmparray as $word ) $content['highlightwords'][]['highlight_html'] = htmlspecialchars($word); // Assign other variables needed for this array entry for ($i = 0; $i < count($content['highlightwords']); $i++) { $content['highlightwords'][$i]['highlight'] = str_replace( $searchArray, $replaceArray, $content['highlightwords'][$i]['highlight_html']); $content['highlightwords'][$i]['cssclass'] = "highlight_" . ($i+1); $content['highlightwords'][$i]['htmlcode'] = '' . $content['highlightwords'][$i]['highlight']. ''; } } // Default expand Highlight Arrea! $content['EXPAND_HIGHLIGHT'] = "true"; } // Enable oracle link! if ( isset($content['searchstr']) && strlen($content['searchstr']) > 0 ) { $content['enabledoraclesearchstr'] = true; $content['oraclesearchlink'] = $content['BASEPATH'] . "asktheoracle.php?type=searchstr&query=" . urlencode($content['searchstr']) . "&uid=" . $content['uid_current']; } } // --- // --- BEGIN CREATE TITLE $content['TITLE'] = InitPageTitle(); // Append custom title part! if ( isset($content['searchstr_htmlform']) && strlen($content['searchstr_htmlform']) > 0 ) $content['TITLE'] .= " :: Results for the search '" . $content['searchstr_htmlform'] . "'"; // Append search else $content['TITLE'] .= " :: All Syslogmessages"; // --- END CREATE TITLE // --- BEGIN Custom Code // Do not BLOCK other Site Calls WriteClosePHPSession(); if ( isset($content['Sources'][$currentSourceID]) ) { // Obtain and get the Config Object $stream_config = $content['Sources'][$currentSourceID]['ObjRef']; // Create LogStream Object $stream = $stream_config->LogStreamFactory($stream_config); $stream->SetFilter($content['searchstr']); // Copy current used columns here! $content['Columns'] = $content['Views'][$currentViewID]['Columns']; // --- Init the fields we need foreach($content['Columns'] as $mycolkey) { if ( isset($fields[$mycolkey]) ) { $content['fields'][$mycolkey]['FieldID'] = $mycolkey; $content['fields'][$mycolkey]['FieldCaption'] = $fields[$mycolkey]['FieldCaption']; $content['fields'][$mycolkey]['FieldType'] = $fields[$mycolkey]['FieldType']; $content['fields'][$mycolkey]['FieldSortable'] = $stream->IsPropertySortable($mycolkey); // $fields[$mycolkey]['Sortable']; $content['fields'][$mycolkey]['DefaultWidth'] = $fields[$mycolkey]['DefaultWidth']; if ( $mycolkey == SYSLOG_MESSAGE ) $content['fields'][$mycolkey]['colspan'] = ''; //' colspan="2" '; else $content['fields'][$mycolkey]['colspan'] = ''; } } // --- $res = $stream->Open( $content['Columns'], true ); if ( $res == SUCCESS ) { // TODO Implement ORDER $stream->SetReadDirection($content['read_direction']); // Set current ID and init Counter $uID = $content['uid_current']; $counter = 0; // If uID is known, we need to init READ first - this will also seek for available records first! if ($uID != UID_UNKNOWN) { // First read will also set the start position of the Stream! $ret = $stream->Read($uID, $logArray); } else $ret = $stream->ReadNext($uID, $logArray); // --- Check if Read was successfull! if ( $ret == SUCCESS ) { // If Forward direction is used, we need to SKIP one entry! if ( $content['read_direction'] == EnumReadDirection::Forward ) { // Ok the current ID is our NEXT ID in this reading direction, so we save it! $content['uid_next'] = $uID; if ( $content['skipone'] ) { // Skip this entry and move to the next $stream->ReadNext($uID, $logArray); } } } else if ( $ret == ERROR_MSG_SKIPMESSAGE ) { do { // Skip until we find a suitable entry $ret = $stream->ReadNext($uID, $logArray); } while ($ret == ERROR_MSG_SKIPMESSAGE); } // check for error return state! if ( $ret != SUCCESS ) { // This will disable to Main SyslogView and show an error message $content['syslogmessagesenabled'] = "false"; $content['detailederror'] = $content['LN_ERROR_NORECORDS']; $content['detailederror_code'] = ERROR_NOMORERECORDS; } // --- // We found matching records, so continue if ( $ret == SUCCESS ) { // --- PreChecks to be done // Set Record Count $content['main_recordcount'] = $stream->GetMessageCount(); if ( $content['main_recordcount'] != -1 ) $content['main_recordcount_found'] = true; else $content['main_recordcount_found'] = false; $content['main_currentpagenumber'] = $stream->GetCurrentPageNumber(); if ( $content['main_currentpagenumber'] > 0 ) $content['main_currentpagenumber_found'] = true; else $content['main_currentpagenumber_found'] = false; //echo $content['main_currentpagenumber']; // --- // --- Obtain characters limits first! $myMsgCharLimit = GetConfigSetting("ViewMessageCharacterLimit", 80, CFGLEVEL_USER); $myStrCharLimit = GetConfigSetting("ViewStringCharacterLimit", 30, CFGLEVEL_USER); // --- //Loop through the messages! do { // --- Extra stuff for suppressing messages if ( GetConfigSetting("SuppressDuplicatedMessages", 0, CFGLEVEL_USER) == 1 && isset($logArray[SYSLOG_MESSAGE]) ) { if ( !isset($szLastMessage) ) // Only set lastmgr $szLastMessage = $logArray[SYSLOG_MESSAGE]; else { // Skip if same msg if ( $szLastMessage == $logArray[SYSLOG_MESSAGE] ) { // Set last mgr $szLastMessage = $logArray[SYSLOG_MESSAGE]; // --- Extra Loop to get the next entry! do { $ret = $stream->ReadNext($uID, $logArray); } while ( $ret == ERROR_MSG_SKIPMESSAGE ); // --- // Skip entry continue; } } } // --- // --- Set CSS Class if ( $counter % 2 == 0 ) $content['syslogmessages'][$counter]['cssclass'] = "line1"; else $content['syslogmessages'][$counter]['cssclass'] = "line2"; // --- // --- Copy other needed properties $content['syslogmessages'][$counter]['MiscShowDebugGridCounter'] = $content['MiscShowDebugGridCounter']; // --- // --- Now we populate the values array! foreach($content['Columns'] as $mycolkey) { if ( isset($fields[$mycolkey]) && isset($logArray[$mycolkey]) ) { // Set defaults $content['syslogmessages'][$counter]['values'][$mycolkey]['FieldColumn'] = $mycolkey; $content['syslogmessages'][$counter]['values'][$mycolkey]['uid'] = $uID; $content['syslogmessages'][$counter]['values'][$mycolkey]['FieldAlign'] = $fields[$mycolkey]['FieldAlign']; $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldcssclass'] = $content['syslogmessages'][$counter]['cssclass']; $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = ""; $content['syslogmessages'][$counter]['values'][$mycolkey]['isnowrap'] = "nowrap"; $content['syslogmessages'][$counter]['values'][$mycolkey]['hasdetails'] = "false"; $content['syslogmessages'][$counter]['values'][$mycolkey]['detailimagealign'] = "TOP"; // Set default link $content['syslogmessages'][$counter]['values'][$mycolkey]['detaillink'] = "#"; // Now handle fields types differently if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_DATE ) { $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetFormatedDate($logArray[$mycolkey]); } else if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_NUMBER ) { $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = $logArray[$mycolkey]; // Special style classes and colours for SYSLOG_FACILITY if ( $mycolkey == SYSLOG_FACILITY ) { // if ( isset($logArray[$mycolkey][SYSLOG_FACILITY]) && strlen($logArray[$mycolkey][SYSLOG_FACILITY]) > 0) if ( isset($logArray[$mycolkey]) && is_numeric($logArray[$mycolkey]) ) { $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $facility_colors[ $logArray[SYSLOG_FACILITY] ] . '" '; $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldcssclass'] = "lineColouredBlack"; // Set Human readable Facility! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetFacilityDisplayName( $logArray[$mycolkey] ); } else { // Use default colour! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $facility_colors[SYSLOG_LOCAL0] . '" '; } // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_FACILITY); } else if ( $mycolkey == SYSLOG_SEVERITY ) { // if ( isset($logArray[$mycolkey][SYSLOG_SEVERITY]) && strlen($logArray[$mycolkey][SYSLOG_SEVERITY]) > 0) if ( isset($logArray[$mycolkey]) && is_numeric($logArray[$mycolkey]) ) { $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $severity_colors[ $logArray[SYSLOG_SEVERITY] ] . '" '; $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldcssclass'] = "lineColouredWhite"; // Set Human readable Facility! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetSeverityDisplayName( $logArray[$mycolkey] ); } else { // Use default colour! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $severity_colors[SYSLOG_INFO] . '" '; } // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_SEVERITY); } else if ( $mycolkey == SYSLOG_MESSAGETYPE ) { // if ( isset($logArray[$mycolkey][SYSLOG_MESSAGETYPE]) ) if ( isset($logArray[$mycolkey]) && is_numeric($logArray[$mycolkey]) ) { $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $msgtype_colors[ $logArray[SYSLOG_MESSAGETYPE] ] . '" '; $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldcssclass'] = "lineColouredBlack"; // Set Human readable Facility! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetMessageTypeDisplayName( $logArray[$mycolkey] ); } else { // Use default colour! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldbgcolor'] = 'bgcolor="' . $msgtype_colors[IUT_Unknown] . '" '; } // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_MESSAGETYPE); } else if ( $mycolkey == SYSLOG_PROCESSID ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_PROCESSID); } /* Eventlog based fields */ else if ( $mycolkey == SYSLOG_EVENT_ID ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_EVENT_ID); } else if ( $mycolkey == SYSLOG_EVENT_CATEGORY ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_EVENT_CATEGORY); } // WebServer Type fields else if ( $mycolkey == SYSLOG_WEBLOG_STATUS ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, SYSLOG_WEBLOG_STATUS); } else { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_NUMBER, $mycolkey); } } else if ( $content['fields'][$mycolkey]['FieldType'] == FILTER_TYPE_STRING ) { // Set some basic variables first $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = $logArray[$mycolkey]; // May contain the field value trunscated $content['syslogmessages'][$counter]['values'][$mycolkey]['rawfieldvalue'] = $logArray[$mycolkey]; // helper variable used for Popups! $content['syslogmessages'][$counter]['values'][$mycolkey]['encodedfieldvalue'] = PrepareStringForSearch($logArray[$mycolkey]); // Convert into filter format for submenus // --- Check for reached string character limit if ( $mycolkey != SYSLOG_MESSAGE ) { if ( $myStrCharLimit > 0 ) $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetStringWithHTMLCodes(strlen($logArray[$mycolkey]) > $myStrCharLimit ? substr($logArray[$mycolkey], 0, $myStrCharLimit) . "..." : $logArray[$mycolkey]); } // --- // Special Handling for the Syslog Message! if ( $mycolkey == SYSLOG_MESSAGE ) { // No NOWRAP for Syslog Message! $content['syslogmessages'][$counter]['values'][$mycolkey]['isnowrap'] = ""; // Set truncasted message for display if ( isset($logArray[SYSLOG_MESSAGE]) ) { if ( $myMsgCharLimit > 0 ) $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetStringWithHTMLCodes(strlen($logArray[SYSLOG_MESSAGE]) > $myMsgCharLimit ? substr($logArray[SYSLOG_MESSAGE], 0, $myMsgCharLimit) . " ..." : $logArray[SYSLOG_MESSAGE]); else $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = GetStringWithHTMLCodes($logArray[SYSLOG_MESSAGE]); // Enable LINK property! for this field $content['syslogmessages'][$counter]['values'][$mycolkey]['ismessagefield'] = true; $content['syslogmessages'][$counter]['values'][$mycolkey]['detaillink'] = "details.php?uid=" . $uID; } else { $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = ""; } // If we need to highlight some words ^^! if ( isset($content['highlightwords']) ) $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] = HighLightString( $content['highlightwords'], $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue'] ); // --- HOOK here to add context links! $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvaluenolink'] = $content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue']; AddContextLinks($content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvalue']); AddContextHighlights($content['syslogmessages'][$counter]['values'][$mycolkey]['fieldvaluenolink']); // --- if ( GetConfigSetting("ViewEnableDetailPopups", 0, CFGLEVEL_USER) ) { $content['syslogmessages'][$counter]['values'][$mycolkey]['popupcaption'] = GetAndReplaceLangStr( $content['LN_GRID_POPUPDETAILS'], $logArray[SYSLOG_UID]); $content['syslogmessages'][$counter]['values'][$mycolkey]['popupcaptionjs'] = EscapeQuotesFromString($content['syslogmessages'][$counter]['values'][$mycolkey]['popupcaption']); $content['syslogmessages'][$counter]['values'][$mycolkey]['hasdetails'] = "true"; $content['syslogmessages'][$counter]['values'][$mycolkey]['detailimagealign'] = "left"; // Other alignment needed! /* DetailPopup Code not needed anymore foreach($content['syslogmessages'][$counter]['values'] as $mykey => $myfield) { // Set Caption! $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][]['detailfieldtitle']= $content['fields'][$mykey]['FieldCaption']; // Get ArrayIndex $myIndex = count($content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails']) - 1; // --- Set CSS Class if ( $myIndex % 2 == 0 ) $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][$myIndex]['detailscssclass'] = "line1"; else $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][$myIndex]['detailscssclass'] = "line2"; // --- // If message field, we need to handle differently! if ( $mykey == SYSLOG_MESSAGE ) { // Get DetailMsg with linebreaks $szDetailMsg = ReplaceLineBreaksInString(GetStringWithHTMLCodes($logArray[SYSLOG_MESSAGE])); if ( isset($content['highlightwords']) ) $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][$myIndex]['detailfieldvalue'] = HighLightString( $content['highlightwords'], $szDetailMsg); else $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][$myIndex]['detailfieldvalue'] = $szDetailMsg; // --- HOOK here to add context links! AddContextLinks( $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][$myIndex]['detailfieldvalue'] ); // --- } else // Just set field value $content['syslogmessages'][$counter]['values'][$mycolkey]['messagesdetails'][$myIndex]['detailfieldvalue'] = isset($myfield['rawfieldvalue']) ? GetStringWithHTMLCodes($myfield['rawfieldvalue']) : GetStringWithHTMLCodes($myfield['fieldvalue']); } */ } if ( strlen($content['searchstr']) > 0 ) { // Set OnClick Menu for SYSLOG_MESSAGE $content['syslogmessages'][$counter]['values'][$mycolkey]['hasbuttons'] = true; $content['syslogmessages'][$counter]['values'][$mycolkey]['hasdropdownbutton'] = true; $content['syslogmessages'][$counter]['values'][$mycolkey]['buttons'][] = array( 'ButtonUrl' => '?uid=' . $uID, 'ButtonTarget' => '_top', 'ButtonAppendUrl' => true, 'DisplayName' => $content['LN_VIEW_MESSAGECENTERED'], 'IconSource' => $content['MENU_BULLET_GREEN'] ); } } else if ( $mycolkey == SYSLOG_SYSLOGTAG ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_SYSLOGTAG); } else if ( $mycolkey == SYSLOG_HOST ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_HOST); } /* Eventlog based fields */ else if ( $mycolkey == SYSLOG_EVENT_LOGTYPE ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_EVENT_LOGTYPE); } else if ( $mycolkey == SYSLOG_EVENT_SOURCE ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_EVENT_SOURCE); } else if ( $mycolkey == SYSLOG_EVENT_USER ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_EVENT_USER); } // WebServer Type fields else if ( $mycolkey == SYSLOG_WEBLOG_USER ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_USER); } else if ( $mycolkey == SYSLOG_WEBLOG_METHOD ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_METHOD); } else if ( $mycolkey == SYSLOG_WEBLOG_URL ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_URL); } else if ( $mycolkey == SYSLOG_WEBLOG_QUERYSTRING ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_QUERYSTRING); } else if ( $mycolkey == SYSLOG_WEBLOG_PVER ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_PVER); } else if ( $mycolkey == SYSLOG_WEBLOG_REFERER ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_REFERER); } else if ( $mycolkey == SYSLOG_WEBLOG_USERAGENT ) { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, SYSLOG_WEBLOG_USERAGENT); } else { // Add context menu AddOnClickMenu( $content['syslogmessages'][$counter]['values'][$mycolkey], FILTER_TYPE_STRING, $mycolkey); } } } } // --- // Increment Counter $counter++; // --- Extra Loop to get the next entry! // temporary store the current last $uID $lastUid = $uID; do { $ret = $stream->ReadNext($uID, $logArray); } while ( $ret == ERROR_MSG_SKIPMESSAGE ); // --- } while ( $counter < $content['CurrentViewEntriesPerPage'] && ($ret == SUCCESS) ); //print_r ( $content['syslogmessages'] ); // Move below processing - Read First and LAST UID's before start reading the stream! // $content['uid_last'] = $stream->GetLastPageUID(); /// $content['uid_first'] = $stream->GetFirstPageUID(); if ( $content['main_recordcount'] == -1 || $content['main_recordcount'] > $content['CurrentViewEntriesPerPage'] ) { // Enable Pager in any case here! $content['main_pagerenabled'] = true; /* // temporary store the current last $uID $lastUid = $uID; // --- Handle uid_next page button if ( $content['read_direction'] == EnumReadDirection::Backward ) { if ( $stream->ReadNext($uID, $logArray) == SUCCESS && isset($uID) ) { $content['uid_next'] = $uID; $content['main_pager_next_found'] = true; } else if ( $content['uid_current'] != UID_UNKNOWN ) $content['main_pager_next_found'] = false; //echo $content['uid_next'] . "!!!"; } // --- */ /* // --- Handle uid_previous page button if ( $content['uid_current'] != UID_UNKNOWN ) { if ( $content['read_direction'] == EnumReadDirection::Forward ) { if ( $ret == SUCCESS ) { // Try to read the next one! $ret = $stream->ReadNext($uID, $tmp); if ( $ret == SUCCESS ) $content['main_pager_previous_found'] = true; else $content['main_pager_previous_found'] = false; } else $content['main_pager_previous_found'] = false; } else if ( $content['read_direction'] == EnumReadDirection::Backward ) $content['main_pager_previous_found'] = true; } else $content['main_pager_previous_found'] = false; //echo $content['uid_previous']; // --- */ // --- Handle uid_previous page button if ( $content['read_direction'] == EnumReadDirection::Forward ) { if ( $ret == SUCCESS ) { // Try to read the next one! $ret = $stream->ReadNext($uID, $tmp); if ( $ret == SUCCESS ) $content['main_pager_previous_found'] = true; else $content['main_pager_previous_found'] = false; } else $content['main_pager_previous_found'] = false; } else { if ( $content['uid_current'] == $content['uid_previous'] ) $content['main_pager_previous_found'] = false; else $content['main_pager_previous_found'] = true; } // --- // --- Handle uid_last and uid_next page button if ( $content['read_direction'] == EnumReadDirection::Forward ) { if ( $content['uid_current'] == $content['uid_last'] ) { $content['main_pager_last_found'] = false; $content['main_pager_next_found'] = false; } else { $content['main_pager_last_found'] = true; $content['main_pager_next_found'] = true; } // Restore uid_current if necessary $content['uid_current'] = $lastUid; } else { // If last error code was nomorerecords, there are no more pages if ( $ret == ERROR_NOMORERECORDS ) { $content['main_pager_last_found'] = false; $content['main_pager_next_found'] = false; } else { // Set NEXT uid $content['uid_next'] = $uID; $content['main_pager_last_found'] = true; $content['main_pager_next_found'] = true; } } // --- //!!!!!!!! /* // if we found a last uid, and if it is not the current one (which means we already are on the last page ;)! if ( $content['uid_last'] != -1 && $content['uid_last'] != $content['uid_current']) $content['main_pager_last_found'] = true; else $content['main_pager_last_found'] = false; //echo $content['uid_last']; // Handle next button only if Forward is used now! if ( $content['read_direction'] == EnumReadDirection::Forward ) { if ( $content['uid_current'] == $content['uid_last'] ) // Last page already ! $content['main_pager_next_found'] = false; else // User clicked back, so there is a next page for sure $content['main_pager_next_found'] = true; // As we went back, we need to change the currend uid to the latest read one $content['uid_current'] = $lastUid; } */ // --- // --- Handle uid_first page button if ( $content['uid_current'] == $content['uid_first'] ) { $content['main_pager_first_found'] = false; $content['main_pager_previous_found'] = false; // If there is no FIRST, there is no going back! } else if ( !$content['main_pager_previous_found'] ) $content['main_pager_first_found'] = false; else $content['main_pager_first_found'] = true; // --- // $content['uid_first'] /* // --- Handle uid_first page button if ( $content['main_pager_previous_found'] == false || $content['uid_current'] == UID_UNKNOWN || $content['uid_current'] == $content['uid_first'] ) { $content['main_pager_first_found'] = false; $content['main_pager_previous_found'] = false; // If there is no FIRST, there is no going back! } else $content['main_pager_first_found'] = true; // --- */ } else // Disable pager in this case! $content['main_pagerenabled'] = false; if ( $content['read_direction'] == EnumReadDirection::Forward ) { // Back Button was clicked, so we need to flip the array // print_r( $content['syslogmessages'] ); $content['syslogmessages'] = array_reverse ( $content['syslogmessages'] ); // print_r( $content['syslogmessages'] ); } // This will enable to Main SyslogView $content['syslogmessagesenabled'] = "true"; } } else { // This will disable to Main SyslogView and show an error message $content['syslogmessagesenabled'] = "false"; $content['detailederror'] = GetErrorMessage($res); $content['detailederror_code'] = $res; if ( isset($extraErrorDescription) ) $content['detailederror'] .= "

    " . GetAndReplaceLangStr( $content['LN_SOURCES_ERROR_EXTRAMSG'], $extraErrorDescription); } // Close file! $stream->Close(); } else { $content['syslogmessagesenabled'] = "false"; $content['detailederror'] = GetAndReplaceLangStr( $content['LN_GEN_ERROR_SOURCENOTFOUND'], $currentSourceID); $content['detailederror_code'] = ERROR_SOURCENOTFOUND; } // --- // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "index.html"); $page -> output(); // --- // --- BEGIN Define Helper functions function HighLightString($highlightArray, $strmsg) { if ( isset($highlightArray) ) { // TODO OPTIMIZE - USING FONT TAG as SPAN is HIDDEN if MESSAGE POPUP is ENABNLED! foreach( $highlightArray as $highlightword ) $strmsg = preg_replace( "/(" . $highlightword['highlight'] . ")/i", '\\1', $strmsg ); } // return result return $strmsg; } /* * Prepare a string for search! spaces will be replaces with a single + * + will be replaced with a double ++ */ function PrepareStringForSearch($myString) { // Create Find & Replace arrays $searchArray = array("+", " "); $replaceArray = array("++", "+"); // str_replace(' ', '+', $logArray[$mycolkey]); return str_replace($searchArray, $replaceArray, $myString); } function AddOnClickMenu(&$fieldGridItem, $fieldType, $FieldID) { global $content, $fields, $myStrCharLimit; if ( strlen($fieldGridItem['fieldvalue']) <= 0 ) { $fieldGridItem['hasbuttons'] = false; return; } else // Enable OnClick Menu $fieldGridItem['hasbuttons'] = true; // Set Field Caption if ( isset($content['fields'][$FieldID]['FieldCaption']) && strlen( $content['fields'][$FieldID]['FieldCaption']) > 0 ) $szFieldDisplayName = $content['fields'][$FieldID]['FieldCaption']; else $szFieldDisplayName = $FieldID; // Set FieldSearch Value if ( $fieldType == FILTER_TYPE_STRING && isset($fieldGridItem['encodedfieldvalue']) ) { $szEncodedFieldValue = urlencode($fieldGridItem['encodedfieldvalue']); } else $szEncodedFieldValue = $fieldGridItem['fieldvalue']; // Set FieldSearchName if ( isset($fields[$FieldID]['SearchField']) ) $szSearchFieldName = $fields[$FieldID]['SearchField']; else $szSearchFieldName = $FieldID; // Menu Option to append filter if ( strlen($content['searchstr']) > 0 ) { $fieldGridItem['buttons'][] = array( 'ButtonUrl' => '?filter=' . urlencode($content['searchstr']) . '+' . $szSearchFieldName . '%3A%3D' . $szEncodedFieldValue . '&search=Search' . $content['additional_url_sourceonly'], 'ButtonTarget' => '_top', 'ButtonAppendUrl' => true, 'DisplayName' => GetAndReplaceLangStr($content['LN_VIEW_ADDTOFILTER'], $fieldGridItem['fieldvalue']), 'IconSource' => $content['MENU_BULLET_GREEN'] ); $fieldGridItem['buttons'][] = array( 'ButtonUrl' => '?filter=' . urlencode($content['searchstr']) . '+' . $szSearchFieldName . '%3A-%3D' . $szEncodedFieldValue . '&search=Search' . $content['additional_url_sourceonly'], 'ButtonTarget' => '_top', 'ButtonAppendUrl' => true, 'DisplayName' => GetAndReplaceLangStr($content['LN_VIEW_EXCLUDEFILTER'], $fieldGridItem['fieldvalue']), 'IconSource' => $content['MENU_BULLET_GREEN'] ); } // More Menu entries $fieldGridItem['buttons'][] = array( 'ButtonUrl' => '?filter=' . $szSearchFieldName . '%3A%3D' . $szEncodedFieldValue . '&search=Search' . $content['additional_url_sourceonly'], 'ButtonTarget' => '_top', 'ButtonAppendUrl' => true, 'DisplayName' => GetAndReplaceLangStr($content['LN_VIEW_FILTERFORONLY'], $fieldGridItem['fieldvalue']), 'IconSource' => $content['MENU_BULLET_BLUE'] ); $fieldGridItem['buttons'][] = array( 'ButtonUrl' => '?filter=' . $szSearchFieldName . '%3A-%3D' . $szEncodedFieldValue . '&search=Search' . $content['additional_url_sourceonly'], 'ButtonTarget' => '_top', 'ButtonAppendUrl' => true, 'DisplayName' => GetAndReplaceLangStr($content['LN_VIEW_SHOWALLBUT'], $fieldGridItem['fieldvalue']), 'IconSource' => $content['MENU_BULLET_BLUE'] ); // Add Online Search Button if ( isset($fields[$FieldID]['SearchOnline']) && $fields[$FieldID]['SearchOnline'] && strlen($fieldGridItem['fieldvalue']) > 0 ) { $fieldGridItem['buttons'][] = array( 'ButtonUrl' => 'http://kb.monitorware.com/kbsearch.php?sa=Search&origin=phplogcon&oid=' . $FieldID . '&q=' . $szEncodedFieldValue, 'ButtonTarget' => '_top', 'ButtonAppendUrl' => true, 'DisplayName' => $content['LN_VIEW_SEARCHFOR'] . " " . $szFieldDisplayName . " '" . $fieldGridItem['fieldvalue'] . "'", 'IconSource' => $content['MENU_NETWORK'] ); if ( GetConfigSetting("InlineOnlineSearchIcons", 1, CFGLEVEL_USER) == 1 ) { // Enable SearchOnline Icon $fieldGridItem['searchonline'] = true; $fieldGridItem['SearchOnlineUrl'] = 'http://kb.monitorware.com/kbsearch.php?sa=Search&origin=phplogcon&oid=' . $FieldID . '&q=' . $szEncodedFieldValue; } } // Search for links within the fieldcontent! if ( $fieldType == FILTER_TYPE_STRING && preg_match("#([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", $fieldGridItem['rawfieldvalue'], $szLink) >= 1 ) { $fieldGridItem['buttons'][] = array( 'ButtonUrl' => $szLink[0], 'ButtonTarget' => '_blank', 'ButtonAppendUrl' => false, 'DisplayName' => GetAndReplaceLangStr($content['LN_VIEW_VISITLINK'], strlen($szLink[0]) > $myStrCharLimit ? substr($szLink[0], 0, $myStrCharLimit) . "..." : $szLink[0] ), 'IconSource' => $content['MENU_NETWORK'] ); } } // --- ?>loganalyzer-4.1.5/src/install.php000066400000000000000000001230451277740250400170330ustar00rootroot00000000000000 Installer File * * All directives are explained within this file * * Copyright (C) 2008-2010 Adiscon GmbH. * * This file is part of LogAnalyzer. * * LogAnalyzer 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 3 of the License, or * (at your option) any later version. * * LogAnalyzer 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 LogAnalyzer. If not, see . * * A copy of the GPL can be found in the file "COPYING" in this * distribution * * Adiscon LogAnalyzer is also available under a commercial license. * For details, contact info@adiscon.com or visit * http://loganalyzer.adiscon.com/commercial ********************************************************************* */ // *** Default includes and procedures *** // define('IN_PHPLOGCON', true); define('IN_PHPLOGCON_INSTALL', true); // Extra for INSTALL Script! define('STEPSCRIPTNAME', "install.php"); // Helper variable for the STEP helper functions $gl_root_path = './'; // Now include necessary include files! include($gl_root_path . 'include/functions_common.php'); include($gl_root_path . 'include/functions_frontendhelpers.php'); include($gl_root_path . 'include/functions_installhelpers.php'); // Init Langauge first! IncludeLanguageFile( $gl_root_path . '/lang/' . $LANG . '/main.php' ); InitBasicPhpLogCon(); if ( InitPhpLogConConfigFile(false) ) DieWithErrorMsg( $content['LN_INSTALL_ERRORINSTALLED'] ); // Set some static values define('MAX_STEPS', 8); $content['web_theme'] = "default"; $content['user_theme'] = "default"; $configsamplefile = $content['BASEPATH'] . "include/config.sample.php"; $content['HeaderDefaultEncoding'] = ENC_ISO_8859_1; // Set Default encoding! // New Set Font settingdefaults InitFontSettings(); //ini_set('error_reporting', E_ALL); // DEBUG ENABLE // *** *** // // --- CONTENT Vars $content['TITLE'] = "LogAnalyzer :: " . $content['LN_INSTALL_TITLE']; // --- // --- Read Vars if ( isset($_GET['step']) ) { $content['INSTALL_STEP'] = intval(DB_RemoveBadChars($_GET['step'])); if ( $content['INSTALL_STEP'] > MAX_STEPS ) $content['INSTALL_STEP'] = 1; } else $content['INSTALL_STEP'] = 1; // Set Next Step $content['INSTALL_NEXT_STEP'] = $content['INSTALL_STEP']; if ( MAX_STEPS > $content['INSTALL_STEP'] ) { $content['NEXT_ENABLED'] = "true"; $content['FINISH_ENABLED'] = "false"; $content['INSTALL_NEXT_STEP']++; } else { $content['NEXT_ENABLED'] = "false"; $content['FINISH_ENABLED'] = "true"; } // --- // --- BEGIN Custom Code // --- Set Bar Image $content['BarImagePlus'] = $gl_root_path . "images/bars/bar-middle/green_middle_17.png"; $content['BarImageLeft'] = $gl_root_path . "images/bars/bar-middle/green_left_17.png"; $content['BarImageRight'] = $gl_root_path . "images/bars/bar-middle/green_right_17.png"; $content['WidthPlus'] = intval( $content['INSTALL_STEP'] * (100 / MAX_STEPS) ) - 8; $content['WidthPlusText'] = "Installer Step " . $content['INSTALL_STEP']; // --- // --- Set Title $content['TITLE'] = GetAndReplaceLangStr( $content['TITLE'], $content['INSTALL_STEP'] ); $content['INSTALL_TITLETOP'] = GetAndReplaceLangStr( $content['LN_INSTALL_TITLETOP'], $content['BUILDNUMBER'], $content['INSTALL_STEP'] ); // --- // --- Start Setup Processing if ( $content['INSTALL_STEP'] == 2 ) { // Check if file permissions are correctly $content['fileperm'][0]['FILE_NAME'] = $content['BASEPATH'] . "config.php"; $content['fileperm'][0]['FILE_TYPE'] = "file"; // $content['fileperm'][1]['FILE_NAME'] = $content['BASEPATH'] . "gamelogs/"; // $content['fileperm'][1]['FILE_TYPE'] = "dir"; // Check file by file $bSuccess = true; for($i = 0; $i < count($content['fileperm']); $i++) { // --- Set CSS Class if ( $i % 2 == 0 ) $content['fileperm'][$i]['cssclass'] = "line1"; else $content['fileperm'][$i]['cssclass'] = "line2"; // --- if ( $content['fileperm'][$i]['FILE_TYPE'] == "dir" ) { // Get Permission mask $perms = fileperms( $content['fileperm'][$i]['FILE_NAME'] ); // World $iswriteable = (($perms & 0x0004) ? true : false) && (($perms & 0x0002) ? true : false); if ( $iswriteable ) { $content['fileperm'][$i]['BGCOLOR'] = "#007700"; $content['fileperm'][$i]['ISSUCCESS'] = "Writeable"; } else { $content['fileperm'][$i]['BGCOLOR'] = "#770000"; $content['fileperm'][$i]['ISSUCCESS'] = "NOT Writeable"; $bSuccess = false; } } else { if ( !is_file($content['fileperm'][$i]['FILE_NAME']) ) { // Try to create an empty file @touch($content['fileperm'][$i]['FILE_NAME']); } if ( is_file($content['fileperm'][$i]['FILE_NAME']) ) { if ( is_writable($content['fileperm'][$i]['FILE_NAME']) ) { $content['fileperm'][$i]['BGCOLOR'] = "#007700"; $content['fileperm'][$i]['ISSUCCESS'] = "Writeable"; } else { $content['fileperm'][$i]['BGCOLOR'] = "#770000"; $content['fileperm'][$i]['ISSUCCESS'] = "NOT Writeable"; $bSuccess = false; } } else { $content['fileperm'][$i]['BGCOLOR'] = "#770000"; $content['fileperm'][$i]['ISSUCCESS'] = "File does NOT exist!"; $bSuccess = false; } } } if ( !$bSuccess ) { $content['NEXT_ENABLED'] = "false"; $content['RECHECK_ENABLED'] = "true"; $content['iserror'] = "true"; $content['errormsg'] = $content['LN_INSTALL_FILEORDIRNOTWRITEABLE']; } // Check if sample config file is available if ( !is_file($configsamplefile) || GetFileLength($configsamplefile) <= 0 ) { $content['NEXT_ENABLED'] = "false"; $content['RECHECK_ENABLED'] = "true"; $content['iserror'] = "true"; $content['errormsg'] = GetAndReplaceLangStr( $content['LN_INSTALL_SAMPLECONFIGMISSING'], $configsamplefile); } } else if ( $content['INSTALL_STEP'] == 3 ) { // --- Read and predefine Database options if ( isset($_SESSION['UserDBEnabled']) ) { $content['UserDBEnabled'] = $_SESSION['UserDBEnabled']; } else { $content['UserDBEnabled'] = false; } if ( isset($_SESSION['UserDBServer']) ) { $content['UserDBServer'] = $_SESSION['UserDBServer']; } else { $content['UserDBServer'] = "localhost"; } if ( isset($_SESSION['UserDBPort']) ) { $content['UserDBPort'] = $_SESSION['UserDBPort']; } else { $content['UserDBPort'] = "3306"; } if ( isset($_SESSION['UserDBName']) ) { $content['UserDBName'] = $_SESSION['UserDBName']; } else { $content['UserDBName'] = "loganalyzer"; } if ( isset($_SESSION['UserDBPref']) ) { $content['UserDBPref'] = $_SESSION['UserDBPref']; } else { $content['UserDBPref'] = "logcon_"; } if ( isset($_SESSION['UserDBUser']) ) { $content['UserDBUser'] = $_SESSION['UserDBUser']; } else { $content['UserDBUser'] = "user"; } if ( isset($_SESSION['UserDBPass']) ) { $content['UserDBPass'] = $_SESSION['UserDBPass']; } else { $content['UserDBPass'] = ""; } if ( isset($_SESSION['UserDBLoginRequired']) ) { $content['UserDBLoginRequired'] = $_SESSION['UserDBLoginRequired']; } else { $content['UserDBLoginRequired'] = false; } // Init Auth Options if ( isset($_SESSION['UserDBAuthMode']) ) { $content['UserDBAuthMode'] = $_SESSION['UserDBAuthMode']; } else { $content['UserDBAuthMode'] = USERDB_AUTH_INTERNAL; } CreateAuthTypesList($content['UserDBAuthMode']); // LDAP related properties if ( isset($_SESSION['LDAPServer']) ) { $content['LDAPServer'] = $_SESSION['LDAPServer']; } else { $content['LDAPServer'] = "localhost"; } if ( isset($_SESSION['LDAPPort']) ) { $content['LDAPPort'] = $_SESSION['LDAPPort']; } else { $content['LDAPPort'] = "389"; } if ( isset($_SESSION['LDAPBaseDN']) ) { $content['LDAPBaseDN'] = $_SESSION['LDAPBaseDN']; } else { $content['LDAPBaseDN'] = "CN=Users,DC=domain,DC=local"; } if ( isset($_SESSION['LDAPSearchFilter']) ) { $content['LDAPSearchFilter'] = $_SESSION['LDAPSearchFilter']; } else { $content['LDAPSearchFilter'] = "(objectClass=user)"; } if ( isset($_SESSION['LDAPUidAttribute']) ) { $content['LDAPUidAttribute'] = $_SESSION['LDAPUidAttribute']; } else { $content['LDAPUidAttribute'] = "sAMAccountName"; } if ( isset($_SESSION['LDAPBindDN']) ) { $content['LDAPBindDN'] = $_SESSION['LDAPBindDN']; } else { $content['LDAPBindDN'] = "CN=Searchuser,CN=Users,DC=domain,DC=local"; } if ( isset($_SESSION['LDAPBindPassword']) ) { $content['LDAPBindPassword'] = $_SESSION['LDAPBindPassword']; } else { $content['LDAPBindPassword'] = "Password"; } if ( isset($_SESSION['LDAPDefaultAdminUser']) ) { $content['LDAPDefaultAdminUser'] = $_SESSION['LDAPDefaultAdminUser']; } else { $content['LDAPDefaultAdminUser'] = "Administrator"; } // Set template variables if ( $content['UserDBEnabled'] == 1 ) { $content['UserDBEnabled_true'] = "checked"; $content['UserDBEnabled_false'] = ""; } else { $content['UserDBEnabled_true'] = ""; $content['UserDBEnabled_false'] = "checked"; } if ( $content['UserDBLoginRequired'] == 1 ) { $content['UserDBLoginRequired_true'] = "checked"; $content['UserDBLoginRequired_false'] = ""; } else { $content['UserDBLoginRequired_true'] = ""; $content['UserDBLoginRequired_false'] = "checked"; } // --- // --- Read and predefine Frontend options if ( isset($_SESSION['ViewMessageCharacterLimit']) ) { $content['ViewMessageCharacterLimit'] = $_SESSION['ViewMessageCharacterLimit']; } else { $content['ViewMessageCharacterLimit'] = 80; } if ( isset($_SESSION['ViewStringCharacterLimit']) ) { $content['ViewStringCharacterLimit'] = $_SESSION['ViewStringCharacterLimit']; } else { $content['ViewStringCharacterLimit'] = 30; } if ( isset($_SESSION['ViewEntriesPerPage']) ) { $content['ViewEntriesPerPage'] = $_SESSION['ViewEntriesPerPage']; } else { $content['ViewEntriesPerPage'] = 50; } if ( isset($_SESSION['ViewEnableDetailPopups']) ) { $content['ViewEnableDetailPopups'] = $_SESSION['ViewEnableDetailPopups']; } else { $content['ViewEnableDetailPopups'] = 1; } if ( $content['ViewEnableDetailPopups'] == 1 ) { $content['ViewEnableDetailPopups_true'] = "checked"; $content['ViewEnableDetailPopups_false'] = ""; } else { $content['ViewEnableDetailPopups_true'] = ""; $content['ViewEnableDetailPopups_false'] = "checked"; } if ( isset($_SESSION['EnableIPAddressResolve']) ) { $content['EnableIPAddressResolve'] = $_SESSION['EnableIPAddressResolve']; } else { $content['EnableIPAddressResolve'] = 1; } if ( $content['EnableIPAddressResolve'] == 1 ) { $content['EnableIPAddressResolve_true'] = "checked"; $content['EnableIPAddressResolve_false'] = ""; } else { $content['EnableIPAddressResolve_true'] = ""; $content['EnableIPAddressResolve_false'] = "checked"; } // --- // Disable the bottom next button, as the Form in this step has its own button! // $content['NEXT_ENABLED'] = "false"; // Check for Error Msg if ( isset($_GET['errormsg']) ) { $content['iserror'] = "true"; $content['errormsg'] = urldecode( DB_StripSlahes($_GET['errormsg']) ); } } else if ( $content['INSTALL_STEP'] == 4 ) { // --- Read Database Vars if ( isset($_POST['UserDBEnabled']) ) { $_SESSION['UserDBEnabled'] = DB_RemoveBadChars($_POST['UserDBEnabled']); if ( $_SESSION['UserDBEnabled'] == 1 ) { // Read vars if ( isset($_POST['UserDBServer']) ) $_SESSION['UserDBServer'] = DB_RemoveBadChars($_POST['UserDBServer']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBSERVER'] ); if ( isset($_POST['UserDBPort']) ) $_SESSION['UserDBPort'] = intval(DB_RemoveBadChars($_POST['UserDBPort'])); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBPORT'] ); if ( isset($_POST['UserDBName']) ) $_SESSION['UserDBName'] = DB_RemoveBadChars($_POST['UserDBName']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBNAME'] ); if ( isset($_POST['UserDBPref']) ) $_SESSION['UserDBPref'] = DB_RemoveBadChars($_POST['UserDBPref']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBPREF'] ); if ( isset($_POST['UserDBUser']) ) $_SESSION['UserDBUser'] = DB_RemoveBadChars($_POST['UserDBUser']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBUSER'] ); if ( isset($_POST['UserDBPass']) ) $_SESSION['UserDBPass'] = DB_RemoveBadChars($_POST['UserDBPass']); else $_SESSION['UserDBPass'] = ""; if ( isset($_POST['UserDBLoginRequired']) ) $_SESSION['UserDBLoginRequired'] = intval(DB_RemoveBadChars($_POST['UserDBLoginRequired'])); else $_SESSION['UserDBLoginRequired'] = false; if ( isset($_POST['UserDBAuthMode']) ) $_SESSION['UserDBAuthMode'] = intval(DB_RemoveBadChars($_POST['UserDBAuthMode'])); else $_SESSION['UserDBAuthMode'] = USERDB_AUTH_INTERNAL; // LDAP Properties if ( $_SESSION['UserDBAuthMode'] == USERDB_AUTH_LDAP ) { if ( isset($_POST['LDAPServer']) ) $_SESSION['LDAPServer'] = DB_RemoveBadChars($_POST['LDAPServer']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPServer'] ); if ( isset($_POST['LDAPPort']) ) $_SESSION['LDAPPort'] = intval(DB_RemoveBadChars($_POST['LDAPPort'])); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPPort'] ); if ( isset($_POST['LDAPBaseDN']) ) $_SESSION['LDAPBaseDN'] = DB_RemoveBadChars($_POST['LDAPBaseDN']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPBaseDN'] ); if ( isset($_POST['LDAPSearchFilter']) ) $_SESSION['LDAPSearchFilter'] = DB_RemoveBadChars($_POST['LDAPSearchFilter']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPSearchFilter'] ); if ( isset($_POST['LDAPUidAttribute']) ) $_SESSION['LDAPUidAttribute'] = DB_RemoveBadChars($_POST['LDAPUidAttribute']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPUidAttribute'] ); if ( isset($_POST['LDAPBindDN']) ) $_SESSION['LDAPBindDN'] = DB_RemoveBadChars($_POST['LDAPBindDN']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPBindDN'] ); if ( isset($_POST['LDAPBindPassword']) ) $_SESSION['LDAPBindPassword'] = DB_RemoveBadChars($_POST['LDAPBindPassword']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPBindPassword'] ); if ( isset($_POST['LDAPDefaultAdminUser']) ) $_SESSION['LDAPDefaultAdminUser'] = DB_RemoveBadChars($_POST['LDAPDefaultAdminUser']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LDAPDefaultAdminUser'] ); } // Now Check database connect $link_id = mysql_connect( $_SESSION['UserDBServer'], $_SESSION['UserDBUser'], $_SESSION['UserDBPass']); if (!$link_id) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr( $content['LN_INSTALL_ERRORCONNECTFAILED'], $_SESSION['UserDBServer']) . "
    " . DB_ReturnSimpleErrorMsg() ); // Try to select the DB! $db_selected = mysql_select_db($_SESSION['UserDBName'], $link_id); if(!$db_selected) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr( $content['LN_INSTALL_ERRORACCESSDENIED'], $_SESSION['UserDBName']) . "
    " . DB_ReturnSimpleErrorMsg()); } } // --- // --- Read Frontend Vars if ( isset($_POST['ViewMessageCharacterLimit']) ) { $_SESSION['ViewMessageCharacterLimit'] = intval( DB_RemoveBadChars($_POST['ViewMessageCharacterLimit']) ); if ( $_SESSION['ViewMessageCharacterLimit'] < 0 ) $_SESSION['ViewMessageCharacterLimit'] = 80; // Fallback default! } else $_SESSION['ViewMessageCharacterLimit'] = 80; // Fallback default! if ( isset($_POST['ViewStringCharacterLimit']) ) { $_SESSION['ViewStringCharacterLimit'] = intval( DB_RemoveBadChars($_POST['ViewStringCharacterLimit']) ); if ( $_SESSION['ViewStringCharacterLimit'] < 0 ) $_SESSION['ViewStringCharacterLimit'] = 30; // Fallback default! } else $_SESSION['ViewStringCharacterLimit'] = 30; // Fallback default! if ( isset($_POST['ViewEntriesPerPage']) ) { $_SESSION['ViewEntriesPerPage'] = intval( DB_RemoveBadChars($_POST['ViewEntriesPerPage']) ); if ( $_SESSION['ViewEntriesPerPage'] < 0 ) $_SESSION['ViewEntriesPerPage'] = 50; // Fallback default! } else $_SESSION['ViewEntriesPerPage'] = 50; // Fallback default! if ( isset($_POST['ViewEnableDetailPopups']) ) $_SESSION['ViewEnableDetailPopups'] = intval( DB_RemoveBadChars($_POST['ViewEnableDetailPopups']) ); else $_SESSION['ViewEnableDetailPopups'] = 1; // Fallback default! if ( isset($_POST['EnableIPAddressResolve']) ) $_SESSION['EnableIPAddressResolve'] = intval( DB_RemoveBadChars($_POST['EnableIPAddressResolve']) ); else $_SESSION['EnableIPAddressResolve'] = 1; // Fallback default! // --- // If UserDB is disabled, skip next step! if ( $_SESSION['UserDBEnabled'] == 0 ) ForwardOneStep(); else { if ( $_SESSION['UserDBAuthMode'] == USERDB_AUTH_LDAP ) { // We need the user system now! ini_set('error_reporting', E_WARNING); // Enable Warnings! InitUserDbSettings(); // We need some DB Settings InitUserSystemPhpLogCon(); // LDAP Variables $content['LDAPServer'] = $_SESSION['LDAPServer']; $content['LDAPPort'] = $_SESSION['LDAPPort']; $content['LDAPBindDN'] = $_SESSION['LDAPBindDN']; $content['LDAPBindPassword'] = $_SESSION['LDAPBindPassword']; // try LDAP Connect! $ldapConn = DoLDAPConnect(); if ( $ldapConn ) { $bBind = DoLDAPBind($ldapConn); if ( !$bBind ) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr( $content['LN_LOGIN_LDAP_USERBINDFAILED'], $_SESSION['LDAPBindDN']) ); } else RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr( $content['LN_INSTALL_LDAPCONNECTFAILED'], $_SESSION['LDAPServer']) ); } } } else if ( $content['INSTALL_STEP'] == 5 ) { $content['sql_sucess'] = 0; $content['sql_failed'] = 0; // Import default database if user db is enabled! if ( $_SESSION['UserDBEnabled'] == 1 ) { // Init $totaldbdefs $totaldbdefs = ""; // Read the table GLOBAL definitions ImportDataFile( $content['BASEPATH'] . "include/db_template.txt" ); // Process definitions ^^ if ( strlen($totaldbdefs) <= 0 ) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = GetAndReplaceLangStr( $content['LN_INSTALL_ERRORINVALIDDBFILE'], $content['BASEPATH'] . "include/db_template.txt"); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = ""; $content['sql_failed']++; } // Replace stats_ with the custom one ;) $totaldbdefs = str_replace( "`logcon_", "`" . $_SESSION["UserDBPref"], $totaldbdefs ); // Now split by sql command // $mycommands = split( ";\n", $totaldbdefs ); DEPRECEATED CALL! $mycommands = preg_split('/;\n/', $totaldbdefs, -1, PREG_SPLIT_NO_EMPTY); // // check for different linefeed // if ( count($mycommands) <= 1 ) // $mycommands = split( ";\n", $totaldbdefs ); //Still only one? Abort if ( count($mycommands) <= 1 ) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = GetAndReplaceLangStr( $content['LN_INSTALL_ERRORINSQLCOMMANDS'], $content['BASEPATH'] . "include/db_template.txt"); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = ""; $content['sql_failed']++; } // Append INSERT Statement for Config Table to set the Database Version ^^! $mycommands[count($mycommands)] = "INSERT INTO `" . $_SESSION["UserDBPref"] . "config` (`propname`, `propvalue`, `is_global`) VALUES ('database_installedversion', '" . $content['database_internalversion'] . "', 1)"; // --- Now execute all commands ini_set('error_reporting', E_WARNING); // Enable Warnings! InitUserDbSettings(); // Establish DB Connection DB_Connect(); for($i = 0; $i < count($mycommands); $i++) { if ( strlen(trim($mycommands[$i])) > 1 ) { $result = DB_Query( $mycommands[$i], false ); if ($result == FALSE) { $content['failedstatements'][ $content['sql_failed'] ]['myerrmsg'] = DB_ReturnSimpleErrorMsg(); $content['failedstatements'][ $content['sql_failed'] ]['mystatement'] = $mycommands[$i]; // --- Set CSS Class if ( $content['sql_failed'] % 2 == 0 ) $content['failedstatements'][ $content['sql_failed'] ]['cssclass'] = "line1"; else $content['failedstatements'][ $content['sql_failed'] ]['cssclass'] = "line2"; // --- $content['sql_failed']++; } else $content['sql_sucess']++; // Free result DB_FreeQuery($result); } } } else // Skip this step in this case! ForwardOneStep(); } else if ( $content['INSTALL_STEP'] == 6 ) { if ( $_SESSION['UserDBEnabled'] == 1 ) { if ( $_SESSION['UserDBAuthMode'] == USERDB_AUTH_INTERNAL ) { if ( isset($_SESSION['MAIN_Username']) ) $content['MAIN_Username'] = $_SESSION['MAIN_Username']; else $content['MAIN_Username'] = ""; $content['MAIN_Password1'] = ""; $content['MAIN_Password2'] = ""; // Check for Error Msg if ( isset($_GET['errormsg']) ) { $content['iserror'] = "true"; $content['errormsg'] = urldecode( DB_StripSlahes($_GET['errormsg']) ); } } else // USERDB_AUTH_LDAP does not need this steo! ForwardOneStep(); } else // NO Database means NO user management, so next step! ForwardOneStep(); } else if ( $content['INSTALL_STEP'] == 7 ) { if ( $_SESSION['UserDBEnabled'] == 1 ) { if ( $_SESSION['UserDBAuthMode'] == USERDB_AUTH_INTERNAL ) { if ( isset($_POST['username']) ) $_SESSION['MAIN_Username'] = DB_RemoveBadChars($_POST['username']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_INSTALL_MISSINGUSERNAME'] ); if ( isset($_POST['password1']) ) $_SESSION['MAIN_Password1'] = DB_RemoveBadChars($_POST['password1']); else $_SESSION['MAIN_Password1'] = ""; if ( isset($_POST['password2']) ) $_SESSION['MAIN_Password2'] = DB_RemoveBadChars($_POST['password2']); else $_SESSION['MAIN_Password2'] = ""; if ( strlen($_SESSION['MAIN_Password1']) < 4 || $_SESSION['MAIN_Password1'] != $_SESSION['MAIN_Password2'] ) RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_INSTALL_PASSWORDNOTMATCH'] ); } else if ( $_SESSION['UserDBAuthMode'] == USERDB_AUTH_LDAP ) { $_SESSION['MAIN_Username'] = $_SESSION['LDAPDefaultAdminUser']; $_SESSION['MAIN_Password1'] = ""; $_SESSION['MAIN_Password2'] = ""; } // --- Now execute all commands ini_set('error_reporting', E_WARNING); // Enable Warnings! InitUserDbSettings(); // We need some DB Settings InitUserSystemPhpLogCon(); // We need the user system now! // Establish DB Connection DB_Connect(); // Everything is fine, lets go create the User! CreateUserName( $_SESSION['MAIN_Username'], $_SESSION['MAIN_Password1'], 1 ); // Show User success! $content['MAIN_Username'] = $_SESSION['MAIN_Username']; $content['createduser'] = true; } // Init Source Options if ( isset($_SESSION['SourceType']) ) { $content['SourceType'] = $_SESSION['SourceType']; } else { $content['SourceType'] = SOURCE_DISK; } CreateSourceTypesList($content['SourceType']); if ( isset($_SESSION['SourceName']) ) { $content['SourceName'] = $_SESSION['SourceName']; } else { $content['SourceName'] = "My Syslog Source"; } // Init default View if ( isset($_SESSION['SourceViewID']) ) { $content['SourceViewID'] = $_SESSION['SourceViewID']; } else { $content['SourceViewID'] = 'SYSLOG'; } foreach ( $content['Views'] as $myView ) { if ( $myView['ID'] == $content['SourceViewID'] ) $content['Views'][ $myView['ID'] ]['selected'] = "selected"; else $content['Views'][ $myView['ID'] ]['selected'] = ""; } // SOURCE_DISK specific if ( isset($_SESSION['SourceLogLineType']) ) { $content['SourceLogLineType'] = $_SESSION['SourceLogLineType']; } else { $content['SourceLogLineType'] = ""; } CreateLogLineTypesList($content['SourceLogLineType']); if ( isset($_SESSION['SourceDiskFile']) ) { $content['SourceDiskFile'] = $_SESSION['SourceDiskFile']; } else { $content['SourceDiskFile'] = "/var/log/syslog"; } // SOURCE_DB specific if ( isset($_SESSION['SourceDBType']) ) { $content['SourceDBType'] = $_SESSION['SourceDBType']; } else { $content['SourceDBType'] = DB_MYSQL; } CreateDBTypesList($content['SourceDBType']); if ( isset($_SESSION['SourceDBTableType']) ) { $content['SourceDBTableType'] = $_SESSION['SourceDBTableType']; } else { $content['SourceDBTableType'] = "monitorware"; } CreateDBMappingsList($content['SourceDBTableType']); if ( isset($_SESSION['SourceDBName']) ) { $content['SourceDBName'] = $_SESSION['SourceDBName']; } else { $content['SourceDBName'] = "loganalyzer"; } if ( isset($_SESSION['SourceDBServer']) ) { $content['SourceDBServer'] = $_SESSION['SourceDBServer']; } else { $content['SourceDBServer'] = "localhost"; } if ( isset($_SESSION['SourceDBTableName']) ) { $content['SourceDBTableName'] = $_SESSION['SourceDBTableName']; } else { $content['SourceDBTableName'] = "systemevents"; } if ( isset($_SESSION['SourceDBUser']) ) { $content['SourceDBUser'] = $_SESSION['SourceDBUser']; } else { $content['SourceDBUser'] = "user"; } if ( isset($_SESSION['SourceDBPassword']) ) { $content['SourceDBPassword'] = $_SESSION['SourceDBPassword']; } else { $content['SourceDBPassword'] = ""; } if ( isset($_SESSION['SourceDBEnableRowCounting']) ) { $content['SourceDBEnableRowCounting'] = $_SESSION['SourceDBEnableRowCounting']; } else { $content['SourceDBEnableRowCounting'] = "false"; } if ( $content['SourceDBEnableRowCounting'] == "true" ) { $content['SourceDBEnableRowCounting_true'] = "checked"; $content['SourceDBEnableRowCounting_false'] = ""; } else { $content['SourceDBEnableRowCounting_true'] = ""; $content['SourceDBEnableRowCounting_false'] = "checked"; } // Check for Error Msg if ( isset($_GET['errormsg']) ) { $content['iserror'] = "true"; $content['errormsg'] = urldecode( DB_StripSlahes($_GET['errormsg']) ); } } else if ( $content['INSTALL_STEP'] == 8 ) { // --- Write Config File! // Read vars if ( isset($_POST['SourceType']) ) $_SESSION['SourceType'] = DB_RemoveBadChars($_POST['SourceType']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_SOURCETYPE'] ); if ( isset($_POST['SourceName']) ) $_SESSION['SourceName'] = DB_RemoveBadChars($_POST['SourceName']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_NAMEOFTHESOURCE'] ); if ( isset($_POST['SourceViewID']) ) $_SESSION['SourceViewID'] = DB_RemoveBadChars($_POST['SourceViewID']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_VIEW'] ); // Check DISK Parameters! if ( $_SESSION['SourceType'] == SOURCE_DISK) { if ( isset($_POST['SourceLogLineType']) ) $_SESSION['SourceLogLineType'] = DB_RemoveBadChars($_POST['SourceLogLineType']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_LOGLINETYPE'] ); if ( isset($_POST['SourceDiskFile']) ) $_SESSION['SourceDiskFile'] = DB_RemoveBadChars($_POST['SourceDiskFile']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_SYSLOGFILE'] ); // Check if access to the configured file is possible if ( !is_file($_SESSION['SourceDiskFile']) ) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr($content['LN_INSTALL_FAILEDTOOPENSYSLOGFILE'], $_SESSION['SourceDiskFile']) ); } // DB Params else if ( $_SESSION['SourceType'] == SOURCE_DB || $_SESSION['SourceType'] == SOURCE_PDO || $_SESSION['SourceType'] == SOURCE_MONGODB ) { if ( isset($_POST['SourceDBType']) ) $_SESSION['SourceDBType'] = DB_RemoveBadChars($_POST['SourceDBType']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DATABASETYPEOPTIONS'] ); if ( isset($_POST['SourceDBName']) ) $_SESSION['SourceDBName'] = DB_RemoveBadChars($_POST['SourceDBName']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBNAME'] ); if ( isset($_POST['SourceDBTableType']) ) $_SESSION['SourceDBTableType'] = DB_RemoveBadChars($_POST['SourceDBTableType']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBTABLETYPE'] ); if ( isset($_POST['SourceDBServer']) ) $_SESSION['SourceDBServer'] = DB_RemoveBadChars($_POST['SourceDBServer']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBSERVER'] ); if ( isset($_POST['SourceDBTableName']) ) $_SESSION['SourceDBTableName'] = DB_RemoveBadChars($_POST['SourceDBTableName']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBTABLENAME'] ); if ( isset($_POST['SourceDBUser']) ) $_SESSION['SourceDBUser'] = DB_RemoveBadChars($_POST['SourceDBUser']); else RevertOneStep( $content['INSTALL_STEP']-1, $content['LN_CFG_PARAMMISSING'] . $content['LN_CFG_DBUSER'] ); if ( isset($_POST['SourceDBPassword']) ) $_SESSION['SourceDBPassword'] = DB_RemoveBadChars($_POST['SourceDBPassword']); else $_SESSION['SourceDBPassword'] = ""; if ( isset($_POST['SourceDBEnableRowCounting']) ) { $_SESSION['SourceDBEnableRowCounting'] = DB_RemoveBadChars($_POST['SourceDBEnableRowCounting']); if ( $_SESSION['SourceDBEnableRowCounting'] != "true" ) $_SESSION['SourceDBEnableRowCounting'] = "false"; } // Check Database Access! } // If we reached this point, we have gathered all necessary information to create our configuration file ;)! $filebuffer = LoadDataFile($configsamplefile); // Set helper variables and init user vars if needed! if ( isset($_SESSION['UserDBEnabled']) && $_SESSION['UserDBEnabled'] ) { $_SESSION['UserDBEnabled_value'] = "true"; } else { $_SESSION['UserDBEnabled_value'] = "false"; } if ( isset($_SESSION['UserDBLoginRequired']) && $_SESSION['UserDBLoginRequired'] ) { $_SESSION['UserDBLoginRequired_value'] = "true"; } else { $_SESSION['UserDBLoginRequired_value'] = "false"; } if ( !isset($_SESSION['UserDBServer'])) { $_SESSION['UserDBServer'] = "localhost"; } if ( !isset($_SESSION['UserDBPort'])) { $_SESSION['UserDBPort'] = "3306"; } if ( !isset($_SESSION['UserDBName'])) { $_SESSION['UserDBName'] = "loganalyzer"; } if ( !isset($_SESSION['UserDBPref'])) { $_SESSION['UserDBPref'] = "logcon_"; } if ( !isset($_SESSION['UserDBUser'])) { $_SESSION['UserDBUser'] = "root"; } if ( !isset($_SESSION['UserDBPass'])) { $_SESSION['UserDBPass'] = ""; } if ( !isset($_SESSION['UserDBAuthMode'])) { $_SESSION['UserDBAuthMode'] = USERDB_AUTH_INTERNAL; } // LDAP vars if ( !isset($_SESSION['LDAPServer'])) { $_SESSION['LDAPServer'] = "127.0.0.1"; } if ( !isset($_SESSION['LDAPPort'])) { $_SESSION['LDAPPort'] = "389"; } if ( !isset($_SESSION['LDAPBaseDN'])) { $_SESSION['LDAPBaseDN'] = "CN=Users,DC=domain,DC=local"; } if ( !isset($_SESSION['LDAPSearchFilter'])) { $_SESSION['LDAPSearchFilter'] = "(objectClass=user)"; } if ( !isset($_SESSION['LDAPUidAttribute'])) { $_SESSION['LDAPUidAttribute'] = "sAMAccountName"; } if ( !isset($_SESSION['LDAPBindDN'])) { $_SESSION['LDAPBindDN'] = "CN=Searchuser,CN=Users,DC=domain,DC=local"; } if ( !isset($_SESSION['LDAPBindPassword'])) { $_SESSION['LDAPBindPassword'] = "Password"; } // Start replacing existing sample configurations $patterns[] = "/\\\$CFG\['ViewMessageCharacterLimit'\] = [0-9]{1,2};/"; $patterns[] = "/\\\$CFG\['ViewStringCharacterLimit'\] = [0-9]{1,2};/"; $patterns[] = "/\\\$CFG\['ViewEntriesPerPage'\] = [0-9]{1,2};/"; $patterns[] = "/\\\$CFG\['ViewEnableDetailPopups'\] = [0-9]{1,2};/"; $patterns[] = "/\\\$CFG\['EnableIPAddressResolve'\] = [0-9]{1,2};/"; $patterns[] = "/\\\$CFG\['UserDBEnabled'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBServer'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBPort'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBName'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBPref'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBUser'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBPass'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBLoginRequired'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['UserDBAuthMode'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPServer'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPPort'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPBaseDN'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPSearchFilter'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPUidAttribute'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPBindDN'\] = (.*?);/"; $patterns[] = "/\\\$CFG\['LDAPBindPassword'\] = (.*?);/"; $replacements[] = "\$CFG['ViewMessageCharacterLimit'] = " . ReplaceDollarChar($_SESSION['ViewMessageCharacterLimit']) . ";"; $replacements[] = "\$CFG['ViewStringCharacterLimit'] = " . ReplaceDollarChar($_SESSION['ViewStringCharacterLimit']) . ";"; $replacements[] = "\$CFG['ViewEntriesPerPage'] = " . ReplaceDollarChar($_SESSION['ViewEntriesPerPage']) . ";"; $replacements[] = "\$CFG['ViewEnableDetailPopups'] = " . ReplaceDollarChar($_SESSION['ViewEnableDetailPopups']) . ";"; $replacements[] = "\$CFG['EnableIPAddressResolve'] = " . ReplaceDollarChar($_SESSION['EnableIPAddressResolve']) . ";"; $replacements[] = "\$CFG['UserDBEnabled'] = " . ReplaceDollarChar($_SESSION['UserDBEnabled_value']) . ";"; $replacements[] = "\$CFG['UserDBServer'] = '" . ReplaceDollarChar($_SESSION['UserDBServer']) . "';"; $replacements[] = "\$CFG['UserDBPort'] = " . ReplaceDollarChar($_SESSION['UserDBPort']) . ";"; $replacements[] = "\$CFG['UserDBName'] = '" . ReplaceDollarChar($_SESSION['UserDBName']) . "';"; $replacements[] = "\$CFG['UserDBPref'] = '" . ReplaceDollarChar($_SESSION['UserDBPref']) . "';"; $replacements[] = "\$CFG['UserDBUser'] = '" . ReplaceDollarChar($_SESSION['UserDBUser']) . "';"; $replacements[] = "\$CFG['UserDBPass'] = '" . ReplaceDollarChar($_SESSION['UserDBPass']) . "';"; $replacements[] = "\$CFG['UserDBLoginRequired'] = " . ReplaceDollarChar($_SESSION['UserDBLoginRequired_value']) . ";"; $replacements[] = "\$CFG['UserDBAuthMode'] = " . ReplaceDollarChar($_SESSION['UserDBAuthMode']) . ";"; $replacements[] = "\$CFG['LDAPServer'] = '" . ReplaceDollarChar($_SESSION['LDAPServer']) . "';"; $replacements[] = "\$CFG['LDAPPort'] = " . ReplaceDollarChar($_SESSION['LDAPPort']) . ";"; $replacements[] = "\$CFG['LDAPBaseDN'] = '" . ReplaceDollarChar($_SESSION['LDAPBaseDN']) . "';"; $replacements[] = "\$CFG['LDAPSearchFilter'] = '" . ReplaceDollarChar($_SESSION['LDAPSearchFilter']) . "';"; $replacements[] = "\$CFG['LDAPUidAttribute'] = '" . ReplaceDollarChar($_SESSION['LDAPUidAttribute']) . "';"; $replacements[] = "\$CFG['LDAPBindDN'] = '" . ReplaceDollarChar($_SESSION['LDAPBindDN']) . "';"; $replacements[] = "\$CFG['LDAPBindPassword'] = '" . ReplaceDollarChar($_SESSION['LDAPBindPassword']) . "';"; //User Database Options if ( isset($_SESSION['UserDBEnabled']) && $_SESSION['UserDBEnabled'] ) { // TODO! } //Add the first source! $firstsource = "\$CFG['DefaultSourceID'] = 'Source1';\n\n" . "\$CFG['Sources']['Source1']['ID'] = 'Source1';\n" . "\$CFG['Sources']['Source1']['Name'] = '" . ReplaceDollarChar($_SESSION['SourceName']) . "';\n" . "\$CFG['Sources']['Source1']['ViewID'] = '" . ReplaceDollarChar($_SESSION['SourceViewID']) . "';\n"; if ( $_SESSION['SourceType'] == SOURCE_DISK ) { $firstsource .= "\$CFG['Sources']['Source1']['SourceType'] = SOURCE_DISK;\n" . "\$CFG['Sources']['Source1']['LogLineType'] = '" . ReplaceDollarChar($_SESSION['SourceLogLineType']) . "';\n" . "\$CFG['Sources']['Source1']['DiskFile'] = '" . ReplaceDollarChar($_SESSION['SourceDiskFile']) . "';\n" . ""; } else if ( $_SESSION['SourceType'] == SOURCE_DB ) { // Need to create the LIST first! CreateDBTypesList($_SESSION['SourceDBType']); $firstsource .= "\$CFG['Sources']['Source1']['SourceType'] = SOURCE_DB;\n" . "\$CFG['Sources']['Source1']['DBTableType'] = '" . ReplaceDollarChar($_SESSION['SourceDBTableType']) . "';\n" . "\$CFG['Sources']['Source1']['DBType'] = " . ReplaceDollarChar($content['DBTYPES'][$_SESSION['SourceDBType']]['typeastext']) . ";\n" . "\$CFG['Sources']['Source1']['DBServer'] = '" . ReplaceDollarChar($_SESSION['SourceDBServer']) . "';\n" . "\$CFG['Sources']['Source1']['DBName'] = '" . ReplaceDollarChar($_SESSION['SourceDBName']) . "';\n" . "\$CFG['Sources']['Source1']['DBUser'] = '" . ReplaceDollarChar($_SESSION['SourceDBUser']) . "';\n" . "\$CFG['Sources']['Source1']['DBPassword'] = '" . ReplaceDollarChar($_SESSION['SourceDBPassword']) . "';\n" . "\$CFG['Sources']['Source1']['DBTableName'] = '" . ReplaceDollarChar($_SESSION['SourceDBTableName']) . "';\n" . "\$CFG['Sources']['Source1']['DBEnableRowCounting'] = " . ReplaceDollarChar($_SESSION['SourceDBEnableRowCounting']) . ";\n" . ""; } else if ( $_SESSION['SourceType'] == SOURCE_PDO ) { // Need to create the LIST first! CreateDBTypesList($_SESSION['SourceDBType']); $firstsource .= "\$CFG['Sources']['Source1']['SourceType'] = SOURCE_PDO;\n" . "\$CFG['Sources']['Source1']['DBTableType'] = '" . ReplaceDollarChar($_SESSION['SourceDBTableType']) . "';\n" . "\$CFG['Sources']['Source1']['DBType'] = " . ReplaceDollarChar($content['DBTYPES'][$_SESSION['SourceDBType']]['typeastext']) . ";\n" . "\$CFG['Sources']['Source1']['DBServer'] = '" . ReplaceDollarChar($_SESSION['SourceDBServer']) . "';\n" . "\$CFG['Sources']['Source1']['DBName'] = '" . ReplaceDollarChar($_SESSION['SourceDBName']) . "';\n" . "\$CFG['Sources']['Source1']['DBUser'] = '" . ReplaceDollarChar($_SESSION['SourceDBUser']) . "';\n" . "\$CFG['Sources']['Source1']['DBPassword'] = '" . ReplaceDollarChar($_SESSION['SourceDBPassword']) . "';\n" . "\$CFG['Sources']['Source1']['DBTableName'] = '" . ReplaceDollarChar($_SESSION['SourceDBTableName']) . "';\n" . "\$CFG['Sources']['Source1']['DBEnableRowCounting'] = " . ReplaceDollarChar($_SESSION['SourceDBEnableRowCounting']) . ";\n" . ""; } else if ( $_SESSION['SourceType'] == SOURCE_MONGODB ) { // Need to create the LIST first! CreateDBTypesList($_SESSION['SourceDBType']); $firstsource .= "\$CFG['Sources']['Source1']['SourceType'] = SOURCE_MONGODB;\n" . "\$CFG['Sources']['Source1']['DBTableType'] = '" . ReplaceDollarChar($_SESSION['SourceDBTableType']) . "';\n" . "\$CFG['Sources']['Source1']['DBServer'] = '" . ReplaceDollarChar($_SESSION['SourceDBServer']) . "';\n" . "\$CFG['Sources']['Source1']['DBName'] = '" . ReplaceDollarChar($_SESSION['SourceDBName']) . "';\n" . "\$CFG['Sources']['Source1']['DBUser'] = '" . ReplaceDollarChar($_SESSION['SourceDBUser']) . "';\n" . "\$CFG['Sources']['Source1']['DBPassword'] = '" . ReplaceDollarChar($_SESSION['SourceDBPassword']) . "';\n" . "\$CFG['Sources']['Source1']['DBTableName'] = '" . ReplaceDollarChar($_SESSION['SourceDBTableName']) . "';\n" . ""; } $patterns[] = "/\/\/ --- \%Insert Source Here\%/"; $replacements[] = $firstsource; // One call to replace them all ^^ $filebuffer = preg_replace( $patterns, $replacements, $filebuffer ); // echo $filebuffer; // Create file and write config into it! $handle = fopen( $content['BASEPATH'] . "config.php" , "w"); if ( $handle === false ) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr($content['LN_INSTALL_FAILEDCREATECFGFILE'], $content['BASEPATH'] . "config.php") ); fwrite($handle, $filebuffer); fflush($handle); fclose($handle); // --- // --- If UserDB is enabled, we need to convert the settings now if ( $_SESSION['UserDBEnabled'] ) { // Fully Initialize LogAnalyzer now! InitPhpLogCon(); InitSourceConfigs(); // Perform conversion of settings into the database now! ConvertCustomSearches(); ConvertCustomViews(); ConvertCustomSources(); ConvertCustomCharts(); // Import General Settings in the last step! ConvertGeneralSettings(); } // --- } // --- // --- // --- Parsen and Output InitTemplateParser(); $page -> parser($content, "install.html"); $page -> output(); // --- // --- Helper functions function LoadDataFile($szFileName) { global $content; // Lets read the table definitions :) $buffer = ""; $handle = @fopen($szFileName, "r"); if ($handle === false) RevertOneStep( $content['INSTALL_STEP']-1, GetAndReplaceLangStr($content['LN_INSTALL_FAILEDREADINGFILE'], $szFileName) ); else { while (!feof($handle)) { $buffer .= fgets($handle, 4096); } fclose($handle); } // return file buffer! return $buffer; } function InitUserDbSettings() { global $CFG; // Init DB Configs $CFG['UserDBEnabled'] = true; $CFG['UserDBServer'] = $_SESSION['UserDBServer']; $CFG['UserDBPort'] = $_SESSION['UserDBPort']; $CFG['UserDBName'] = $_SESSION['UserDBName']; $CFG['UserDBPref'] = $_SESSION['UserDBPref']; $CFG['UserDBUser'] = $_SESSION['UserDBUser']; $CFG['UserDBPass'] = $_SESSION['UserDBPass']; $CFG['UserDBLoginRequired'] = $_SESSION['UserDBLoginRequired']; // Needed table defs define('DB_CONFIG', $CFG['UserDBPref'] . "config"); define('DB_USERS', $CFG['UserDBPref'] . "users"); define('DB_SEARCHES', $CFG['UserDBPref'] . "searches"); define('DB_SOURCES', $CFG['UserDBPref'] . "sources"); define('DB_VIEWS', $CFG['UserDBPref'] . "views"); } // --- ?>loganalyzer-4.1.5/src/js/000077500000000000000000000000001277740250400152635ustar00rootroot00000000000000loganalyzer-4.1.5/src/js/common.js000066400000000000000000000312521277740250400171140ustar00rootroot00000000000000/* Detect Browser Version */ var szBrowserApp = "MOZILLA"; // Default! if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { if (!/Opera[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { // Set browser to Internet Explorer szBrowserApp = "IEXPLORER"; } } /* Helper Javascript functions */ function CheckAlphaPNGImage(ImageName, ImageTrans) { var agt=navigator.userAgent.toLowerCase(); var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)); if (is_ie) document.images[ImageName].src = ImageTrans; } function NewWindow(Location, WindowName,X_width,Y_height,Option) { var windowReference; var Addressbar = "location=NO"; //Default var OptAddressBar = "AddressBar"; //Default fr Adressbar if (Option == OptAddressBar) { //Falls AdressBar gewnscht wird Addressbar = "location=YES"; } windowReference = window.open(Location,WindowName, 'toolbar=no,' + Addressbar + ',directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=' + X_width + ',height=' + Y_height); if (!windowReference.opener) windowReference.opener = self; } /* * Helper function for form scripting */ function toggleformelement(ElementNameToggle, isEnabled) { var myFormElement = document.getElementById(ElementNameToggle); if ( isEnabled ) { myFormElement.disabled = false; } else { myFormElement.disabled = true; } } // helper array to keep track of the timeouts! var runningTimeouts = new Array(); /* * Helper function to show and hide a div area */ function togglevisibility(ElementNameToggle, ElementNameButton) { var toggle = document.getElementById(ElementNameToggle); // Button is optional if (ElementNameButton != null) { var button = document.getElementById(ElementNameButton); } else var button = null; if (toggle.style.visibility == "visible") { if (button != null) { button.className = "topmenu2 ExpansionPlus"; } toggle.style.visibility = "hidden"; toggle.style.display = "none"; } else { if (button != null) { button.className = "topmenu2 ExpansionMinus"; } toggle.style.visibility = "visible"; toggle.style.display = "inline"; } } /* * Helper function to hide a div area */ function showvisibility(ElementNameToggle, ElementNameButton) { var toggle = document.getElementById(ElementNameToggle); // Button is optional if (ElementNameButton != null) { var button = document.getElementById(ElementNameButton); } else var button = null; if (button != null) { button.className = "topmenu2 ExpansionMinus"; } toggle.style.visibility = "visible"; toggle.style.display = "inline"; } /* * Helper function to hide a div area */ function hidevisibility(ElementNameToggle, ElementNameButton) { var toggle = document.getElementById(ElementNameToggle); // Button is optional if (ElementNameButton != null) { var button = document.getElementById(ElementNameButton); } else var button = null; if (button != null) { button.className = "topmenu2 ExpansionPlus"; } toggle.style.visibility = "hidden"; toggle.style.display = "none"; } function ResetFormValues(formName) { var myform = document.getElementById(formName); var i = 0; var iCount = myform.elements.length; // Loop through text fields for(i = 0; i < iCount; i++) { if (myform.elements[i].type == "text" ) { // Reset textfield myform.elements[i].value = ""; } } } function SubmitForm(formName) { var myform = document.getElementById(formName); if (myform != null) { myform.submit(); } } /* * Helper function to show and hide areas of the filterview */ function toggleFormareaVisibility(FormFieldName, FirstHiddenArea, SecondHiddenArea ) { var myfield = document.getElementById(FormFieldName); if (myfield.value == 1) { togglevisibility(FirstHiddenArea); hidevisibility(SecondHiddenArea); } else if (myfield.value == 2) { hidevisibility(FirstHiddenArea); togglevisibility(SecondHiddenArea); } } /* * Toggle display type from NONE to BLOCK */ function ToggleDisplayTypeById(ObjID) { var obj = document.getElementById(ObjID); if (obj != null) { if (obj.style.display == '' || obj.style.display == 'none') { obj.style.display='block'; // Set Timeout to make sure the menu disappears ToggleDisplaySetTimeout(ObjID); } else { obj.style.display='none'; // Abort Timeout if set! ToggleDisplayClearTimeout(ObjID); } } } function ToggleDisplaySetTimeout(ObjID) { // Set Timeout var szTimeOut = "ToggleDisplayOffTypeById('" + ObjID + "')"; runningTimeouts[ObjID] = window.setTimeout(szTimeOut, defaultMenuTimeout); } function ToggleDisplayClearTimeout(ObjID) { // Abort Timeout if set! if ( runningTimeouts[ObjID] != null ) { window.clearTimeout(runningTimeouts[ObjID]); } } function ToggleDisplayEnhanceTimeOut(ObjID) { // Only perform if timeout exists! if (runningTimeouts[ObjID] != null) { // First clear timeout ToggleDisplayClearTimeout(ObjID); // Set new timeout ToggleDisplaySetTimeout(ObjID); } } /* * Make Style sheet display OFF in any case */ function ToggleDisplayOffTypeById(ObjID) { var obj = document.getElementById(ObjID); if (obj != null) { obj.style.display='none'; } } /* * Debug Helper function to read possible properties of an object */ function DebugShowElementsById(ObjName) { var obj = document.getElementById(ObjName); for (var key in obj) { document.write(obj[key]); } } /* * Detail popup handling functions */ var myPopupHovering = false; function HoveringPopup(event, parentObj) { // This will allow the detail window to be relocated myPopupHovering = true; } function FinishHoveringPopup(event, parentObj) { // This will avoid moving the detail window when it is open myPopupHovering = false; } function initPopupWindow(parentObj) { // Change CSS Class parentObj.className='syslogdetails_popup'; } function FinishPopupWindow(parentObj) { // Change CSS Class parentObj.className='syslogdetails'; } function disableEventPropagation(myEvent) { /* This workaround is specially for our beloved Internet Explorer */ if ( window.event) { window.event.cancelBubble = true; } } function movePopupWindow(myEvent, ObjName, PopupContentWidth, parentObj) { var obj = document.getElementById(ObjName); var middle = PopupContentWidth / 2; // alert ( parentObj.className ) ; if (myPopupHovering == false) { obj.style.left = (myEvent.clientX - middle) + 'px'; } } function GoToPopupTarget(myTarget, parentObj) { if (!myPopupHovering) { // Change document location document.location=myTarget; } else /* Close Popup */ { FinishPopupWindow(parentObj); } } function FinishPopupWindowMenu() { // Change CSS Class var obj = document.getElementById('popupdetails'); if (obj != null) { obj.className='popupdetails with_border'; } } function movePopupWindowMenu(myEvent, ObjName, parentObj) { var obj = document.getElementById(ObjName); var middle = -10; if (myPopupHovering == false && obj != null && parentObj != null) { // Different mouse position capturing in IE! if (szBrowserApp == "IEXPLORER") { obj.style.top = (event.y+document.body.scrollTop + 10) + 'px'; } else { obj.style.top = (myEvent.pageY + 20) + 'px'; } obj.style.left = (myEvent.clientX - middle) + 'px'; } } function HoverPopup( myObjRef, myPopupTitle, HoverContent, OptionalImage ) { // Change CSS Class var obj = document.getElementById('popupdetails'); obj.className='popupdetails_popup with_border'; if ( myObjRef != null) { myObjRef.src = OptionalImage; // "{BASEPATH}images/player/" + myTeam + "/hover/" + ImageBaseName + ".png"; } // Set title var obj = document.getElementById("popuptitle"); obj.innerHTML = myPopupTitle; // Set Content var obj = document.getElementById("popupcontent"); obj.innerHTML = HoverContent; } function HoverPopupHelp( myEvent, parentObj, myPopupTitle, HoverContent ) { // Change CSS Class var objPopup = document.getElementById('popupdetails'); objPopup.className='popupdetails_popup with_border'; // Set title var obj = document.getElementById("popuptitle"); obj.innerHTML = myPopupTitle; // Set Content obj = document.getElementById("popupcontent"); obj.innerHTML = HoverContent; var middle = -5; if (myPopupHovering == false && parentObj != null) { // Different mouse position capturing in IE! objPopup.style.top = (event.y+document.body.scrollTop + 24) + 'px'; objPopup.style.left = (myEvent.clientX - middle) + 'px'; } } function HoverPopupMenuHelp( myEvent, parentObj, myPopupTitle, HoverContent ) { if (szBrowserApp !== "IEXPLORER" ) { // Don't need helper here! return; } // Change CSS Class var objPopup = document.getElementById('popupdetails'); objPopup.className='popupdetails_popup with_border'; // Set title var obj = document.getElementById("popuptitle"); obj.innerHTML = myPopupTitle; // Set Content obj = document.getElementById("popupcontent"); obj.innerHTML = HoverContent; var middle = -5; if (myPopupHovering == false && parentObj != null) { // Different mouse position capturing in IE! objPopup.style.top = (event.y+document.body.scrollTop - 50) + 'px'; objPopup.style.left = (myEvent.clientX - middle) + 'px'; } } /* * New JQUERY Helper functions */ function CreateMenuFunction ( szbuttonobjid, szmenuobjid, bHide ) { // Popup Menu Code var menu = $("ul" + szmenuobjid).menu(); if (bHide) { // Hide menu.hide(); } $(szbuttonobjid).button() .click(function() { /* Hide all other Menus first!*/ $('ul[id^="menu"]').each(function () { $(this).hide(); }); // Make use of the general purpose show and position operations // open and place the menu where we want. menu.show().position({ my: "left top", at: "left bottom", of: this }); menu.focus(); // Register a click outside the menu to close it $( document ).on( "click", function() { menu.hide(); }); // Helper function to close a menu by escape key $( document ).keyup(function(e) { if (e.keyCode == 27) { menu.hide(); } }); // Helper function to click a link by keypress menu.menu({ select: function(event, ui){ var szHref = $(ui.item).find('a').attr('href'); if (szHref != null && szHref.length > 0) { var szTarget = $(ui.item).find('a').attr('target'); if (szTarget == "_top") { $("#loading_dialog").loading(); window.location.href = szHref; } else { window.open(szHref, szTarget); } } } }); // Make sure to return false here or the click registration above gets invoked. return false; }) } function CreateLinkFunction ( szbuttonobjid, szlink ) { $(szbuttonobjid).button() .click(function() { if (szlink != null && szlink.length > 0) { $("#loading_dialog").loading(); window.location.href = szlink; } // Make sure to return false here or the click registration above gets invoked. return false; }) } function CreateLoadingHelper ( szLoadingText ) { (function($) { $.widget("artistan.loading", $.ui.dialog, { options: { /* show: "fade", hide: "fade",*/ // your options spinnerClassSuffix: 'spinner', spinnerHtml: szLoadingText,// allow for spans with callback for timeout... maxHeight: false, maxWidth: false, minHeight: 80, minWidth: 220, height: 120, width: 300, modal: false, }, _create: function() { $.ui.dialog.prototype._create.apply(this); // constructor $(this.uiDialog).children('*').hide(); var self = this, options = self.options; self.uiDialogSpinner = $('.ui-dialog-content',self.uiDialog) .html(options.spinnerHtml) .addClass('ui-dialog-'+options.spinnerClassSuffix); }, _setOption: function(key, value) { var original = value; $.ui.dialog.prototype._setOption.apply(this, arguments); // process the setting of options var self = this; switch (key) { case "innerHeight": // remove old class and add the new one. self.uiDialogSpinner.height(value); break; case "spinnerClassSuffix": // remove old class and add the new one. self.uiDialogSpinner.removeClass('ui-dialog-'+original).addClass('ui-dialog-'+value); break; case "spinnerHtml": // convert whatever was passed in to a string, for html() to not throw up self.uiDialogSpinner.html("" + (value || ' ')); break; } }, _size: function() { $.ui.dialog.prototype._size.apply(this, arguments); }, // other methods loadStart: function(newHtml){ if(typeof(newHtml)!='undefined'){ this._setOption('spinnerHtml',newHtml); } this.open(); }, loadStop: function(){ this._setOption('spinnerHtml',this.options.spinnerHtml); this.close(); } }); })(jQuery); } function MoveToButtonOnKeypress ( szButton, event ) { if (event.keyCode == 13) { event.preventDefault(); $( "#" + szButton ).focus(); $( "#" + szButton ).click(); $("#loading_dialog").loading(); return false; } } loganalyzer-4.1.5/src/js/jquery-ui.js000066400000000000000000016130631277740250400175650ustar00rootroot00000000000000/*! jQuery UI - v1.11.1 - 2014-09-28 * http://jqueryui.com * Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ (function( factory ) { if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define([ "jquery" ], factory ); } else { // Browser globals factory( jQuery ); } }(function( $ ) { /*! * jQuery UI Core 1.11.1 * http://jqueryui.com * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/category/ui-core/ */ // $.ui might exist from components with no dependencies, e.g., $.ui.position $.ui = $.ui || {}; $.extend( $.ui, { version: "1.11.1", keyCode: { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 } }); // plugins $.fn.extend({ scrollParent: function( includeHidden ) { var position = this.css( "position" ), excludeStaticParent = position === "absolute", overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, scrollParent = this.parents().filter( function() { var parent = $( this ); if ( excludeStaticParent && parent.css( "position" ) === "static" ) { return false; } return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); }).eq( 0 ); return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; }, uniqueId: (function() { var uuid = 0; return function() { return this.each(function() { if ( !this.id ) { this.id = "ui-id-" + ( ++uuid ); } }); }; })(), removeUniqueId: function() { return this.each(function() { if ( /^ui-id-\d+$/.test( this.id ) ) { $( this ).removeAttr( "id" ); } }); } }); // selectors function focusable( element, isTabIndexNotNaN ) { var map, mapName, img, nodeName = element.nodeName.toLowerCase(); if ( "area" === nodeName ) { map = element.parentNode; mapName = map.name; if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { return false; } img = $( "img[usemap='#" + mapName + "']" )[ 0 ]; return !!img && visible( img ); } return ( /input|select|textarea|button|object/.test( nodeName ) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible visible( element ); } function visible( element ) { return $.expr.filters.visible( element ) && !$( element ).parents().addBack().filter(function() { return $.css( this, "visibility" ) === "hidden"; }).length; } $.extend( $.expr[ ":" ], { data: $.expr.createPseudo ? $.expr.createPseudo(function( dataName ) { return function( elem ) { return !!$.data( elem, dataName ); }; }) : // support: jQuery <1.8 function( elem, i, match ) { return !!$.data( elem, match[ 3 ] ); }, focusable: function( element ) { return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); }, tabbable: function( element ) { var tabIndex = $.attr( element, "tabindex" ), isTabIndexNaN = isNaN( tabIndex ); return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); } }); // support: jQuery <1.8 if ( !$( "" ).outerWidth( 1 ).jquery ) { $.each( [ "Width", "Height" ], function( i, name ) { var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], type = name.toLowerCase(), orig = { innerWidth: $.fn.innerWidth, innerHeight: $.fn.innerHeight, outerWidth: $.fn.outerWidth, outerHeight: $.fn.outerHeight }; function reduce( elem, size, border, margin ) { $.each( side, function() { size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; if ( border ) { size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; } if ( margin ) { size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; } }); return size; } $.fn[ "inner" + name ] = function( size ) { if ( size === undefined ) { return orig[ "inner" + name ].call( this ); } return this.each(function() { $( this ).css( type, reduce( this, size ) + "px" ); }); }; $.fn[ "outer" + name] = function( size, margin ) { if ( typeof size !== "number" ) { return orig[ "outer" + name ].call( this, size ); } return this.each(function() { $( this).css( type, reduce( this, size, true, margin ) + "px" ); }); }; }); } // support: jQuery <1.8 if ( !$.fn.addBack ) { $.fn.addBack = function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); }; } // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { $.fn.removeData = (function( removeData ) { return function( key ) { if ( arguments.length ) { return removeData.call( this, $.camelCase( key ) ); } else { return removeData.call( this ); } }; })( $.fn.removeData ); } // deprecated $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); $.fn.extend({ focus: (function( orig ) { return function( delay, fn ) { return typeof delay === "number" ? this.each(function() { var elem = this; setTimeout(function() { $( elem ).focus(); if ( fn ) { fn.call( elem ); } }, delay ); }) : orig.apply( this, arguments ); }; })( $.fn.focus ), disableSelection: (function() { var eventType = "onselectstart" in document.createElement( "div" ) ? "selectstart" : "mousedown"; return function() { return this.bind( eventType + ".ui-disableSelection", function( event ) { event.preventDefault(); }); }; })(), enableSelection: function() { return this.unbind( ".ui-disableSelection" ); }, zIndex: function( zIndex ) { if ( zIndex !== undefined ) { return this.css( "zIndex", zIndex ); } if ( this.length ) { var elem = $( this[ 0 ] ), position, value; while ( elem.length && elem[ 0 ] !== document ) { // Ignore z-index if position is set to a value where z-index is ignored by the browser // This makes behavior of this function consistent across browsers // WebKit always returns auto if the element is positioned position = elem.css( "position" ); if ( position === "absolute" || position === "relative" || position === "fixed" ) { // IE returns 0 when zIndex is not specified // other browsers return a string // we ignore the case of nested elements with an explicit value of 0 //
    value = parseInt( elem.css( "zIndex" ), 10 ); if ( !isNaN( value ) && value !== 0 ) { return value; } } elem = elem.parent(); } } return 0; } }); // $.ui.plugin is deprecated. Use $.widget() extensions instead. $.ui.plugin = { add: function( module, option, set ) { var i, proto = $.ui[ module ].prototype; for ( i in set ) { proto.plugins[ i ] = proto.plugins[ i ] || []; proto.plugins[ i ].push( [ option, set[ i ] ] ); } }, call: function( instance, name, args, allowDisconnected ) { var i, set = instance.plugins[ name ]; if ( !set ) { return; } if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { return; } for ( i = 0; i < set.length; i++ ) { if ( instance.options[ set[ i ][ 0 ] ] ) { set[ i ][ 1 ].apply( instance.element, args ); } } } }; /*! * jQuery UI Widget 1.11.1 * http://jqueryui.com * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/jQuery.widget/ */ var widget_uuid = 0, widget_slice = Array.prototype.slice; $.cleanData = (function( orig ) { return function( elems ) { var events, elem, i; for ( i = 0; (elem = elems[i]) != null; i++ ) { try { // Only trigger remove when necessary to save time events = $._data( elem, "events" ); if ( events && events.remove ) { $( elem ).triggerHandler( "remove" ); } // http://bugs.jquery.com/ticket/8235 } catch( e ) {} } orig( elems ); }; })( $.cleanData ); $.widget = function( name, base, prototype ) { var fullName, existingConstructor, constructor, basePrototype, // proxiedPrototype allows the provided prototype to remain unmodified // so that it can be used as a mixin for multiple widgets (#8876) proxiedPrototype = {}, namespace = name.split( "." )[ 0 ]; name = name.split( "." )[ 1 ]; fullName = namespace + "-" + name; if ( !prototype ) { prototype = base; base = $.Widget; } // create selector for plugin $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { return !!$.data( elem, fullName ); }; $[ namespace ] = $[ namespace ] || {}; existingConstructor = $[ namespace ][ name ]; constructor = $[ namespace ][ name ] = function( options, element ) { // allow instantiation without "new" keyword if ( !this._createWidget ) { return new constructor( options, element ); } // allow instantiation without initializing for simple inheritance // must use "new" keyword (the code above always passes args) if ( arguments.length ) { this._createWidget( options, element ); } }; // extend with the existing constructor to carry over any static properties $.extend( constructor, existingConstructor, { version: prototype.version, // copy the object used to create the prototype in case we need to // redefine the widget later _proto: $.extend( {}, prototype ), // track widgets that inherit from this widget in case this widget is // redefined after a widget inherits from it _childConstructors: [] }); basePrototype = new base(); // we need to make the options hash a property directly on the new instance // otherwise we'll modify the options hash on the prototype that we're // inheriting from basePrototype.options = $.widget.extend( {}, basePrototype.options ); $.each( prototype, function( prop, value ) { if ( !$.isFunction( value ) ) { proxiedPrototype[ prop ] = value; return; } proxiedPrototype[ prop ] = (function() { var _super = function() { return base.prototype[ prop ].apply( this, arguments ); }, _superApply = function( args ) { return base.prototype[ prop ].apply( this, args ); }; return function() { var __super = this._super, __superApply = this._superApply, returnValue; this._super = _super; this._superApply = _superApply; returnValue = value.apply( this, arguments ); this._super = __super; this._superApply = __superApply; return returnValue; }; })(); }); constructor.prototype = $.widget.extend( basePrototype, { // TODO: remove support for widgetEventPrefix // always use the name + a colon as the prefix, e.g., draggable:start // don't prefix for widgets that aren't DOM-based widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name }, proxiedPrototype, { constructor: constructor, namespace: namespace, widgetName: name, widgetFullName: fullName }); // If this widget is being redefined then we need to find all widgets that // are inheriting from it and redefine all of them so that they inherit from // the new version of this widget. We're essentially trying to replace one // level in the prototype chain. if ( existingConstructor ) { $.each( existingConstructor._childConstructors, function( i, child ) { var childPrototype = child.prototype; // redefine the child widget using the same prototype that was // originally used, but inherit from the new version of the base $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); }); // remove the list of existing child constructors from the old constructor // so the old child constructors can be garbage collected delete existingConstructor._childConstructors; } else { base._childConstructors.push( constructor ); } $.widget.bridge( name, constructor ); return constructor; }; $.widget.extend = function( target ) { var input = widget_slice.call( arguments, 1 ), inputIndex = 0, inputLength = input.length, key, value; for ( ; inputIndex < inputLength; inputIndex++ ) { for ( key in input[ inputIndex ] ) { value = input[ inputIndex ][ key ]; if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { // Clone objects if ( $.isPlainObject( value ) ) { target[ key ] = $.isPlainObject( target[ key ] ) ? $.widget.extend( {}, target[ key ], value ) : // Don't extend strings, arrays, etc. with objects $.widget.extend( {}, value ); // Copy everything else by reference } else { target[ key ] = value; } } } } return target; }; $.widget.bridge = function( name, object ) { var fullName = object.prototype.widgetFullName || name; $.fn[ name ] = function( options ) { var isMethodCall = typeof options === "string", args = widget_slice.call( arguments, 1 ), returnValue = this; // allow multiple hashes to be passed on init options = !isMethodCall && args.length ? $.widget.extend.apply( null, [ options ].concat(args) ) : options; if ( isMethodCall ) { this.each(function() { var methodValue, instance = $.data( this, fullName ); if ( options === "instance" ) { returnValue = instance; return false; } if ( !instance ) { return $.error( "cannot call methods on " + name + " prior to initialization; " + "attempted to call method '" + options + "'" ); } if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { return $.error( "no such method '" + options + "' for " + name + " widget instance" ); } methodValue = instance[ options ].apply( instance, args ); if ( methodValue !== instance && methodValue !== undefined ) { returnValue = methodValue && methodValue.jquery ? returnValue.pushStack( methodValue.get() ) : methodValue; return false; } }); } else { this.each(function() { var instance = $.data( this, fullName ); if ( instance ) { instance.option( options || {} ); if ( instance._init ) { instance._init(); } } else { $.data( this, fullName, new object( options, this ) ); } }); } return returnValue; }; }; $.Widget = function( /* options, element */ ) {}; $.Widget._childConstructors = []; $.Widget.prototype = { widgetName: "widget", widgetEventPrefix: "", defaultElement: "
    ", options: { disabled: false, // callbacks create: null }, _createWidget: function( options, element ) { element = $( element || this.defaultElement || this )[ 0 ]; this.element = $( element ); this.uuid = widget_uuid++; this.eventNamespace = "." + this.widgetName + this.uuid; this.options = $.widget.extend( {}, this.options, this._getCreateOptions(), options ); this.bindings = $(); this.hoverable = $(); this.focusable = $(); if ( element !== this ) { $.data( element, this.widgetFullName, this ); this._on( true, this.element, { remove: function( event ) { if ( event.target === element ) { this.destroy(); } } }); this.document = $( element.style ? // element within the document element.ownerDocument : // element is window or document element.document || element ); this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); } this._create(); this._trigger( "create", null, this._getCreateEventData() ); this._init(); }, _getCreateOptions: $.noop, _getCreateEventData: $.noop, _create: $.noop, _init: $.noop, destroy: function() { this._destroy(); // we can probably remove the unbind calls in 2.0 // all event bindings should go through this._on() this.element .unbind( this.eventNamespace ) .removeData( this.widgetFullName ) // support: jquery <1.6.3 // http://bugs.jquery.com/ticket/9413 .removeData( $.camelCase( this.widgetFullName ) ); this.widget() .unbind( this.eventNamespace ) .removeAttr( "aria-disabled" ) .removeClass( this.widgetFullName + "-disabled " + "ui-state-disabled" ); // clean up events and states this.bindings.unbind( this.eventNamespace ); this.hoverable.removeClass( "ui-state-hover" ); this.focusable.removeClass( "ui-state-focus" ); }, _destroy: $.noop, widget: function() { return this.element; }, option: function( key, value ) { var options = key, parts, curOption, i; if ( arguments.length === 0 ) { // don't return a reference to the internal hash return $.widget.extend( {}, this.options ); } if ( typeof key === "string" ) { // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } options = {}; parts = key.split( "." ); key = parts.shift(); if ( parts.length ) { curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); for ( i = 0; i < parts.length - 1; i++ ) { curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; curOption = curOption[ parts[ i ] ]; } key = parts.pop(); if ( arguments.length === 1 ) { return curOption[ key ] === undefined ? null : curOption[ key ]; } curOption[ key ] = value; } else { if ( arguments.length === 1 ) { return this.options[ key ] === undefined ? null : this.options[ key ]; } options[ key ] = value; } } this._setOptions( options ); return this; }, _setOptions: function( options ) { var key; for ( key in options ) { this._setOption( key, options[ key ] ); } return this; }, _setOption: function( key, value ) { this.options[ key ] = value; if ( key === "disabled" ) { this.widget() .toggleClass( this.widgetFullName + "-disabled", !!value ); // If the widget is becoming disabled, then nothing is interactive if ( value ) { this.hoverable.removeClass( "ui-state-hover" ); this.focusable.removeClass( "ui-state-focus" ); } } return this; }, enable: function() { return this._setOptions({ disabled: false }); }, disable: function() { return this._setOptions({ disabled: true }); }, _on: function( suppressDisabledCheck, element, handlers ) { var delegateElement, instance = this; // no suppressDisabledCheck flag, shuffle arguments if ( typeof suppressDisabledCheck !== "boolean" ) { handlers = element; element = suppressDisabledCheck; suppressDisabledCheck = false; } // no element argument, shuffle and use this.element if ( !handlers ) { handlers = element; element = this.element; delegateElement = this.widget(); } else { element = delegateElement = $( element ); this.bindings = this.bindings.add( element ); } $.each( handlers, function( event, handler ) { function handlerProxy() { // allow widgets to customize the disabled handling // - disabled as an array instead of boolean // - disabled class as method for disabling individual parts if ( !suppressDisabledCheck && ( instance.options.disabled === true || $( this ).hasClass( "ui-state-disabled" ) ) ) { return; } return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); } // copy the guid so direct unbinding works if ( typeof handler !== "string" ) { handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++; } var match = event.match( /^([\w:-]*)\s*(.*)$/ ), eventName = match[1] + instance.eventNamespace, selector = match[2]; if ( selector ) { delegateElement.delegate( selector, eventName, handlerProxy ); } else { element.bind( eventName, handlerProxy ); } }); }, _off: function( element, eventName ) { eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; element.unbind( eventName ).undelegate( eventName ); }, _delay: function( handler, delay ) { function handlerProxy() { return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); } var instance = this; return setTimeout( handlerProxy, delay || 0 ); }, _hoverable: function( element ) { this.hoverable = this.hoverable.add( element ); this._on( element, { mouseenter: function( event ) { $( event.currentTarget ).addClass( "ui-state-hover" ); }, mouseleave: function( event ) { $( event.currentTarget ).removeClass( "ui-state-hover" ); } }); }, _focusable: function( element ) { this.focusable = this.focusable.add( element ); this._on( element, { focusin: function( event ) { $( event.currentTarget ).addClass( "ui-state-focus" ); }, focusout: function( event ) { $( event.currentTarget ).removeClass( "ui-state-focus" ); } }); }, _trigger: function( type, event, data ) { var prop, orig, callback = this.options[ type ]; data = data || {}; event = $.Event( event ); event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase(); // the original event may come from any element // so we need to reset the target on the new event event.target = this.element[ 0 ]; // copy original event properties over to the new event orig = event.originalEvent; if ( orig ) { for ( prop in orig ) { if ( !( prop in event ) ) { event[ prop ] = orig[ prop ]; } } } this.element.trigger( event, data ); return !( $.isFunction( callback ) && callback.apply( this.element[0], [ event ].concat( data ) ) === false || event.isDefaultPrevented() ); } }; $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { if ( typeof options === "string" ) { options = { effect: options }; } var hasOptions, effectName = !options ? method : options === true || typeof options === "number" ? defaultEffect : options.effect || defaultEffect; options = options || {}; if ( typeof options === "number" ) { options = { duration: options }; } hasOptions = !$.isEmptyObject( options ); options.complete = callback; if ( options.delay ) { element.delay( options.delay ); } if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { element[ method ]( options ); } else if ( effectName !== method && element[ effectName ] ) { element[ effectName ]( options.duration, options.easing, callback ); } else { element.queue(function( next ) { $( this )[ method ](); if ( callback ) { callback.call( element[ 0 ] ); } next(); }); } }; }); var widget = $.widget; /*! * jQuery UI Mouse 1.11.1 * http://jqueryui.com * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/mouse/ */ var mouseHandled = false; $( document ).mouseup( function() { mouseHandled = false; }); var mouse = $.widget("ui.mouse", { version: "1.11.1", options: { cancel: "input,textarea,button,select,option", distance: 1, delay: 0 }, _mouseInit: function() { var that = this; this.element .bind("mousedown." + this.widgetName, function(event) { return that._mouseDown(event); }) .bind("click." + this.widgetName, function(event) { if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { $.removeData(event.target, that.widgetName + ".preventClickEvent"); event.stopImmediatePropagation(); return false; } }); this.started = false; }, // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse _mouseDestroy: function() { this.element.unbind("." + this.widgetName); if ( this._mouseMoveDelegate ) { this.document .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); } }, _mouseDown: function(event) { // don't let more than one widget handle mouseStart if ( mouseHandled ) { return; } // we may have missed mouseup (out of window) (this._mouseStarted && this._mouseUp(event)); this._mouseDownEvent = event; var that = this, btnIsLeft = (event.which === 1), // event.target.nodeName works around a bug in IE 8 with // disabled inputs (#7620) elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { return true; } this.mouseDelayMet = !this.options.delay; if (!this.mouseDelayMet) { this._mouseDelayTimer = setTimeout(function() { that.mouseDelayMet = true; }, this.options.delay); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(event) !== false); if (!this._mouseStarted) { event.preventDefault(); return true; } } // Click event may never have fired (Gecko & Opera) if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { $.removeData(event.target, this.widgetName + ".preventClickEvent"); } // these delegates are required to keep context this._mouseMoveDelegate = function(event) { return that._mouseMove(event); }; this._mouseUpDelegate = function(event) { return that._mouseUp(event); }; this.document .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); event.preventDefault(); mouseHandled = true; return true; }, _mouseMove: function(event) { // IE mouseup check - mouseup happened when mouse was out of window if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { return this._mouseUp(event); // Iframe mouseup check - mouseup occurred in another document } else if ( !event.which ) { return this._mouseUp( event ); } if (this._mouseStarted) { this._mouseDrag(event); return event.preventDefault(); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(this._mouseDownEvent, event) !== false); (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); } return !this._mouseStarted; }, _mouseUp: function(event) { this.document .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); if (this._mouseStarted) { this._mouseStarted = false; if (event.target === this._mouseDownEvent.target) { $.data(event.target, this.widgetName + ".preventClickEvent", true); } this._mouseStop(event); } mouseHandled = false; return false; }, _mouseDistanceMet: function(event) { return (Math.max( Math.abs(this._mouseDownEvent.pageX - event.pageX), Math.abs(this._mouseDownEvent.pageY - event.pageY) ) >= this.options.distance ); }, _mouseDelayMet: function(/* event */) { return this.mouseDelayMet; }, // These are placeholder methods, to be overriden by extending plugin _mouseStart: function(/* event */) {}, _mouseDrag: function(/* event */) {}, _mouseStop: function(/* event */) {}, _mouseCapture: function(/* event */) { return true; } }); /*! * jQuery UI Position 1.11.1 * http://jqueryui.com * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/position/ */ (function() { $.ui = $.ui || {}; var cachedScrollbarWidth, supportsOffsetFractions, max = Math.max, abs = Math.abs, round = Math.round, rhorizontal = /left|center|right/, rvertical = /top|center|bottom/, roffset = /[\+\-]\d+(\.[\d]+)?%?/, rposition = /^\w+/, rpercent = /%$/, _position = $.fn.position; function getOffsets( offsets, width, height ) { return [ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) ]; } function parseCss( element, property ) { return parseInt( $.css( element, property ), 10 ) || 0; } function getDimensions( elem ) { var raw = elem[0]; if ( raw.nodeType === 9 ) { return { width: elem.width(), height: elem.height(), offset: { top: 0, left: 0 } }; } if ( $.isWindow( raw ) ) { return { width: elem.width(), height: elem.height(), offset: { top: elem.scrollTop(), left: elem.scrollLeft() } }; } if ( raw.preventDefault ) { return { width: 0, height: 0, offset: { top: raw.pageY, left: raw.pageX } }; } return { width: elem.outerWidth(), height: elem.outerHeight(), offset: elem.offset() }; } $.position = { scrollbarWidth: function() { if ( cachedScrollbarWidth !== undefined ) { return cachedScrollbarWidth; } var w1, w2, div = $( "
    " ), innerDiv = div.children()[0]; $( "body" ).append( div ); w1 = innerDiv.offsetWidth; div.css( "overflow", "scroll" ); w2 = innerDiv.offsetWidth; if ( w1 === w2 ) { w2 = div[0].clientWidth; } div.remove(); return (cachedScrollbarWidth = w1 - w2); }, getScrollInfo: function( within ) { var overflowX = within.isWindow || within.isDocument ? "" : within.element.css( "overflow-x" ), overflowY = within.isWindow || within.isDocument ? "" : within.element.css( "overflow-y" ), hasOverflowX = overflowX === "scroll" || ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), hasOverflowY = overflowY === "scroll" || ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); return { width: hasOverflowY ? $.position.scrollbarWidth() : 0, height: hasOverflowX ? $.position.scrollbarWidth() : 0 }; }, getWithinInfo: function( element ) { var withinElement = $( element || window ), isWindow = $.isWindow( withinElement[0] ), isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; return { element: withinElement, isWindow: isWindow, isDocument: isDocument, offset: withinElement.offset() || { left: 0, top: 0 }, scrollLeft: withinElement.scrollLeft(), scrollTop: withinElement.scrollTop(), // support: jQuery 1.6.x // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() }; } }; $.fn.position = function( options ) { if ( !options || !options.of ) { return _position.apply( this, arguments ); } // make a copy, we don't want to modify arguments options = $.extend( {}, options ); var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, target = $( options.of ), within = $.position.getWithinInfo( options.within ), scrollInfo = $.position.getScrollInfo( within ), collision = ( options.collision || "flip" ).split( " " ), offsets = {}; dimensions = getDimensions( target ); if ( target[0].preventDefault ) { // force left top to allow flipping options.at = "left top"; } targetWidth = dimensions.width; targetHeight = dimensions.height; targetOffset = dimensions.offset; // clone to reuse original targetOffset later basePosition = $.extend( {}, targetOffset ); // force my and at to have valid horizontal and vertical positions // if a value is missing or invalid, it will be converted to center $.each( [ "my", "at" ], function() { var pos = ( options[ this ] || "" ).split( " " ), horizontalOffset, verticalOffset; if ( pos.length === 1) { pos = rhorizontal.test( pos[ 0 ] ) ? pos.concat( [ "center" ] ) : rvertical.test( pos[ 0 ] ) ? [ "center" ].concat( pos ) : [ "center", "center" ]; } pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; // calculate offsets horizontalOffset = roffset.exec( pos[ 0 ] ); verticalOffset = roffset.exec( pos[ 1 ] ); offsets[ this ] = [ horizontalOffset ? horizontalOffset[ 0 ] : 0, verticalOffset ? verticalOffset[ 0 ] : 0 ]; // reduce to just the positions without the offsets options[ this ] = [ rposition.exec( pos[ 0 ] )[ 0 ], rposition.exec( pos[ 1 ] )[ 0 ] ]; }); // normalize collision option if ( collision.length === 1 ) { collision[ 1 ] = collision[ 0 ]; } if ( options.at[ 0 ] === "right" ) { basePosition.left += targetWidth; } else if ( options.at[ 0 ] === "center" ) { basePosition.left += targetWidth / 2; } if ( options.at[ 1 ] === "bottom" ) { basePosition.top += targetHeight; } else if ( options.at[ 1 ] === "center" ) { basePosition.top += targetHeight / 2; } atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); basePosition.left += atOffset[ 0 ]; basePosition.top += atOffset[ 1 ]; return this.each(function() { var collisionPosition, using, elem = $( this ), elemWidth = elem.outerWidth(), elemHeight = elem.outerHeight(), marginLeft = parseCss( this, "marginLeft" ), marginTop = parseCss( this, "marginTop" ), collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, position = $.extend( {}, basePosition ), myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); if ( options.my[ 0 ] === "right" ) { position.left -= elemWidth; } else if ( options.my[ 0 ] === "center" ) { position.left -= elemWidth / 2; } if ( options.my[ 1 ] === "bottom" ) { position.top -= elemHeight; } else if ( options.my[ 1 ] === "center" ) { position.top -= elemHeight / 2; } position.left += myOffset[ 0 ]; position.top += myOffset[ 1 ]; // if the browser doesn't support fractions, then round for consistent results if ( !supportsOffsetFractions ) { position.left = round( position.left ); position.top = round( position.top ); } collisionPosition = { marginLeft: marginLeft, marginTop: marginTop }; $.each( [ "left", "top" ], function( i, dir ) { if ( $.ui.position[ collision[ i ] ] ) { $.ui.position[ collision[ i ] ][ dir ]( position, { targetWidth: targetWidth, targetHeight: targetHeight, elemWidth: elemWidth, elemHeight: elemHeight, collisionPosition: collisionPosition, collisionWidth: collisionWidth, collisionHeight: collisionHeight, offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], my: options.my, at: options.at, within: within, elem: elem }); } }); if ( options.using ) { // adds feedback as second argument to using callback, if present using = function( props ) { var left = targetOffset.left - position.left, right = left + targetWidth - elemWidth, top = targetOffset.top - position.top, bottom = top + targetHeight - elemHeight, feedback = { target: { element: target, left: targetOffset.left, top: targetOffset.top, width: targetWidth, height: targetHeight }, element: { element: elem, left: position.left, top: position.top, width: elemWidth, height: elemHeight }, horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" }; if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { feedback.horizontal = "center"; } if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { feedback.vertical = "middle"; } if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { feedback.important = "horizontal"; } else { feedback.important = "vertical"; } options.using.call( this, props, feedback ); }; } elem.offset( $.extend( position, { using: using } ) ); }); }; $.ui.position = { fit: { left: function( position, data ) { var within = data.within, withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, outerWidth = within.width, collisionPosLeft = position.left - data.collisionPosition.marginLeft, overLeft = withinOffset - collisionPosLeft, overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, newOverRight; // element is wider than within if ( data.collisionWidth > outerWidth ) { // element is initially over the left side of within if ( overLeft > 0 && overRight <= 0 ) { newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; position.left += overLeft - newOverRight; // element is initially over right side of within } else if ( overRight > 0 && overLeft <= 0 ) { position.left = withinOffset; // element is initially over both left and right sides of within } else { if ( overLeft > overRight ) { position.left = withinOffset + outerWidth - data.collisionWidth; } else { position.left = withinOffset; } } // too far left -> align with left edge } else if ( overLeft > 0 ) { position.left += overLeft; // too far right -> align with right edge } else if ( overRight > 0 ) { position.left -= overRight; // adjust based on position and margin } else { position.left = max( position.left - collisionPosLeft, position.left ); } }, top: function( position, data ) { var within = data.within, withinOffset = within.isWindow ? within.scrollTop : within.offset.top, outerHeight = data.within.height, collisionPosTop = position.top - data.collisionPosition.marginTop, overTop = withinOffset - collisionPosTop, overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, newOverBottom; // element is taller than within if ( data.collisionHeight > outerHeight ) { // element is initially over the top of within if ( overTop > 0 && overBottom <= 0 ) { newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; position.top += overTop - newOverBottom; // element is initially over bottom of within } else if ( overBottom > 0 && overTop <= 0 ) { position.top = withinOffset; // element is initially over both top and bottom of within } else { if ( overTop > overBottom ) { position.top = withinOffset + outerHeight - data.collisionHeight; } else { position.top = withinOffset; } } // too far up -> align with top } else if ( overTop > 0 ) { position.top += overTop; // too far down -> align with bottom edge } else if ( overBottom > 0 ) { position.top -= overBottom; // adjust based on position and margin } else { position.top = max( position.top - collisionPosTop, position.top ); } } }, flip: { left: function( position, data ) { var within = data.within, withinOffset = within.offset.left + within.scrollLeft, outerWidth = within.width, offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, collisionPosLeft = position.left - data.collisionPosition.marginLeft, overLeft = collisionPosLeft - offsetLeft, overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, myOffset = data.my[ 0 ] === "left" ? -data.elemWidth : data.my[ 0 ] === "right" ? data.elemWidth : 0, atOffset = data.at[ 0 ] === "left" ? data.targetWidth : data.at[ 0 ] === "right" ? -data.targetWidth : 0, offset = -2 * data.offset[ 0 ], newOverRight, newOverLeft; if ( overLeft < 0 ) { newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { position.left += myOffset + atOffset + offset; } } else if ( overRight > 0 ) { newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { position.left += myOffset + atOffset + offset; } } }, top: function( position, data ) { var within = data.within, withinOffset = within.offset.top + within.scrollTop, outerHeight = within.height, offsetTop = within.isWindow ? within.scrollTop : within.offset.top, collisionPosTop = position.top - data.collisionPosition.marginTop, overTop = collisionPosTop - offsetTop, overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, top = data.my[ 1 ] === "top", myOffset = top ? -data.elemHeight : data.my[ 1 ] === "bottom" ? data.elemHeight : 0, atOffset = data.at[ 1 ] === "top" ? data.targetHeight : data.at[ 1 ] === "bottom" ? -data.targetHeight : 0, offset = -2 * data.offset[ 1 ], newOverTop, newOverBottom; if ( overTop < 0 ) { newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { position.top += myOffset + atOffset + offset; } } else if ( overBottom > 0 ) { newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { position.top += myOffset + atOffset + offset; } } } }, flipfit: { left: function() { $.ui.position.flip.left.apply( this, arguments ); $.ui.position.fit.left.apply( this, arguments ); }, top: function() { $.ui.position.flip.top.apply( this, arguments ); $.ui.position.fit.top.apply( this, arguments ); } } }; // fraction support test (function() { var testElement, testElementParent, testElementStyle, offsetLeft, i, body = document.getElementsByTagName( "body" )[ 0 ], div = document.createElement( "div" ); //Create a "fake body" for testing based on method used in jQuery.support testElement = document.createElement( body ? "div" : "body" ); testElementStyle = { visibility: "hidden", width: 0, height: 0, border: 0, margin: 0, background: "none" }; if ( body ) { $.extend( testElementStyle, { position: "absolute", left: "-1000px", top: "-1000px" }); } for ( i in testElementStyle ) { testElement.style[ i ] = testElementStyle[ i ]; } testElement.appendChild( div ); testElementParent = body || document.documentElement; testElementParent.insertBefore( testElement, testElementParent.firstChild ); div.style.cssText = "position: absolute; left: 10.7432222px;"; offsetLeft = $( div ).offset().left; supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; testElement.innerHTML = ""; testElementParent.removeChild( testElement ); })(); })(); var position = $.ui.position; /*! * jQuery UI Draggable 1.11.1 * http://jqueryui.com * * Copyright 2014 jQuery Foundation and other contributors * Released under the MIT license. * http://jquery.org/license * * http://api.jqueryui.com/draggable/ */ $.widget("ui.draggable", $.ui.mouse, { version: "1.11.1", widgetEventPrefix: "drag", options: { addClasses: true, appendTo: "parent", axis: false, connectToSortable: false, containment: false, cursor: "auto", cursorAt: false, grid: false, handle: false, helper: "original", iframeFix: false, opacity: false, refreshPositions: false, revert: false, revertDuration: 500, scope: "default", scroll: true, scrollSensitivity: 20, scrollSpeed: 20, snap: false, snapMode: "both", snapTolerance: 20, stack: false, zIndex: false, // callbacks drag: null, start: null, stop: null }, _create: function() { if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) { this.element[0].style.position = "relative"; } if (this.options.addClasses){ this.element.addClass("ui-draggable"); } if (this.options.disabled){ this.element.addClass("ui-draggable-disabled"); } this._setHandleClassName(); this._mouseInit(); }, _setOption: function( key, value ) { this._super( key, value ); if ( key === "handle" ) { this._removeHandleClassName(); this._setHandleClassName(); } }, _destroy: function() { if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { this.destroyOnClear = true; return; } this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); this._removeHandleClassName(); this._mouseDestroy(); }, _mouseCapture: function(event) { var document = this.document[ 0 ], o = this.options; // support: IE9 // IE9 throws an "Unspecified error" accessing document.activeElement from an