Compare commits
113 Commits
0.1.4-34
...
11_0_0-65_
Author | SHA1 | Date | |
---|---|---|---|
82ff48e641 | |||
c5d863b3a0 | |||
4f00dfbdb1 | |||
f9bf8cf064 | |||
4f0617f6c3 | |||
4c94d768e2 | |||
1731f75cba | |||
5fe285f9f2 | |||
1c93be6e8a | |||
ce96f72726 | |||
0fd7137edd | |||
d179b06f69 | |||
c2427189d5 | |||
887af04bfe | |||
34b85b1cde | |||
a5758b4431 | |||
58aa423089 | |||
c0b4d1f90e | |||
a979d472e8 | |||
d776f20736 | |||
a4668da720 | |||
7ad224998c | |||
3070e0656c | |||
642d013437 | |||
a62968d2d9 | |||
0e777fd51a | |||
eee68afa2b | |||
c2d677594b | |||
f6fe2216a0 | |||
6d3f8f48c2 | |||
f8d9ec34e3 | |||
835d439e42 | |||
4797a1b189 | |||
1e4ec809b5 | |||
d1197f55cf | |||
b5d6de3bcf | |||
ec4f515012 | |||
9b03d377e2 | |||
957d2ada21 | |||
be49419eba | |||
c1915a722b | |||
7ff51625c0 | |||
18c95a9021 | |||
5ef3a00a05 | |||
174e140a04 | |||
d77b9bd341 | |||
746609ced0 | |||
9380ac0264 | |||
a07bdf4aa5 | |||
4270814afc | |||
58c3f2348a | |||
b58f82a332 | |||
8db1279a3e | |||
1d3d59b5c1 | |||
ff9a84dd29 | |||
34e7331845 | |||
dfda47882d | |||
55269fd685 | |||
1b1b99955b | |||
c6eb08a727 | |||
8e70adc797 | |||
2424684d35 | |||
78bb7743c1 | |||
87f6a46502 | |||
a08767919c | |||
2b83be6d70 | |||
6c1b6ed1f4 | |||
3fa8ab5eda | |||
55465e3081 | |||
e5b9a012d9 | |||
fbdf3170ec | |||
87d1d072c0 | |||
d49db26f26 | |||
c4f9d67abc | |||
fe62bd3e39 | |||
df6d21dbc9 | |||
9c9592f861 | |||
4d2097d2da | |||
44a9ecc0e1 | |||
785ebcfaaf | |||
127ea74a8b | |||
b9f6392c1d | |||
659f060eb6 | |||
1087a8a5a2 | |||
6a5a756438 | |||
91ca26de27 | |||
8b93232bbe | |||
ed1c3e13b1 | |||
095a0a1499 | |||
d16ea6a847 | |||
e70cc67430 | |||
b097acafab | |||
5d7655a709 | |||
a58df95aa9 | |||
251b454470 | |||
174d511899 | |||
4be8a1411f | |||
ba431a8a7d | |||
77a7849898 | |||
fb5b0942d6 | |||
5edc830f9b | |||
473cb57a47 | |||
55b85496d4 | |||
2fd6f8b630 | |||
a428e91c92 | |||
03955eecea | |||
891fc73ce3 | |||
e7d7b6afb8 | |||
1837bc9a18 | |||
a580a79ab5 | |||
c38c471bc0 | |||
fbdba9d282 | |||
818a894f9f |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
||||
*.log
|
||||
*spec-20*
|
||||
*.tar.xz
|
||||
*.bak
|
||||
|
126
LICENSE
126
LICENSE
@@ -1,73 +1,119 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
1. Definitions.
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
|
||||
Preamble
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
|
||||
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
|
||||
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
|
||||
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
|
||||
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
|
||||
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
|
||||
The precise terms and conditions for copying, distribution and modification follow.
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
|
||||
0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
|
||||
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
|
||||
1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
|
||||
|
||||
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
|
||||
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
|
||||
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
|
||||
a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
|
||||
b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
|
||||
c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
|
||||
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
|
||||
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
|
||||
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
||||
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
|
||||
a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
|
||||
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.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
68
README.md
68
README.md
@@ -13,10 +13,70 @@ SMEServer Koozali developed git repo for smeserver-manager smeserver
|
||||
<br />https://wiki.koozali.org/Server_Manager_2_Howto_incorporate_a_legacy_contrib
|
||||
|
||||
## Bugzilla
|
||||
Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-manager&product=SME%20Server%2010.X&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED)
|
||||
Show list of outstanding bugs:
|
||||
[All](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=NEEDINFO&bug_status=IN_PROGRESS&bug_status=RESOLVED&bug_status=VERIFIED&cf_package=smeserver-manager&classification=SME+Server&list_id=105756&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
[Confirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=CONFIRMED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
[Unconfirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
[Need info](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=NEEDINFO&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
[In progress](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=IN_PROGRESS&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
[Resolved](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=RESOLVED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
[Verified](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=VERIFIED&cf_package=smeserver-manager&classification=SME+Server&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&query_format=advanced)
|
||||
|
||||
## Description
|
||||
|
||||
<br />*This description has been generated by an LLM AI system and cannot be relied on to be fully correct.*
|
||||
*Once it has been checked, then this comment will be deleted*
|
||||
<br />
|
||||
The *smeserver-manager* is a web-based management interface for the SME Server (formerly known as e-smith server and gateway). SME Server is a Linux-based distribution designed for small to medium-sized enterprises, providing a wide range of network services and simplified server management.
|
||||
|
||||
It is based on the perl Mojolicious package. Mojolicious is a real-time web framework for Perl, which provides a range of functionalities that make it a powerful and flexible tool for web development.
|
||||
|
||||
### Features
|
||||
|
||||
#### Web-Based Management Interface:
|
||||
smeserver-manager provides an intuitive and user-friendly web interface that allows administrators to manage various aspects of the server without needing deep technical knowledge or command-line skills.
|
||||
|
||||
#### User and Group Management:
|
||||
It allows you to easily add, remove, and manage user accounts and groups. The interface simplifies creating email accounts, setting passwords, and configuring user permissions.
|
||||
|
||||
#### Network Configuration:
|
||||
You can configures network settings such as IP addresses, DNS, DHCP, and gateway settings. The interface also provides options for setting up VPNs, remote access, and firewall rules.
|
||||
|
||||
#### File Sharing and Storage:
|
||||
Enables and manages file sharing services like Samba (for Windows file sharing) and NFS (for Unix/Linux file sharing). Administrators can easily create shared folders and manage permissions.
|
||||
|
||||
#### Email Services:
|
||||
Configure and manage email services, including setting up mail domains, user mailboxes, and SMTP/IMAP/POP3 settings. It also provides options for spam and virus filtering.
|
||||
|
||||
#### Web Services:
|
||||
Host and manage websites using the integrated web server (usually Apache). It supports virtual hosting, where multiple websites can be hosted on the same server.
|
||||
|
||||
#### Backup and Restore:
|
||||
Perform backups of essential data and server configurations. The interface provides options for scheduled backups and restoring from backup files.
|
||||
|
||||
#### Software Updates and Installation:
|
||||
Keep the server up-to-date with the latest security patches and software updates. The interface helps in installing and updating software packages and extensions.
|
||||
|
||||
#### Monitoring and Reporting:
|
||||
Monitor server performance and health. The interface provides logs, status reports, and alerts for various server components, including disk usage, network traffic, and system load.
|
||||
|
||||
|
||||
### Installation and Access
|
||||
|
||||
Typically, smeserver-manager is installed by default on SME Server. To access the interface:
|
||||
|
||||
Open a web browser on a device connected to the same network as the SME Server. Enter the server's IP address or hostname followed by /server-manager in the address bar (e.g., https://192.168.1.1/server-manager).
|
||||
You will be prompted to log in. Use the administrator credentials set during the SME Server installation.
|
||||
|
||||
### Benefits
|
||||
|
||||
Simplicity: Makes it easy for non-technical users to manage a server.
|
||||
Centralized Management: Provides a single point of control for various server functionalities.
|
||||
Efficiency: Saves time and reduces complexity in server management tasks.
|
||||
Security: Regular updates and built-in security features ensure the server remains secure.
|
||||
|
||||
### Considerations
|
||||
|
||||
Learning Curve: While designed to be user-friendly, some features may still require a basic understanding of server and network management concepts.
|
||||
Dependencies: Relies on specific packages and configurations of SME Server, and may not be directly applicable to other Linux distributions.
|
||||
|
||||
### Summary
|
||||
|
||||
SMEserver-manager is a powerful tool that brings simplicity and efficiency to server management for small to medium-sized enterprises. By providing a centralized, web-based interface, it allows administrators to manage users, network settings, file sharing, email services, web hosting, and more, all from a single location.
|
||||
|
@@ -45,8 +45,12 @@ for my $event ( qw( smeserver-manager-update smanager-refresh bootstrap-console-
|
||||
event_link('locales2-conf', "$event", '80');
|
||||
}
|
||||
|
||||
event_link('post-upgrade-and-reboot','post-upgrade-and-reboot',80);
|
||||
event_link('systemd-default', "smeserver-manager-update", '88');
|
||||
event_link('systemd-reload', "smeserver-manager-update", '89');
|
||||
templates2events("/etc/rsyslog.conf", "smeserver-manager-update");
|
||||
safe_symlink("restart",
|
||||
"root/etc/e-smith/events/smeserver-manager-update/services2adjust/rsyslog");
|
||||
|
||||
use esmith::Build::Backup qw(:all);
|
||||
backup_includes("smeserver-manager", qw(
|
||||
|
1
root/etc/e-smith/events/actions/.perltidyrc
Normal file
1
root/etc/e-smith/events/actions/.perltidyrc
Normal file
@@ -0,0 +1 @@
|
||||
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1
|
@@ -1,5 +1,4 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# copyright (C) 1999-2006 Mitel Networks Corporation
|
||||
#
|
||||
@@ -20,52 +19,40 @@
|
||||
#----------------------------------------------------------------------
|
||||
package esmith;
|
||||
use strict;
|
||||
|
||||
use constant SMNGR_LIB => '/usr/share/smanager/lib';
|
||||
use constant I18NMODULES => 'SrvMngr/I18N/Modules';
|
||||
use constant WEBFUNCTIONS => 'SrvMngr/Controller';
|
||||
use constant NAVDIR => '/home/e-smith/db';
|
||||
use constant NAVIGATIONDIR => 'navigation2';
|
||||
use constant DEBUG => 0;
|
||||
|
||||
use esmith::NavigationDB;
|
||||
use esmith::I18N;
|
||||
|
||||
use Data::Dumper; # activate if DEBUG
|
||||
|
||||
my $navigation_ignore =
|
||||
"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
|
||||
|
||||
binmode(STDOUT, ":encoding(UTF-8)");
|
||||
my $navigation_ignore = "(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
|
||||
my $i18n = new esmith::I18N;
|
||||
|
||||
my %navdbs;
|
||||
|
||||
opendir FUNCTIONS, SMNGR_LIB.'/'.WEBFUNCTIONS or
|
||||
die "Couldn't open ", SMNGR_LIB.'/'.WEBFUNCTIONS, "\n";
|
||||
opendir FUNCTIONS, SMNGR_LIB . '/' . WEBFUNCTIONS
|
||||
or die "Couldn't open ", SMNGR_LIB . '/' . WEBFUNCTIONS, "\n";
|
||||
my @files = grep (!/^${navigation_ignore}$/, readdir(FUNCTIONS));
|
||||
closedir FUNCTIONS;
|
||||
|
||||
my @langs = $i18n->availableLanguages();
|
||||
#my @langs = ('en', 'fr');
|
||||
#print Dumper(\@langs);
|
||||
|
||||
|
||||
foreach my $lang (@langs)
|
||||
{
|
||||
#my @langs = ('tr'); #Temp override
|
||||
foreach my $lang (@langs) {
|
||||
my $long_lex = SMNGR_LIB . '/' . I18NMODULES . "/General/general_$lang.lex";
|
||||
next unless (-e $long_lex);
|
||||
|
||||
open(LEX, '<:encoding(UTF-8)', $long_lex)
|
||||
or die "Couldn't open ", $long_lex, " for reading.\n";
|
||||
my @gen_lex = <LEX>;
|
||||
close LEX;
|
||||
|
||||
foreach my $file (@files)
|
||||
{
|
||||
#my @files = ('Portforwarding.pm'); #Temp override
|
||||
foreach my $file (@files) {
|
||||
next if (-d SMNGR_LIB . '/' . WEBFUNCTIONS . "/$file");
|
||||
|
||||
# next unless ( $file =~ m/D.*\.pm$/ );
|
||||
next unless ($file =~ m/[A-Z].*\.pm$/);
|
||||
|
||||
my $file2 = lc($file);
|
||||
$file2 =~ s/\.pm$//;
|
||||
|
||||
@@ -81,8 +68,7 @@ foreach my $lang (@langs)
|
||||
my $menucat = undef;
|
||||
my $routes = undef;
|
||||
|
||||
while ( <SCRIPT> )
|
||||
{
|
||||
while (<SCRIPT>) {
|
||||
$heading = $1 if (/^\s*#\s*heading\s*:\s*(.+?)\s*$/);
|
||||
$description = $1
|
||||
if (/^\s*#\s*description\s*:\s*(.+?)\s*$/);
|
||||
@@ -90,87 +76,156 @@ foreach my $lang (@langs)
|
||||
if (/^\s*#\s*navigation\s*:\s*(\d+?)\s+(\d+?)\s*$/);
|
||||
$menucat = $1
|
||||
if (/^\s*#\s*menu\s*:\s*(.+?)\s*$/);
|
||||
|
||||
last if (defined $heading and
|
||||
defined $description and
|
||||
defined $heading_weight and
|
||||
defined $description_weight and
|
||||
defined $menucat);
|
||||
last
|
||||
if (defined $heading
|
||||
and defined $description
|
||||
and defined $heading_weight
|
||||
and defined $description_weight
|
||||
and defined $menucat);
|
||||
|
||||
# routes : end (stop before eof if 'menu' is not here before 'routes'!!!
|
||||
$routes = $1 if (/^\s*#\s*routes\s*:\s*(.+?)\s*$/);
|
||||
last if (defined $routes and $routes eq 'end');
|
||||
}
|
||||
} ## end while (<SCRIPT>)
|
||||
close SCRIPT;
|
||||
|
||||
print "updating script $file for lang $lang\n" if DEBUG;
|
||||
my $navdb = $navdbs{$lang};
|
||||
my $navinfo = NAVDIR . '/' . NAVIGATIONDIR . "/navigation.$lang";
|
||||
$navdb ||= esmith::NavigationDB->open($navinfo);
|
||||
$navdb ||= esmith::NavigationDB->create($navinfo) or
|
||||
die "Couldn't create $navinfo\n";
|
||||
$navdb ||= esmith::NavigationDB->create($navinfo)
|
||||
or die "Couldn't create $navinfo\n";
|
||||
$navdbs{$lang} ||= $navdb;
|
||||
my $rec = $navdb->get($file2) ||
|
||||
$navdb->new_record($file2, { type => 'panel' } );
|
||||
|
||||
my $rec = $navdb->get($file2)
|
||||
|| $navdb->new_record($file2, { type => 'panel' });
|
||||
my @panel_lex = ();
|
||||
$long_lex = SMNGR_LIB . '/' . I18NMODULES . '/' . ucfirst($file2) . "/${file2}_$lang.lex";
|
||||
|
||||
if (-e $long_lex) {
|
||||
open(LEX, '<:encoding(UTF-8)', $long_lex)
|
||||
or die "Couldn't open ", $long_lex, " for reading.\n";
|
||||
@panel_lex = <LEX>;
|
||||
close LEX;
|
||||
} ## end if (-e $long_lex)
|
||||
|
||||
#Extract the prefix for this module
|
||||
my @keys = values @panel_lex; # Get all values from the array
|
||||
my $i = 0; # Initialize the index
|
||||
my $found = 0; # Flag to check if the prefix was found
|
||||
my $prefix = "xx_"; # Probably never match!!
|
||||
|
||||
while ($i < @keys) { # Loop until we run out of entries
|
||||
my $extracted_value = $keys[$i] || ""; # The current entry
|
||||
#print("Extracted val: ".$extracted_value."\n");
|
||||
|
||||
# Extract prefix from the second value (up to and including the first underscore)
|
||||
#my ($prefix) = $second_value =~ /^'(.*?_)/; # Match everything up to and including the first underscore
|
||||
($prefix) = $extracted_value =~ /^'(.*?_)/; # Match everything up to and including the first underscore
|
||||
|
||||
if (defined $prefix) {
|
||||
$found = 1; # Set found flag to true
|
||||
last; # Exit the loop if prefix is found
|
||||
} else {
|
||||
|
||||
#print("Extracted Val: " . $extracted_value . "\n");
|
||||
}
|
||||
$i++; # Increment the index to check the next entry
|
||||
} ## end while ($i < @keys)
|
||||
|
||||
if (!$found) {
|
||||
#print(STDERR "No valid prefix found in any entries: " . $file2 . " (" . $lang . ")\n"); # if DEBUG;
|
||||
$prefix = "xx_"; # Probably never match!!
|
||||
}
|
||||
|
||||
#print("Prefix: ".$prefix." ".$file2." (".$lang.")\n");
|
||||
my %Lexicon = ();
|
||||
push(@panel_lex, @gen_lex);
|
||||
my $top_error = 0;
|
||||
|
||||
chomp @panel_lex;
|
||||
|
||||
for (@panel_lex) {
|
||||
next unless $_; # first one empty
|
||||
my ($k, $v) = split / => /, $_;
|
||||
|
||||
# errors on split to $v (use DEBUG to see)
|
||||
if ($k and $v) {
|
||||
$k =~ s/\'//g;
|
||||
$v =~ s/\'//g;
|
||||
$v =~ s/,$//g;
|
||||
$Lexicon{ $k } = $v;
|
||||
$Lexicon{ lc($k) } = $v;
|
||||
} else {
|
||||
$k = "?" unless ($k);
|
||||
print STDERR "Error for $lang $file2 on $k \n" if DEBUG;
|
||||
$top_error++;
|
||||
}
|
||||
}
|
||||
} ## end for (@panel_lex)
|
||||
|
||||
if ($top_error > 0) {
|
||||
if (DEBUG) {
|
||||
print STDERR "$top_error errors for $lang $file2\n";
|
||||
|
||||
# print Dumper(\@panel_lex);
|
||||
# print Dumper(\%Lexicon);
|
||||
# exit 1;
|
||||
}
|
||||
}
|
||||
} ## end if (DEBUG)
|
||||
} ## end if ($top_error > 0)
|
||||
$heading = "" unless defined $heading;
|
||||
$description = "" unless defined $description;
|
||||
|
||||
my $loc_heading = localise( \%Lexicon, $heading );
|
||||
my $loc_description = localise( \%Lexicon, $description );
|
||||
# Get the base language code from $lang
|
||||
my $base_lang = (split('-', $lang))[0];
|
||||
my $loc_heading = process_localization(\%Lexicon, $heading, $lang, $prefix);
|
||||
my $loc_description = process_localization(\%Lexicon, $description, $lang, $prefix);
|
||||
$loc_heading =~ s/^\s*(\w.*?)\s*$/$1/;
|
||||
$loc_description =~ s/^\s*(\w.*?)\s*$/$1/;
|
||||
|
||||
$rec->merge_props(
|
||||
Heading => $loc_heading,
|
||||
Description => $loc_description,
|
||||
HeadingWeight => localise(\%Lexicon, $heading_weight),
|
||||
DescriptionWeight => localise(\%Lexicon, $description_weight),
|
||||
MenuCat => (defined $menucat ? $menucat : 'A'));
|
||||
}
|
||||
MenuCat => (defined $menucat ? $menucat : 'A')
|
||||
);
|
||||
} ## end foreach my $file (@files)
|
||||
|
||||
#warn "trying to close for lang $lang\n";
|
||||
my $navdb = $navdbs{$lang};
|
||||
$navdb->close();
|
||||
}
|
||||
|
||||
} ## end foreach my $lang (@langs)
|
||||
|
||||
sub localise {
|
||||
my ($lexicon, $string) = @_;
|
||||
|
||||
#print("Looking up:".$string."\n");
|
||||
$string = "" unless defined $string;
|
||||
return $lexicon->{$string} || $string;
|
||||
my $lc_string = lc($string);
|
||||
my $res = $lexicon->{$lc_string} || $string;
|
||||
|
||||
#print("Returning:".$res."\n");
|
||||
return $res;
|
||||
} ## end sub localise
|
||||
|
||||
# Subroutine to process localization
|
||||
sub process_localization {
|
||||
my ($lexicon_ref, $heading, $lang, $prefix) = @_;
|
||||
|
||||
# Localized heading based on original heading
|
||||
my $loc_heading = localise($lexicon_ref, $heading);
|
||||
|
||||
# Get the base language code from $lang
|
||||
my $base_lang = (split('-', $lang))[0];
|
||||
|
||||
# Check the condition
|
||||
if ($loc_heading eq $heading && $base_lang ne 'en') {
|
||||
|
||||
# Construct the new key by combining the prefix and the original heading
|
||||
my $key = $prefix . $heading;
|
||||
|
||||
# Localize using the constructed key
|
||||
$loc_heading = localise($lexicon_ref, $key);
|
||||
|
||||
# See if it got a hit
|
||||
if ($loc_heading eq $key) {
|
||||
$loc_heading = $heading;
|
||||
}
|
||||
} ## end if ($loc_heading eq $heading...)
|
||||
return $loc_heading; # Optionally return the localized heading
|
||||
} ## end sub process_localization
|
3
root/etc/e-smith/events/actions/post-upgrade-and-reboot
Executable file
3
root/etc/e-smith/events/actions/post-upgrade-and-reboot
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
/usr/sbin/e-smith/signal-event post-upgrade
|
||||
/usr/sbin/e-smith/signal-event reboot
|
@@ -39,6 +39,22 @@
|
||||
$OUT .= "# private access by default\n";
|
||||
$OUT .= " Require ip $localAccess $externalSSLAccess\n";
|
||||
}
|
||||
# any smanager script or style added in line should be hashed and added here to run in a modern browser
|
||||
$OUT .= " Header set Content-Security-Policy \"script-src 'self' 'unsafe-eval' 'unsafe-hashes' "
|
||||
." 'sha256-X8Qwlk0M9iDTQZqFVpbVcThRjBqQXpwTOZCLX8I+Frk=' 'sha256-inQ04nmqTZI75Z5g/tAzjahedNugPFfrhxHyoFezFkM=' 'sha256-5IsIX+Vbow7wwy2RjR3+5X06R/0CQZPkw3OHj/228cM=' 'sha256-tfVskwioRaNsV75h89itf7FujMgIrodfs1Ea4UAJNpE=' 'sha256-P51OyslUh5bGkoWk9qY+o4Su4HuwNFoQcFCeNxF7Ms8=' ; "
|
||||
." style-src 'self' 'unsafe-hashes' "
|
||||
#'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' #h2l1
|
||||
#'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' #busy-indicator
|
||||
#'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' _footer.html.ep style="position:relative;"
|
||||
#'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' _usr_list style="min-width:35em"
|
||||
#'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' groups style="min-width:15em"
|
||||
." 'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' 'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' 'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' 'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' 'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' ;"
|
||||
." \"\n";
|
||||
$OUT .= " </Location>\n";
|
||||
# prevent caching of manager files in browser
|
||||
$OUT .= " <LocationMatch \"/$place/.+\.(html|cgi)\$\">\n";
|
||||
$OUT .= " Header set Cache-Control no-store\n";
|
||||
$OUT .= " </LocationMatch>\n";
|
||||
|
||||
}
|
||||
}
|
||||
|
4
root/etc/e-smith/templates/etc/rsyslog.conf/32smanager
Normal file
4
root/etc/e-smith/templates/etc/rsyslog.conf/32smanager
Normal file
@@ -0,0 +1,4 @@
|
||||
#smanager
|
||||
:programname, isequal, "smanager" /var/log/smanager/smanager.log
|
||||
& stop
|
||||
|
@@ -67,5 +67,30 @@ hr.sme-copyrightbar {
|
||||
color: #8ebe43;
|
||||
background-color: #8ebe43;
|
||||
}
|
||||
|
||||
/* flag container*/
|
||||
#flag-container span {
|
||||
font-size: 24px;
|
||||
display: flex; /* Allows for easy centering */
|
||||
justify-content: center; /* Center horizontally */
|
||||
align-items: center; /* Center vertically */
|
||||
width: 100%; /* Full width of parent */
|
||||
height: 24px; /* Set a fixed height */
|
||||
border: 1px solid #ccc; /* Light gray border */
|
||||
border-radius: 5px; /* Rounded corners */
|
||||
cursor: default; /* Prevent text cursor */
|
||||
|
||||
}
|
||||
|
||||
.fallback-box {
|
||||
display: inline-block; /* Make it inline-block to fit around the content */
|
||||
border: 2px solid gray; /* Change the border color as desired */
|
||||
padding: 10px; /* Add some padding */
|
||||
border-radius: 10px; /* Round the corners of the box */
|
||||
font-size: 60px; /* Adjust size if needed */
|
||||
margin-top: 10px; /* Add some margin */
|
||||
text-align: center; /* Center text inside the box */
|
||||
}
|
||||
|
||||
HERE
|
||||
}
|
@@ -80,6 +80,7 @@ a:active { color: #606060; text-decoration: none; }
|
||||
|
||||
.sme-error {
|
||||
color: red;
|
||||
display:block;
|
||||
background-color: #ffffff;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
@@ -93,6 +94,7 @@ a:active { color: #606060; text-decoration: none; }
|
||||
|
||||
.sme-warning {
|
||||
color: orange;
|
||||
display:block;
|
||||
background-color: #ffffff;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
@@ -234,7 +236,7 @@ a.menu-title {
|
||||
width: 100%;
|
||||
}
|
||||
#h2e11 {
|
||||
width: 70%;
|
||||
width: 50%;
|
||||
float: left;
|
||||
}
|
||||
#h2e12 {
|
||||
@@ -257,9 +259,9 @@ a.menu-title {
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
#h2e22,#h2e23 {
|
||||
#h2e22,#h2e23,#h2e12 {
|
||||
float: left;
|
||||
width: 10%;
|
||||
width: 14em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -273,6 +275,19 @@ a.menu-title {
|
||||
left: 2px;
|
||||
}
|
||||
|
||||
.roundcube div {
|
||||
height:462px;
|
||||
width:85%;
|
||||
margin-bottom:1%;
|
||||
}
|
||||
|
||||
.roundcube object {
|
||||
margin-top:1%;
|
||||
height:95%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
|
||||
/*end*/
|
||||
EOF
|
||||
}
|
||||
|
@@ -0,0 +1,27 @@
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const flagContainer = document.getElementById('flag-container');
|
||||
|
||||
// Function to get the browser's locale
|
||||
function getBrowserLocale() {
|
||||
return navigator.language || navigator.userLanguage;
|
||||
}
|
||||
|
||||
// Function to map locale to country code
|
||||
function getCountryCodeFromLocale(locale) {
|
||||
const localeParts = locale.split('-');
|
||||
return localeParts.length > 1 ? localeParts[1] : localeParts[0];
|
||||
}
|
||||
|
||||
// Function to create and display the flag icon
|
||||
function displayFlagIcon(countryCode) {
|
||||
const flagIcon = document.createElement('span');
|
||||
flagIcon.className = `flag-icon flag-icon-${countryCode.toLowerCase()}`;
|
||||
flagIcon.id = 'flag-icon';
|
||||
flagContainer.appendChild(flagIcon);
|
||||
}
|
||||
|
||||
// Main logic
|
||||
const locale = getBrowserLocale();
|
||||
const countryCode = getCountryCodeFromLocale(locale);
|
||||
displayFlagIcon(countryCode);
|
||||
});
|
@@ -1,4 +1,6 @@
|
||||
/usr/share/smanager/log/production.log {
|
||||
/var/log/smanager/smanager.log {
|
||||
su root root
|
||||
create 600 root root
|
||||
weekly
|
||||
copytruncate
|
||||
rotate 12
|
||||
|
9
root/usr/lib/systemd/system/bootsequence.service
Normal file
9
root/usr/lib/systemd/system/bootsequence.service
Normal file
@@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Koozali SME Server boot diagnostic tool
|
||||
After=sme-server.target
|
||||
PartOf=sme-server.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/bin/sh -c "/usr/bin/systemd-analyze plot > /usr/share/smanager/themes/default/public/images/boot.svg"
|
||||
RemainAfterExit=yes
|
@@ -1,13 +1,13 @@
|
||||
[Unit]
|
||||
Description=Server Manager 2 Mojo
|
||||
Requires=network.target httpd-e-smith.service ldap.service
|
||||
After=network.target
|
||||
Requires=network-online.target httpd-e-smith.service ldap.service
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
SyslogIdentifier=smanager
|
||||
WorkingDirectory=/usr/share/smanager/script
|
||||
PIDFile=/var/run/smanager.pid
|
||||
PIDFile=/run/smanager.pid
|
||||
ExecStartPre=/sbin/e-smith/service-status smanager
|
||||
ExecStart=/usr/bin/hypnotoad srvmngr -f
|
||||
ExecStop=/usr/bin/hypnotoad -s srvmngr
|
||||
|
@@ -17,6 +17,7 @@ use Mojo::Home;
|
||||
|
||||
use DBM::Deep;
|
||||
use Mojo::JWT;
|
||||
use POSIX qw(strftime);
|
||||
|
||||
use Mojolicious::Plugin::Config;
|
||||
#use Mojolicious::Plugin::I18N;
|
||||
@@ -25,16 +26,27 @@ use SrvMngr::Plugin::I18N;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr::Model::Main;
|
||||
|
||||
use SrvMngr::Plugin::WithoutCache;
|
||||
|
||||
our $VERSION = '1.420';
|
||||
use esmith::I18N;
|
||||
|
||||
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
|
||||
our $VERSION = '51.el8.sme';
|
||||
#Extract the release value
|
||||
if ($VERSION =~ /^(\d+)/) {
|
||||
$VERSION = $1; # $1 contains the matched numeric digits
|
||||
} else {
|
||||
$VERSION = '999' #No leading numeric digits found
|
||||
}
|
||||
$VERSION = eval $VERSION;
|
||||
|
||||
use Exporter 'import';
|
||||
our @EXPORT_OK = qw(
|
||||
init_session get_mod_url theme_list
|
||||
getNavigation ip_number is_normal_password email_simple
|
||||
getNavigation ip_number validate_password is_normal_password email_simple
|
||||
mac_address_or_blank mac_address ip_number_or_blank
|
||||
lang_space get_routes_list subnet_mask get_reg_mask
|
||||
gen_locale_date_string get_public_ip_address
|
||||
);
|
||||
|
||||
has home => sub {
|
||||
@@ -200,6 +212,22 @@ sub setup_helpers {
|
||||
Mojo::JWT->new(secret => shift->app->secrets->[0] || die)
|
||||
});
|
||||
|
||||
$self->helper( selected_field => sub {
|
||||
my $self = shift;
|
||||
my @options = shift;
|
||||
my $selected = shift;
|
||||
my $count = 0;
|
||||
# search for occurence of value $selected in arrays; if found add selected => 'selected'
|
||||
for (my $i = 0; $i <= $#{$options[0]} ; $i++){
|
||||
if (grep /^$selected$/, @{$options[0][$i]}) {
|
||||
push( @{$options[0][$i]} ,'selected', 'selected' );
|
||||
$count++;last;
|
||||
}
|
||||
}
|
||||
push ( @{$options[0]} ,[ ucfirst( $selected), $selected, 'selected', 'selected'] ) if ($count <1);
|
||||
return @options;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -211,15 +239,17 @@ sub setup_plugins {
|
||||
|
||||
$self->plugin('RenderFile');
|
||||
|
||||
$self->plugin('SrvMngr::Plugin::WithoutCache');
|
||||
|
||||
# CSRF protection if production mode
|
||||
# $self->plugin('Mojolicious::Plugin::CSRFDefender' => {
|
||||
# Adapted plugin for use with GET method
|
||||
$self->plugin('SrvMngr::Plugin::CSRFDefender' => {
|
||||
onetime => 1,
|
||||
error_status => 400,
|
||||
error_content => 'Error: CSRF token is invalid or outdated'
|
||||
#$self->plugin('SrvMngr::Plugin::CSRFDefender' => {
|
||||
#onetime => 1,
|
||||
#error_status => 400,
|
||||
#error_content => 'Error: CSRF token is invalid or outdated'
|
||||
#error_template => 'csrf_400'
|
||||
}) if ( $self->mode eq 'production' );
|
||||
#}) if ( $self->mode eq 'production' );
|
||||
|
||||
$self->plugin('SrvMngr::Plugin::I18N' => {namespace => 'SrvMngr::I18N', default => 'en'});
|
||||
|
||||
@@ -535,7 +565,7 @@ sub getNavigation {
|
||||
# Determine the directory where the functions are kept
|
||||
#-----------------------------------------------------
|
||||
my $navigation_ctlr_ignore =
|
||||
"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm(-.*)?)";
|
||||
"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
|
||||
# "(\.\.?|Initial\.pm|Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
|
||||
my $navigation_cgi_ignore =
|
||||
"(\.\.?|navigation|noframes|online-manual|(internal|pleasewait)(-.*)?)";
|
||||
@@ -624,7 +654,7 @@ sub getNavigation {
|
||||
{
|
||||
$heading = $rec->prop('Heading');
|
||||
$description = $rec->prop('Description');
|
||||
$headingWeight = $rec->prop('HeadingWeight');
|
||||
$headingWeight = $rec->prop('HeadingWeight') || 99999; #Stop noise in logs if file in dir does not have nav header.
|
||||
$descriptionWeight = $rec->prop('DescriptionWeight');
|
||||
$urlpath = $rec->prop('UrlPath') || '';
|
||||
$menucat = $rec->prop('MenuCat') || 'A'; # admin menu (default)
|
||||
@@ -758,7 +788,23 @@ sub ip_number {
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
sub validate_password {
|
||||
my ($c, $strength, $pass) = @_;
|
||||
use esmith::util;
|
||||
use POSIX qw(locale_h);
|
||||
use locale;
|
||||
my $old_locale = setlocale(LC_ALL);
|
||||
setlocale(LC_ALL, "en_US");
|
||||
my $reason = esmith::util::validatePassword($pass,$strength);
|
||||
return "OK" if ($reason eq "ok");
|
||||
setlocale(LC_ALL, $old_locale);
|
||||
return
|
||||
$c->l("Bad Password Choice") . ": "
|
||||
. $c->l("The password you have chosen is not a good choice, because") . " "
|
||||
. $c->l($reason). ".";
|
||||
} ## end sub validate_password
|
||||
|
||||
# to deprecate : this is not anymore a way to validate our passwords
|
||||
sub is_normal_password {
|
||||
|
||||
# from CGI::FormMagick::Validator qw( password );
|
||||
@@ -774,6 +820,29 @@ sub is_normal_password {
|
||||
}
|
||||
}
|
||||
|
||||
sub gen_locale_date_string
|
||||
{
|
||||
my $self = shift;
|
||||
my $i18n = esmith::I18N->new();
|
||||
$i18n->setLocale('formmagick', $i18n->preferredLanguage());
|
||||
return strftime "%c", localtime;
|
||||
}
|
||||
|
||||
sub get_public_ip_address
|
||||
{
|
||||
my $self = shift;
|
||||
my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
my $sysconfig = $cdb->get('sysconfig');
|
||||
if ($sysconfig)
|
||||
{
|
||||
my $publicIP = $sysconfig->prop('PublicIP');
|
||||
if ($publicIP)
|
||||
{
|
||||
return $publicIP;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub email_simple {
|
||||
my ($c, $data) = @_;
|
||||
|
1
root/usr/share/smanager/lib/SrvMngr/Controller/.gitignore
vendored
Normal file
1
root/usr/share/smanager/lib/SrvMngr/Controller/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.tdy
|
@@ -0,0 +1 @@
|
||||
-pbp -nst -nse -l=120 -ce -csc -pt=2 -kbl=0 -mbl=1 -lbl=1
|
File diff suppressed because it is too large
Load Diff
@@ -4,23 +4,22 @@ package SrvMngr::Controller::Bugreport;
|
||||
# heading : Investigation
|
||||
# description : Report a bug
|
||||
# navigation : 7000 500
|
||||
|
||||
# routes : end
|
||||
#------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use Text::Template;
|
||||
use File::Basename;
|
||||
use esmith::FormMagick qw( gen_locale_date_string );
|
||||
|
||||
use SrvMngr qw( gen_locale_date_string );
|
||||
our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n";
|
||||
|
||||
use constant FALSE => 0;
|
||||
use constant TRUE => 1;
|
||||
|
||||
# Get some basic info on the current SME install
|
||||
our $sysconfig = $cdb->get('sysconfig');
|
||||
our $systemmode = $cdb->get('SystemMode')->value;
|
||||
@@ -31,47 +30,34 @@ our $releaseversion = $sysconfig->prop('ReleaseVersion');
|
||||
our $templatefile = '/tmp/bugreport_template.txt';
|
||||
our $configreportfile = '/tmp/configreport.txt';
|
||||
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %bugr_datas = ();
|
||||
|
||||
my $title = $c->l('bugr_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('bugr_DESCRIPTION'));
|
||||
|
||||
$bugr_datas{'trt'} = 'SHOW';
|
||||
|
||||
$c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
|
||||
$c->render(template => 'bugreport');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_report {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('bugr_FORM_TITLE');
|
||||
|
||||
my $trt = $c->param('trt') || 'SHOW';
|
||||
|
||||
my %bugr_datas = ();
|
||||
$bugr_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'SHOW') {
|
||||
create_configuration_report();
|
||||
|
||||
my $out = $c->render_to_string(inline => show_config_report());
|
||||
|
||||
$bugr_datas{'trt'} = 'DOWN';
|
||||
|
||||
$c->stash(title => $title, modul => $out, bugr_datas => \%bugr_datas);
|
||||
$c->render(template => 'bugreport2');
|
||||
}
|
||||
} ## end if ($trt eq 'SHOW')
|
||||
|
||||
if ($trt eq 'DOWN') {
|
||||
|
||||
my $modul = 'Bug report download';
|
||||
|
||||
# $c->render_file(
|
||||
@@ -80,25 +66,24 @@ sub do_report {
|
||||
# 'content_disposition' => 'attachment',
|
||||
# 'cleanup' => 1,
|
||||
# );
|
||||
|
||||
# the following in this sub will not be used !!!
|
||||
# $bugr_datas{'trt'} = 'DOWN';
|
||||
|
||||
# $c->stash(title => $title, modul => $modul, bugr_datas => \%bugr_datas);
|
||||
# $c->render(template => 'bugreport');
|
||||
}
|
||||
};
|
||||
|
||||
} ## end if ($trt eq 'DOWN')
|
||||
} ## end sub do_report
|
||||
|
||||
sub create_configuration_report {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
# TBD: possibly check $q for a boolean value eg. from a checkbox
|
||||
# indicating the user has read privacy warning etc.
|
||||
|
||||
# create the reporting template
|
||||
my $configreport_template = Text::Template->new(TYPE => 'FILE', SOURCE => '/etc/e-smith/web/common/configuration_report.tmpl', UNTAINT => 1);
|
||||
my $configreport_template = Text::Template->new(
|
||||
TYPE => 'FILE',
|
||||
SOURCE => '/usr/share/smanager/themes/default/public/configuration_report.tmpl',
|
||||
UNTAINT => 1
|
||||
);
|
||||
my $report_creation_time = gen_locale_date_string;
|
||||
|
||||
# curent kernel
|
||||
@@ -109,17 +94,17 @@ sub create_configuration_report {
|
||||
|
||||
# get additional Repositories
|
||||
my @repositories = `/sbin/e-smith/audittools/repositories`;
|
||||
#print @repositories;
|
||||
|
||||
#print @repositories;
|
||||
# get templates
|
||||
my @templates = `/sbin/e-smith/audittools/templates`;
|
||||
|
||||
# get events
|
||||
my @events = `/sbin/e-smith/audittools/events`;
|
||||
|
||||
|
||||
# set template variables
|
||||
my %vars = (report_creation_time => \$report_creation_time,
|
||||
my %vars = (
|
||||
report_creation_time => \$report_creation_time,
|
||||
releaseversion => \$releaseversion,
|
||||
curkernel => \$curkernel,
|
||||
systemmode => \$systemmode,
|
||||
@@ -133,43 +118,59 @@ sub create_configuration_report {
|
||||
# prcess template
|
||||
my $result = $configreport_template->fill_in(HASH => \%vars);
|
||||
|
||||
#take out any multiple blank lines
|
||||
#$result =~ s/\n{3,}/\n/g;
|
||||
|
||||
|
||||
# write processed template to file
|
||||
open(my $cfgrep, '>', $configreportfile) or die "Could not create temporary file for config report!";
|
||||
print $cfgrep $result;
|
||||
close $cfgrep;
|
||||
|
||||
#check if boot phase has completed.
|
||||
if (wait_for_boot_completion()) {
|
||||
#And create boot analysis image - now run externally following boot.
|
||||
$result = `/usr/bin/systemctl start bootsequence.service`;
|
||||
if (!$? == 0) {
|
||||
warn "/usr/bin/systemd-analyze plot Command failed \n";
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub create_configuration_report
|
||||
|
||||
sub wait_for_boot_completion {
|
||||
my $timeout = 60; # 1-minute timeout
|
||||
my $end_time = time() + $timeout;
|
||||
while (time() < $end_time) {
|
||||
if (`systemctl list-jobs 2>&1` =~ /No jobs running/) {
|
||||
return TRUE; # Success
|
||||
}
|
||||
sleep 5;
|
||||
}
|
||||
warn "Boot did not complete within $timeout seconds.\n";
|
||||
return FALSE; # Failure
|
||||
} ## end wait_for_boot_completion
|
||||
|
||||
sub show_config_report {
|
||||
my $c = shift;
|
||||
|
||||
my $out = '';
|
||||
$out .= sprintf "<PRE>";
|
||||
|
||||
open(my $cfgrep, '<', $configreportfile) or die "Could not find temporary config report file!";
|
||||
|
||||
while (<$cfgrep>) {
|
||||
$out .= sprintf("%s", $_);
|
||||
}
|
||||
|
||||
$out .= sprintf "</PRE>";
|
||||
|
||||
return $out;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub show_config_report
|
||||
|
||||
sub download_config_report {
|
||||
my $c = shift;
|
||||
|
||||
$c->render_file(
|
||||
'filepath' => "$configreportfile",
|
||||
'format' => 'x-download',
|
||||
'content_disposition' => 'attachment',
|
||||
'cleanup' => 1,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
} ## end sub download_config_report
|
||||
1;
|
||||
|
||||
|
@@ -7,46 +7,35 @@ package SrvMngr::Controller::Clamav;
|
||||
#
|
||||
# routes : end
|
||||
#------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#package esmith::FormMagick::Panel::clamav;
|
||||
|
||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %clm_datas = ();
|
||||
my $title = $c->l('clm_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD'));
|
||||
|
||||
$clm_datas{'FilesystemScan'} = ($db->get_prop('clamav', 'FilesystemScan')) || 'disabled';
|
||||
$clm_datas{'Quarantine'} = ($db->get_prop('clamav', 'Quarantine')) || 'disabled';
|
||||
|
||||
$clm_datas{'clam_versions'} = get_clam_versions();
|
||||
|
||||
$c->stash(title => $title, modul => $modul, clm_datas => \%clm_datas);
|
||||
$c->render(template => 'clamav');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_update {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $http_clamav_status = $c->param('http_clamav_status') || 'disabled';
|
||||
my $smtp_clamav_status = $c->param('smtp_clamav_status') || '';
|
||||
|
||||
my $result = "";
|
||||
|
||||
$c->change_settings();
|
||||
|
||||
# Update the system
|
||||
@@ -59,32 +48,24 @@ sub do_update {
|
||||
} else {
|
||||
$c->flash(error => $result);
|
||||
}
|
||||
|
||||
$c->redirect_to('/clamav');
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub change_settings {
|
||||
my $c = shift;
|
||||
|
||||
my $status = $c->param('status');
|
||||
|
||||
my $FilesystemScan = ($c->param('FilesystemScan') || 'disabled');
|
||||
my $Quarantine = ($c->param('Quarantine') || 'disabled');
|
||||
|
||||
my $DatabaseMirror = ($c->param('DatabaseMirror') || 'db.us.clamav.net');
|
||||
my $UpdateOfficeHrs = ($c->param('UpdateOfficeHrs') || 'disabled');
|
||||
my $UpdateNonOfficeHrs = ($c->param('UpdateNonOfficeHrs') || 'disabled');
|
||||
my $UpdateWeekend = ($c->param('UpdateWeekend') || 'disabled');
|
||||
|
||||
my $HTTPProxyServer = ($c->param('HTTPProxyServer') || '');
|
||||
my $HTTPProxyPort = ($c->param('HTTPProxyPort') || '');
|
||||
my $HTTPProxyUsername = ($c->param('HTTPProxyUsername') || '');
|
||||
my $HTTPProxyPassword = ($c->param('HTTPProxyPassword') || '');
|
||||
|
||||
my $clamav = $db->get('clamav') || $db->new_record('clamav', { type => 'service' });
|
||||
$status ||= $clamav->prop('status');
|
||||
|
||||
$clamav->merge_props(
|
||||
status => $status,
|
||||
FilesystemScan => $FilesystemScan,
|
||||
@@ -98,16 +79,12 @@ sub change_settings {
|
||||
HTTPProxyUsername => $HTTPProxyUsername,
|
||||
HTTPProxyPassword => $HTTPProxyPassword,
|
||||
);
|
||||
} ## end sub change_settings
|
||||
|
||||
|
||||
}
|
||||
|
||||
sub get_clam_versions
|
||||
{
|
||||
sub get_clam_versions {
|
||||
my $version = `/usr/bin/freshclam -V`;
|
||||
chomp $version;
|
||||
$version =~ s/^ClamAV //;
|
||||
|
||||
return $version;
|
||||
}
|
||||
} ## end sub get_clam_versions
|
||||
1;
|
||||
|
@@ -4,111 +4,87 @@ package SrvMngr::Controller::Datetime;
|
||||
# heading : System
|
||||
# description : Date and time
|
||||
# navigation : 4000 400
|
||||
|
||||
# routes : end
|
||||
#------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use esmith::FormMagick;
|
||||
use esmith::util;
|
||||
|
||||
use SrvMngr qw( gen_locale_date_string );
|
||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %dat_datas = ();
|
||||
my $title = $c->l('dat_FORM_TITLE');
|
||||
my $modul = $c->l('dat_INITIAL_DESC');
|
||||
|
||||
|
||||
$dat_datas{ntpstatus} = 'disabled';
|
||||
|
||||
my $rec = $cdb->get('ntpd');
|
||||
|
||||
if ($rec) {
|
||||
$dat_datas{'ntpserver'} = $rec->prop('NTPServer') || '';
|
||||
|
||||
if ($rec->prop('status') eq 'enabled') {
|
||||
$dat_datas{ntpstatus} = 'enabled'
|
||||
unless ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' and $dat_datas{ntpserver} =~ m#^\s*$#;
|
||||
}
|
||||
}
|
||||
|
||||
($dat_datas{weekday}, $dat_datas{monthname},
|
||||
$dat_datas{month}, $dat_datas{day}, $dat_datas{year},
|
||||
$dat_datas{hour}, $dat_datas{minute}, $dat_datas{second},
|
||||
$dat_datas{ampm}) = split /\|/,
|
||||
} ## end if ($rec)
|
||||
( $dat_datas{weekday}, $dat_datas{monthname}, $dat_datas{month}, $dat_datas{day}, $dat_datas{year},
|
||||
$dat_datas{hour}, $dat_datas{minute}, $dat_datas{second}, $dat_datas{ampm}
|
||||
)
|
||||
= split /\|/,
|
||||
`/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
|
||||
|
||||
# get rid of trailing carriage return on last field
|
||||
chop($dat_datas{ampm});
|
||||
|
||||
$dat_datas{'now_string'} = esmith::FormMagick->gen_locale_date_string();
|
||||
|
||||
$dat_datas{'now_string'} = gen_locale_date_string;
|
||||
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
|
||||
$c->render('datetime');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my %dat_datas = ();
|
||||
my $title = $c->l('dat_FORM_TITLE');
|
||||
my $modul = $c->l('dat_INITIAL_DESC');
|
||||
my $result;
|
||||
my $success;
|
||||
|
||||
my $old_ntpstatus = $c->param('Old_ntpstatus');
|
||||
$dat_datas{ntpstatus} = $c->param('Ntpstatus');
|
||||
|
||||
|
||||
if ($dat_datas{ntpstatus} ne $old_ntpstatus) {
|
||||
|
||||
if ($dat_datas{ntpstatus} eq 'disabled') {
|
||||
($dat_datas{weekday},
|
||||
$dat_datas{monthname},
|
||||
$dat_datas{month},
|
||||
$dat_datas{day},
|
||||
$dat_datas{year},
|
||||
$dat_datas{hour},
|
||||
$dat_datas{minute},
|
||||
$dat_datas{second},
|
||||
$dat_datas{ampm}) = split /\|/,
|
||||
( $dat_datas{weekday}, $dat_datas{monthname}, $dat_datas{month},
|
||||
$dat_datas{day}, $dat_datas{year}, $dat_datas{hour},
|
||||
$dat_datas{minute}, $dat_datas{second}, $dat_datas{ampm}
|
||||
)
|
||||
= split /\|/,
|
||||
`/bin/date '+%A|%B|%-m|%-d|%Y|%-I|%M|%S|%p'`;
|
||||
|
||||
# get rid of trailing carriage return on last field
|
||||
chop($dat_datas{ampm});
|
||||
|
||||
} else {
|
||||
|
||||
$dat_datas{ntpserver} = ($cdb->get_prop('ntpd', 'NTPServer')) || '';
|
||||
}
|
||||
|
||||
$dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
|
||||
|
||||
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
|
||||
return $c->render('datetime');
|
||||
}
|
||||
} ## end if ($dat_datas{ntpstatus...})
|
||||
|
||||
if ($dat_datas{ntpstatus} eq 'enabled') {
|
||||
|
||||
# update ntpserver
|
||||
|
||||
$dat_datas{ntpserver} = $c->param('Ntpserver') || '';
|
||||
|
||||
if ($dat_datas{ntpserver} eq "pool.ntp.org") {
|
||||
$result .= $c->l('dat_INVALID_NTP_ADDR');
|
||||
} elsif ($dat_datas{ntpserver} =~ /^([a-zA-Z0-9\.\-]+)$/) {
|
||||
$dat_datas{ntpserver} = $1;
|
||||
|
||||
# } elsif ( $dat_datas{ntpserver} =~ /^\s*$/ ) {
|
||||
# $dat_datas{ntpserver} = "";
|
||||
} else {
|
||||
@@ -118,54 +94,48 @@ sub do_update {
|
||||
if (!$result) {
|
||||
$success = update_ntpserver($c, $dat_datas{ntpserver});
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
# set Locale time & clean ntpserver
|
||||
|
||||
#my $servername = ($c->param('ServerName') || 'WS');
|
||||
if (!$result) {
|
||||
$result = validate_change_datetime($c);
|
||||
|
||||
if ($result eq 'OK') {
|
||||
$success = $c->l('dat_UPDATING_CLOCK');
|
||||
$result = '';
|
||||
disable_ntp();
|
||||
$success .= '<br>' . $c->l('dat_SERVER_DISABLED_DESC');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($result eq 'OK')
|
||||
} ## end if (!$result)
|
||||
} ## end else [ if ($dat_datas{ntpstatus...})]
|
||||
|
||||
if ($result) {
|
||||
$c->stash(error => $result);
|
||||
$c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
|
||||
return $c->render('datetime');
|
||||
}
|
||||
#$result = $c->l('dat_SUCCESS');
|
||||
} ## end if ($result)
|
||||
|
||||
#$result = $c->l('dat_SUCCESS');
|
||||
my $message = "'Datetime' update DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $success);
|
||||
|
||||
$c->redirect_to('/datetime');
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub validate_change_datetime {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
#--------------------------------------------------
|
||||
# Untaint parameters and check for validity
|
||||
#--------------------------------------------------
|
||||
|
||||
my $timezone = $c->param('Timezone');
|
||||
|
||||
if ($timezone =~ /^([\w\-]+\/?[\w\-+]*)$/) {
|
||||
$timezone = $1;
|
||||
} else {
|
||||
$timezone = "US/Eastern";
|
||||
}
|
||||
|
||||
my $month = $c->param('Month');
|
||||
|
||||
if ($month =~ /^(\d{1,2})$/) {
|
||||
@@ -173,10 +143,10 @@ sub validate_change_datetime {
|
||||
} else {
|
||||
$month = "1";
|
||||
}
|
||||
|
||||
if (($month < 1) || ($month > 12)) {
|
||||
return $c->l('dat_INVALID_MONTH') . " $month. " . $c->l('dat_MONTH_BETWEEN_1_AND_12');
|
||||
}
|
||||
|
||||
my $day = $c->param('Day');
|
||||
|
||||
if ($day =~ /^(\d{1,2})$/) {
|
||||
@@ -184,11 +154,12 @@ sub validate_change_datetime {
|
||||
} else {
|
||||
$day = "1";
|
||||
}
|
||||
|
||||
if (($day < 1) || ($day > 31)) {
|
||||
return $c->l('dat_INVALID_DAY') . " $day. " . $c->l('dat_BETWEEN_1_AND_31');
|
||||
}
|
||||
|
||||
my $year = $c->param('Year');
|
||||
|
||||
if ($year =~ /^(\d{4})$/) {
|
||||
$year = $1;
|
||||
} else {
|
||||
@@ -198,18 +169,19 @@ sub validate_change_datetime {
|
||||
if (($year < 1900) || ($year > 2200)) {
|
||||
return $c->l('dat_INVALID_YEAR') . " $year. " . $c->l('dat_FOUR_DIGIT_YEAR');
|
||||
}
|
||||
|
||||
my $hour = $c->param('Hour');
|
||||
|
||||
if ($hour =~ /^(\d{1,2})$/) {
|
||||
$hour = $1;
|
||||
} else {
|
||||
$hour = "12";
|
||||
}
|
||||
|
||||
if (($hour < 1) || ($hour > 12)) {
|
||||
return $c->l('dat_INVALID_HOUR') . " $hour. " . $c->l('dat_BETWEEN_1_AND_12');
|
||||
}
|
||||
|
||||
my $minute = $c->param('Minute');
|
||||
|
||||
if ($minute =~ /^(\d{1,2})$/) {
|
||||
$minute = $1;
|
||||
} else {
|
||||
@@ -219,8 +191,8 @@ sub validate_change_datetime {
|
||||
if (($minute < 0) || ($minute > 59)) {
|
||||
return $c->l('datINVALID_MINUTE') . " $minute. " . $c->l('dat_BETWEEN_0_AND_59');
|
||||
}
|
||||
|
||||
my $second = $c->param('Second');
|
||||
|
||||
if ($second =~ /^(\d{1,2})$/) {
|
||||
$second = $1;
|
||||
} else {
|
||||
@@ -230,8 +202,8 @@ sub validate_change_datetime {
|
||||
if (($second < 0) || ($second > 59)) {
|
||||
return $c->l('dat_INVALID_SECOND') . " $second. " . $c->l('dat_BETWEEN_0_AND_59');
|
||||
}
|
||||
|
||||
my $ampm = $c->param('Ampm');
|
||||
|
||||
if ($ampm =~ /^(AM|PM)$/) {
|
||||
$ampm = $1;
|
||||
} else {
|
||||
@@ -239,8 +211,8 @@ sub validate_change_datetime {
|
||||
}
|
||||
|
||||
# convert to 24 hour time
|
||||
|
||||
$hour = $hour % 12;
|
||||
|
||||
if ($ampm eq "PM") {
|
||||
$hour = $hour + 12;
|
||||
}
|
||||
@@ -248,10 +220,10 @@ sub validate_change_datetime {
|
||||
#--------------------------------------------------
|
||||
# Store time zone in configuration database
|
||||
#--------------------------------------------------
|
||||
|
||||
my $conf = esmith::ConfigDB->open();
|
||||
my $old = $conf->get('UnsavedChanges')->value;
|
||||
my $rec = $conf->get('TimeZone');
|
||||
|
||||
unless ($rec) {
|
||||
$rec = $conf->new_record('TimeZone', undef);
|
||||
}
|
||||
@@ -262,29 +234,22 @@ sub validate_change_datetime {
|
||||
# Signal event to change time zone, system time
|
||||
# and hardware clock
|
||||
#--------------------------------------------------
|
||||
|
||||
my $newdate = sprintf "%02d%02d%02d%02d%04d.%02d",
|
||||
$month, $day, $hour, $minute, $year, $second;
|
||||
|
||||
esmith::util::backgroundCommand(2,
|
||||
"/sbin/e-smith/signal-event","timezone-update",$newdate);
|
||||
|
||||
my $newdate = sprintf "%02d%02d%02d%02d%04d.%02d", $month, $day, $hour, $minute, $year, $second;
|
||||
esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "timezone-update", $newdate);
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub validate_change_datetime
|
||||
|
||||
sub update_ntpserver {
|
||||
|
||||
my $c = shift;
|
||||
my $ntpserver = shift;
|
||||
|
||||
my $msg;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Looks good; go ahead and change the parameters.
|
||||
#------------------------------------------------------------
|
||||
|
||||
my $old = $cdb->get('UnsavedChanges')->value;
|
||||
my $rec = $cdb->get('ntpd');
|
||||
|
||||
if ($rec) {
|
||||
$rec->set_prop('status', 'enabled');
|
||||
$rec->set_prop('NTPServer', $ntpserver);
|
||||
@@ -293,25 +258,20 @@ sub update_ntpserver {
|
||||
{ type => 'service', status => 'enabled', SyncToHWClockSupported => 'yes', NTPServer => $ntpserver });
|
||||
}
|
||||
$cdb->get('UnsavedChanges')->set_value($old);
|
||||
|
||||
$msg = $c->l('dat_SETTINGS_CHANGED');
|
||||
|
||||
if ($ntpserver =~ /^\s*$/) {
|
||||
$rec->set_prop('status', ($rec->prop('SyncToHWClockSupported') || 'yes') eq 'yes' ? 'enabled' : 'disabled');
|
||||
$rec->set_prop('NTPServer', '');
|
||||
$msg = $c->l('dat_INVALID_NTP_SERVER') if ($rec->prop('SyncToHWClockSupported') || 'yes') ne 'yes';
|
||||
}
|
||||
|
||||
} ## end if ($ntpserver =~ /^\s*$/)
|
||||
esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "timeserver-update");
|
||||
|
||||
return $msg;
|
||||
}
|
||||
|
||||
} ## end sub update_ntpserver
|
||||
|
||||
sub disable_ntp {
|
||||
|
||||
# make sure that the parameters are set for disabled
|
||||
|
||||
my $old = $cdb->get('UnsavedChanges')->value;
|
||||
my $rec = $cdb->get('ntpd');
|
||||
|
||||
@@ -322,11 +282,8 @@ sub disable_ntp {
|
||||
$rec = $cdb->new_record('ntpd',
|
||||
{ type => 'service', status => 'enabled', SyncToHWClockSupported => 'yes', NTPServer => '' });
|
||||
}
|
||||
|
||||
$cdb->get('UnsavedChanges')->set_value($old);
|
||||
|
||||
}
|
||||
|
||||
} ## end sub disable_ntp
|
||||
|
||||
sub getTimezone {
|
||||
|
||||
@@ -336,57 +293,53 @@ sub getTimezone {
|
||||
# If that is not defined, try and get it from /etc/localtime.
|
||||
# If that doesn't work, default to US/Eastern.
|
||||
#--------------------------------------------------
|
||||
|
||||
my $localtime;
|
||||
my $timezonedefault = "US/Eastern";
|
||||
|
||||
if (defined $cdb->get('TimeZone')) {
|
||||
$timezonedefault = $cdb->get('TimeZone')->value;
|
||||
} else {
|
||||
|
||||
if (defined($localtime = readlink '/etc/localtime')) {
|
||||
my $pos = index $localtime, 'zoneinfo/';
|
||||
|
||||
if ($pos > -1) {
|
||||
$timezonedefault = substr $localtime, ($pos + 9);
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (defined($localtime...))
|
||||
} ## end else [ if (defined $cdb->get(...))]
|
||||
return $timezonedefault;
|
||||
}
|
||||
|
||||
} ## end sub getTimezone
|
||||
|
||||
sub getZone_list {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
#--------------------------------------------------
|
||||
# Get a sorted list of time zones
|
||||
#--------------------------------------------------
|
||||
|
||||
$ENV{BASH_ENV} = '';
|
||||
if (! open (ZONES, "cd /usr/share/zoneinfo; /usr/bin/find . -type f -or -type l | /bin/grep '^./[A-Z]' |"))
|
||||
{
|
||||
|
||||
if (!open(ZONES, "cd /usr/share/zoneinfo; /usr/bin/find . -type f -or -type l | /bin/grep '^./[A-Z]' |")) {
|
||||
warn($c->l('COULD_NOT_OPEN_TZ_FILE') . $! . '.');
|
||||
return undef;
|
||||
}
|
||||
my $zone;
|
||||
my @zones = ();
|
||||
|
||||
while (defined ($zone = <ZONES>))
|
||||
{
|
||||
while (defined($zone = <ZONES>)) {
|
||||
chop($zone);
|
||||
$zone =~ s/^.\///;
|
||||
push @zones, $zone;
|
||||
}
|
||||
} ## end while (defined($zone = <ZONES>...))
|
||||
close ZONES;
|
||||
my @zt = sort @zones;
|
||||
return \@zt;
|
||||
}
|
||||
|
||||
} ## end sub getZone_list
|
||||
|
||||
sub getMonth_list {
|
||||
|
||||
my $c = shift;
|
||||
return [[ $c->l('dat_JANUARY') => '1'],
|
||||
return [
|
||||
[ $c->l('dat_JANUARY') => '1' ],
|
||||
[ $c->l('dat_FEBRUARY') => '2' ],
|
||||
[ $c->l('dat_MARCH') => '3' ],
|
||||
[ $c->l('dat_APRIL') => '4' ],
|
||||
@@ -397,8 +350,7 @@ sub getMonth_list {
|
||||
[ $c->l('dat_SEPTEMBER') => '9' ],
|
||||
[ $c->l('dat_OCTOBER') => '10' ],
|
||||
[ $c->l('dat_NOVEMBER') => '11' ],
|
||||
[ $c->l('dat_DECEMBER') => '12']];
|
||||
}
|
||||
|
||||
|
||||
[ $c->l('dat_DECEMBER') => '12' ]
|
||||
];
|
||||
} ## end sub getMonth_list
|
||||
1;
|
||||
|
@@ -7,47 +7,35 @@ package SrvMngr::Controller::Directory;
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use esmith::util qw(ldapBase);
|
||||
use esmith::FormMagick::Panel::directory;
|
||||
|
||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %dir_datas = ();
|
||||
my $title = $c->l('dir_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
|
||||
|
||||
$dir_datas{'root'} = get_ldap_base();
|
||||
|
||||
$dir_datas{'access'} = ($db->get_prop('ldap', 'access')) || 'private';
|
||||
$dir_datas{'department'} = ($db->get_prop('ldap', 'defaultDepartment')) || '';
|
||||
$dir_datas{'company'} = ($db->get_prop('ldap', 'defaultCompany')) || '';
|
||||
$dir_datas{'street'} = ($db->get_prop('ldap', 'defaultStreet')) || '';
|
||||
$dir_datas{'city'} = ($db->get_prop('ldap', 'defaultCity')) || '';
|
||||
$dir_datas{'phonenumber'} = ($db->get_prop('ldap', 'defaultPhoneNumber')) || '';
|
||||
|
||||
$c->stash(title => $title, modul => $modul, dir_datas => \%dir_datas);
|
||||
$c->render(template => 'directory');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_update {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $access = $c->param('access');
|
||||
my $department = $c->param('department');
|
||||
my $company = $c->param('company');
|
||||
@@ -55,9 +43,7 @@ sub do_update {
|
||||
my $city = $c->param('city');
|
||||
my $phonenumber = $c->param('phonenumber');
|
||||
my $existing = $c->param('existing');
|
||||
|
||||
my $result = "";
|
||||
|
||||
$db->get('ldap')->set_prop('access', $access);
|
||||
$db->get('ldap')->set_prop('defaultDepartment', $department);
|
||||
$db->get('ldap')->set_prop('defaultCompany', $company);
|
||||
@@ -75,23 +61,33 @@ sub do_update {
|
||||
$user->set_prop('Dept', $department);
|
||||
$user->set_prop('City', $city);
|
||||
$user->set_prop('Street', $street);
|
||||
}
|
||||
}
|
||||
} ## end foreach my $user (@users)
|
||||
} ## end if ($existing eq 'update')
|
||||
#
|
||||
# Update the system
|
||||
#
|
||||
|
||||
system("/sbin/e-smith/signal-event ldap-update") == 0
|
||||
or $result = $c->l('ERROR_UPDATING_CONFIGURATION');
|
||||
|
||||
my $title = $c->l('dir_FORM_TITLE');
|
||||
|
||||
if ($result eq '') { $result = $c->l('dir_SUCCESS'); }
|
||||
|
||||
$c->stash(title => $title, modul => $result);
|
||||
$c->render(template => 'module');
|
||||
} ## end sub do_update
|
||||
|
||||
};
|
||||
sub get_ldap_base {
|
||||
return esmith::util::ldapBase(get_value('','DomainName'));
|
||||
}
|
||||
|
||||
sub get_value {
|
||||
my $fm = shift;
|
||||
my $item = shift;
|
||||
|
||||
my $record = $db->get($item);
|
||||
if ($record) {
|
||||
return $record->value();
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
1;
|
||||
|
@@ -10,139 +10,126 @@ package SrvMngr::Controller::Domains;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use Data::Dumper;
|
||||
|
||||
#use esmith::FormMagick::Panel::domains;
|
||||
|
||||
use esmith::DomainsDB;
|
||||
use esmith::AccountsDB;
|
||||
|
||||
#use URI::Escape;
|
||||
|
||||
|
||||
our $ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
my ($ddb,$cdb,$adb);
|
||||
#our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
our $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+);
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %dom_datas = ();
|
||||
my $title = $c->l('dom_FORM_TITLE');
|
||||
|
||||
$ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$dom_datas{trt} = 'LST';
|
||||
|
||||
my @domains;
|
||||
for ($ddb->domains())
|
||||
{
|
||||
my $ns = $_->prop('Nameservers') || 'internet';
|
||||
|
||||
for ($ddb->domains()) {
|
||||
my $ns = $_->prop('Nameservers') || 'internet';
|
||||
push @domains,
|
||||
{ Domain => $_->key, $_->props,
|
||||
{
|
||||
Domain => $_->key,
|
||||
$_->props,
|
||||
Nameservers => $ns,
|
||||
}
|
||||
}
|
||||
};
|
||||
} ## end for ($ddb->domains())
|
||||
$dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder');
|
||||
$dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
|
||||
|
||||
$c->stash(title => $title, dom_datas => \%dom_datas, domains => \@domains);
|
||||
$c->render(template => 'domains');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = $c->param('trt');
|
||||
my $domain = $c->param('Domain') || '';
|
||||
$ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
#$trt = 'DEL' if ( $rt eq 'domaindel1' );
|
||||
#$trt = 'UPD' if ( $rt eq 'domainupd1' );
|
||||
#$trt = 'UP2' if ( $rt eq 'domainup21' );
|
||||
#$trt = 'ADD' if ( $rt eq 'domainadd1' );
|
||||
|
||||
my %dom_datas = ();
|
||||
my $title = $c->l('dom_FORM_TITLE');
|
||||
my $result = '';
|
||||
|
||||
$dom_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt ne 'ADD' and $trt ne 'UPD' and $trt ne 'UP2' and $trt ne 'DEL') {
|
||||
$result = "Trt unknown ( $trt ) !"
|
||||
$result = "Trt unknown ( $trt ) !";
|
||||
}
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
#nothing
|
||||
}
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $rec = $ddb->get($domain);
|
||||
|
||||
if ($rec) {
|
||||
$dom_datas{domain} = $domain;
|
||||
$dom_datas{description} = $rec->prop('Description') || '';
|
||||
$dom_datas{content} = $rec->prop('Content') || '';
|
||||
$dom_datas{nameservers} = $rec->prop('Nameservers') || 'internet';
|
||||
} else {
|
||||
$result = "Domain $domain not found !"
|
||||
}
|
||||
$result = "Domain $domain not found !";
|
||||
}
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'UP2') {
|
||||
|
||||
$dom_datas{forwarder} = $cdb->get_prop('dnscache', 'Forwarder') || '';
|
||||
$dom_datas{forwarder2} = $cdb->get_prop('dnscache', 'Forwarder2') || '';
|
||||
|
||||
}
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my $rec = $ddb->get($domain);
|
||||
|
||||
if ($rec) {
|
||||
$dom_datas{domain} = $domain;
|
||||
$dom_datas{description} = $rec->prop('Description') || '';
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'LST') {
|
||||
my @domains;
|
||||
|
||||
if ($adb) {
|
||||
@domains = $ddb->domains();
|
||||
}
|
||||
$c->stash(domains => \@domains);
|
||||
|
||||
}
|
||||
} ## end if ($trt eq 'LST')
|
||||
|
||||
if (!$result) {
|
||||
$c->stash(error => $result);
|
||||
}
|
||||
$c->stash(title => $title, dom_datas => \%dom_datas);
|
||||
$c->render(template => 'domains');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = $c->param('trt');
|
||||
|
||||
$ddb = esmith::DomainsDB->open || die "Couldn't open domains db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my %dom_datas = ();
|
||||
my ($res, $result) = '';
|
||||
|
||||
@@ -150,16 +137,14 @@ sub do_update {
|
||||
my $domain = $c->param('Domain');
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
my $account = $c->param('Account');
|
||||
|
||||
# controls (validate ?????)
|
||||
#? validate_new_domain_name( $c, $domain, $account );
|
||||
#$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= ' blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->create_modify_domain('create', $domain);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
@@ -168,10 +153,9 @@ sub do_update {
|
||||
if (!$result) {
|
||||
$result = $c->l('dom_SUCCESSFULLY_CREATED') . " $domain";
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $description = $c->param('Description');
|
||||
my $content = $c->param('Content');
|
||||
my $nameservers = $c->param('Nameservers');
|
||||
@@ -179,10 +163,9 @@ sub do_update {
|
||||
# controls
|
||||
#$res = validate_description( $c, $account );
|
||||
#$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= 'blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->create_modify_domain('modify', $domain);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
@@ -191,134 +174,123 @@ sub do_update {
|
||||
if (!$result) {
|
||||
$result = $c->l('dom_SUCCESSFULLY_MODIFIED') . " $domain";
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'UP2') {
|
||||
|
||||
my $forwarder = $c->param('Forwarder');
|
||||
my $forwarder2 = $c->param('Forwarder2');
|
||||
|
||||
# controls
|
||||
|
||||
$res = $c->ip_number_or_blank($forwarder);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
$res = $c->ip_number_or_blank($forwarder2);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= 'blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->modify_dns($forwarder, $forwarder2);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('SUCCESS') . " $forwarder $forwarder2";
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'UP2')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
# controls
|
||||
#$res = validate_is_domain($c, $domain);
|
||||
#$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= 'blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->delete_domain($domain);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('dom_SUCCESSFULLY_DELETED') . " $domain";
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
my $title = $c->l('dom_FORM_TITLE');
|
||||
$dom_datas{'domain'} = $domain;
|
||||
$dom_datas{'trt'} = $trt;
|
||||
|
||||
$c->stash(error => $result . "($res)");
|
||||
$c->stash(title => $title, dom_datas => \%dom_datas);
|
||||
return $c->render('domains');
|
||||
}
|
||||
|
||||
} ## end if ($res ne 'OK')
|
||||
my $message = "'Domains' updates ($trt) DONE";
|
||||
$c->app->log->info($message);
|
||||
|
||||
$c->flash(success => $result);
|
||||
$c->redirect_to('/domains');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub create_modify_domain {
|
||||
|
||||
my ($c, $action, $domain) = @_;
|
||||
|
||||
$domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
|
||||
unless ($domain) {
|
||||
return ($c->l($action eq 'create' ? 'dom_ERROR_CREATING_DOMAIN'
|
||||
: 'dom_ERROR_MODIFYING_DOMAIN') . ' Ctl');
|
||||
}
|
||||
|
||||
unless ($domain) {
|
||||
return (
|
||||
$c->l(
|
||||
$action eq 'create'
|
||||
? 'dom_ERROR_CREATING_DOMAIN'
|
||||
: 'dom_ERROR_MODIFYING_DOMAIN'
|
||||
)
|
||||
. ' Ctl'
|
||||
);
|
||||
} ## end unless ($domain)
|
||||
my $rec = $ddb->get($domain);
|
||||
|
||||
if ($rec and $action eq 'create') {
|
||||
return $c->l('dom_DOMAIN_IN_USE_ERROR');
|
||||
}
|
||||
|
||||
if (not $rec and $action eq 'modify') {
|
||||
return $c->l('dom_NONEXISTENT_DOMAIN_ERROR');
|
||||
}
|
||||
|
||||
$rec ||= $ddb->new_record($domain, { type => 'domain' });
|
||||
my %props;
|
||||
$props{$_} = $c->param($_) for (qw(Content Description Nameservers));
|
||||
$rec->merge_props(%props);
|
||||
|
||||
if ( system( "/sbin/e-smith/signal-event",
|
||||
"domain-$action", "$domain" ) != 0 ) {
|
||||
return ($c->l($action eq 'create' ? 'dom_ERROR_CREATING_DOMAIN'
|
||||
: 'dom_ERROR_MODIFYING_DOMAIN') . " Exe $action");
|
||||
}
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "domain-$action", "$domain") != 0) {
|
||||
return (
|
||||
$c->l(
|
||||
$action eq 'create'
|
||||
? 'dom_ERROR_CREATING_DOMAIN'
|
||||
: 'dom_ERROR_MODIFYING_DOMAIN'
|
||||
)
|
||||
. " Exe $action"
|
||||
);
|
||||
} ## end if (system("/sbin/e-smith/signal-event"...))
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub create_modify_domain
|
||||
|
||||
sub delete_domain {
|
||||
|
||||
my ($c, $domain) = @_;
|
||||
|
||||
$domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
|
||||
return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . ' Ctl') unless ($domain);
|
||||
|
||||
my $rec = $ddb->get($domain);
|
||||
return ($c->l('dom_NONEXISTENT_DOMAIN_ERROR')) if (not $rec);
|
||||
|
||||
$rec->set_prop('type', 'domain-deleted');
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "domain-delete", "$domain") != 0) {
|
||||
return ($c->l('dom_ERROR_WHILE_REMOVING_DOMAIN') . 'Exe');
|
||||
}
|
||||
|
||||
$rec->delete;
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub delete_domain
|
||||
|
||||
sub modify_dns {
|
||||
|
||||
my ($c, $forwarder, $forwarder2) = @_;
|
||||
|
||||
my $dnscache = $cdb->get('dnscache');
|
||||
|
||||
($forwarder, $forwarder2) = ($forwarder2, '')
|
||||
if ($forwarder2 and not $forwarder);
|
||||
|
||||
@@ -334,169 +306,125 @@ sub modify_dns {
|
||||
$dnscache->delete_prop('Forwarder2');
|
||||
}
|
||||
|
||||
unless ( system( "/sbin/e-smith/signal-event", "dns-update" ) == 0 )
|
||||
{
|
||||
unless (system("/sbin/e-smith/signal-event", "dns-update") == 0) {
|
||||
return $c->l('dom_ERROR_UPDATING');
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub modify_dns
|
||||
|
||||
sub existing_accounts_list {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my @existingAccounts = ([ 'Administrator' => 'admin' ]);
|
||||
|
||||
foreach my $a ($adb->get_all) {
|
||||
if ($a->prop('type') =~ /(user|group)/) {
|
||||
push @existingAccounts, [ $a->key => $a->key ];
|
||||
}
|
||||
|
||||
if ($a->prop('type') eq "domain") {
|
||||
my $target = $adb->get($a->prop('Account'));
|
||||
|
||||
unless ($target)
|
||||
{
|
||||
warn "WARNING: domain (" . $a->key . ") => missing Account("
|
||||
. $a->prop('Account') . ")\n";
|
||||
unless ($target) {
|
||||
warn "WARNING: domain (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
|
||||
next;
|
||||
}
|
||||
|
||||
push @existingAccounts, [ $a->key, $a->key ]
|
||||
unless ($target->prop('type') eq "domain");
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($a->prop('type') eq...)
|
||||
} ## end foreach my $a ($adb->get_all)
|
||||
return (\@existingAccounts);
|
||||
}
|
||||
|
||||
} ## end sub existing_accounts_list
|
||||
|
||||
sub content_options_list {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my @options = ([ $c->l('dom_PRIMARY_SITE') => 'Primary' ]);
|
||||
|
||||
foreach ($adb->ibays) {
|
||||
push @options, [ $_->prop('Name') => $_->key ]
|
||||
if ($_->key ne 'Primary');
|
||||
}
|
||||
return \@options;
|
||||
} ## end sub content_options_list
|
||||
|
||||
return \@options
|
||||
}
|
||||
|
||||
|
||||
sub get_content_value
|
||||
{
|
||||
sub get_content_value {
|
||||
my $c = shift;
|
||||
my $domain = shift;
|
||||
|
||||
return $domain ? $ddb->get_prop($domain, 'Content') : 'Primary';
|
||||
}
|
||||
} ## end sub get_content_value
|
||||
|
||||
|
||||
sub get_description_value
|
||||
{
|
||||
sub get_description_value {
|
||||
my $c = shift;
|
||||
|
||||
my $domain = $c->param('Domain') || undef;
|
||||
|
||||
return $ddb->get_prop($domain, 'Description');
|
||||
}
|
||||
|
||||
} ## end sub get_description_value
|
||||
|
||||
sub nameserver_options_list {
|
||||
|
||||
my $c = shift;
|
||||
my $domain = $c->param('Domain') || undef;
|
||||
|
||||
my @opts = qw(localhost internet);
|
||||
push @opts, 'corporate' if ($cdb->get_prop('dnscache', 'Forwarder'));
|
||||
my $ns = ($ddb->get_prop($domain, 'Nameservers') || 'internet');
|
||||
push @opts, $ns unless scalar grep {/^$ns$/} @opts;
|
||||
|
||||
my @options;
|
||||
|
||||
foreach (@opts) {
|
||||
push @options, [ $c->l("dom_$_") => $_ ];
|
||||
}
|
||||
|
||||
return \@options;
|
||||
}
|
||||
|
||||
} ## end sub nameserver_options_list
|
||||
|
||||
sub get_nameserver_value {
|
||||
my $c = shift;
|
||||
|
||||
my $domain = $c->param('Domain') || undef;
|
||||
|
||||
return ($ddb->get_prop($domain, 'Nameservers') || 'internet');
|
||||
}
|
||||
} ## end sub get_nameserver_value
|
||||
|
||||
|
||||
sub validate_Domain
|
||||
{
|
||||
sub validate_Domain {
|
||||
my $c = shift;
|
||||
my $domain = lc shift;
|
||||
return ($domain =~ /^($REGEXP_DOMAIN)$/)
|
||||
? 'OK'
|
||||
: 'DOMAIN_NAME_VALIDATION_ERROR';
|
||||
} ## end sub validate_Domain
|
||||
|
||||
return ($domain =~ /^($REGEXP_DOMAIN)$/) ? 'OK' :
|
||||
'DOMAIN_NAME_VALIDATION_ERROR';
|
||||
}
|
||||
sub validate_Description {
|
||||
|
||||
|
||||
sub validate_Description
|
||||
{
|
||||
# XXX - FIXME - NOTREACHED
|
||||
# We used to use the Description in the Appletalk volume name
|
||||
# which meant it needed validation. I don't see any reason to
|
||||
# do this any more
|
||||
|
||||
my $c = shift;
|
||||
my $description = shift;
|
||||
|
||||
return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) ? 'OK' :
|
||||
'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
|
||||
}
|
||||
|
||||
return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/)
|
||||
? 'OK'
|
||||
: 'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
|
||||
} ## end sub validate_Description
|
||||
|
||||
sub ip_number_or_blank {
|
||||
|
||||
# XXX - FIXME - we should push this down into CGI::FormMagick
|
||||
|
||||
my $c = shift;
|
||||
my $ip = shift;
|
||||
|
||||
if (!defined($ip) || $ip eq "")
|
||||
{
|
||||
if (!defined($ip) || $ip eq "") {
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
return ip_number($c, $ip);
|
||||
}
|
||||
|
||||
} ## end sub ip_number_or_blank
|
||||
|
||||
sub ip_number {
|
||||
|
||||
# from CGI::FormMagick::Validator qw( ip_number );
|
||||
|
||||
my ($c, $data) = @_;
|
||||
|
||||
return undef unless defined $data;
|
||||
|
||||
return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
|
||||
|
||||
my @octets = split /\./, $data;
|
||||
my $dots = ($data =~ tr/.//);
|
||||
|
||||
return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
|
||||
|
||||
foreach my $octet (@octets) {
|
||||
return $c->l("FM_IP_NUMBER3", $octet) if $octet > 255;
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
|
||||
|
||||
} ## end sub ip_number
|
||||
1;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -11,181 +11,140 @@ package SrvMngr::Controller::Groups;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use Data::Dumper;
|
||||
|
||||
#use esmith::FormMagick::Panel::groups;
|
||||
use esmith::AccountsDB;
|
||||
|
||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my ($cdb,$adb);
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %grp_datas = ();
|
||||
my $title = $c->l('grp_FORM_TITLE');
|
||||
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$grp_datas{trt} = 'LST';
|
||||
|
||||
my @groups;
|
||||
|
||||
if ($adb) {
|
||||
@groups = $adb->groups();
|
||||
}
|
||||
|
||||
$c->stash(title => $title, grp_datas => \%grp_datas, groups => \@groups);
|
||||
$c->render(template => 'groups');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LST');
|
||||
my $group = $c->param('group');
|
||||
|
||||
my %grp_datas = ();
|
||||
my $title = $c->l('grp_FORM_TITLE');
|
||||
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$grp_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
#nothing
|
||||
}
|
||||
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my %members = ();
|
||||
my %users = ();
|
||||
|
||||
my $rec = $adb->get($group);
|
||||
if ($rec and $rec->prop('type') eq 'group') {
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'group') {
|
||||
$grp_datas{group} = $group;
|
||||
$grp_datas{description} = $rec->prop('Description') || '';
|
||||
|
||||
%members = @{ $c->gen_members_list($group) };
|
||||
}
|
||||
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
$c->stash(members => \%members, users => \%users);
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my %members = ();
|
||||
my %ibays = ();
|
||||
|
||||
my $rec = $adb->get($group);
|
||||
if ($rec and $rec->prop('type') eq 'group') {
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'group') {
|
||||
$grp_datas{group} = $group;
|
||||
$grp_datas{description} = $rec->prop('Description') || '';
|
||||
|
||||
%members = @{ $c->gen_members_list($group) };
|
||||
|
||||
%ibays = @{ $c->gen_ibays_list($group) };
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
$c->stash(members => \%members, ibays => \%ibays);
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'LST') {
|
||||
my @groups;
|
||||
|
||||
if ($adb) {
|
||||
@groups = $adb->groups();
|
||||
}
|
||||
|
||||
$c->stash(groups => \@groups);
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'LST')
|
||||
$c->stash(title => $title, grp_datas => \%grp_datas);
|
||||
$c->render(template => 'groups');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LST');
|
||||
my $groupName = $c->param('groupName') || '';
|
||||
|
||||
my $title = $c->l('grp_FORM_TITLE');
|
||||
my ($res, $result) = '';
|
||||
|
||||
my %grp_datas = ();
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$grp_datas{'trt'} = $trt;
|
||||
$grp_datas{'group'} = $groupName;
|
||||
my @members = ();
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
my $groupDesc = $c->param('groupDesc');
|
||||
@members = @{ $c->every_param('groupMembers') };
|
||||
|
||||
my $members = join(",", @members);
|
||||
|
||||
# controls
|
||||
$res = $c->validate_group($groupName);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
$res = $c->validate_group_length($groupName);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
$res = $c->validate_group_naming_conflict($groupName);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
$res = $c->validate_description($groupDesc);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
$res = $c->validate_group_has_members(@members);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
my %props = (
|
||||
'type', 'group', 'Description',
|
||||
$groupDesc, 'Members', $members
|
||||
);
|
||||
|
||||
my %props = ('type', 'group', 'Description', $groupDesc, 'Members', $members);
|
||||
$res = '';
|
||||
if ( ! $result ) {
|
||||
|
||||
if (!$result) {
|
||||
$adb->new_record($groupName, \%props);
|
||||
|
||||
# Untaint groupName before use in system()
|
||||
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
|
||||
|
||||
system("/sbin/e-smith/signal-event", "group-create", "$groupName") == 0
|
||||
or $result .= $c->l('qgp_CREATE_ERROR') . "\n";
|
||||
}
|
||||
} ## end if (!$result)
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('grp_CREATED_GROUP') . ' ' . $groupName;
|
||||
$res = 'OK';
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $groupDesc = $c->param('groupDesc');
|
||||
@members = @{ $c->every_param('groupMembers') };
|
||||
my $members = join(",", @members);
|
||||
@@ -194,72 +153,61 @@ sub do_update {
|
||||
$res = '';
|
||||
$res = validate_description($c, $groupDesc);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
$res = validate_group_has_members($c, @members);
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
$res = '';
|
||||
if ( ! $result ) {
|
||||
|
||||
if (!$result) {
|
||||
$adb->get($groupName)->set_prop('Members', $members);
|
||||
$adb->get($groupName)->set_prop('Description', $groupDesc);
|
||||
|
||||
# Untaint groupName before use in system()
|
||||
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
|
||||
|
||||
system("/sbin/e-smith/signal-event", "group-modify", "$groupName") == 0
|
||||
or $result .= $c->l('qgp_MODIFY_ERROR') . "\n";
|
||||
}
|
||||
} ## end if (!$result)
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('grp_MODIFIED_GROUP') . ' ' . $groupName;
|
||||
$res = 'OK';
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
if ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
|
||||
$groupName = $1;
|
||||
} else {
|
||||
$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName;
|
||||
}
|
||||
|
||||
my $rec = $adb->get($groupName);
|
||||
$result .= $c->l('grp_ERR_INTERNAL_FAILURE') . ':' . $groupName unless ($rec);
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = delete_group($c, $groupName);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('grp_DELETED_GROUP') . ' ' . $groupName;
|
||||
$res = 'OK';
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash(error => $result);
|
||||
my %members = @{ $c->gen_members_list($groupName) };
|
||||
$c->stash(title => $title, members => \%members, grp_datas => \%grp_datas);
|
||||
return $c->render('groups');
|
||||
}
|
||||
|
||||
} ## end if ($res ne 'OK')
|
||||
my $message = "'Groups' updates ($trt) DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $result);
|
||||
|
||||
$c->redirect_to('/groups');
|
||||
};
|
||||
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub delete_group {
|
||||
|
||||
my ($c, $groupName) = @_;
|
||||
|
||||
# Update the db account (1)
|
||||
@@ -267,73 +215,55 @@ sub delete_group {
|
||||
|
||||
# Untaint groupName before use in system()
|
||||
($groupName) = ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/);
|
||||
|
||||
return (system ("/sbin/e-smith/signal-event", "group-delete", "$groupName") ||
|
||||
! $adb->get($groupName)->delete()) ?
|
||||
$c->l('DELETE_ERROR') : 'OK';
|
||||
|
||||
}
|
||||
|
||||
return (system("/sbin/e-smith/signal-event", "group-delete", "$groupName") || !$adb->get($groupName)->delete())
|
||||
? $c->l('DELETE_ERROR')
|
||||
: 'OK';
|
||||
} ## end sub delete_group
|
||||
|
||||
sub gen_members_list {
|
||||
|
||||
my ($c, $group) = @_;
|
||||
|
||||
my @members = ();
|
||||
my $rec = $adb->get($group);
|
||||
@members = split(/,/, $rec->prop('Members')) if ($rec);
|
||||
|
||||
my %names;
|
||||
|
||||
foreach my $m (@members) {
|
||||
my $name;
|
||||
|
||||
if ($m eq 'admin') {
|
||||
$name = "Administrator";
|
||||
}
|
||||
else {
|
||||
$name = $adb->get($m)->prop('FirstName') . " "
|
||||
. $adb->get($m)->prop('LastName');
|
||||
} else {
|
||||
$name = $adb->get($m)->prop('FirstName') . " " . $adb->get($m)->prop('LastName');
|
||||
}
|
||||
$names{$m} = $name;
|
||||
}
|
||||
} ## end foreach my $m (@members)
|
||||
@members = %names;
|
||||
|
||||
return \@members;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub gen_members_list
|
||||
|
||||
sub gen_ibays_list {
|
||||
|
||||
my ($c, $group) = @_;
|
||||
|
||||
my %names;
|
||||
|
||||
foreach my $ibay ($adb->ibays) {
|
||||
if ($ibay->prop('Group') eq $group) {
|
||||
$names{ $ibay->key } = $ibay->prop('Name');
|
||||
}
|
||||
}
|
||||
} ## end foreach my $ibay ($adb->ibays)
|
||||
my @ibays = %names;
|
||||
|
||||
return \@ibays;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub gen_ibays_list
|
||||
|
||||
sub gen_users_list {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my @users = sort { $a->key() cmp $b->key() } $adb->users();
|
||||
my %names;
|
||||
|
||||
foreach my $user (@users) {
|
||||
$names{$user->key} = $user->prop('FirstName') . " "
|
||||
. $user->prop('LastName');
|
||||
$names{ $user->key } = $user->prop('FirstName') . " " . $user->prop('LastName');
|
||||
}
|
||||
|
||||
return \%names;
|
||||
}
|
||||
|
||||
} ## end sub gen_users_list
|
||||
|
||||
=head1 VALIDATION
|
||||
|
||||
@@ -350,11 +280,9 @@ ok($panel->validate_is_group('ro2ot') eq 'NOT_A_GROUP', "Ro2ot is not a group");
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
sub validate_is_group () {
|
||||
my $c = shift;
|
||||
my $group = shift;
|
||||
|
||||
my @groups = $adb->groups();
|
||||
my %groups = map { $_->key => 1 } @groups;
|
||||
|
||||
@@ -362,9 +290,7 @@ sub validate_is_group () {
|
||||
return ($c->l('grp_NOT_A_GROUP'));
|
||||
}
|
||||
return ("OK");
|
||||
|
||||
}
|
||||
|
||||
} ## end sub validate_is_group
|
||||
|
||||
=head2 validate_group_naming_conflict FM GROUPNAME
|
||||
|
||||
@@ -375,29 +301,21 @@ Returns "NAME_CONFLICT" if this group name conflicts with anything else
|
||||
ok (undef, 'need testing for validate_naming_Conflicts');
|
||||
=cut
|
||||
|
||||
|
||||
sub validate_group_naming_conflict
|
||||
{
|
||||
sub validate_group_naming_conflict {
|
||||
my $c = shift;
|
||||
my $groupName = shift;
|
||||
|
||||
my $account = $adb->get($groupName);
|
||||
my $type;
|
||||
|
||||
if (defined $account)
|
||||
{
|
||||
if (defined $account) {
|
||||
$type = $account->prop('type');
|
||||
}
|
||||
elsif (defined getpwnam($groupName) || defined getgrnam($groupName))
|
||||
{
|
||||
} elsif (defined getpwnam($groupName) || defined getgrnam($groupName)) {
|
||||
$type = "system";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return ('OK');
|
||||
}
|
||||
return ($c->l('grp_ACCOUNT_CONFLICT', $groupName, $type));
|
||||
}
|
||||
} ## end sub validate_group_naming_conflict
|
||||
|
||||
=head2 validate_group FM groupname
|
||||
|
||||
@@ -416,12 +334,12 @@ ok(validate_group('','f&oo') eq 'GROUP_CONTAINS_INVALD', 'f&oo is not a valid gr
|
||||
sub validate_group {
|
||||
my $c = shift;
|
||||
my $groupName = shift;
|
||||
|
||||
unless ($groupName =~ /^([a-z][\-\_\.a-z0-9]*)$/) {
|
||||
return $c->l('grp_GROUP_NAMING');
|
||||
}
|
||||
return ('OK');
|
||||
}
|
||||
|
||||
} ## end sub validate_group
|
||||
|
||||
=head2 validate_group_length FM GROUPNAME
|
||||
|
||||
@@ -440,20 +358,19 @@ ok(($panel->validate_group_length('fooooooooooooooooo') eq 'GROUP_TOO_LONG'), "a
|
||||
sub validate_group_length {
|
||||
my $c = shift;
|
||||
my $groupName = shift;
|
||||
|
||||
|
||||
my $maxGroupNameLength = ($cdb->get('maxGroupNameLength')
|
||||
my $maxGroupNameLength = (
|
||||
$cdb->get('maxGroupNameLength')
|
||||
? $cdb->get('maxGroupNameLength')->prop('type')
|
||||
: "") || 12;
|
||||
: ""
|
||||
)
|
||||
|| 12;
|
||||
|
||||
if (length $groupName > $maxGroupNameLength) {
|
||||
return $c->l('grp_GROUP_TOO_LONG', $maxGroupNameLength);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return ('OK');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub validate_group_length
|
||||
|
||||
=head2 validate_group_has_members FM MEMBERS
|
||||
|
||||
@@ -476,14 +393,13 @@ sub validate_group_has_members {
|
||||
my $c = shift;
|
||||
my @members = (@_);
|
||||
my $count = @members;
|
||||
|
||||
if ($count == 0) {
|
||||
return ($c->l('grp_NO_MEMBERS'));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return ('OK');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub validate_group_has_members
|
||||
|
||||
=pod
|
||||
|
||||
@@ -492,16 +408,13 @@ Checks the supplied description. Period is allowed in description
|
||||
|
||||
=cut
|
||||
|
||||
sub validate_description
|
||||
{
|
||||
sub validate_description {
|
||||
my ($c, $description) = @_;
|
||||
|
||||
if ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) {
|
||||
return ('OK');
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return ($c->l('FM_ERR_UNEXPECTED_DESC'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} ## end sub validate_description
|
||||
1
|
||||
|
@@ -11,16 +11,12 @@ package SrvMngr::Controller::Hostentries;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use Data::Dumper;
|
||||
|
||||
#use esmith::FormMagick::Panel::hostentries;
|
||||
|
||||
use esmith::DomainsDB;
|
||||
use esmith::AccountsDB;
|
||||
use esmith::HostsDB;
|
||||
@@ -29,23 +25,23 @@ use HTML::Entities;
|
||||
use Net::IPv4Addr qw(ipv4_in_network);
|
||||
|
||||
#use URI::Escape;
|
||||
|
||||
our $ddb = esmith::DomainsDB->open || die "Couldn't open hostentries db";
|
||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
our $hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
#our $ddb = esmith::DomainsDB->open || die "Couldn't open hostentries db";
|
||||
#our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
#our $hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
#our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
my ($ddb,$cdb,$hdb,$ndb);
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %hos_datas = ();
|
||||
my $title = $c->l('hos_FORM_TITLE');
|
||||
my $notif = '';
|
||||
|
||||
#my $ddb = esmith::DomainsDB->open || die "Couldn't open hostentries db";
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
$hos_datas{trt} = 'LIST';
|
||||
|
||||
my %dom_hosts = ();
|
||||
|
||||
foreach my $d (@{ domains_list() }) {
|
||||
@@ -56,9 +52,8 @@ sub main {
|
||||
|
||||
# my @entries;
|
||||
push @{ $dom_hosts{$d}{'HOSTS'} }, host_data($_) foreach (@hosts);
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if (my @hosts = $hdb->...)
|
||||
} ## end foreach my $d (@{ domains_list...})
|
||||
$c->stash(
|
||||
title => $title,
|
||||
notif => $notif,
|
||||
@@ -66,52 +61,45 @@ sub main {
|
||||
dom_hosts => \%dom_hosts
|
||||
);
|
||||
$c->render(template => 'hostentries');
|
||||
|
||||
}
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = $c->param('trt') || 'LST';
|
||||
my $hostname = $c->param('Hostname') || '';
|
||||
|
||||
$trt = 'ADD' if ($rt eq 'hostentryadd');
|
||||
$trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD');
|
||||
|
||||
my %hos_datas = ();
|
||||
my $title = $c->l('hos_FORM_TITLE');
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
my $notif = '';
|
||||
|
||||
$hos_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
}
|
||||
|
||||
if ($trt eq 'UPD' or $trt eq 'DEL') {
|
||||
|
||||
my $rec = $hdb->get($hostname);
|
||||
|
||||
if ($rec) {
|
||||
$hos_datas{hostname} = $rec->key;
|
||||
( $hos_datas{name}, $hos_datas{domain} ) =
|
||||
split_hostname($hostname);
|
||||
($hos_datas{name}, $hos_datas{domain})
|
||||
= split_hostname($hostname);
|
||||
$hos_datas{internalip} = $rec->prop('InternalIP') || '';
|
||||
$hos_datas{externalip} = $rec->prop('ExternalIP') || '';
|
||||
$hos_datas{macaddress} = $rec->prop('MACAddress') || '';
|
||||
$hos_datas{hosttype} = $rec->prop('HostType');
|
||||
$hos_datas{comment} =
|
||||
HTML::Entities::encode( $rec->prop('Comment') );
|
||||
}
|
||||
else {
|
||||
$hos_datas{comment} = HTML::Entities::encode($rec->prop('Comment'));
|
||||
} else {
|
||||
$notif = "Hostname $hostname not found !";
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'UPD' or $trt...)
|
||||
|
||||
#if ( $trt eq 'DEL' ) {
|
||||
|
||||
# my $rec = $hdb->get($hostname);
|
||||
# if ( $rec ) {
|
||||
# get_hos_datas( $rec, %hos_datas );
|
||||
@@ -119,29 +107,24 @@ sub do_display {
|
||||
# $notif = "Hostname $hostname not found !"
|
||||
# }
|
||||
#}
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
}
|
||||
|
||||
$c->stash(title => $title, notif => $notif, hos_datas => \%hos_datas);
|
||||
$c->render(template => 'hostentries');
|
||||
|
||||
}
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
|
||||
my %hos_datas = ();
|
||||
my $title = $c->l('hos_FORM_TITLE');
|
||||
$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$hdb = esmith::HostsDB->open || die "Couldn't open hosts db";
|
||||
$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
|
||||
my $notif = '';
|
||||
my $result = '';
|
||||
|
||||
$hos_datas{'name'} = lc $c->param('Name');
|
||||
$hos_datas{'domain'} = lc $c->param('Domain');
|
||||
$hos_datas{'hostname'} = $c->param('Hostname');
|
||||
@@ -151,12 +134,13 @@ sub do_update {
|
||||
$hos_datas{'macaddress'} = $c->param('Macaddress');
|
||||
$hos_datas{'externalip'} = $c->param('Externalip');
|
||||
my $hostname = "$hos_datas{'name'}.$hos_datas{'domain'}";
|
||||
if ( $trt eq 'ADD' ) {
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
$hos_datas{'hostname'} = $hostname;
|
||||
|
||||
# controls
|
||||
my $res = '';
|
||||
|
||||
unless ($hos_datas{'name'} =~ /^[a-z0-9][a-z0-9-]*$/) {
|
||||
$result .= $c->l('hos_HOSTNAME_VALIDATOR_ERROR') . '<br>';
|
||||
}
|
||||
@@ -165,43 +149,41 @@ sub do_update {
|
||||
|| $hos_datas{comment} eq '')
|
||||
{
|
||||
$result .= $c->l('hos_HOSTNAME_COMMENT_ERROR') . '<br>';
|
||||
}
|
||||
} ## end unless ($hos_datas{comment...})
|
||||
|
||||
# Look for duplicate hosts.
|
||||
my $hostrec = undef;
|
||||
|
||||
if ($hostrec = $hdb->get($hostname)) {
|
||||
$result .= $c->l(
|
||||
'hos_HOSTNAME_EXISTS_ERROR',
|
||||
{
|
||||
fullHostName => $hostname,
|
||||
{ fullHostName => $hostname,
|
||||
type => $hostrec->prop('HostType')
|
||||
}
|
||||
) . '<br>',;
|
||||
}
|
||||
} ## end if ($hostrec = $hdb->get...)
|
||||
|
||||
if (!$result and $hos_datas{hosttype} ne 'Self') {
|
||||
if ($hos_datas{hosttype} eq 'Local') {
|
||||
$hos_datas{'trt'} = 'ALC'; # ADD/LOCAL
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$hos_datas{'trt'} = 'ARM'; # ADD/REMOVE
|
||||
}
|
||||
|
||||
$c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
|
||||
return $c->render(template => 'hostentries');
|
||||
}
|
||||
} ## end if (!$result and $hos_datas...)
|
||||
|
||||
#!#$result .= ' blocked';
|
||||
|
||||
if (!$result) {
|
||||
$res = create_modify_hostentry($c, $trt, %hos_datas);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('hos_CREATE_OR_MODIFY_SUCCEEDED') . ' ' . $hostname;
|
||||
$trt = 'SUC';
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
@@ -210,7 +192,6 @@ sub do_update {
|
||||
|
||||
#$res = validate_description( $c, $account );
|
||||
#$result .= $res unless $res eq 'OK';
|
||||
|
||||
unless ($hos_datas{comment} =~ /^([a-zA-Z0-9][\_\.\-,A-Za-z0-9\s]*)$/
|
||||
|| $hos_datas{comment} eq '')
|
||||
{
|
||||
@@ -220,17 +201,14 @@ sub do_update {
|
||||
if (!$result and $hos_datas{hosttype} ne 'Self') {
|
||||
if ($hos_datas{hosttype} eq 'Local') {
|
||||
$hos_datas{'trt'} = 'ULC'; # UPDATE/LOCAL
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$hos_datas{'trt'} = 'URM'; # UPDATE/REMOVE
|
||||
}
|
||||
|
||||
$c->stash(title => $title, notif => '', hos_datas => \%hos_datas);
|
||||
return $c->render(template => 'hostentries');
|
||||
}
|
||||
} ## end if (!$result and $hos_datas...)
|
||||
|
||||
#!#$result .= 'blocked';
|
||||
|
||||
if (!$result) {
|
||||
$res = create_modify_hostentry($c, $trt, %hos_datas);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
@@ -240,7 +218,7 @@ sub do_update {
|
||||
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
|
||||
$trt = 'SUC';
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt =~ /^.LC$/) {
|
||||
|
||||
@@ -248,21 +226,16 @@ sub do_update {
|
||||
my $res = '';
|
||||
$res = ip_number($c, $hos_datas{internalip});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = not_in_dhcp_range($c, $hos_datas{internalip});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = not_taken($c, $hos_datas{internalip});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = must_be_local($c, $hos_datas{internalip});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = mac_address_or_blank($c, $hos_datas{macaddress});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
#!#$result .= 'blocked';
|
||||
|
||||
if (!$result) {
|
||||
$res = create_modify_hostentry($c, $trt, %hos_datas);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
@@ -272,7 +245,7 @@ sub do_update {
|
||||
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
|
||||
$trt = 'SUC';
|
||||
}
|
||||
}
|
||||
} ## end if ($trt =~ /^.LC$/)
|
||||
|
||||
if ($trt =~ /^.RM$/) {
|
||||
|
||||
@@ -282,7 +255,6 @@ sub do_update {
|
||||
$result .= $res . '<br>' unless $res eq 'OK';
|
||||
|
||||
#!#$result .= 'blocked';
|
||||
|
||||
if (!$result) {
|
||||
$res = create_modify_hostentry($c, $trt, %hos_datas);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
@@ -292,15 +264,12 @@ sub do_update {
|
||||
$result = $c->l('hos_MODIFY_SUCCEEDED') . ' ' . $hostname;
|
||||
$trt = 'SUC';
|
||||
}
|
||||
|
||||
}
|
||||
} ## end if ($trt =~ /^.RM$/)
|
||||
|
||||
#if ( $trt eq 'ULC' ) {
|
||||
#}
|
||||
|
||||
#if ( $trt eq 'URM' ) {
|
||||
#}
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
# controls
|
||||
@@ -308,41 +277,36 @@ sub do_update {
|
||||
|
||||
#$res = validate_is_hostentry($c, $hostname);
|
||||
#$result .= $res unless $res eq 'OK';
|
||||
|
||||
#!#$result .= 'blocked';
|
||||
|
||||
if (!$result) {
|
||||
my $res = delete_hostentry($c, $hos_datas{hostname});
|
||||
$result .= $res unless $res eq 'OK';
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('hos_REMOVE_SUCCEEDED') . ' ' . $hostname;
|
||||
$trt = 'SUC';
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'DEL')
|
||||
$hos_datas{'hostname'} = $hostname;
|
||||
$hos_datas{'trt'} = $trt;
|
||||
|
||||
$c->stash(title => $title, notif => $result, hos_datas => \%hos_datas);
|
||||
|
||||
if ($hos_datas{trt} ne 'SUC') {
|
||||
return $c->render(template => 'hostentries');
|
||||
}
|
||||
$c->redirect_to('/hostentries');
|
||||
|
||||
}
|
||||
} ## end sub do_update
|
||||
|
||||
sub create_modify_hostentry {
|
||||
|
||||
my ($c, $trt, %hos_datas) = @_;
|
||||
|
||||
my $hostname = $hos_datas{hostname};
|
||||
my $action;
|
||||
|
||||
if ($trt eq 'ADD' or $trt eq 'ALC' or $trt eq 'ARM') {
|
||||
$action = 'create';
|
||||
}
|
||||
|
||||
if ($trt eq 'UPD' or $trt eq 'ULC' or $trt eq 'URM') {
|
||||
$action = 'modify';
|
||||
}
|
||||
@@ -353,20 +317,20 @@ sub create_modify_hostentry {
|
||||
? $c->l('hos_ERROR_CREATING_HOST')
|
||||
: $c->l('hos_ERROR_MODIFYING_HOST')
|
||||
);
|
||||
}
|
||||
} ## end unless ($hostname)
|
||||
|
||||
# Untaint and lowercase $hostname
|
||||
$hostname =~ /([\w\.-]+)/;
|
||||
$hostname = lc($1);
|
||||
|
||||
my $rec = $hdb->get($hostname);
|
||||
|
||||
if ($rec and $action eq 'create') {
|
||||
return $c->l('hos_HOSTNAME_IN_USE_ERROR');
|
||||
}
|
||||
|
||||
if (not $rec and $action eq 'modify') {
|
||||
return $c->l('hos_NONEXISTENT_HOSTNAME_ERROR');
|
||||
}
|
||||
|
||||
my %props = (
|
||||
type => 'host',
|
||||
HostType => $hos_datas{hosttype},
|
||||
@@ -378,77 +342,60 @@ sub create_modify_hostentry {
|
||||
|
||||
if ($action eq 'create') {
|
||||
if ($hdb->new_record($hostname, \%props)) {
|
||||
if (
|
||||
system( "/sbin/e-smith/signal-event", "host-$action",
|
||||
$hostname ) != 0
|
||||
)
|
||||
{
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
|
||||
return $c->l('hos_ERROR_WHILE_CREATING_HOST');
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if ($hdb->new_record($hostname...))
|
||||
} ## end if ($action eq 'create')
|
||||
|
||||
if ($action eq 'modify') {
|
||||
if ($rec->merge_props(%props)) {
|
||||
if (
|
||||
system( "/sbin/e-smith/signal-event", "host-$action",
|
||||
$hostname ) != 0
|
||||
)
|
||||
{
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "host-$action", $hostname) != 0) {
|
||||
rturn $c->l('hos_ERROR_WHILE_MODIFYING_HOST');
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if ($rec->merge_props(...))
|
||||
} ## end if ($action eq 'modify')
|
||||
return 'OK';
|
||||
|
||||
}
|
||||
} ## end sub create_modify_hostentry
|
||||
|
||||
sub delete_hostentry {
|
||||
|
||||
my ($c, $hostname) = @_;
|
||||
|
||||
# Untaint $hostname before use in system()
|
||||
$hostname =~ /([\w\.-]+)/;
|
||||
$hostname = $1;
|
||||
|
||||
return ($c->l('hos_ERROR_WHILE_REMOVING_HOST')) unless ($hostname);
|
||||
|
||||
my $rec = $hdb->get($hostname);
|
||||
return ($c->l('hos_NONEXISTENT_HOST_ERROR')) if (not $rec);
|
||||
|
||||
if ($rec->delete()) {
|
||||
if (
|
||||
system( "/sbin/e-smith/signal-event", "host-delete", "$hostname" )
|
||||
== 0 )
|
||||
{
|
||||
if (system("/sbin/e-smith/signal-event", "host-delete", "$hostname") == 0) {
|
||||
return 'OK';
|
||||
}
|
||||
}
|
||||
} ## end if ($rec->delete())
|
||||
return ($c->l('hos_ERROR_WHILE_DELETING_HOST'));
|
||||
}
|
||||
} ## end sub delete_hostentry
|
||||
|
||||
sub domains_list {
|
||||
|
||||
my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB";
|
||||
my @domains;
|
||||
|
||||
for ($d->domains) {
|
||||
my $ns = $_->prop("Nameservers") || 'localhost';
|
||||
push @domains, $_->key if ($ns eq 'localhost');
|
||||
}
|
||||
|
||||
return \@domains;
|
||||
}
|
||||
} ## end sub domains_list
|
||||
|
||||
sub host_data {
|
||||
|
||||
my $host_record = shift;
|
||||
|
||||
my $ht = $host_record->prop('HostType');
|
||||
my $ip =
|
||||
( $ht eq 'Self' ) ? $cdb->get_value('LocalIP')
|
||||
my $ip
|
||||
= ($ht eq 'Self') ? $cdb->get_value('LocalIP')
|
||||
: ($ht eq 'Remote') ? $host_record->prop('ExternalIP')
|
||||
: $host_record->prop('InternalIP');
|
||||
|
||||
my %data = (
|
||||
'IP' => $ip,
|
||||
'HostName' => $host_record->key(),
|
||||
@@ -457,19 +404,12 @@ sub host_data {
|
||||
'Comment' => ($host_record->prop('Comment') || ''),
|
||||
'static' => ($host_record->prop('static') || 'no')
|
||||
);
|
||||
return \%data
|
||||
|
||||
}
|
||||
return \%data;
|
||||
} ## end sub host_data
|
||||
|
||||
sub hosttype_list {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
return [
|
||||
[ $c->l('SELF') => 'Self' ],
|
||||
[ $c->l('LOCAL') => 'Local' ],
|
||||
[ $c->l('REMOTE') => 'Remote' ]
|
||||
];
|
||||
return [ [ $c->l('SELF') => 'Self' ], [ $c->l('LOCAL') => 'Local' ], [ $c->l('REMOTE') => 'Remote' ] ];
|
||||
}
|
||||
|
||||
sub split_hostname {
|
||||
@@ -481,86 +421,67 @@ sub mac_address_or_blank {
|
||||
my ($c, $data) = @_;
|
||||
return "OK" unless $data;
|
||||
return mac_address($c, $data);
|
||||
}
|
||||
} ## end sub mac_address_or_blank
|
||||
|
||||
sub mac_address {
|
||||
|
||||
# from CGI::FormMagick::Validator::Network
|
||||
|
||||
my ($c, $data) = @_;
|
||||
|
||||
$_ = lc $data; # easier to match on $_
|
||||
|
||||
if (not defined $_) {
|
||||
return $c->l('FM_MAC_ADDRESS1');
|
||||
}
|
||||
elsif (/^([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f]){5})$/) {
|
||||
} elsif (/^([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f]){5})$/) {
|
||||
return "OK";
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $c->l('FM_MAC_ADDRESS2');
|
||||
}
|
||||
}
|
||||
} ## end sub mac_address
|
||||
|
||||
sub ip_number_or_blank {
|
||||
|
||||
# XXX - FIXME - we should push this down into CGI::FormMagick
|
||||
|
||||
my $c = shift;
|
||||
my $ip = shift;
|
||||
|
||||
if (!defined($ip) || $ip eq "") {
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
return ip_number($c, $ip);
|
||||
}
|
||||
} ## end sub ip_number_or_blank
|
||||
|
||||
sub ip_number {
|
||||
|
||||
# from CGI::FormMagick::Validator qw( ip_number );
|
||||
|
||||
my ($c, $data) = @_;
|
||||
|
||||
return undef unless defined $data;
|
||||
|
||||
return $c->l('FM_IP_NUMBER1') unless $data =~ /^[\d.]+$/;
|
||||
|
||||
my @octets = split /\./, $data;
|
||||
my $dots = ($data =~ tr/.//);
|
||||
|
||||
return $c->l('FM_IP_NUMBER2') unless (scalar @octets == 4 and $dots == 3);
|
||||
|
||||
foreach my $octet (@octets) {
|
||||
return $c->l("FM_IP_NUMBER3", $octet) if $octet > 255;
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
} ## end sub ip_number
|
||||
|
||||
sub not_in_dhcp_range {
|
||||
|
||||
my $c = shift;
|
||||
my $address = shift;
|
||||
|
||||
my $status = $cdb->get('dhcpd')->prop('status') || "disabled";
|
||||
return 'OK' unless $status eq "enabled";
|
||||
|
||||
my $start = $cdb->get('dhcpd')->prop('start');
|
||||
my $end = $cdb->get('dhcpd')->prop('end');
|
||||
|
||||
return ( esmith::util::IPquadToAddr($start) <=
|
||||
esmith::util::IPquadToAddr($address)
|
||||
&& esmith::util::IPquadToAddr($address) <=
|
||||
esmith::util::IPquadToAddr($end) )
|
||||
return ( esmith::util::IPquadToAddr($start) <= esmith::util::IPquadToAddr($address)
|
||||
&& esmith::util::IPquadToAddr($address) <= esmith::util::IPquadToAddr($end))
|
||||
? $c->l('hos_ADDR_IN_DHCP_RANGE')
|
||||
: 'OK';
|
||||
}
|
||||
} ## end sub not_in_dhcp_range
|
||||
|
||||
sub not_taken {
|
||||
|
||||
my $c = shift;
|
||||
my $localip = shift;
|
||||
|
||||
my $server_localip = $cdb->get_value('LocalIP') || '';
|
||||
my $server_gateway = $cdb->get_value('GatewayIP') || '';
|
||||
my $server_extip = $cdb->get_value('ExternalIP') || '';
|
||||
@@ -569,7 +490,6 @@ sub not_taken {
|
||||
#$c->debug_msg("\$server_localip is $server_localip");
|
||||
#$c->debug_msg("\$server_gateway is $server_gateway");
|
||||
#$c->debug_msg("\$server_extip is $server_extip");
|
||||
|
||||
if ($localip eq $server_localip) {
|
||||
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
|
||||
}
|
||||
@@ -582,18 +502,16 @@ sub not_taken {
|
||||
&& ($server_extip eq $localip))
|
||||
{
|
||||
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
|
||||
}
|
||||
} ## end if (($cdb->get_value('SystemMode'...)))
|
||||
|
||||
if ($localip eq '127.0.0.1') {
|
||||
return $c->l('hos_ERR_IP_IS_LOCAL_OR_GATEWAY');
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return 'OK';
|
||||
}
|
||||
}
|
||||
} ## end sub not_taken
|
||||
|
||||
sub must_be_local {
|
||||
|
||||
my $c = shift;
|
||||
my $localip = shift;
|
||||
|
||||
@@ -603,13 +521,13 @@ sub must_be_local {
|
||||
|
||||
foreach my $spec (@local_list) {
|
||||
next if $spec eq '127.0.0.1';
|
||||
|
||||
if (eval { Net::IPv4Addr::ipv4_in_network($spec, $localip) }) {
|
||||
return 'OK';
|
||||
}
|
||||
}
|
||||
} ## end foreach my $spec (@local_list)
|
||||
|
||||
# Not OK. The IP is not on any of our local networks.
|
||||
return $c->l('hos_ERR_IP_NOT_LOCAL');
|
||||
}
|
||||
|
||||
} ## end sub must_be_local
|
||||
1;
|
||||
|
@@ -11,61 +11,50 @@ package SrvMngr::Controller::Ibays;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw( theme_list init_session is_normal_password );
|
||||
|
||||
use SrvMngr qw( theme_list init_session validate_password );
|
||||
use esmith::AccountsDB;
|
||||
use esmith::ConfigDB;
|
||||
use esmith::DomainsDB;
|
||||
|
||||
#use esmith::FormMagick::Panel::ibays;
|
||||
|
||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
my ($adb,$cdb);
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %iba_datas = ();
|
||||
my $title = $c->l('iba_FORM_TITLE');
|
||||
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
$iba_datas{'trt'} = 'LIST';
|
||||
|
||||
my @ibays;
|
||||
if ($adb)
|
||||
{
|
||||
|
||||
if ($adb) {
|
||||
@ibays = $adb->ibays();
|
||||
}
|
||||
|
||||
$c->stash(title => $title, iba_datas => \%iba_datas, ibays => \@ibays);
|
||||
$c->render(template => 'ibays');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
my $ibay = $c->param('ibay') || '';
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
#$trt = 'DEL' if ( $ibay );
|
||||
#$trt = 'ADD' if ( $rt eq 'ibayadd' );
|
||||
|
||||
my %iba_datas = ();
|
||||
my $title = $c->l('iba_FORM_TITLE');
|
||||
my $modul = '';
|
||||
|
||||
$iba_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
$iba_datas{ibay} = '';
|
||||
$iba_datas{description} = '';
|
||||
$iba_datas{group} = '';
|
||||
@@ -73,12 +62,11 @@ sub do_display {
|
||||
$iba_datas{publicAccess} = '';
|
||||
$iba_datas{CgiBin} = '';
|
||||
$iba_datas{SSL} = '';
|
||||
|
||||
}
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $rec = $adb->get($ibay);
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'ibay') {
|
||||
$iba_datas{ibay} = $ibay;
|
||||
$iba_datas{description} = $rec->prop('Name') || '';
|
||||
@@ -87,65 +75,55 @@ sub do_display {
|
||||
$iba_datas{publicAccess} = $rec->prop('PublicAccess') || '';
|
||||
$iba_datas{CgiBin} = $rec->prop('CgiBin') || 'disabled';
|
||||
$iba_datas{SSL} = $rec->prop('SSL') || 'disabled';
|
||||
}
|
||||
}
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my $rec = $adb->get($ibay);
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'ibay') {
|
||||
$iba_datas{ibay} = $ibay;
|
||||
$iba_datas{description} = $rec->prop('Name') || '';
|
||||
$modul .= print_vhost_message($c, $ibay);
|
||||
}
|
||||
|
||||
}
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'PWD') {
|
||||
|
||||
my $rec = $adb->get($ibay);
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'ibay') {
|
||||
$iba_datas{ibay} = $ibay;
|
||||
$iba_datas{description} = $rec->prop('Name') || '';
|
||||
}
|
||||
|
||||
}
|
||||
} ## end if ($trt eq 'PWD')
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
my @ibays;
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
if ($adb)
|
||||
{
|
||||
|
||||
if ($adb) {
|
||||
@ibays = $adb->ibays();
|
||||
}
|
||||
$c->stash(ibays => \@ibays);
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'LIST')
|
||||
$c->stash(title => $title, modul => $modul, iba_datas => \%iba_datas);
|
||||
$c->render(template => 'ibays');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
|
||||
my %iba_datas = ();
|
||||
my $title = $c->l('iba_FORM_TITLE');
|
||||
|
||||
$iba_datas{'trt'} = $trt;
|
||||
|
||||
my $result = '';
|
||||
my $res;
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
my $name = ($c->param('ibay') || '');
|
||||
|
||||
# controls
|
||||
@@ -155,15 +133,15 @@ sub do_update {
|
||||
if (!$result) {
|
||||
$res = create_ibay($c, $name);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('iba_SUCCESSFULLY_CREATED_IBAY') . ' ' . $name;
|
||||
$iba_datas{trt} = 'LST';
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $name = ($c->param('ibay') || '');
|
||||
|
||||
# controls
|
||||
@@ -172,15 +150,15 @@ sub do_update {
|
||||
if (!$result) {
|
||||
$res = modify_ibay($c, $name);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('iba_SUCCESSFULLY_MODIFIED_IBAY') . ' ' . $name;
|
||||
$iba_datas{trt} = 'LST';
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'PWD') {
|
||||
|
||||
my $ibay = ($c->param('ibay') || '');
|
||||
my $pass1 = ($c->param('newPass') || '');
|
||||
my $pass2 = ($c->param('newPassVerify') || '');
|
||||
@@ -189,22 +167,21 @@ sub do_update {
|
||||
unless ($pass1 eq $pass2) {
|
||||
$result .= $c->l('iba_IBAY_PASSWD_VERIFY_ERROR') . ' - ';
|
||||
}
|
||||
|
||||
$res = check_password($c, $pass1);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$res = reset_password($c, $ibay, $pass1);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('iba_SUCCESSFULLY_RESET_PASSWORD') . ' ' . $ibay;
|
||||
$iba_datas{trt} = 'LST';
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'PWD')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my $ibay = $c->param('ibay');
|
||||
|
||||
if ($ibay =~ /^([a-z][a-z0-9]*)$/) {
|
||||
@@ -216,63 +193,54 @@ sub do_update {
|
||||
if (!$result) {
|
||||
$res = remove_ibay($c, $ibay);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('iba_SUCCESSFULLY_DELETED_IBAY') . ' ' . $ibay;
|
||||
$iba_datas{trt} = 'LST';
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash(error => $result);
|
||||
$c->stash(title => $title, iba_datas => \%iba_datas);
|
||||
return $c->render('ibays');
|
||||
}
|
||||
|
||||
my $message = "'Ibays' updates ($trt) DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $result);
|
||||
|
||||
$c->redirect_to('/ibays');
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub validate_ibay {
|
||||
|
||||
my ($c, $name) = @_;
|
||||
|
||||
my $msg = validate_name($c, $name);
|
||||
unless ($msg eq "OK")
|
||||
{
|
||||
|
||||
unless ($msg eq "OK") {
|
||||
return ($msg);
|
||||
}
|
||||
|
||||
$msg = max_ibay_name_length($c, $name);
|
||||
unless ($msg eq "OK")
|
||||
{
|
||||
|
||||
unless ($msg eq "OK") {
|
||||
return ($msg);
|
||||
}
|
||||
|
||||
$msg = conflict_check($c, $name);
|
||||
unless ($msg eq "OK")
|
||||
{
|
||||
|
||||
unless ($msg eq "OK") {
|
||||
return ($msg);
|
||||
}
|
||||
|
||||
return ('OK');
|
||||
}
|
||||
|
||||
} ## end sub validate_ibay
|
||||
|
||||
sub create_ibay {
|
||||
|
||||
my ($c, $name) = @_;
|
||||
|
||||
my $msg;
|
||||
my $uid = $adb->get_next_uid();
|
||||
if (my $acct = $adb->new_record($name, {
|
||||
Name => $c->param('ibayDesc'),
|
||||
|
||||
if (my $acct = $adb->new_record(
|
||||
$name,
|
||||
{ Name => $c->param('ibayDesc'),
|
||||
CgiBin => $c->param('CgiBin'),
|
||||
Group => $c->param('group'),
|
||||
PublicAccess => $c->param('publicAccess'),
|
||||
@@ -282,10 +250,14 @@ sub create_ibay {
|
||||
Gid => $uid,
|
||||
PasswordSet => 'no',
|
||||
type => 'ibay',
|
||||
}) )
|
||||
}
|
||||
)
|
||||
)
|
||||
{
|
||||
# Untaint $name before use in system()
|
||||
$name =~ /(.+)/; $name = $1;
|
||||
$name =~ /(.+)/;
|
||||
$name = $1;
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "ibay-create", $name) == 0) {
|
||||
$msg = 'OK';
|
||||
} else {
|
||||
@@ -295,14 +267,12 @@ sub create_ibay {
|
||||
$msg = $c->l('iba_CANT_CREATE_IBAY');
|
||||
}
|
||||
return $msg;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub create_ibay
|
||||
|
||||
sub modify_ibay {
|
||||
my ($c, $name) = @_;
|
||||
|
||||
my $msg;
|
||||
|
||||
if (my $acct = $adb->get($name)) {
|
||||
if ($acct->prop('type') eq 'ibay') {
|
||||
$acct->merge_props(
|
||||
@@ -315,10 +285,10 @@ sub modify_ibay {
|
||||
);
|
||||
|
||||
# Untaint $name before use in system()
|
||||
$name =~ /(.+)/; $name = $1;
|
||||
if (system ("/sbin/e-smith/signal-event", "ibay-modify",
|
||||
$name) == 0)
|
||||
{
|
||||
$name =~ /(.+)/;
|
||||
$name = $1;
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "ibay-modify", $name) == 0) {
|
||||
$msg = 'OK';
|
||||
} else {
|
||||
$msg = $c->l('iba_ERROR_WHILE_MODIFYING_IBAY');
|
||||
@@ -329,53 +299,47 @@ sub modify_ibay {
|
||||
} else {
|
||||
$msg = $c->l('iba_CANT_FIND_IBAY');
|
||||
}
|
||||
|
||||
return $msg;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub modify_ibay
|
||||
|
||||
sub print_vhost_message {
|
||||
my $c = shift;
|
||||
my $name = $c->param('ibay');
|
||||
|
||||
my $result = '';
|
||||
|
||||
my $domaindb = esmith::DomainsDB->open();
|
||||
my @domains = $domaindb->get_all_by_prop(Content => $name);
|
||||
my $vhostListItems = join "\n",
|
||||
(map ($_->key." ".$_->prop('Description'), @domains));
|
||||
if ($vhostListItems)
|
||||
{
|
||||
my $vhostListItems = join "\n", (map ($_->key . " " . $_->prop('Description'), @domains));
|
||||
|
||||
if ($vhostListItems) {
|
||||
$result = $c->l('iba_VHOST_MESSAGE') . "<br><ul>";
|
||||
|
||||
foreach ($vhostListItems) {
|
||||
$result .= "<li> $_ </li>";
|
||||
}
|
||||
$result .= '</ul>'
|
||||
}
|
||||
$result .= '</ul>';
|
||||
} ## end if ($vhostListItems)
|
||||
return $result;
|
||||
}
|
||||
|
||||
} ## end sub print_vhost_message
|
||||
|
||||
sub remove_ibay {
|
||||
my ($c, $name) = @_;
|
||||
|
||||
my $msg = '';
|
||||
|
||||
if (my $acct = $adb->get($name)) {
|
||||
if ($acct->prop('type') eq 'ibay') {
|
||||
$acct->set_prop('type', 'ibay-deleted');
|
||||
|
||||
my $domains_db = esmith::DomainsDB->open();
|
||||
my @domains = $domains_db->get_all_by_prop(Content => $name);
|
||||
|
||||
foreach my $d (@domains) {
|
||||
$d->set_prop(Content => 'Primary');
|
||||
}
|
||||
|
||||
# Untaint $name before use in system()
|
||||
$name =~ /(.+)/; $name = $1;
|
||||
if (system ("/sbin/e-smith/signal-event", "ibay-delete",
|
||||
$name) == 0)
|
||||
{
|
||||
$name =~ /(.+)/;
|
||||
$name = $1;
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "ibay-delete", $name) == 0) {
|
||||
$msg = 'OK';
|
||||
$acct->delete();
|
||||
} else {
|
||||
@@ -384,27 +348,25 @@ sub remove_ibay {
|
||||
} else {
|
||||
$msg = $c->l('iba_CANT_FIND_IBAY');
|
||||
}
|
||||
|
||||
} else {
|
||||
$msg = $c->l('iba_CANT_FIND_IBAY');
|
||||
}
|
||||
return $msg;
|
||||
}
|
||||
|
||||
} ## end sub remove_ibay
|
||||
|
||||
sub reset_password {
|
||||
my ($c, $name, $newPass) = @_;
|
||||
|
||||
my ($msg, $acct);
|
||||
|
||||
if (($acct = $adb->get($name)) && ($acct->prop('type') eq 'ibay')) {
|
||||
esmith::util::setIbayPassword($acct->key, $newPass);
|
||||
$acct->set_prop('PasswordSet', 'yes');
|
||||
|
||||
# Untaint $name before use in system()
|
||||
$name =~ /(.+)/; $name = $1;
|
||||
if (system ("/sbin/e-smith/signal-event", "password-modify",
|
||||
$name) == 0)
|
||||
{
|
||||
$name =~ /(.+)/;
|
||||
$name = $1;
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "password-modify", $name) == 0) {
|
||||
$msg = 'OK';
|
||||
} else {
|
||||
$msg = $c->l('iba_ERROR_WHILE_RESETTING_PASSWORD');
|
||||
@@ -413,51 +375,15 @@ sub reset_password {
|
||||
$msg = $c->l('iba_CANT_FIND_IBAY');
|
||||
}
|
||||
return $msg;
|
||||
}
|
||||
|
||||
} ## end sub reset_password
|
||||
|
||||
sub check_password {
|
||||
my ($c, $password) = @_;
|
||||
|
||||
my $strength;
|
||||
|
||||
my $rec = $cdb->get('passwordstrength');
|
||||
$strength = ($rec ? ($rec->prop('Ibays') || 'none') : 'none');
|
||||
|
||||
return validate_password($c, $strength, $password);
|
||||
}
|
||||
|
||||
|
||||
sub validate_password {
|
||||
|
||||
my ($c, $strength, $pass) = @_;
|
||||
|
||||
use Crypt::Cracklib;
|
||||
|
||||
my $reason;
|
||||
|
||||
if ($strength eq "none") {
|
||||
return $c->l("Passwords must be at least 7 characters long") unless (length($pass) > 6);
|
||||
return "OK";
|
||||
}
|
||||
|
||||
$reason = is_normal_password($c, $pass, undef);
|
||||
return $reason unless ($reason eq "OK");
|
||||
return "OK" unless ($strength eq "strong");
|
||||
|
||||
if ( -f '/usr/lib64/cracklib_dict.pwd' ) {
|
||||
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
|
||||
} else {
|
||||
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
|
||||
}
|
||||
$reason ||= "Software error: password check failed";
|
||||
|
||||
return "OK" if ($reason eq "ok");
|
||||
|
||||
return $c->l("Bad Password Choice") . ": "
|
||||
. $c->l("The password you have chosen is not a good choice, because")
|
||||
. " " . $c->($reason) . ".";
|
||||
}
|
||||
} ## end sub check_password
|
||||
|
||||
|
||||
=head2 group_list()
|
||||
@@ -468,18 +394,14 @@ drop down list.
|
||||
=cut
|
||||
|
||||
sub group_list_m {
|
||||
|
||||
my @groups = $adb->groups();
|
||||
|
||||
my @grps = ([ 'Admin' => 'admin' ], [ 'Everyone' => 'shared' ]);
|
||||
|
||||
foreach my $g (@groups) {
|
||||
push @grps, [ $g->prop('Description') . " (" . $g->key . ")", $g->key() ];
|
||||
}
|
||||
|
||||
return \@grps;
|
||||
}
|
||||
|
||||
} ## end sub group_list_m
|
||||
|
||||
=head2 userAccess_list
|
||||
|
||||
@@ -489,13 +411,13 @@ drop down list.
|
||||
=cut
|
||||
|
||||
sub userAccess_list_m {
|
||||
|
||||
my $c = shift;
|
||||
return [[ $c->l('WARG') => 'wr-admin-rd-group'],
|
||||
return [
|
||||
[ $c->l('WARG') => 'wr-admin-rd-group' ],
|
||||
[ $c->l('WGRE') => 'wr-group-rd-everyone' ],
|
||||
[ $c->l('WGRG') => 'wr-group-rd-group']];
|
||||
|
||||
}
|
||||
[ $c->l('WGRG') => 'wr-group-rd-group' ]
|
||||
];
|
||||
} ## end sub userAccess_list_m
|
||||
|
||||
=head2 publicAccess_list
|
||||
|
||||
@@ -505,19 +427,18 @@ access drop down list.
|
||||
=cut
|
||||
|
||||
sub publicAccess_list_m {
|
||||
|
||||
my $c = shift;
|
||||
return [[ $c->l('NONE') => 'none'],
|
||||
return [
|
||||
[ $c->l('NONE') => 'none' ],
|
||||
[ $c->l('LOCAL_NETWORK_NO_PASSWORD') => 'local' ],
|
||||
[ $c->l('LOCAL_NETWORK_PASSWORD') => 'local-pw' ],
|
||||
[ $c->l('ENTIRE_INTERNET_NO_PASSWORD') => 'global' ],
|
||||
[ $c->l('ENTIRE_INTERNET_PASSWORD') => 'global-pw' ],
|
||||
[ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote']];
|
||||
}
|
||||
|
||||
[ $c->l('ENTIRE_INTERNET_PASSWORD_REMOTE') => 'global-pw-remote' ]
|
||||
];
|
||||
} ## end sub publicAccess_list_m
|
||||
|
||||
sub max_ibay_name_length {
|
||||
|
||||
my ($c, $data) = @_;
|
||||
$cdb->reload();
|
||||
my $max = $cdb->get('maxIbayNameLength')->value;
|
||||
@@ -526,52 +447,42 @@ sub max_ibay_name_length {
|
||||
return "OK";
|
||||
} else {
|
||||
return $c->l('iba_MAX_IBAY_NAME_LENGTH_ERROR', $data, $max, $max);
|
||||
|
||||
# {acctName => $data,
|
||||
# maxIbayNameLength => $max,
|
||||
# maxLength => $max});
|
||||
}
|
||||
}
|
||||
|
||||
} ## end else [ if (length($data) <= $max)]
|
||||
} ## end sub max_ibay_name_length
|
||||
|
||||
sub conflict_check {
|
||||
|
||||
my ($c, $name) = @_;
|
||||
my $rec = $adb->get($name);
|
||||
|
||||
my $type;
|
||||
if (defined $rec)
|
||||
{
|
||||
|
||||
if (defined $rec) {
|
||||
my $type = $rec->prop('type');
|
||||
if ($type eq "pseudonym")
|
||||
{
|
||||
|
||||
if ($type eq "pseudonym") {
|
||||
my $acct = $rec->prop("Account");
|
||||
my $acct_type = $adb->get($acct)->prop('type');
|
||||
|
||||
return $c->l('iba_ACCT_CLASHES_WITH_PSEUDONYM', $name, $acct_type, $acct);
|
||||
}
|
||||
}
|
||||
elsif (defined getpwnam($name) || defined getgrnam($name))
|
||||
{
|
||||
} ## end if ($type eq "pseudonym")
|
||||
} elsif (defined getpwnam($name) || defined getgrnam($name)) {
|
||||
$type = 'system';
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
|
||||
# No account record and no account
|
||||
return 'OK';
|
||||
}
|
||||
return $c->l('iba_ACCOUNT_EXISTS', $name, $type);
|
||||
}
|
||||
} ## end sub conflict_check
|
||||
|
||||
sub validate_name {
|
||||
|
||||
my ($c, $acctName) = @_;
|
||||
|
||||
unless ($acctName =~ /^([a-z][\_\.\-a-z0-9]*)$/)
|
||||
{
|
||||
unless ($acctName =~ /^([a-z][\_\.\-a-z0-9]*)$/) {
|
||||
return $c->l('iba_ACCT_NAME_HAS_INVALID_CHARS', $acctName);
|
||||
}
|
||||
return "OK";
|
||||
}
|
||||
|
||||
|
||||
} ## end sub validate_name
|
||||
1
|
||||
|
@@ -9,29 +9,18 @@ package SrvMngr::Controller::Initial;
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use SrvMngr::Model::Main;
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('initial_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('initial_FRAMES_BODY'));
|
||||
|
||||
$c->stash(title => $title, modul => $modul);
|
||||
|
||||
$c->render(template => 'initial');
|
||||
|
||||
}
|
||||
|
||||
|
||||
} ## end sub main
|
||||
1;
|
||||
|
@@ -1,41 +1,36 @@
|
||||
package SrvMngr::Controller::Legacypanel;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Legacy
|
||||
# description : Legacy panel
|
||||
# navigation : 99999 9999
|
||||
#----------------------------------------------------------------------
|
||||
#----------------------------------------------------------------------
|
||||
# name : legacypanel, method : get, url : /legacypanel, ctlact : Legacypanel#main
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use SrvMngr::Model::Main;
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('legacy panel');
|
||||
my $legacy_url = $c->param('url');
|
||||
my $legacy_height = $c->param('height') | 600;
|
||||
$c->stash(title => $title, modul => $legacy_url, height => $legacy_height);
|
||||
$c->render(template => 'embedded');
|
||||
|
||||
}
|
||||
} ## end sub main
|
||||
|
||||
sub getlegacyurl {
|
||||
my $c = shift;
|
||||
my $url = shift;
|
||||
return "/smanager/legacypanel?url=$url";
|
||||
}
|
||||
|
||||
|
||||
} ## end sub getlegacyurl
|
||||
1;
|
||||
|
@@ -10,7 +10,6 @@ package SrvMngr::Controller::Localnetworks;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session subnet_mask get_reg_mask ip_number);
|
||||
@@ -18,27 +17,24 @@ use SrvMngr qw(theme_list init_session subnet_mask get_reg_mask ip_number);
|
||||
#use Data::Dumper;
|
||||
use esmith::util;
|
||||
use esmith::HostsDB;
|
||||
|
||||
my $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
#my $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
my $ret = "OK";
|
||||
my ($network_db);
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %ln_datas = ();
|
||||
$ln_datas{return} = "";
|
||||
my $title = $c->l('ln_LOCAL NETWORKS');
|
||||
$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
my $modul = '';
|
||||
|
||||
$ln_datas{trt} = 'LIST';
|
||||
|
||||
my @localnetworks;
|
||||
|
||||
if ($network_db) {
|
||||
@localnetworks = $network_db->get_all_by_prop(type => 'network');
|
||||
}
|
||||
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
@@ -46,70 +42,72 @@ sub main {
|
||||
localnetworks => \@localnetworks
|
||||
);
|
||||
$c->render(template => 'localnetworks');
|
||||
|
||||
}
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
|
||||
$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
|
||||
$trt = 'DEL' if ($rt eq 'localnetworksdel');
|
||||
$trt = 'ADD' if ($rt eq 'localnetworksadd');
|
||||
$trt = 'ADD1' if ($rt eq 'localnetworksadd1');
|
||||
$trt = 'DEL1' if ($rt eq 'localnetworksdel1');
|
||||
|
||||
my %ln_datas = ();
|
||||
my $title = $c->l('ln_LOCAL NETWORKS');
|
||||
my $modul = '';
|
||||
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
#Add a network - called from the list panel
|
||||
# Nothing to do here...as just need fields to input data.
|
||||
|
||||
}
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'ADD1') {
|
||||
|
||||
#Add a network - called after new network details filled in
|
||||
my %ret = add_network($c);
|
||||
|
||||
#Return to list page if success
|
||||
if ((index($ret{ret}, "SUCCESS") != -1)) {
|
||||
$trt = "LIST";
|
||||
} else {
|
||||
|
||||
#Error - return to Add page
|
||||
$trt = "ADD";
|
||||
}
|
||||
$network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-3"); #Refresh the network DB
|
||||
$c->stash(ret => \%ret); #stash it away for the template
|
||||
}
|
||||
} ## end if ($trt eq 'ADD1')
|
||||
|
||||
if ($trt eq 'DEL1') {
|
||||
|
||||
#After Remove clicked on Delete network panel
|
||||
my $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-1");
|
||||
$network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-1");
|
||||
my $localnetwork = $c->param("localnetwork");
|
||||
my $delete_hosts = $c->param("deletehost") || "1"; #default to deleting them.
|
||||
my $rec = $network_db->get($localnetwork) || die("Failed to find network on db:$localnetwork");
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'localnetwork') {
|
||||
$ln_datas{localnetwork} = $localnetwork;
|
||||
}
|
||||
my %ret = remove_network($localnetwork, $delete_hosts);
|
||||
|
||||
$network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-2"); #Refresh the network DB
|
||||
my @localnetworks;
|
||||
|
||||
if ($network_db) {
|
||||
@localnetworks = $network_db->get_all_by_prop(type => 'network');
|
||||
}
|
||||
|
||||
# Load up ln_datas with values need by template
|
||||
$ln_datas{subnet} = $rec->prop('Mask');
|
||||
$ln_datas{router} = $rec->prop('Router');
|
||||
$c->stash(ln_datas => \%ln_datas, localnetworks => \@localnetworks, ret => \%ret);
|
||||
}
|
||||
} ## end if ($trt eq 'DEL1')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
#Initial delete panel requiring confirmation
|
||||
my $localnetwork = $c->param("localnetwork") || '';
|
||||
$c->stash(localnetwork => $localnetwork);
|
||||
@@ -120,27 +118,27 @@ sub do_display {
|
||||
my $numhosts = hosts_on_network($localnetwork, $subnet);
|
||||
$ln_datas{localnetwork} = $localnetwork;
|
||||
$ln_datas{deletehosts} = $numhosts > 0 ? 1 : 0;
|
||||
}
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
#List all the networks
|
||||
my @localnetworks;
|
||||
|
||||
if ($network_db) {
|
||||
@localnetworks = $network_db->get_all_by_prop(type => 'network');
|
||||
}
|
||||
$c->stash(localnetworks => \@localnetworks);
|
||||
## $c->redirect_to('/localnetworks');
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'LIST')
|
||||
$ln_datas{'trt'} = $trt;
|
||||
$c->stash(title => $title, modul => $modul, ln_datas => \%ln_datas);
|
||||
$c->render(template => 'localnetworks');
|
||||
|
||||
}
|
||||
} ## end sub do_display
|
||||
|
||||
sub remove_network {
|
||||
my $network = shift;
|
||||
my $network_db = esmith::NetworksDB->open();
|
||||
$network_db = esmith::NetworksDB->open();
|
||||
my $record = $network_db->get($network);
|
||||
my $delete_hosts = shift;
|
||||
|
||||
@@ -152,112 +150,93 @@ sub remove_network {
|
||||
# Untaint $network before use in system()
|
||||
$network =~ /(.+)/;
|
||||
$network = $1;
|
||||
|
||||
if (system("/sbin/e-smith/signal-event", "network-delete", $network) == 0) {
|
||||
if ($delete_hosts) {
|
||||
my @hosts_to_delete = hosts_on_network($network, $subnet);
|
||||
|
||||
foreach my $host (@hosts_to_delete) {
|
||||
$host->delete;
|
||||
}
|
||||
}
|
||||
} ## end if ($delete_hosts)
|
||||
$record->delete;
|
||||
return (ret => 'ln_SUCCESS_REMOVED_NETWORK', vars => "$network,$subnet,$router");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return (ret => "ln_ERROR_DELETING_NETWORK");
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return (ret => "ln_NO_SUCH_NETWORK");
|
||||
}
|
||||
}
|
||||
} ## end sub remove_network
|
||||
|
||||
sub hosts_on_network {
|
||||
my $network = shift;
|
||||
my $netmask = shift;
|
||||
|
||||
die if not $network and $netmask;
|
||||
|
||||
my $cidr = "$network/$netmask";
|
||||
my $hosts = esmith::HostsDB->open() || die("Couldn't open hosts db");
|
||||
my @localhosts = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts;
|
||||
my @hosts_on_network = ();
|
||||
|
||||
foreach my $host (@localhosts) {
|
||||
my $ip = $host->prop('InternalIP') || "";
|
||||
|
||||
if ($ip) {
|
||||
if (Net::IPv4Addr::ipv4_in_network($cidr, $ip)) {
|
||||
push @hosts_on_network, $host;
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if ($ip)
|
||||
} ## end foreach my $host (@localhosts)
|
||||
return @hosts_on_network if wantarray;
|
||||
return scalar @hosts_on_network;
|
||||
}
|
||||
} ## end sub hosts_on_network
|
||||
|
||||
sub add_network
|
||||
{
|
||||
sub add_network {
|
||||
my ($fm) = @_;
|
||||
my $networkAddress = $fm->param('networkAddress');
|
||||
my $networkMask = $fm->param('networkMask');
|
||||
my $networkRouter = $fm->param('networkRouter');
|
||||
|
||||
#Validate Ips and subnet mask
|
||||
|
||||
my $res = ip_number($fm, $networkAddress);
|
||||
return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Network Address $res") unless $res eq 'OK';
|
||||
|
||||
$res = subnet_mask($networkMask);
|
||||
return (ret => 'ln_INVALID_SUBNET_MASK', vars => "$networkMask") unless $res eq 'OK';
|
||||
|
||||
$res = ip_number($fm, $networkRouter);
|
||||
return (ret => 'ln_INVALID_IP_ADDRESS', vars => "Routeur Address $res") unless $res eq 'OK';
|
||||
|
||||
# we transform bit mask to regular mask
|
||||
$networkMask = get_reg_mask($networkAddress, $networkMask);
|
||||
|
||||
my $network_db = esmith::NetworksDB->open()
|
||||
|| esmith::NetworksDB->create();
|
||||
my $config_db = esmith::ConfigDB->open();
|
||||
|
||||
my $localIP = $config_db->get('LocalIP');
|
||||
my $localNetmask = $config_db->get('LocalNetmask');
|
||||
|
||||
my ( $localNetwork, $localBroadcast ) =
|
||||
esmith::util::computeNetworkAndBroadcast( $localIP->value(),
|
||||
$localNetmask->value() );
|
||||
|
||||
my ( $routerNetwork, $routerBroadcast ) =
|
||||
esmith::util::computeNetworkAndBroadcast( $networkRouter,
|
||||
$localNetmask->value() );
|
||||
my ($localNetwork, $localBroadcast)
|
||||
= esmith::util::computeNetworkAndBroadcast($localIP->value(), $localNetmask->value());
|
||||
my ($routerNetwork, $routerBroadcast)
|
||||
= esmith::util::computeNetworkAndBroadcast($networkRouter, $localNetmask->value());
|
||||
|
||||
# Note to self or future developers:
|
||||
# the following tests should probably be validation routines
|
||||
# in the form itself, but it just seemed too fiddly to do that
|
||||
# at the moment. -- Skud 2002-04-11
|
||||
# I agree --bjr 2020-04-18
|
||||
|
||||
|
||||
if ( $routerNetwork ne $localNetwork )
|
||||
{
|
||||
if ($routerNetwork ne $localNetwork) {
|
||||
return (ret => 'ln_NOT_ACCESSIBLE_FROM_LOCAL_NETWORK');
|
||||
}
|
||||
my ($network, $broadcast) = esmith::util::computeNetworkAndBroadcast($networkAddress, $networkMask);
|
||||
|
||||
my ( $network, $broadcast ) =
|
||||
esmith::util::computeNetworkAndBroadcast( $networkAddress, $networkMask );
|
||||
|
||||
if ( $network eq $localNetwork )
|
||||
{
|
||||
if ($network eq $localNetwork) {
|
||||
return (ret => 'ln_NETWORK_ALREADY_LOCAL');
|
||||
}
|
||||
|
||||
if ( $network_db->get($network) )
|
||||
{
|
||||
if ($network_db->get($network)) {
|
||||
return (ret => 'ln_NETWORK_ALREADY_ADDED');
|
||||
}
|
||||
|
||||
$network_db->new_record(
|
||||
$network,
|
||||
{
|
||||
Mask => $networkMask,
|
||||
{ Mask => $networkMask,
|
||||
Router => $networkRouter,
|
||||
type => 'network',
|
||||
}
|
||||
@@ -268,24 +247,25 @@ sub add_network
|
||||
$network = $1;
|
||||
system("/sbin/e-smith/signal-event", "network-create", $network) == 0
|
||||
or (return (ret => 'ln_ERROR_CREATING_NETWORK'));
|
||||
|
||||
my ( $totalHosts, $firstAddr, $lastAddr ) =
|
||||
esmith::util::computeHostRange( $network, $networkMask );
|
||||
|
||||
my ($totalHosts, $firstAddr, $lastAddr) = esmith::util::computeHostRange($network, $networkMask);
|
||||
my $msg;
|
||||
if ( $totalHosts == 1 )
|
||||
{
|
||||
|
||||
if ($totalHosts == 1) {
|
||||
return (ret => 'ln_SUCCESS_SINGLE_ADDRESS', vars => "$network,$networkMask,$networkRouter");
|
||||
}
|
||||
elsif (( $totalHosts == 256 )
|
||||
} elsif (($totalHosts == 256)
|
||||
|| ($totalHosts == 65536)
|
||||
|| ($totalHosts == 16777216))
|
||||
{
|
||||
return ( ret=>'ln_SUCCESS_NETWORK_RANGE',vars=>"$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr");
|
||||
}
|
||||
else
|
||||
{ my $simpleMask = esmith::util::computeLocalNetworkPrefix( $network, $networkMask );
|
||||
return ( ret => 'ln_SUCCESS_NONSTANDARD_RANGE',
|
||||
vars=>"$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr,$simpleMask");
|
||||
}
|
||||
}
|
||||
return (
|
||||
ret => 'ln_SUCCESS_NETWORK_RANGE',
|
||||
vars => "$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr"
|
||||
);
|
||||
} else {
|
||||
my $simpleMask = esmith::util::computeLocalNetworkPrefix($network, $networkMask);
|
||||
return (
|
||||
ret => 'ln_SUCCESS_NONSTANDARD_RANGE',
|
||||
vars => "$network,$networkMask,$networkRouter,$totalHosts,$firstAddr,$lastAddr,$simpleMask"
|
||||
);
|
||||
} ## end else [ if ($totalHosts == 1) ]
|
||||
} ## end sub add_network
|
||||
1;
|
||||
|
@@ -8,55 +8,42 @@ package SrvMngr::Controller::Login;
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
# for information
|
||||
# $r->get('/login')->to('login#main')->name('login');
|
||||
# $r->post('/login')->to('login#login')->name('signin');
|
||||
# $r->get('/login2')->to('login#pwdrescue')->name('pwdresc');
|
||||
# $r->get('/loginc')->to('login#confpwd')->name('resetpwdconf');
|
||||
# for information
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
|
||||
use esmith::AccountsDB;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr::Model::Main;
|
||||
|
||||
use SrvMngr qw( theme_list init_session );
|
||||
|
||||
my $MAX_LOGIN_ATTEMPTS = 3;
|
||||
my $DURATION_BLOCKED = 30 * 60; # access blocked for 30 min
|
||||
my $TIMEOUT_FAILED_LOGIN = 1;
|
||||
my $RESET_DURATION = 2 * 60 * 60; # 2 hours for resetting
|
||||
|
||||
our $adb = esmith::AccountsDB->open() or die "Couldn't open DB Accounts\n";
|
||||
|
||||
my $allowed_user_re = qr/^\w{5,10}$/;
|
||||
my %Login_Attempts;
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->stash(trt => 'NORM');
|
||||
$c->render('login');
|
||||
|
||||
}
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub login {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $trt = $c->param('Trt');
|
||||
|
||||
# password reset request
|
||||
if ($trt eq 'RESET') {
|
||||
my $res = $c->mail_rescue();
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash(error => $res, trt => $trt);
|
||||
return $c->render('login');
|
||||
@@ -64,7 +51,7 @@ sub login {
|
||||
$c->flash(success => $c->l('use_RESET_REGISTERED'));
|
||||
record_login_attempt($c, 'RESET');
|
||||
return $c->redirect_to($c->home_page);
|
||||
}
|
||||
} ## end if ($trt eq 'RESET')
|
||||
|
||||
# normal loggin
|
||||
my $name = $c->param('Username');
|
||||
@@ -82,8 +69,8 @@ sub login {
|
||||
$c->stash(error => $c->l('use_INVALID_DATA'), trt => 'NORM');
|
||||
return $c->render('login');
|
||||
}
|
||||
|
||||
my $alias = SrvMngr::Model::Main->check_adminalias($c);
|
||||
|
||||
if ($alias) {
|
||||
if ($name eq $alias) {
|
||||
$name = 'admin';
|
||||
@@ -92,11 +79,12 @@ sub login {
|
||||
$c->stash(error => $c->l('use_SORRY'), trt => 'NORM');
|
||||
return $c->render('login');
|
||||
}
|
||||
}
|
||||
} ## end if ($alias)
|
||||
|
||||
if (SrvMngr::Model::Main->check_credentials($name, $pass)) {
|
||||
$c->session(logged_in => 1); # set the logged_in flag
|
||||
$c->session(username => $name); # keep a copy of the username
|
||||
|
||||
# if ( $name eq 'admin' || $adb->is_user_in_group($name, 'AdmiN') ) # for futur use
|
||||
if ($name eq 'admin') {
|
||||
$c->session(is_admin => 1);
|
||||
@@ -104,42 +92,29 @@ sub login {
|
||||
$c->session(is_admin => 0);
|
||||
}
|
||||
$c->session(expiration => 600); # expire this session in 10 minutes
|
||||
|
||||
$c->flash(success => $c->l('use_WELCOME'));
|
||||
record_login_attempt($c, 'SUCCESS');
|
||||
} else {
|
||||
record_login_attempt($c, 'FAILED');
|
||||
sleep $TIMEOUT_FAILED_LOGIN;
|
||||
|
||||
$c->stash(error => $c->l('use_SORRY'), trt => 'NORM');
|
||||
return $c->render('login');
|
||||
}
|
||||
|
||||
} ## end else [ if (SrvMngr::Model::Main...)]
|
||||
$from = $c->home_page if ($from eq 'login');
|
||||
$c->redirect_to($from);
|
||||
|
||||
}
|
||||
|
||||
} ## end sub login
|
||||
|
||||
sub pwdrescue {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
$c->stash(trt => 'RESET');
|
||||
|
||||
$c->render('login');
|
||||
|
||||
}
|
||||
|
||||
} ## end sub pwdrescue
|
||||
|
||||
sub mail_rescue {
|
||||
|
||||
my $c = shift;
|
||||
my $name = $c->param('Username');
|
||||
my $from = $c->param('From');
|
||||
|
||||
my $res;
|
||||
|
||||
$res .= $c->l('use_TOO_MANY_LOGIN') if (is_denied($c));
|
||||
|
||||
# untaint
|
||||
@@ -155,17 +130,16 @@ sub mail_rescue {
|
||||
# user exists ?
|
||||
if (!$res) {
|
||||
my $acct = $adb->get($name);
|
||||
|
||||
if (!$acct || $acct->prop('type') ne "user" || $acct->prop('PasswordSet') ne 'yes') {
|
||||
$res .= $c->l('use_NOT_THAT_OPER');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if (!$res)
|
||||
return $res if $res;
|
||||
|
||||
# send email
|
||||
my $email = $name . '@' . $c->session->{DomainName};
|
||||
my $until = time() + $RESET_DURATION;
|
||||
|
||||
$c->pwdrst->{$name} = {
|
||||
email => $email,
|
||||
date => $until,
|
||||
@@ -177,30 +151,20 @@ sub mail_rescue {
|
||||
# $c->email( $email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url) ) );
|
||||
# directly (without minion)
|
||||
$c->send_email($email, $c->l('use_CONFIRM_RESET'), $c->render_to_string(inline => $c->l('use_GO_TO_URL', $url)));
|
||||
|
||||
return 'OK';
|
||||
|
||||
}
|
||||
|
||||
} ## end sub mail_rescue
|
||||
|
||||
sub logout {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
$c->session(expires => 1);
|
||||
$c->flash(success => $c->l('use_BYE'));
|
||||
$c->flash(error => 'Byegood');
|
||||
|
||||
$c->redirect_to($c->home_page);
|
||||
|
||||
}
|
||||
|
||||
} ## end sub logout
|
||||
|
||||
sub confpwd {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $jwt = $c->param('jwt');
|
||||
my $name = $c->jwt->decode($jwt)->{username};
|
||||
|
||||
@@ -212,62 +176,47 @@ sub confpwd {
|
||||
|
||||
# reset password for this account
|
||||
$c->pwdrst->{$name}{confirmed} = 1;
|
||||
|
||||
$c->flash(success => $c->l('use_OK_FOR_RESET'));
|
||||
|
||||
# call userpassword with encoded name
|
||||
my $url = $c->url_for('userpasswordr')->to_abs->query(jwt => $jwt);
|
||||
|
||||
# warn "confpwd: " . $url . "\n";
|
||||
|
||||
return $c->redirect_to($url);
|
||||
|
||||
}
|
||||
|
||||
} ## end sub confpwd
|
||||
|
||||
sub record_login_attempt {
|
||||
|
||||
my ($c, $result) = @_;
|
||||
|
||||
my $user = $c->param('Username');
|
||||
my $ip_address = $c->tx->remote_address;
|
||||
|
||||
if ($result eq 'RESET') {
|
||||
|
||||
$c->app->log->info(join "\t", "Password reset requested for : $user at ", $ip_address);
|
||||
|
||||
} elsif ($result eq 'SUCCESS') {
|
||||
|
||||
$c->app->log->info(join "\t", "Login succeeded: $user", $ip_address);
|
||||
$Login_Attempts{$ip_address}->{tries} = 0; # reset the number of login attempts
|
||||
|
||||
} else {
|
||||
|
||||
$c->app->log->info(join "\t", "Login FAILED: $user", $ip_address);
|
||||
$Login_Attempts{$ip_address}->{tries}++;
|
||||
|
||||
if ($Login_Attempts{$ip_address}->{tries} > $MAX_LOGIN_ATTEMPTS) {
|
||||
$Login_Attempts{$ip_address}->{denied_until} = time() + $DURATION_BLOCKED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} ## end else [ if ($result eq 'RESET')]
|
||||
} ## end sub record_login_attempt
|
||||
|
||||
sub is_denied {
|
||||
my ($c) = @_;
|
||||
|
||||
my $ip_address = $c->tx->remote_address;
|
||||
|
||||
return unless exists $Login_Attempts{$ip_address}
|
||||
return
|
||||
unless exists $Login_Attempts{$ip_address}
|
||||
&& exists $Login_Attempts{$ip_address}->{denied_until};
|
||||
|
||||
return 'Denied'
|
||||
if $Login_Attempts{$ip_address}->{denied_until} > time();
|
||||
|
||||
# TIMEOUT has expired, reset attempts
|
||||
delete $Login_Attempts{$ip_address}->{denied_until};
|
||||
$Login_Attempts{$ip_address}->{tries} = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
} ## end sub is_denied
|
||||
1;
|
||||
|
@@ -8,27 +8,18 @@ package SrvMngr::Controller::Logout;
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw( theme_list init_session );
|
||||
|
||||
|
||||
sub logout {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
$c->session(expires => 1);
|
||||
$c->flash(success => 'Goodbye');
|
||||
|
||||
$c->redirect_to($c->home_page);
|
||||
}
|
||||
|
||||
|
||||
} ## end sub logout
|
||||
1;
|
||||
|
@@ -10,25 +10,17 @@ package SrvMngr::Controller::Manual;
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('manual_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('manual_DESCRIPTION'));
|
||||
|
||||
$c->stash(title => $title, modul => $modul);
|
||||
|
||||
$c->render(template => 'manual');
|
||||
}
|
||||
|
||||
|
||||
} ## end sub main
|
||||
1;
|
||||
|
@@ -1,71 +1,57 @@
|
||||
package SrvMngr::Controller::Modules;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
|
||||
sub bugreport {
|
||||
my $c = shift;
|
||||
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $modul = $c->render_to_string( inline => "<p># my (\$lang, \$releaseVersion,
|
||||
my $modul = $c->render_to_string(
|
||||
inline => "<p># my (\$lang, \$releaseVersion,
|
||||
<br># \$c->stash\(\'lang\', \'releaseVer\'
|
||||
# \'navigation\'</p>");
|
||||
|
||||
# \'navigation\'</p>"
|
||||
);
|
||||
$c->stash(modul => $modul);
|
||||
|
||||
};
|
||||
|
||||
} ## end sub bugreport
|
||||
|
||||
sub support {
|
||||
my $c = shift;
|
||||
|
||||
$c->app->log->info($c->log_req);
|
||||
my $modul = $c->stash('modul');
|
||||
$modul .= 'Mail result is 1 + 8.';
|
||||
|
||||
$c->stash(modul => $modul, PwdSet => '0', Unsafe => '0');
|
||||
|
||||
#$c->render('modules/support');
|
||||
};
|
||||
|
||||
} ## end sub support
|
||||
|
||||
sub modsearch {
|
||||
my $c = shift;
|
||||
my $module = $c->param('module');
|
||||
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $redirect_url = SrvMngr->get_mod_url($module);
|
||||
|
||||
if ($redirect_url ne "-1") {
|
||||
|
||||
#$c->render(text => "mod_search: $module to $redirect_url");
|
||||
return $c->redirect_to($redirect_url);
|
||||
|
||||
#return $c->redirect_to( url_for($redirect_url) );
|
||||
}
|
||||
} ## end if ($redirect_url ne "-1")
|
||||
|
||||
#$c->render(text => "mod_search: $module to 'welcome'");
|
||||
return $c->redirect_to($c->home_page);
|
||||
|
||||
};
|
||||
|
||||
} ## end sub modsearch
|
||||
|
||||
sub whatever {
|
||||
my $c = shift;
|
||||
my $whatever = $c->param('whatever');
|
||||
|
||||
$c->app->log->info($c->log_req . ' ' . $whatever);
|
||||
|
||||
$c->render(text => "whatever: /$whatever did not match.", status => 404);
|
||||
};
|
||||
|
||||
|
||||
} ## end sub whatever
|
||||
1;
|
||||
|
@@ -10,45 +10,37 @@ package SrvMngr::Controller::Portforwarding;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
#use Regexp::Common qw /net/;
|
||||
|
||||
#use Regexp::Common qw /net/;
|
||||
#use Data::Dumper;
|
||||
use esmith::util;
|
||||
use esmith::HostsDB;
|
||||
|
||||
our $db = esmith::ConfigDB->open
|
||||
|| die "Can't open configuration database: $!\n";
|
||||
our $tcp_db = esmith::ConfigDB->open('portforward_tcp')
|
||||
|| die "Can't open portforward_tcp database: $!\n";
|
||||
our $udp_db = esmith::ConfigDB->open('portforward_udp')
|
||||
|| die "Can't open portforward_udp database: $!\n";
|
||||
|
||||
#our $db = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
|
||||
#our $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
|
||||
#our $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
|
||||
my ($cdb,$tcp_db,$udp_db);
|
||||
|
||||
my %ret = ();
|
||||
|
||||
use constant FALSE => 0;
|
||||
use constant TRUE => 1;
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %pf_datas = ();
|
||||
$pf_datas{return} = "";
|
||||
my $title = $c->l('pf_FORM_TITLE');
|
||||
my $modul = '';
|
||||
|
||||
$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
|
||||
$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
|
||||
$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
|
||||
$pf_datas{trt} = 'LIST';
|
||||
|
||||
my @tcpforwards = $tcp_db->get_all;
|
||||
my @udpforwards = $udp_db->get_all;
|
||||
my $empty = 1 if not @tcpforwards and not @udpforwards;
|
||||
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
@@ -58,58 +50,60 @@ sub main {
|
||||
empty => $empty
|
||||
);
|
||||
$c->render(template => 'portforwarding');
|
||||
}
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
|
||||
|
||||
my $cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
|
||||
my $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
|
||||
my $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
|
||||
$trt = 'DEL' if ($rt eq 'portforwardingdel');
|
||||
$trt = 'ADD' if ($rt eq 'portforwardingadd');
|
||||
$trt = 'ADD1' if ($rt eq 'portforwardingadd1');
|
||||
$trt = 'DEL1' if ($rt eq 'portforwardingdel1');
|
||||
|
||||
my %pf_datas = ();
|
||||
my $title = $c->l('pf_FORM_TITLE');
|
||||
my $modul = '';
|
||||
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
# Add a portforward- called from the list panel
|
||||
# Nothing to do here...as just need template to display fields to input data.
|
||||
|
||||
}
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'ADD1') {
|
||||
|
||||
#Add a port forward - called after new pf details filled in
|
||||
my %ret = add_portforward($c);
|
||||
|
||||
#Return to list page if success
|
||||
if ((index($ret{ret}, "SUCCESS") != -1)) {
|
||||
$trt = "LIST";
|
||||
} else {
|
||||
|
||||
#Error - return to Add page
|
||||
$trt = "ADD";
|
||||
}
|
||||
$c->stash(ret => \%ret);
|
||||
}
|
||||
} ## end if ($trt eq 'ADD1')
|
||||
|
||||
if ($trt eq 'DEL1') {
|
||||
##After Remove clicked on Delete network panel
|
||||
my $sport = $c->param("sport") || '';
|
||||
my $proto = $c->param("proto") || '';
|
||||
|
||||
#work out which protocol
|
||||
my $fdb;
|
||||
|
||||
if ($proto eq 'TCP') {
|
||||
$fdb = $tcp_db;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$fdb = $udp_db;
|
||||
}
|
||||
|
||||
#check that the sport is in the db
|
||||
my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
|
||||
$entry->delete;
|
||||
@@ -118,21 +112,23 @@ sub do_display {
|
||||
$trt = "LIST";
|
||||
my %ret = (ret => "pf_SUCCESS");
|
||||
$c->stash(ret => \%ret);
|
||||
}
|
||||
} ## end if ($trt eq 'DEL1')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
##Initial delete panel requiring confirmation
|
||||
my $sport = $c->param("sport") || '';
|
||||
my $proto = $c->param("proto") || '';
|
||||
$c->stash(sport => $sport);
|
||||
|
||||
#work out which protocol
|
||||
my $fdb;
|
||||
|
||||
if ($proto eq 'TCP') {
|
||||
$fdb = $tcp_db;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$fdb = $udp_db;
|
||||
}
|
||||
|
||||
#pull out details and pass to template
|
||||
my $entry = $fdb->get($sport) || die("Unable to find sport and proto $sport $proto");
|
||||
$pf_datas{proto} = $proto;
|
||||
@@ -141,14 +137,14 @@ sub do_display {
|
||||
$pf_datas{dport} = $entry->prop('DestPort') || '';
|
||||
$pf_datas{cmmnt} = $entry->prop('Comment') || '';
|
||||
$pf_datas{allow} = $entry->prop('AllowHosts') || '';
|
||||
}
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
|
||||
#List all the port forwards
|
||||
my @tcpforwards = $tcp_db->get_all;
|
||||
my @udpforwards = $udp_db->get_all;
|
||||
my $empty = 1 if not @tcpforwards and not @udpforwards;
|
||||
|
||||
$c->stash(
|
||||
tcpforwards => \@tcpforwards,
|
||||
udpforwards => \@udpforwards,
|
||||
@@ -157,25 +153,28 @@ sub do_display {
|
||||
|
||||
#my %forwards = (TCP=>@tcpforwards,UDP=>@udpforwards);
|
||||
#$c->stash(portforwarding => %forwards);
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'LIST')
|
||||
$pf_datas{'trt'} = $trt;
|
||||
$c->stash(title => $title, modul => $modul, pf_datas => \%pf_datas);
|
||||
$c->render(template => 'portforwarding');
|
||||
}
|
||||
} ## end sub do_display
|
||||
|
||||
sub add_portforward {
|
||||
my $c = shift;
|
||||
my $sport = $c->param("sport") || '';
|
||||
my $proto = $c->param("proto") || '';
|
||||
|
||||
#work out which protocol
|
||||
my $fdb;
|
||||
|
||||
if ($proto eq 'TCP') {
|
||||
$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
|
||||
$fdb = $tcp_db;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
|
||||
$fdb = $udp_db;
|
||||
}
|
||||
|
||||
#Get the other values
|
||||
my $dport = $c->param("dport");
|
||||
my $dhost = get_destination_host($c);
|
||||
@@ -186,11 +185,17 @@ sub add_portforward {
|
||||
$sport =~ s/^\s+|\s+$//g;
|
||||
$dport =~ s/^\s+|\s+$//g;
|
||||
$dhost =~ s/^\s+|\s+$//g;
|
||||
|
||||
#Validate the values
|
||||
%ret=validate_source_port($c) ; unless (index($ret{ret},"SUCCESS")!= -1) {return %ret;}
|
||||
%ret=validate_allowed_hosts($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
|
||||
%ret=validate_destination_port($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
|
||||
%ret=validate_destination_host($c) ; if (index($ret{ret},"SUCCESS")== -1) {return %ret;}
|
||||
%ret = validate_source_port($c);
|
||||
unless (index($ret{ret}, "SUCCESS") != -1) { return %ret; }
|
||||
%ret = validate_allowed_hosts($c);
|
||||
if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
|
||||
%ret = validate_destination_port($c);
|
||||
if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
|
||||
%ret = validate_destination_host($c);
|
||||
if (index($ret{ret}, "SUCCESS") == -1) { return %ret; }
|
||||
|
||||
# and then write it to the DB and tell the exec about it.
|
||||
my $entry = $fdb->get($sport) || $fdb->new_record($sport, { type => 'forward' });
|
||||
$entry->set_prop('DestHost', $dhost);
|
||||
@@ -202,53 +207,53 @@ sub add_portforward {
|
||||
or (return (ret => 'pf_ERR_NONZERO_RETURN_EVENT'));
|
||||
my %ret = (ret => "pf_SUCCESS");
|
||||
return %ret;
|
||||
} ## end sub add_portforward
|
||||
|
||||
}
|
||||
|
||||
sub get_destination_host
|
||||
{
|
||||
sub get_destination_host {
|
||||
my $q = shift;
|
||||
my $dhost = $q->param("dhost");
|
||||
my $localip = $db->get_prop('InternalInterface', 'IPAddress');
|
||||
my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip;
|
||||
my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
|
||||
my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
|
||||
|
||||
if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i) {
|
||||
|
||||
if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i)
|
||||
{
|
||||
# localhost token gets expanded at runtime to current external IP
|
||||
$dhost = 'localhost';
|
||||
}
|
||||
} ## end if ($dhost =~ /^(127.0.0.1|$localip|$external_ip)$/i)
|
||||
return $dhost;
|
||||
}
|
||||
} ## end sub get_destination_host
|
||||
|
||||
sub validate_source_port {
|
||||
my $q = shift;
|
||||
my $sport = $q->param('sport');
|
||||
$sport =~ s/^\s+|\s+$//g;
|
||||
|
||||
# If this is a port range, split it up and validate it individually.
|
||||
my @ports = ();
|
||||
if ($sport =~ /-/)
|
||||
{
|
||||
|
||||
if ($sport =~ /-/) {
|
||||
@ports = split /-/, $sport;
|
||||
if (@ports > 2)
|
||||
{
|
||||
|
||||
if (@ports > 2) {
|
||||
|
||||
#$self->debug_msg("found more than 2 ports: @ports");
|
||||
return (ret => 'pf_ERR_BADPORT');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} ## end if (@ports > 2)
|
||||
} else {
|
||||
push @ports, $sport;
|
||||
}
|
||||
|
||||
#$self->debug_msg("the ports array is: @ports");
|
||||
foreach my $port (@ports)
|
||||
{
|
||||
foreach my $port (@ports) {
|
||||
|
||||
#$self->debug_msg("looping on port $port");
|
||||
if (! isValidPort($port))
|
||||
{
|
||||
if (!isValidPort($port)) {
|
||||
|
||||
#$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
|
||||
return (ret => 'pf_ERR_BADPORT');
|
||||
}
|
||||
}
|
||||
} ## end foreach my $port (@ports)
|
||||
|
||||
# Now, lets screen any duplicates.
|
||||
my $protocol = $q->param('protocol');
|
||||
my @forwards = ();
|
||||
@@ -259,125 +264,111 @@ sub validate_source_port {
|
||||
} elsif ($protocol eq 'UDP') {
|
||||
@forwards = map { $_->key } $udp_db->get_all;
|
||||
}
|
||||
foreach my $psport (@forwards)
|
||||
{
|
||||
if (detect_collision($sport, $psport))
|
||||
{
|
||||
|
||||
foreach my $psport (@forwards) {
|
||||
if (detect_collision($sport, $psport)) {
|
||||
return (ret => 'pf_ERR_PORT_COLLISION');
|
||||
}
|
||||
}
|
||||
} ## end foreach my $psport (@forwards)
|
||||
return (ret => "pf_SUCCESS");
|
||||
}
|
||||
} ## end sub validate_source_port
|
||||
|
||||
sub detect_collision
|
||||
{
|
||||
sub detect_collision {
|
||||
my $port_a = shift;
|
||||
my $port_b = shift;
|
||||
|
||||
# If they're both single ports, see if they're the same.
|
||||
if (($port_a !~ /-/) && ($port_b !~ /-/))
|
||||
{
|
||||
if (($port_a !~ /-/) && ($port_b !~ /-/)) {
|
||||
return $port_a eq $port_b;
|
||||
}
|
||||
|
||||
# If port_a is not a range but port_b is, is a in b?
|
||||
elsif ($port_a !~ /-/)
|
||||
{
|
||||
elsif ($port_a !~ /-/) {
|
||||
my ($b1, $b2) = split /-/, $port_b;
|
||||
return (($port_a >= $b1) && ($port_a <= $b2));
|
||||
}
|
||||
elsif ($port_b !~ /-/)
|
||||
{
|
||||
} elsif ($port_b !~ /-/) {
|
||||
my ($a1, $a2) = split /-/, $port_a;
|
||||
return (($port_b >= $a1) && ($port_b <= $a2));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
|
||||
# They're both ranges. Do they overlap?
|
||||
my ($a1, $a2) = split /-/, $port_a;
|
||||
my ($b1, $b2) = split /-/, $port_b;
|
||||
|
||||
# They can overlap in two ways. Either a1 is in b, or b1 is in a.
|
||||
if (($a1 >= $b1) && ($a1 <= $b2))
|
||||
{
|
||||
if (($a1 >= $b1) && ($a1 <= $b2)) {
|
||||
return TRUE;
|
||||
}
|
||||
elsif (($b1 >= $a1) && ($b1 <= $a2))
|
||||
{
|
||||
} elsif (($b1 >= $a1) && ($b1 <= $a2)) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
} ## end else [ if (($port_a !~ /-/) &&...)]
|
||||
} ## end sub detect_collision
|
||||
|
||||
sub validate_destination_port {
|
||||
my $c = shift;
|
||||
my $dport = $c->param('dport');
|
||||
$dport =~ s/^\s+|\s+$//g;
|
||||
|
||||
# If the dport is empty, that's ok.
|
||||
return (ret => 'pf_SUCCESS') if not $dport;
|
||||
|
||||
# If this is a port range, split it up and validate it individually.
|
||||
my @ports = ();
|
||||
if ($dport =~ /-/)
|
||||
{
|
||||
|
||||
if ($dport =~ /-/) {
|
||||
@ports = split /-/, $dport;
|
||||
if (@ports > 2)
|
||||
{
|
||||
|
||||
if (@ports > 2) {
|
||||
|
||||
#$self->debug_msg("found more than 2 ports: @ports");
|
||||
return (ret => 'pf_ERR_BADPORT');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
} ## end if (@ports > 2)
|
||||
} else {
|
||||
push @ports, $dport;
|
||||
}
|
||||
#$self->debug_msg("the ports array is: @ports");
|
||||
|
||||
foreach my $port (@ports)
|
||||
{
|
||||
#$self->debug_msg("the ports array is: @ports");
|
||||
foreach my $port (@ports) {
|
||||
|
||||
#$self->debug_msg("looping on port $port");
|
||||
if (! isValidPort($port))
|
||||
{
|
||||
if (!isValidPort($port)) {
|
||||
|
||||
#$self->debug_msg("returning: " . $self->localise('ERR_BADPORT'));
|
||||
return (ret => 'pf_ERR_BADPORT');
|
||||
}
|
||||
}
|
||||
} ## end foreach my $port (@ports)
|
||||
return (ret => 'pf_SUCCESS');
|
||||
}
|
||||
|
||||
} ## end sub validate_destination_port
|
||||
|
||||
sub isValidPort() {
|
||||
my $port = shift;
|
||||
|
||||
return FALSE unless defined $port;
|
||||
|
||||
if (($port =~ /^\d+$/) &&
|
||||
($port > 0) &&
|
||||
($port < 65536))
|
||||
if ( ($port =~ /^\d+$/)
|
||||
&& ($port > 0)
|
||||
&& ($port < 65536))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
} ## end sub isValidPort
|
||||
|
||||
sub validate_destination_host {
|
||||
my $c = shift;
|
||||
my $dhost = $c->param('dhost');
|
||||
$dhost =~ s/^\s+|\s+$//g;
|
||||
my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
|
||||
my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
|
||||
|
||||
my $localip = $db->get_prop('InternalInterface', 'IPAddress');
|
||||
my $external_ip = $db->get_prop('ExternalInterface', 'IPAddress') || $localip;
|
||||
if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i) {
|
||||
|
||||
if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i)
|
||||
{
|
||||
# localhost token gets expanded at runtime to current external IP
|
||||
$c->param(-name => 'dhost', -value => 'localhost');
|
||||
return (ret => 'pf_SUCCESS');
|
||||
}
|
||||
|
||||
my $systemmode = $db->get_value('SystemMode');
|
||||
} ## end if ($dhost =~ /^(localhost|127.0.0.1|$localip|$external_ip)$/i)
|
||||
my $systemmode = $cdb->get_value('SystemMode');
|
||||
|
||||
if ($systemmode eq 'serveronly') {
|
||||
return (ret => 'pf_IN_SERVERONLY');
|
||||
@@ -385,17 +376,15 @@ sub validate_destination_host {
|
||||
|
||||
if (isValidIP($dhost)) {
|
||||
return (ret => 'pf_SUCCESS');
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return (ret => 'pf_ERR_BADIP');
|
||||
}
|
||||
}
|
||||
} ## end sub validate_destination_host
|
||||
|
||||
sub validate_allowed_hosts {
|
||||
my $c = shift;
|
||||
my $ahost = $c->param('allow');
|
||||
$ahost =~ s/^\s+|\s+$//g;
|
||||
|
||||
my %valid_ahost_list = (ret => "pf_SUCCESS");
|
||||
|
||||
foreach (split(/[\s,]+/, $ahost)) {
|
||||
@@ -403,8 +392,7 @@ sub validate_allowed_hosts {
|
||||
$valid_ipnet = 1 if ($_ =~ m/^\d+\.\d+\.\d+\.\d+$/);
|
||||
$valid_ipnet = 1 if ($_ =~ m/^\d+\.\d+\.\d+\.\d+\/\d+$/);
|
||||
%valid_ahost_list = (ret => "pf_ERR_BADAHOST") if ($valid_ipnet != 1);
|
||||
}
|
||||
|
||||
} ## end foreach (split(/[\s,]+/, $ahost...))
|
||||
return %valid_ahost_list;
|
||||
}
|
||||
} ## end sub validate_allowed_hosts
|
||||
1;
|
||||
|
@@ -11,102 +11,79 @@ package SrvMngr::Controller::Printers;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use esmith::FormMagick::Panel::printers;
|
||||
|
||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my $adb;
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %prt_datas = ();
|
||||
my $title = $c->l('prt_FORM_TITLE');
|
||||
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$prt_datas{'trt'} = 'LIST';
|
||||
|
||||
my @printerDrivers;
|
||||
if ($adb)
|
||||
{
|
||||
|
||||
if ($adb) {
|
||||
@printerDrivers = $adb->printers();
|
||||
}
|
||||
|
||||
$c->stash(title => $title, prt_datas => \%prt_datas, printerDrivers => \@printerDrivers);
|
||||
$c->render(template => 'printers');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
my $printer = $c->param('printer') || '';
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
#$trt = 'DEL' if ( $printer );
|
||||
#$trt = 'ADD' if ( $rt eq 'printeradd' );
|
||||
|
||||
my %prt_datas = ();
|
||||
my $title = $c->l('prt_FORM_TITLE');
|
||||
|
||||
$prt_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
# nothing
|
||||
|
||||
}
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my $rec = $adb->get($printer);
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'printer') {
|
||||
$prt_datas{printer} = $printer;
|
||||
$prt_datas{description} = $rec->prop('Description') || '';
|
||||
}
|
||||
|
||||
}
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'LIST') {
|
||||
my @printerDrivers;
|
||||
if ($adb)
|
||||
{
|
||||
|
||||
if ($adb) {
|
||||
@printerDrivers = $adb->printers();
|
||||
}
|
||||
$c->stash(printerDrivers => \@printerDrivers);
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'LIST')
|
||||
$c->stash(title => $title, prt_datas => \%prt_datas);
|
||||
$c->render(template => 'printers');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
|
||||
my %prt_datas = ();
|
||||
my $title = $c->l('prt_FORM_TITLE');
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$prt_datas{'trt'} = $trt;
|
||||
|
||||
my ($res, $result) = '';
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
my $name = ($c->param('Name') || '');
|
||||
my $description = ($c->param('Description') || '');
|
||||
my $location = ($c->param('Location') || '');
|
||||
@@ -122,27 +99,27 @@ sub do_update {
|
||||
$prt_datas{'location'} = $location;
|
||||
$c->stash(title => $title, prt_datas => \%prt_datas);
|
||||
return $c->render(template => 'printers');
|
||||
}
|
||||
|
||||
} ## end if ($location eq 'remote'...)
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->new_printer($name, $description, $location);
|
||||
|
||||
#$remoteName, $address );
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'NET') {
|
||||
|
||||
my $name = ($c->param('Name') || '');
|
||||
my $description = ($c->param('Description') || '');
|
||||
my $location = ($c->param('Location') || '');
|
||||
my $remoteName = ($c->param('RemoteName') || '');
|
||||
my $address = ($c->param('Address') || '');
|
||||
|
||||
$prt_datas{'name'} = $name;
|
||||
$prt_datas{'description'} = $description;
|
||||
$prt_datas{'location'} = $location;
|
||||
@@ -150,19 +127,19 @@ sub do_update {
|
||||
# controls
|
||||
$res = $c->validate_network($location, $remoteName, $address);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->new_printer($name, $description, $location, $remoteName, $address);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('prt_CREATED_SUCCESSFULLY') . ' ' . $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'NET')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my $printer = ($c->param('printer') || '');
|
||||
|
||||
if ($printer =~ /^([a-z][a-z0-9]*)$/) {
|
||||
@@ -170,64 +147,52 @@ sub do_update {
|
||||
} else {
|
||||
$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer;
|
||||
}
|
||||
|
||||
my $rec = $adb->get($printer);
|
||||
$result .= $c->l('prt_ERR_INTERNAL_FAILURE') . ':' . $printer unless ($rec);
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->del_printer($printer);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$result = $c->l('prt_DELETED_SUCCESSFULLY') . ' ' . $printer;
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash(error => $result);
|
||||
$c->stash(title => $title, prt_datas => \%prt_datas);
|
||||
return $c->render('printers');
|
||||
}
|
||||
|
||||
my $message = "'Printers' updates ($trt) DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $result);
|
||||
|
||||
#$c->flash( error => 'No changes applied !!' ); # for testing purpose
|
||||
|
||||
$c->redirect_to('/printers');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub del_printer {
|
||||
|
||||
my ($c, $printer) = @_;
|
||||
|
||||
# Update the db account (1)
|
||||
my $rec = $adb->get($printer);
|
||||
|
||||
$rec->set_prop('type', 'printer-deleted');
|
||||
system("/sbin/e-smith/signal-event printer-delete $printer") == 0
|
||||
or return $c->error('ERR_DELETING');
|
||||
|
||||
$rec->delete();
|
||||
|
||||
return 'OK';
|
||||
|
||||
}
|
||||
|
||||
} ## end sub del_printer
|
||||
|
||||
sub validate_printer {
|
||||
|
||||
my ($c, $name, $description, $location, $remoteName, $address) = @_;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Validate parameters and untaint them
|
||||
#------------------------------------------------------------
|
||||
|
||||
if ($name =~ /^([a-z][a-z0-9]*)$/) {
|
||||
$name = $1;
|
||||
} else {
|
||||
@@ -249,23 +214,19 @@ sub validate_printer {
|
||||
#------------------------------------------------------------
|
||||
# Looks good. Find out if this printer has been taken
|
||||
#------------------------------------------------------------
|
||||
|
||||
my $rec = $adb->get($name);
|
||||
my $type;
|
||||
|
||||
if ($rec and ($type = $rec->prop('type'))) {
|
||||
return $c->l('prt_ERR_EXISTS') . ' : ' . $name;
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub validate_printer
|
||||
|
||||
sub validate_network {
|
||||
|
||||
my ($c, $location, $remoteName, $address) = @_;
|
||||
|
||||
if ($location eq 'remote') {
|
||||
|
||||
my $msg = hostname_or_ip2($c, $address);
|
||||
return $msg unless $msg eq 'OK';
|
||||
|
||||
@@ -280,82 +241,63 @@ sub validate_network {
|
||||
} else {
|
||||
return $c->l('prt_ERR_INVALID_REMOTE_NAME') . ' : ' . $remoteName;
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($location eq 'remote')
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub validate_network
|
||||
|
||||
sub new_printer {
|
||||
|
||||
my ($c, $name, $description, $location, $remoteName, $address) = @_;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Printer name is available! Update printers database and
|
||||
# signal the create-printer event.
|
||||
#------------------------------------------------------------
|
||||
|
||||
my $result = '';
|
||||
|
||||
my $rec = $adb->new_record($name,
|
||||
my $rec = $adb->new_record(
|
||||
$name,
|
||||
{ type => 'printer',
|
||||
Description => $description,
|
||||
Address => $address,
|
||||
RemoteName => $remoteName,
|
||||
Location => $location});
|
||||
|
||||
Location => $location
|
||||
}
|
||||
);
|
||||
system("/sbin/e-smith/signal-event printer-create $name") == 0
|
||||
or return $c->error('ERR_CREATING');
|
||||
|
||||
return 'OK',
|
||||
}
|
||||
|
||||
return 'OK',;
|
||||
} ## end sub new_printer
|
||||
|
||||
sub hostname_or_ip2 {
|
||||
|
||||
my ($fm, $data) = @_;
|
||||
if ($data =~ /^[\d\.]+$/) {
|
||||
if (ip_number2($fm, $data) eq "OK")
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
|
||||
}
|
||||
}
|
||||
elsif ($data =~ /^([a-zA-Z0-9\.\-]+)$/ )
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
|
||||
}
|
||||
}
|
||||
|
||||
if ($data =~ /^[\d\.]+$/) {
|
||||
if (ip_number2($fm, $data) eq "OK") {
|
||||
return "OK";
|
||||
} else {
|
||||
return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
|
||||
}
|
||||
} elsif ($data =~ /^([a-zA-Z0-9\.\-]+)$/) {
|
||||
return "OK";
|
||||
} else {
|
||||
return $fm->l('prt_MUST_BE_VALID_HOSTNAME_OR_IP');
|
||||
}
|
||||
} ## end sub hostname_or_ip2
|
||||
|
||||
sub ip_number2 {
|
||||
|
||||
# from CGI::FormMagick::Validator::ip_number($fm, $data)
|
||||
|
||||
my ($fm, $data) = @_;
|
||||
|
||||
return undef unless defined $data;
|
||||
|
||||
return 'FM_IP_NUMBER1' unless $data =~ /^[\d.]+$/;
|
||||
|
||||
my @octets = split /\./, $data;
|
||||
my $dots = ($data =~ tr/.//);
|
||||
|
||||
return 'FM_IP_NUMBER2' unless (scalar @octets == 4 and $dots == 3);
|
||||
|
||||
foreach my $octet (@octets) {
|
||||
return $fm->l("FM_IP_NUMBER3", { octet => $octet }) if $octet > 255;
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub ip_number2
|
||||
|
||||
=head2 publicAccess_list
|
||||
|
||||
@@ -365,15 +307,14 @@ access drop down list.
|
||||
=cut
|
||||
|
||||
sub printerLocation_list {
|
||||
|
||||
my $c = shift;
|
||||
return [[ $c->l('prt_LOCAL_PRINTER_0') => 'lp0'],
|
||||
return [
|
||||
[ $c->l('prt_LOCAL_PRINTER_0') => 'lp0' ],
|
||||
[ $c->l('prt_LOCAL_PRINTER_1') => 'lp1' ],
|
||||
[ $c->l('prt_LOCAL_PRINTER_2') => 'lp2' ],
|
||||
[ $c->l('prt_NET_PRINTER') => 'remote' ],
|
||||
[ $c->l('prt_FIRST_USB_PRINTER') => 'usb/lp0' ],
|
||||
[ $c->l('prt_SECOND_USB_PRINTER') => 'usb/lp1']];
|
||||
}
|
||||
|
||||
|
||||
[ $c->l('prt_SECOND_USB_PRINTER') => 'usb/lp1' ]
|
||||
];
|
||||
} ## end sub printerLocation_list
|
||||
1
|
||||
|
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy;
|
||||
#----------------------------------------------------------------------
|
||||
# heading : System
|
||||
# description : Proxy settings
|
||||
# navigation : 4000 700
|
||||
# navigation : 4000 710
|
||||
#----------------------------------------------------------------------
|
||||
#
|
||||
# routes : end
|
||||
@@ -11,65 +11,50 @@ package SrvMngr::Controller::Proxy;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %prx_datas = ();
|
||||
my $title = $c->l('prx_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
|
||||
|
||||
$prx_datas{'http_proxy_status'} = ($db->get_prop('squid', 'status')) || 'disabled';
|
||||
|
||||
#if (system('/bin/rpm -q e-smith-email > /dev/null') == 0)
|
||||
#{
|
||||
$prx_datas{'smtp_proxy_status'} = $db->get_prop('qpsmtpd', 'Proxy') || undef;
|
||||
|
||||
#}
|
||||
#(system('/bin/rpm -q e-smith-email > /dev/null') == 0) ?
|
||||
|
||||
$c->stash(title => $title, modul => $modul, prx_datas => \%prx_datas);
|
||||
$c->render(template => 'proxy');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_update {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $http_proxy_status = $c->param('http_proxy_status') || 'disabled';
|
||||
my $smtp_proxy_status = $c->param('smtp_proxy_status') || '';
|
||||
|
||||
my $result = "";
|
||||
|
||||
my $squid = $db->get('squid') or $result = $c->l('prx_ERR_NO_SQUID_REC');
|
||||
|
||||
# smtpd is allowed to not exist, as the relevant packages may not be
|
||||
# installed.
|
||||
my $smtpd = $db->get('qpsmtpd') || undef;
|
||||
|
||||
$squid->set_prop('status', $http_proxy_status);
|
||||
$smtpd->set_prop('Proxy', $smtp_proxy_status) if $smtpd;
|
||||
|
||||
#
|
||||
# Update the system
|
||||
#
|
||||
system("/sbin/e-smith/signal-event proxy-update") == 0
|
||||
or $result = $c->l('prx_ERR_PROXY_UPDATE_FAILED');
|
||||
|
||||
my $title = $c->l('prx_TITLE');
|
||||
|
||||
if ($result eq '') { $result = $c->l('prx_SUCCESS'); }
|
||||
|
||||
$c->stash(title => $title, modul => $result);
|
||||
$c->render(template => 'module');
|
||||
};
|
||||
|
||||
|
||||
} ## end sub do_update
|
||||
1;
|
||||
|
@@ -11,112 +11,96 @@ package SrvMngr::Controller::Pseudonyms;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use Data::Dumper;
|
||||
|
||||
#use esmith::FormMagick::Panel::pseudonyms;
|
||||
use esmith::AccountsDB;
|
||||
|
||||
#use URI::Escape;
|
||||
|
||||
|
||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
#our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my ($cdb,$adb);
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %pse_datas = ();
|
||||
my $title = $c->l('pse_FORM_TITLE');
|
||||
my $notif = '';
|
||||
|
||||
$pse_datas{trt} = 'LST';
|
||||
|
||||
my @pseudonyms;
|
||||
if ($adb)
|
||||
{
|
||||
#$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
if ($adb) {
|
||||
@pseudonyms = $adb->pseudonyms();
|
||||
}
|
||||
|
||||
$c->stash(title => $title, notif => $notif, pse_datas => \%pse_datas, pseudonyms => \@pseudonyms);
|
||||
$c->render(template => 'pseudonyms');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LST');
|
||||
my $pseudonym = $c->param('pseudonym') || '';
|
||||
|
||||
my $title = $c->l('pse_FORM_TITLE');
|
||||
my %pse_datas = ();
|
||||
#$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$pse_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
#nothing
|
||||
}
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $rec = $adb->get($pseudonym);
|
||||
if ($rec and $rec->prop('type') eq 'pseudonym') {
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'pseudonym') {
|
||||
$pse_datas{pseudonym} = $pseudonym;
|
||||
$pse_datas{account} = $rec->prop('Account') || '';
|
||||
$pse_datas{internal} = is_pseudonym_internal($pseudonym);
|
||||
}
|
||||
}
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
my $rec = $adb->get($pseudonym);
|
||||
if ($rec and $rec->prop('type') eq 'pseudonym') {
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'pseudonym') {
|
||||
$pse_datas{pseudonym} = $pseudonym;
|
||||
$pse_datas{account} = $rec->prop('Account') || '';
|
||||
$pse_datas{internal} = is_pseudonym_internal($pseudonym);
|
||||
|
||||
}
|
||||
}
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
if ($trt eq 'LST') {
|
||||
my @pseudonyms;
|
||||
|
||||
if ($adb) {
|
||||
@pseudonyms = $adb->pseudonyms();
|
||||
}
|
||||
$c->stash(pseudonyms => \@pseudonyms);
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'LST')
|
||||
$c->stash(title => $title, pse_datas => \%pse_datas);
|
||||
$c->render(template => 'pseudonyms');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LST');
|
||||
|
||||
my $title = $c->l('pse_FORM_TITLE');
|
||||
#$cdb = esmith::ConfigDB->open || die "Couldn't open configuration db";
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my %pse_datas = ();
|
||||
$pse_datas{'trt'} = $trt;
|
||||
|
||||
my ($res, $result) = '';
|
||||
|
||||
#my $pseudonym = uri_unescape($c->param('Pseudonym'));
|
||||
@@ -124,7 +108,6 @@ sub do_update {
|
||||
$pse_datas{'pseudonym'} = $pseudonym;
|
||||
|
||||
if ($trt eq 'ADD') {
|
||||
|
||||
my $account = $c->param('Account');
|
||||
|
||||
# controls
|
||||
@@ -132,29 +115,32 @@ sub do_update {
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= ' blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$adb->new_record( $pseudonym, { type => 'pseudonym',
|
||||
Account => $account} )
|
||||
or $result .= "Error occurred while creating pseudonym in database.";
|
||||
$adb->new_record(
|
||||
$pseudonym,
|
||||
{ type => 'pseudonym',
|
||||
Account => $account
|
||||
}
|
||||
) or $result .= "Error occurred while creating pseudonym in database.";
|
||||
|
||||
# Untaint $pseudonym before use in system()
|
||||
($pseudonym) = ($pseudonym =~ /(.+)/);
|
||||
system( "/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",)
|
||||
== 0 or $result .= 'pse_CREATE_ERROR.';
|
||||
}
|
||||
system("/sbin/e-smith/signal-event", "pseudonym-create", "$pseudonym",) == 0
|
||||
or $result .= 'pse_CREATE_ERROR.';
|
||||
} ## end if (!$result)
|
||||
|
||||
if (!$result) {
|
||||
$res = 'OK';
|
||||
$result = $c->l('pse_CREATE_SUCCEEDED') . ' ' . $pseudonym;
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'ADD')
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $account = $c->param('Account');
|
||||
my $internal = $c->param('Internal') || 'NO';
|
||||
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
|
||||
|
||||
my %props = ('Account' => $account);
|
||||
|
||||
if ($removable eq 'yes') {
|
||||
@@ -166,23 +152,24 @@ sub do_update {
|
||||
#$res = '';
|
||||
#$res = validate_description( $c, $account );
|
||||
#$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= 'blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$adb->get($pseudonym)->merge_props(%props)
|
||||
or $result .= "Error occurred while modifying pseudonym in database.";
|
||||
|
||||
# Untaint $pseudonym before use in system()
|
||||
($pseudonym) = ($pseudonym =~ /(.+)/);
|
||||
system( "/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",)
|
||||
== 0 or $result .= "Error occurred while modifying pseudonym.";
|
||||
}
|
||||
system("/sbin/e-smith/signal-event", "pseudonym-modify", "$pseudonym",) == 0
|
||||
or $result .= "Error occurred while modifying pseudonym.";
|
||||
} ## end if (!$result)
|
||||
|
||||
if (!$result) {
|
||||
$res = 'OK';
|
||||
$result = $c->l('pse_MODIFY_SUCCEEDED') . ' ' . $pseudonym;
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
if ($trt eq 'DEL') {
|
||||
|
||||
@@ -192,45 +179,39 @@ sub do_update {
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
#$result .= 'blocked';
|
||||
|
||||
$res = '';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->delete_pseudonym($pseudonym);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$res = 'OK';
|
||||
$result = $c->l('pse_REMOVE_SUCCEEDED') . ' ' . $pseudonym;
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'DEL')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash(error => $result);
|
||||
$c->stash(title => $title, pse_datas => \%pse_datas);
|
||||
return $c->render('pseudonyms');
|
||||
}
|
||||
|
||||
my $message = "'Pseudonyms' updates $trt DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $result);
|
||||
|
||||
$c->redirect_to('/pseudonyms');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub delete_pseudonym {
|
||||
|
||||
my ($c, $pseudonym) = @_;
|
||||
|
||||
my $msg = '';
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Make the pseudonym inactive, signal pseudonym-delete event
|
||||
# and then delete it
|
||||
#------------------------------------------------------------
|
||||
|
||||
my @pseudonyms = $adb->pseudonyms();
|
||||
|
||||
foreach my $p_rec (@pseudonyms) {
|
||||
@@ -238,8 +219,7 @@ sub delete_pseudonym {
|
||||
$adb->get($p_rec->key)->set_prop('type', 'pseudonym-deleted')
|
||||
or $msg .= "Error occurred while changing pseudonym type.";
|
||||
}
|
||||
}
|
||||
|
||||
} ## end foreach my $p_rec (@pseudonyms)
|
||||
$adb->get($pseudonym)->set_prop('type', 'pseudonym-deleted')
|
||||
or $msg .= "Error occurred while changing pseudonym type.";
|
||||
|
||||
@@ -250,49 +230,40 @@ sub delete_pseudonym {
|
||||
|
||||
#TODO: is it ->delete or get()->delete
|
||||
foreach my $p_rec (@pseudonyms) {
|
||||
|
||||
if ($p_rec->prop("Account") eq $pseudonym) {
|
||||
$adb->get($p_rec->key)->delete()
|
||||
or $msg .= "Error occurred while deleting pseudonym from database.";
|
||||
}
|
||||
}
|
||||
|
||||
} ## end foreach my $p_rec (@pseudonyms)
|
||||
$adb->get($pseudonym)->delete()
|
||||
or $msg .= "Error occurred while deleting pseudonym from database.";
|
||||
|
||||
return $msg unless $msg;
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
|
||||
} ## end sub delete_pseudonym
|
||||
|
||||
sub existing_accounts_list {
|
||||
my $c = shift;
|
||||
|
||||
my @existingAccounts = ([ 'Administrator' => 'admin' ]);
|
||||
|
||||
foreach my $a ($adb->get_all) {
|
||||
if ($a->prop('type') =~ /(user|group)/) {
|
||||
push @existingAccounts, [ $a->key => $a->key ];
|
||||
}
|
||||
|
||||
if ($a->prop('type') eq "pseudonym") {
|
||||
my $target = $adb->get($a->prop('Account'));
|
||||
|
||||
unless ($target)
|
||||
{
|
||||
warn "WARNING: pseudonym (" . $a->key . ") => missing Account("
|
||||
. $a->prop('Account') . ")\n";
|
||||
unless ($target) {
|
||||
warn "WARNING: pseudonym (" . $a->key . ") => missing Account(" . $a->prop('Account') . ")\n";
|
||||
next;
|
||||
}
|
||||
|
||||
push @existingAccounts, [ $a->key, $a->key ]
|
||||
unless ($target->prop('type') eq "pseudonym");
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($a->prop('type') eq...)
|
||||
} ## end foreach my $a ($adb->get_all)
|
||||
return (\@existingAccounts);
|
||||
}
|
||||
|
||||
} ## end sub existing_accounts_list
|
||||
|
||||
=head2 get_pseudonym_account
|
||||
|
||||
@@ -303,15 +274,15 @@ Returns the current Account property for this pseudonym
|
||||
sub get_pseudonym_account {
|
||||
my $c = shift;
|
||||
my $pseudonym = shift;
|
||||
|
||||
my $a = $adb->get($pseudonym)->prop('Account');
|
||||
|
||||
if ($a eq "admin") {
|
||||
$a = "Administrator";
|
||||
} elsif ($a eq "shared") {
|
||||
$a = $c->l("EVERYONE");
|
||||
}
|
||||
return ($a);
|
||||
}
|
||||
} ## end sub get_pseudonym_account
|
||||
|
||||
=head2 is_pseudonym_not_removable
|
||||
|
||||
@@ -322,11 +293,10 @@ Returns 1 if the current Account is not removable, 0 otherwise
|
||||
sub is_pseudonym_not_removable {
|
||||
my $c = shift;
|
||||
my $pseudonym = shift;
|
||||
|
||||
my $removable = $adb->get($pseudonym)->prop('Removable') || 'yes';
|
||||
return 1 if ($removable eq 'yes');
|
||||
return 0;
|
||||
}
|
||||
} ## end sub is_pseudonym_not_removable
|
||||
|
||||
=head2 is_pseudonym_internal
|
||||
|
||||
@@ -335,13 +305,13 @@ Returns YES if the current Account property Visible is 'internal'
|
||||
=cut
|
||||
|
||||
sub is_pseudonym_internal {
|
||||
|
||||
# my $c = shift;
|
||||
my $pseudonym = shift;
|
||||
|
||||
my $visible = $adb->get($pseudonym)->prop('Visible') || '';
|
||||
return 'YES' if ($visible eq 'internal');
|
||||
return 'NO';
|
||||
}
|
||||
} ## end sub is_pseudonym_internal
|
||||
|
||||
=head2 validate_new_pseudonym_name FM PSEUDONYM
|
||||
|
||||
@@ -355,14 +325,11 @@ Returns "NAME_IN_USE" if this pseudonym is taken.
|
||||
=cut
|
||||
|
||||
sub validate_new_pseudonym_name {
|
||||
|
||||
my ($c, $pseudonym, $account) = @_;
|
||||
|
||||
my $acct = $adb->get($pseudonym);
|
||||
|
||||
if (defined $acct) {
|
||||
return ($c->l('pse_NAME_IN_USE'));
|
||||
|
||||
} elsif ($pseudonym =~ /@/) {
|
||||
use esmith::DomainsDB;
|
||||
my $ddb = esmith::DomainsDB->open_ro
|
||||
@@ -371,14 +338,12 @@ sub validate_new_pseudonym_name {
|
||||
return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs));
|
||||
return ($c->l('pse_PSEUDONYM_INVALID_SAMEACCT')) if ($lhs eq $account);
|
||||
return ('OK'); # p:' . $pseudonym . ' a:' . $account);
|
||||
|
||||
} elsif ($pseudonym !~ /^([a-z0-9][a-z0-9\.\-_!#\?~\$\^\+&`%\/\*]*)$/) {
|
||||
return ($c->l('pse_VALID_PSEUDONYM_NAMES'));
|
||||
} else {
|
||||
return ('OK');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub validate_new_pseudonym_name
|
||||
|
||||
=head2 validate_is_pseudonym FM NAME
|
||||
|
||||
@@ -390,17 +355,13 @@ returns "NOT_A_PSEUDONYM" if the name in question isn't an existing pseudonym
|
||||
sub validate_is_pseudonym {
|
||||
my $c = shift;
|
||||
my $pseudonym = shift;
|
||||
|
||||
$pseudonym = $adb->get($pseudonym);
|
||||
return ($c->l('pse_NOT_A_PSEUDONYM')) unless $pseudonym;
|
||||
|
||||
my $type = $pseudonym->prop('type');
|
||||
|
||||
unless (defined $type && ($type eq 'pseudonym')) {
|
||||
return ($c->l('NOT_A_PSEUDONYM'));
|
||||
}
|
||||
|
||||
return ('OK');
|
||||
}
|
||||
|
||||
|
||||
} ## end sub validate_is_pseudonym
|
||||
1;
|
||||
|
@@ -10,127 +10,91 @@ package SrvMngr::Controller::Qmailanalog;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use esmith::FormMagick qw(gen_locale_date_string);
|
||||
|
||||
use SrvMngr qw(gen_locale_date_string);
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('qma_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('qma_INITIAL_DESC'));
|
||||
|
||||
$c->stash(title => $title, modul => $modul);
|
||||
$c->render(template => 'qmailanalog');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_update {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $result = "";
|
||||
|
||||
my $report_type = $c->param('report_type');
|
||||
|
||||
if ($report_type =~ /^(\S+)$/)
|
||||
{
|
||||
if ($report_type =~ /^(\S+)$/) {
|
||||
$report_type = $1;
|
||||
}
|
||||
elsif ($report_type =~ /^\s*$/)
|
||||
{
|
||||
} elsif ($report_type =~ /^\s*$/) {
|
||||
$report_type = "zoverall";
|
||||
} else {
|
||||
$result = $c->l('INVALID_REPORT_TYPE') . $report_type;
|
||||
$report_type = undef;
|
||||
}
|
||||
|
||||
my $title = $c->l('qma_FORM_TITLE');
|
||||
|
||||
$result = $c->render_to_string(inline => generateReport($c, $report_type)) if $report_type;
|
||||
|
||||
$c->stash(title => $title, modul => $result);
|
||||
$c->render(template => 'module');
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub generateReport {
|
||||
|
||||
my $c = shift;
|
||||
my $report_type = shift;
|
||||
|
||||
my $out = '';
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Looks good; go ahead and generate the report.
|
||||
#------------------------------------------------------------
|
||||
|
||||
# $| = 1;
|
||||
|
||||
my $now_string = $c->gen_locale_date_string();
|
||||
$out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
|
||||
|
||||
if ($report_type =~ /^qmail-q/)
|
||||
{
|
||||
if ($report_type =~ /^qmail-q/) {
|
||||
open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |");
|
||||
|
||||
$out .= sprintf "<pre>";
|
||||
|
||||
while (<QMAILQUEUEREPORT>)
|
||||
{
|
||||
while (<QMAILQUEUEREPORT>) {
|
||||
$out .= sprintf("%s", $_);
|
||||
}
|
||||
|
||||
close QMAILQUEUEREPORT;
|
||||
$out .= sprintf "</pre>";
|
||||
|
||||
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
|
||||
return '';
|
||||
}
|
||||
|
||||
} ## end if ($report_type =~ /^qmail-q/)
|
||||
chdir "/var/log/qmail";
|
||||
|
||||
open(QMAILANALOG,
|
||||
"/bin/cat \@* current 2>/dev/null"
|
||||
. "| /usr/local/bin/tai64nunix"
|
||||
. "| /usr/local/qmailanalog/bin/matchup 5>/dev/null"
|
||||
. "| /usr/local/qmailanalog/bin/$report_type |"
|
||||
);
|
||||
|
||||
. "| /usr/local/qmailanalog/bin/$report_type |");
|
||||
$out .= sprintf "<pre>";
|
||||
|
||||
while (<QMAILANALOG>)
|
||||
{
|
||||
# Cook any special HTML characters
|
||||
while (<QMAILANALOG>) {
|
||||
|
||||
# Cook any special HTML characters
|
||||
s/\&/\&/g;
|
||||
s/\"/\"/g;
|
||||
s/\>/\>/g;
|
||||
s/\</\</g;
|
||||
|
||||
$out .= sprintf("%s", $_);
|
||||
}
|
||||
|
||||
} ## end while (<QMAILANALOG>)
|
||||
close QMAILANALOG;
|
||||
$out .= sprintf "</pre>";
|
||||
|
||||
|
||||
$out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
|
||||
return $out;
|
||||
|
||||
}
|
||||
|
||||
} ## end sub generateReport
|
||||
|
||||
sub reportType_list {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my @array = (
|
||||
|
||||
# [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ],
|
||||
# [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ],
|
||||
[ $c->l('qma_SUCCESSFUL_DELIVERY_DELAY') => 'zddist' ],
|
||||
@@ -147,6 +111,5 @@ sub reportType_list {
|
||||
);
|
||||
my @sorted_array = sort { $a->[0] cmp $b->[0] } @array;
|
||||
return \@sorted_array;
|
||||
}
|
||||
|
||||
} ## end sub reportType_list
|
||||
1;
|
||||
|
@@ -12,93 +12,70 @@ use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use esmith::FormMagick::Panel::quota;
|
||||
|
||||
#use esmith::TestUtils;
|
||||
use Scalar::Util qw(looks_like_number);
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#our $db = esmith::ConfigDB->open || die "Couldn't open config db";
|
||||
our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
my $adb;
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %quo_datas = ();
|
||||
my $title = $c->l('quo_FORM_TITLE');
|
||||
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$quo_datas{'trt'} = 'LIST';
|
||||
|
||||
my @userAccounts;
|
||||
|
||||
if ($adb) {
|
||||
@userAccounts = $adb->users();
|
||||
}
|
||||
|
||||
$c->stash(title => $title, quo_datas => \%quo_datas, userAccounts => \@userAccounts);
|
||||
$c->render(template => 'quota');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
my $user = $c->param('user') || '';
|
||||
|
||||
$trt = 'UPD' if ($user);
|
||||
|
||||
my %quo_datas = ();
|
||||
my $title = $c->l('quo_FORM_TITLE');
|
||||
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
$quo_datas{'trt'} = $trt;
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
my $rec = $adb->get($user);
|
||||
|
||||
if ($rec and $rec->prop('type') eq 'user') {
|
||||
$quo_datas{user} = $user;
|
||||
$quo_datas{userRec} = $rec;
|
||||
my $max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocks'));
|
||||
my $max = $c->toBestUnit($rec->prop('MaxBlocks'));
|
||||
$quo_datas{hardlim} = $max;
|
||||
$max = esmith::FormMagick::Panel::quota->toBestUnit($rec->prop('MaxBlocksSoftLim'));
|
||||
$max = $c->toBestUnit($rec->prop('MaxBlocksSoftLim'));
|
||||
$quo_datas{softlim} = $max;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} ## end if ($rec and $rec->prop...)
|
||||
} ## end if ($trt eq 'UPD')
|
||||
$c->stash(title => $title, quo_datas => \%quo_datas);
|
||||
$c->render(template => 'quota');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('quo_FORM_TITLE');
|
||||
my %quo_datas = ();
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'LIST');
|
||||
|
||||
$quo_datas{trt} = $trt;
|
||||
my $result = '';
|
||||
my $res;
|
||||
$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
|
||||
|
||||
if ($trt eq 'UPD') {
|
||||
|
||||
$quo_datas{user} = ($c->param('user') || '');
|
||||
$quo_datas{softlim} = ($c->param('Soft') || '');
|
||||
$quo_datas{hardlim} = ($c->param('Hard') || '');
|
||||
@@ -112,33 +89,27 @@ sub do_update {
|
||||
} else {
|
||||
$quo_datas{userRec} = $adb->get($quo_datas{user}) || undef;
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'UPD')
|
||||
|
||||
# common parts
|
||||
|
||||
if ($res ne 'OK') {
|
||||
$c->stash(error => $result);
|
||||
$c->stash(title => $title, quo_datas => \%quo_datas);
|
||||
return $c->render('quota');
|
||||
}
|
||||
|
||||
my $message = "'Quota' updates ($trt) DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $result);
|
||||
|
||||
$c->redirect_to('/quota');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub validate_quota {
|
||||
my ($c, $acct, $softlim, $hardlim) = @_;
|
||||
my $msg;
|
||||
|
||||
my $rec = $adb->get($acct);
|
||||
return $c->l('quo_ERR_NO_SUCH_ACCT') . ' : ' . $acct unless (defined $rec);
|
||||
|
||||
my $type = $rec->prop('type');
|
||||
|
||||
unless ($type eq "user") {
|
||||
$msg = $c->l('quo_ERR_NOT_A_USER_ACCT') . $acct . $c->l('quo_ACCOUNT_IS_TYPE') . $type;
|
||||
return $msg;
|
||||
@@ -149,8 +120,8 @@ sub validate_quota {
|
||||
if (($softlim !~ /^(.+?)\s*([KMGT])?$/) || (!looks_like_number($1))) {
|
||||
return $c->l('quo_SOFT_VAL_MUST_BE_NUMBER');
|
||||
}
|
||||
|
||||
my $exponent = 1; # Entries with no suffix are assumed to be in megabytes.
|
||||
|
||||
if (defined($2)) {
|
||||
$exponent = index("KMGT", $2);
|
||||
}
|
||||
@@ -160,8 +131,8 @@ sub validate_quota {
|
||||
return $c->l('quo_HARD_VAL_MUST_BE_NUMBER');
|
||||
}
|
||||
$exponent = 1; # Entries with no suffix are assumed to be in megabytes.
|
||||
if (defined ($2))
|
||||
{
|
||||
|
||||
if (defined($2)) {
|
||||
$exponent = index("KMGT", $2);
|
||||
}
|
||||
$hardlim = ($1 * 1024**$exponent);
|
||||
@@ -169,7 +140,6 @@ sub validate_quota {
|
||||
#------------------------------------------------------------
|
||||
# Make sure that soft limit is less than hard limit.
|
||||
#------------------------------------------------------------
|
||||
|
||||
unless ($hardlim == 0 or $hardlim > $softlim) {
|
||||
return $c->l('quo_ERR_HARD_LT_SOFT');
|
||||
}
|
||||
@@ -177,17 +147,64 @@ sub validate_quota {
|
||||
#------------------------------------------------------------
|
||||
# Update accounts database and signal the user-modify event.
|
||||
#------------------------------------------------------------
|
||||
|
||||
$rec->set_prop('MaxBlocks', $hardlim);
|
||||
$rec->set_prop('MaxBlocksSoftLim', $softlim);
|
||||
|
||||
# Untaint $acct before using in system().
|
||||
$acct =~ /^(\w[\-\w_\.]*)$/; $acct = $1;
|
||||
$acct =~ /^(\w[\-\w_\.]*)$/;
|
||||
$acct = $1;
|
||||
system("/sbin/e-smith/signal-event", "user-modify", "$acct") == 0
|
||||
or die($c->l('quo_ERR_MODIFYING') . "\n");
|
||||
|
||||
return 'OK';
|
||||
} ## end sub validate_quota
|
||||
|
||||
sub toMB
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return sprintf("%.2f", $kb / 1024);
|
||||
}
|
||||
|
||||
sub toMBNoDecimalPlaces
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return sprintf("%.0f", $kb / 1024);
|
||||
}
|
||||
|
||||
sub toGBNoDecimalPlaces
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return sprintf("%.0f", $kb / 1024 / 1024);
|
||||
}
|
||||
|
||||
sub toKB
|
||||
{
|
||||
my ($self,$mb) = @_;
|
||||
return sprintf("%.0f", $mb * 1024);
|
||||
}
|
||||
|
||||
|
||||
sub GBtoKB
|
||||
{
|
||||
my ($self,$gb) = @_;
|
||||
return sprintf("%.0f", $gb * 1024 * 1024);
|
||||
}
|
||||
|
||||
sub MBtoKB
|
||||
{
|
||||
my ($self,$mb) = @_;
|
||||
return sprintf("%.0f", $mb * 1024);
|
||||
}
|
||||
|
||||
sub toBestUnit
|
||||
{
|
||||
my ($self,$kb) = @_;
|
||||
return 0 if($kb == 0);
|
||||
return $kb."K" if($kb < 1024);
|
||||
return $kb."K" if($kb > 1024 && $kb < 1048576 && $kb % 1024 != 0);
|
||||
return $self->toMBNoDecimalPlaces($kb)."M" if($kb < 1048576);
|
||||
return $self->toMBNoDecimalPlaces($kb)."M" if($kb > 1048576
|
||||
&& ($kb % 1048576 != 0));
|
||||
return $self->toGBNoDecimalPlaces($kb)."G";
|
||||
}
|
||||
|
||||
1
|
||||
|
@@ -10,78 +10,69 @@ package SrvMngr::Controller::Reboot;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('rbo_FORM_TITLE');
|
||||
my $modul = '';
|
||||
|
||||
$c->stash(title => $title, modul => $modul);
|
||||
$c->render(template => 'reboot');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_action {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('rbo_FORM_TITLE');
|
||||
my $result = "";
|
||||
|
||||
my $function = $c->param('function');
|
||||
|
||||
my $debug = $c->param('debug');
|
||||
|
||||
if ($function eq "reboot") {
|
||||
$result = $c->l('rbo_REBOOT_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_REBOOT');
|
||||
|
||||
unless ($debug) {
|
||||
esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "reboot");
|
||||
|
||||
# system( "/sbin/e-smith/signal-event", "reboot" ) == 0
|
||||
# or die ("Error occurred while rebooting.\n");
|
||||
}
|
||||
} ## end unless ($debug)
|
||||
} elsif ($function eq 'shutdown') {
|
||||
$result = $c->l('rbo_SHUTDOWN_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_SHUTDOWN');
|
||||
|
||||
unless ($debug) {
|
||||
esmith::util::backgroundCommand(1, "/sbin/e-smith/signal-event", "halt");
|
||||
|
||||
# system( "/sbin/e-smith/signal-event", "halt" ) == 0
|
||||
# or die ("Error occurred while halting.\n");
|
||||
}
|
||||
} ## end unless ($debug)
|
||||
} elsif ($function eq 'reconfigure') {
|
||||
$result = $c->l('rbo_RECONFIGURE_SUCCEEDED') . '<br>' . $c->l('rbo_DESC_RECONFIGURE');
|
||||
|
||||
unless ($debug) {
|
||||
|
||||
# esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade",
|
||||
# "; ", "/sbin/e-smith/signal-event", "reboot" );
|
||||
system( "/sbin/e-smith/signal-event", "post-upgrade" ) == 0
|
||||
or die ("Error occurred while running post-upgrade.\n");
|
||||
system( "/sbin/e-smith/signal-event", "reboot" ) == 0
|
||||
or die ("Error occurred while rebooting.\n");
|
||||
}
|
||||
}
|
||||
|
||||
esmith::util::backgroundCommand( 1, "/sbin/e-smith/signal-event", "post-upgrade-and-reboot");
|
||||
#system("/sbin/e-smith/signal-event", "post-upgrade") == 0
|
||||
#or die("Error occurred while running post-upgrade.\n");
|
||||
#system("/sbin/e-smith/signal-event", "reboot") == 0
|
||||
#or die("Error occurred while rebooting.\n");
|
||||
} ## end unless ($debug)
|
||||
} ## end elsif ($function eq 'reconfigure')
|
||||
$c->stash(title => $title, modul => $result);
|
||||
$c->render(template => 'module');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_action
|
||||
|
||||
sub rebootFunction_list {
|
||||
|
||||
my $c = shift;
|
||||
return [[ $c->l('rbo_REBOOT') => 'reboot' ],
|
||||
return [
|
||||
[ $c->l('rbo_REBOOT') => 'reboot' ],
|
||||
[ $c->l('RECONFIGURE') => 'reconfigure' ],
|
||||
[ $c->l('SHUTDOWN') => 'shutdown' ]];
|
||||
}
|
||||
|
||||
|
||||
[ $c->l('SHUTDOWN') => 'shutdown' ]
|
||||
];
|
||||
} ## end sub rebootFunction_list
|
||||
1;
|
||||
|
@@ -11,12 +11,9 @@ package SrvMngr::Controller::Remoteaccess;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session ip_number subnet_mask get_reg_mask);
|
||||
|
||||
use esmith::ConfigDB;
|
||||
use esmith::util;
|
||||
use File::Basename;
|
||||
@@ -25,26 +22,23 @@ use Carp;
|
||||
use Socket qw( inet_aton );
|
||||
|
||||
#our @ISA = qw(esmith::FormMagick Exporter);
|
||||
|
||||
our @EXPORT = qw( networkAccess_list passwordLogin_list get_ssh_permit_root_login get_ssh_access get_telnet_mode
|
||||
get_ftp_access get_ftp_password_login_access
|
||||
get_value get_prop get_ssh_password_auth
|
||||
validate_network_and_mask ip_number_or_blank subnet_mask_or_blank
|
||||
get_ipsecrw_sessions pptp_and_dhcp_range
|
||||
);
|
||||
# get_pptp_sessions
|
||||
|
||||
# get_pptp_sessions
|
||||
our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('rma_FORM_TITLE');
|
||||
my $notif = '';
|
||||
my %rma_datas = ();
|
||||
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
|
||||
|
||||
#$rma_datas{ipsecrwSess} = $c->get_ipsecrw_sessions();
|
||||
#$rma_datas{pptpSessions} = $c->get_pptp_sessions();
|
||||
@@ -54,42 +48,34 @@ sub main {
|
||||
$rma_datas{sshTCPPort} = $c->get_ssh_port();
|
||||
$rma_datas{ftpAccess} = $c->get_ftp_access();
|
||||
$rma_datas{ftpPasswordAccess} = $c->get_ftp_password_login_access();
|
||||
#$rma_datas{telnetAccess} = $c->get_telnet_access;
|
||||
|
||||
#$rma_datas{telnetAccess} = $c->get_telnet_access;
|
||||
$c->stash(title => $title, notif => $notif, rma_datas => \%rma_datas);
|
||||
$c->render(template => 'remoteaccess');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_action {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('rma_FORM_TITLE');
|
||||
my ($result, $res, $trt) = '';
|
||||
my %rma_datas = ();
|
||||
|
||||
$db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
|
||||
$rma_datas{ipsecrwSess} = ($c->param('IpsecrwSess') || '');
|
||||
$rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || '');
|
||||
|
||||
#$rma_datas{pptpSessions} = ($c->param ('PptpSessions') || '0');
|
||||
|
||||
$rma_datas{validFromNetwork} = ($c->param('ValidFromNetwork') || '');
|
||||
$rma_datas{validFromMask} = ($c->param('ValidFromMask') || '');
|
||||
## my @remove = $q->param('validFromRemove'); ???????? the first one only !!
|
||||
my @vals = $c->param('Remove_nets');
|
||||
$rma_datas{remove_nets} = join ',', @vals;
|
||||
|
||||
$rma_datas{sshaccess} = ($c->param('SshAccess') || 'off');
|
||||
$rma_datas{sshPermitRootLogin} = ($c->param('SshPermitRootLogin') || 'no');
|
||||
$rma_datas{sshPasswordAuthentication} = ($c->param('SshPasswordAuthentication') || 'no');
|
||||
$rma_datas{sshTCPPort} = ($c->param('SshTCPPort') || '22');
|
||||
|
||||
$rma_datas{ftpAccess} = ($c->param('FtpAccess') || 'off');
|
||||
$rma_datas{ftpPasswordAccess} = ($c->param('FtpPasswordAccess') || 'private');
|
||||
|
||||
$rma_datas{telnetAccess} = ($c->param('TelnetAccess') || 'off');
|
||||
|
||||
# validate
|
||||
@@ -97,10 +83,14 @@ sub do_action {
|
||||
return $c->render('remoteaccess') unless $v->has_data;
|
||||
|
||||
#$v->optional('PptpSessions')->num(0, 999)->is_valid;
|
||||
if ($c->param('ValidFromNetwork') ne "") {
|
||||
$v->optional('ValidFromNetwork')->size(7, 15)->is_valid;
|
||||
$v->optional('ValidFromMask')->size(7, 15)->is_valid;
|
||||
$v->required('SshTCPPort')->num(1, 65535)->is_valid;
|
||||
}
|
||||
|
||||
if ($c->param('ValidFromMask') ne "") {
|
||||
$v->optional('ValidFromMask')->size(7, 15)->is_valid;
|
||||
}
|
||||
$v->required('SshTCPPort')->num(1, 65535)->is_valid;
|
||||
$result .= 'field validation error' if $v->has_error;
|
||||
|
||||
if (!$result) {
|
||||
@@ -108,82 +98,71 @@ sub do_action {
|
||||
# controls
|
||||
#$res = pptp_and_dhcp_range( $c, $rma_datas{pptpSessions} );
|
||||
#$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = ip_number_or_blank($c, $rma_datas{validFromNetwork});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = subnet_mask_or_blank($c, $rma_datas{validFromMask});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
$res = validate_network_and_mask($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask});
|
||||
$result .= $res . ' ' unless $res eq 'OK';
|
||||
|
||||
#$result .= ' blocked for testing !' . $rma_datas{remove_nets};
|
||||
}
|
||||
} ## end if (!$result)
|
||||
|
||||
if (!$result) {
|
||||
$res = change_settings($c, %rma_datas);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
}
|
||||
|
||||
if ( ! $result ) {
|
||||
$result = $c->l('rma_ACTION_SUCCEEDED');
|
||||
if ($result eq "") {
|
||||
$result = $c->l('rma_SUCCESS');
|
||||
$trt = 'SUC';
|
||||
}
|
||||
|
||||
$c->stash(title => $title, notif => $result, rma_datas => \%rma_datas);
|
||||
|
||||
if ( $trt ne 'SUC' ) {
|
||||
return $c->render(template => 'remoteaccess');
|
||||
#return $c->render( template => 'remoteaccess' );
|
||||
if ($trt eq 'SUC') {
|
||||
$c->stash(title => $title, modul => $result);
|
||||
return $c->render(template => 'module');
|
||||
}
|
||||
return $c->render(template => 'remoteaccess');
|
||||
|
||||
$c->redirect_to('/remoteaccess');
|
||||
|
||||
};
|
||||
|
||||
#$c->redirect_to('/remoteaccess');
|
||||
} ## end sub do_action
|
||||
|
||||
sub networkAccess_list {
|
||||
my $c = shift;
|
||||
return [[ $c->l('rma_NO_ACCESS') => 'off'],
|
||||
return [
|
||||
[ $c->l('rma_NO_ACCESS') => 'off' ],
|
||||
[ $c->l('NETWORKS_ALLOW_LOCAL') => 'private' ],
|
||||
[ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public']];
|
||||
}
|
||||
|
||||
[ $c->l('NETWORKS_ALLOW_PUBLIC') => 'normal' ]
|
||||
];
|
||||
} ## end sub networkAccess_list
|
||||
|
||||
sub passwordLogin_list {
|
||||
my $c = shift;
|
||||
return [[$c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private'],
|
||||
[$c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public']];
|
||||
return [ [ $c->l('rma_PASSWORD_LOGIN_PRIVATE') => 'private' ], [ $c->l('rma_PASSWORD_LOGIN_PUBLIC') => 'public' ] ];
|
||||
}
|
||||
|
||||
|
||||
sub get_prop {
|
||||
|
||||
my ($c, $item, $prop) = @_;
|
||||
warn "You must specify a record key" unless $item;
|
||||
warn "You must specify a property name" unless $prop;
|
||||
my $record = $db->get($item) or warn "Couldn't get record for $item";
|
||||
return $record ? $record->prop($prop) : undef;
|
||||
}
|
||||
|
||||
} ## end sub get_prop
|
||||
|
||||
sub get_value {
|
||||
|
||||
my $c = shift;
|
||||
my $item = shift;
|
||||
return ($db->get($item)->value());
|
||||
}
|
||||
|
||||
} ## end sub get_value
|
||||
|
||||
sub get_ftp_access {
|
||||
|
||||
my $status = get_prop('', 'ftp', 'status') || 'disabled';
|
||||
return 'off' unless $status eq 'enabled';
|
||||
|
||||
my $access = get_prop('', 'ftp', 'access') || 'private';
|
||||
return ($access eq 'public') ? 'normal' : 'private';
|
||||
}
|
||||
|
||||
} ## end sub get_ftp_access
|
||||
|
||||
#sub get_pptp_sessions {
|
||||
# my $status = get_prop('','pptpd','status');
|
||||
@@ -191,81 +170,62 @@ sub get_ftp_access {
|
||||
# return(get_prop('','pptpd','sessions') || 'no');
|
||||
# return '0';
|
||||
#}
|
||||
|
||||
|
||||
sub get_ssh_permit_root_login {
|
||||
return (get_prop('', 'sshd', 'PermitRootLogin') || 'no');
|
||||
}
|
||||
|
||||
|
||||
sub get_ssh_password_auth {
|
||||
return (get_prop('', 'sshd', 'PasswordAuthentication') || 'yes');
|
||||
}
|
||||
|
||||
|
||||
sub get_ssh_access {
|
||||
|
||||
my $status = get_prop('', 'sshd', 'status');
|
||||
|
||||
if (defined($status) && ($status eq 'enabled')) {
|
||||
my $access = get_prop('', 'sshd', 'access');
|
||||
$access = ($access eq 'public') ? 'public' : 'private';
|
||||
return ($access);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return ('off');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub get_ssh_access
|
||||
|
||||
sub get_ssh_port {
|
||||
return (get_prop('$c', 'sshd', 'TCPPort') || '22');
|
||||
}
|
||||
|
||||
|
||||
sub get_ftp_password_login_access {
|
||||
|
||||
my $status = get_prop('', 'ftp', 'status') || 'disabled';
|
||||
return 'private' unless $status eq 'enabled';
|
||||
|
||||
my $access = get_prop('', 'ftp', 'LoginAccess') || 'private';
|
||||
|
||||
return ($access eq 'public') ? 'public' : 'private';
|
||||
}
|
||||
|
||||
} ## end sub get_ftp_password_login_access
|
||||
|
||||
sub get_telnet_mode {
|
||||
|
||||
my $telnet = $db->get('telnet');
|
||||
return ('off') unless $telnet;
|
||||
my $status = $telnet->prop('status') || 'disabled';
|
||||
return ('off') unless $status eq 'enabled';
|
||||
my $access = $telnet->prop('access') || 'private';
|
||||
return ($access eq "public") ? "public" : "private";
|
||||
}
|
||||
|
||||
} ## end sub get_telnet_mode
|
||||
|
||||
sub get_ipsecrw_sessions {
|
||||
|
||||
my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
|
||||
|
||||
if (defined($status) && ($status eq 'enabled')) {
|
||||
return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return ('0');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub get_ipsecrw_sessions
|
||||
|
||||
sub get_ipsecrw_status {
|
||||
|
||||
return undef unless ($db->get('ipsec'));
|
||||
return $db->get('ipsec')->prop('RoadWarriorStatus');
|
||||
|
||||
}
|
||||
|
||||
|
||||
sub pptp_and_dhcp_range {
|
||||
|
||||
my $c = shift;
|
||||
my $val = shift || 0;
|
||||
my $dhcp_status = $db->get_prop('dhcpd', 'status') || 'disabled';
|
||||
@@ -281,22 +241,17 @@ sub pptp_and_dhcp_range {
|
||||
} else {
|
||||
return 'OK';
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub pptp_and_dhcp_range
|
||||
|
||||
sub _get_valid_from {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $rec = $db->get('httpd-admin');
|
||||
return undef unless ($rec);
|
||||
my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
|
||||
return @vals;
|
||||
}
|
||||
|
||||
} ## end sub _get_valid_from
|
||||
|
||||
sub ip_number_or_blank {
|
||||
|
||||
my $c = shift;
|
||||
my $ip = shift;
|
||||
|
||||
@@ -304,26 +259,22 @@ sub ip_number_or_blank {
|
||||
return 'OK';
|
||||
}
|
||||
return ip_number($c, $ip);
|
||||
}
|
||||
|
||||
} ## end sub ip_number_or_blank
|
||||
|
||||
sub subnet_mask_or_blank {
|
||||
|
||||
my $c = shift;
|
||||
my $mask = shift;
|
||||
|
||||
if (!defined($mask) || $mask eq "") {
|
||||
return "OK";
|
||||
}
|
||||
|
||||
chomp $mask;
|
||||
|
||||
return ( subnet_mask( $mask ) ne 'OK' ) ? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")" : 'OK';
|
||||
}
|
||||
|
||||
return (subnet_mask($mask) ne 'OK')
|
||||
? $c->l('rma_INVALID_SUBNET_MASK') . " (" . $mask . ")"
|
||||
: 'OK';
|
||||
} ## end sub subnet_mask_or_blank
|
||||
|
||||
sub validate_network_and_mask {
|
||||
|
||||
my $c = shift;
|
||||
my $net = shift || "";
|
||||
my $mask = shift || "";
|
||||
@@ -332,18 +283,16 @@ sub validate_network_and_mask {
|
||||
return $c->l('rma_ERR_INVALID_PARAMS' . " (" . $net . "/" . $mask . ")");
|
||||
}
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub validate_network_and_mask
|
||||
|
||||
sub change_settings {
|
||||
|
||||
my ($c, %rma_datas) = @_;
|
||||
|
||||
#------------------------------------------------------------
|
||||
# good; go ahead and change the access.
|
||||
#------------------------------------------------------------
|
||||
|
||||
my $rec = $db->get('telnet');
|
||||
|
||||
if ($rec) {
|
||||
if ($rma_datas{telnetAccess} eq "off") {
|
||||
$rec->set_prop('status', 'disabled');
|
||||
@@ -351,17 +300,15 @@ sub change_settings {
|
||||
$rec->set_prop('status', 'enabled');
|
||||
$rec->set_prop('access', $rma_datas{telnetAccess});
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($rec)
|
||||
$rec = $db->get('sshd') || $db->new_record('sshd', { type => 'service' });
|
||||
$rec->set_prop('TCPPort', $rma_datas{sshTCPPort});
|
||||
$rec->set_prop('status', ($rma_datas{sshaccess} eq "off" ? 'disabled' : 'enabled'));
|
||||
$rec->set_prop('access', $rma_datas{sshaccess});
|
||||
$rec->set_prop('PermitRootLogin', $rma_datas{sshPermitRootLogin});
|
||||
$rec->set_prop('PasswordAuthentication', $rma_datas{sshPasswordAuthentication});
|
||||
|
||||
|
||||
$rec = $db->get('ftp');
|
||||
|
||||
if ($rec) {
|
||||
if ($rma_datas{ftpAccess} eq "off") {
|
||||
$rec->set_prop('status', 'disabled');
|
||||
@@ -376,7 +323,7 @@ sub change_settings {
|
||||
$rec->set_prop('access', 'private');
|
||||
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});
|
||||
}
|
||||
}
|
||||
} ## end if ($rec)
|
||||
|
||||
# if ($rma_datas{pptpSessions} == 0) {
|
||||
# $db->get('pptpd')->set_prop('status', 'disabled');
|
||||
@@ -384,24 +331,23 @@ sub change_settings {
|
||||
# $db->get('pptpd')->set_prop('status', 'enabled');
|
||||
# $db->get('pptpd')->set_prop('sessions', $rma_datas{pptpSessions});
|
||||
# }
|
||||
|
||||
if ($rma_datas{validFromNetwork} && $rma_datas{validFromMask}) {
|
||||
|
||||
unless (add_new_valid_from($c, $rma_datas{validFromNetwork}, $rma_datas{validFromMask})) {
|
||||
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'new net';
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($rma_datas{validFromNetwork...})
|
||||
|
||||
if ($rma_datas{remove_nets}) {
|
||||
unless (remove_valid_from($c, $rma_datas{remove_nets})) {
|
||||
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'del net';
|
||||
}
|
||||
}
|
||||
} ## end if ($rma_datas{remove_nets...})
|
||||
|
||||
# reset ipsec roadwarrior CA,server,client certificates
|
||||
if ($rma_datas{ipsecrwReset}) {
|
||||
system('/sbin/e-smith/roadwarrior', 'reset_certs') == 0 or
|
||||
return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'rst ipsec';
|
||||
system('/sbin/e-smith/roadwarrior', 'reset_certs') == 0
|
||||
or return $c->l('rma_ERROR_UPDATING_CONFIGURATION') . 'rst ipsec';
|
||||
}
|
||||
|
||||
if ($rma_datas{ipsecrwSess}) {
|
||||
@@ -411,40 +357,33 @@ sub change_settings {
|
||||
unless (system("/sbin/e-smith/signal-event", "remoteaccess-update") == 0) {
|
||||
return $c->l('rma_ERROR_UPDATING_CONFIGURATION');
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub change_settings
|
||||
|
||||
sub set_ipsecrw_sessions {
|
||||
|
||||
my $c = shift;
|
||||
my $sessions = shift;
|
||||
|
||||
if (defined $sessions) {
|
||||
$db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
|
||||
|
||||
if (int($sessions) > 0) {
|
||||
$db->get('ipsec')->set_prop('RoadWarriorStatus', 'enabled');
|
||||
}
|
||||
}
|
||||
} ## end if (defined $sessions)
|
||||
return '';
|
||||
}
|
||||
|
||||
} ## end sub set_ipsecrw_sessions
|
||||
|
||||
sub add_new_valid_from {
|
||||
|
||||
my $c = shift;
|
||||
my $net = shift;
|
||||
my $mask = shift;
|
||||
|
||||
# we transform bit mask to regular mask
|
||||
$mask = get_reg_mask($net, $mask);
|
||||
|
||||
my $rec = $db->get('httpd-admin');
|
||||
return $c->error('ERR_NO_RECORD') unless $rec;
|
||||
|
||||
my $prop = $rec->prop('ValidFrom') || '';
|
||||
|
||||
my @vals = split /,/, $prop;
|
||||
return '' if (grep /^$net\/$mask$/, @vals); # already have this entry
|
||||
|
||||
@@ -453,27 +392,20 @@ sub add_new_valid_from {
|
||||
} else {
|
||||
$prop = "$net/$mask";
|
||||
}
|
||||
|
||||
$rec->set_prop('ValidFrom', $prop);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
} ## end sub add_new_valid_from
|
||||
|
||||
sub remove_valid_from {
|
||||
|
||||
my $c = shift;
|
||||
my $remove_nets = shift;
|
||||
|
||||
my @remove = split /,/, $remove_nets;
|
||||
|
||||
# my @remove = $c->param('Remove_nets');
|
||||
my @vals = $c->_get_valid_from();
|
||||
|
||||
foreach my $entry (@remove) {
|
||||
|
||||
return undef unless $entry;
|
||||
|
||||
my ($net, $mask) = split(/\//, $entry);
|
||||
|
||||
unless (@vals) {
|
||||
@@ -487,19 +419,15 @@ sub remove_valid_from {
|
||||
# is $net alone or $net/255.255.255.255. we have to check for both
|
||||
# in this special case...
|
||||
@vals = (grep { $entry ne $_ && $net ne $_ } @vals);
|
||||
}
|
||||
|
||||
} ## end foreach my $entry (@remove)
|
||||
my $prop;
|
||||
|
||||
if (@vals) {
|
||||
$prop = join ',', @vals;
|
||||
} else {
|
||||
$prop = '';
|
||||
}
|
||||
|
||||
$db->get('httpd-admin')->set_prop('ValidFrom', $prop);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
} ## end sub remove_valid_from
|
||||
1;
|
||||
|
@@ -1,56 +1,46 @@
|
||||
package SrvMngr::Controller::Request;
|
||||
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
# retrieve a configuration db record
|
||||
sub getconfig {
|
||||
my $c = shift;
|
||||
my $key = $c->param('key');
|
||||
|
||||
$c->app->log->info($c->log_req . ' ' . $key);
|
||||
|
||||
if ($key) {
|
||||
use esmith::ConfigDB qw(open_ro);
|
||||
my $cdb = esmith::ConfigDB->open_ro;
|
||||
return getdb($c, $cdb, $key);
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($key)
|
||||
} ## end sub getconfig
|
||||
|
||||
# retrieve an accounts db record, given its name
|
||||
sub getaccount {
|
||||
my $c = shift;
|
||||
my $key = $c->param('key');
|
||||
|
||||
$c->app->log->info($c->log_req . ' ' . $key);
|
||||
|
||||
if ($key) {
|
||||
use esmith::AccountsDB qw(open_ro);
|
||||
my $adb = esmith::AccountsDB->open_ro;
|
||||
return getdb($c, $adb, $key);
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($key)
|
||||
} ## end sub getaccount
|
||||
|
||||
sub getdb {
|
||||
|
||||
my ($c, $db, $key) = @_;
|
||||
|
||||
if (my $rec = $db->get($key)) {
|
||||
return $c->render(json => { $key => { $rec->props } });
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
} ## end sub getdb
|
||||
1;
|
||||
|
@@ -10,73 +10,57 @@ package SrvMngr::Controller::Review;
|
||||
# heading-o : Configuration
|
||||
# description-o : Review configuration
|
||||
# navigation-o : 6000 6800
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
use SrvMngr qw(gen_locale_date_string);
|
||||
|
||||
|
||||
#use SrvMngr::Review_sub qw(print_page);
|
||||
#use smeserver::Panel::review;
|
||||
use esmith::FormMagick::Panel::review;
|
||||
|
||||
our $db = esmith::ConfigDB->open_ro || die "Couldn't open config db";
|
||||
our $domains = esmith::DomainsDB->open_ro || die "Couldn't open domains";
|
||||
our $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks";
|
||||
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('rvw_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION'));
|
||||
my %rvw_datas = ();
|
||||
|
||||
$rvw_datas{'servermode'} = (get_value('', 'SystemMode') || '');
|
||||
$rvw_datas{'localip'} = get_value('$c','LocalIP' )
|
||||
.'/'.get_value('$c','LocalNetmask');
|
||||
$rvw_datas{'publicip'} =
|
||||
esmith::FormMagick::Panel::review->get_public_ip_address($c);
|
||||
$rvw_datas{'gateway'} =
|
||||
$c->render_to_string(inline => print2_gateway_stanza($c));
|
||||
$rvw_datas{'serveronly'} =
|
||||
$c->render_to_string(inline => print2_serveronly_stanza($c));
|
||||
$rvw_datas{'localip'} = get_value('$c', 'LocalIP') . '/' . get_value('$c', 'LocalNetmask');
|
||||
$rvw_datas{'publicip'} = $c->get_public_ip_address($c);
|
||||
$rvw_datas{'gateway'} = $c->render_to_string(inline => print2_gateway_stanza($c));
|
||||
$rvw_datas{'serveronly'} = $c->render_to_string(inline => print2_serveronly_stanza($c));
|
||||
$rvw_datas{'addlocalnetworks'} = get_local_networks($c);
|
||||
$rvw_datas{'dhcpserver'} =
|
||||
$c->render_to_string(inline => print2_dhcp_stanza($c));
|
||||
|
||||
$rvw_datas{'dhcpserver'} = $c->render_to_string(inline => print2_dhcp_stanza($c));
|
||||
$rvw_datas{'dnsserver'} = (get_value('', 'LocalIP') || '');
|
||||
$rvw_datas{'webserver'} = 'www.' . (get_local_domain());
|
||||
my $port = $db->get_prop("squid", "TransparentPort") || 3128;
|
||||
$rvw_datas{'proxyserver'} = 'proxy.' . get_local_domain() . ":$port";
|
||||
$rvw_datas{'ftpserver'} = 'ftp.' . get_local_domain();
|
||||
$rvw_datas{'smtpserver'} = 'mail.' . get_local_domain();
|
||||
|
||||
$rvw_datas{'domainname'} = (get_value('', 'DomainName') || '');
|
||||
$rvw_datas{'virtualdomains'} =
|
||||
$c->render_to_string(inline => gen2_domains($c));
|
||||
$rvw_datas{'virtualdomains'} = $c->render_to_string(inline => gen2_domains($c));
|
||||
$rvw_datas{'primarywebsite'} = 'http://www.' . get_value('', 'DomainName');
|
||||
$rvw_datas{'servermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/server-manager/';
|
||||
$rvw_datas{'usermanager'} = 'https://' . (get_value('', 'SystemName') || 'localhost') . '/user-password/';
|
||||
$rvw_datas{'emailaddresses'} =
|
||||
$c->render_to_string(inline => gen2_email_addresses($c));
|
||||
$rvw_datas{'emailaddresses'} = $c->render_to_string(inline => gen2_email_addresses($c));
|
||||
|
||||
#$c->stash( releaseVersion => $c->session->{releaseVersion}, copyRight => $c->session->{copyRight},
|
||||
#PwdSet => $c->session->{PwdSet}, Unsafe => $c->session->{Unsafe},
|
||||
$c->stash( title => $title, modul => $modul, rvw_datas => \%rvw_datas,
|
||||
$c->stash(
|
||||
title => $title,
|
||||
modul => $modul,
|
||||
rvw_datas => \%rvw_datas,
|
||||
);
|
||||
|
||||
$c->render(template => 'review');
|
||||
|
||||
}
|
||||
|
||||
} ## end sub main
|
||||
|
||||
=head2 gen2_email_addresses
|
||||
|
||||
@@ -87,19 +71,27 @@ sub main {
|
||||
|
||||
sub gen2_email_addresses {
|
||||
my $c = shift;
|
||||
|
||||
my $domain = get_value($c, 'DomainName');
|
||||
my $useraccount = $c->l("rvw_EMAIL_USERACCOUNT");
|
||||
my $firstname = $c->l("rvw_EMAIL_FIRSTNAME");
|
||||
my $lastname = $c->l("rvw_EMAIL_LASTNAME");
|
||||
|
||||
my $out = "<I>" . $useraccount . "</I>\@" . $domain . "<BR>"
|
||||
. "<I>" . $firstname . "</I>.<I>" . $lastname . "</I>\@" . $domain . "<BR>"
|
||||
. "<I>" . $firstname . "</I>_<I>" . $lastname . "</I>\@" . $domain . "<BR>";
|
||||
|
||||
my $out
|
||||
= "<I>"
|
||||
. $useraccount
|
||||
. "</I>\@"
|
||||
. $domain . "<BR>" . "<I>"
|
||||
. $firstname
|
||||
. "</I>.<I>"
|
||||
. $lastname
|
||||
. "</I>\@"
|
||||
. $domain . "<BR>" . "<I>"
|
||||
. $firstname
|
||||
. "</I>_<I>"
|
||||
. $lastname
|
||||
. "</I>\@"
|
||||
. $domain . "<BR>";
|
||||
return $out;
|
||||
}
|
||||
|
||||
} ## end sub gen2_email_addresses
|
||||
|
||||
=head2 gen2_domains
|
||||
|
||||
@@ -110,25 +102,24 @@ sub gen2_email_addresses {
|
||||
|
||||
sub gen2_domains {
|
||||
my $c = shift;
|
||||
|
||||
my @virtual = $domains->get_all_by_prop(type => 'domain');
|
||||
my $numvirtual = @virtual;
|
||||
|
||||
if ($numvirtual == 0) {
|
||||
$c->localise("NO_VIRTUAL_DOMAINS");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
my $out = "";
|
||||
my $domain;
|
||||
|
||||
foreach $domain (sort @virtual) {
|
||||
if ($out ne "") {
|
||||
$out .= "<BR>";
|
||||
}
|
||||
$out .= $domain->key;
|
||||
}
|
||||
} ## end foreach $domain (sort @virtual)
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
} ## end else [ if ($numvirtual == 0) ]
|
||||
} ## end sub gen2_domains
|
||||
|
||||
=head2 get2_local_networks
|
||||
|
||||
@@ -139,12 +130,52 @@ serving. (mojo ver)
|
||||
|
||||
sub get2_local_networks {
|
||||
my $c = shift;
|
||||
my @nets = $networks->get_all_by_prop('type' => 'network');
|
||||
my $numNetworks = @nets;
|
||||
|
||||
if ($numNetworks == 0) {
|
||||
return $c->l('rvw_NO_NETWORKS');
|
||||
} else {
|
||||
my $out = "";
|
||||
|
||||
foreach my $network (sort @nets) {
|
||||
if ($out ne "") {
|
||||
$out .= "<BR>";
|
||||
}
|
||||
$out .= $network->key . "/" . get_net_prop($c, $network->key, 'Mask');
|
||||
|
||||
if (defined get_net_prop($c, $network->key, 'Router')) {
|
||||
$out .= " via " . get_net_prop($c, $network->key, 'Router');
|
||||
}
|
||||
} ## end foreach my $network (sort @nets)
|
||||
return $out;
|
||||
} ## end else [ if ($numNetworks == 0)]
|
||||
} ## end sub get2_local_networks
|
||||
|
||||
sub get_net_prop {
|
||||
my $fm = shift;
|
||||
my $item = shift;
|
||||
my $prop = shift;
|
||||
|
||||
my $record = $networks->get($item);
|
||||
if ($record) {
|
||||
return $record->prop($prop);
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
sub get_local_networks {
|
||||
my $fm = shift;
|
||||
|
||||
my @nets = $networks->get_all_by_prop('type' => 'network');
|
||||
|
||||
my $numNetworks = @nets;
|
||||
if ($numNetworks == 0) {
|
||||
return $c->l('rvw_NO_NETWORKS');
|
||||
return $fm->localise('NO_NETWORKS');
|
||||
}
|
||||
else {
|
||||
my $out = "";
|
||||
@@ -153,10 +184,10 @@ sub get2_local_networks {
|
||||
$out .= "<BR>";
|
||||
}
|
||||
|
||||
$out .= $network->key."/" . get_net_prop($c, $network->key, 'Mask');
|
||||
$out .= $network->key."/" . get_net_prop($fm, $network->key, 'Mask');
|
||||
|
||||
if ( defined get_net_prop($c, $network->key, 'Router') ) {
|
||||
$out .= " via " . get_net_prop ($c, $network->key, 'Router');
|
||||
if ( defined get_net_prop($fm, $network->key, 'Router') ) {
|
||||
$out .= " via " . get_net_prop ($fm, $network->key, 'Router');
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
@@ -164,6 +195,10 @@ sub get2_local_networks {
|
||||
|
||||
}
|
||||
|
||||
sub get_local_domain
|
||||
{
|
||||
return (get_value('','DomainName'));
|
||||
}
|
||||
|
||||
|
||||
=head2 print2_gateway_stanza
|
||||
@@ -172,28 +207,28 @@ If this system is a server gateway, show the external ip and gateway ip (mojo ve
|
||||
|
||||
=cut
|
||||
|
||||
sub print2_gateway_stanza
|
||||
{
|
||||
sub print2_gateway_stanza {
|
||||
my $c = shift;
|
||||
if (get_value($c,'SystemMode') =~ /servergateway/)
|
||||
{
|
||||
|
||||
if (get_value($c, 'SystemMode') =~ /servergateway/) {
|
||||
my $ip = get_value($c, 'ExternalIP');
|
||||
my $static =
|
||||
(get_value($c, 'AccessType') eq 'dedicated') &&
|
||||
(get_value($c, 'ExternalDHCP') eq 'off') &&
|
||||
(get_prop($c, 'pppoe', 'status') eq 'disabled');
|
||||
if ($static)
|
||||
{
|
||||
my $static
|
||||
= (get_value($c, 'AccessType') eq 'dedicated')
|
||||
&& (get_value($c, 'ExternalDHCP') eq 'off')
|
||||
&& (get_prop($c, 'pppoe', 'status') eq 'disabled');
|
||||
|
||||
if ($static) {
|
||||
$ip .= "/" . get_value($c, 'ExternalNetmask');
|
||||
}
|
||||
my $out = $c->l('rvw_EXTERNAL_IP_ADDRESS_SUBNET_MASK') . ':' . $ip;
|
||||
if ($static)
|
||||
{
|
||||
|
||||
if ($static) {
|
||||
$out .= $c->l('rvw_GATEWAY') . ':' . get_value($c, 'GatewayIP');
|
||||
}
|
||||
return $out
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
} ## end if (get_value($c, 'SystemMode'...))
|
||||
} ## end sub print2_gateway_stanza
|
||||
|
||||
=head2 print2_serveronly_stanza
|
||||
|
||||
If this system is a standalone server with net access, show the external
|
||||
@@ -203,13 +238,14 @@ gateway IP (mojo ver)
|
||||
|
||||
sub print2_serveronly_stanza {
|
||||
my $c = shift;
|
||||
if ( (get_value($c,'SystemMode') eq 'serveronly') &&
|
||||
get_value($c,'AccessType') &&
|
||||
(get_value($c,'AccessType') ne "off")) {
|
||||
return ( get_value($c,'GatewayIP') );
|
||||
}
|
||||
|
||||
}
|
||||
if ( (get_value($c, 'SystemMode') eq 'serveronly')
|
||||
&& get_value($c, 'AccessType')
|
||||
&& (get_value($c, 'AccessType') ne "off"))
|
||||
{
|
||||
return (get_value($c, 'GatewayIP'));
|
||||
} ## end if ((get_value($c, 'SystemMode'...)))
|
||||
} ## end sub print2_serveronly_stanza
|
||||
|
||||
=head2 print2_dhcp_stanza
|
||||
|
||||
@@ -227,8 +263,53 @@ sub print2_dhcp_stanza {
|
||||
$out .= (get_prop($c, 'dhcpd', 'start') || '') . '<br>';
|
||||
$out .= $c->l('rvw_END_OF_DHCP_ADDRESS_RANGE') . ':';
|
||||
$out .= (get_prop($c, 'dhcpd', 'end') || '');
|
||||
}
|
||||
} ## end if (get_prop($c, 'dhcpd'...))
|
||||
return $out;
|
||||
} ## end sub print2_dhcp_stanza
|
||||
|
||||
sub get_value {
|
||||
my $fm = shift;
|
||||
my $item = shift;
|
||||
my $record = $db->get($item);
|
||||
if ($record) {
|
||||
return $record->value();
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub get_prop {
|
||||
my $fm = shift if (ref($_[0]) ); # If we're being called in a formmagick context
|
||||
# The first argument will always be a fm.
|
||||
#otherwise, we don't want to grab it
|
||||
my $item = shift;
|
||||
my $prop = shift;
|
||||
|
||||
my $record = $db->get($item);
|
||||
if ($record) {
|
||||
return $record->prop($prop);
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub get_public_ip_address
|
||||
{
|
||||
my $self = shift;
|
||||
my $sysconfig = $db->get('sysconfig');
|
||||
if ($sysconfig)
|
||||
{
|
||||
my $publicIP = $sysconfig->prop('PublicIP');
|
||||
if ($publicIP)
|
||||
{
|
||||
return $publicIP;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -0,0 +1,35 @@
|
||||
package SrvMngr::Controller::Roundcubepanel;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : System
|
||||
# description : Webmail
|
||||
# navigation : 99999 9999
|
||||
#----------------------------------------------------------------------
|
||||
#----------------------------------------------------------------------
|
||||
# name : roundcubepanel, method : get, url : /roundcubepanel, ctlact : Roundcubepanel#main
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use SrvMngr::Model::Main;
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
my $title = $c->l('Webmail');
|
||||
my $roundcube_url = $c->param('url');
|
||||
$c->stash(title => $title, modul => $roundcube_url);
|
||||
$c->render(template => 'roundcube');
|
||||
} ## end sub main
|
||||
|
||||
sub getroundcubeurl {
|
||||
my $c = shift;
|
||||
my $url = shift;
|
||||
return "/smanager/roundcube?url=$url";
|
||||
} ## end sub getroundcubeurl
|
||||
1;
|
@@ -11,34 +11,25 @@ package SrvMngr::Controller::Support;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use esmith::util;
|
||||
|
||||
|
||||
sub display_licenses {
|
||||
|
||||
my $lang = shift;
|
||||
|
||||
my $lic = '';
|
||||
foreach my $license (esmith::util::getLicenses($lang)) {
|
||||
|
||||
foreach my $license (esmith::util::getLicenses($lang)) {
|
||||
$lic .= $license . '<br>';
|
||||
}
|
||||
return $lic;
|
||||
}
|
||||
} ## end sub display_licenses
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('support_FORM_TITLE');
|
||||
my $modul = $c->render_to_string(inline => display_licenses($c->session->{lang}));
|
||||
|
||||
$c->stash(title => $title, modul => $modul);
|
||||
$c->render(template => 'module');
|
||||
};
|
||||
|
||||
|
||||
} ## end sub main
|
||||
1;
|
||||
|
@@ -1,29 +1,23 @@
|
||||
package SrvMngr::Controller::Swttheme;
|
||||
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
#use SrvMngr qw(theme_list init_session);
|
||||
|
||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $from = $c->param('From') || '/';
|
||||
my $theme = $c->param('Theme');
|
||||
|
||||
$c->app->log->info(" swt theme '$from' '$theme' ");
|
||||
|
||||
my $oldTheme = $c->session->{CurrentTheme};
|
||||
|
||||
if ($theme ne $oldTheme) {
|
||||
|
||||
# $c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]);
|
||||
# $c->app->static->paths([$c->app->home->rel_file('themes/default/public')]);
|
||||
# if ( $theme ne 'default' ) {
|
||||
@@ -33,19 +27,13 @@ sub main {
|
||||
# unshift @{$c->app->static->paths}, $t_path.'/public' if -d $t_path.'/public';
|
||||
# }
|
||||
$c->session->{CurrentTheme} = $theme;
|
||||
|
||||
$db->get('smanager')->set_prop('Theme', $theme);
|
||||
system("/sbin/e-smith/signal-event smanager-theme-change") == 0
|
||||
or warn "$c->l('ERROR_UPDATING')";
|
||||
}
|
||||
|
||||
} ## end if ($theme ne $oldTheme)
|
||||
## (not sure) $c->flash( warning => $c->l('swt_LOGIN_AGAIN') );
|
||||
$from = '/initial' if $from eq '/';
|
||||
$from = '/' . $from if ($from !~ m|^\/|);
|
||||
|
||||
$c->redirect_to($from);
|
||||
|
||||
}
|
||||
|
||||
|
||||
} ## end sub main
|
||||
1;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,38 +0,0 @@
|
||||
package SrvMngr::Controller::Userpanelaccess;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : User management
|
||||
# description : User Panel Access
|
||||
# navigation : 2000 150
|
||||
# menu :
|
||||
#----------------------------------------------------------------------
|
||||
# name : userpanelaccess, method : get, url : /userpanelaccess, ctlact : Userpanelaccess#main
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use SrvMngr::Model::Main;
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('User panel access');
|
||||
$c->stash( title => $title, modul => 'https://mailserver.bjsystems.co.uk/server-manager/cgi-bin/userpanelaccess', height => 600 );
|
||||
$c->render(template => 'embedded');
|
||||
|
||||
}
|
||||
|
||||
|
||||
1;
|
@@ -8,25 +8,19 @@ package SrvMngr::Controller::Userpassword;
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use esmith::util;
|
||||
use esmith::ConfigDB;
|
||||
use esmith::AccountsDB;
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw( theme_list init_session is_normal_password );
|
||||
|
||||
our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
|
||||
|
||||
use SrvMngr qw( theme_list init_session validate_password );
|
||||
#our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
|
||||
my %pwd_datas = ();
|
||||
|
||||
if ($c->is_logged_in) {
|
||||
@@ -37,7 +31,6 @@ sub main {
|
||||
my $mess = '';
|
||||
my $jwt = $c->param('jwt') || '';
|
||||
my $name = $c->jwt->decode($jwt)->{username} || '';
|
||||
|
||||
$mess = 'Invalid state' unless ($jwt and $name and $rt eq 'upwdreset');
|
||||
|
||||
# request already treated or outdated
|
||||
@@ -56,51 +49,49 @@ sub main {
|
||||
$pwd_datas{trt} = 'RESET';
|
||||
$pwd_datas{jwt} = $jwt;
|
||||
$c->flash(success => $c->l('use_OK_FOR_RESET'));
|
||||
}
|
||||
|
||||
} ## end else [ if ($c->is_logged_in) ]
|
||||
$c->stash(pwd_datas => \%pwd_datas);
|
||||
$c->render('userpassword');
|
||||
}
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub change_password {
|
||||
my $c = shift;
|
||||
|
||||
my $result;
|
||||
my $res;
|
||||
my %pwd_datas = ();
|
||||
|
||||
my $trt = $c->param('Trt');
|
||||
my $acctName = $c->param('User');
|
||||
my $oldPass = $c->param('Oldpass') || '';
|
||||
my $pass = $c->param('Pass');
|
||||
my $passVerify = $c->param('Passverify');
|
||||
|
||||
my $jwt = $c->param('jwt') || '';
|
||||
my $rt = $c->current_route;
|
||||
my $mess = ''; my $name = '';
|
||||
my $mess = '';
|
||||
my $name = '';
|
||||
$name = $c->jwt->decode($jwt)->{username} if $jwt;
|
||||
|
||||
if ($trt eq 'RESET') {
|
||||
$mess = 'Invalid state' unless ($jwt and $name and ($rt eq 'upwdreset2'));
|
||||
|
||||
# request already treated or outdated
|
||||
if ($c->pwdrst->{$name}{confirmed} != 2 or $c->pwdrst->{$name}{date} < time()) {
|
||||
$mess = $c->l('use_INVALID_REQUEST') . ' -step 2-';
|
||||
}
|
||||
|
||||
if (!$name or $c->is_logged_in or $name ne $acctName) {
|
||||
$mess = 'Invalid reset state';
|
||||
}
|
||||
} else {
|
||||
|
||||
if ($name or $jwt or !$c->is_logged_in) {
|
||||
$mess = 'Invalid update state';
|
||||
}
|
||||
}
|
||||
} ## end else [ if ($trt eq 'RESET') ]
|
||||
|
||||
if ($mess) {
|
||||
$c->stash(error => $mess);
|
||||
return $c->redirect_to($c->home_page);
|
||||
}
|
||||
|
||||
$pwd_datas{Account} = $acctName;
|
||||
$pwd_datas{trt} = $trt;
|
||||
|
||||
@@ -108,13 +99,14 @@ sub change_password {
|
||||
if ($acctName eq 'admin') {
|
||||
$result .= "Admin password should not be reset here !";
|
||||
} else {
|
||||
|
||||
unless ($pass && $passVerify) {
|
||||
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>";
|
||||
} else {
|
||||
$result .= $c->l('pwd_PASSWORD_INVALID_CHARS') . "<br>" unless (($pass) = ($pass =~ /^([ -~]+)$/));
|
||||
$result .= $c->l('pwd_PASSWORD_VERIFY_ERROR') . "<br>" unless ($pass eq $passVerify);
|
||||
}
|
||||
}
|
||||
} ## end else [ if ($acctName eq 'admin')]
|
||||
|
||||
if ($result ne '') {
|
||||
$c->stash(error => $result, pwd_datas => \%pwd_datas);
|
||||
@@ -127,6 +119,7 @@ sub change_password {
|
||||
|
||||
# controls old password
|
||||
if ($trt ne 'RESET') {
|
||||
|
||||
unless ($oldPass) {
|
||||
$result .= $c->l('pwd_FIELDS_REQUIRED') . "<br>" unless $trt eq 'RESET';
|
||||
} else {
|
||||
@@ -143,10 +136,9 @@ sub change_password {
|
||||
$result .= $c->l('pwd_ERROR_PASSWORD_CHANGE') . "<br>"
|
||||
unless (SrvMngr::Model::Main->check_credentials($acctName, $oldPass));
|
||||
}
|
||||
}
|
||||
} ## end if ($trt ne 'RESET')
|
||||
|
||||
# $result .= 'Blocked for test (prevents updates)<br>';
|
||||
|
||||
if (!$result) {
|
||||
my $res = $c->reset_password($trt, $acctName, $pass, $oldPass);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
@@ -156,34 +148,25 @@ sub change_password {
|
||||
record_password_change_attempt($c, 'FAILED');
|
||||
$c->stash(error => $result, pwd_datas => \%pwd_datas);
|
||||
return $c->render('userpassword');
|
||||
}
|
||||
|
||||
} ## end if ($result)
|
||||
$c->pwdrst->{$name}{confirmed} = 9 if $trt eq 'RESET';
|
||||
record_password_change_attempt($c, 'SUCCESS');
|
||||
$result .= $c->l('pwd_PASSWORD_CHANGE_SUCCESS');
|
||||
$c->flash(success => $result);
|
||||
$c->redirect_to($c->home_page);
|
||||
}
|
||||
|
||||
} ## end sub change_password
|
||||
|
||||
sub reset_password {
|
||||
|
||||
my ($c, $trt, $user, $password, $oldpassword) = @_;
|
||||
my $ret;
|
||||
|
||||
return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/));
|
||||
$user = $1;
|
||||
|
||||
my $adb = esmith::AccountsDB->open();
|
||||
|
||||
my $acct = $adb->get($user);
|
||||
return $c->l('NO_SUCH_USER', $user) unless ($acct->prop('type') eq 'user');
|
||||
|
||||
$ret = esmith::util::setUserPasswordRequirePrevious($user, $oldpassword, $password) if $trt ne 'RESET';
|
||||
$ret = esmith::util::setUserPassword($user, $password) if $trt eq 'RESET';
|
||||
|
||||
return $c->l('pwd_ERROR_PASSWORD_CHANGE') . ' ' . $trt unless $ret;
|
||||
|
||||
$acct->set_prop("PasswordSet", "yes");
|
||||
undef $adb;
|
||||
|
||||
@@ -192,15 +175,11 @@ sub reset_password {
|
||||
return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
|
||||
}
|
||||
$adb = esmith::AccountsDB->open();
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub reset_password
|
||||
|
||||
sub record_password_change_attempt {
|
||||
|
||||
my ($c, $result) = @_;
|
||||
|
||||
my $user = $c->param('User');
|
||||
my $ip_address = $c->tx->remote_address;
|
||||
|
||||
@@ -209,49 +188,16 @@ sub record_password_change_attempt {
|
||||
} else {
|
||||
$c->app->log->info(join "\t", "Password change FAILED: $user", $ip_address);
|
||||
}
|
||||
}
|
||||
|
||||
} ## end sub record_password_change_attempt
|
||||
|
||||
sub check_password {
|
||||
my $c = shift;
|
||||
my $password = shift;
|
||||
|
||||
my $strength;
|
||||
my $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
|
||||
my $rec = $cdb->get('passwordstrength');
|
||||
$strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
|
||||
|
||||
return validate_password($c, $strength, $password);
|
||||
}
|
||||
|
||||
|
||||
sub validate_password {
|
||||
|
||||
my ($c, $strength, $pass) = @_;
|
||||
|
||||
use Crypt::Cracklib;
|
||||
|
||||
if ($strength eq "none") {
|
||||
return $c->l("Passwords must be at least 7 characters long") unless ( length( $pass ) > 6 );
|
||||
return "OK";
|
||||
}
|
||||
|
||||
my $reason = is_normal_password($c, $pass, undef);
|
||||
return $reason unless ($reason eq "OK");
|
||||
return "OK" unless ($strength eq "strong");
|
||||
|
||||
if ( -f '/usr/lib64/cracklib_dict.pwd' ) {
|
||||
$reason = fascist_check($pass, '/usr/lib64/cracklib_dict');
|
||||
} else {
|
||||
$reason = fascist_check($pass, '/usr/lib/cracklib_dict');
|
||||
}
|
||||
$reason ||= "Software error: password check failed";
|
||||
|
||||
return "OK" if ($reason eq "ok");
|
||||
|
||||
return $c->l("Bad Password Choice") . ": "
|
||||
. $c->l("The password you have chosen is not a good choice, because")
|
||||
. " " . $c->($reason) . ".";
|
||||
}
|
||||
|
||||
} ## end sub check_password
|
||||
|
||||
1;
|
||||
|
@@ -12,70 +12,54 @@ use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
#use esmith::FormMagick qw(gen_locale_date_string);
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use esmith::ConfigDB;
|
||||
use Time::TAI64;
|
||||
use File::Basename;
|
||||
use HTML::Entities;
|
||||
use esmith::FormMagick qw(gen_locale_date_string);
|
||||
use SrvMngr qw(gen_locale_date_string);
|
||||
use File::Temp qw(tempfile);
|
||||
|
||||
use constant TRUE => 1;
|
||||
use constant FALSE => 0;
|
||||
|
||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
|
||||
|
||||
our @logfiles = (); # with array
|
||||
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %log_datas = ();
|
||||
my $title = $c->l('log_FORM_TITLE');
|
||||
my $notif = '';
|
||||
|
||||
$log_datas{default_op} =
|
||||
($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
|
||||
|
||||
$log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
|
||||
$c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
|
||||
$c->render(template => 'viewlogfiles');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_action {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $title = $c->l('log_FORM_TITLE');
|
||||
my $notif = '';
|
||||
my $result = "";
|
||||
my %log_datas = ();
|
||||
|
||||
$log_datas{filename} = $c->param('Filename');
|
||||
$log_datas{matchpattern} = $c->param('Matchpattern');
|
||||
$log_datas{highlightpattern} = $c->param('Highlightpattern');
|
||||
$log_datas{operation} = $c->param('Operation');
|
||||
if ($log_datas{operation} eq 'download') {
|
||||
$log_datas{'trt'} = "DOWN"
|
||||
} else {
|
||||
$log_datas{'trt'} = "SHOW"
|
||||
}
|
||||
|
||||
if ($log_datas{operation} eq 'download') {
|
||||
$log_datas{'trt'} = "DOWN";
|
||||
} else {
|
||||
$log_datas{'trt'} = "SHOW";
|
||||
}
|
||||
|
||||
if ($log_datas{filename} =~ /^([\S\s]+)$/) {
|
||||
$log_datas{filename} = $1;
|
||||
} elsif ($log_datas{filename} =~ /^$/) {
|
||||
$log_datas{filename} = "messages";
|
||||
} else {
|
||||
$result .= $c->l("log_FILENAME_ERROR", $log_datas{filename} )
|
||||
. " ";
|
||||
$result .= $c->l("log_FILENAME_ERROR", $log_datas{filename}) . " ";
|
||||
}
|
||||
|
||||
if ($log_datas{matchpattern} =~ /^(\S+)$/) {
|
||||
@@ -89,8 +73,8 @@ sub do_action {
|
||||
} else {
|
||||
$log_datas{highlightpattern} = '';
|
||||
}
|
||||
|
||||
my $fullpath = "/var/log/$log_datas{filename}";
|
||||
|
||||
if (-z $fullpath) {
|
||||
$result .= $c->l("log_LOG_FILE_EMPTY", "$log_datas{filename}");
|
||||
}
|
||||
@@ -104,54 +88,46 @@ sub do_action {
|
||||
$c->stash(title => $title, modul => $result, log_datas => \%log_datas);
|
||||
return $c->render(template => 'viewlogfiles2');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($log_datas{trt} eq...)
|
||||
|
||||
if ($log_datas{trt} eq 'DOWN') {
|
||||
|
||||
my $modul = 'Log file download';
|
||||
|
||||
$notif = download_logFile($c, %log_datas);
|
||||
return undef unless defined $notif;
|
||||
}
|
||||
|
||||
} ## end if ($log_datas{trt} eq...)
|
||||
$c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
|
||||
$c->render(template => 'viewlogfiles');
|
||||
} ## end sub do_action
|
||||
|
||||
};
|
||||
|
||||
|
||||
sub timestamp2local
|
||||
{
|
||||
sub timestamp2local {
|
||||
$_ = shift;
|
||||
if (/^(\@[0-9a-f]{24})(.*)/s)
|
||||
{
|
||||
return Time::TAI64::tai64nlocal($1) . $2;
|
||||
}
|
||||
elsif (/^([0-9]{10}\.[0-9]{3})(.*)/s)
|
||||
{
|
||||
|
||||
#if (/^(\@[0-9a-f]{24})(.*)/s) {
|
||||
# return Time::TAI64::tai64nlocal($1) . $2;
|
||||
#} els
|
||||
if (/^([0-9]{10}\.[0-9]{3})(.*)/s) {
|
||||
return localtime($1) . $2;
|
||||
}
|
||||
return $_;
|
||||
}
|
||||
|
||||
} ## end sub timestamp2local
|
||||
|
||||
sub findlogFiles {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
use File::Find;
|
||||
sub findlogfiles
|
||||
{
|
||||
|
||||
sub findlogfiles {
|
||||
my $path = $File::Find::name;
|
||||
|
||||
if (-f)
|
||||
{
|
||||
if (-f) {
|
||||
|
||||
# Remove leading /var/log/messages
|
||||
$path =~ s:^/var/log/::;
|
||||
|
||||
# don't bother to collect files known to be non-text
|
||||
# or not log files
|
||||
foreach (qw(
|
||||
foreach (
|
||||
qw(
|
||||
journal
|
||||
lastlog
|
||||
btmp$
|
||||
wtmp
|
||||
@@ -161,120 +137,108 @@ sub findlogFiles {
|
||||
httpd/ssl_scache.pag
|
||||
httpd/ssl_scache.dir
|
||||
\/config$
|
||||
))
|
||||
)
|
||||
)
|
||||
{
|
||||
return if $path =~ /$_/;
|
||||
}
|
||||
|
||||
} ## end foreach (qw( lastlog btmp$ wtmp...))
|
||||
my ($file_base, $file_path, $file_type) = fileparse($path);
|
||||
|
||||
if ( $file_base =~ /@.*/ )
|
||||
{
|
||||
if ($file_base =~ /@.*/) {
|
||||
|
||||
#$logfiles{$path} = $file_path . timestamp2local($file_base);
|
||||
push @logfiles, [ $file_path . timestamp2local($file_base), $path ];
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
|
||||
#$logfiles{$path} = $path;
|
||||
push @logfiles, [ $path, $path ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if (-f)
|
||||
} ## end sub findlogfiles
|
||||
@logfiles = ();
|
||||
|
||||
# Now go and find all the files under /var/log
|
||||
find({ wanted => \&findlogfiles, no_chdir => 1 }, '/var/log');
|
||||
|
||||
my @logf = sort { $a->[0] cmp $b->[0] } @logfiles;
|
||||
|
||||
return \@logf;
|
||||
}
|
||||
|
||||
} ## end sub findlogFiles
|
||||
|
||||
sub showlogFile {
|
||||
|
||||
my ($c, %log_datas) = @_;
|
||||
|
||||
my $fullpath = "/var/log/$log_datas{filename}";
|
||||
my $out = '';
|
||||
|
||||
$out .= sprintf("$fullpath: \n");
|
||||
|
||||
$out .= sprintf($c->l("log_VIEWING_TIME", $c->gen_locale_date_string()));
|
||||
|
||||
unless ( $log_datas{matchpattern} eq '.' )
|
||||
{
|
||||
unless ($log_datas{matchpattern} eq '.') {
|
||||
|
||||
#$out .= sprintf("<p>\n");
|
||||
$out .= sprintf($c->l("log_MATCH_HEADER", $log_datas{matchpattern}));
|
||||
}
|
||||
} ## end unless ($log_datas{matchpattern...})
|
||||
|
||||
if ($log_datas{highlightpattern}) {
|
||||
|
||||
if ( $log_datas{highlightpattern} )
|
||||
{
|
||||
#$out .= sprintf("<p>\n");
|
||||
$out .= sprintf($c->l("log_HIGHLIGHT_HEADER", "$log_datas{highlightpattern}"));
|
||||
}
|
||||
} ## end if ($log_datas{highlightpattern...})
|
||||
|
||||
if ($log_datas{filename} =~ /\.gz$/) {
|
||||
my $pid = open(LOGFILE, "-|");
|
||||
die "Couldn't fork: $!" unless defined $pid;
|
||||
|
||||
unless ($pid) {
|
||||
|
||||
# Child
|
||||
exec("/bin/zcat", $fullpath)
|
||||
|| die "Can't exec zcat: $!";
|
||||
|
||||
# NOTREACHED
|
||||
}
|
||||
} ## end unless ($pid)
|
||||
} else {
|
||||
open(LOGFILE, "$fullpath");
|
||||
}
|
||||
|
||||
my $somethingMatched = 0;
|
||||
my $fileEmpty = 1;
|
||||
$out .= sprintf("<PRE>");
|
||||
while(<LOGFILE>)
|
||||
{
|
||||
|
||||
while (<LOGFILE>) {
|
||||
$fileEmpty = 0;
|
||||
next unless /$log_datas{matchpattern}/;
|
||||
$somethingMatched = 1;
|
||||
|
||||
$_ = timestamp2local($_);
|
||||
$_ = HTML::Entities::encode_entities($_);
|
||||
($log_datas{highlightpattern} && /$log_datas{highlightpattern}/)
|
||||
? $out .= sprintf("<b>$_</b>")
|
||||
: $out .= sprintf("$_");
|
||||
}
|
||||
} ## end while (<LOGFILE>)
|
||||
$out .= sprintf("</PRE>");
|
||||
|
||||
if ($fileEmpty) {
|
||||
$out .= sprintf("<p>\n");
|
||||
$out .= sprintf($c->l("log_LOG_FILE_EMPTY"));
|
||||
} else {
|
||||
unless ($somethingMatched)
|
||||
{
|
||||
|
||||
unless ($somethingMatched) {
|
||||
$out .= sprintf("<p>\n");
|
||||
$out .= sprintf($c->l("log_NO_MATCHING_LINES"));
|
||||
}
|
||||
}
|
||||
|
||||
} ## end else [ if ($fileEmpty) ]
|
||||
close LOGFILE;
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
} ## end sub showlogFile
|
||||
|
||||
sub download_logFile {
|
||||
|
||||
my ($c, %log_datas) = @_;
|
||||
|
||||
my $fullpath = "/var/log/$log_datas{filename}";
|
||||
|
||||
# Save this information for later.
|
||||
|
||||
$cdb->get('viewlogfiles')->merge_props('DefaultOperation', $log_datas{operation});
|
||||
|
||||
# If the client is on windows, we must handle this a little differently.
|
||||
my $win32 = FALSE;
|
||||
my $mac = FALSE;
|
||||
my $agent = $ENV{HTTP_USER_AGENT} || "";
|
||||
|
||||
if ($agent =~ /win32|windows/i) {
|
||||
$win32 = TRUE;
|
||||
} elsif ($agent =~ /mac/i) {
|
||||
@@ -284,18 +248,20 @@ sub download_logFile {
|
||||
# Check for errors first. Once we start sending the file it's too late to
|
||||
# report them.
|
||||
my $error = "";
|
||||
|
||||
unless (-f $fullpath) {
|
||||
$error = $c->l("log_ERR_NOEXIST_FILE") . $fullpath;
|
||||
}
|
||||
|
||||
local *FILE;
|
||||
open(FILE, "<$fullpath")
|
||||
or $error = $c->l("log_ERR_NOOPEN_FILE");
|
||||
|
||||
# Put other error checking here.
|
||||
return $error if $error;
|
||||
|
||||
# Fix the filename, as it might have a directory prefixed to it.
|
||||
my $filename = $log_datas{filename};
|
||||
|
||||
if ($filename =~ m#/#) {
|
||||
$filename = (split /\//, $filename)[-1];
|
||||
}
|
||||
@@ -310,16 +276,14 @@ sub download_logFile {
|
||||
# file inline like it's told. It ignores the Content-type, but it likes
|
||||
# the Content-disposition (an officially unsupported header) for some
|
||||
# reason. Yay Microsoft.
|
||||
|
||||
my $file2 = new File::Temp(UNLINK => 0);
|
||||
|
||||
while (my $line = <FILE>) {
|
||||
chomp $line;
|
||||
my $linew = timestamp2local($line) . $nl;
|
||||
print $file2 $linew;
|
||||
}
|
||||
} ## end while (my $line = <FILE>)
|
||||
close(FILE);
|
||||
|
||||
$c->render_file(
|
||||
'filepath' => "$file2",
|
||||
'filename' => "$filename",
|
||||
@@ -327,10 +291,6 @@ sub download_logFile {
|
||||
'content_disposition' => 'attachment',
|
||||
'cleanup' => 1,
|
||||
);
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
} ## end sub download_logFile
|
||||
1;
|
||||
|
||||
|
@@ -10,40 +10,29 @@ package SrvMngr::Controller::Workgroup;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
use esmith::FormMagick::Panel::workgroup;
|
||||
|
||||
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
|
||||
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %wkg_datas = ();
|
||||
my $title = $c->l('wkg_FORM_TITLE');
|
||||
my $modul = '';
|
||||
|
||||
$wkg_datas{'Workgroup'} = ($db->get_prop('smb', 'Workgroup')) || '';
|
||||
$wkg_datas{'ServerName'} = ($db->get_prop('smb', 'ServerName')) || '';
|
||||
$wkg_datas{'ServerRole'} = ($db->get_prop('smb', 'ServerRole')) || '';
|
||||
$wkg_datas{'RoamingProfiles'} = ($db->get_prop('smb', 'RoamingProfiles')) || '';
|
||||
|
||||
$c->stash(title => $title, modul => $modul, wkg_datas => \%wkg_datas);
|
||||
$c->render(template => 'workgroup');
|
||||
};
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_update {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $result = "";
|
||||
|
||||
my $workgroup = ($c->param('Workgroup') || 'no');
|
||||
my $servername = ($c->param('ServerName') || 'WS');
|
||||
my $roamingprofiles = ($c->param('RoamingProfiles') || 'no');
|
||||
@@ -52,7 +41,6 @@ sub do_update {
|
||||
# controls
|
||||
my $res = validate2_workgroup($c, $workgroup, $servername);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
$res = validate2_servername($c, $servername);
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
@@ -61,43 +49,31 @@ sub do_update {
|
||||
$db->get('smb')->set_prop('ServerRole', $serverrole);
|
||||
$db->get('smb')->set_prop('ServerName', $servername);
|
||||
$db->get('smb')->set_prop('RoamingProfiles', $roamingprofiles);
|
||||
}
|
||||
|
||||
} ## end if ($result eq '')
|
||||
system("/sbin/e-smith/signal-event", "workgroup-update") == 0
|
||||
or $result = $c->l('ERROR_UPDATING') . " system";
|
||||
|
||||
my $title = $c->l('wkg_FORM_TITLE');
|
||||
|
||||
if ($result eq '') { $result = $c->l('wkg_SUCCESS'); }
|
||||
|
||||
$c->stash(title => $title, modul => $result);
|
||||
$c->render(template => 'module');
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_update
|
||||
|
||||
sub validate2_servername {
|
||||
my $c = shift;
|
||||
my $servername = shift;
|
||||
|
||||
return ('OK') if ($servername =~ /^([a-zA-Z][\-\w]*)$/);
|
||||
|
||||
return $c->l('INVALID_SERVERNAME');
|
||||
}
|
||||
|
||||
} ## end sub validate2_servername
|
||||
|
||||
sub validate2_workgroup {
|
||||
my $c = shift;
|
||||
my $workgroup = lc(shift);
|
||||
my $servername = lc(shift);
|
||||
|
||||
# my $workgroup = $c->l(shift);
|
||||
# my $servername = $c->l(shift);
|
||||
|
||||
return $c->l('INVALID_WORKGROUP') unless ($workgroup =~ /^([a-zA-Z0-9][\-\w\.]*)$/);
|
||||
return $c->l('INVALID_WORKGROUP_MATCHES_SERVERNAME') if ($servername eq $workgroup);
|
||||
return ('OK');
|
||||
|
||||
}
|
||||
|
||||
|
||||
} ## end sub validate2_workgroup
|
||||
1;
|
||||
|
@@ -10,82 +10,65 @@ package SrvMngr::Controller::Yum;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
|
||||
use SrvMngr qw(theme_list init_session ip_number_or_blank);
|
||||
|
||||
use esmith::ConfigDB;
|
||||
|
||||
use esmith::util;
|
||||
use File::Basename;
|
||||
|
||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
|
||||
my $dnf_status_file = '/var/cache/dnf/dnf.status';
|
||||
|
||||
#use File::stat;
|
||||
|
||||
our %dbs;
|
||||
|
||||
for ( qw(available installed updates) )
|
||||
{
|
||||
$dbs{$_} = esmith::ConfigDB->open_ro("yum_$_") or
|
||||
die "Couldn't open yum_$_ DB\n";
|
||||
for (qw(available installed updates)) {
|
||||
$dbs{$_} = esmith::ConfigDB->open_ro("dnf_$_")
|
||||
or die "Couldn't open dnf_$_ DB\n";
|
||||
}
|
||||
|
||||
for ( qw(repositories) )
|
||||
{
|
||||
$dbs{$_} = esmith::ConfigDB->open("yum_$_") or
|
||||
die "Couldn't open yum_$_ DB\n";
|
||||
for (qw(repositories)) {
|
||||
$dbs{$_} = esmith::ConfigDB->open("yum_$_")
|
||||
or die "Couldn't open yum_$_ DB\n";
|
||||
}
|
||||
|
||||
|
||||
sub main {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my %yum_datas = ();
|
||||
my $title = $c->l('yum_FORM_TITLE');
|
||||
my $dest = 'yum';
|
||||
my $notif = '';
|
||||
|
||||
$yum_datas{'trt'} = 'STAT';
|
||||
|
||||
if ( -e "/var/run/yum.pid" ) {
|
||||
if ($c->is_dnf_running()) {
|
||||
$yum_datas{'trt'} = 'LOGF';
|
||||
$dest = 'yumlogfile';
|
||||
} elsif ($cdb->get_prop('yum', 'LogFile')) {
|
||||
} elsif ($cdb->get_prop('dnf', 'LogFile')) {
|
||||
$yum_datas{'trt'} = 'PSTU';
|
||||
$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
|
||||
$dest = 'yumpostupg';
|
||||
} else {
|
||||
|
||||
# normal other trt
|
||||
}
|
||||
|
||||
$c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas);
|
||||
return $c->render(template => $dest);
|
||||
|
||||
}
|
||||
|
||||
} ## end sub main
|
||||
|
||||
sub do_display {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = ($c->param('trt') || 'STAT');
|
||||
|
||||
my %yum_datas = ();
|
||||
my $title = $c->l('yum_FORM_TITLE');
|
||||
my ($notif, $dest) = '';
|
||||
|
||||
$yum_datas{'trt'} = $trt;
|
||||
|
||||
# force $trt if current logfile
|
||||
if ( -e "/var/run/yum.pid" ) {
|
||||
if ($c->is_dnf_running()) {
|
||||
$trt = 'LOGF';
|
||||
} elsif ($cdb->get_prop('yum', 'LogFile')) {
|
||||
} elsif ($cdb->get_prop('dnf', 'LogFile')) {
|
||||
$trt = 'PSTU';
|
||||
}
|
||||
|
||||
@@ -106,100 +89,92 @@ sub do_display {
|
||||
}
|
||||
|
||||
if ($trt eq 'LOGF') {
|
||||
if (-e "/var/run/yum.pid") {
|
||||
if ($c->is_dnf_running()) {
|
||||
$dest = 'yumlogfile';
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'LOGF')
|
||||
|
||||
if ($trt eq 'PSTU') {
|
||||
if ($cdb->get_prop('yum', 'LogFile')) {
|
||||
if ($cdb->get_prop('dnf', 'LogFile')) {
|
||||
$dest = 'yumpostupg';
|
||||
$yum_datas{'reconf'} = $cdb->get_value('UnsavedChanges', 'yes');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'PSTU')
|
||||
if (!$dest) { $dest = 'yum'; }
|
||||
|
||||
$c->stash(title => $title, notif => $notif, yum_datas => \%yum_datas);
|
||||
return $c->render(template => $dest);
|
||||
|
||||
};
|
||||
|
||||
} ## end sub do_display
|
||||
|
||||
sub do_update {
|
||||
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
|
||||
my $rt = $c->current_route;
|
||||
my $trt = $c->param('trt');
|
||||
|
||||
my %yum_datas = ();
|
||||
$yum_datas{trt} = $trt;
|
||||
|
||||
my $title = $c->l('yum_FORM_TITLE');
|
||||
|
||||
my ($dest, $res, $result) = '';
|
||||
|
||||
if ($trt eq 'UPDT') {
|
||||
|
||||
$dest = 'yumupdate';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->do_yum('update');
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
|
||||
#$result = $c->l('yum_SUCCESS');
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'UPDT')
|
||||
|
||||
if ($trt eq 'INST') {
|
||||
|
||||
$dest = 'yuminstall';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->do_yum('install');
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
|
||||
#$result = $c->l('yum_SUCCESS');
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'INST')
|
||||
|
||||
if ($trt eq 'REMO') {
|
||||
|
||||
$dest = 'yumremove';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->do_yum('remove');
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
|
||||
#$result = $c->l('yum_SUCCESS');
|
||||
}
|
||||
}
|
||||
}
|
||||
} ## end if (!$result)
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'REMO')
|
||||
|
||||
if ($trt eq 'CONF') {
|
||||
|
||||
$dest = 'yumconfig';
|
||||
|
||||
if (!$result) {
|
||||
$res = $c->change_settings();
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
$result = $c->l('yum_SUCCESS');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if (!$result)
|
||||
} ## end if ($trt eq 'CONF')
|
||||
|
||||
if ($trt eq 'PSTU') {
|
||||
|
||||
my $reconf = $c->param('reconf') || 'yes';
|
||||
$dest = 'yumpostupg';
|
||||
|
||||
@@ -207,6 +182,7 @@ sub do_update {
|
||||
if ($reconf eq 'yes') {
|
||||
$res = $c->post_upgrade_reboot();
|
||||
$result .= $res unless $res eq 'OK';
|
||||
|
||||
if (!$result) {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
$result = $c->l('yum_SYSTEM_BEING_RECONFIGURED');
|
||||
@@ -215,43 +191,56 @@ sub do_update {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
$result = $c->l('yum_UPDATE_SUCCESS');
|
||||
}
|
||||
}
|
||||
|
||||
} ## end if ($trt eq 'PSTU')
|
||||
|
||||
if ($trt eq 'LOGF') {
|
||||
|
||||
$dest = 'yumlogfile';
|
||||
if ( ! -e "/var/run/yum.pid") {
|
||||
|
||||
if (!$c->is_dnf_running()) {
|
||||
$yum_datas{trt} = 'SUC';
|
||||
$result = $c->l('yum_SUCCESS');
|
||||
}
|
||||
}
|
||||
} ## end if ($trt eq 'LOGF')
|
||||
|
||||
# do_yum ended (no message) --> forced to LOGFile
|
||||
if (!$result) {
|
||||
$dest = 'yumlogfile';
|
||||
$yum_datas{trt} = 'LOGF';
|
||||
}
|
||||
|
||||
|
||||
$c->stash(title => $title, notif => $result, yum_datas => \%yum_datas);
|
||||
|
||||
if ($yum_datas{trt} ne 'SUC') {
|
||||
return $c->render(template => $dest);
|
||||
}
|
||||
|
||||
my $message = "'Yum' $trt update DONE";
|
||||
$c->app->log->info($message);
|
||||
$c->flash(success => $result) if $result;
|
||||
|
||||
$c->redirect_to("/yum");
|
||||
} ## end sub do_update
|
||||
|
||||
};
|
||||
sub get_dnf_status {
|
||||
|
||||
#interrogate status file created and maintained by smeserver.py plugin for dnf.
|
||||
my ($c) = @_;
|
||||
my $file_name = $dnf_status_file;
|
||||
my $content = "resolved";
|
||||
|
||||
if (-e "$file_name") {
|
||||
open my $fh, '<', $file_name or die "Can't open file: $!";
|
||||
$content = <$fh>;
|
||||
close $fh;
|
||||
} ## end if (-e "$file_name")
|
||||
return $content;
|
||||
} ## end sub get_dnf_status
|
||||
|
||||
sub is_dnf_running {
|
||||
my ($c) = @_;
|
||||
my $dnf_status = $c->get_dnf_status();
|
||||
return $dnf_status ne "resolved" && $dnf_status ne "config" && $dnf_status ne "sack";
|
||||
} ## end sub is_dnf_running
|
||||
|
||||
sub is_empty {
|
||||
|
||||
my ($c, $yumdb) = @_;
|
||||
|
||||
my $groups = $dbs{$yumdb}->get_all_by_prop(type => 'group') || 'none';
|
||||
my $packages = $dbs{$yumdb}->get_all_by_prop(type => 'package') || 'none';
|
||||
|
||||
@@ -260,301 +249,208 @@ sub is_empty {
|
||||
|
||||
#else return here
|
||||
return;
|
||||
}
|
||||
|
||||
} ## end sub is_empty
|
||||
|
||||
sub non_empty {
|
||||
|
||||
my ($c, $yumdb, $type) = @_;
|
||||
|
||||
$type ||= 'both';
|
||||
|
||||
return 0 unless (exists $dbs{$yumdb});
|
||||
|
||||
my $groups = scalar $dbs{$yumdb}->get_all_by_prop(type => 'group');
|
||||
return $groups if ($type eq 'group');
|
||||
|
||||
my $packages = scalar $dbs{$yumdb}->get_all_by_prop(type => 'package');
|
||||
if ($type eq 'package')
|
||||
{
|
||||
|
||||
if ($type eq 'package') {
|
||||
return $c->package_functions_enabled ? $packages : 0;
|
||||
}
|
||||
|
||||
return ($c->package_functions_enabled or $yumdb eq 'updates') ?
|
||||
($groups || $packages) : $groups;
|
||||
}
|
||||
|
||||
return ($c->package_functions_enabled or $yumdb eq 'updates') ? ($groups || $packages) : $groups;
|
||||
} ## end sub non_empty
|
||||
|
||||
sub package_functions_enabled {
|
||||
|
||||
my ($c) = @_;
|
||||
|
||||
return ($cdb->get_prop("yum", "PackageFunctions") eq "enabled");
|
||||
|
||||
return ($cdb->get_prop("dnf", "PackageFunctions") eq "enabled");
|
||||
}
|
||||
|
||||
|
||||
sub get_status {
|
||||
|
||||
my ($c, $prop, $localise) = @_;
|
||||
|
||||
my $status = $cdb->get_prop("yum", $prop) || 'disabled';
|
||||
|
||||
my $status = $cdb->get_prop("dnf", $prop) || 'disabled';
|
||||
return $status unless $localise;
|
||||
|
||||
return $c->l($status eq 'enabled' ? 'ENABLED' : 'DISABLED');
|
||||
}
|
||||
|
||||
} ## end sub get_status
|
||||
|
||||
sub get_options {
|
||||
|
||||
my ($c, $yumdb, $type) = @_;
|
||||
|
||||
my %options;
|
||||
|
||||
for ($dbs{$yumdb}->get_all_by_prop(type => $type))
|
||||
{
|
||||
$options{$_->key} = $_->key . " " . $_->prop("Version") . " - " .
|
||||
$_->prop("Repo");
|
||||
for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
|
||||
$options{ $_->key } = $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo");
|
||||
}
|
||||
|
||||
return \%options;
|
||||
}
|
||||
|
||||
} ## end sub get_options
|
||||
|
||||
sub get_options2 {
|
||||
|
||||
my ($c, $yumdb, $type) = @_;
|
||||
|
||||
my @options;
|
||||
|
||||
for ($dbs{$yumdb}->get_all_by_prop(type => $type))
|
||||
{
|
||||
push @options, [ $_->key . " " . $_->prop("Version") . " - " .
|
||||
$_->prop("Repo") => $_->key ];
|
||||
for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
|
||||
push @options, [ $_->key . " " . $_->prop("Version") . " - " . $_->prop("Repo") => $_->key ];
|
||||
}
|
||||
|
||||
return \@options;
|
||||
}
|
||||
|
||||
} ## end sub get_options2
|
||||
|
||||
sub get_names {
|
||||
|
||||
return [ keys %{ get_options(@_) } ];
|
||||
}
|
||||
|
||||
|
||||
sub get_names2 {
|
||||
|
||||
my ($c, $yumdb, $type) = @_;
|
||||
my @selected;
|
||||
|
||||
for ($dbs{$yumdb}->get_all_by_prop(type => $type)) {
|
||||
push @selected, $_->key;
|
||||
}
|
||||
|
||||
return \@selected;
|
||||
# return [ values @{get_options2(@_)} ];
|
||||
}
|
||||
|
||||
# return [ values @{get_options2(@_)} ];
|
||||
} ## end sub get_names2
|
||||
|
||||
sub get_repository_options2 {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
my @options;
|
||||
|
||||
foreach my $repos (
|
||||
$dbs{repositories}->get_all_by_prop(type => "repository") )
|
||||
{
|
||||
foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
|
||||
next unless ($repos->prop('Visible') eq 'yes'
|
||||
or $repos->prop('status') eq 'enabled');
|
||||
|
||||
push @options, [ $repos->prop('Name') => $repos->key ];
|
||||
}
|
||||
|
||||
} ## end foreach my $repos ($dbs{repositories...})
|
||||
my @opts = sort { $a->[0] cmp $b->[0] } @options;
|
||||
|
||||
return \@opts;
|
||||
}
|
||||
} ## end sub get_repository_options2
|
||||
|
||||
|
||||
sub get_repository_current_options
|
||||
{
|
||||
sub get_repository_current_options {
|
||||
my $c = shift;
|
||||
|
||||
my @selected;
|
||||
|
||||
foreach my $repos (
|
||||
$dbs{repositories}->get_all_by_prop( type => "repository" ) )
|
||||
{
|
||||
foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
|
||||
next unless ($repos->prop('Visible') eq 'yes'
|
||||
or $repos->prop('status') eq 'enabled');
|
||||
|
||||
push @selected, $repos->key if ($repos->prop('status') eq 'enabled');
|
||||
}
|
||||
|
||||
} ## end foreach my $repos ($dbs{repositories...})
|
||||
return \@selected;
|
||||
}
|
||||
|
||||
} ## end sub get_repository_current_options
|
||||
|
||||
sub get_avail2 {
|
||||
|
||||
my ($c, $yumdb, $type) = @_;
|
||||
|
||||
return $c->get_options2("available", "package");
|
||||
}
|
||||
|
||||
|
||||
sub get_check_freq_opt {
|
||||
|
||||
my ($c) = @_;
|
||||
|
||||
return [[ $c->l('DISABLED') => 'disabled'],
|
||||
return [
|
||||
[ $c->l('DISABLED') => 'disabled' ],
|
||||
[ $c->l('yum_1DAILY') => 'daily' ],
|
||||
[ $c->l('yum_2WEEKLY') => 'weekly' ],
|
||||
[ $c->l('yum_3MONTHLY') => 'monthly']];
|
||||
}
|
||||
|
||||
[ $c->l('yum_3MONTHLY') => 'monthly' ]
|
||||
];
|
||||
} ## end sub get_check_freq_opt
|
||||
|
||||
sub print_skip_header {
|
||||
|
||||
my ($c) = shift;
|
||||
|
||||
return "<INPUT TYPE=\"hidden\" NAME=\"skip_header\" VALUE=\"1\">\n";
|
||||
}
|
||||
|
||||
|
||||
sub change_settings {
|
||||
|
||||
my ($c) = @_;
|
||||
|
||||
for my $param ( qw(
|
||||
for my $param (
|
||||
qw(
|
||||
PackageFunctions
|
||||
) )
|
||||
)
|
||||
)
|
||||
{
|
||||
$cdb->set_prop('yum', $param, $c->param("yum_$param"));
|
||||
}
|
||||
|
||||
$cdb->set_prop("dnf", $param, $c->param("yum_$param"));
|
||||
} ## end for my $param (qw( PackageFunctions...))
|
||||
my $check4updates = $c->param("yum_check4updates");
|
||||
my $status = 'disabled';
|
||||
|
||||
if ($check4updates ne 'disabled') { $status = 'enabled'; }
|
||||
|
||||
$cdb->set_prop('yum', 'check4updates', $check4updates);
|
||||
|
||||
$cdb->set_prop("dnf", 'check4updates', $check4updates);
|
||||
my $deltarpm = $c->param("yum_DeltaRpmProcess");
|
||||
$cdb->set_prop('yum', 'DeltaRpmProcess', $deltarpm);
|
||||
|
||||
$cdb->set_prop("dnf", 'DeltaRpmProcess', $deltarpm);
|
||||
my $downloadonly = $c->param("yum_DownloadOnly");
|
||||
if ($downloadonly ne 'disabled') { $status = 'enabled'; }
|
||||
|
||||
$cdb->set_prop('yum', 'DownloadOnly', $downloadonly);
|
||||
|
||||
$cdb->set_prop("dnf", 'DownloadOnly', $downloadonly);
|
||||
my $AutoInstallUpdates = $c->param("yum_AutoInstallUpdates");
|
||||
if ($AutoInstallUpdates ne 'disabled') { $status = 'enabled'; }
|
||||
|
||||
$cdb->set_prop('yum', 'AutoInstallUpdates', $AutoInstallUpdates);
|
||||
$cdb->set_prop('yum', 'status', $status);
|
||||
|
||||
$cdb->set_prop("dnf", 'AutoInstallUpdates', $AutoInstallUpdates);
|
||||
$cdb->set_prop("dnf", 'status', $status);
|
||||
my %selected = map { $_ => 1 } @{ $c->every_param('SelectedRepositories') };
|
||||
|
||||
foreach my $repos (
|
||||
$dbs{repositories}->get_all_by_prop(type => "repository") )
|
||||
{
|
||||
$repos->set_prop("status",
|
||||
exists $selected{$repos->key} ? 'enabled' : 'disabled');
|
||||
|
||||
foreach my $repos ($dbs{repositories}->get_all_by_prop(type => "repository")) {
|
||||
$repos->set_prop("status", exists $selected{ $repos->key } ? 'enabled' : 'disabled');
|
||||
}
|
||||
|
||||
$dbs{repositories}->reload;
|
||||
|
||||
unless ( system( "/sbin/e-smith/signal-event", "yum-modify" ) == 0 )
|
||||
{
|
||||
unless (system("/sbin/e-smith/signal-event", "dnf-modify") == 0) {
|
||||
return $c->l('yum_ERROR_UPDATING_CONFIGURATION');
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub change_settings
|
||||
|
||||
sub do_yum {
|
||||
|
||||
my ($c, $function) = @_;
|
||||
|
||||
for ( qw(SelectedGroups SelectedPackages) )
|
||||
{
|
||||
$cdb->set_prop("yum", $_, join(',', (@{$c->every_param($_)} )));
|
||||
for (qw(SelectedGroups SelectedPackages)) {
|
||||
$cdb->set_prop("dnf", $_, join(',', (@{ $c->every_param($_) })));
|
||||
}
|
||||
|
||||
esmith::util::backgroundCommand(0,
|
||||
"/sbin/e-smith/signal-event", "yum-$function");
|
||||
esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "dnf-$function");
|
||||
|
||||
for (qw(available installed updates)) {
|
||||
$dbs{$_}->reload;
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
} ## end sub do_yum
|
||||
|
||||
sub get_yum_status_page {
|
||||
|
||||
my ($c) = @_;
|
||||
my $yum_status;
|
||||
|
||||
open(YUM_STATUS, "</var/run/yum.status");
|
||||
$yum_status = <YUM_STATUS>;
|
||||
close(YUM_STATUS);
|
||||
|
||||
return $yum_status;
|
||||
}
|
||||
|
||||
} ## end sub get_yum_status_page
|
||||
|
||||
sub format_yum_log {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
$cdb->reload;
|
||||
|
||||
my $filepage = $cdb->get_prop('yum', 'LogFile');
|
||||
my $filepage = $cdb->get_prop('dnf', 'LogFile');
|
||||
return '' unless $filepage and (-e "$filepage");
|
||||
|
||||
my $out = sprintf "<PRE>";
|
||||
open(FILE, "$filepage");
|
||||
|
||||
while (<FILE>) {
|
||||
$out .= sprintf("%s", $_);
|
||||
}
|
||||
close FILE;
|
||||
$out .= sprintf "</PRE>";
|
||||
|
||||
undef $filepage;
|
||||
return $out;
|
||||
}
|
||||
|
||||
} ## end sub format_yum_log
|
||||
|
||||
sub post_upgrade_reboot {
|
||||
|
||||
my $c = shift;
|
||||
|
||||
$cdb->get_prop_and_delete('yum', 'LogFile');
|
||||
$cdb->get_prop_and_delete('dnf', 'LogFile');
|
||||
$cdb->reload;
|
||||
|
||||
if (fork == 0) {
|
||||
exec "/sbin/e-smith/signal-event post-upgrade; /sbin/e-smith/signal-event reboot";
|
||||
die "Exec failed";
|
||||
}
|
||||
|
||||
return 'OK'
|
||||
}
|
||||
|
||||
return 'OK';
|
||||
} ## end sub post_upgrade_reboot
|
||||
|
||||
sub show_yum_log {
|
||||
my $c = shift;
|
||||
my $out = $c->format_yum_log();
|
||||
my $yum_log = $cdb->get_prop_and_delete('yum', 'LogFile');
|
||||
my $yum_log = $cdb->get_prop_and_delete('dnf', 'LogFile');
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
} ## end sub show_yum_log
|
||||
1;
|
||||
|
@@ -1,3 +1,4 @@
|
||||
'bac_No suitable local devices found' => 'No suitable local devices found',
|
||||
'bac_BACKUP_TITLE' => 'Backup or restore server data',
|
||||
'bac_BACKUP_DESC' => '<P>The server provides two ways to back up and restore
|
||||
your server: using your local desktop or a tape drive.</P>
|
||||
|
@@ -26,7 +26,9 @@ experienced administrators
|
||||
for remote problem diagnosis and resolution.
|
||||
We recommend leaving this
|
||||
parameter set to "No Access"
|
||||
unless you have a specific reason to do otherwise.',
|
||||
unless you have a specific reason to do otherwise.
|
||||
Note that an "Autoblock" feature is enabled by default when public access is enabled; to disable or tune this feature, refer to the manual at https://wiki.koozali.org/AutoBlock
|
||||
',
|
||||
'rma_TITLE_FTP_ACCESS' => 'FTP Settings',
|
||||
'rma_DESC_FTP_ACCESS' => 'You can also control <b>FTP</b> access to your server. We
|
||||
recommend leaving this parameter set to \'no access\' unless you
|
||||
|
@@ -43,8 +43,9 @@ sub init_data {
|
||||
sub reconf_needed {
|
||||
|
||||
my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB");
|
||||
my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
|
||||
($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
|
||||
#my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
|
||||
# ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
|
||||
my $unsafe = ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
|
||||
return $unsafe;
|
||||
}
|
||||
|
||||
@@ -105,4 +106,3 @@ sub check_adminalias {
|
||||
|
||||
|
||||
1;
|
||||
|
||||
|
73
root/usr/share/smanager/lib/SrvMngr/Plugin/Cache.pm
Normal file
73
root/usr/share/smanager/lib/SrvMngr/Plugin/Cache.pm
Normal file
@@ -0,0 +1,73 @@
|
||||
package SrvMngr::Plugin::Cache;
|
||||
use Mojo::Base -base;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Mojolicious::Plugin::Renderer::WithoutCache::Cache - Mojo::Cache that doesn't cache
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
Version 0.04
|
||||
|
||||
=cut
|
||||
|
||||
our $VERSION = '0.04';
|
||||
$VERSION = eval $VERSION;
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
You probably don't want to use this directly.
|
||||
|
||||
my $cache = Mojolicious::Plugin::Renderer::WithoutCache::Cache->new;
|
||||
# this cache does nothing
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
A cache object that's compatible to Mojo::Cache but does nothing. It does
|
||||
not save or return any values. It's always empty.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 get
|
||||
|
||||
Does nothing. Returns C<undef>.
|
||||
|
||||
=cut
|
||||
|
||||
sub get {}
|
||||
|
||||
=head2 set
|
||||
|
||||
Does nothing. Returns C<$self> so chaining is possible.
|
||||
|
||||
=cut
|
||||
|
||||
sub set { shift; }
|
||||
|
||||
=head2 max_keys
|
||||
|
||||
Always returns zero. Can't be set. We don't want any keys.
|
||||
|
||||
=cut
|
||||
|
||||
sub max_keys { 0 }
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
simbabque, C<< <simbabque at cpan.org> >>
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
Please report any bugs or feature requests through an issue
|
||||
on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) simbabque.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the same terms as Perl itself.
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
94
root/usr/share/smanager/lib/SrvMngr/Plugin/WithoutCache.pm
Normal file
94
root/usr/share/smanager/lib/SrvMngr/Plugin/WithoutCache.pm
Normal file
@@ -0,0 +1,94 @@
|
||||
package SrvMngr::Plugin::WithoutCache;
|
||||
use Mojo::Base 'Mojolicious::Plugin';
|
||||
use SrvMngr::Plugin::Cache;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Mojolicious::Plugin::Renderer::WithoutCache - Disable the template cache in your Mojo app
|
||||
|
||||
=begin html
|
||||
|
||||
<p>
|
||||
<a href="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache"><img src="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache.svg?branch=master"></a>
|
||||
<a href='https://coveralls.io/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache?branch=master'><img src='https://coveralls.io/repos/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/badge.svg?branch=master' alt='Coverage Status' /></a>
|
||||
</p>
|
||||
|
||||
=end html
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
Version 0.04
|
||||
|
||||
=cut
|
||||
|
||||
our $VERSION = '0.04';
|
||||
$VERSION = eval $VERSION;
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
This plugin turns off the renderer's cache in L<Mojolicious> and L<Mojo::Lite> applications.
|
||||
|
||||
use Mojolicious::Lite;
|
||||
plugin 'Renderer::WithoutCache';
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This does what it says on the box. It turns off caching for the L<Mojolicious::Renderer>
|
||||
or any other renderer that's inside C<$app-E<gt>renderer> by injecting a cache object that
|
||||
does not do anything. This is superior to setting the C<max_keys> of L<Mojo::Cache>
|
||||
to C<0> if you plan to do a lot of uncached requests, because L<Mojolicious::Renderer>
|
||||
will still try to cache, and every time L<Mojo::Cache> sets a value in the cache it
|
||||
looks at the C<max_keys>, and then stops.
|
||||
|
||||
Doing nothing at all is cheaper. But not a lot really.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 register
|
||||
|
||||
Register the plugin in a L<Mojolicious> application.
|
||||
|
||||
$plugin->register(Mojolicious->new);
|
||||
|
||||
=cut
|
||||
|
||||
sub register {
|
||||
my ( $self, $app ) = @_;
|
||||
$app->renderer->cache( SrvMngr::Plugin::Cache->new );
|
||||
}
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
simbabque, C<< <simbabque at cpan.org> >>
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
Please report any bugs or feature requests through an issue
|
||||
on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>.
|
||||
|
||||
=head1 SUPPORT
|
||||
|
||||
You can find documentation for this module with the perldoc command.
|
||||
|
||||
perldoc Mojolicious::Plugin::Renderer::WithoutCache
|
||||
|
||||
=head2 Why would I want to turn off the cache?
|
||||
|
||||
I don't know.
|
||||
|
||||
=head1 ACKNOWLEDGEMENTS
|
||||
|
||||
This plugin was inspired by Tom Hunt asking about turning the cache off
|
||||
on L<Stack Overflow|http://stackoverflow.com/q/41750243/1331451>.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) simbabque.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the same terms as Perl itself.
|
||||
|
||||
=cut
|
||||
|
||||
1;
|
||||
|
@@ -9,7 +9,7 @@ use esmith::util;
|
||||
BEGIN
|
||||
{
|
||||
$0 =~ /^(.+)$/ms; $0 = $1; # Untaint script name
|
||||
$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
|
||||
$ENV{'PATH'} = '/usr/sbin:/usr/bin:/usr/local/bin';
|
||||
$ENV{'SHELL'} = '/bin/bash';
|
||||
$ENV{'HOME'} = '/usr/share/smanager';
|
||||
delete $ENV{'ENV'};
|
||||
|
@@ -0,0 +1,38 @@
|
||||
Configuration report created {$report_creation_time}
|
||||
|
||||
==================
|
||||
Base configuration
|
||||
==================
|
||||
SME server version: {$releaseversion}
|
||||
SME server mode: {$systemmode}
|
||||
SME server previous mode: {$previoussystemmode }
|
||||
Running Kernel: {$curkernel}
|
||||
===========================
|
||||
New RPMs not in base system
|
||||
===========================
|
||||
{ foreach $i (@newrpms) {
|
||||
$OUT .= "$i";
|
||||
}
|
||||
}
|
||||
===========================
|
||||
Custom and modified templates
|
||||
===========================
|
||||
{ foreach $i (@templates) {
|
||||
$OUT .= "$i";
|
||||
}
|
||||
}
|
||||
===========================
|
||||
Modified events
|
||||
===========================
|
||||
{ foreach $i (@events) {
|
||||
$OUT .= "$i";
|
||||
}
|
||||
}
|
||||
=======================
|
||||
Additional repositories
|
||||
=======================
|
||||
{ foreach $r (@repositories) {
|
||||
$OUT .= "$r";
|
||||
}
|
||||
}
|
||||
DONE!
|
1
root/usr/share/smanager/themes/default/public/css/flag-icon.min.css
vendored
Normal file
1
root/usr/share/smanager/themes/default/public/css/flag-icon.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,17 @@
|
||||
/* css/sme-password.css */
|
||||
.input-container {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
.sme-password {
|
||||
padding-right: 5px; /* Ensure space for the toggle icon */
|
||||
}
|
||||
.toggle-password {
|
||||
position: absolute;
|
||||
right: 4px; /* Position it towards the right */
|
||||
top: 50%; /* Center vertically */
|
||||
transform: translateY(-50%); /* Adjust for exact centering */
|
||||
cursor: pointer;
|
||||
width: 20px; /* Set the width of the icon */
|
||||
height: 20px; /* Set the height of the icon */
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
BIN
root/usr/share/smanager/themes/default/public/images/visible.png
Normal file
BIN
root/usr/share/smanager/themes/default/public/images/visible.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,298 @@
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const flagContainer = document.getElementById('flag-container');
|
||||
// Mapping of language codes to country codes and their names
|
||||
const languageToCountryMap = {
|
||||
"af": { code: "NA", name: "Namibia" },
|
||||
"agq": { code: "CM", name: "Cameroon" },
|
||||
"ak": { code: "GH", name: "Ghana" },
|
||||
"am": { code: "ET", name: "Ethiopia" },
|
||||
"ar": { code: "SA", name: "Saudi Arabia" },
|
||||
"as": { code: "IN", name: "India" },
|
||||
"asa": { code: "TZ", name: "Tanzania" },
|
||||
"ast": { code: "ES", name: "Spain" },
|
||||
"az": { code: "AZ", name: "Azerbaijan" },
|
||||
"bas": { code: "CM", name: "Cameroon" },
|
||||
"be": { code: "BY", name: "Belarus" },
|
||||
"bem": { code: "ZM", name: "Zambia" },
|
||||
"bez": { code: "TZ", name: "Tanzania" },
|
||||
"bg": { code: "BG", name: "Bulgaria" },
|
||||
"bm": { code: "ML", name: "Mali" },
|
||||
"bn": { code: "BD", name: "Bangladesh" },
|
||||
"bo": { code: "CN", name: "China" },
|
||||
"br": { code: "FR", name: "France" },
|
||||
"brx": { code: "IN", name: "India" },
|
||||
"bs": { code: "BA", name: "Bosnia and Herzegovina" },
|
||||
"ca": { code: "AD", name: "Andorra" },
|
||||
"ccp": { code: "BD", name: "Bangladesh" },
|
||||
"ce": { code: "RU", name: "Russia" },
|
||||
"cgg": { code: "UG", name: "Uganda" },
|
||||
"chr": { code: "US", name: "United States" },
|
||||
"ckb": { code: "IQ", name: "Iraq" },
|
||||
"cs": { code: "CZ", name: "Czech Republic" },
|
||||
"cy": { code: "GB", name: "United Kingdom" },
|
||||
"da": { code: "DK", name: "Denmark" },
|
||||
"dav": { code: "KE", name: "Kenya" },
|
||||
"de": { code: "DE", name: "Germany" },
|
||||
"dje": { code: "NE", name: "Niger" },
|
||||
"dsb": { code: "DE", name: "Germany" },
|
||||
"dua": { code: "CM", name: "Cameroon" },
|
||||
"dyo": { code: "SN", name: "Senegal" },
|
||||
"dz": { code: "BT", name: "Bhutan" },
|
||||
"ebu": { code: "KE", name: "Kenya" },
|
||||
"ee": { code: "GH", name: "Ghana" },
|
||||
"el": { code: "CY", name: "Cyprus" },
|
||||
"en": { code: "US", name: "United States" }, // Assume US for English if unspecified
|
||||
"es": { code: "ES", name: "Spain" },
|
||||
"et": { code: "EE", name: "Estonia" },
|
||||
"eu": { code: "ES", name: "Spain" },
|
||||
"ewo": { code: "CM", name: "Cameroon" },
|
||||
"fa": { code: "AF", name: "Afghanistan" },
|
||||
"ff": { code: "CM", name: "Cameroon" },
|
||||
"fi": { code: "FI", name: "Finland" },
|
||||
"fil": { code: "PH", name: "Philippines" },
|
||||
"fo": { code: "FO", name: "Faroe Islands" },
|
||||
"fr": { code: "FR", name: "France" },
|
||||
"fur": { code: "IT", name: "Italy" },
|
||||
"fy": { code: "NL", name: "Netherlands" },
|
||||
"ga": { code: "IE", name: "Ireland" },
|
||||
"gd": { code: "GB", name: "United Kingdom" },
|
||||
"gl": { code: "ES", name: "Spain" },
|
||||
"gsw": { code: "CH", name: "Switzerland" },
|
||||
"gu": { code: "IN", name: "India" },
|
||||
"guz": { code: "KE", name: "Kenya" },
|
||||
"gv": { code: "IM", name: "Isle of Man" },
|
||||
"ha": { code: "GH", name: "Ghana" },
|
||||
"haw": { code: "US", name: "United States" },
|
||||
"he": { code: "IL", name: "Israel" },
|
||||
"hi": { code: "IN", name: "India" },
|
||||
"hr": { code: "HR", name: "Croatia" },
|
||||
"hsb": { code: "DE", name: "Germany" },
|
||||
"hu": { code: "HU", name: "Hungary" },
|
||||
"hy": { code: "AM", name: "Armenia" },
|
||||
"id": { code: "ID", name: "Indonesia" },
|
||||
"ig": { code: "NG", name: "Nigeria" },
|
||||
"ii": { code: "CN", name: "China" },
|
||||
"is": { code: "IS", name: "Iceland" },
|
||||
"it": { code: "IT", name: "Italy" },
|
||||
"ja": { code: "JP", name: "Japan" },
|
||||
"jgo": { code: "CM", name: "Cameroon" },
|
||||
"jmc": { code: "TZ", name: "Tanzania" },
|
||||
"ka": { code: "GE", name: "Georgia" },
|
||||
"kab": { code: "DZ", name: "Algeria" },
|
||||
"kam": { code: "KE", name: "Kenya" },
|
||||
"kde": { code: "TZ", name: "Tanzania" },
|
||||
"kea": { code: "CV", name: "Cabo Verde" },
|
||||
"khq": { code: "ML", name: "Mali" },
|
||||
"ki": { code: "KE", name: "Kenya" },
|
||||
"kk": { code: "KZ", name: "Kazakhstan" },
|
||||
"kkj": { code: "CM", name: "Cameroon" },
|
||||
"kl": { code: "GL", name: "Greenland" },
|
||||
"kln": { code: "KE", name: "Kenya" },
|
||||
"km": { code: "KH", name: "Cambodia" },
|
||||
"kn": { code: "IN", name: "India" },
|
||||
"ko": { code: "KP", name: "North Korea" },
|
||||
"kok": { code: "IN", name: "India" },
|
||||
"ks": { code: "IN", name: "India" },
|
||||
"ksb": { code: "TZ", name: "Tanzania" },
|
||||
"ksf": { code: "CM", name: "Cameroon" },
|
||||
"ksh": { code: "DE", name: "Germany" },
|
||||
"kw": { code: "GB", name: "United Kingdom" },
|
||||
"ky": { code: "KG", name: "Kyrgyzstan" },
|
||||
"lag": { code: "TZ", name: "Tanzania" },
|
||||
"lb": { code: "LU", name: "Luxembourg" },
|
||||
"lg": { code: "UG", name: "Uganda" },
|
||||
"lkt": { code: "US", name: "United States" },
|
||||
"ln": { code: "AO", name: "Angola" },
|
||||
"lo": { code: "LA", name: "Laos" },
|
||||
"lrc": { code: "IQ", name: "Iraq" },
|
||||
"lt": { code: "LT", name: "Lithuania" },
|
||||
"lu": { code: "CD", name: "Democratic Republic of the Congo" },
|
||||
"luo": { code: "KE", name: "Kenya" },
|
||||
"Luo": { code: "KE", name: "Kenya" },
|
||||
"luy": { code: "KE", name: "Kenya" },
|
||||
"lv": { code: "LV", name: "Latvia" },
|
||||
"mas": { code: "KE", name: "Kenya" },
|
||||
"mer": { code: "KE", name: "Kenya" },
|
||||
"mfe": { code: "MU", name: "Mauritius" },
|
||||
"mg": { code: "MG", name: "Madagascar" },
|
||||
"mgh": { code: "MZ", name: "Mozambique" },
|
||||
"mgo": { code: "CM", name: "Cameroon" },
|
||||
"mk": { code: "MK", name: "North Macedonia" },
|
||||
"ml": { code: "IN", name: "India" },
|
||||
"mn": { code: "MN", name: "Mongolia" },
|
||||
"mr": { code: "IN", name: "India" },
|
||||
"ms": { code: "BN", name: "Brunei" },
|
||||
"mt": { code: "MT", name: "Malta" },
|
||||
"mua": { code: "CM", name: "Cameroon" },
|
||||
"my": { code: "MM", name: "Myanmar" },
|
||||
"mzn": { code: "IR", name: "Iran" },
|
||||
"naq": { code: "NA", name: "Namibia" },
|
||||
"nb": { code: "NO", name: "Norway" },
|
||||
"nd": { code: "ZW", name: "Zimbabwe" },
|
||||
"nds": { code: "DE", name: "Germany" },
|
||||
"ne": { code: "IN", name: "India" },
|
||||
"nl": { code: "NL", name: "Netherlands" },
|
||||
"nmg": { code: "CM", name: "Cameroon" },
|
||||
"nn": { code: "NO", name: "Norway" },
|
||||
"nnh": { code: "CM", name: "Cameroon" },
|
||||
"nus": { code: "SS", name: "South Sudan" },
|
||||
"nyn": { code: "UG", name: "Uganda" },
|
||||
"om": { code: "ET", name: "Ethiopia" },
|
||||
"or": { code: "IN", name: "India" },
|
||||
"os": { code: "GE", name: "Georgia" },
|
||||
"pa": { code: "PK", name: "Pakistan" },
|
||||
"pl": { code: "PL", name: "Poland" },
|
||||
"ps": { code: "AF", name: "Afghanistan" },
|
||||
"pt": { code: "PT", name: "Portugal" },
|
||||
"qu": { code: "BO", name: "Bolivia" },
|
||||
"rm": { code: "CH", name: "Switzerland" },
|
||||
"rn": { code: "BI", name: "Burundi" },
|
||||
"ro": { code: "RO", name: "Romania" },
|
||||
"rof": { code: "TZ", name: "Tanzania" },
|
||||
"ru": { code: "RU", name: "Russia" },
|
||||
"rw": { code: "RW", name: "Rwanda" },
|
||||
"rwk": { code: "TZ", name: "Tanzania" },
|
||||
"sah": { code: "RU", name: "Russia" },
|
||||
"saq": { code: "KE", name: "Kenya" },
|
||||
"sbp": { code: "TZ", name: "Tanzania" },
|
||||
"se": { code: "SE", name: "Sweden" },
|
||||
"seh": { code: "MZ", name: "Mozambique" },
|
||||
"ses": { code: "ML", name: "Mali" },
|
||||
"sg": { code: "CF", name: "Central African Republic" },
|
||||
"shi": { code: "TN", name: "Tunisia" },
|
||||
"si": { code: "LK", name: "Sri Lanka" },
|
||||
"sk": { code: "SK", name: "Slovakia" },
|
||||
"sl": { code: "SI", name: "Slovenia" },
|
||||
"smn": { code: "FI", name: "Finland" },
|
||||
"sn": { code: "ZW", name: "Zimbabwe" },
|
||||
"so": { code: "SO", name: "Somalia" },
|
||||
"sq": { code: "AL", name: "Albania" },
|
||||
"sr": { code: "RS", name: "Serbia" },
|
||||
"sv": { code: "SE", name: "Sweden" },
|
||||
"sw": { code: "CD", name: "Democratic Republic of the Congo" },
|
||||
"ta": { code: "IN", name: "India" },
|
||||
"te": { code: "IN", name: "India" },
|
||||
"teo": { code: "KE", name: "Kenya" },
|
||||
"tg": { code: "TJ", name: "Tajikistan" },
|
||||
"th": { code: "TH", name: "Thailand" },
|
||||
"ti": { code: "ER", name: "Eritrea" },
|
||||
"to": { code: "TO", name: "Tonga" },
|
||||
"tr": { code: "TR", name: "Turkey" },
|
||||
"tt": { code: "RU", name: "Russia" },
|
||||
"twq": { code: "NE", name: "Niger" },
|
||||
"tzm": { code: "MA", name: "Morocco" },
|
||||
"ug": { code: "CN", name: "China" },
|
||||
"uk": { code: "UA", name: "Ukraine" },
|
||||
"ur": { code: "IN", name: "India" },
|
||||
"uz": { code: "UZ", name: "Uzbekistan" },
|
||||
"vai": { code: "TN", name: "Tunisia" },
|
||||
"Vai": { code: "TN", name: "Tunisia" },
|
||||
"vi": { code: "VN", name: "Vietnam" },
|
||||
"vun": { code: "TZ", name: "Tanzania" },
|
||||
"wae": { code: "CH", name: "Switzerland" },
|
||||
"wo": { code: "SN", name: "Senegal" },
|
||||
"xog": { code: "UG", name: "Uganda" },
|
||||
"yav": { code: "CM", name: "Cameroon" },
|
||||
"yi": { code: "01", name: "Unknown" }, // Placeholder for unspecified region
|
||||
"yo": { code: "BJ", name: "Benin" },
|
||||
"yue": { code: "CN", name: "China" },
|
||||
"zgh": { code: "MA", name: "Morocco" },
|
||||
"zh": { code: "CN", name: "China" },
|
||||
"zu": { code: "ZA", name: "South Africa" },
|
||||
};
|
||||
|
||||
|
||||
//async function getCountryName(countryCode) {
|
||||
//try {
|
||||
//const response = await fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`);
|
||||
//if (!response.ok) throw new Error('Country not found');
|
||||
//const data = await response.json();
|
||||
//// Return the name in the native language
|
||||
//return data[0].name.common;
|
||||
//} catch (error) {
|
||||
//console.error(error);
|
||||
//return 'Unknown Country';
|
||||
//}
|
||||
//}
|
||||
|
||||
function getCountryNameFromLanguage(language) {
|
||||
return languageToCountryMap[language] ? languageToCountryMap[language].name : null;
|
||||
}
|
||||
|
||||
function getCountryCodeFromLanguage(language) {
|
||||
return languageToCountryMap[language] ? languageToCountryMap[language].code : null;
|
||||
}
|
||||
|
||||
function getCountryNameFromCountryCode(countryCode) {
|
||||
//alert(`Country code: ${countryCode}`);
|
||||
for (const language in languageToCountryMap) {
|
||||
if (languageToCountryMap.hasOwnProperty(language)) {
|
||||
if (languageToCountryMap[language].code === countryCode) {
|
||||
return languageToCountryMap[language].name;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null; // Return null if country code not found
|
||||
}
|
||||
|
||||
function getFlagEmoji(locale) {
|
||||
// Split the locale to get the language and country code
|
||||
const parts = locale.split('-');
|
||||
let countryCode;
|
||||
|
||||
// Handle single subtag (language only) or double subtag (language-country)
|
||||
if (parts.length === 1) {
|
||||
countryCode = getCountryCodeFromLanguage(parts[0]);
|
||||
} else if (parts.length === 2) {
|
||||
countryCode = parts[1].toLowerCase(); // Use the country code
|
||||
}
|
||||
|
||||
// If country code is not found, set a fallback output
|
||||
if (!countryCode) {
|
||||
const fallback = `? ${locale.toUpperCase()}`; // Just a question mark and the full locale
|
||||
return { flag: fallback, isUnknown: true, countryName: 'Unknown Country' };
|
||||
}
|
||||
|
||||
// Convert the country code to a flag emoji
|
||||
return {
|
||||
flag: String.fromCodePoint(...[...countryCode.toUpperCase()].map(char => 0x1F1E6 + char.charCodeAt(0) - 'A'.charCodeAt(0))),
|
||||
isUnknown: false,
|
||||
countryCode: countryCode
|
||||
};
|
||||
}
|
||||
|
||||
function displayLocaleAndFlag() {
|
||||
// Get the browser locale
|
||||
const userLocale = navigator.language || navigator.userLanguage;
|
||||
//alert(`User Locale: ${userLocale}`); // Alert the detected locale
|
||||
|
||||
const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
|
||||
|
||||
//alert(`Country Code: ${countryCode}, Is Unknown: ${isUnknown}`); // Debug country code and unknown flag status
|
||||
|
||||
// Display the locale and the corresponding flag (or fallback)
|
||||
//document.getElementById('locale').textContent = `Your Locale: ${userLocale}`;
|
||||
|
||||
if (isUnknown) {
|
||||
const fallbackDiv = document.createElement('div');
|
||||
fallbackDiv.className = 'fallback-box';
|
||||
fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Show ? and locale code inside the box
|
||||
document.getElementById('flag-container').appendChild(fallbackDiv);
|
||||
|
||||
// Tooltip for fallback
|
||||
fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
|
||||
//alert('Fallback triggered: Unknown Country'); // Debug fallback
|
||||
} else {
|
||||
const countryName = getCountryNameFromCountryCode(countryCode.toUpperCase());
|
||||
//alert(`Country Name from Country Code: ${countryName}`); // Alert the country name
|
||||
|
||||
const flagSpan = document.createElement('span');
|
||||
flagSpan.textContent = flag; // Use flag emoji
|
||||
flagSpan.title = countryName; // Tooltip for the flag in country language
|
||||
document.getElementById('flag-container').appendChild(flagSpan);
|
||||
|
||||
//alert(`Flag Emoji: ${flag}`); // Debug flag emoji display
|
||||
}
|
||||
}
|
||||
displayLocaleAndFlag();
|
||||
});
|
@@ -0,0 +1,31 @@
|
||||
// js/sme-password.js
|
||||
$(document).ready(function() {
|
||||
// For each password input
|
||||
$('.sme-password').each(function() {
|
||||
// Create a new container
|
||||
//alert("sme-password");
|
||||
var $inputContainer = $('<div class="input-container"></div>');
|
||||
|
||||
// Move the input into the new container
|
||||
$(this).wrap($inputContainer);
|
||||
|
||||
// Create the toggle image
|
||||
var $togglePassword = $('<img src="images/visible.png" alt="Show Password" class="toggle-password" />');
|
||||
|
||||
// Append the toggle image to the container
|
||||
$(this).after($togglePassword);
|
||||
});
|
||||
|
||||
$('.toggle-password').on('click', function() {
|
||||
// Find the associated password field
|
||||
var input = $(this).siblings('.sme-password');
|
||||
|
||||
// Toggle the type attribute between password and text
|
||||
var inputType = input.attr('type') === 'password' ? 'text' : 'password';
|
||||
input.attr('type', inputType);
|
||||
|
||||
// Toggle the icon source based on the input type
|
||||
var iconSrc = inputType === 'password' ? 'images/visible.png' : 'images/visible-slash.png';
|
||||
$(this).attr('src', iconSrc);
|
||||
});
|
||||
});
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_tape_configure-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_tape_restore-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_configure-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_configure1-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_restore-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_restore1-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_sel_restore-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_sel_restore1-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_sel_restore2-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -2,7 +2,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_verify-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -2,7 +2,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module back_workstn_verify1-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas->{function}
|
||||
|
@@ -11,22 +11,29 @@
|
||||
# The events handle cases where mysqld is not enabled, and/or is not running.
|
||||
my $status = system("/sbin/e-smith/signal-event", "pre-backup", "desktop");
|
||||
if ($status) {
|
||||
desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
|
||||
return ($c->l('bac_OPERATION_STATUS_REPORT').
|
||||
$c->l('bac_ERR_PRE_BACKUP'));
|
||||
$c->desktopBackupRecordStatus($backup_rec, 'pre-backup', $status);
|
||||
return ($c->l('bac_OPERATION_STATUS_REPORT').$c->l('bac_ERR_PRE_BACKUP'));
|
||||
}
|
||||
|
||||
my $clvl = $c->stash('compressionlevel');
|
||||
my $cmd = "/bin/tar --directory / --create @{$c->stash('directories')} --file=-"
|
||||
. "@{$c->stash('exclude')} | /usr/bin/gzip $clvl ";
|
||||
my $cmd = "/bin/tar --create --file=- --directory / @{$c->stash('exclude')} "
|
||||
. "@{$c->stash('directories')} | /usr/bin/gzip $clvl ";
|
||||
|
||||
my $success = open my $fh, '-|', $cmd;
|
||||
unless ($success) { return "Error dowload command."; };
|
||||
|
||||
# Write chunk
|
||||
#unless ($success) { return "Error download command."; };
|
||||
if ($success) {
|
||||
# Try with download plugin - seems to fail to complete download and also
|
||||
# name of file deposited is not as required.
|
||||
#my $output = do { local $/; <$fh> };
|
||||
#close $fh;
|
||||
#$c->render_file(
|
||||
#data => $output,
|
||||
#filename => 'output.txt',
|
||||
#content_type => 'text/plain'
|
||||
#);
|
||||
# So organise it ourselves.
|
||||
$c->res->headers->content_type('application/x-tar');
|
||||
$c->res->headers->content_disposition(qq/attachment; filename="smeserver.tgz"/);
|
||||
|
||||
my $cb;
|
||||
$cb = sub {
|
||||
my $c = shift;
|
||||
@@ -41,11 +48,14 @@
|
||||
$c->write_chunk($buffer, $cb);
|
||||
};
|
||||
$c->$cb;
|
||||
} else {
|
||||
$c->render(text => "Failed to execute command: $!", status => 500);
|
||||
}
|
||||
|
||||
# Remove the dumped tables.
|
||||
$status = system("/sbin/e-smith/signal-event", "post-backup", "desktop");
|
||||
if ($status) {
|
||||
desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
|
||||
$c->desktopBackupRecordStatus($backup_rec, 'post-backup', $status);
|
||||
die ($c->l('bac_ERR_POST_BACKUP'),"\n");
|
||||
}
|
||||
|
||||
@@ -54,3 +64,4 @@
|
||||
$backup_rec->set_prop('Result', "0");
|
||||
|
||||
%>
|
||||
1;
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module backup-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $bac_datas
|
||||
|
@@ -4,7 +4,7 @@
|
||||
|
||||
<div id='module' class='module bugreport-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
(DBG)route: <%= $c->current_route %><br>
|
||||
(DBG)trt: <%= $bugr_datas->{trt} %><br>
|
||||
@@ -13,11 +13,10 @@
|
||||
|
||||
<h1><%= $title %></h1>
|
||||
<!--br><%= $modul %><br-->
|
||||
<p>
|
||||
|
||||
<p><b>
|
||||
<b>
|
||||
%=l ('bugr_DO_NOT_PANIC')
|
||||
</b></p>
|
||||
</b>
|
||||
<p>
|
||||
%=l ('bugr_SME_EXPERIENCE')
|
||||
</p><p>
|
||||
@@ -49,7 +48,7 @@
|
||||
%=l ('bugr_YUM_REPOS')
|
||||
</li><br></ul>
|
||||
%=l ('bugr_PRIVACY')
|
||||
</p><p>
|
||||
</p>
|
||||
|
||||
<% my $btn = l('bugr_CREATE_REPORT'); %>
|
||||
|
||||
@@ -57,7 +56,7 @@
|
||||
%= submit_button "$btn", class => 'action'
|
||||
% end
|
||||
|
||||
</p><p><b>
|
||||
<p><b>
|
||||
%=l ('bugr_DONATING')
|
||||
</b><br><br>
|
||||
%=l ('bugr_AWARE_SME')
|
||||
@@ -66,6 +65,7 @@
|
||||
</b><br><br>
|
||||
%=l ('bugr_CONSIDER_DONATING')
|
||||
<br><br>
|
||||
</p>
|
||||
|
||||
%= link_to 'https://wiki.koozali.org/Donate' => begin
|
||||
%= image '/images/btn_donateCC_LG.gif'
|
||||
@@ -76,7 +76,6 @@
|
||||
|
||||
<br>
|
||||
%=l ('bugr_THANK_YOU')
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
|
||||
<div id='module' class='module bugreport2-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
(DBG)route: <%= $c->current_route %><br>
|
||||
(DBG)trt: <%= $bugr_datas->{trt} %><br>
|
||||
@@ -15,7 +15,6 @@
|
||||
|
||||
<br><%= $modul %><br>
|
||||
|
||||
<p>
|
||||
<% my $btn = l('bugr_Download this report'); %>
|
||||
|
||||
%= form_for 'bugreportD' => (method => 'POST') => begin
|
||||
@@ -23,6 +22,13 @@
|
||||
%= hidden_field 'trt' => $bugr_datas->{trt}
|
||||
% end
|
||||
|
||||
% my $out = "================== <br />";
|
||||
% $out .= "Boot anaysis image (right click and save image to download)<br />";
|
||||
% $out .= "================== <br />";
|
||||
% $out .= "<img src='images/boot.svg' alt='boot timing image' width=95% >";
|
||||
|
||||
<br><%= $c->render_to_string(inline=>$out) %><br>
|
||||
|
||||
</div>
|
||||
|
||||
%end
|
@@ -2,7 +2,7 @@
|
||||
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module clamav-panel'>
|
||||
%if ($config->{debug} == 1) {
|
||||
%if (config->{debug} == 1) {
|
||||
<p>(DBG)route: <%= $c->current_route %><br>
|
||||
(DBG)FsS stat: <%= $clm_datas->{FilesystemScan}%> <br>
|
||||
(DBG)Quar stat: <%=$clm_datas->{Quarantine} %>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module datetime-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $dat_datas
|
||||
@@ -45,6 +45,7 @@
|
||||
%= $dat_datas->{now_string}
|
||||
</b>
|
||||
</p>
|
||||
<p>
|
||||
<br>
|
||||
<span class=label>
|
||||
%=l 'dat_NTP_SERVER'
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module directory-panel'>
|
||||
|
||||
%if ($config->{debug} == 1) {
|
||||
%if (config->{debug} == 1) {
|
||||
<p>
|
||||
(DBG)route: <%= $c->current_route %><br>
|
||||
(DBG)dir. access: <%= $dir_datas->{access}%><br>
|
||||
@@ -44,25 +44,25 @@
|
||||
</span><span class=data>
|
||||
%= text_field 'department' => $dir_datas->{department}, class => 'input'
|
||||
</span>
|
||||
</p>
|
||||
</p><p>
|
||||
<span class=label>
|
||||
%=l 'dir_COMPANY', class => 'label'
|
||||
</span><span class=data>
|
||||
%= text_field 'company', $dir_datas->{company}, class => 'input'
|
||||
</span>
|
||||
</p>
|
||||
</p><p>
|
||||
<span class=label>
|
||||
%=l 'dir_STREET', class => 'label'
|
||||
</span><span class=data>
|
||||
%= text_field 'street' => $dir_datas->{street}, class => 'input'
|
||||
</span>
|
||||
</p>
|
||||
</p><p>
|
||||
<span class=label>
|
||||
%=l 'dir_CITY', class => 'label'
|
||||
</span><span class=data>
|
||||
%= text_field 'city', $dir_datas->{city}, class => 'input'
|
||||
</span>
|
||||
</p>
|
||||
</p><p>
|
||||
<span class=label>
|
||||
%=l 'dir_PHONENUMBER', class => 'label'
|
||||
</span><span class=data>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module domains-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $dom_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module emailaccess-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $mai_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module emaildeliver-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $mai_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module emailfilter-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $mai_datas
|
||||
@@ -34,8 +34,8 @@
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_SPAM_SCAN'
|
||||
</span><span class=input>
|
||||
% param 'SpamStatus' => $mai_datas->{spamstatus} unless param 'SpamStatus';
|
||||
%= select_field 'SpamStatus' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
|
||||
% param 'Spamstatus' => $mai_datas->{spamstatus} unless param 'Spamstatus';
|
||||
%= select_field 'Spamstatus' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
|
||||
</span></p>
|
||||
|
||||
<p><span class=label>
|
||||
|
@@ -1,12 +1,17 @@
|
||||
% layout 'default', title => "Sme server 2 - emailreceive";
|
||||
|
||||
% content_for 'module' => begin
|
||||
|
||||
% use constant FALSE => 0;
|
||||
% use constant TRUE => 1;
|
||||
|
||||
<div id='module' class='module emailreceive-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $mai_datas
|
||||
%= dumper $c->param('SMTPAuth')
|
||||
</p>
|
||||
% }
|
||||
|
||||
@@ -26,18 +31,67 @@
|
||||
%=l 'mai_LABEL_MODE'
|
||||
</span><span class=input>
|
||||
% param 'FetchmailMethod' => $mai_datas->{fetchmailmethod} unless param 'FetchmailMethod';
|
||||
<!--
|
||||
<pre>
|
||||
%= dumper $mai_datas->{fetchmailmethod}
|
||||
%= dumper $c->get_retrieval_opt()
|
||||
%= param 'FetchmailMethod'
|
||||
</pre>
|
||||
-->
|
||||
%= select_field 'FetchmailMethod' => $c->get_retrieval_opt(), class => 'input'
|
||||
</span></p>
|
||||
|
||||
%=l 'mai_DESC_SMTP_AUTH_CONTROL'
|
||||
%#=l 'mai_DESC_SMTP_AUTH_CONTROL'
|
||||
<br />
|
||||
%= l "SMTP port (25) main purpose is to receive emails from another server, STARTTLS is always offered, but auth if offered is only if STARTTLS is also used by client."
|
||||
<br />
|
||||
%= l "SMTPS port (465) will require implicit SSL/TLS then authenticate to send."
|
||||
<br />
|
||||
%= l "SMTP Submission port (587) will require STARTTLS, then authenticate to send."
|
||||
<br />
|
||||
|
||||
% my $smtp_mesg=l('SMTP port %u allow client to authenticate:');
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_SMTP_AUTH_CONTROL'
|
||||
%= sprintf($smtp_mesg,$c->get_db_prop('qpsmtpd','TCPPort',25));
|
||||
</span><span class=input>
|
||||
% param 'SMTPAuth' => $c->get_current_smtp_auth() unless param 'SMTPAuth';
|
||||
% param 'SMTPAuth' => $c->get_current_smtp_auth( FALSE ) unless param 'SMTPAuth';
|
||||
<!--
|
||||
<pre>
|
||||
%= dumper $c->get_smtp_auth_opt()
|
||||
%= dumper $c->get_current_smtp_auth(FALSE)
|
||||
%= dumper $c->get_db_prop("qpsmtpd","Authentication")
|
||||
%= param 'SMTPAuth'
|
||||
</pre>
|
||||
-->
|
||||
%= select_field 'SMTPAuth' => $c->get_smtp_auth_opt(), class => 'input'
|
||||
</span></p>
|
||||
|
||||
% my $smtp_mesg=l('SMTPS SSL/TLS auth: port %u status:');
|
||||
<p><span class=label>
|
||||
%= sprintf($smtp_mesg,$c->get_db_prop('sqpsmtpd','TCPPort',465));
|
||||
</span><span class=input>
|
||||
% param 'sSMTPAuth' => $c->get_current_smtp_ssl_auth(FALSE,'s', TRUE) unless param 'sSMTPAuth';
|
||||
|
||||
%= select_field 'sSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input'
|
||||
</span></p>
|
||||
|
||||
%my $smtp_mesg=l('Submission port %u status:');
|
||||
<p><span class=label>
|
||||
%= sprintf($smtp_mesg,$c->get_db_prop('uqpsmtpd','TCPPort',587));
|
||||
</span><span class=input>
|
||||
% param 'uSMTPAuth' => $c->get_current_smtp_ssl_auth(FALSE,'u', TRUE) unless param 'uSMTPAuth';
|
||||
<!--
|
||||
<pre>
|
||||
%= dumper $c->get_smtp_ssl_auth_opt()
|
||||
%= dumper $c->get_current_smtp_ssl_auth(FALSE,'s', TRUE)
|
||||
%= dumper $c->get_current_smtp_ssl_auth(FALSE,'u', TRUE)
|
||||
%= dumper $c->get_db_prop("uqpsmtpd","access")
|
||||
%= param 'uSMTPAuth'
|
||||
</pre>
|
||||
-->
|
||||
%= select_field 'uSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input'
|
||||
</span></p>
|
||||
|
||||
<hr class="sectionbar" />
|
||||
<h2>
|
||||
%=l 'mai_TITLE_SECONDARY'
|
||||
|
@@ -1,9 +1,13 @@
|
||||
% layout 'default', title => "Sme server 2 - emailsettings";
|
||||
|
||||
% content_for 'module' => begin
|
||||
|
||||
% use constant FALSE => 0;
|
||||
% use constant TRUE => 1;
|
||||
|
||||
<div id='module' class='module emailsettings-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == TRUE) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $mai_datas
|
||||
@@ -22,19 +26,19 @@
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_POP_ACCESS_CONTROL'
|
||||
</span><span class=data2>
|
||||
%= $c->get_current_pop3_access( 1 )
|
||||
%= $c->get_current_pop3_access( TRUE )
|
||||
</span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_IMAP_ACCESS_CONTROL'
|
||||
</span><span class=data2>
|
||||
%= $c->get_current_imap_access( 1 )
|
||||
%= $c->get_current_imap_access( TRUE )
|
||||
</span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_WEBMAIL'
|
||||
</span><span class=data2>
|
||||
%= $c->get_current_webmail_status( 1 )
|
||||
%= $c->get_current_webmail_status( TRUE )
|
||||
</span></p>
|
||||
|
||||
% my $btn = l('mai_DESC_STATE_ACCESS_BUTTON');
|
||||
@@ -51,19 +55,19 @@
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_VIRUS_SCAN'
|
||||
</span><span class=data2>
|
||||
%= $c->get_virus_status(1)
|
||||
%= $c->get_virus_status(TRUE)
|
||||
</span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_SPAM_SCAN'
|
||||
</span><span class=data2>
|
||||
%= $c->get_spam_status(1)
|
||||
%= $c->get_spam_status(TRUE)
|
||||
</span></p>
|
||||
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_BLOCK_EXECUTABLE_CONTENT'
|
||||
</span><span class=data2>
|
||||
%= $c->get_patterns_status(1)
|
||||
%= $c->get_patterns_status(TRUE)
|
||||
</span></p>
|
||||
|
||||
% my $btn = l('mai_DESC_STATE_FILTERING_BUTTON');
|
||||
@@ -83,12 +87,30 @@
|
||||
%= $mai_datas->{fetchmailmethod}
|
||||
</span></p>
|
||||
|
||||
% my $smtp_mesg;
|
||||
|
||||
% $smtp_mesg=l('SMTP port %u allow client to authenticate:');
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_SMTP_AUTH_CONTROL'
|
||||
%= sprintf($smtp_mesg,$c->get_db_prop('qpsmtpd','TCPPort',25));
|
||||
</span><span class=data2>
|
||||
%= $c->get_current_smtp_auth( 1 )
|
||||
%= $c->get_current_smtp_auth( TRUE )
|
||||
</span></p>
|
||||
|
||||
% $smtp_mesg=l('SMTPS SSL/TLS auth: port %u status:');
|
||||
<p><span class=label>
|
||||
%= sprintf($smtp_mesg,$c->get_db_prop('sqpsmtpd','TCPPort',465));
|
||||
</span><span class=data2>
|
||||
%= $c->get_current_smtp_ssl_auth( TRUE, 's', FALSE )
|
||||
</span></p>
|
||||
|
||||
% $smtp_mesg=l 'Submission port %u status:';
|
||||
<p><span class=label>
|
||||
%= sprintf($smtp_mesg,$c->get_db_prop('uqpsmtpd','TCPPort',587));
|
||||
</span><span class=data2>
|
||||
%= $c->get_current_smtp_ssl_auth( TRUE,'u', FALSE )
|
||||
</span></p>
|
||||
<br />
|
||||
|
||||
% my $btn = l('mai_DESC_STATE_RECEPTION_BUTTON');
|
||||
<div class='center'>
|
||||
%= submit_button "$btn", class => 'action'
|
||||
@@ -103,7 +125,7 @@
|
||||
<p><span class=label>
|
||||
%=l 'mai_LABEL_UNKNOWN'
|
||||
</span><span class=data2>
|
||||
%= $c->get_emailunknownuser_status( 1 )
|
||||
%= $c->get_emailunknownuser_status( TRUE )
|
||||
</span></p>
|
||||
|
||||
<p><span class=label>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
|
||||
<div id='module' class='module module-panel'>
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
</p>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module groups-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $grp_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module hostentries-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $hos_datas
|
||||
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module ibays-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $iba_datas
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
% content_for 'module' => begin
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
</p>
|
||||
|
@@ -5,12 +5,13 @@
|
||||
<!-- default +jquery -->
|
||||
<head>
|
||||
<title><%= $title %></title>
|
||||
<link rev="made" href="mailto:bugs%40koozali.org">
|
||||
<link rel="made" href="mailto:bugs%40koozali.org">
|
||||
<meta name="copyright" content="(head.tmpl)Copyright 2003-2004 Mitel Corporation">
|
||||
%= stylesheet '/css/sme_core.css'
|
||||
%= stylesheet '/css/sme_main.css'
|
||||
%= stylesheet '/css/sme_menu.css'
|
||||
%= stylesheet '/css/styles.css'
|
||||
%= stylesheet '/css/sme-password.css'
|
||||
%= content_for 'head_contrib'
|
||||
% if (config 'hasJquery') {
|
||||
%= include 'partials/_js_imports'
|
||||
@@ -19,19 +20,37 @@
|
||||
%= content_for 'refresh'
|
||||
|
||||
%= stylesheet '/js/datatables.min.css'
|
||||
|
||||
%= javascript '/js/datatables.min.js'
|
||||
|
||||
%= stylesheet '/js/jquery-ui.min.css'
|
||||
|
||||
%= javascript '/js/jquery-ui.min.js'
|
||||
%= javascript '/js/dataTables.buttons.min.js'
|
||||
%= javascript '/js/jszip.min.js'
|
||||
%= javascript '/js/pdfmake.min.js'
|
||||
%= javascript '/js/vfs_fonts.js'
|
||||
%= javascript '/js/buttons.html5.min.js'
|
||||
%= javascript '/js/buttons.print.min.js'
|
||||
%= javascript '/js/flag-by-locale.js'
|
||||
%= javascript '/js/sme-password.js'
|
||||
|
||||
%= stylesheet '/js/dataTables.buttons.min.js'
|
||||
%= stylesheet '/js/jszip.min.js'
|
||||
%= stylesheet '/js/pdfmake.min.js'
|
||||
%= stylesheet '/js/vfs_fonts.js'
|
||||
%= stylesheet '/js/buttons.html5.min.js'
|
||||
%= stylesheet '/js/buttons.print.min.js'
|
||||
|
||||
<link rel="stylesheet" href="/smanager/css/flag-icon.min.css">
|
||||
%= stylesheet '/css/sme-jquery-overrides.css'
|
||||
|
||||
<style>
|
||||
#busy-indicator {
|
||||
display: none;
|
||||
margin-top: 10px;
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
.busy {
|
||||
cursor: wait; /* Change the cursor to a 'wait' cursor */
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -91,46 +110,21 @@
|
||||
|
||||
%= javascript '/js/sme-dataTable-setup.js'
|
||||
|
||||
%= javascript begin
|
||||
//Set menu to initial condition based on localStorage
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
let menunavflag = window.localStorage.getItem('menunav');
|
||||
if (menunavflag != "false"){
|
||||
$('#menunav').toggle(true);
|
||||
} else {
|
||||
$('#menunav').toggle(false);
|
||||
}
|
||||
// Handle form submission for any form
|
||||
$('form').on('submit', function(event) {
|
||||
// Disable the submit button
|
||||
$(this).find('button[type="submit"], input[type="submit"]').prop('disabled', true);
|
||||
// Show the busy indicator
|
||||
// $('#busy-indicator').show();
|
||||
|
||||
let menuadmflag = window.localStorage.getItem('menuadm');
|
||||
if (menuadmflag != "false"){
|
||||
$('#menuadm').toggle(true);
|
||||
} else {
|
||||
$('#menuadm').toggle(false);
|
||||
}
|
||||
// Change the cursor to "wait"
|
||||
$('body').addClass('busy');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
let menuuserflag = window.localStorage.getItem('menuuser');
|
||||
if (menuuserflag != "false"){
|
||||
$('#menuuser').toggle(true);
|
||||
} else {
|
||||
$('#menuuser').toggle(false);
|
||||
}
|
||||
|
||||
var sections = document.getElementsByClassName("section-title");
|
||||
for (var i = 0, len = sections.length; i < len; i++) {
|
||||
var jqObj = $(sections[i]);
|
||||
var $section = jqObj.parent().next('div');
|
||||
if(!$section.length){
|
||||
return false;
|
||||
}
|
||||
let localStorageTag = "admSection-"+sections[i].innerHTML;
|
||||
if (window.localStorage.getItem(localStorageTag) != "false"){
|
||||
$section.toggle(true);
|
||||
} else {
|
||||
$section.toggle(false);
|
||||
}
|
||||
}
|
||||
})
|
||||
%end
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -3,7 +3,7 @@
|
||||
% content_for 'module' => begin
|
||||
<div id='module' class='module localnetworks-panel'>
|
||||
|
||||
% if ($config->{debug} == 1) {
|
||||
% if (config->{debug} == 1) {
|
||||
<p>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $c->stash("ret")
|
||||
|
@@ -43,9 +43,9 @@
|
||||
<p><span class=label>
|
||||
%=l 'PASSWORD'
|
||||
</span><span class=input>
|
||||
%= password_field 'Password', id => 'id_password', autocomplete => 'current-password'
|
||||
%= password_field 'Password', id => 'id_password', autocomplete => 'current-password', class=>'sme-password'
|
||||
% if (config 'hasJquery') {
|
||||
<a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a>
|
||||
%#<a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a>
|
||||
% }
|
||||
</span></p>
|
||||
%}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user