commit 2801142206ef8bf5b6d43177b397ebcc04998a90 Author: Kienan Stewart Date: Sun Jan 28 14:39:15 2018 -0500 Initial commit diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..dd5e176 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +Adds a panel to quick-install certain CMSs in AlternC. This module provides support for WordPress and Drupal. + +Support for other CMSs may be added by other AlternC plugins. See "Extending" for more information. + +# Installation + +## Pre-requisites + +For [WordPress][1]: Install [WP-CLI](https://wp-cli.org/ "WP-CLI home page") + +For [Drupal][2]: Install [Drush](https://github.com/drush-ops/drush/ "Drush on GitHub") + +## Manual Install + +` +make install +` + +If AlternC is installed in another directory, use something like: ` +ALTERNC_BASE_PATH=/your/path/alternc make install +` + +# Configuration + +Once installed, add the Drush or WP-CLI paths to /etc/alternc/locals.sh. These need to be accessible within the basedir restrictions of the AlternC panel. + +Example: ` +ALTERNC_DRUSH_BIN=/usr/local/bin/drush +ALTERNC_WPCLI_BIN=/usr/local/bin/wp +` + +If they are not configured, the links for installation will be disabled. If no CMSs are configured, the quick links menu item will not be displayed. + +# Extending + +A number of hooks are available to modify the install form and run the actual install. Drupal and WordPress are implemented as examples that could done in another module easily. + +# Roadmap + +This module is basically at a 'proof of concept' point. For a first proper release, the following should probably be added: + +* make sure form content and variables are properly escaped when passed between scripts +* user interface / form cleanup + * hide form elements based on choices + * sub-domain list changing based on chosen domain + * hide un-necessary detail +* fix localization in messages +* tests + +Nice to haves: + +* threaded install script so user feedback doesn't have to wait X minutes until the shell scripts finish + +# Copyright & License + +2018 Kienan Stewart + +Licensed under the GNU General Public License version 2.0 or later. See LICENSE for the full license text. diff --git a/css/style-custom.css b/css/style-custom.css new file mode 100644 index 0000000..1d3885b --- /dev/null +++ b/css/style-custom.css @@ -0,0 +1,3 @@ +#menu-oci span img { + display: block; +} diff --git a/debian/README b/debian/README new file mode 100644 index 0000000..188ac7c --- /dev/null +++ b/debian/README @@ -0,0 +1,6 @@ +The Debian Package alternc-oneclickinstallers +---------------------------- + +Comments regarding the Package + + -- Kienan Stewart Sat, 27 Jan 2018 09:48:31 -0500 diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..1697ff8 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,6 @@ +alternc-oneclickinstallers for Debian +------------------------------------ + + + + -- Kienan Stewart Sat, 27 Jan 2018 09:48:31 -0500 diff --git a/debian/README.source b/debian/README.source new file mode 100644 index 0000000..f374713 --- /dev/null +++ b/debian/README.source @@ -0,0 +1,10 @@ +alternc-oneclickinstallers for Debian +------------------------------------ + + + + + + -- Kienan Stewart Sat, 27 Jan 2018 09:48:31 -0500 + diff --git a/debian/alternc-oneclickinstallers-docs.docs b/debian/alternc-oneclickinstallers-docs.docs new file mode 100644 index 0000000..d6341a0 --- /dev/null +++ b/debian/alternc-oneclickinstallers-docs.docs @@ -0,0 +1,3 @@ +README.source +README +README.Debian diff --git a/debian/alternc-oneclickinstallers.cron.d.ex b/debian/alternc-oneclickinstallers.cron.d.ex new file mode 100644 index 0000000..3a1d2da --- /dev/null +++ b/debian/alternc-oneclickinstallers.cron.d.ex @@ -0,0 +1,4 @@ +# +# Regular cron jobs for the alternc-oneclickinstallers package +# +0 4 * * * root [ -x /usr/bin/alternc-oneclickinstallers_maintenance ] && /usr/bin/alternc-oneclickinstallers_maintenance diff --git a/debian/alternc-oneclickinstallers.doc-base.EX b/debian/alternc-oneclickinstallers.doc-base.EX new file mode 100644 index 0000000..5a826c3 --- /dev/null +++ b/debian/alternc-oneclickinstallers.doc-base.EX @@ -0,0 +1,20 @@ +Document: alternc-oneclickinstallers +Title: Debian alternc-oneclickinstallers Manual +Author: +Abstract: This manual describes what alternc-oneclickinstallers is + and how it can be used to + manage online manuals on Debian systems. +Section: unknown + +Format: debiandoc-sgml +Files: /usr/share/doc/alternc-oneclickinstallers/alternc-oneclickinstallers.sgml.gz + +Format: postscript +Files: /usr/share/doc/alternc-oneclickinstallers/alternc-oneclickinstallers.ps.gz + +Format: text +Files: /usr/share/doc/alternc-oneclickinstallers/alternc-oneclickinstallers.text.gz + +Format: HTML +Index: /usr/share/doc/alternc-oneclickinstallers/html/index.html +Files: /usr/share/doc/alternc-oneclickinstallers/html/*.html diff --git a/debian/alternc-oneclickinstallers.install b/debian/alternc-oneclickinstallers.install new file mode 100644 index 0000000..7be8a84 --- /dev/null +++ b/debian/alternc-oneclickinstallers.install @@ -0,0 +1 @@ +src/ /usr/share/alternc/panel/ diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..931613a --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +alternc-oneclickinstallers (1.0.0) unstable; urgency=medium + + * Initial Release. + + -- Kienan Stewart Sat, 27 Jan 2018 09:48:31 -0500 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +10 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..7716845 --- /dev/null +++ b/debian/control @@ -0,0 +1,15 @@ +Source: alternc-oneclickinstallers +Section: web +Priority: optional +Maintainer: Kienan Stewart +Build-Depends: debhelper (>= 10) +Standards-Version: 4.1.2 +Homepage: +#Vcs-Git: https://anonscm.debian.org/git/collab-maint/alternc-oneclickinstallers.git +#Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/alternc-oneclickinstallers.git + +Package: alternc-oneclickinstallers +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: + diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..0273430 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,41 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: alternc-oneclickinstallers +Source: + +Files: * +Copyright: 2018 Kienan Stewart +License: GPL-2.0+ + +Files: debian/* +Copyright: 2018 Kienan Stewart +License: GPL-2.0+ + +Files: images/drupal.png +Copyright: 2001 - 2013 Drupal Original Authors +License: GPL-2.0+ + +Files: images/wordpress.png +Copyright: 2011 - 2018 WordPress contributors +License: GPL-2.0+ + +License: GPL-2.0+ + This package 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 package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. +# Please avoid picking licenses with terms that are more restrictive than the +# packaged work, as it may make Debian's contributions unacceptable upstream. diff --git a/debian/manpage.1.ex b/debian/manpage.1.ex new file mode 100644 index 0000000..6f0f7a3 --- /dev/null +++ b/debian/manpage.1.ex @@ -0,0 +1,56 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" (C) Copyright 2018 Kienan Stewart , +.\" +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH Alternc-oneclickinstallers SECTION "January 27 2018" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +alternc-oneclickinstallers \- program to do something +.SH SYNOPSIS +.B alternc-oneclickinstallers +.RI [ options ] " files" ... +.br +.B bar +.RI [ options ] " files" ... +.SH DESCRIPTION +This manual page documents briefly the +.B alternc-oneclickinstallers +and +.B bar +commands. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +\fBalternc-oneclickinstallers\fP is a program that... +.SH OPTIONS +These programs follow the usual GNU command line syntax, with long +options starting with two dashes (`-'). +A summary of options is included below. +For a complete description, see the Info files. +.TP +.B \-h, \-\-help +Show summary of options. +.TP +.B \-v, \-\-version +Show version of program. +.SH SEE ALSO +.BR bar (1), +.BR baz (1). +.br +The programs are documented fully by +.IR "The Rise and Fall of a Fooish Bar" , +available via the Info system. diff --git a/debian/manpage.sgml.ex b/debian/manpage.sgml.ex new file mode 100644 index 0000000..10ef41f --- /dev/null +++ b/debian/manpage.sgml.ex @@ -0,0 +1,154 @@ + manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + + FIRSTNAME"> + SURNAME"> + + January 27 2018"> + + SECTION"> + kienan.stewart@burntworld.ca"> + + Alternc-oneclickinstallers"> + + + Debian"> + GNU"> + GPL"> +]> + + + +
+ &dhemail; +
+ + &dhfirstname; + &dhsurname; + + + 2003 + &dhusername; + + &dhdate; +
+ + &dhucpackage; + + &dhsection; + + + &dhpackage; + + program to do something + + + + &dhpackage; + + + + + + + + DESCRIPTION + + This manual page documents briefly the + &dhpackage; and bar + commands. + + This manual page was written for the &debian; distribution + because the original program does not have a manual page. + Instead, it has documentation in the &gnu; + Info format; see below. + + &dhpackage; is a program that... + + + + OPTIONS + + These programs follow the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + Info files. + + + + + + + + Show summary of options. + + + + + + + + Show version of program. + + + + + + SEE ALSO + + bar (1), baz (1). + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + Info system. + + + AUTHOR + + This manual page was written by &dhusername; &dhemail; for + the &debian; system (and may be used by others). Permission is + granted to copy, distribute and/or modify this document under + the terms of the &gnu; General Public License, Version 2 any + later version published by the Free Software Foundation. + + + On Debian systems, the complete text of the GNU General Public + License can be found in /usr/share/common-licenses/GPL. + + + +
+ + diff --git a/debian/manpage.xml.ex b/debian/manpage.xml.ex new file mode 100644 index 0000000..c3e4feb --- /dev/null +++ b/debian/manpage.xml.ex @@ -0,0 +1,291 @@ + +.
will be generated. You may view the +manual page with: nroff -man .
| less'. A typical entry +in a Makefile or Makefile.am is: + +DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl +XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0" + +manpage.1: manpage.xml + $(XP) $(DB2MAN) $< + +The xsltproc binary is found in the xsltproc package. The XSL files are in +docbook-xsl. A description of the parameters you can use can be found in the +docbook-xsl-doc-* packages. Please remember that if you create the nroff +version in one of the debian/rules file targets (such as build), you will need +to include xsltproc and docbook-xsl in your Build-Depends control field. +Alternatively use the xmlto command/package. That will also automatically +pull in xsltproc and docbook-xsl. + +Notes for using docbook2x: docbook2x-man does not automatically create the +AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as + ... . + +To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections +read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be +found in the docbook-xsl-doc-html package. + +Validation can be done using: `xmllint -''-noout -''-valid manpage.xml` + +General documentation about man-pages and man-page-formatting: +man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ + +--> + + + + + + + + + + + + + +]> + + + + &dhtitle; + &dhpackage; + + + &dhfirstname; + &dhsurname; + Wrote this manpage for the Debian system. +
+ &dhemail; +
+
+
+ + 2007 + &dhusername; + + + This manual page was written for the Debian system + (and may be used by others). + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU General Public License, + Version 2 or (at your option) any later version published by + the Free Software Foundation. + On Debian systems, the complete text of the GNU General Public + License can be found in + /usr/share/common-licenses/GPL. + +
+ + &dhucpackage; + &dhsection; + + + &dhpackage; + program to do something + + + + &dhpackage; + + + + + + + + + this + + + + + + + + this + that + + + + + &dhpackage; + + + + + + + + + + + + + + + + + + + DESCRIPTION + This manual page documents briefly the + &dhpackage; and bar + commands. + This manual page was written for the Debian distribution + because the original program does not have a manual page. + Instead, it has documentation in the GNU + info + 1 + format; see below. + &dhpackage; is a program that... + + + OPTIONS + The program follows the usual GNU command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + + info + 1 + files. + + + + + + + Does this and that. + + + + + + + Show summary of options. + + + + + + + Show version of program. + + + + + + FILES + + + /etc/foo.conf + + The system-wide configuration file to control the + behaviour of &dhpackage;. See + + foo.conf + 5 + for further details. + + + + ${HOME}/.foo.conf + + The per-user configuration file to control the + behaviour of &dhpackage;. See + + foo.conf + 5 + for further details. + + + + + + ENVIRONMENT + + + FOO_CONF + + If used, the defined file is used as configuration + file (see also ). + + + + + + DIAGNOSTICS + The following diagnostics may be issued + on stderr: + + + Bad configuration file. Exiting. + + The configuration file seems to contain a broken configuration + line. Use the option, to get more info. + + + + + &dhpackage; provides some return codes, that can + be used in scripts: + + Code + Diagnostic + + 0 + Program exited successfully. + + + 1 + The configuration file seems to be broken. + + + + + + BUGS + The program is currently limited to only work + with the foobar library. + The upstreams BTS can be found + at . + + + SEE ALSO + + + bar + 1 + , + baz + 1 + , + foo.conf + 5 + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + info + 1 + system. + +
+ diff --git a/debian/menu.ex b/debian/menu.ex new file mode 100644 index 0000000..8952ef0 --- /dev/null +++ b/debian/menu.ex @@ -0,0 +1,2 @@ +?package(alternc-oneclickinstallers):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\ + title="alternc-oneclickinstallers" command="/usr/bin/alternc-oneclickinstallers" diff --git a/debian/postinst.ex b/debian/postinst.ex new file mode 100644 index 0000000..36b85dd --- /dev/null +++ b/debian/postinst.ex @@ -0,0 +1,39 @@ +#!/bin/sh +# postinst script for alternc-oneclickinstallers +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/postrm.ex b/debian/postrm.ex new file mode 100644 index 0000000..52e23f0 --- /dev/null +++ b/debian/postrm.ex @@ -0,0 +1,37 @@ +#!/bin/sh +# postrm script for alternc-oneclickinstallers +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/preinst.ex b/debian/preinst.ex new file mode 100644 index 0000000..d90b541 --- /dev/null +++ b/debian/preinst.ex @@ -0,0 +1,35 @@ +#!/bin/sh +# preinst script for alternc-oneclickinstallers +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/prerm.ex b/debian/prerm.ex new file mode 100644 index 0000000..a21f9aa --- /dev/null +++ b/debian/prerm.ex @@ -0,0 +1,38 @@ +#!/bin/sh +# prerm script for alternc-oneclickinstallers +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..e1c367c --- /dev/null +++ b/debian/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ + + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) + diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/images/drupal.png b/images/drupal.png new file mode 100644 index 0000000..3b49a4c Binary files /dev/null and b/images/drupal.png differ diff --git a/images/ocilogo.png b/images/ocilogo.png new file mode 100644 index 0000000..23ad240 Binary files /dev/null and b/images/ocilogo.png differ diff --git a/images/ocilogo.xcf b/images/ocilogo.xcf new file mode 100644 index 0000000..22cc362 Binary files /dev/null and b/images/ocilogo.xcf differ diff --git a/images/wordpress.png b/images/wordpress.png new file mode 100644 index 0000000..13f3fa6 Binary files /dev/null and b/images/wordpress.png differ diff --git a/src/admin/oci_confirm.php b/src/admin/oci_confirm.php new file mode 100644 index 0000000..390bb8d --- /dev/null +++ b/src/admin/oci_confirm.php @@ -0,0 +1,139 @@ + array('post', 'string', ''), +); +getFields($fields); + + +$fields = $oci->oci_form_fields($application); +getFields($fields); +$all_vars = get_defined_vars(); +$oci_vars = array(); +foreach ($all_vars as $name => $value) { + if (in_array($name, array_keys($fields))) { + $oci_vars[$name] = $value; + } +} + +if (!$application) { + __('No application chosen.'); + include_once('foot.php'); + exit(); +} + +if (!$oci->app_is_installable($application)) { + __('Application not supported: '); print(ehe($application)); + include_once('foot.php'); + exit(); +} + +// @TODO validations +$errors = $oci->oci_form_validate($oci_vars); +if (!empty($errors)) { + print('
'); + print('

