From c409c89b189e67df78dc799fa02da9f55d1397be Mon Sep 17 00:00:00 2001 From: Karl Grube <karl@hudlergrube.com> Date: Mon, 21 Oct 2024 15:43:21 +0200 Subject: [PATCH] initial commit with a partial/full? configuration (working a bit) --- LICENSE | 674 +++++++++++++++ README.md | 6 +- defaults/main.yml | 8 + handlers/main.yml | 6 + tasks/config.yml | 10 + tasks/debian.yml | 27 + tasks/main.yml | 5 + templates/config.js.j2 | 1865 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 2598 insertions(+), 3 deletions(-) create mode 100644 LICENSE create mode 100644 defaults/main.yml create mode 100644 handlers/main.yml create mode 100644 tasks/config.yml create mode 100644 tasks/debian.yml create mode 100644 tasks/main.yml create mode 100644 templates/config.js.j2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4fcfd60 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 2024 カールグルーã¹åšå£« + + 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 <https://www.gnu.org/licenses/>. + +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: + + <program> Copyright (C) 2024 カールグルーã¹åšå£« + 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 +<https://www.gnu.org/licenses/>. + + 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 +<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/README.md b/README.md index 8c67754..637f461 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# jitsi meet web role +# jicofo role @@ -15,14 +15,14 @@ Already a pro? Just edit this README.md and make it your own. Want to make it ea ``` cd existing_repo -git remote add origin https://gitlab.eox.at/ansible-public/jitsi-meet-web-role.git +git remote add origin https://gitlab.eox.at/ansible-public/jicofo-role.git git branch -M main git push -uf origin main ``` ## Integrate with your tools -- [ ] [Set up project integrations](https://gitlab.eox.at/ansible-public/jitsi-meet-web-role/-/settings/integrations) +- [ ] [Set up project integrations](https://gitlab.eox.at/ansible-public/jicofo-role/-/settings/integrations) ## Collaborate with your team diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..e992920 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,8 @@ +--- + +fqdn: "{{inventory_hostname}}" +domain_name: "{{ fqdn|regex_replace('^.+?\\.','') }}" + +xmpp_domain: 'xmpp:{{domain_name}}' +jitsi_domain: 'meet.{{domain_name}}' + diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..edde81c --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,6 @@ +--- + +- name: reload nginx + service: + name: nginx + state: reloaded diff --git a/tasks/config.yml b/tasks/config.yml new file mode 100644 index 0000000..9039af8 --- /dev/null +++ b/tasks/config.yml @@ -0,0 +1,10 @@ +--- + +- name: config.js template for jitsi_web + template: + src: config.js.j2 + dest: '/etc/jitsi/meet/{{jitsi_domain}}-config.js' + notify: reload nginx + tags: sites,conf + + diff --git a/tasks/debian.yml b/tasks/debian.yml new file mode 100644 index 0000000..5bb0d07 --- /dev/null +++ b/tasks/debian.yml @@ -0,0 +1,27 @@ +--- + +- name: make sure that the required packages are installed + apt: + name: + - gpg + - apt-transport-https + - nginx + +- name: get gpg key for jitsi + shell: + cmd: "curl -sL https://download.jitsi.org/jitsi-key.gpg.key | sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'" + args: + creates: /usr/share/keyrings/jitsi-keyring.gpg + +- name: jitsi repository + apt_repository: + repo: 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' + state: present + filename: jitsi-stable.list +- name: update cache and make sure that jicofo is installed + apt: + update_cache: yes + name: + - jitsi-meet-web-config + + diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..434e5f5 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,5 @@ +--- + +- include_tasks: '{{ansible_os_family|lower}}.yml' + +- import_tasks: config.yml diff --git a/templates/config.js.j2 b/templates/config.js.j2 new file mode 100644 index 0000000..8ae5cb1 --- /dev/null +++ b/templates/config.js.j2 @@ -0,0 +1,1865 @@ +/* eslint-disable comma-dangle, no-unused-vars, no-var, prefer-template, vars-on-top */ + +/* + * NOTE: If you add a new option please remember to document it here: + * https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-configuration + */ + +var subdir = '<!--# echo var="subdir" default="" -->'; +var subdomain = '<!--# echo var="subdomain" default="" -->'; + +if (subdomain) { + subdomain = subdomain.substr(0, subdomain.length - 1).split('.') + .join('_') + .toLowerCase() + '.'; +} + +// In case of no ssi provided by the webserver, use empty strings +if (subdir.startsWith('<!--')) { + subdir = ''; +} +if (subdomain.startsWith('<!--')) { + subdomain = ''; +} + +var enableJaaS = false; + +var config = { + // Connection + // + + hosts: { + // XMPP domain. + domain: '{{xmpp_domain}}', + + // When using authentication, domain for guest users. + anonymousdomain: 'guest.{{domain_name}}', + + // Domain for authenticated users. Defaults to <domain>. + // authdomain: 'meet.{{domain_name}}', + + // Focus component domain. Defaults to focus.<domain>. + // focus: 'focus.meet.{{domain_name}}', + + // XMPP MUC domain. FIXME: use XEP-0030 to discover it. + muc: 'conference.' + subdomain + '{{domain_name}}', + }, + + // BOSH URL. FIXME: use XEP-0156 to discover it. + bosh: 'https://{{xmpp_domain}}/' + subdir + 'http-bind', + + // Websocket URL (XMPP) + websocket: 'wss://{{xmpp_domain}}/' + subdir + 'xmpp-websocket', + + // Whether BOSH should be preferred over WebSocket if both are configured. + // preferBosh: false, + + // The real JID of focus participant - can be overridden here + // Do not change username - FIXME: Make focus username configurable + // https://github.com/jitsi/jitsi-meet/issues/7376 + // focusUserJid: 'focus@auth.meet.{{domain_name}}', + + // Option to send conference requests to jicofo over http (requires nginx rule for it) + // conferenceRequestUrl: + // 'https://<!--# echo var="http_host" default="meet.{{domain_name}}" -->/' + subdir + 'conference-request/v1', + + // Options related to the bridge (colibri) data channel + bridgeChannel: { + // If the backend advertises multiple colibri websockets, this options allows + // to filter some of them out based on the domain name. We use the first URL + // which does not match ignoreDomain, falling back to the first one that matches + // ignoreDomain. Has no effect if undefined. + // ignoreDomain: '{{domain_name}}', + + // Prefer SCTP (WebRTC data channels over the media path) over a colibri websocket. + // If SCTP is available in the backend it will be used instead of a WS. Defaults to + // false (SCTP is used only if available and no WS are available). + // preferSctp: false + }, + + // Testing / experimental features. + // + + testing: { + // Allows the setting of a custom bandwidth value from the UI. + // assumeBandwidth: true, + + // Disables the End to End Encryption feature. Useful for debugging + // issues related to insertable streams. + // disableE2EE: false, + + // Enables the use of the codec selection API supported by the browsers . + // enableCodecSelectionAPI: false, + + // P2P test mode disables automatic switching to P2P when there are 2 + // participants in the conference. + // p2pTestMode: false, + + // Enables the test specific features consumed by jitsi-meet-torture + // testMode: false, + + // Disables the auto-play behavior of *all* newly created video element. + // This is useful when the client runs on a host with limited resources. + // noAutoPlayVideo: false, + + // Experiment: Whether to skip interim transcriptions. + // skipInterimTranscriptions: false, + + // Dump transcripts to a <transcript> element for debugging. + // dumpTranscript: false, + }, + + // Disables moderator indicators. + // disableModeratorIndicator: false, + + // Disables the reactions feature. + // disableReactions: true, + + // Disables the reactions moderation feature. + // disableReactionsModeration: false, + + // Disables polls feature. + // disablePolls: false, + + // Disables demote button from self-view + // disableSelfDemote: false, + + // Disables self-view tile. (hides it from tile view and from filmstrip) + // disableSelfView: false, + + // Disables self-view settings in UI + // disableSelfViewSettings: false, + + // screenshotCapture : { + // Enables the screensharing capture feature. + // enabled: false, + // + // The mode for the screenshot capture feature. + // Can be either 'recording' - screensharing screenshots are taken + // only when the recording is also on, + // or 'always' - screensharing screenshots are always taken. + // mode: 'recording', + // } + + // Disables ICE/UDP by filtering out local and remote UDP candidates in + // signalling. + // webrtcIceUdpDisable: false, + + // Disables ICE/TCP by filtering out local and remote TCP candidates in + // signalling. + // webrtcIceTcpDisable: false, + + + // Media + // + + // Audio + + // Disable measuring of audio levels. + // disableAudioLevels: false, + + // audioLevelsInterval: 200, + + // Enabling this will run the lib-jitsi-meet no audio detection module which + // will notify the user if the current selected microphone has no audio + // input and will suggest another valid device if one is present. + enableNoAudioDetection: true, + + // Enabling this will show a "Save Logs" link in the GSM popover that can be + // used to collect debug information (XMPP IQs, SDP offer/answer cycles) + // about the call. + // enableSaveLogs: false, + + // Enabling this will hide the "Show More" link in the GSM popover that can be + // used to display more statistics about the connection (IP, Port, protocol, etc). + // disableShowMoreStats: true, + + // Enabling this will run the lib-jitsi-meet noise detection module which will + // notify the user if there is noise, other than voice, coming from the current + // selected microphone. The purpose it to let the user know that the input could + // be potentially unpleasant for other meeting participants. + enableNoisyMicDetection: true, + + // Start the conference in audio only mode (no video is being received nor + // sent). + // startAudioOnly: false, + + // Every participant after the Nth will start audio muted. + // startAudioMuted: 10, + + // Start calls with audio muted. Unlike the option above, this one is only + // applied locally. FIXME: having these 2 options is confusing. + // startWithAudioMuted: false, + + // Enabling it (with #params) will disable local audio output of remote + // participants and to enable it back a reload is needed. + // startSilent: false, + + // Enables support for opus-red (redundancy for Opus). + // enableOpusRed: false, + + // Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio. + // Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC. + // Specify enableOpusDtx to enable support for opus-dtx where + // audio packets won’t be transmitted while participant is silent or muted. + // audioQuality: { + // stereo: false, + // opusMaxAverageBitrate: null, // Value to fit the 6000 to 510000 range. + // enableOpusDtx: false, + // }, + + // Noise suppression configuration. By default rnnoise is used. Optionally Krisp + // can be used by enabling it below, but the Krisp JS SDK files must be supplied in your + // installation. Specifically, these files are needed: + // - https://meet.{{domain_name}}/libs/krisp/krisp.mjs + // - https://meet.{{domain_name}}/libs/krisp/models/model_8.kw + // - https://meet.{{domain_name}}/libs/krisp/models/model_16.kw + // - https://meet.{{domain_name}}/libs/krisp/models/model_32.kw + // NOTE: Krisp JS SDK v1.0.9 was tested. + // noiseSuppression: { + // krisp: { + // enabled: false, + // logProcessStats: false, + // debugLogs: false, + // }, + // }, + + // Video + + // Sets the default camera facing mode. + // cameraFacingMode: 'user', + + // Sets the preferred resolution (height) for local video. Defaults to 720. + // resolution: 720, + + // DEPRECATED. Please use raisedHands.disableRemoveRaisedHandOnFocus instead. + // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not + // disableRemoveRaisedHandOnFocus: false, + + // Specifies which raised hand related config should be set. + // raisedHands: { + // // Specifies whether the raised hand can be lowered by moderator. + // disableLowerHandByModerator: false, + + // // Specifies whether there is a notification before hiding the raised hand + // // when someone becomes the dominant speaker. + // disableLowerHandNotification: true, + + // // Specifies whether there is a notification when you are the next speaker in line. + // disableNextSpeakerNotification: false, + + // // Specifies whether the raised hand will hide when someone becomes a dominant speaker or not. + // disableRemoveRaisedHandOnFocus: false, + // }, + + // speakerStats: { + // // Specifies whether the speaker stats is enable or not. + // disabled: false, + + // // Specifies whether there will be a search field in speaker stats or not. + // disableSearch: false, + + // // Specifies whether participants in speaker stats should be ordered or not, and with what priority. + // // 'role', <- Moderators on top. + // // 'name', <- Alphabetically by name. + // // 'hasLeft', <- The ones that have left in the bottom. + // order: [ + // 'role', + // 'name', + // 'hasLeft', + // ], + // }, + + // DEPRECATED. Please use speakerStats.disableSearch instead. + // Specifies whether there will be a search field in speaker stats or not + // disableSpeakerStatsSearch: false, + + // DEPRECATED. Please use speakerStats.order . + // Specifies whether participants in speaker stats should be ordered or not, and with what priority + // speakerStatsOrder: [ + // 'role', <- Moderators on top + // 'name', <- Alphabetically by name + // 'hasLeft', <- The ones that have left in the bottom + // ], <- the order of the array elements determines priority + + // How many participants while in the tile view mode, before the receiving video quality is reduced from HD to SD. + // Use -1 to disable. + // maxFullResolutionParticipants: 2, + + // w3c spec-compliant video constraints to use for video capture. Currently + // used by browsers that return true from lib-jitsi-meet's + // util#browser#usesNewGumFlow. The constraints are independent from + // this config's resolution value. Defaults to requesting an ideal + // resolution of 720p. + // constraints: { + // video: { + // height: { + // ideal: 720, + // max: 720, + // min: 240, + // }, + // }, + // }, + + // Enable / disable simulcast support. + // disableSimulcast: false, + + // Every participant after the Nth will start video muted. + // startVideoMuted: 10, + + // Start calls with video muted. Unlike the option above, this one is only + // applied locally. FIXME: having these 2 options is confusing. + // startWithVideoMuted: false, + + // Desktop sharing + + // Optional desktop sharing frame rate options. Default value: min:5, max:5. + // desktopSharingFrameRate: { + // min: 5, + // max: 5, + // }, + + // Optional screenshare settings that give more control over screen capture in the browser. + // screenShareSettings: { + // // Show users the current tab is the preferred capture source, default: false. + // desktopPreferCurrentTab: false, + // // Allow users to select system audio, default: include. + // desktopSystemAudio: 'include', + // // Allow users to seamlessly switch which tab they are sharing without having to select the tab again. + // desktopSurfaceSwitching: 'include', + // // Allow a user to be shown a preference for what screen is to be captured, default: unset. + // desktopDisplaySurface: undefined, + // // Allow users to select the current tab as a capture source, default: exclude. + // desktopSelfBrowserSurface: 'exclude' + // }, + + // Recording + + // DEPRECATED. Use recordingService.enabled instead. + // fileRecordingsEnabled: false, + + // Enable the dropbox integration. + // dropbox: { + // appKey: '<APP_KEY>', // Specify your app key here. + // // A URL to redirect the user to, after authenticating + // // by default uses: + // // 'https://meet.{{domain_name}}/static/oauth.html' + // redirectURI: + // 'https://meet.{{domain_name}}/subfolder/static/oauth.html', + // }, + + // configuration for all things recording related. Existing settings will be migrated here in the future. + // recordings: { + // // IF true (default) recording audio and video is selected by default in the recording dialog. + // // recordAudioAndVideo: true, + // // If true, shows a notification at the start of the meeting with a call to action button + // // to start recording (for users who can do so). + // // suggestRecording: true, + // // If true, shows a warning label in the prejoin screen to point out the possibility that + // // the call you're joining might be recorded. + // // showPrejoinWarning: true, + // }, + + // recordingService: { + // // When integrations like dropbox are enabled only that will be shown, + // // by enabling fileRecordingsServiceEnabled, we show both the integrations + // // and the generic recording service (its configuration and storage type + // // depends on jibri configuration) + // enabled: false, + + // // Whether to show the possibility to share file recording with other people + // // (e.g. meeting participants), based on the actual implementation + // // on the backend. + // sharingEnabled: false, + + // // Hide the warning that says we only store the recording for 24 hours. + // hideStorageWarning: false, + // }, + + // DEPRECATED. Use recordingService.enabled instead. + // fileRecordingsServiceEnabled: false, + + // DEPRECATED. Use recordingService.sharingEnabled instead. + // fileRecordingsServiceSharingEnabled: false, + + // Local recording configuration. + // localRecording: { + // // Whether to disable local recording or not. + // disable: false, + + // // Whether to notify all participants when a participant is recording locally. + // notifyAllParticipants: false, + + // // Whether to disable the self recording feature (only local participant streams). + // disableSelfRecording: false, + // }, + + // Customize the Live Streaming dialog. Can be modified for a non-YouTube provider. + // liveStreaming: { + // // Whether to enable live streaming or not. + // enabled: false, + // // Terms link + // termsLink: 'https://www.youtube.com/t/terms', + // // Data privacy link + // dataPrivacyLink: 'https://policies.google.com/privacy', + // // RegExp string that validates the stream key input field + // validatorRegExpString: '^(?:[a-zA-Z0-9]{4}(?:-(?!$)|$)){4}', + // // Documentation reference for the live streaming feature. + // helpLink: 'https://jitsi.org/live' + // }, + + // DEPRECATED. Use liveStreaming.enabled instead. + // liveStreamingEnabled: false, + + // DEPRECATED. Use transcription.enabled instead. + // transcribingEnabled: false, + + // DEPRECATED. Use transcription.useAppLanguage instead. + // transcribeWithAppLanguage: true, + + // DEPRECATED. Use transcription.preferredLanguage instead. + // preferredTranscribeLanguage: 'en-US', + + // DEPRECATED. Use transcription.autoTranscribeOnRecord instead. + // autoCaptionOnRecord: false, + + // Transcription options. + // transcription: { + // // Whether the feature should be enabled or not. + // enabled: false, + + // // Translation languages. + // // Available languages can be found in + // // ./src/react/features/transcribing/translation-languages.json. + // translationLanguages: ['en', 'es', 'fr', 'ro'], + + // // Important languages to show on the top of the language list. + // translationLanguagesHead: ['en'], + + // // If true transcriber will use the application language. + // // The application language is either explicitly set by participants in their settings or automatically + // // detected based on the environment, e.g. if the app is opened in a chrome instance which + // // is using french as its default language then transcriptions for that participant will be in french. + // // Defaults to true. + // useAppLanguage: true, + + // // Transcriber language. This settings will only work if "useAppLanguage" + // // is explicitly set to false. + // // Available languages can be found in + // // ./src/react/features/transcribing/transcriber-langs.json. + // preferredLanguage: 'en-US', + + // // Enables automatic turning on transcribing when recording is started + // autoTranscribeOnRecord: false, + // }, + + // Misc + + // Default value for the channel "last N" attribute. -1 for unlimited. + channelLastN: -1, + + // Connection indicators + // connectionIndicators: { + // autoHide: true, + // autoHideTimeout: 5000, + // disabled: false, + // disableDetails: false, + // inactiveDisabled: false + // }, + + // Provides a way for the lastN value to be controlled through the UI. + // When startLastN is present, conference starts with a last-n value of startLastN and channelLastN + // value will be used when the quality level is selected using "Manage Video Quality" slider. + // startLastN: 1, + + // Specify the settings for video quality optimizations on the client. + // videoQuality: { + // + // // Provides a way to set the codec preference on desktop based endpoints. + // codecPreferenceOrder: [ 'VP9', 'VP8', 'H264' ], + // + // // Provides a way to set the codec for screenshare. + // screenshareCodec: 'AV1', + // mobileScreenshareCodec: 'VP8', + // + // // Codec specific settings for scalability modes and max bitrates. + // av1: { + // maxBitratesVideo: { + // low: 100000, + // standard: 300000, + // high: 1000000, + // fullHd: 2000000, + // ultraHd: 4000000, + // ssHigh: 2500000 + // }, + // scalabilityModeEnabled: true, + // useSimulcast: false, + // useKSVC: true + // }, + // h264: { + // maxBitratesVideo: { + // low: 200000, + // standard: 500000, + // high: 1500000, + // fullHd: 3000000, + // ultraHd: 6000000, + // ssHigh: 2500000 + // }, + // scalabilityModeEnabled: true + // }, + // vp8: { + // maxBitratesVideo: { + // low: 200000, + // standard: 500000, + // high: 1500000, + // fullHd: 3000000, + // ultraHd: 6000000, + // ssHigh: 2500000 + // }, + // scalabilityModeEnabled: false + // }, + // vp9: { + // maxBitratesVideo: { + // low: 100000, + // standard: 300000, + // high: 1200000, + // fullHd: 2500000, + // ultraHd: 5000000, + // ssHigh: 2500000 + // }, + // scalabilityModeEnabled: true, + // useSimulcast: false, + // useKSVC: true + // }, + // + // DEPRECATED! Use `codec specific settings` instead. + // // Provides a way to configure the maximum bitrates that will be enforced on the simulcast streams for + // // video tracks. The keys in the object represent the type of the stream (LD, SD or HD) and the values + // // are the max.bitrates to be set on that particular type of stream. The actual send may vary based on + // // the available bandwidth calculated by the browser, but it will be capped by the values specified here. + // // This is currently not implemented on app based clients on mobile. + // maxBitratesVideo: { + // H264: { + // low: 200000, + // standard: 500000, + // high: 1500000, + // }, + // VP8 : { + // low: 200000, + // standard: 500000, + // high: 1500000, + // }, + // VP9: { + // low: 100000, + // standard: 300000, + // high: 1200000, + // }, + // }, + // + // // The options can be used to override default thresholds of video thumbnail heights corresponding to + // // the video quality levels used in the application. At the time of this writing the allowed levels are: + // // 'low' - for the low quality level (180p at the time of this writing) + // // 'standard' - for the medium quality level (360p) + // // 'high' - for the high quality level (720p) + // // The keys should be positive numbers which represent the minimal thumbnail height for the quality level. + // // + // // With the default config value below the application will use 'low' quality until the thumbnails are + // // at least 360 pixels tall. If the thumbnail height reaches 720 pixels then the application will switch to + // // the high quality. + // minHeightForQualityLvl: { + // 360: 'standard', + // 720: 'high', + // }, + // + // // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based endpoint + // mobileCodecPreferenceOrder: [ 'VP8', 'VP9', 'H264' ], + // + // // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead. + // // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified + // // here will be removed from the list of codecs present in the SDP answer generated by the client. If the + // // same codec is specified for both the disabled and preferred option, the disable settings will prevail. + // // Note that 'VP8' cannot be disabled since it's a mandatory codec, the setting will be ignored in this case. + // disabledCodec: 'H264', + // + // // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead. + // // Provides a way to set a preferred video codec for the JVB connection. If 'H264' is specified here, + // // simulcast will be automatically disabled since JVB doesn't support H264 simulcast yet. This will only + // // rearrange the the preference order of the codecs in the SDP answer generated by the browser only if the + // // preferred codec specified here is present. Please ensure that the JVB offers the specified codec for this + // // to take effect. + // preferredCodec: 'VP8', + // + // }, + + // Notification timeouts + // notificationTimeouts: { + // short: 2500, + // medium: 5000, + // long: 10000, + // }, + + // // Options for the recording limit notification. + // recordingLimit: { + // + // // The recording limit in minutes. Note: This number appears in the notification text + // // but doesn't enforce the actual recording time limit. This should be configured in + // // jibri! + // limit: 60, + // + // // The name of the app with unlimited recordings. + // appName: 'Unlimited recordings APP', + // + // // The URL of the app with unlimited recordings. + // appURL: 'https://unlimited.recordings.app.com/', + // }, + + // Disables or enables RTX (RFC 4588) (defaults to false). + // disableRtx: false, + + // Moves all Jitsi Meet 'beforeunload' logic (cleanup, leaving, disconnecting, etc) to the 'unload' event. + // disableBeforeUnloadHandlers: true, + + // Disables or enables TCC support in this client (default: enabled). + // enableTcc: true, + + // Disables or enables REMB support in this client (default: enabled). + // enableRemb: true, + + // Enables ICE restart logic in LJM and displays the page reload overlay on + // ICE failure. Current disabled by default because it's causing issues with + // signaling when Octo is enabled. Also when we do an "ICE restart"(which is + // not a real ICE restart), the client maintains the TCC sequence number + // counter, but the bridge resets it. The bridge sends media packets with + // TCC sequence numbers starting from 0. + // enableIceRestart: false, + + // Enables forced reload of the client when the call is migrated as a result of + // the bridge going down. + // enableForcedReload: true, + + // Use TURN/UDP servers for the jitsi-videobridge connection (by default + // we filter out TURN/UDP because it is usually not needed since the + // bridge itself is reachable via UDP) + // useTurnUdp: false + + // Enable support for encoded transform in supported browsers. This allows + // E2EE to work in Safari if the corresponding flag is enabled in the browser. + // Experimental. + // enableEncodedTransformSupport: false, + + // UI + // + + // Disables responsive tiles. + // disableResponsiveTiles: false, + + // DEPRECATED. Please use `securityUi?.hideLobbyButton` instead. + // Hides lobby button. + // hideLobbyButton: false, + + // DEPRECATED. Please use `lobby?.autoKnock` instead. + // If Lobby is enabled starts knocking automatically. + // autoKnockLobby: false, + + // DEPRECATED. Please use `lobby?.enableChat` instead. + // Enable lobby chat. + // enableLobbyChat: true, + + // DEPRECATED! Use `breakoutRooms.hideAddRoomButton` instead. + // Hides add breakout room button + // hideAddRoomButton: false, + + // Require users to always specify a display name. + // requireDisplayName: true, + + // Enables webhid functionality for Audio. + // enableWebHIDFeature: false, + + // DEPRECATED! Use 'welcomePage.disabled' instead. + // Whether to use a welcome page or not. In case it's false a random room + // will be joined when no room is specified. + // enableWelcomePage: true, + + // Configs for welcome page. + // welcomePage: { + // // Whether to disable welcome page. In case it's disabled a random room + // // will be joined when no room is specified. + // disabled: false, + // // If set, landing page will redirect to this URL. + // customUrl: '' + // }, + + // Configs for the lobby screen. + // lobby: { + // // If Lobby is enabled, it starts knocking automatically. Replaces `autoKnockLobby`. + // autoKnock: false, + // // Enables the lobby chat. Replaces `enableLobbyChat`. + // enableChat: true, + // }, + + // Configs for the security related UI elements. + // securityUi: { + // // Hides the lobby button. Replaces `hideLobbyButton`. + // hideLobbyButton: false, + // // Hides the possibility to set and enter a lobby password. + // disableLobbyPassword: false, + // }, + + // Disable app shortcuts that are registered upon joining a conference + // disableShortcuts: false, + + // Disable initial browser getUserMedia requests. + // This is useful for scenarios where users might want to start a conference for screensharing only + // disableInitialGUM: false, + + // Enabling the close page will ignore the welcome page redirection when + // a call is hangup. + // enableClosePage: false, + + // Disable hiding of remote thumbnails when in a 1-on-1 conference call. + // Setting this to null, will also disable showing the remote videos + // when the toolbar is shown on mouse movements + // disable1On1Mode: null | false | true, + + // Default local name to be displayed + // defaultLocalDisplayName: 'me', + + // Default remote name to be displayed + // defaultRemoteDisplayName: 'Fellow Jitster', + + // Hides the display name from the participant thumbnail + // hideDisplayName: false, + + // Hides the dominant speaker name badge that hovers above the toolbox + // hideDominantSpeakerBadge: false, + + // Default language for the user interface. Cannot be overwritten. + // DEPRECATED! Use the `lang` iframe option directly instead. + // defaultLanguage: 'en', + + // Disables profile and the edit of all fields from the profile settings (display name and email) + // disableProfile: false, + + // Hides the email section under profile settings. + // hideEmailInSettings: false, + + // When enabled the password used for locking a room is restricted to up to the number of digits specified + // default: roomPasswordNumberOfDigits: false, + // roomPasswordNumberOfDigits: 10, + + // Message to show the users. Example: 'The service will be down for + // maintenance at 01:00 AM GMT, + // noticeMessage: '', + + // Enables calendar integration, depends on googleApiApplicationClientID + // and microsoftApiApplicationClientID + // enableCalendarIntegration: false, + + // Configs for prejoin page. + // prejoinConfig: { + // // When 'true', it shows an intermediate page before joining, where the user can configure their devices. + // // This replaces `prejoinPageEnabled`. Defaults to true. + // enabled: true, + // // Hides the participant name editing field in the prejoin screen. + // // If requireDisplayName is also set as true, a name should still be provided through + // // either the jwt or the userInfo from the iframe api init object in order for this to have an effect. + // hideDisplayName: false, + // // List of buttons to hide from the extra join options dropdown. + // hideExtraJoinButtons: ['no-audio', 'by-phone'], + // }, + + // When 'true', the user cannot edit the display name. + // (Mainly useful when used in conjunction with the JWT so the JWT name becomes read only.) + // readOnlyName: false, + + // If etherpad integration is enabled, setting this to true will + // automatically open the etherpad when a participant joins. This + // does not affect the mobile app since opening an etherpad + // obscures the conference controls -- it's better to let users + // choose to open the pad on their own in that case. + // openSharedDocumentOnJoin: false, + + // If true, shows the unsafe room name warning label when a room name is + // deemed unsafe (due to the simplicity in the name) and a password is not + // set or the lobby is not enabled. + // enableInsecureRoomNameWarning: false, + + // Whether to automatically copy invitation URL after creating a room. + // Document should be focused for this option to work + // enableAutomaticUrlCopy: false, + + // Array with avatar URL prefixes that need to use CORS. + // corsAvatarURLs: [ 'https://www.gravatar.com/avatar/' ], + + // Base URL for a Gravatar-compatible service. Defaults to Gravatar. + // DEPRECATED! Use `gravatar.baseUrl` instead. + // gravatarBaseURL: 'https://www.gravatar.com/avatar/', + + // Setup for Gravatar-compatible services. + // gravatar: { + // // Defaults to Gravatar. + // baseUrl: 'https://www.gravatar.com/avatar/', + // // True if Gravatar should be disabled. + // disabled: false, + // }, + + // App name to be displayed in the invitation email subject, as an alternative to + // interfaceConfig.APP_NAME. + // inviteAppName: null, + + // Moved from interfaceConfig(TOOLBAR_BUTTONS). + // The name of the toolbar buttons to display in the toolbar, including the + // "More actions" menu. If present, the button will display. Exceptions are + // "livestreaming" and "recording" which also require being a moderator and + // some other values in config.js to be enabled. Also, the "profile" button will + // not display for users with a JWT. + // Notes: + // - it's impossible to choose which buttons go in the "More actions" menu + // - it's impossible to control the placement of buttons + // - 'desktop' controls the "Share your screen" button + // - if `toolbarButtons` is undefined, we fallback to enabling all buttons on the UI + // toolbarButtons: [ + // 'camera', + // 'chat', + // 'closedcaptions', + // 'desktop', + // 'download', + // 'embedmeeting', + // 'etherpad', + // 'feedback', + // 'filmstrip', + // 'fullscreen', + // 'hangup', + // 'help', + // 'highlight', + // 'invite', + // 'linktosalesforce', + // 'livestreaming', + // 'microphone', + // 'noisesuppression', + // 'participants-pane', + // 'profile', + // 'raisehand', + // 'recording', + // 'security', + // 'select-background', + // 'settings', + // 'shareaudio', + // 'sharedvideo', + // 'shortcuts', + // 'stats', + // 'tileview', + // 'toggle-camera', + // 'videoquality', + // 'whiteboard', + // ], + + // Holds values related to toolbar visibility control. + // toolbarConfig: { + // // Moved from interfaceConfig.INITIAL_TOOLBAR_TIMEOUT + // // The initial number of milliseconds for the toolbar buttons to be visible on screen. + // initialTimeout: 20000, + // // Moved from interfaceConfig.TOOLBAR_TIMEOUT + // // Number of milliseconds for the toolbar buttons to be visible on screen. + // timeout: 4000, + // // Moved from interfaceConfig.TOOLBAR_ALWAYS_VISIBLE + // // Whether toolbar should be always visible or should hide after x milliseconds. + // alwaysVisible: false, + // // Indicates whether the toolbar should still autohide when chat is open + // autoHideWhileChatIsOpen: false, + // }, + + // Overrides the buttons displayed in the main toolbar. Depending on the screen size the number of displayed + // buttons varies from 2 buttons to 8 buttons. Every array in the mainToolbarButtons array will replace the + // corresponding default buttons configuration matched by the number of buttons specified in the array. Arrays with + // more than 8 buttons or less then 2 buttons will be ignored. When there there isn't an override for a cerain + // configuration (for example when 3 buttons are displayed) the default jitsi-meet configuration will be used. + // The order of the buttons in the array is preserved. + // mainToolbarButtons: [ + // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'reactions', 'participants-pane', 'tileview' ], + // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'participants-pane', 'tileview' ], + // [ 'microphone', 'camera', 'desktop', 'chat', 'raisehand', 'participants-pane' ], + // [ 'microphone', 'camera', 'desktop', 'chat', 'participants-pane' ], + // [ 'microphone', 'camera', 'chat', 'participants-pane' ], + // [ 'microphone', 'camera', 'chat' ], + // [ 'microphone', 'camera' ] + // ], + + // Toolbar buttons which have their click/tap event exposed through the API on + // `toolbarButtonClicked`. Passing a string for the button key will + // prevent execution of the click/tap routine; passing an object with `key` and + // `preventExecution` flag on false will not prevent execution of the click/tap + // routine. Below array with mixed mode for passing the buttons. + // buttonsWithNotifyClick: [ + // 'camera', + // { + // key: 'chat', + // preventExecution: false + // }, + // { + // key: 'closedcaptions', + // preventExecution: true + // }, + // 'desktop', + // 'download', + // 'embedmeeting', + // 'end-meeting', + // 'etherpad', + // 'feedback', + // 'filmstrip', + // 'fullscreen', + // 'hangup', + // 'hangup-menu', + // 'help', + // { + // key: 'invite', + // preventExecution: false + // }, + // 'livestreaming', + // 'microphone', + // 'mute-everyone', + // 'mute-video-everyone', + // 'noisesuppression', + // 'participants-pane', + // 'profile', + // { + // key: 'raisehand', + // preventExecution: true + // }, + // 'recording', + // 'security', + // 'select-background', + // 'settings', + // 'shareaudio', + // 'sharedvideo', + // 'shortcuts', + // 'stats', + // 'tileview', + // 'toggle-camera', + // 'videoquality', + // // The add passcode button from the security dialog. + // { + // key: 'add-passcode', + // preventExecution: false + // }, + // 'whiteboard', + // ], + + // Participant context menu buttons which have their click/tap event exposed through the API on + // `participantMenuButtonClick`. Passing a string for the button key will + // prevent execution of the click/tap routine; passing an object with `key` and + // `preventExecution` flag on false will not prevent execution of the click/tap + // routine. Below array with mixed mode for passing the buttons. + // participantMenuButtonsWithNotifyClick: [ + // 'allow-video', + // { + // key: 'ask-unmute', + // preventExecution: false + // }, + // 'conn-status', + // 'flip-local-video', + // 'grant-moderator', + // { + // key: 'kick', + // preventExecution: true + // }, + // { + // key: 'hide-self-view', + // preventExecution: false + // }, + // 'mute', + // 'mute-others', + // 'mute-others-video', + // 'mute-video', + // 'pinToStage', + // 'privateMessage', + // { + // key: 'remote-control', + // preventExecution: false + // }, + // 'send-participant-to-room', + // 'verify', + // ], + + // List of pre meeting screens buttons to hide. The values must be one or more of the 5 allowed buttons: + // 'microphone', 'camera', 'select-background', 'invite', 'settings' + // hiddenPremeetingButtons: [], + + // An array with custom option buttons for the participant context menu + // type: Array<{ icon: string; id: string; text: string; }> + // customParticipantMenuButtons: [], + + // An array with custom option buttons for the toolbar + // type: Array<{ icon: string; id: string; text: string; backgroundColor?: string; }> + // customToolbarButtons: [], + + // Stats + // + + // Whether to enable stats collection or not in the TraceablePeerConnection. + // This can be useful for debugging purposes (post-processing/analysis of + // the webrtc stats) as it is done in the jitsi-meet-torture bandwidth + // estimation tests. + // gatherStats: false, + + // The interval at which PeerConnection.getStats() is called. Defaults to 10000 + // pcStatsInterval: 10000, + + // Enables sending participants' display names to stats + // enableDisplayNameInStats: false, + + // Enables sending participants' emails (if available) to stats and other analytics + // enableEmailInStats: false, + + // faceLandmarks: { + // // Enables sharing your face coordinates. Used for centering faces within a video. + // enableFaceCentering: false, + + // // Enables detecting face expressions and sharing data with other participants + // enableFaceExpressionsDetection: false, + + // // Enables displaying face expressions in speaker stats + // enableDisplayFaceExpressions: false, + + // // Enable rtc stats for face landmarks + // enableRTCStats: false, + + // // Minimum required face movement percentage threshold for sending new face centering coordinates data. + // faceCenteringThreshold: 10, + + // // Milliseconds for processing a new image capture in order to detect face coordinates if they exist. + // captureInterval: 1000, + // }, + + // Controls the percentage of automatic feedback shown to participants. + // The default value is 100%. If set to 0, no automatic feedback will be requested + // feedbackPercentage: 100, + + // Privacy + // + + // If third party requests are disabled, no other server will be contacted. + // This means avatars will be locally generated and external stats integration + // will not function. + // disableThirdPartyRequests: false, + + + // Peer-To-Peer mode: used (if enabled) when there are just 2 participants. + // + + p2p: { + // Enables peer to peer mode. When enabled the system will try to + // establish a direct connection when there are exactly 2 participants + // in the room. If that succeeds the conference will stop sending data + // through the JVB and use the peer to peer connection instead. When a + // 3rd participant joins the conference will be moved back to the JVB + // connection. + enabled: true, + + // Sets the ICE transport policy for the p2p connection. At the time + // of this writing the list of possible values are 'all' and 'relay', + // but that is subject to change in the future. The enum is defined in + // the WebRTC standard: + // https://www.w3.org/TR/webrtc/#rtcicetransportpolicy-enum. + // If not set, the effective value is 'all'. + // iceTransportPolicy: 'all', + + // Provides a way to set the codec preference on mobile devices, both on RN and mobile browser based + // endpoints. + mobileCodecPreferenceOrder: [ 'H264', 'VP8', 'VP9' ], + // + // Provides a way to set the codec preference on desktop based endpoints. + codecPreferenceOrder: [ 'VP9', 'VP8', 'H264 ], + + // Provides a way to set the codec for screenshare. + // screenshareCodec: 'AV1', + // mobileScreenshareCodec: 'VP8', + + // How long we're going to wait, before going back to P2P after the 3rd + // participant has left the conference (to filter out page reload). + // backToP2PDelay: 5, + + // The STUN servers that will be used in the peer to peer connections + stunServers: [ + + { urls: 'stun:1.turn.{{domain_name}}:5443' }, + { urls: 'stun:2.turn.{{domain_name}}:5443' }, + { urls: 'stun:3.turn.{{domain_name}}:5443' } + ], + + // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead. + // Provides a way to set the video codec preference on the p2p connection. Acceptable + // codec values are 'VP8', 'VP9' and 'H264'. + // preferredCodec: 'H264', + + // DEPRECATED! Use `codecPreferenceOrder/mobileCodecPreferenceOrder` instead. + // Provides a way to prevent a video codec from being negotiated on the p2p connection. + // disabledCodec: '', + }, + + analytics: { + // True if the analytics should be disabled + // disabled: false, + + // The Google Analytics Tracking ID: + // googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1', + + // Matomo configuration: + // matomoEndpoint: 'https://your-matomo-endpoint/', + // matomoSiteID: '42', + + // The Amplitude APP Key: + // amplitudeAPPKey: '<APP_KEY>', + + // Enables Amplitude UTM tracking: + // Default value is false. + // amplitudeIncludeUTM: false, + + // Obfuscates room name sent to analytics (amplitude, rtcstats) + // Default value is false. + // obfuscateRoomName: false, + + // Configuration for the rtcstats server: + // By enabling rtcstats server every time a conference is joined the rtcstats + // module connects to the provided rtcstatsEndpoint and sends statistics regarding + // PeerConnection states along with getStats metrics polled at the specified + // interval. + // rtcstatsEnabled: false, + // rtcstatsStoreLogs: false, + + // In order to enable rtcstats one needs to provide a endpoint url. + // rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/, + + // The interval at which rtcstats will poll getStats, defaults to 10000ms. + // If the value is set to 0 getStats won't be polled and the rtcstats client + // will only send data related to RTCPeerConnection events. + // rtcstatsPollInterval: 10000, + + // This determines if rtcstats sends the SDP to the rtcstats server or replaces + // all SDPs with an empty string instead. + // rtcstatsSendSdp: false, + + // Array of script URLs to load as lib-jitsi-meet "analytics handlers". + // scriptURLs: [ + // "libs/analytics-ga.min.js", // google-analytics + // "https://{{domain_name}}/my-custom-analytics.js", + // ], + + // By enabling watchRTCEnabled option you would want to use watchRTC feature + // This would also require to configure watchRTCConfigParams. + // Please remember to keep rtcstatsEnabled disabled for watchRTC to work. + // watchRTCEnabled: false, + }, + + // Logs that should go be passed through the 'log' event if a handler is defined for it + // apiLogLevels: ['warn', 'log', 'error', 'info', 'debug'], + + // Information about the jitsi-meet instance we are connecting to, including + // the user region as seen by the server. + // deploymentInfo: { + // shard: "shard1", + // region: "europe", + // userRegion: "asia", + // }, + + // Array<string> of disabled sounds. + // Possible values: + // - 'ASKED_TO_UNMUTE_SOUND' + // - 'E2EE_OFF_SOUND' + // - 'E2EE_ON_SOUND' + // - 'INCOMING_MSG_SOUND' + // - 'KNOCKING_PARTICIPANT_SOUND' + // - 'LIVE_STREAMING_OFF_SOUND' + // - 'LIVE_STREAMING_ON_SOUND' + // - 'NO_AUDIO_SIGNAL_SOUND' + // - 'NOISY_AUDIO_INPUT_SOUND' + // - 'OUTGOING_CALL_EXPIRED_SOUND' + // - 'OUTGOING_CALL_REJECTED_SOUND' + // - 'OUTGOING_CALL_RINGING_SOUND' + // - 'OUTGOING_CALL_START_SOUND' + // - 'PARTICIPANT_JOINED_SOUND' + // - 'PARTICIPANT_LEFT_SOUND' + // - 'RAISE_HAND_SOUND' + // - 'REACTION_SOUND' + // - 'RECORDING_OFF_SOUND' + // - 'RECORDING_ON_SOUND' + // - 'TALK_WHILE_MUTED_SOUND' + // disabledSounds: [], + + // DEPRECATED! Use `disabledSounds` instead. + // Decides whether the start/stop recording audio notifications should play on record. + // disableRecordAudioNotification: false, + + // DEPRECATED! Use `disabledSounds` instead. + // Disables the sounds that play when other participants join or leave the + // conference (if set to true, these sounds will not be played). + // disableJoinLeaveSounds: false, + + // DEPRECATED! Use `disabledSounds` instead. + // Disables the sounds that play when a chat message is received. + // disableIncomingMessageSound: false, + + // Information for the chrome extension banner + // chromeExtensionBanner: { + // // The chrome extension to be installed address + // url: 'https://chrome.google.com/webstore/detail/jitsi-meetings/kglhbbefdnlheedjiejgomgmfplipfeb', + // edgeUrl: 'https://microsoftedge.microsoft.com/addons/detail/jitsi-meetings/eeecajlpbgjppibfledfihobcabccihn', + + // // Extensions info which allows checking if they are installed or not + // chromeExtensionsInfo: [ + // { + // id: 'kglhbbefdnlheedjiejgomgmfplipfeb', + // path: 'jitsi-logo-48x48.png', + // }, + // // Edge extension info + // { + // id: 'eeecajlpbgjppibfledfihobcabccihn', + // path: 'jitsi-logo-48x48.png', + // }, + // ] + // }, + + // e2ee: { + // labels: { + // description: '', + // label: '', + // tooltip: '', + // warning: '', + // }, + // externallyManagedKey: false, + // }, + + // Options related to end-to-end (participant to participant) ping. + // e2eping: { + // // Whether ene-to-end pings should be enabled. + // enabled: false, + // + // // The number of responses to wait for. + // numRequests: 5, + // + // // The max conference size in which e2e pings will be sent. + // maxConferenceSize: 200, + // + // // The maximum number of e2e ping messages per second for the whole conference to aim for. + // // This is used to control the pacing of messages in order to reduce the load on the backend. + // maxMessagesPerSecond: 250, + // }, + + // If set, will attempt to use the provided video input device label when + // triggering a screenshare, instead of proceeding through the normal flow + // for obtaining a desktop stream. + // NOTE: This option is experimental and is currently intended for internal + // use only. + // _desktopSharingSourceDevice: 'sample-id-or-label', + + // DEPRECATED! Use deeplinking.disabled instead. + // If true, any checks to handoff to another application will be prevented + // and instead the app will continue to display in the current browser. + // disableDeepLinking: false, + + // The deeplinking config. + // For information about the properties of + // deeplinking.[ios/android].dynamicLink check: + // https://firebase.google.com/docs/dynamic-links/create-manually + // deeplinking: { + // + // // The desktop deeplinking config, disabled by default. + // desktop: { + // appName: 'Jitsi Meet', + // appScheme: 'jitsi-meet, + // download: { + // linux: + // 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet-x86_64.AppImage', + // macos: 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.dmg', + // windows: 'https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.exe' + // }, + // enabled: false + // }, + // // If true, any checks to handoff to another application will be prevented + // // and instead the app will continue to display in the current browser. + // disabled: false, + + // // whether to hide the logo on the deep linking pages. + // hideLogo: false, + + // // The ios deeplinking config. + // ios: { + // appName: 'Jitsi Meet', + // // Specify mobile app scheme for opening the app from the mobile browser. + // appScheme: 'org.jitsi.meet', + // // Custom URL for downloading ios mobile app. + // downloadLink: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905', + // dynamicLink: { + // apn: 'org.jitsi.meet', + // appCode: 'w2atb', + // customDomain: undefined, + // ibi: 'com.atlassian.JitsiMeet.ios', + // isi: '1165103905' + // } + // }, + + // // The android deeplinking config. + // android: { + // appName: 'Jitsi Meet', + // // Specify mobile app scheme for opening the app from the mobile browser. + // appScheme: 'org.jitsi.meet', + // // Custom URL for downloading android mobile app. + // downloadLink: 'https://play.google.com/store/apps/details?id=org.jitsi.meet', + // // Android app package name. + // appPackage: 'org.jitsi.meet', + // fDroidUrl: 'https://f-droid.org/en/packages/org.jitsi.meet/', + // dynamicLink: { + // apn: 'org.jitsi.meet', + // appCode: 'w2atb', + // customDomain: undefined, + // ibi: 'com.atlassian.JitsiMeet.ios', + // isi: '1165103905' + // } + // } + // }, + + // // The terms, privacy and help centre URL's. + // legalUrls: { + // helpCentre: 'https://web-cdn.jitsi.net/faq/meet-faq.html', + // privacy: 'https://jitsi.org/meet/privacy', + // terms: 'https://jitsi.org/meet/terms' + // }, + + // A property to disable the right click context menu for localVideo + // the menu has option to flip the locally seen video for local presentations + // disableLocalVideoFlip: false, + + // A property used to unset the default flip state of the local video. + // When it is set to 'true', the local(self) video will not be mirrored anymore. + // doNotFlipLocalVideo: false, + + // Mainly privacy related settings + + // Disables all invite functions from the app (share, invite, dial out...etc) + // disableInviteFunctions: true, + + // Disables storing the room name to the recents list. When in an iframe this is ignored and + // the room is never stored in the recents list. + // doNotStoreRoom: true, + + // Deployment specific URLs. + // deploymentUrls: { + // // If specified a 'Help' button will be displayed in the overflow menu with a link to the specified URL for + // // user documentation. + // userDocumentationURL: 'https://docs.{{domain_name}}/video-meetings.html', + // // If specified a 'Download our apps' button will be displayed in the overflow menu with a link + // // to the specified URL for an app download page. + // downloadAppsUrl: 'https://docs.{{domain_name}}/our-apps.html', + // }, + + // Options related to the remote participant menu. + // remoteVideoMenu: { + // // Whether the remote video context menu to be rendered or not. + // disabled: true, + // // If set to true the 'Switch to visitor' button will be disabled. + // disableDemote: true, + // // If set to true the 'Kick out' button will be disabled. + // disableKick: true, + // // If set to true the 'Grant moderator' button will be disabled. + // disableGrantModerator: true, + // // If set to true the 'Send private message' button will be disabled. + // disablePrivateChat: true, + // }, + + // Endpoint that enables support for salesforce integration with in-meeting resource linking + // This is required for: + // listing the most recent records - salesforceUrl/records/recents + // searching records - salesforceUrl/records?text=${text} + // retrieving record details - salesforceUrl/records/${id}?type=${type} + // and linking the meeting - salesforceUrl/sessions/${sessionId}/records/${id} + // + // salesforceUrl: 'https://api.{{domain_name}}/', + + // If set to true all muting operations of remote participants will be disabled. + // disableRemoteMute: true, + + /** + External API url used to receive branding specific information. + If there is no url set or there are missing fields, the defaults are applied. + The config file should be in JSON. + None of the fields are mandatory and the response must have the shape: + { + // The domain url to apply (will replace the domain in the sharing conference link/embed section) + inviteDomain: '{{domain_name}}pany.org, + // The hex value for the colour used as background + backgroundColor: '#fff', + // The url for the image used as background + backgroundImageUrl: 'https://{{domain_name}}/background-img.png', + // The anchor url used when clicking the logo image + logoClickUrl: 'https://{{domain_name}}pany.org', + // The url used for the image used as logo + logoImageUrl: 'https://{{domain_name}}/logo-img.png', + // Overwrite for pool of background images for avatars + avatarBackgrounds: ['url(https://{{domain_name}}/avatar-background-1.png)', '#FFF'], + // The lobby/prejoin screen background + premeetingBackground: 'url(https://{{domain_name}}/premeeting-background.png)', + // A list of images that can be used as video backgrounds. + // When this field is present, the default images will be replaced with those provided. + virtualBackgrounds: ['https://{{domain_name}}/img.jpg'], + // Object containing customized icons that should replace the default ones. + // The keys need to be the exact same icon names used in here: + // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/icons/svg/index.ts + // To avoid having the icons trimmed or displayed in an unexpected way, please provide svg + // files containing svg xml icons in the size that the default icons come in. + customIcons: { + IconArrowUp: 'https://{{domain_name}}/arrow-up.svg', + IconDownload: 'https://{{domain_name}}/download.svg', + IconRemoteControlStart: 'https://{{domain_name}}/remote-start.svg', + }, + // Object containing a theme's properties. It also supports partial overwrites of the main theme. + // For a list of all possible theme tokens and their current defaults, please check: + // https://github.com/jitsi/jitsi-meet/tree/master/resources/custom-theme/custom-theme.json + // For a short explanations on each of the tokens, please check: + // https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/ui/Tokens.ts + // IMPORTANT!: This is work in progress so many of the various tokens are not yet applied in code + // or they are partially applied. + customTheme: { + palette: { + ui01: "orange !important", + ui02: "maroon", + surface02: 'darkgreen', + ui03: "violet", + ui04: "magenta", + ui05: "blueviolet", + action01: 'green', + action01Hover: 'lightgreen', + disabled01: 'beige', + success02: 'cadetblue', + action02Hover: 'aliceblue', + }, + typography: { + labelRegular: { + fontSize: 25, + lineHeight: 30, + fontWeight: 500, + } + } + } + } + */ + // dynamicBrandingUrl: '', + + // A list of allowed URL domains for shared video. + // + // NOTE: + // '*' is allowed value and it will allow any URL to be used for shared video. We do not recommend using '*', + // use it at your own risk! + // sharedVideoAllowedURLDomains: [ ], + + // Options related to the participants pane. + // participantsPane: { + // // Enables feature + // enabled: true, + // // Hides the moderator settings tab. + // hideModeratorSettingsTab: false, + // // Hides the more actions button. + // hideMoreActionsButton: false, + // // Hides the mute all button. + // hideMuteAllButton: false, + // }, + + // Options related to the breakout rooms feature. + // breakoutRooms: { + // // Hides the add breakout room button. This replaces `hideAddRoomButton`. + // hideAddRoomButton: false, + // // Hides the auto assign participants button. + // hideAutoAssignButton: false, + // // Hides the join breakout room button. + // hideJoinRoomButton: false, + // }, + + // When true, virtual background feature will be disabled. + // disableVirtualBackground: false, + + // When true the user cannot add more images to be used as virtual background. + // Only the default ones from will be available. + // disableAddingBackgroundImages: false, + + // Sets the background transparency level. '0' is fully transparent, '1' is opaque. + // backgroundAlpha: 1, + + // The URL of the moderated rooms microservice, if available. If it + // is present, a link to the service will be rendered on the welcome page, + // otherwise the app doesn't render it. + // moderatedRoomServiceUrl: 'https://moderated.meet.{{domain_name}}', + + // If true, tile view will not be enabled automatically when the participants count threshold is reached. + // disableTileView: true, + + // If true, the tiles will be displayed contained within the available space rather than enlarged to cover it, + // with a 16:9 aspect ratio (old behaviour). + // disableTileEnlargement: true, + + // Controls the visibility and behavior of the top header conference info labels. + // If a label's id is not in any of the 2 arrays, it will not be visible at all on the header. + // conferenceInfo: { + // // those labels will not be hidden in tandem with the toolbox. + // alwaysVisible: ['recording', 'raised-hands-count'], + // // those labels will be auto-hidden in tandem with the toolbox buttons. + // autoHide: [ + // 'subject', + // 'conference-timer', + // 'participants-count', + // 'e2ee', + // 'video-quality', + // 'insecure-room', + // 'highlight-moment', + // 'top-panel-toggle', + // ] + // }, + + // Hides the conference subject + // hideConferenceSubject: false, + + // Hides the conference timer. + // hideConferenceTimer: false, + + // Hides the recording label + // hideRecordingLabel: false, + + // Hides the participants stats + // hideParticipantsStats: true, + + // Sets the conference subject + // subject: 'Conference Subject', + + // Sets the conference local subject + // localSubject: 'Conference Local Subject', + + // This property is related to the use case when jitsi-meet is used via the IFrame API. When the property is true + // jitsi-meet will use the local storage of the host page instead of its own. This option is useful if the browser + // is not persisting the local storage inside the iframe. + // useHostPageLocalStorage: true, + + // Etherpad ("shared document") integration. + // + // If set, add a "Open shared document" link to the bottom right menu that + // will open an etherpad document. + // etherpad_base: 'https://your-etherpad-installati.on/p/', + + // To enable information about dial-in access to meetings you need to provide + // dialInNumbersUrl and dialInConfCodeUrl. + // dialInNumbersUrl returns a json array of numbers that can be used for dial-in. + // {"countryCode":"US","tollFree":false,"formattedNumber":"+1 123-456-7890"} + // dialInConfCodeUrl is the conference mapper converting a meeting id to a PIN used for dial-in + // or the other way around (more info in resources/cloud-api.swagger) + + // You can use external service for authentication that will redirect back passing a jwt token + // You can use tokenAuthUrl config to point to a URL of such service. + // The URL for the service supports few params which will be filled in by the code. + // tokenAuthUrl: + // 'https://myservice.com/auth/{room}?code_challenge_method=S256&code_challenge={code_challenge}&state={state}' + // Supported parameters in tokenAuthUrl: + // {room} - will be replaced with the room name + // {code_challenge} - (A web only). A oauth 2.0 code challenge that will be sent to the service. See: + // https://datatracker.ietf.org/doc/html/rfc7636. The code verifier will be saved in the sessionStorage + // under key: 'code_verifier'. + // {state} - A json with the current state before redirecting. Keys that are included in the state: + // - room (The current room name as shown in the address bar) + // - roomSafe (the backend safe room name to use (lowercase), that is passed to the backend) + // - tenant (The tenant if any) + // - config.xxx (all config overrides) + // - interfaceConfig.xxx (all interfaceConfig overrides) + // - ios=true (in case ios mobile app is used) + // - android=true (in case android mobile app is used) + // - electron=true (when web is loaded in electron app) + // If there is a logout service you can specify its URL with: + // tokenLogoutUrl: 'https://myservice.com/logout' + // You can enable tokenAuthUrlAutoRedirect which will detect that you have logged in successfully before + // and will automatically redirect to the token service to get the token for the meeting. + // tokenAuthUrlAutoRedirect: false + + // You can put an array of values to target different entity types in the invite dialog. + // Valid values are "phone", "room", "sip", "user", "videosipgw" and "email" + // peopleSearchQueryTypes: ["user", "email"], + // Directory endpoint which is called for invite dialog autocomplete + // peopleSearchUrl: "https://myservice.com/api/people", + // Endpoint which is called to send invitation requests + // inviteServiceUrl: "https://myservice.com/api/invite", + + // For external entities (e. g. email), the localStorage key holding the token value for directory authentication + // peopleSearchTokenLocation: "mytoken", + + // List of undocumented settings used in jitsi-meet + /** + _immediateReloadThreshold + debug + debugAudioLevels + deploymentInfo + dialOutAuthUrl + dialOutCodesUrl + dialOutRegionUrl + disableRemoteControl + displayJids + firefox_fake_device + googleApiApplicationClientID + iAmRecorder + iAmSipGateway + microsoftApiApplicationClientID + requireDisplayName + */ + + /** + * This property can be used to alter the generated meeting invite links (in combination with a branding domain + * which is retrieved internally by jitsi meet) (e.g. https://meet.jit.si/someMeeting + * can become https://brandedDomain/roomAlias) + */ + // brandingRoomAlias: null, + + // List of undocumented settings used in lib-jitsi-meet + /** + _peerConnStatusOutOfLastNTimeout + _peerConnStatusRtcMuteTimeout + avgRtpStatsN + desktopSharingSources + disableAEC + disableAGC + disableAP + disableHPF + disableLocalStats + disableNS + enableTalkWhileMuted + forceTurnRelay + hiddenDomain + hiddenFromRecorderFeatureEnabled + ignoreStartMuted + websocketKeepAlive + websocketKeepAliveUrl + */ + + /** + * Default interval (milliseconds) for triggering mouseMoved iframe API event + */ + mouseMoveCallbackInterval: 1000, + + /** + Use this array to configure which notifications will be shown to the user + The items correspond to the title or description key of that notification + Some of these notifications also depend on some other internal logic to be displayed or not, + so adding them here will not ensure they will always be displayed + + A falsy value for this prop will result in having all notifications enabled (e.g null, undefined, false) + */ + // notifications: [ + // 'connection.CONNFAIL', // shown when the connection fails, + // 'dialog.cameraConstraintFailedError', // shown when the camera failed + // 'dialog.cameraNotSendingData', // shown when there's no feed from user's camera + // 'dialog.kickTitle', // shown when user has been kicked + // 'dialog.liveStreaming', // livestreaming notifications (pending, on, off, limits) + // 'dialog.lockTitle', // shown when setting conference password fails + // 'dialog.maxUsersLimitReached', // shown when maximmum users limit has been reached + // 'dialog.micNotSendingData', // shown when user's mic is not sending any audio + // 'dialog.passwordNotSupportedTitle', // shown when setting conference password fails due to password format + // 'dialog.recording', // recording notifications (pending, on, off, limits) + // 'dialog.remoteControlTitle', // remote control notifications (allowed, denied, start, stop, error) + // 'dialog.reservationError', + // 'dialog.screenSharingFailedTitle', // shown when the screen sharing failed + // 'dialog.serviceUnavailable', // shown when server is not reachable + // 'dialog.sessTerminated', // shown when there is a failed conference session + // 'dialog.sessionRestarted', // show when a client reload is initiated because of bridge migration + // 'dialog.tokenAuthFailed', // show when an invalid jwt is used + // 'dialog.tokenAuthFailedWithReasons', // show when an invalid jwt is used with the reason behind the error + // 'dialog.transcribing', // transcribing notifications (pending, off) + // 'dialOut.statusMessage', // shown when dial out status is updated. + // 'liveStreaming.busy', // shown when livestreaming service is busy + // 'liveStreaming.failedToStart', // shown when livestreaming fails to start + // 'liveStreaming.unavailableTitle', // shown when livestreaming service is not reachable + // 'lobby.joinRejectedMessage', // shown when while in a lobby, user's request to join is rejected + // 'lobby.notificationTitle', // shown when lobby is toggled and when join requests are allowed / denied + // 'notify.audioUnmuteBlockedTitle', // shown when mic unmute blocked + // 'notify.chatMessages', // shown when receiving chat messages while the chat window is closed + // 'notify.connectedOneMember', // show when a participant joined + // 'notify.connectedThreePlusMembers', // show when more than 2 participants joined simultaneously + // 'notify.connectedTwoMembers', // show when two participants joined simultaneously + // 'notify.dataChannelClosed', // shown when the bridge channel has been disconnected + // 'notify.hostAskedUnmute', // shown to participant when host asks them to unmute + // 'notify.invitedOneMember', // shown when 1 participant has been invited + // 'notify.invitedThreePlusMembers', // shown when 3+ participants have been invited + // 'notify.invitedTwoMembers', // shown when 2 participants have been invited + // 'notify.kickParticipant', // shown when a participant is kicked + // 'notify.leftOneMember', // show when a participant left + // 'notify.leftThreePlusMembers', // show when more than 2 participants left simultaneously + // 'notify.leftTwoMembers', // show when two participants left simultaneously + // 'notify.linkToSalesforce', // shown when joining a meeting with salesforce integration + // 'notify.localRecordingStarted', // shown when the local recording has been started + // 'notify.localRecordingStopped', // shown when the local recording has been stopped + // 'notify.moderationInEffectCSTitle', // shown when user attempts to share content during AV moderation + // 'notify.moderationInEffectTitle', // shown when user attempts to unmute audio during AV moderation + // 'notify.moderationInEffectVideoTitle', // shown when user attempts to enable video during AV moderation + // 'notify.moderator', // shown when user gets moderator privilege + // 'notify.mutedRemotelyTitle', // shown when user is muted by a remote party + // 'notify.mutedTitle', // shown when user has been muted upon joining, + // 'notify.newDeviceAudioTitle', // prompts the user to use a newly detected audio device + // 'notify.newDeviceCameraTitle', // prompts the user to use a newly detected camera + // 'notify.noiseSuppressionFailedTitle', // shown when failed to start noise suppression + // 'notify.participantWantsToJoin', // shown when lobby is enabled and participant requests to join meeting + // 'notify.participantsWantToJoin', // shown when lobby is enabled and participants request to join meeting + // 'notify.passwordRemovedRemotely', // shown when a password has been removed remotely + // 'notify.passwordSetRemotely', // shown when a password has been set remotely + // 'notify.raisedHand', // shown when a partcipant used raise hand, + // 'notify.screenShareNoAudio', // shown when the audio could not be shared for the selected screen + // 'notify.screenSharingAudioOnlyTitle', // shown when the best performance has been affected by screen sharing + // 'notify.selfViewTitle', // show "You can always un-hide the self-view from settings" + // 'notify.startSilentTitle', // shown when user joined with no audio + // 'notify.suboptimalExperienceTitle', // show the browser warning + // 'notify.unmute', // shown to moderator when user raises hand during AV moderation + // 'notify.videoMutedRemotelyTitle', // shown when user's video is muted by a remote party, + // 'notify.videoUnmuteBlockedTitle', // shown when camera unmute and desktop sharing are blocked + // 'prejoin.errorDialOut', + // 'prejoin.errorDialOutDisconnected', + // 'prejoin.errorDialOutFailed', + // 'prejoin.errorDialOutStatus', + // 'prejoin.errorStatusCode', + // 'prejoin.errorValidation', + // 'recording.busy', // shown when recording service is busy + // 'recording.failedToStart', // shown when recording fails to start + // 'recording.unavailableTitle', // shown when recording service is not reachable + // 'toolbar.noAudioSignalTitle', // shown when a broken mic is detected + // 'toolbar.noisyAudioInputTitle', // shown when noise is detected for the current microphone + // 'toolbar.talkWhileMutedPopup', // shown when user tries to speak while muted + // 'transcribing.failedToStart', // shown when transcribing fails to start + // ], + + // List of notifications to be disabled. Works in tandem with the above setting. + // disabledNotifications: [], + + // Prevent the filmstrip from autohiding when screen width is under a certain threshold + // disableFilmstripAutohiding: false, + + // filmstrip: { + // // Disable the vertical/horizonal filmstrip. + // disabled: false, + // // Disables user resizable filmstrip. Also, allows configuration of the filmstrip + // // (width, tiles aspect ratios) through the interfaceConfig options. + // disableResizable: false, + + // // Disables the stage filmstrip + // // (displaying multiple participants on stage besides the vertical filmstrip) + // disableStageFilmstrip: false, + + // // Default number of participants that can be displayed on stage. + // // The user can change this in settings. Number must be between 1 and 6. + // stageFilmstripParticipants: 1, + + // // Disables the top panel (only shown when a user is sharing their screen). + // disableTopPanel: false, + + // // The minimum number of participants that must be in the call for + // // the top panel layout to be used. + // minParticipantCountForTopPanel: 50, + // }, + + // Tile view related config options. + // tileView: { + // // Whether tileview should be disabled. + // disabled: false, + // // The optimal number of tiles that are going to be shown in tile view. Depending on the screen size it may + // // not be possible to show the exact number of participants specified here. + // numberOfVisibleTiles: 25, + // }, + + // Specifies whether the chat emoticons are disabled or not + // disableChatSmileys: false, + + // Settings for the GIPHY integration. + // giphy: { + // // Whether the feature is enabled or not. + // enabled: false, + // // SDK API Key from Giphy. + // sdkKey: '', + // // Display mode can be one of: + // // - tile: show the GIF on the tile of the participant that sent it. + // // - chat: show the GIF as a message in chat + // // - all: all of the above. This is the default option + // displayMode: 'all', + // // How long the GIF should be displayed on the tile (in milliseconds). + // tileTime: 5000, + // // Limit results by rating: g, pg, pg-13, r. Default value: g. + // rating: 'pg', + // }, + + // Logging + // logging: { + // // Default log level for the app and lib-jitsi-meet. + // defaultLogLevel: 'trace', + // // Option to disable LogCollector. + // //disableLogCollector: true, + // // Individual loggers are customizable. + // loggers: { + // // The following are too verbose in their logging with the default level. + // 'modules/RTC/TraceablePeerConnection.js': 'info', + // 'modules/xmpp/strophe.util.js': 'log', + // }, + + // Application logo url + // defaultLogoUrl: 'images/watermark.svg', + + // Settings for the Excalidraw whiteboard integration. + // whiteboard: { + // // Whether the feature is enabled or not. + // enabled: true, + // // The server used to support whiteboard collaboration. + // // https://github.com/jitsi/excalidraw-backend + // collabServerBaseUrl: 'https://excalidraw-backend.{{domain_name}}', + // // The user access limit to the whiteboard, introduced as a means + // // to control the performance. + // userLimit: 25, + // // The url for more info about the whiteboard and its usage limitations. + // limitUrl: 'https://{{domain_name}}/blog/whiteboard-limits', + // }, + + // The watchRTC initialize config params as described : + // https://testrtc.com/docs/installing-the-watchrtc-javascript-sdk/#h-set-up-the-sdk + // https://www.npmjs.com/package/@testrtc/watchrtc-sdk + // watchRTCConfigParams: { + // /** Watchrtc api key */ + // rtcApiKey: string; + // /** Identifier for the session */ + // rtcRoomId?: string; + // /** Identifier for the current peer */ + // rtcPeerId?: string; + // /** + // * ["tag1", "tag2", "tag3"] + // * @deprecated use 'keys' instead + // */ + // rtcTags?: string[]; + // /** { "key1": "value1", "key2": "value2"} */ + // keys?: any; + // /** Enables additional logging */ + // debug?: boolean; + // rtcToken?: string; + // /** + // * @deprecated No longer needed. Use "proxyUrl" instead. + // */ + // wsUrl?: string; + // proxyUrl?: string; + // console?: { + // level: string; + // override: boolean; + // }; + // allowBrowserLogCollection?: boolean; + // collectionInterval?: number; + // logGetStats?: boolean; + // }, + + // Hide login button on auth dialog, you may want to enable this if you are using JWT tokens to authenticate users + // hideLoginButton: true, +}; + +// Temporary backwards compatibility with old mobile clients. +config.flags = config.flags || {}; +config.flags.sourceNameSignaling = true; +config.flags.sendMultipleVideoStreams = true; +config.flags.receiveMultipleVideoStreams = true; + +// Set the default values for JaaS customers +if (enableJaaS) { + config.dialInNumbersUrl = 'https://conference-mapper.jitsi.net/v1/access/dids'; + config.dialInConfCodeUrl = 'https://conference-mapper.jitsi.net/v1/access'; + config.roomPasswordNumberOfDigits = 10; // skip re-adding it (do not remove comment) +} -- GitLab