From bba812fbb5b698ba857089a4eba65a639191c670 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 13 Aug 2021 14:48:24 +0200 Subject: [PATCH] First commit --- LICENSE | 674 ++++++++++++++++++++++++++++++++ README.md | 63 +++ README_fr.md | 66 ++++ check_process | 19 + conf/app.src | 7 + conf/config.php | 58 +++ conf/nginx.conf | 29 ++ conf/php-fpm.conf | 430 ++++++++++++++++++++ doc/.DS_Store | Bin 0 -> 6148 bytes doc/screenshots/screenshots.png | Bin 0 -> 179194 bytes manifest.json | 63 +++ scripts/_common.sh | 9 + scripts/backup | 66 ++++ scripts/change_url | 130 ++++++ scripts/install | 136 +++++++ scripts/remove | 78 ++++ scripts/restore | 104 +++++ scripts/upgrade | 126 ++++++ 18 files changed, 2058 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README_fr.md create mode 100644 check_process create mode 100644 conf/app.src create mode 100644 conf/config.php create mode 100644 conf/nginx.conf create mode 100644 conf/php-fpm.conf create mode 100644 doc/.DS_Store create mode 100644 doc/screenshots/screenshots.png create mode 100644 manifest.json create mode 100644 scripts/_common.sh create mode 100644 scripts/backup create mode 100644 scripts/change_url create mode 100644 scripts/install create mode 100644 scripts/remove create mode 100644 scripts/restore create mode 100644 scripts/upgrade diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9cecc1d --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e86ee1f --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# Easy!appointments for YunoHost + +[![Integration level](https://dash.yunohost.org/integration/ttrss.svg)](https://dash.yunohost.org/appci/app/ttrss) ![](https://ci-apps.yunohost.org/ci/badges/ttrss.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/ttrss.maintain.svg) +[![Install Tiny Tiny RSS with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=ttrss) + +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allow you to install Tiny Tiny RSS quickly and simply on a YunoHost server. +If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to know how to install and enjoy it.* + +## Overview + +Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator. + +**Shipped version:** 1.4.2 + +## Screenshots + +![](https://tt-rss.org/images/ttrss/18.12/1812-shot1.png) + +## Demo + +* [YunoHost demo](https://demo.yunohost.org/ttrss/) + +## Configuration + +## Documentation + + * Official documentation: https://git.tt-rss.org/git/tt-rss/wiki + * YunoHost documentation: https://yunohost.org/en/app_ttrss + +## YunoHost specific features + +#### Multi-users support + +#### Supported architectures + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/ttrss.svg)](https://ci-apps.yunohost.org/ci/apps/ttrss/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/ttrss.svg)](https://ci-apps-arm.yunohost.org/ci/apps/ttrss/) + +## Limitations + +## Additionnal informations + +## Links + + * Report a bug: https://github.com/YunoHost-Apps/ttrss_ynh/issues + * Tiny Tiny RSS website: https://tt-rss.org/ + * Tiny Tiny RSS repository: https://git.tt-rss.org/git/tt-rss + * YunoHost website: https://yunohost.org/ + +--- + +## Developers infos + +Please do your pull request to the [testing branch](https://github.com/YunoHost-Apps/ttrss_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/ttrss_ynh/tree/testing --debug +or +sudo yunohost app upgrade ttrss -u https://github.com/YunoHost-Apps/ttrss_ynh/tree/testing --debug +``` diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..272890f --- /dev/null +++ b/README_fr.md @@ -0,0 +1,66 @@ +# Easy!appointments pour YunoHost + +[![Integration level](https://dash.yunohost.org/integration/ttrss.svg)](https://dash.yunohost.org/appci/app/ttrss) ![](https://ci-apps.yunohost.org/ci/badges/ttrss.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/ttrss.maintain.svg) +[![Installer Tiny Tiny RSS avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=ttrss) + +*[Read this readme in english.](./README.md)* + +> *Ce package vous permet d’installer Tiny Tiny RSS rapidement et simplement sur un serveur YunoHost. +Si vous n’avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l’installer.* + +## Vue d’ensemble + +Tiny Tiny RSS est un lecteur et agrégateur de flux d'actualités (RSS/Atom) en ligne gratuit et open source. + +**Version incluse :** 1.4.2 + +## Captures d’écran + +![](https://tt-rss.org/images/ttrss/18.12/1812-shot1.png) + +## Démo + +* [YunoHost demo](https://demo.yunohost.org/ttrss/) + +## Configuration + +## Documentation + +* Documentation officielle : https://git.tt-rss.org/git/tt-rss/wiki +* Documentation YunoHost : https://yunohost.org/fr/app_ttrss + +## Caractéristiques spécifiques YunoHost + +#### Support multi-utilisateurs + +* L’authentification LDAP est-elle prise en charge ? **Oui** +* L’application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** + +#### Architectures supportées + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/ttrss.svg)](https://ci-apps.yunohost.org/ci/apps/ttrss/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/ttrss.svg)](https://ci-apps-arm.yunohost.org/ci/apps/ttrss/) + +## Limitations + +## Informations additionnelles + +## Liens + +* Signaler un bug : https://github.com/YunoHost-Apps/ttrss_ynh/issues +* Site web de Tiny Tiny RSS : https://tt-rss.org/ +* Dépôt de l’application principale : https://git.tt-rss.org/git/tt-rss +* Site web YunoHost : https://yunohost.org/ + +--- + +## Developers infos + +Merci de faire vos pull request sur la [testing branch](https://github.com/YunoHost-Apps/ttrss_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/ttrss_ynh/tree/testing --debug +ou +sudo yunohost app upgrade ttrss -u https://github.com/YunoHost-Apps/ttrss_ynh/tree/testing --debug +``` diff --git a/check_process b/check_process new file mode 100644 index 0000000..d550696 --- /dev/null +++ b/check_process @@ -0,0 +1,19 @@ +;; Test complet + ; Manifest + domain="domain.tld" + path="/path" + ; Checks + pkg_linter=1 + setup_sub_dir=1 + setup_root=1 + setup_nourl=0 + setup_private=0 + setup_public=0 + upgrade=1 + backup_restore=1 + multi_instance=1 + change_url=1 +;;; Options +Email= +Notification=none +;;; Upgrade options diff --git a/conf/app.src b/conf/app.src new file mode 100644 index 0000000..49126c4 --- /dev/null +++ b/conf/app.src @@ -0,0 +1,7 @@ +SOURCE_URL=https://github.com/alextselegidis/easyappointments/releases/download/1.4.1/easyappointments-1.4.1.zip +SOURCE_SUM=d974c069dda5b8b0f6a853b186b917490d13714d33f06db31ccac62f7443ec1c +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=zip +SOURCE_IN_SUBDIR=false +SOURCE_FILENAME= +SOURCE_EXTRACT=true diff --git a/conf/config.php b/conf/config.php new file mode 100644 index 0000000..632a9f6 --- /dev/null +++ b/conf/config.php @@ -0,0 +1,58 @@ + + * @copyright Copyright (c) 2013 - 2020, Alex Tselegidis + * @license http://opensource.org/licenses/GPL-3.0 - GPLv3 + * @link http://easyappointments.org + * @since v1.0.0 + * ---------------------------------------------------------------------------- */ + +/** + * Easy!Appointments Configuration File + * + * Set your installation BASE_URL * without the trailing slash * and the database + * credentials in order to connect to the database. You can enable the DEBUG_MODE + * while developing the application. + * + * Set the default language by changing the LANGUAGE constant. For a full list of + * available languages look at the /application/config/config.php file. + * + * IMPORTANT: + * If you are updating from version 1.0 you will have to create a new "config.php" + * file because the old "configuration.php" is not used anymore. + */ +class Config { + + // ------------------------------------------------------------------------ + // GENERAL SETTINGS + // ------------------------------------------------------------------------ + + const BASE_URL = 'http://__DOMAIN__'; + const LANGUAGE = '__LANGUAGE__'; + const DEBUG_MODE = FALSE; + + // ------------------------------------------------------------------------ + // DATABASE SETTINGS + // ------------------------------------------------------------------------ + + const DB_HOST = 'localhost'; + const DB_NAME = '__DB_NAME__'; + const DB_USERNAME = '__DB_NAME__'; + const DB_PASSWORD = '__DB_PWD__'; + + // ------------------------------------------------------------------------ + // GOOGLE CALENDAR SYNC + // ------------------------------------------------------------------------ + + const GOOGLE_SYNC_FEATURE = FALSE; // Enter TRUE or FALSE + const GOOGLE_PRODUCT_NAME = ''; + const GOOGLE_CLIENT_ID = ''; + const GOOGLE_CLIENT_SECRET = ''; + const GOOGLE_API_KEY = ''; +} + +/* End of file config.php */ +/* Location: ./config.php */ diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..1ea0a34 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,29 @@ +location / { + + # Path to source + alias __FINALPATH__/; + + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + index index.php index.html; + + #client_max_body_size 50M; + + try_files $uri $uri/ index.php; + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param SCRIPT_FILENAME $request_filename; + } + + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; +} diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf new file mode 100644 index 0000000..ab1a471 --- /dev/null +++ b/conf/php-fpm.conf @@ -0,0 +1,430 @@ +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[__NAMETOCHANGE__] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or /usr) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = __USER__ +group = __USER__ + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock + +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. +; Default Values: user and group are set as the running user +; mode is set to 0660 +listen.owner = www-data +listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients = 127.0.0.1 + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 5 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 +pm.start_servers = 2 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 1 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 3 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following informations: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/share/php/7.0/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +;access.log = log/$pool.access.log + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{miliseconds}d +; - %{mili}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some exemples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +;slowlog = log/$pool.log.slow + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +request_terminate_timeout = 1d + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +chdir = __FINALPATH__ + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environement, this can cause some delay in the page +; process time (several ms). +; Default Value: no +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +;php_admin_value[error_log] = /var/log/fpm-php.www.log +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M + +; Common values to change to increase file upload limit +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off + +; Other common parameters +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +; php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On diff --git a/doc/.DS_Store b/doc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..65b48d4b88db79cfe1b01c7bc13eb510e0e3fd73 GIT binary patch literal 6148 zcmeHK!EV$r5FKw98n+b+QV*@f!4ijF_7K$4UZbV$2?<0hdZ4f*#9|{wc9mqiht*0^ zKcFAbUJLyX;3N1E?#$R;P_^x~qR11C-();9PM#w>1_0I{<<9^@00>YCI~=RTV@%lS|bvCY#vr=am@hdwni@J%TpRBXc zeeiHG;7fdkKjJIzlc63bP1=m=ep(H}CrOdZEUgZUycr%ywO7g$sa{nt(?(YBDEL6@ z5(BKAW^W5Q9)znev})2q$;#BTHI5DomFsa|k5pcpcvsxmuhV9Tb@F5_OE_T>jwCTXi$XLgX%-jiunbFZN zOgOOEqHjF|o`LHOEZEzS_W!-x&;Qqx{GDgOGw@$Az`DE1ZXaLC?X7b!M|-V6{fJ6J pajnHaDQK9j7-MNGUPCp4enAFe?69?n9u)s0U}*4-XW&j5_zlEJWjX)= literal 0 HcmV?d00001 diff --git a/doc/screenshots/screenshots.png b/doc/screenshots/screenshots.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0ab198758b73db0d9a3aa3d668c64d01f0f430 GIT binary patch literal 179194 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ⅆ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

