From d80458d2f23c52498a2876ce9013ab6856405d59 Mon Sep 17 00:00:00 2001 From: Paolo Asperti Date: Mon, 23 Mar 2020 15:49:50 +0100 Subject: [PATCH] initial import --- .drone.yml | 52 ++ .editorconfig | 24 + .gitignore | 4 + COPYING | 674 ++++++++++++++++++ README.md | 43 ++ libreschool-pxeserver.spec | 89 +++ .../defaults/pxeserver-httpd/TCPPort | 1 + .../defaults/pxeserver-httpd/access | 1 + .../defaults/pxeserver-httpd/status | 1 + .../defaults/pxeserver-httpd/type | 1 + .../e-smith/templates/etc/dnsmasq.conf/81tftp | 19 + .../httpd.conf/00template_defaults | 10 + .../pxeserver-httpd/httpd.conf/20Manager | 46 ++ .../httpd.conf/40DefaultAccess | 7 + .../pxeserver-httpd/httpd.conf/60WebInterface | 16 + .../httpd/pxeserver-httpd/httpd.conf/80Mime | 4 + .../pxeserver-httpd/httpd.conf/90include | 1 + root/etc/logrotate.d/pxeserver-httpd | 9 + root/etc/sysconfig/pxeserver-httpd | 7 + root/srv/ipxe/EsmithDatabase.php | 391 ++++++++++ root/srv/ipxe/alpinelinux/boot | 4 + root/srv/ipxe/arch.txt | 15 + root/srv/ipxe/boot.php | 137 ++++ root/srv/ipxe/localhd/boot | 5 + root/srv/ipxe/memtest/boot | 5 + root/srv/ipxe/memtest/memdisk | Bin 0 -> 25884 bytes root/srv/ipxe/memtest/memtest86-5.01.bin | Bin 0 -> 150024 bytes .../system/pxeserver-httpd-reload.service | 7 + .../system/pxeserver-httpd-reload.timer | 6 + .../systemd/system/pxeserver-httpd.service | 14 + 30 files changed, 1593 insertions(+) create mode 100644 .drone.yml create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 README.md create mode 100644 libreschool-pxeserver.spec create mode 100644 root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/TCPPort create mode 100644 root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/access create mode 100644 root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/status create mode 100644 root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/type create mode 100644 root/etc/e-smith/templates/etc/dnsmasq.conf/81tftp create mode 100644 root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/00template_defaults create mode 100644 root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/20Manager create mode 100644 root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/40DefaultAccess create mode 100644 root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/60WebInterface create mode 100644 root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/80Mime create mode 100644 root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/90include create mode 100644 root/etc/logrotate.d/pxeserver-httpd create mode 100644 root/etc/sysconfig/pxeserver-httpd create mode 100644 root/srv/ipxe/EsmithDatabase.php create mode 100644 root/srv/ipxe/alpinelinux/boot create mode 100644 root/srv/ipxe/arch.txt create mode 100644 root/srv/ipxe/boot.php create mode 100644 root/srv/ipxe/localhd/boot create mode 100644 root/srv/ipxe/memtest/boot create mode 100644 root/srv/ipxe/memtest/memdisk create mode 100644 root/srv/ipxe/memtest/memtest86-5.01.bin create mode 100644 root/usr/lib/systemd/system/pxeserver-httpd-reload.service create mode 100644 root/usr/lib/systemd/system/pxeserver-httpd-reload.timer create mode 100644 root/usr/lib/systemd/system/pxeserver-httpd.service diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..2c66639 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,52 @@ +kind: pipeline +name: default + +steps: + - name: create_targz + image: registry.libreschool.org/libreschool-automation/rpm-pack:latest + pull: always + settings: + files: + - root + - README.md + - COPYING + when: + event: [ push, tag ] + + - name: build + image: registry.libreschool.org/libreschool-automation/rpm-build:7 + pull: always + commands: + - yum-builddep -y libreschool-pxeserver.spec + - rpmbuild -ba libreschool-pxeserver.spec + - mkdir out ; mv *.rpm noarch/*.rpm out/ + when: + event: [ push, tag ] + + - name: sign + image: registry.libreschool.org/libreschool-automation/rpm-sign:latest + pull: always + settings: + files: out/*.rpm + gpg_key: + from_secret: gpg_key + passphrase: + from_secret: passphrase + when: + event: tag + + - name: gitea_release + image: plugins/gitea-release + settings: + files: out/*.rpm + checksum: + - md5 + - sha1 + - sha256 + - sha512 + api_key: + from_secret: gitea_token + base_url: https://git.libreschool.org + file_exists: skip + when: + event: tag diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ba6d232 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +# EditorConfig is awesome: http://EditorConfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[Makefile] +indent_style = tab + +[**.php] +indent_style = space +indent_size = 4 +curly_bracket_next_line = false + +[**.{js,coffee,html,less,css,json}] +indent_style = space +indent_size = 2 + +[**.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6e99c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.sh +*.tar.* +*.rpm +*.log diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8aec727 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# libreschool-pxeserver # + +[![Build Status](https://drone.libreschool.org/api/badges/LibreSchool/libreschool-pxeserver/status.svg)](https://drone.libreschool.org/LibreSchool/libreschool-pxeserver) + +This package is the common base for PXE/TFTP in the LibreSchool project. + +## Requirements ## + +A working [LibreSchool][] installation is required. + +## Usage ## + +Each host has a property called **PXEImage**, which defines the default PXE image to use for system boot. If this property is not set, the **localhd** image is assumed. You can set this image via db: + +```bash +db hosts setprop lab01 \ + PXEImage memtest +``` + +By running the above command, every time the host is booted, the **memtest** image will be used. + +You can also use the **PXEImageOneTime** property, which will use the specified image on the next PXE boot. The property will be resetted after the boot. + +```bash +db hosts setprop lab01 \ + PXEImage localhd \ + PXEImageOneTime memtest +``` + +By running the above command, the **memtest** image will be used for one boot only. + +## TODO / ideas ## + +* Create a menu, for interactive selection +* PROCESSO APACHE A PARTE!!!!! + +## License ## + +As the rest of the LibreSchool project, libreschool-pxeserver is licensed under [GPLv3][] license. + +[LibreSchool]: https://libreschool.org "LibreSchool Project Homepage" +[NethServer]: https://www.nethserver.org +[GPLv3]: https://www.gnu.org/licenses/gpl-3.0.html diff --git a/libreschool-pxeserver.spec b/libreschool-pxeserver.spec new file mode 100644 index 0000000..69416c2 --- /dev/null +++ b/libreschool-pxeserver.spec @@ -0,0 +1,89 @@ +Summary: LibreSchool PXE server +Name: libreschool-pxeserver +Version: 1.0.0 +Release: 1.ns7 +License: GPL +BuildArch: noarch +BuildRoot: %{_tmppath}/%{name}-root +Source0: %{name}-%{version}.tar.gz +Source1: COPYING +URL: %{url_prefix}/%{name} +Requires: libreschool-release +Requires: nethserver-tftp +Requires: ipxe-bootimgs +Requires: httpd, php, sudo, php-xml, php-mcrypt +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +BuildRequires: nethserver-devtools +BuildRequires: systemd + +%description +LibreSchool PXE server + +%prep +%setup + +%build + +%install +rm -rf $RPM_BUILD_ROOT +(cd root ; find . -depth -not -name '*.orig' -print | cpio -dump $RPM_BUILD_ROOT) +%{genfilelist} $RPM_BUILD_ROOT > %{name}-%{version}-%{release}-filelist +echo "%doc COPYING" >> %{name}-%{version}-%{release}-filelist +mkdir -p %{buildroot}%{_localstatedir}/log/pxeserver-httpd +mkdir -p %{buildroot}%{_localstatedir}/cache/pxeserver-httpd + +%files -f %{name}-%{version}-%{release}-filelist +%attr(0755,srvmgr,srvmgr) %dir %{_localstatedir}/cache/pxeserver-httpd +%attr(0755,srvmgr,srvmgr) %dir %{_localstatedir}/log/pxeserver-httpd +%defattr(-,root,root) + +%pre +if [ "$1" = 2 ]; then + #upgrade + /usr/bin/systemctl stop pxeserver-httpd >/dev/null 2>&1 || : +fi + +%post +/etc/e-smith/events/actions/initialize-default-databases +/sbin/e-smith/db configuration setprop dnsmasq \ + tftp-status enabled \ + dhcp-boot undionly.kpxe +/sbin/e-smith/expand-template /etc/dnsmasq.conf +/sbin/e-smith/signal-event nethserver-dnsmasq-save +[ -e /var/lib/tftpboot/undionly.kpxe ] && [ ! -L /var/lib/tftpboot/undionly.kpxe ] && rm /var/lib/tftpboot/undionly.kpxe +ln -s /usr/share/ipxe/undionly.kpxe /var/lib/tftpboot/undionly.kpxe +[ -e /usr/sbin/pxeserver-httpd ] && [ ! -L /usr/sbin/pxeserver-httpd ] && rm /usr/sbin/pxeserver-httpd +[ ! -L /usr/sbin/pxeserver-httpd ] && ln -s httpd /usr/sbin/pxeserver-httpd +[ ! -d /etc/httpd/pxeserver-httpd ] && mkdir /etc/httpd/pxeserver-httpd +/sbin/e-smith/expand-template /etc/httpd/pxeserver-httpd/httpd.conf +/sbin/e-smith/signal-event runlevel-adjust +/usr/bin/systemctl --no-block start pxeserver-httpd >/dev/null 2>&1 || : +/sbin/e-smith/signal-event firewall-adjust + +%preun +#if [ "$1" = 1 ]; then +# #upgrade +#fi +if [ "$1" = 0 ]; then + #uninstallation + /usr/bin/systemctl stop pxeserver-httpd >/dev/null 2>&1 || : +fi + +%postun +#if [ "$1" = 1 ]; then +# #upgrade +#fi +if [ "$1" = 0 ]; then + #uninstallation + /sbin/e-smith/expand-template /etc/dnsmasq.conf + rm /var/lib/tftpboot/undionly.kpxe + /sbin/e-smith/db configuration delete pxeserver-httpd + /sbin/e-smith/signal-event runlevel-adjust + /sbin/e-smith/signal-event firewall-adjust +fi + +%changelog +* Tue Mar 24 2020 Paolo Asperti - 1.0-1.ns7 +- First release for NethServer 7 diff --git a/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/TCPPort b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/TCPPort new file mode 100644 index 0000000..be10e3b --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/TCPPort @@ -0,0 +1 @@ +3001 diff --git a/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/access b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/access new file mode 100644 index 0000000..a5b73ed --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/access @@ -0,0 +1 @@ +green diff --git a/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/status b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/status new file mode 100644 index 0000000..86981e6 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/status @@ -0,0 +1 @@ +enabled diff --git a/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/type b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/type new file mode 100644 index 0000000..24e1098 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/pxeserver-httpd/type @@ -0,0 +1 @@ +service diff --git a/root/etc/e-smith/templates/etc/dnsmasq.conf/81tftp b/root/etc/e-smith/templates/etc/dnsmasq.conf/81tftp new file mode 100644 index 0000000..48618a5 --- /dev/null +++ b/root/etc/e-smith/templates/etc/dnsmasq.conf/81tftp @@ -0,0 +1,19 @@ +# +# 81tftp +# +{ + $status = $dnsmasq{'tftp-status'} || 'disabled'; + use esmith::NetworksDB; + my $ndb = esmith::NetworksDB->open_ro(); + my $lan = $ndb->green(); + my $ip = $lan->prop('ipaddr'); + my $port = ${'pxeserver-httpd'}{TCPPort} || "3001"; + + if ($status eq 'enabled') { + $OUT.="dhcp-userclass=ENH,iPXE\n"; + $OUT.="dhcp-option=66,\"$ip\"\n"; + $OUT.="dhcp-boot=net:ENH,http://$ip:$port/boot.php\n"; + $OUT.="dhcp-boot=undionly.kpxe\n"; + } + +} \ No newline at end of file diff --git a/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/00template_defaults b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/00template_defaults new file mode 100644 index 0000000..8806356 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/00template_defaults @@ -0,0 +1,10 @@ +{ + # + # 00template_defaults + # + + $localAccess = ''; + $port = ${'pxeserver-httpd'}{TCPPort} || "3001"; + + ""; +} diff --git a/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/20Manager b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/20Manager new file mode 100644 index 0000000..7b5ffec --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/20Manager @@ -0,0 +1,46 @@ +{ + + $OUT .= <s %b" common +LogFormat "%{User-agent}i" agent + +CustomLog /var/log/pxeserver-httpd/access_log common + +KeepAlive On +MaxKeepAliveRequests 100 +KeepAliveTimeout 15 + +MaxClients 150 +MaxRequestsPerChild 100 + +MinSpareServers 1 +MaxSpareServers 5 +StartServers 1 +Timeout 300 + +DirectoryIndex index.php +AccessFileName .htaccess + +HERE +} diff --git a/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/40DefaultAccess b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/40DefaultAccess new file mode 100644 index 0000000..da228a2 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/40DefaultAccess @@ -0,0 +1,7 @@ + + Options None + AllowOverride None + order deny,allow + deny from all + allow from none + diff --git a/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/60WebInterface b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/60WebInterface new file mode 100644 index 0000000..c51c7df --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/60WebInterface @@ -0,0 +1,16 @@ + +DocumentRoot /srv/ipxe + + + Options +Indexes + Order Deny,Allow + Deny from all + Allow from { $localAccess || 'all' } + AddType application/x-httpd-php .php + Options +FollowSymlinks + RewriteEngine on + RewriteBase / + RewriteRule ^ping$ index.php/ping [L] + php_value session.save_path /var/cache/pxeserver-httpd + php_flag magic_quotes_gpc off + diff --git a/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/80Mime b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/80Mime new file mode 100644 index 0000000..08c450a --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/80Mime @@ -0,0 +1,4 @@ +AddDefaultCharset UTF-8 + + TypesConfig /etc/mime.types + diff --git a/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/90include b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/90include new file mode 100644 index 0000000..e7f3cdb --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/pxeserver-httpd/httpd.conf/90include @@ -0,0 +1 @@ +Include conf.d/php.conf diff --git a/root/etc/logrotate.d/pxeserver-httpd b/root/etc/logrotate.d/pxeserver-httpd new file mode 100644 index 0000000..e9ebee3 --- /dev/null +++ b/root/etc/logrotate.d/pxeserver-httpd @@ -0,0 +1,9 @@ +/var/log/pxeserver-httpd/*log { + missingok + notifempty + sharedscripts + delaycompress + postrotate + /bin/systemctl reload pxeserver-httpd > /dev/null 2>/dev/null || true + endscript +} diff --git a/root/etc/sysconfig/pxeserver-httpd b/root/etc/sysconfig/pxeserver-httpd new file mode 100644 index 0000000..c5b7743 --- /dev/null +++ b/root/etc/sysconfig/pxeserver-httpd @@ -0,0 +1,7 @@ +# +# This file can be used to set additional environment variables for +# the pxeserver-httpd process, or pass additional options to the +# pxeserver-httpd executable. See pxeserver-httpd.service unit. +# + +LANG=C diff --git a/root/srv/ipxe/EsmithDatabase.php b/root/srv/ipxe/EsmithDatabase.php new file mode 100644 index 0000000..e0e0268 --- /dev/null +++ b/root/srv/ipxe/EsmithDatabase.php @@ -0,0 +1,391 @@ +. + */ + +/** + * Read and write parameters into SME DB + * + * Ths class implements an interface to SME database executing the command /sbin/e-smith/db with sudo. + * The class needs /etc/sudoers configurazione. In the sudoers file you must have something like this: + * + * Cmnd_Alias SME = /sbin/e-smith/db, /sbin/e-smith/signal-event + * www ALL=NOPASSWD: SME + * + * + * + * @author Giacomo Sanchietti + * @author Davide Principi + * @since 1.0 + * @internal + */ +class EsmithDatabase +{ + + /** + * @var SME DB database command + * */ + private $command = "/usr/bin/sudo /sbin/e-smith/db"; + + /** + * @var $db Database name, it's translated into the db file path. For example: /home/e-smith/db/testdb + * */ + private $db; + + /** + * This static class variable shares a socket connection to smwingsd + * + * @var resource + */ + private static $socket; + + + + + /** + * Construct an object to access a SME Configuration database file + * with $user's privileges. + * + * @param string $database Database name + */ + public function __construct($database) + { + if ( ! $database) + sprintf("%s: You must provide a valid database name.", get_class($this)); + + $this->db = $database; + } + + public function getAll($type = NULL) + { + $output = ""; + + $ret = $this->dbRead('getjson', array(), $output); + if ($ret !== 0) { + sprintf("%s: internal database command failed!", __CLASS__); + } + + $data = json_decode($output, TRUE); + if ( ! is_array($data)) { + sprintf("%s: unexpected json string `%s`", __CLASS__, substr($output, 0, 8)); + } + + $result = array(); + + foreach ($data as $item) { + // Apply type check filter: + if (isset($type) && $type !== $item['type']) { + continue; + } + $props = isset($item['props']) ? $item['props'] : array(); + $result[$item['name']] = array_merge($props, array('type' => $item['type'])); + } + + return $result; + } + + public function getAllByProp($propName = NULL, $propValue = NULL) + { + $output = ""; + + $ret = $this->dbRead('getjson', array(), $output); + if ($ret !== 0) { + sprintf("%s: internal database command failed!", __CLASS__); + } + + $data = json_decode($output, TRUE); + if ( ! is_array($data)) { + sprintf("%s: unexpected json string `%s`", __CLASS__, substr($output, 0, 8)); + } + + $result = array(); + + foreach ($data as $item) { + $item['props']['type'] = $item['type']; + $item['props']['name'] = $item['name']; + + if (isset($propName) && isset($propValue)) { + if (isset($item['props'][$propName]) && $propValue == $item['props'][$propName]) { + $result[$item['name']] = $item['props']; + } + } else { + $result[$item['name']] = $item['props']; + } + } + + return $result; + } + + public function getKey($key) + { + $output = ''; + + $ret = $this->dbRead('getjson', array($key), $output); + if ($ret !== 0) { + sprintf("%s: internal database command failed", __CLASS__); + } + + $data = json_decode($output, TRUE); + + if ($data === 1) { + // Key has not been found + return array(); + } elseif ( ! is_array($data)) { + sprintf("%s: unexpected json string `%s`", __CLASS__, substr($output, 0, 8)); + } + + $data['props']['type'] = $data['type']; + $data['props']['name'] = $data['name']; + return $data['props']; + } + + public function getKeyValue($key) + { + $output = ''; + + $ret = $this->dbRead('getjson', array($key), $output); + if ($ret !== 0) { + sprintf("%s: internal database command failed", __CLASS__); + } + + $data = json_decode($output, TRUE); + + if ($data === 1) { + // Key has not been found + return array(); + } elseif ( ! is_array($data)) { + sprintf("%s: unexpected json string `%s`", __CLASS__, substr($output, 0, 8)); + } + + return $data['type']; + } + + public function setKey($key, $type, $props) + { + $output = NULL; + $ret = $this->dbExec('set', $this->prepareArguments($key, $type, $props), $output); + return ($ret == 0); + } + + public function deleteKey($key) + { + $output = NULL; + $output = NULL; + $ret = $this->dbExec('delete', $this->prepareArguments($key), $output); + return ($ret == 0); + } + + /** + * Return the type of a key + * Act like: /sbin/e-smith/db dbfile gettype key + * + * @param string $key the key to retrieve + * @access public + * @return string the type of the key + */ + public function getType($key) + { + $output = NULL; + $ret = $this->dbRead('gettype', array($key), $output); + return trim($output); + } + + /** + * Set the type of a key + * Act like: /sbin/e-smith/db dbfile settype key type + * + * @param string $key the key to change + * @param string $type the new type + * @access public + * @return bool true on success, FALSE otherwise + */ + public function setType($key, $type) + { + $output = NULL; + $ret = $this->dbExec('settype', $this->prepareArguments($key, $type), $output); + return ($ret == 0); + } + + public function getProp($key, $prop) + { + $output = NULL; + $ret = $this->dbRead('getprop', array($key, $prop), $output); + return trim($output); + } + + public function setProp($key, $props) + { + $output = NULL; + $ret = $this->dbExec('setprop', $this->prepareArguments($key, $props), $output); + return ($ret == 0); + } + + public function delProp($key, $props) + { + $output = NULL; + $ret = $this->dbExec('delprop', array_merge(array($key), array_values($props)), $output); + return ($ret == 0); + } + + /** + * Execute the db command + * @param string $command The command to invoke + * @param array $args The command arguments + * @param string &$output The output from the command process + * @return int The command exit code + */ + private function dbExec($command, $args, &$output) + { + // prepend the database name and command + array_unshift($args, $this->db, $command); + $exitCode = 0; + $oArr = array(); + exec($this->command . ' ' . implode(' ', array_map('escapeshellarg', $args)), $oArr, $exitCode); + $output = implode("\n", $oArr); + return $exitCode; + } + + /** + * Read db data from memory cache daemon + * @param string $command The command to invoke + * @param array $args The command arguments + * @param string &$output The output from the read socket + * @return int The command exit code + */ + private function dbRead($command, $args, &$output) + { + if ( ! isset(self::$socket) ) { + $socketPath = '/var/run/smwingsd.sock'; + $errno = 0; + $errstr = ''; + self::$socket = fsockopen('unix://' . $socketPath, -1, $errno, $errstr); + if( ! is_resource(self::$socket)) { + sprintf("Invalid socket (%d): %s. Fall back to exec().", $errno, $errstr); + } + } + + if ( ! is_resource(self::$socket)) { + return $this->dbExec($command, call_user_func_array(array($this, 'prepareArguments'), $args), $output); + } + + // prepend the database name and command + array_unshift($args, $this->db, $command); + + $ret = $this->sendMessage(self::$socket, 0x10, $args); + if ( ! $ret ) { + return 1; + } + $ret = $this->recvMessage(self::$socket); + if ( ! $ret ) { + return 1; + } + if ($command === 'getjson') { + $output = $ret; + } else { + $output = json_decode($ret, TRUE); + } + + return 0; + } + + private function sendMessage($socket, $type, $args = array()) + { + $payload = json_encode($args); + $data = pack('CN', (int) $type, strlen($payload)) . $payload; + $written = fwrite($socket, $data); + if ($written !== strlen($data)) { + echo 'Socket write error'; + } + return TRUE; + } + + private function recvMessage($socket) + { + $buf = $this->safeRead($socket, 5); + if ($buf === FALSE) { + echo 'Socket read error'; + return false; + } + + $header = unpack('Ctype/Nsize', $buf); + if ( ! is_array($header)) { + echo 'Invalid message header'; + return false; + } + + $message = $this->safeRead($socket, $header['size']); + if ($message === FALSE) { + echo 'Socket read error'; + return false; + } + + if ($header['type'] & 0x02) { + return NULL; + } + + return $message; + } + + private function safeRead($socket, $size) + { + $buffer = ""; + $count = 0; + while($count < $size) { + if(feof($socket)) { + return FALSE; + } + $chunk = fread($socket, $size - $count); + $count += strlen($chunk); + if($chunk === FALSE) { + return FALSE; + } + $buffer .= $chunk; + } + return $buffer; + } + + + /** + * Take arbitrary arguments and flattenize to an array + * + * @param mixed $_ + * @return array + */ + private function prepareArguments() + { + $args = array(); + + foreach (func_get_args() as $arg) { + if (is_array($arg)) { + foreach ($arg as $propName => $propValue) { + $args[] = $propName; + $args[] = $propValue; + } + } else { + $args[] = (String) $arg; + } + } + + return $args; + } + + + + +} \ No newline at end of file diff --git a/root/srv/ipxe/alpinelinux/boot b/root/srv/ipxe/alpinelinux/boot new file mode 100644 index 0000000..e49efff --- /dev/null +++ b/root/srv/ipxe/alpinelinux/boot @@ -0,0 +1,4 @@ +#!ipxe + +chain http://boot.alpinelinux.org/boot.ipxe + diff --git a/root/srv/ipxe/arch.txt b/root/srv/ipxe/arch.txt new file mode 100644 index 0000000..565a565 --- /dev/null +++ b/root/srv/ipxe/arch.txt @@ -0,0 +1,15 @@ +#!ipxe + +##### check architecture +cpuid --ext 29 && goto x86_64 || goto x86 + +:x86_64 +set arch x86_64 || +goto go_on + +:x86 +set arch x86 || +goto go_on + +:go_on + diff --git a/root/srv/ipxe/boot.php b/root/srv/ipxe/boot.php new file mode 100644 index 0000000..746943b --- /dev/null +++ b/root/srv/ipxe/boot.php @@ -0,0 +1,137 @@ + + * @copyright 2020 The LibreSchool project + * @license https://www.gnu.org/licenses/gpl-3.0.en.html GPL-3.0 + * @version GIT: $Id$ + * @link https://git.libreschool.org/LibreSchool/libreschool-pxeserver + */ + +require_once "EsmithDatabase.php"; + +$hosts_db = new EsmithDatabase('hosts'); + +/** + * Check if specified mac address is valid + * + * We should've used filter_var($mac, FILTER_VALIDATE_MAC) but it's available + * from PHP 5.5.0 and we have 5.4.16. Too bad. + * + * @param string $mac the mac address to examine + * + * @return bool if the macaddress is valid or not + */ +function isValidMAC($mac) { + if (preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', $mac)) { + // 01:23:45:67:89:ab + return true; + } elseif (preg_match('/^([a-fA-F0-9]{2}\-){5}[a-fA-F0-9]{2}$/', $mac)) { + // 01-23-45-67-89-ab + return true; + } elseif (preg_match('/^[a-fA-F0-9]{12}$/', $mac)) { + // 0123456789ab + return true; + } else if (preg_match('/^([a-fA-F0-9]{4}\.){2}[a-fA-F0-9]{4}$/', $mac)) { + // 0123.4567.89ab + return true; + } else { + return false; + } +} + +/** + * Get the client corresponding a specific mac address + * + * @param string $mac the mac address of the client + * + * @return host||boolean client if found, false otherwise + */ +function getClientFromMAC($mac=false) { + global $hosts_db; + $hosts = $hosts_db->getAllByProp('MacAddress', $mac); + if (count($hosts)>0) { + return array_pop($hosts); + } else { + return false; + } +} + +/** + * Default exit string + * This string will instruct to reload the script + * passing the mac address of the calling machine + * + * @return null + */ +function defaultExit() { + print("#!ipxe + chain http://".$_SERVER['HTTP_HOST'].$_SERVER["SCRIPT_NAME"]."?mac=\${mac} + "); + exit(); +} + + +/** + * Check if specified PXE image exists + * + * @param string $i image name + * + * @return bool if the image exists or not + */ +function imageExists($i) { + $pwd = dirname(__FILE__); + $dir = $pwd . '/' . $i; + $bootfile = $dir . '/boot'; + return is_dir($dir) && is_readable($bootfile); +} + +if (!isset($_REQUEST['mac'])) { + defaultExit(); +} +if (empty($_REQUEST['mac'])) { + defaultExit(); +} +if (!isValidMAC($_REQUEST['mac'])) { + defaultExit(); +} +$mac = $_REQUEST['mac']; +$client = getClientFromMAC($mac); +if (!$client) { + defaultExit(); +} + +if (isset($client['PXEImageOneTime']) && !empty($client['PXEImageOneTime'])) { + // try to boot the OneTime image + if (imageExists($client['PXEImageOneTime'])) { + print("#!ipxe + chain " . $client['PXEImageOneTime'] . "/boot + "); + $props = array( + 'PXEImageOneTime' => '' + ); + $hosts_db->setProp($client['name'], $props); + exit(); + } +} + +if (isset($client['PXEImage']) && !empty($client['PXEImage'])) { + // try to boot the standard image + if (imageExists($client['PXEImage'])) { + print("#!ipxe + chain " . $client['PXEImage'] . "/boot + "); + exit(); + } +} + +print("#!ipxe + chain localhd/boot +"); diff --git a/root/srv/ipxe/localhd/boot b/root/srv/ipxe/localhd/boot new file mode 100644 index 0000000..be9ff60 --- /dev/null +++ b/root/srv/ipxe/localhd/boot @@ -0,0 +1,5 @@ +#!ipxe + +echo Booting from local disks ... +exit 0 + diff --git a/root/srv/ipxe/memtest/boot b/root/srv/ipxe/memtest/boot new file mode 100644 index 0000000..2137231 --- /dev/null +++ b/root/srv/ipxe/memtest/boot @@ -0,0 +1,5 @@ +#!ipxe + +kernel memdisk +initrd memtest86-5.01.bin +boot diff --git a/root/srv/ipxe/memtest/memdisk b/root/srv/ipxe/memtest/memdisk new file mode 100644 index 0000000000000000000000000000000000000000..1c2ba9a85c1eac62ea9e546a3ee27051ef12889c GIT binary patch literal 25884 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