' . _('Validation Errors') . '

'); + print('
' . count($errors) . ' ' . _('validation errors in form') . '
'); + foreach ($errors as $delta => $error) { + printf('
%s : %s', $error['module'], $error['message']); + if (isset($error['data'])) { + print('
'); + foreach ($error['data'] as $name => $value) { + printf('
%s
', $name); + printf('
%s
', htmlentities(print_r($value, TRUE))); + } + print('
'); + } + print('
'); + } + print('
'); + include_once('foot.php'); + exit(); +} +?> +

+ +
+ +

+
    + +
  • The domain will be created
  • + + +
  • A new sub-domain of type  + at the directory + will be created.
  • + + +
  • A new database named will be created.
  • + + +
  • will be installed at .
  • + +
+ +

+'); +foreach($oci_vars as $name => $value) { + print("
$name
"); + if (isset($value)) { + $a = htmlentities($value); + } + else { + $a = "***" . __('undefined') . '***'; + } + print("
$a
"); +} +print(''); +?> +

+ $value) { + printf('', $name, $value); +} +?> + + +
+ + diff --git a/src/admin/oci_doinstall.php b/src/admin/oci_doinstall.php new file mode 100644 index 0000000..e9539c5 --- /dev/null +++ b/src/admin/oci_doinstall.php @@ -0,0 +1,63 @@ + array('post', 'string', ''), +); +getFields($fields); + + +$fields = $oci->oci_form_fields($application); +getFields($fields); +$all_vars = get_defined_vars(); +$oci_vars = array(); +foreach ($all_vars as $name => $value) { + if (in_array($name, array_keys($fields))) { + $oci_vars[$name] = $value; + } +} + +if (!$application) { + __('No application chosen.'); + include_once('foot.php'); + exit(); +} + +if (!$oci->app_is_installable($application)) { + __('Application not supported: '); print(ehe($application)); + include_once('foot.php'); + exit(); +} + +$r = $oci->install($application, $oci_vars); +printf('
%s
', print_r($r, TRUE)); +include_once('foot.php'); \ No newline at end of file diff --git a/src/admin/oci_install.php b/src/admin/oci_install.php new file mode 100644 index 0000000..e4118b1 --- /dev/null +++ b/src/admin/oci_install.php @@ -0,0 +1,65 @@ + array('get', 'string', ''), +); +getFields($fields); + +if (!$app) { + __('No application chosen.'); + include_once('foot.php'); + exit(); +} + +if (!$oci->app_is_installable($app)) { + __('Application not supported: '); print(ehe($app)); + include_once('foot.php'); + exit(); +} + +$fields = $oci->oci_form_fields($app); +getFields($fields); + +?> +

+ + +oci_form($app)); + +?> + + diff --git a/src/class/m_oci.php b/src/class/m_oci.php new file mode 100644 index 0000000..9cfe04b --- /dev/null +++ b/src/class/m_oci.php @@ -0,0 +1,752 @@ + _('Quick Install'), + 'ico' => 'images/ocilogo.png', + 'link' => 'toggle', + 'pos' => 11, + 'links' => array(), + ); + // @TODO invoke a hook to get supported applications + // need: id (eg. wordpress), weight (to order), ico, and + // optionally - a different action path. + // @TODO required binaries for installation: eg, wp-cli, drush + if ($this->app_is_installable('wordpress')) { + $menu['links'][] = array( + 'txt' => _('WordPress'), + 'url' => 'oci_install.php?app=wordpress', + 'ico' => 'images/wordpress.png', + ); + } + if ($this->app_is_installable('drupal')) { + $menu['links'][] = array( + 'txt' => _('Drupal'), + 'url' => 'oci_install.php?app=drupal', + 'ico' => 'images/drupal.png', + ); + } + if ($menu['links']) { + return $menu; + } + } + + /** + * Checks to see if requirements are met to install an application. + * + * @param $app string + * The string identifier of the application (eg. drupal, wordpress). + */ + function app_is_installable($app) { + global $hooks; + $vals = $hooks->invoke('hook_oci_is_installable', array($app)); + foreach ($vals as $class => $rval) { + if ($rval) { + return TRUE; + } + } + return FALSE; + } + + /** + * Implements hook_oci_is_installable(). + */ + function hook_oci_is_installable($app) { + global $L_ALTERNC_DRUSH_BIN, $L_ALTERNC_WP_BIN; + switch ($app) { + case 'drupal': + if ($L_ALTERNC_DRUSH_BIN) { + return TRUE; + } + break; + case 'wordpress': + if ($L_ALTERNC_WP_BIN) { + return TRUE; + } + break; + } + return FALSE; + } + + /** + * Gets which fields should be loaded for the one click install form. + * + * @param $app string + * + * @returns array + * Array of fields indexed by parameter name. Each value is an array + * of ["fetch_type", "data_type", "default"]. + * fetch_type may be "get" or "post". + */ + function oci_form_fields($app) { + global $hooks; + $fields = array( + 'application' => array('post', 'string', ''), // Used in confirmation. + + 'domain' => array('post', 'string', ''), + 'new_domain_name' => array('post', 'string', ''), + + 'sub_domain' => array('post', 'string', ''), + 'new_sub_domain_name' => array('post', 'string'), + 'new_sub_domain_path' => array('post', 'string', ''), + 'new_sub_domain_type' => array('post', 'string', 'vhost'), + + 'db_name' => array('post', 'string', ''), + 'new_db_name' => array('post', 'string', ''), + 'db_prefix' => array('post', 'string', ''), + ); + $vals = $hooks->invoke('hook_oci_form_fields', array($app)); + foreach ($vals as $v) { + $fields = $fields + $v; + } + return $fields; + } + + /** + * Implements hook_oci_form_fields(). + */ + function hook_oci_form_fields($app) { + global $mem; + if ($app == 'drupal') { + $fields = array( + 'drupal_install_source' => array('post', 'string', ''), + 'drupal_makefile' => array('post', 'string', ''), + 'drupal_core_version' => array('post', 'string', ''), + 'drupal_title' => array('post', 'string', ''), + 'drupal_admin_name' => array('post', 'string', 'admin'), + // @TODO use user e-mail as a default + 'drupal_admin_mail' => array('post', 'string', ''), + 'drupal_site_name' => array('post', 'string', ''), + 'drupal_site_mail' => array('post', 'string', ''), + ); + return $fields; + } + if ($app == 'wordpress') { + $fields = array( + 'wordpress_title' => array('post', 'string', ''), + 'wordpress_admin_mail' => array('post', 'string', ''), + 'wordpress_admin_name' => array('post', 'string', 'admin'), + 'wordpress_locale' => array('post', 'string', ''), + ); + return $fields; + } + return array(); + } + + /** + * Helper function to get the action script path. + * + * @returns string + * String containing the name of the php script which should be + * invoked to run the installation. + */ + function get_app_action($app) { + return 'oci_doinstall_' . $app . '.php'; + } + + + /** + * Returns a list of subdomain types which can be used for + * installing applications into. + * + * @returns array + * Array of vhost types (strings). + */ + function allowed_subdomain_types() { + // Maybe just there the type has target DIRECTORY. + global $dom; + $dtypes = $dom->domains_type_lst(); + $types = array(); + foreach ($dtypes as $name => $record) { + if ($record['target'] == 'DIRECTORY') { + $types[] = $name; + } + } + return $types; + } + + /** + * Provides the a base form for installation of applications. + * + * @param $app string + * The string identifier of the application (eg. drupal, wordpress). + */ + function oci_form($app) { + global $hooks, $quota, $dom, $mysql; + $form = "
"; + ob_start(); + csrf_get(); + $csrf = ob_get_contents(); + ob_end_clean(); + $form .= $csrf; + $form .= '

' . _('common options') . '

'; + $form .= ''; + + // Domain + $new_domain_possible = $quota->cancreate('dom'); + $current_domains = $dom->enum_domains(); + if ($new_domain_possible) { + $current_domains[] = '*new*'; + } + if ($current_domains) { + $form .= '
'; + // @TODO on select change which sub-domains are listed. + $form .= ''; + $form .= '
'; + } + if ($new_domain_possible) { + $form .= ''; + $form .= ''; + } + + // Choose a sub-domain or new + $allowed_subdomain_types = $this->allowed_subdomain_types(); + $form .= '
'; + $form .= ''; + $form .= '
'; + + // new sub_domain name ; new sub_domain type ; new sub_domain path + $form .= '
'; + $form .= ''; + $form .= ''; + $form .= '
'; + + $form .= '
'; + $form .= ''; + $form .= '
'; + + $form .= '
'; + $form .= ''; + $form .= ''; + $form .= '
'; + + // Database + $new_db_possible = $quota->cancreate('mysql'); + + $dbs = $mysql->get_dblist(); + $form .= '
'; + $form .= ''; + $form .= ''; + $form .= '
'; + $form .= '
'; + $form .= ''; + $form .= ''; + $form .= '
'; + + $form .= '
'; + $form .= ''; + $form .= ''; + $form .= '
'; + + // Invoke hook to get app-specific form fields. + $extra = ''; + $vals = $hooks->invoke('hook_oic_form', array($app)); + foreach ($vals as $v) { + if ($v) { + $extra .= $v; + } + } + if ($extra) { + $form .= '
'; + $form .= '

' . $app . ' ' . _('installation options') . '

'; + $form .= $extra; + $form .= '
'; + } + + // Submit + // @TODO option to disable confirmation screen? + $form .= ''; + $form .= "
"; + return $form; + } + + /** + * Implements hook_oic_form. + */ + function hook_oic_form($app) { + $f = ''; + switch ($app) { + case 'drupal': + // These fields should be defined in hook_oic_form_fields + // Choose the install source + $f .= '
'; + $f .= ''; + $f .= '
'; + // Core Version + $f .= '
'; + $f .= ''; + $f .= '
'; + // Makefile + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // Site Title + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // Drupal Admin Name + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // Drupal Admin Mail + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // Drupal Site Mail + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // Drupal Site Name + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + break; + case 'wordpress': + // Site Title + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // wordpress Admin Name + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // wordpress Admin Mail + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + // wordpress locale + $f .= '
'; + $f .= ''; + $f .= ''; + $f .= '
'; + break; + default: + break; + } + return $f; + } + + /** + * Perform validation of the form data. + * + * @param array $vars + * Array of name/value for the submitted data as received in oci_confirm.php + * + * @returns array + * Array of errors eg. array(0 => array('module' => 'm_oci', 'message' => '...'), ...) + */ + function oci_form_validate($vars) { + global $hooks, $dom, $db; + $errors = array(); + if ($vars['domain'] == '*new*') { + if (!$vars['new_domain_name']) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_domain_name must not be empty when trying to create new domain'), + ); + } + // Repeat validation done in m_dom::add_domain + if (checkfqdn(strtolower($vars['new_domain_name']))) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_domain_name is syntaxically incorrect'), + ); + } + $db->query("SELECT domain FROM forbidden_domains WHERE domain= ? ;", array($domain)); + if ($db->num_rows()) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_domain_name is forbidden on this server'), + ); + } + if ($domain == $L_FQDN || $domain == "www.$L_FQDN") { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_domain_name is the server\'s domain. You cannot host it on your account'), + ); + } + $db->query("SELECT compte FROM domaines WHERE domaine= ?;", array($domain)); + if ($db->num_rows()) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('The domain already exists'), + ); + } + $db->query("SELECT compte FROM `sub_domaines` WHERE sub != \"\" AND concat( sub, \".\", domaine )= ? OR domaine= ?;", array($domain, $domain)); + if ($db->num_rows()) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('The domain already exists'), + ); + } + // There are so many more... whois, dns, quota + } + + $sub = ''; + if ($vars['sub_domain'] == '*new*') { + if (!$vars['new_sub_domain_name']) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_sub_domain_name must not be empty'), + ); + } + if (!$vars['new_sub_domain_path']) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_sub_domain_path must not be empty'), + ); + } + if (!$vars['new_sub_domain_type']) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('new_sub_domain_type must not be empty'), + ); + } + } else { + // Make sure the sub-domain is in the current domain + list($d, $s) = explode(';', $vars['sub_domain']); + if (trim($d) != $vars['domain']) { + $errors[] = array( + 'module' => 'm_oci', + 'message' => _('sub-domain does not belong to selected domain'), + 'data' => array( + 'sub_domain' => $vars['sub_domain'], + 'domain' => $vars['domain'], + 'd' => $d, + 's' => $s, + ), + ); + } + } + + if ($vars['db_name'] == '*new*') { + if (!preg_match("#^[0-9a-z]*$#", $vars['new_db_name'])) { + $error[] = array( + 'module' => 'm_oci', + 'message' => _('new_database_name can only contain letters and numbers'), + ); + $msg->raise("ERROR", "mysql", _("Database name can contain only letters and numbers")); + return false; + } + + $len=variable_get("sql_max_database_length", 64); + if (strlen($vars['db_name']) > $len) { + $error[] = array( + 'module' => 'm_oci', + 'message' => _('new_database_name cannot exceed character length') . ': ' . $len, + ); + } + $db->query("SELECT * FROM db WHERE db= ? ;", array($dbname)); + if ($db->num_rows()) { + $error[] = array( + 'module' => 'm_oci', + 'message' => _('new_database_name already exists'), + ); + } + } + $vals = $hooks->invoke('hook_oci_form_validate', array($vars)); + foreach ($vals as $v) { + if ($v && is_array($v) && !is_empty($v)) { + $errors = $errors + $v; + } + } + return $errors; + } + + /** + * Implements hook_oci_form_validate. + */ + function hook_oci_form_validate($vars) { + $errors = array(); + // @TODO Drupal + // @TODO Wordpress + return $errors; + } + + /** + * Installs an application. + */ + function install($app, $vars) { + global $hooks, $dom, $mysql, $msg, $mem, $db, $cuid, $L_ALTERNC_HTML; + $r = ''; + + // Add new domain if necessary. + if ($vars['domain'] == '*new*') { + $dom->lock(); + // @TODO don't force dns to on enabled. + if (!$dom->add_domain($vars['new_domain_name'], 1)) { + $msg->raise('ERROR', '....'); + return ''; + } else { + $vars['domain'] = $vars['new_domain_name']; + unset($vars['new_domain_name']); + } + $dom->unlock(); + } + + // Add new sub-domain if necessary. + if ($vars['sub_domain'] == '*new*') { + // @TODO special case: handle new_sub_domain_name was a default domain graceully. + $dom->lock(); + if (!$dom->set_sub_domain($vars['domain'], $vars['new_sub_domain_name'], + $vars['new_sub_domain_type'], $vars['new_sub_domain_path'])) { + $msg->raise('ERROR', '......'); + return ''; + } else { + $vars['sub_domain'] = $vars['new_sub_domain_name']; + unset($vars['new_sub_domain_name']); + unset($vars['new_sub_domain_path']); + unset($vars['new_sub_domain_type']); + } + $dom->unlock(); + } else { + list($d, $s) = explode(';', $vars['sub_domain']); + if ($d != $vars['domain']) { + $msg->raise('ERROR', 'm_oci', 'sub_domai %s doesn\'t belong to domain %s', + array($vars['sub_domain'], $vars['domain'])); + } + $vars['sub_domain'] = $s; + } + + // Add database if necessary. + if ($vars['db_name'] == '*new*') { + $login = $mem->user['login']; + if(!$mysql->add_db("${login}_${vars['new_db_name']}")) { + $msg->raise('ERROR', '....'); + return ''; + } else { + $vars['db_name'] = "${login}_${vars['new_db_name']}"; + unset($vars['new_db_name']); + } + } + + // Fill out variables to pass on to the install hooks. + $db->query("SELECT dbu.name,dbu.password, dbs.host FROM dbusers dbu, db_servers dbs, membres m WHERE dbu.uid= ? and enable='ACTIVATED' and dbs.id=m.db_server_id and m.uid= ? and dbu.name = ?;", array($cuid, $cuid, $vars['db_name'])); + if (!$db->num_rows()) { + $msg->raise('ERROR', 'm_oci', _('Unable to get database information for user "%s", db "%s"'), array($cuid, $vars['db_name'])); + return ''; + } + $db->next_record(); + $vars['db_user'] = $db->Record['name']; + $vars['db_pass'] = $db->Record['password']; + $vars['db_host'] = $db->Record['host']; + $vars['db_port'] = '3306'; // Seems to be hardcoded in AlternC + + $dom->lock(); + $domain_info = $dom->get_domain_all($vars['domain']); + $dom->unlock(); + $vars['url'] = ($vars['sub_domain']) ? $vars['sub_domain'] . '.' : ''; + $vars['url'] .= $vars['domain']; + $msg->raise('INFO', 'm_oci', 'Domain info: %s', print_r($domain_info, TRUE)); + foreach ($domain_info['sub'] as $delta => $sub_info) { + if($sub_info['name'] != $vars['sub_domain']) { + continue; + } + $vars['path'] = $sub_info['dest']; + } + $login = $mem->user['login']; + $vars['path'] = $L_ALTERNC_HTML . '/' . substr($login, 0, 1) . '/' . $login . $vars['path']; + + // db_user,pass,host,port,name ; url,path + $msg->raise('INFO', 'm_oci', 'Invoking hook_oci_install for app %s with args %s', + array($app, print_r($vars, TRUE))); + $vals = $hooks->invoke('hook_oci_install', array($app, $vars)); + foreach ($vals as $v) { + $r .= $v; + } + $vals = $hooks->invoke('hook_oci_post_install', array($app, $hook_vars)); + foreach ($vals as $v) { + $r .= $v; + } + return $r; + } + + /** + * Implements hook_oci_install. + */ + function hook_oci_install($app, $vars) { + if ($app == 'drupal') { + $r .= $this->_install_drupal($app, $vars); + } elseif ($app == 'wordpress') { + $r .= $this->_install_wordpress($app, $vars); + } + return ''; + } + + /** + * Install drupal + */ + private function _install_drupal($app, $vars) { + global $L_ALTERNC_DRUSH_BIN, $msg; + $si_args = array( + '--site-mail' => $vars['drupal_site_mail'], + '--site-name' => $vars['drupal_title'], + '--sites-subdir' => $vars['drupal_site_name'], + '--root' => $vars['path'], + '--account-mail' => $vars['drupal_admin_mail'], + '--account-name' => $vars['drupal_admin_name'], + '--db-prefix' => $vars['db_prefix'], + '--db-url' => "mysql://${vars['db_user']}:${vars['db_pass']}@${vars['db_host']}:${vars['db_port']}/${vars['db_name']}", + ); + $r = ''; + if ($vars['drupal_makefile']) { + $cmd = sprintf("$_ALTERNC_DRUSH_BIN make --concurrency=5 %s %s", + $vars['drupal_makefile'], + $vars['path']); + $msg->raise('INFO', 'm_oci', 'Running command: %s', array($cmd)); + $r .= shell_exec($cmd . ' 2>&1'); + } + if ($vars['drupal_core_version']) { + $version = 'drupal-' . $vars['drupal_core_version']; + $cmd = sprintf("$L_ALTERNC_DRUSH_BIN dl %s %s %s --yes", + escapeshellarg($version), + '--destination=' . escapeshellarg($vars['path']), + '--drupal-project-rename="."' + ); + $msg->raise('INFO', 'm_oci', 'Running command: %s', array($cmd)); + $r .= shell_exec($cmd . ' 2>&1'); + } + + $si_arg = ''; + foreach ($si_args as $name => $value) { + if (!$value) { + continue; + } + $si_arg .= "$name=" . escapeshellarg($value) . ' '; + } + $si_arg .= ' --yes'; // . ' ' . escapeshellarg($vars['drupal_site_name']); + $msg->raise('INFO', 'm_oci', _('Starting Drupal installation with arguments: %s'), array($si_arg)); + // @FIXME This seems to use an insane about of memory and gets OOM killed. + $r .= shell_exec("$L_ALTERNC_DRUSH_BIN si $si_arg 2>&1"); + return $r; + } + + /** + * Install wordpress + */ + private function _install_wordpress($app, $vars) { + global $L_ALTERNC_WP_BIN, $msg; + $dl = array( + '--path' => $vars['path'], + '--locale' => $vars['wordpress_locale'], + ); + $dl_arg = ''; + foreach ($dl as $n => $v) { + if ($v) { + $dl_arg .= " $n=" . escapeshellarg($v); + } + } + $msg->raise('INFO', 'm_oci', 'Running command: %s', + array("$L_ALTERNC_WP_BIN core download $dl_arg")); + $r = shell_exec("$L_ALTERNC_WP_BIN core download $dl_arg 2>&1"); + $cfg = array( + '--path' => $vars['path'], + '--dbname' => $vars['db_name'], + '--dbuser' => $vars['db_user'], + '--dbhost' => $vars['db_host'], + '--dbpass' => $vars['db_pass'], + '--locale' => $vars['wordpress_locale'], + ); + + $cfg_arg = ''; + foreach ($cfg as $n => $v) { + if (!$v) { + continue; + } + $cfg_arg .= ' ' . "$n=" . escapeshellarg($v); + } + $msg->raise('INFO', 'm_oci', 'Running command: %s', + array("$L_ALTERNC_WP_BIN config create $cfg_arg")); + $r .= shell_exec("$L_ALTERNC_WP_BIN config create $cfg_arg 2>&1"); + + $inst = array( + '--path' => $vars['path'], + '--url' => $vars['url'], + '--title' => $vars['wordpress_title'], + '--admin_email' => $vars['wordpress_admin_mail'], + '--admin_name' => $vars['wordpress_admin_name'], + ); + $inst_arg = ''; + foreach ($inst as $n => $v) { + if (!$v) { + continue; + } + $inst_arg .= ' ' . "$n=" . escapeshellarg($v); + } + $msg->raise('INFO', 'm_oci', 'Running command: %s', + array("$L_ALTERNC_WP_BIN core install $inst_arg")); + $r .= shell_exec("$L_ALTERNC_WP_BIN core install $inst_arg 2>&1"); + return $r; + } +}