From a7a0251806cb014e84a494b3e49884352bfca799 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 22 Mar 2022 11:30:59 +0100 Subject: [PATCH] First commit --- LICENSE | 661 +++++++++++++++++++++++++++++++++ README.md | 84 +++++ README_fr.md | 66 ++++ check_process | 24 ++ conf/app.src | 6 + conf/libreddit.conf | 10 + conf/nginx.conf | 15 + conf/systemd.service | 18 + config_panel.toml.example | 295 +++++++++++++++ doc/.gitkeep | 0 doc/DESCRIPTION.md | 8 + doc/DISCLAIMER.md | 0 doc/screenshots/.gitkeep | 0 doc/screenshots/screenshot.png | Bin 0 -> 146987 bytes manifest.json | 48 +++ scripts/_common.sh | 17 + scripts/backup | 61 +++ scripts/change_url | 124 +++++++ scripts/config | 102 +++++ scripts/install | 148 ++++++++ scripts/remove | 74 ++++ scripts/restore | 106 ++++++ scripts/upgrade | 129 +++++++ 23 files changed, 1996 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/libreddit.conf 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 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +. 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..c453624 --- /dev/null +++ b/check_process @@ -0,0 +1,24 @@ +;; Test complet + ; Manifest + domain="domain.tld" + path="/path" + is_public=1 + ; Checks + pkg_linter=1 + setup_sub_dir=1 + 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..9971adf --- /dev/null +++ b/conf/app.src @@ -0,0 +1,6 @@ +SOURCE_URL=https://github.com/spikecodes/libreddit/releases/download/v0.22.2/libreddit +SOURCE_SUM=caab26fc829457be0a7f5bc96db361881d70297012959393503275a56e20a602 +SOURCE_SUM_PRG=sha256sum +SOURCE_IN_SUBDIR=false +SOURCE_FILENAME=libreddit +SOURCE_EXTRACT=false diff --git a/conf/libreddit.conf b/conf/libreddit.conf new file mode 100644 index 0000000..d002019 --- /dev/null +++ b/conf/libreddit.conf @@ -0,0 +1,10 @@ +LIBREDDIT_DEFAULT_THEME=system +LIBREDDIT_DEFAULT_FRONT_PAGE=default +LIBREDDIT_DEFAULT_LAYOUT=card +LIBREDDIT_DEFAULT_WIDE=off +LIBREDDIT_DEFAULT_COMMENT_SORT=hot +LIBREDDIT_DEFAULT_POST_SORT=confidence +LIBREDDIT_DEFAULT_SHOW_NSFW=off +LIBREDDIT_DEFAULT_USE_HLS=off +LIBREDDIT_DEFAULT_HIDE_HLS_NOTIFICATION=off +LIBREDDIT_DEFAULT_AUTOPLAY_VIDEOS=off diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..af69dcd --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,15 @@ +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; +location __PATH__/ { + + 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 Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; +} diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 0000000..de90501 --- /dev/null +++ b/conf/systemd.service @@ -0,0 +1,18 @@ +[Unit] +Description=Libreddit: alternative to Reddit +Before=nginx.service +After=network.service + +[Service] +User=__APP__ +Group=__APP__ +DynamicUser=yes +# Default Values +Environment=ADDRESS=127.0.0.1 +Environment=PORT=__PORT__ +# Optional Override +EnvironmentFile=-__FINALPATH__/libreddit.conf +ExecStart=__FINALPATH__/libreddit -a ${ADDRESS} -p ${PORT} + +[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..130b371 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1,8 @@ +Libreddit is a portmanteau of "libre" (meaning freedom) and "Reddit". It is a private front-end like Invidious but for Reddit. Browse the coldest takes of r/unpopularopinion without being tracked. + +### Features + + 🚀 Fast: written in Rust for blazing fast speeds and memory safety + ☁️ Light: no JavaScript, no ads, no tracking, no bloat + 🕵 Private: all requests are proxied through the server, including media + 🔒 Secure: strong Content Security Policy prevents browser requests to Reddit diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..e69de29 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..7737cd1aa6e93204cc32d9b0c8098161ff7f0bce GIT binary patch literal 146987 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�<$)E{q|Jtn??$_j`gAA!R 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 z zY)|sypk<(-HYQ1nU+7S;EzdHK`_QeZ;EnNDcK?3;J zm(_MmYDH=lGd4}0z17hyz^_<%6C3ZGWB}`tn@--ZP?Zyxw#@zfl?#hoJQZpdLu@5y zkVj6$V)FDOyiBD3**}Sw)9*r=(fRi!guCp29kLQHPKDRq-=BQ!j&{NQCV?X57-8tR zr9BX80jR+cdOj3@#?ZL9&H;v;4+%bE;zw^#PkWwqpuYxQ)DW_N9{aM{&SMuzAxvcHl8yT6h+O|L5Ds zwsD|rPCqwgk^POo&YS;lRG6Aj)@KlAuW|H*bkCQ~j(5-7XC_xO6Su76IF~^UD?(wn zs*~@(J6vC5uu46rqQPQ=QqN^UT8OUrbq0mSLqC9OH$= 4.3.0" + }, + "multi_instance": true, + "services": [ + "nginx" + ], + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain" + }, + { + "name": "path", + "type": "path", + "example": "/libreddit", + "default": "/libreddit" + }, + { + "name": "is_public", + "type": "boolean", + "default": true + } + ] + } +} diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..944a65e --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= diff --git a/scripts/backup b/scripts/backup new file mode 100755 index 0000000..fb3c925 --- /dev/null +++ b/scripts/backup @@ -0,0 +1,61 @@ +#!/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) + +#================================================= +# 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" + +#================================================= +# 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..76b4138 --- /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..." --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)..." --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..." --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" --log_path="systemd" + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --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..." --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" + +#================================================= +# 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="Change of URL completed for $app" --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..2806f9b --- /dev/null +++ b/scripts/install @@ -0,0 +1,148 @@ +#!/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=$YNH_APP_ARG_PATH +is_public=$YNH_APP_ARG_IS_PUBLIC + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." --weight=1 + +final_path=/var/www/$app +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" + +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url + +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --weight=1 + +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url + +#================================================= +# 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 + +#================================================= +# 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" + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=1 + +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/libreddit + +#================================================= +# 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/libreddit.conf" --destination="$final_path/libreddit.conf" + +chmod 400 "$final_path/libreddit.conf" +chown $app:$app "$final_path/libreddit.conf" + +#================================================= +# 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="Alternative to Reddit" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=1 + +# Start a systemd service +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" + +#================================================= +# 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..ab0fe79 --- /dev/null +++ b/scripts/remove @@ -0,0 +1,74 @@ +#!/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) +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=1 + yunohost service remove $app +fi + +#================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1 + +# Remove the dedicated systemd config +ynh_remove_systemd_config + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --weight=1 + +# 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 + +#================================================= +# 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..867b8c8 --- /dev/null +++ b/scripts/restore @@ -0,0 +1,106 @@ +#!/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..." --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) + +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --weight=3 + +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..." --weight=2 + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=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..." --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" + +#================================================= +# RESTORE SYSTEMD +#================================================= +ynh_script_progression --message="Restoring the systemd configuration..." --weight=3 + +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..." --weight=2 + +yunohost service add $app --description="Alternative to Reddit" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=1 + +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=2 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..c03f797 --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,129 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +port=$(ynh_app_setting_get --app=$app --key=port) + +#================================================= +# 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="systemd" + +#================================================= +# 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/libreddit.conf" +fi + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" +chmod +x $final_path/libreddit + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# UPDATE A CONFIG FILE +#================================================= +#ynh_script_progression --message="Updating a configuration file..." --weight=1 + +# ynh_add_config --template="../conf/libreddit.conf" --destination="$final_path/libreddit.conf" + +# chmod 400 "$final_path/libreddit.conf" +# chown $app:$app "$final_path/libreddit.conf" + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --weight=3 + +# 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="Alternative to Reddit" --log="/var/log/$app/$app.log" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --weight=2 + +ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" + +#================================================= +# 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