From 07ea3d9449f81418605c90805c195d9e3f98a5ff Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Mar 2022 11:33:36 +0200 Subject: [PATCH] First commit --- LICENSE | 674 +++++++++++++++++++++++++++++ README.md | 84 ++++ README_fr.md | 66 +++ check_process | 27 ++ conf/app.src | 7 + conf/config.toml | 16 + conf/nginx.conf | 22 + conf/systemd.service | 14 + config_panel.toml.example | 295 +++++++++++++ doc/.gitkeep | 0 doc/DESCRIPTION.md | 9 + doc/DISCLAIMER.md | 12 + doc/screenshots/.gitkeep | 0 doc/screenshots/screenshot.png | Bin 0 -> 126229 bytes manifest.json | 53 +++ scripts/_common.sh | 20 + scripts/backup | 69 +++ scripts/change_url | 124 ++++++ scripts/config | 102 +++++ scripts/install | 178 ++++++++ scripts/remove | 92 ++++ scripts/restore | 128 ++++++ scripts/upgrade | 166 +++++++ sources/extra_files/app/.gitignore | 2 + sources/patches/.gitignore | 2 + 25 files changed, 2162 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.toml create mode 100644 conf/nginx.conf create mode 100644 conf/systemd.service create mode 100644 config_panel.toml.example create mode 100644 doc/.gitkeep create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/.gitkeep create mode 100644 doc/screenshots/screenshot.png create mode 100644 manifest.json create mode 100644 scripts/_common.sh create mode 100755 scripts/backup create mode 100644 scripts/change_url create mode 100644 scripts/config create mode 100755 scripts/install create mode 100755 scripts/remove create mode 100755 scripts/restore create mode 100644 scripts/upgrade create mode 100644 sources/extra_files/app/.gitignore create mode 100644 sources/patches/.gitignore diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /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. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..820e437 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ + +# Packaging an app, starting from this example + +- Copy this app before working on it, using the ['Use this template'](https://github.com/YunoHost/example_ynh/generate) button on the Github repo. +- Edit the `manifest.json` with app specific info. +- Edit the `install`, `upgrade`, `remove`, `backup`, and `restore` scripts, and any relevant conf files in `conf/`. + - Using the [script helpers documentation.](https://yunohost.org/packaging_apps_helpers) +- Add a `LICENSE` file for the package. +- Edit `doc/DISCLAIMER*.md` +- The `README.md` files are to be automatically generated by https://github.com/YunoHost/apps/tree/master/tools/README-generator + + +--- + + + +# Example app for YunoHost + +[![Integration level](https://dash.yunohost.org/integration/example.svg)](https://dash.yunohost.org/appci/app/example) ![](https://ci-apps.yunohost.org/ci/badges/example.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/example.maintain.svg) +[![Install example with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=example) + +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install example quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* + +## Overview + +Explain in *a few (10~15) words* the purpose of the app or what it actually does (it is meant to give a rough idea to users browsing a catalog of 100+ apps) + +**Shipped version:** 1.0~ynh1 + +**Demo:** https://demo.example.com + + +## Screenshots + + + ![](./doc/screenshots/example.jpg) + + + + +## Disclaimers / important information + +* Any known limitations, constrains or stuff not working, such as (but not limited to): + * requiring a full dedicated domain ? + * architectures not supported ? + * not-working single-sign on or LDAP integration ? + * the app requires an important amount of RAM / disk / .. to install or to work properly + * etc... + +* Other infos that people should be aware of, such as: + * any specific step to perform after installing (such as manually finishing the install, specific admin credentials, ...) + * how to configure / administrate the application if it ain't obvious + * upgrade process / specificities / things to be aware of ? + * security considerations ? + + + +## Documentation and resources + +* Official app website: https://example.com +* Official user documentation: https://yunohost.org/apps +* Official admin documentation: https://yunohost.org/packaging_apps +* Upstream app code repository: https://some.forge.com/example/example +* YunoHost documentation for this app: https://yunohost.org/app_example +* Report a bug: https://github.com/YunoHost-Apps/example_ynh/issues + +## Developer info + +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/example_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/example_ynh/tree/testing --debug +or +sudo yunohost app upgrade example -u https://github.com/YunoHost-Apps/example_ynh/tree/testing --debug +``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..d856bf9 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,66 @@ +# Example app pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/example.svg)](https://dash.yunohost.org/appci/app/example) ![](https://ci-apps.yunohost.org/ci/badges/example.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/example.maintain.svg) +[![Installer example avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=example) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install example quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* + +## Vue d'ensemble + +Expliquez en *quelques* (10~15) mots l'utilité de l'app ou ce qu'elle fait (l'objectif est de donner une idée grossière pour des utilisateurs qui naviguent dans un catalogue de 100+ apps) + +**Version incluse:** 1.0~ynh1 + +**Démo:** https://demo.example.com + + +## Captures d'écran + + + ![](./doc/screenshots/example.jpg) + + + + +## Avertissements / informations importantes + +* Any known limitations, constrains or stuff not working, such as (but not limited to): + * requiring a full dedicated domain ? + * architectures not supported ? + * not-working single-sign on or LDAP integration ? + * the app requires an important amount of RAM / disk / .. to install or to work properly + * etc... + +* Other infos that people should be aware of, such as: + * any specific step to perform after installing (such as manually finishing the install, specific admin credentials, ...) + * how to configure / administrate the application if it ain't obvious + * upgrade process / specificities / things to be aware of ? + * security considerations ? + + + +## Documentations et ressources + +* Site official de l'app : https://example.com +* Documentation officielle utilisateur: https://yunohost.org/apps +* Documentation officielle de l'admin: https://yunohost.org/packaging_apps +* Dépôt de code officiel de l'app: https://some.forge.com/example/example +* Documentation YunoHost pour cette app: https://yunohost.org/app_example +* Signaler un bug: https://github.com/YunoHost-Apps/example_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/example_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/example_ynh/tree/testing --debug +or +sudo yunohost app upgrade example -u https://github.com/YunoHost-Apps/example_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/check_process b/check_process new file mode 100644 index 0000000..024f000 --- /dev/null +++ b/check_process @@ -0,0 +1,27 @@ +;; Test complet + ; Manifest + domain="domain.tld" + path="/path" + is_public=1 + language="fr" + admin="john" + password="1Strong-Password" + ; Checks + pkg_linter=1 + setup_sub_dir=0 + setup_root=1 + setup_nourl=0 + setup_private=1 + setup_public=1 + upgrade=1 + #upgrade=1 from_commit=CommitHash + backup_restore=1 + multi_instance=1 + change_url=1 +;;; Options +Email= +Notification=none +;;; Upgrade options + ; commit=CommitHash + name=Name and date of the commit. + manifest_arg=domain=DOMAIN&path=PATH&is_public=1&language=fr&admin=USER&password=pass&port=666& diff --git a/conf/app.src b/conf/app.src new file mode 100644 index 0000000..f043a34 --- /dev/null +++ b/conf/app.src @@ -0,0 +1,7 @@ +SOURCE_URL=https://github.com/knadh/listmonk/releases/download/v2.1.0/listmonk_2.1.0_linux_amd64.tar.gz +SOURCE_SUM=461c93f0905f1766da659be2919e196927b5fbcc77596a06e1405c57c2f6c8b3 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tar.gz +SOURCE_IN_SUBDIR=false +SOURCE_FILENAME= +SOURCE_EXTRACT=true diff --git a/conf/config.toml b/conf/config.toml new file mode 100644 index 0000000..e30cec2 --- /dev/null +++ b/conf/config.toml @@ -0,0 +1,16 @@ +[app] +address = "127.0.0.1:__PORT__" +admin_username = "__ADMIN__" +admin_password = "__PASSWORD__" + +# Database. +[db] +host = "localhost" +port = 5432 +user = "__DB_USER__" +password = "__DB_PWD__" +database = "__DB_NAME__" +ssl_mode = "disable" +max_open = 25 +max_idle = 25 +max_lifetime = "300s" \ No newline at end of file diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..a5202f4 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,22 @@ +location / { + + proxy_pass http://127.0.0.1:__PORT__/; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; + + proxy_http_version 1.1; + proxy_set_header Connection "upgrade"; + proxy_set_header Upgrade $http_upgrade; + + # setup for image upload + client_max_body_size 256M; + proxy_max_temp_file_size 1024M; + + proxy_read_timeout 300; + proxy_connect_timeout 300; + +} diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 0000000..755a573 --- /dev/null +++ b/conf/systemd.service @@ -0,0 +1,14 @@ +[Unit] +Description=Listmonk +Documentation=https://listmonk.app/docs/ + +[Service] +Type=simple +User=__APP__ +Group=__APP__ +WorkingDirectory=__FINALPATH__/ +ExecStart=__FINALPATH__/listmonk +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/config_panel.toml.example b/config_panel.toml.example new file mode 100644 index 0000000..c6bccd8 --- /dev/null +++ b/config_panel.toml.example @@ -0,0 +1,295 @@ + +## Config panel are available from webadmin > Apps > YOUR_APP > Config Panel Button +## Those panels let user configure some params on their apps using a friendly interface, +## and remove the need to manually edit files from the command line. + +## From a packager perspective, this .toml is coupled to the scripts/config script, +## which may be used to define custom getters/setters. However, most use cases +## should be covered automagically by the core, thus it may not be necessary +## to define a scripts/config at all! + +## ----------------------------------------------------------------------------- +## IMPORTANT: In accordance with YunoHost's spirit, please keep things simple and +## do not overwhelm the admin with tons of misunderstandable or advanced settings. +## ----------------------------------------------------------------------------- + +## The top level describe the entire config panels screen. + +## The version is a required property. +## Here a small reminder to associate config panel version with YunoHost version +## | Config | YNH | Config panel small change log | +## | ------ | --- | ------------------------------------------------------- | +## | 0.1 | 3.x | 0.1 config script not compatible with YNH >= 4.3 | +## | 1.0 | 4.3.x | The new config panel system with 'bind' property | +version = "1.0" + +## (optional) i18n property let you internationalize questions, however this feature +## is only available in core configuration panel (like yunohost domain config). +## So in app config panel this key is ignored for now, but you can internationalize +## by using a lang dictionary (see property name bellow) +# i18n = "prefix_translation_key" + +################################################################################ +#### ABOUT PANELS +################################################################################ + +## The next level describes web admin panels +## You have to choose an ID for each panel, in this example the ID is "main" +## Keep in mind this ID will be used in CLI to refer to your question, so choose +## something short and meaningfull. +## In the webadmin, each panel corresponds to a distinct tab / form +[main] + +## Define the label for your panel +## Internationalization works similarly to the 'description' and 'ask' questions in the manifest +# name.en = "Main configuration" +# name.fr = "Configuration principale" + +## (optional) If you need to trigger a service reload-or-restart after the user +## change a question in this panel, you can add your service in the list. +services = ["__APP__"] +# or services = ["nginx", "__APP__"] to also reload-or-restart nginx + +## (optional) This help properties is a short help displayed on the same line +## than the panel title but not displayed in the tab. +# help = "" + + ############################################################################ + #### ABOUT SECTIONS + ############################################################################ + + ## A panel is composed of one or several sections. + ## + ## Sections are meant to group questions together when they correspond to + ## a same subtopic. This impacts the rendering in terms of CLI prompts + ## and HTML forms + ## + ## You should choose an ID for your section, and prefix it with the panel ID + ## (Be sure to not make a typo in the panel ID, which would implicitly create + ## an other entire panel) + ## + ## We use the context of pepettes_ynh as an example, + ## which is a simple donation form app written in python, + ## and for which the admin will want to edit the configuration + [main.customization] + + ## (optional) Defining a proper title for sections is not mandatory + ## and depends on the exact rendering you're aiming for the CLI / webadmin + name = "" + + ## (optional) This help properties is a short help displayed on the same line + ## than the section title, meant to provide additional details + # help = "" + + ## (optional) As for panel, you can specify to trigger a service + ## reload-or-restart after the user change a question in this section. + ## This property is added to the panel property, it doesn't deactivate it. + ## So no need to replicate, the service list from panel services property. + # services = [] + + ## (optional) By default all questions are optionals, but you can specify a + ## default behaviour for question in the section + optional = false + + ## (optional) It's also possible with the 'visible' property to only + ## display the section depending on the user's answers to previous questions. + ## + ## Be careful that the 'visible' property should only refer to **previous** questions + ## Hence, it should not make sense to have a "visible" property on the very first section. + ## + ## Also, keep in mind that this feature only works in the webadmin and not in CLI + ## (therefore a user could be prompted in CLI for a question that may not be relevant) + # visible = true + + ######################################################################## + #### ABOUT QUESTIONS + ######################################################################## + + ## A section is compound of one or several questions. + + ## --------------------------------------------------------------------- + ## IMPORTANT: as for panel and section you have to choose an ID, but this + ## one should be unique in all this document, even if the question is in + ## an other panel. + ## --------------------------------------------------------------------- + + ## You can use same questions types and properties than in manifest.yml + ## install part. However, in YNH 4.3, a lot of change has been made to + ## extend availables questions types list. + ## See: TODO DOC LINK + + [main.customization.project_name] + + ## (required) The ask property is equivalent to the ask property in + ## the manifest. However, in config panels, questions are displayed on the + ## left side and therefore have less space to be rendered. Therefore, + ## it is better to use a short question, and use the "help" property to + ## provide additional details if necessary. + ask.en = "Name of the project" + + ## (required) The type property indicates how the question should be + ## displayed, validated and managed. Some types have specific properties. + ## + ## Types available: string, boolean, number, range, text, password, path + ## email, url, date, time, color, select, domain, user, tags, file. + ## + ## For a complete list with specific properties, see: TODO DOC LINK + type = "string" + + ######################################################################## + #### ABOUT THE BIND PROPERTY + ######################################################################## + + ## (recommended) 'bind' property is a powerful feature that let you + ## configure how and where the data will be read, validated and written. + + ## By default, 'bind property is in "settings" mode, it means it will + ## **only** read and write the value in application settings file. + ## bind = "settings" + + ## However, settings usually correspond to key/values in actual app configurations + ## Hence, a more useful mode is to have bind = ":FILENAME". In that case, YunoHost + ## will automagically find a line with "KEY=VALUE" in FILENAME + ## (with the adequate separator between KEY and VALUE) + ## + ## YunoHost will then use this value for the read/get operation. + ## During write/set operations, YunoHost will overwrite the value + ## in **both** FILENAME and in the app's settings.yml + + ## Configuration file format supported: yaml, toml, json, ini, env, php, + ## python. The feature probably works with others formats, but should be tested carefully. + + ## Note that this feature only works with relatively simple cases + ## such as `KEY: VALUE`, but won't properly work with + ## complex data structures like multilin array/lists or dictionnaries. + ## It also doesn't work with XML format, custom config function call, php define(), ... + + ## More info on TODO + # bind = ":/var/www/__APP__/settings.py" + + + ## By default, bind = ":FILENAME" will use the question ID as KEY + ## ... but the question ID may sometime not be the exact KEY name in the configuration file. + ## + ## In particular, in pepettes, the python variable is 'name' and not 'project_name' + ## (c.f. https://github.com/YunoHost-Apps/pepettes_ynh/blob/5cc2d3ffd6529cc7356ff93af92dbb6785c3ab9a/conf/settings.py##L11 ) + ## + ## In that case, the key name can be specified before the column ':' + + bind = "name:/var/www/__APP__/settings.py" + + ## --------------------------------------------------------------------- + ## IMPORTANT: other 'bind' mode exists: + ## + ## bind = "FILENAME" (with no column character before FILENAME) + ## may be used to bind to the **entire file content** (instead of a single KEY/VALUE) + ## This could be used to expose an entire configuration file, or binary files such as images + ## For example: + ## bind = "/var/www/__APP__/img/logo.png" + ## + ## bind = "null" can be used to disable reading / writing in settings. + ## This creates sort of a "virtual" or "ephemeral" question which is not related to any actual setting + ## In this mode, you are expected to define custom getter/setters/validators in scripts/config: + ## + ## getter: get__QUESTIONID() + ## setter: set__QUESTIONID() + ## validator: validate__QUESTIONID() + ## + ## You can also specify a common getter / setter / validator, with the + ## function 'bind' mode, for example here it will try to run + ## get__array_settings() first. + # bind = "array_settings()" + ## --------------------------------------------------------------------- + + ## --------------------------------------------------------------------- + ## IMPORTANT: with the exception of bind=null questions, + ## question IDs should almost **always** correspond to an app setting + ## initialized / reused during install/upgrade. + ## Not doing so may result in inconsistencies between the config panel mechanism + ## and the use of ynh_add_config + ## --------------------------------------------------------------------- + + ######################################################################## + #### OTHER GENERIC PROPERTY FOR QUESTIONS + ######################################################################## + + ## (optional) An help text for the question + help = "Fill the name of the project which will received donation" + + ## (optional) An example display as placeholder in web form + # example = "YunoHost" + + ## (optional) set to true in order to redact the value in operation logs + # redact = false + + ## (optional) A validation pattern + ## --------------------------------------------------------------------- + ## IMPORTANT: your pattern should be between simple quote, not double. + ## --------------------------------------------------------------------- + pattern.regexp = '^\w{3,30}$' + pattern.error = "The name should be at least 3 chars and less than 30 chars. Alphanumeric chars are accepted" + + ## Note: visible and optional properties are also available for questions + + + [main.customization.contact_url] + ask = "Contact url" + type = "url" + example = "mailto: contact@example.org" + help = "mailto: accepted" + pattern.regexp = '^mailto:[^@]+@[^@]+|https://$' + pattern.error = "Should be https or mailto:" + bind = ":/var/www/__APP__/settings.py" + + [main.customization.logo] + ask = "Logo" + type = "file" + accept = ".png" + help = "Fill with an already resized logo" + bind = "__FINALPATH__/img/logo.png" + + [main.customization.favicon] + ask = "Favicon" + type = "file" + accept = ".png" + help = "Fill with an already sized favicon" + bind = "__FINALPATH__/img/favicon.png" + + + [main.stripe] + name = "Stripe general info" + optional = false + + # The next alert is overwrited with a getter from the config script + [main.stripe.amount] + ask = "Donation in the month : XX € + type = "alert" + style = "success" + + [main.stripe.publishable_key] + ask = "Publishable key" + type = "string" + redact = true + help = "Indicate here the stripe publishable key" + bind = ":/var/www/__APP__/settings.py" + + [main.stripe.secret_key] + ask = "Secret key" + type = "string" + redact = true + help = "Indicate here the stripe secret key" + bind = ":/var/www/__APP__/settings.py" + + [main.stripe.prices] + ask = "Prices ID" + type = "tags" + help = """\ + Indicates here the prices ID of donation products you created in stripe interfaces. \ + Go on [Stripe products](https://dashboard.stripe.com/products) to create those donation products. \ + Fill it tag with 'FREQUENCY/CURRENCY/PRICE_ID' \ + FREQUENCY: 'one_time' or 'recuring' \ + CURRENCY: 'EUR' or 'USD' \ + PRICE_ID: ID from stripe interfaces starting with 'price_' \ + """ + pattern.regexp = '^(one_time|recuring)/(EUR|USD)/price_.*$' + pattern.error = "Please respect the format describe in help text for each price ID" diff --git a/doc/.gitkeep b/doc/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..0836ef0 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1,9 @@ +listmonk is a standalone, self-hosted, newsletter and mailing list manager. It is fast, feature-rich, and packed into a single binary. It uses a PostgreSQL (⩾ v9.4) database as its data store. + +### Features + +- Ut enim ad minim veniam, quis nostrud exercitation ullamco ; +- Laboris nisi ut aliquip ex ea commodo consequat ; +- Duis aute irure dolor in reprehenderit in voluptate ; +- Velit esse cillum dolore eu fugiat nulla pariatur ; +- Excepteur sint occaecat cupidatat non proident, sunt in culpa." diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..aded581 --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,12 @@ +* Any known limitations, constrains or stuff not working, such as (but not limited to): + * requiring a full dedicated domain ? + * architectures not supported ? + * not-working single-sign on or LDAP integration ? + * the app requires an important amount of RAM / disk / .. to install or to work properly + * etc... + +* Other infos that people should be aware of, such as: + * any specific step to perform after installing (such as manually finishing the install, specific admin credentials, ...) + * how to configure / administrate the application if it ain't obvious + * upgrade process / specificities / things to be aware of ? + * security considerations ? diff --git a/doc/screenshots/.gitkeep b/doc/screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..01b6449616d334d88cd56d96aeea4f0f853ecee9 GIT binary patch literal 126229 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%0D#!P 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 4.3.0" + }, + "multi_instance": true, + "services": [ + "nginx", + "mysql" + ], + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain" + }, + { + "name": "is_public", + "type": "boolean", + "default": true + }, + { + "name": "admin", + "type": "user" + }, + { + "name": "password", + "type": "password" + } + ] + } +} diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..91f698b --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +# dependencies used by the app +pkg_dependencies="postgresql" + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= diff --git a/scripts/backup b/scripts/backup new file mode 100755 index 0000000..5f340bc --- /dev/null +++ b/scripts/backup @@ -0,0 +1,69 @@ +#!/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 +#================================================= + +ynh_clean_setup () { + ### Remove this function if there's nothing to clean before calling the remove script. + true +} +# 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) + +#================================================= +# 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 SYSTEMD +#================================================= + +ynh_backup --src_path="/etc/systemd/system/$app.service" + +#================================================= +# BACKUP THE MYSQL DATABASE +#================================================= +ynh_print_info --message="Backing up the PostgreSQL database..." + +ynh_psql_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..85f4573 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,124 @@ +#!/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..." --time --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +port=$(ynh_app_setting_get --app=$app --key=port) + +#================================================= +# BACKUP BEFORE CHANGE URL 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 +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 + +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 + +#================================================= +# GENERIC FINALISATION +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --time --last diff --git a/scripts/config b/scripts/config new file mode 100644 index 0000000..b9e79f8 --- /dev/null +++ b/scripts/config @@ -0,0 +1,102 @@ +#!/bin/bash +# In simple cases, you don't need a config script. + +# With a simple config_panel.toml, you can write in the app settings, in the +# upstream config file or replace complete files (logo ...) and restart services. + +# The config scripts allows you to go further, to handle specific cases +# (validation of several interdependent fields, specific getter/setter for a value, +# display dynamic informations or choices, pre-loading of config type .cube... ). + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source /usr/share/yunohost/helpers + +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +final_path=$(ynh_app_setting_get $app final_path) + +#================================================= +# SPECIFIC GETTERS FOR TOML SHORT KEY +#================================================= + +get__amount() { + # Here we can imagine to have an API call to stripe to know the amount of donation during a month + local amount = 200 + + # It's possible to change some properties of the question by overriding it: + if [ $amount -gt 100 ] + then + cat << EOF +style: success +value: $amount +ask: + en: A lot of donation this month: **$amount €** +EOF + else + cat << EOF +style: danger +value: $amount +ask: + en: Not so much donation this month: $amount € +EOF + fi +} + +get__prices() { + local prices = "$(grep "DONATION\['" "$final_path/settings.py" | sed -r "s@^DONATION\['([^']*)'\]\['([^']*)'\] = '([^']*)'@\1/\2/\3@g" | sed -z 's/\n/,/g;s/,$/\n/')" + if [ "$prices" == "," ]; + then + # Return YNH_NULL if you prefer to not return a value at all. + echo YNH_NULL + else + echo $prices + fi +} + + +#================================================= +# SPECIFIC VALIDATORS FOR TOML SHORT KEYS +#================================================= +validate__publishable_key() { + + # We can imagine here we test if the key is really a publisheable key + (is_secret_key $publishable_key) && + echo 'This key seems to be a secret key' +} + +#================================================= +# SPECIFIC SETTERS FOR TOML SHORT KEYS +#================================================= +set__prices() { + + #--------------------------------------------- + # IMPORTANT: setter are trigger only if a change is detected + #--------------------------------------------- + for price in $(echo $prices | sed "s/,/ /"); do + frequency=$(echo $price | cut -d/ -f1) + currency=$(echo $price | cut -d/ -f2) + price_id=$(echo $price | cut -d/ -f3) + sed "d/DONATION\['$frequency'\]\['$currency'\]" "$final_path/settings.py" + + echo "DONATION['$frequency']['$currency'] = '$price_id'" >> "$final_path/settings.py" + done + + #--------------------------------------------- + # IMPORTANT: to be able to upgrade properly, you have to saved the value in settings too + #--------------------------------------------- + ynh_app_setting_set $app prices $prices +} + +#================================================= +# GENERIC FINALIZATION +#================================================= +ynh_app_config_run $1 diff --git a/scripts/install b/scripts/install new file mode 100755 index 0000000..c0b48e9 --- /dev/null +++ b/scripts/install @@ -0,0 +1,178 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + ### Remove this function if there's nothing to clean before calling the remove script. + true +} +# 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="/" +is_public=$YNH_APP_ARG_IS_PUBLIC +admin=$YNH_APP_ARG_ADMIN +password=$YNH_APP_ARG_PASSWORD + +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=admin --value=$admin + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# FIND AND OPEN A PORT +#================================================= +ynh_script_progression --message="Finding an available port..." --weight=1 + +# Find an available port +port=$(ynh_find_port --port=8095) +ynh_app_setting_set --app=$app --key=port --value=$port + +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=12 + +ynh_exec_warn_less ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=1 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + +#================================================= +# CREATE A MYSQL DATABASE +#================================================= +ynh_script_progression --message="Creating a PostgreSQL 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_psql_test_if_first_run +ynh_psql_setup_db --db_user=$db_user --db_name=$db_name + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=3 + +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 +x "$final_path/listmonk" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# ADD A CONFIGURATION +#================================================= +ynh_script_progression --message="Adding a configuration file..." --weight=1 + +ynh_add_config --template="../conf/config.toml" --destination="$final_path/config.toml" + +chmod 400 "$final_path/config.toml" +chown $app:$app "$final_path/config.toml" + +#================================================= +# DATABASE CONFIGURATION +#================================================= +ynh_script_progression --message="Generating database..." --weight=1 + +pushd "$final_path" + yes | ./listmonk --install +popd + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Configuring a systemd service..." --weight=1 + +# Create a dedicated systemd config +ynh_add_systemd_config + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 + +yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=2 + +# Start a systemd service +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# 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=1 + +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 100755 index 0000000..3ceb755 --- /dev/null +++ b/scripts/remove @@ -0,0 +1,92 @@ +#!/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) +port=$(ynh_app_setting_get --app=$app --key=port) +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) + +#================================================= +# STANDARD REMOVE +#================================================= +# REMOVE SERVICE INTEGRATION IN YUNOHOST +#================================================= + +# Remove the service from the list of services known by YunoHost (added from `yunohost service add`) +if ynh_exec_warn_less yunohost service status $app >/dev/null +then + ynh_script_progression --message="Removing $app service integration..." --weight=2 + yunohost service remove $app +fi + +#================================================= +# 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 PostgreSQL database..." --weight=2 + +# Remove a database if it exists, along with the associated user +ynh_psql_remove_db --db_user=$db_user --db_name=$db_name + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --weight=2 + +# 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 DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --weight=8 + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies + +#================================================= +# 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 100755 index 0000000..6f58628 --- /dev/null +++ b/scripts/restore @@ -0,0 +1,128 @@ +#!/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 +#================================================= + +ynh_clean_setup () { + #### Remove this function if there's nothing to clean before calling the remove script. + true +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --time --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=psqlpwd) + +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --time --weight=1 + +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 web server configuration..." --time --weight=1 + +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..." --time --weight=1 + +# 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..." --time --weight=1 + +ynh_restore_file --origin_path="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# SPECIFIC RESTORATION +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --time --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# RESTORE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=6 + +ynh_psql_test_if_first_run +ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_psql_execute_file_as_root --file="./db.sql" --database=$db_name + +#================================================= +# RESTORE SYSTEMD +#================================================= +ynh_script_progression --message="Restoring the systemd configuration..." --time --weight=1 + +ynh_restore_file --origin_path="/etc/systemd/system/$app.service" +systemctl enable $app.service --quiet + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 + +yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --time --last diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..993c6fb --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,166 @@ +#!/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) +admin=$(ynh_app_setting_get --app=$app --key=admin) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) + +#================================================= +# CHECK VERSION +#================================================= + +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 + +# 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 + +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" + +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 + +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +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=5 + + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/config.toml" +fi + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" +chmod +x "$final_path/listmonk" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=10 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# UPDATE A CONFIG FILE +#================================================= +# ynh_script_progression --message="Updating a configuration file..." --time --weight=1 + +# ynh_add_config --template="../conf/config.toml" --destination="$final_path/config.toml" + +# chmod 400 "$final_path/config.toml" +# chown $app:$app "$final_path/config.toml" + +#================================================= +# DATABASE CONFIGURATION +#================================================= +ynh_script_progression --message="Generating database..." --weight=1 + +pushd "$final_path" + yes | ./listmonk --upgrade +popd + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --weight=2 + +# Create a dedicated systemd config +ynh_add_systemd_config + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 + +yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=3 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" + +#================================================= +# UPGRADE FAIL2BAN +#================================================= +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=1 + +# Create a dedicated Fail2Ban config +ynh_add_fail2ban_config --logpath="/var/log/nginx/${domain}-error.log" --failregex="Regex to match into the log for a failed login" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --last diff --git a/sources/extra_files/app/.gitignore b/sources/extra_files/app/.gitignore new file mode 100644 index 0000000..783a4ae --- /dev/null +++ b/sources/extra_files/app/.gitignore @@ -0,0 +1,2 @@ +*~ +*.sw[op] diff --git a/sources/patches/.gitignore b/sources/patches/.gitignore new file mode 100644 index 0000000..783a4ae --- /dev/null +++ b/sources/patches/.gitignore @@ -0,0 +1,2 @@ +*~ +*.sw[op]