OE0 zRf|`{8YADi%uf+1%#d(}BUn`c=KmeXJLNuGV|_U2A(O5Q-~S(^?|X{|3;n&07?6h` z{o(<(sRPz%8l8=Y>BD2Nl?G$2DzrK-1L(x~k*xn}OYcE`sfJX#u(dlMqS(Rz5w0f? zeK=DC-u~_5WO4+7CT=!75%e0TI%zn1?r{Qq)fNVW-ENH(4$SLTv*EDK&fEw{#-2Ci z|7v#Gb^6!ix_xSw;D=he9(y^O-mGSZz-&OB)|NKR(XOc}2M4CxCBN0MZDY^uU)T19 zdZdD{=Q02CZWo~Ex-^5^sbC34tjkBfx(N$(3jn$T$XNmGd;kD=Y8{(nOScS%DPUN# zN4pks<(!;Hynpi+UT%%@hwLgL=Ki+zz>C-;kjcHAt@e^zI4Si@cR}7L zlP>`uxcdAe_4u{-Y9{hI#kGrGf45%q>w6)x6JMR&3XP!9<2khZel>JMJLU;FT?q*{ zorLZQKJSsg{0i%<3ZPjpXMt-{vwHpoW3>kr032#V(@#oIo@n9h-}eS#u>ib0(-pbZ zW(oMqKWa;f)Oex&%*69y{Z)cc#tXk+?w`1v~(-wEnexIy%!1ocCv>n0)zcIMXOL zux*k2BtfmCPI6LO21=Dze9V!BdiDhe~7Ra%m~D^&;Di5oLix|4Y*9MSX?f-c<1r| E0N$}mj{pDw literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..a5da425 --- /dev/null +++ b/manifest.json @@ -0,0 +1,63 @@ +{ + "name": "Easy!Appointments", + "id": "easyappointments", + "packaging_format": 1, + "description": { + "en": "", + "fr": "" + }, + "version": "1.4.2~ynh1", + "url": "https://easyappointments.org/", + "upstream": { + "license": "GPL-3.0-only", + "website": "https://easyappointments.org/", + "demo": "https://demo.easyappointments.org/", + "admindoc": "https://easyappointments.org/docs.html#1.4.1/readme.md", + "userdoc": "https://yunohost.org/apps", + "code": "https://github.com/alextselegidis/easyappointments" + }, + "license": "GPL-3.0-only", + "maintainer": { + "name": "", + "email": "" + }, + "requirements": { + "yunohost": ">= 4.2.4" + }, + "multi_instance": true, + "services": [ + "nginx", + "php7.3-fpm", + "mysql" + ], + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain", + "example": "domain.org" + }, + { + "name": "path", + "type": "path", + "example": "/", + "default": "/" + }, + { + "name": "is_public", + "type": "boolean", + "default": true + }, + { + "name": "language", + "type": "string", + "ask": { + "en": "Choose the application language", + "fr": "Choisissez la langue de l'application" + }, + "choices": ["fr", "en"], + "default": "fr" + } + ] + } +} diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..96a30b5 --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +YNH_PHP_VERSION="7.3" + +extra_php_dependencies="php${YNH_PHP_VERSION}-curl" diff --git a/scripts/backup b/scripts/backup new file mode 100644 index 0000000..b93a5ca --- /dev/null +++ b/scripts/backup @@ -0,0 +1,66 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." + +app=$YNH_APP_INSTANCE_NAME + +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + +#================================================= +# BACKUP THE APP MAIN DIR +#================================================= + +ynh_backup --src_path="$final_path" + +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# BACKUP THE PHP-FPM CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +#================================================= +# BACKUP THE MYSQL DATABASE +#================================================= +ynh_print_info --message="Backing up the MySQL database..." + +ynh_mysql_dump_db --database="$db_name" > db.sql + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..73fe664 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,130 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# SPECIFIC MODIFICATIONS +#================================================= +ynh_script_progression --message="Configuring $app..." --weight=1 + +domain="$new_domain" +path_url="$new_path" + +ynh_backup_if_checksum_is_different --file="$final_path/config.php" + +cp ../conf/config.php "$final_path/config.php" + +# Change domain name in config.php +ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/config.php" +ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/config.php" +ynh_replace_string --match_string="__DOMAIN_PATH__" --replace_string="https://$domain$path_url" --target_file="$final_path/config.php" + +# Recalculate and store the config file checksum into the app settings +ynh_store_file_checksum --file="$final_path/config.php" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=2 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install new file mode 100644 index 0000000..27794fc --- /dev/null +++ b/scripts/install @@ -0,0 +1,136 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= + +domain=$YNH_APP_ARG_DOMAIN +path_url=$YNH_APP_ARG_PATH +language=$YNH_APP_ARG_LANGUAGE +is_public=$YNH_APP_ARG_IS_PUBLIC + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." --weight=1 + +final_path=/var/www/$app +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" + +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url + +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --weight=1 + +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url +ynh_app_setting_set --app=$app --key=language --value=$language + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=2 + +# Create a system user +ynh_system_user_create --username=$app --home_dir=$final_path + +#================================================= +# CREATE A MYSQL DATABASE +#================================================= +ynh_script_progression --message="Creating a MySQL database..." --weight=2 + +db_name=$(ynh_sanitize_dbid --db_name=$app) +db_user=$db_name +ynh_app_setting_set --app=$app --key=db_name --value=$db_name +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=7 + +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" +chmod -R 770 "$final_path/storage" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --package="$extra_php_dependencies" +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# SPECIFIC SETUP +#================================================= +# ADD A CONFIGURATION +#================================================= +ynh_script_progression --message="Adding a configuration file..." --weight=1 + +domain_path=https://$domain${path_url:1} + +ynh_add_config --template="../conf/config.php" --destination="$final_path/config.php" + +chmod 400 "$final_path/config.php" +chown $app:$app "$final_path/config.php" + +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." --weight=1 + +# Make app public if necessary +if [ $is_public -eq 1 ] +then + ynh_permission_update --permission="main" --add="visitors" +fi +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=2 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove new file mode 100644 index 0000000..e841a20 --- /dev/null +++ b/scripts/remove @@ -0,0 +1,78 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=3 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=2 + +# Remove the dedicated systemd config +ynh_remove_systemd_config + +#================================================= +# REMOVE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Removing the MySQL database..." --weight=4 + +# Remove a database if it exists, along with the associated user +ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --weight=4 + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 + +# Remove the dedicated NGINX config +ynh_remove_nginx_config + +#================================================= +# REMOVE PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=3 + +# Remove the dedicated PHP-FPM config +ynh_remove_fpm_config + +#================================================= +# GENERIC FINALIZATION +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 + +# Delete a system user +ynh_system_user_delete --username=$app + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore new file mode 100644 index 0000000..3246183 --- /dev/null +++ b/scripts/restore @@ -0,0 +1,104 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --weight=2 + +ynh_webpath_available --domain=$domain --path_url=$path_url \ + || ynh_die --message="Path not available: ${domain}${path_url}" +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " + +#================================================= +# STANDARD RESTORATION STEPS +#================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the NGINX configuration..." + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=3 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir=$final_path + +#================================================= +# RESTORE THE APP MAIN DIR +#================================================= +ynh_script_progression --message="Restoring the app main directory..." --weight=2 + +ynh_restore_file --origin_path="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# RESTORE THE PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the PHP-FPM configuration..." --weight=50 + +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +ynh_add_fpm_config --package="$extra_php_dependencies" + +#================================================= +# RESTORE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Restoring the MySQL database..." --weight=5 + +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=2 + +ynh_systemd_action --service_name=php$phpversion-fpm --action=reload +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..750d213 --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,126 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# CHECK VERSION +#================================================= +ynh_script_progression --message="Checking version..." + +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up $app before upgrading (may take a while)..." --weight=7 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=2 + +# If final_path doesn't exist, create it +if [ -z "$final_path" ]; then + final_path=/var/www/$app + ynh_app_setting_set --app=$app --key=final_path --value=$final_path +fi + +# If db_name doesn't exist, create it +if [ -z "$db_name" ]; then + db_name=$(ynh_sanitize_dbid --db_name=$app) + ynh_app_setting_set --app=$app --key=db_name --value=$db_name +fi + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir=$final_path + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= + +if [ "$upgrade_type" == "UPGRADE_APP" ] + +then + ynh_script_progression --message="Upgrading source files..." --weight=1 + + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" --kepp="$final_path/config.php" +fi + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" +chmod -R 770 "$final_path/storage" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --package="$extra_php_dependencies" + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --weight=2 + +# Create a dedicated systemd config +ynh_add_systemd_config + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=2 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --last