--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://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) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://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:
+
+ {project} Copyright (C) {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
--- /dev/null
+/etc/bodhibuilder.conf
+/etc/bodhibuilder/apt/custom_repos
+/etc/bodhibuilder/firstboot/file-firstboot
+/etc/bodhibuilder/grub/grub.bodhi
--- /dev/null
+Package: bodhibuilder
+Priority: optional
+Section: main
+Maintainer: Jeff Hoogland, Stace Fauske & Charles van de Beek
+Architecture: all
+Version: 2.2.7
+Depends: memtest86+, coreutils, dialog, mkisofs, dpkg-dev | genisoimage, findutils, bash, passwd, sed, squashfs-tools, casper, rsync, mount, eject, libdebian-installer4, os-prober, ubiquity-frontend-debconf, user-setup, discover | discover1, laptop-detect, syslinux, syslinux-utils, util-linux, python, python-glade2, python-vte, plymouth-x11, menu, xorriso, mokutil, sbsigntool, dnsutils
+Conflicts: remastersys, remastersys-gtk
+Provides: remastersys, remastersys-gtk
+Description: Scripts used for building Bodhi Linux ISO images
+ A set of scripts based on remastersys to build bodhi ISO images
--- /dev/null
+#!/bin/bash
+#
+
+# correct ownership & permissions in log files
+log_files="auth.log dmesg kern.log syslog"
+for i in ${log_files} ; do
+ curr_log_file="/var/log/${i}"
+ if [ "${i}" == "dmesg" ] ; then
+ chown root:adm ${curr_log_file}
+ else
+ chown syslog:adm ${curr_log_file}
+ fi
+ chmod 644 ${curr_log_file}
+done
+
--- /dev/null
+#Bodhibuilder Global Configuration File
+
+
+# This is the temporary working directory and won't be included on the cd/dvd
+WORKDIR="/home/bodhibuilder"
+
+
+# Here you can add any other files or directories to be excluded from the live filesystem
+# Use absolute paths (from the root directory)
+# Exclude specific files using the path to the file = /path/to/file
+# Exclude specific directories using a trailing slash = /path/to/directory/
+# Exclude all directory contents with an asterisk = /path/to/directory/*
+# Exclude all matching sets of files or directories using an asterisk as a wildcard = /path/to/something*
+# If the entry does not exist as an actual file or directory, rsync & mksquashfs will simply skip over it
+# Separate each entry with a space
+EXCLUDES=""
+
+
+# Here you can change the livecd/dvd username
+LIVEUSER="bodhi"
+
+
+# Here you can change the name of the livecd/dvd label
+LIVECDLABEL="Bodhi Linux"
+
+
+# Here you can change the name of the ISO file that is created
+CUSTOMISO="bodhibuilder.iso"
+
+
+# Here you can change the mksquashfs options
+# OK to leave this empty, the defaults will use the best compression I know of (as of this writing)
+SQUASHFSOPTS=""
+
+
+# Here you can prevent the Install icon from showing up on the desktop in backup mode. 0 - to not show 1 - to show
+BACKUPSHOWINSTALL="1"
+
+
+# Here you can change the url for the usb-creator info
+LIVECDURL="http://www.bodhilinux.com"
+
+
+# Here you can specify icons or icon sets to INCLUDE.
+# List here the icons or sets you want to keep that are in this path:
+# /usr/share/icons/(icon or icon set name)
+# Do not list the whole path, just the set or icon name in that path.
+# ** If this var is empty, all icons will be included.
+# WARNING: This option may cause problems with the installer on the live ISO.
+# If so, try tweaking this option or leaving it blank.
+DISTICONS=""
+# Example:
+#~ DISTICONS="AwOken-Bodhi hicolor myfavoriteicon1.png myfavoriteicon2.png"
+
+
+# Here you can specify locales to INCLUDE.
+# List here the locales you want to keep that are in this path:
+# /usr/share/locale/(locale name)
+# Do not list the whole path, just the directories of the locales you wish to INCLUDE in that path.
+# ** If this var is empty, all locales will be included.
+DISTLOCALE=""
+# Example:
+#~ DISTLOCALE="en en_AU en_CA en_GB de"
+
+
+# Choose the distribution name you want to show up in GRUB
+DISTNAME="Bodhi Linux"
--- /dev/null
+[Desktop Entry]
+Name=bodhibuilder
+Name[de]=bodhibuilder
+Name[es]=bodhibuilder
+Name[fi]=bodhibuilder
+Name[fr]=bodhibuilder
+Name[ko]=bodhibuilder
+Name[no]=bodhibuilder
+Name[pt_BR]=bodhibuilder
+Name[sl]=bodhibuilder
+Name[sv]=bodhibuilder
+Name[uk]=bodhibuilder
+Name[ro]=bodhibuilder
+Name[zh_TW]=bodhibuilder
+GenericName=bodhibuilder
+Comment=Backup your Ubuntu-based OS
+Comment[de]=Backup your Ubuntu-based OS
+Exec=su-to-root -X -c /usr/bin/bodhibuilder-gtk
+Icon=/usr/share/icons/bodhibuilder-gtk.png
+Terminal=false
+Type=Application
+Categories=GTK;System;
+StartupNotify=true
--- /dev/null
+BODHIBUILDERVERSION="2.2.7"
--- /dev/null
+b43-fwcutter bcmwl-kernel-source dkms efibootmgr fakeroot grub2-common grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed grub-efi-ia32 grub-efi-ia32-bin grub-pc grub-pc-bin libfakeroot libuniconf4.6 libwvstreams4.6-base libwvstreams4.6-extras lupin-support mokutil mouseemu oem-config oem-config-gtk oem-config-slideshow-ubuntu sbsigntool secureboot-db setserial shim shim-signed user-setup wvdial
--- /dev/null
+b43-fwcutter bcmwl-kernel-source dkms efibootmgr fakeroot grub2-common grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-ia32 grub-efi-ia32-bin grub-pc grub-pc-bin libfakeroot libuniconf4.6 libwvstreams4.6-base libwvstreams4.6-extras lupin-support mokutil mouseemu oem-config oem-config-gtk oem-config-slideshow-ubuntu sbsigntool secureboot-db setserial user-setup wvdial
--- /dev/null
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: bodhibuilder-firstboot
+# Required-Start: $remote_fs $syslog $all
+# Required-Stop:
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Run firstboot items for bodhibuilder after a remastered system has been installed
+### END INIT INFO
+
+PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
+
+. /lib/init/vars.sh
+. /lib/lsb/init-functions
+
+do_start() {
+ #REM302
+ if [ "`cat /proc/cmdline | grep casper`" = "" ]; then
+ [ "$VERBOSE" != no ] && log_begin_msg "Running bodhibuilder-firstboot"
+ # Removes this script from boot:
+ (sleep 60 && update-rc.d -f bodhibuilder-firstboot remove) &
+ sed -i -e 's/root:x:/root:!:/g' /etc/shadow
+ ## Ubiquity
+ # Remove ubiquity icon from desktop
+ yes | rm -rf /home/*/Desktop/ubiquity*.desktop
+ yes | rm -rf /home/*/Desktop/UBIQUITY*.desktop
+ yes | rm -rf /usr/share/applications/UBIQUITY.desktop
+ # Remove ubiquity from menus
+ sed -i -e 's/NoDisplay=false/NoDisplay=true/' /usr/share/applications/ubiquity.desktop
+ # Create bodhibuilder desktop file for menus
+ yes | cp -f /etc/bodhibuilder/applications/bodhibuilder-gtk.desktop /usr/share/applications/
+ # Add custom repositories to the installed OS
+ cat /etc/bodhibuilder/apt/custom_repos >> /etc/apt/sources.list && echo '' > /etc/bodhibuilder/apt/custom_repos
+ # Replace OS grub with bodhibuilder's custom grub
+ yes | cp -f /etc/default/grub.bodhi /etc/default/grub
+ update-grub
+
+ ################################################
+ ### Place your custom commands below this line
+ # Please add custom repositories and comments for them into the file
+ # /etc/bodhibuilder/apt/custom_repos
+ # This script will append everything in that file to the
+ # existing /etc/apt/sources.list file
+
+ ### Place your custom commands above this line
+ ################################################
+
+ ES=$?
+ [ "$VERBOSE" != no ] && log_end_msg $ES
+ return $ES
+ fi
+}
+
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ restart|reload|force-reload)
+ echo "Error: argument '$1' not supported" >&2
+ exit 3
+ ;;
+ stop)
+ ;;
+ *)
+ echo "Usage: $0 start|stop" >&2
+ exit 3
+ ;;
+esac
+
--- /dev/null
+# If you change this file, run 'update-grub' afterwards to update
+# /boot/grub/grub.cfg.
+# For full documentation of the options in this file, see:
+# info -f grub -n 'Simple configuration'
+#
+# bodhibuilder grub file
+
+GRUB_DEFAULT=0
+GRUB_HIDDEN_TIMEOUT=0
+#GRUB_HIDDEN_TIMEOUT_QUIET=true
+GRUB_TIMEOUT=7
+GRUB_DISTRIBUTOR="bodhibuilder"
+GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
+GRUB_CMDLINE_LINUX=""
+GRUB_GFXPAYLOAD_LINUX=auto
+
+# Uncomment to enable BadRAM filtering, modify to suit your needs
+# This works with Linux (no patch required) and with any kernel that obtains
+# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
+#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
+
+# Uncomment to disable graphical terminal (grub-pc only)
+#GRUB_TERMINAL=console
+
+# The resolution used on graphical terminal
+# note that you can use only modes which your graphic card supports via VBE
+# you can see them in real GRUB with the command `vbeinfo'
+#GRUB_GFXMODE=640x480
+
+# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
+#GRUB_DISABLE_LINUX_UUID=true
+
+# Uncomment to disable generation of recovery mode menu entries
+#GRUB_DISABLE_RECOVERY="true"
+
+# Uncomment to get a beep at grub start
+#GRUB_INIT_TUNE="480 440 1"
+
+GRUB_BACKGROUND="/etc/grub.d/backgrounds/grub.png"
--- /dev/null
+default vesamenu.c32
+prompt 0
+timeout 100
+
+menu title Boot __DISTNAME__ Live Disc In Legacy / BIOS Mode
+menu background splash.png
+menu color title 1;37;44 #c0ffffff #00000000 std
+
+label live
+ menu label live - Legacy/BIOS boot the Live System
+ kernel /casper/vmlinuz.efi
+ append file=/cdrom/preseed/custom.seed boot=casper initrd=/casper/initrd.lz quiet splash --
+
+label xforcevesa
+ menu label xforcevesa - Legacy/BIOS boot Live in safe graphics mode
+ kernel /casper/vmlinuz.efi
+ append file=/cdrom/preseed/custom.seed boot=casper nomodeset xforcevesa initrd=/casper/initrd.lz quiet splash --
+
+label memtest
+ menu label memtest - Run memtest
+ kernel /install/memtest
+ append -
+
+label check
+ menu label check - check distro integrity
+ kernel /casper/vmlinuz.efi
+ append boot=casper integrity-check initrd=/casper/initrd.lz quiet splash --
+
+label hd
+ menu label hd - boot the first hard disk
+ localboot 0x80
+ append -
+
+label hdVB
+ menu label hdVB - boot first hard disk (VirtualBox)
+ kernel chain.c32
+ append hd0 0
--- /dev/null
+default vesamenu.c32
+prompt 0
+timeout 100
+
+menu title __LIVECDLABEL__
+menu background splash.png
+menu color title 1;37;44 #c0ffffff #00000000 std
+
+label live
+ menu label live - boot the Live System
+ kernel /casper/vmlinuz.efi
+ append file=/cdrom/preseed/custom.seed boot=casper initrd=/casper/initrd.lz quiet splash --
+
+label xforcevesa
+ menu label xforcevesa - boot Live in safe graphics mode
+ kernel /casper/vmlinuz.efi
+ append file=/cdrom/preseed/custom.seed boot=casper nomodeset xforcevesa initrd=/casper/initrd.lz quiet splash --
+
+label memtest
+ menu label memtest - Run memtest
+ kernel /install/memtest
+ append -
+
+label check
+ menu label check - check distro integrity
+ kernel /casper/vmlinuz.efi
+ append boot=casper integrity-check initrd=/casper/initrd.lz quiet splash --
+
+label hd
+ menu label hd - boot the first hard disk
+ localboot 0x80
+ append -
+
+
--- /dev/null
+[Plymouth Theme]
+Name=Enriki theme
+Description=Enriki theme
+ModuleName=script
+
+[script]
+ImageDir=/lib/plymouth/themes/Enriki-theme
+ScriptFile=/lib/plymouth/themes/Enriki-theme/mdv.script
--- /dev/null
+# Enriki theme
+
+Window.GetMaxWidth = fun (){
+ i = 0;
+ width = 0;
+ while (Window.GetWidth(i)){
+ width = Math.Max(width, Window.GetWidth(i));
+ i++;
+ }
+ return width;
+};
+
+Window.GetMaxHeight = fun (){
+ i = 0;
+ height = 0;
+ while (Window.GetHeight(i)){
+ height = Math.Max(height, Window.GetHeight(i));
+ i++;
+ }
+ return height;
+};
+
+anim.imagecount = 32;
+anim.target_width = 0.2* 0.46 * Window.GetWidth();
+anim.target_height = 0.2* 0.46 * Window.GetWidth();
+
+fun RotatedImage (index){
+ index = Math.Int(index);
+ if (!RotatedImageCache[index])
+ RotatedImageCache[index] = anim.original_image.Rotate((Math.Pi*2*index)/anim.imagecount).Scale(anim.target_width, anim.target_height);
+
+ return RotatedImageCache[index];
+ }
+
+
+if (Plymouth.GetMode() == "suspend" || Plymouth.GetMode() == "resume") {
+ background.original_image = ImageNew("suspend.png");
+ Window.SetBackgroundTopColor(1, 0, 0);
+ Window.SetBackgroundBottomColor(0, 1, 0);
+}
+else {
+ logo.original_image = ImageNew("logo.png");
+ background.original_image = ImageNew("background.png");
+ Window.SetBackgroundTopColor(0.234, 0.43, 0.705);
+ Window.SetBackgroundBottomColor(0.16, 0.25, 0.44);
+
+ anim.image= ImageNew("animation.png");
+ anim.original_image= anim.image.Scale(anim.target_width, anim.target_width);
+
+ anim.sprite = SpriteNew();
+ anim.sprite.SetImage(RotatedImage (0));
+ anim.sprite.SetX((Window.GetX() + Window.GetWidth() - RotatedImage(0).GetWidth()) / 2);
+ anim.sprite.SetY(Window.GetY() + Window.GetHeight() * 0.37);
+ anim.angle = 0;
+ anim.index = 0;
+
+
+}
+
+ratio = logo.original_image.GetWidth() / logo.original_image.GetHeight();
+reduction = 0.4;
+logo.image = logo.original_image.Scale(reduction * Window.GetMaxWidth() , reduction / ratio * Window.GetMaxWidth());
+logo.sprite = SpriteNew();
+logo.sprite.SetImage(logo.image);
+logo.opacity_angle = 0;
+logo.sprite.SetX((Window.GetX() + Window.GetMaxWidth() - logo.image.GetWidth()) / 2);
+logo.sprite.SetY(Window.GetY() + Window.GetHeight() * 0.37);
+
+background.image = background.original_image.Scale(Window.GetMaxWidth() , Window.GetMaxHeight());
+background.sprite = SpriteNew();
+background.sprite.SetImage(background.image);
+background.sprite.SetPosition(Window.GetX(), Window.GetY(), -10);
+
+sprite_prompt = SpriteNew();
+
+fun refresh_callback ()
+ {
+ if (status == "normal")
+ {
+ anim.index += 1;
+ anim.index %= anim.imagecount;
+ anim.sprite.SetImage(RotatedImage (anim.index));
+ #anim.sprite.SetOpacity (1);
+ motif.sprite.SetOpacity(motif.opacity);
+ }
+ else
+ {
+ anim.sprite.SetOpacity(0);
+ motif.sprite.SetOpacity(0);
+ }
+
+ }
+
+if (Plymouth.GetMode() != "suspend" && Plymouth.GetMode() != "resume") {
+ Plymouth.SetRefreshFunction (refresh_callback);
+}
+
+#----------------------------------------- Dialog --------------------------------
+
+status = "normal";
+
+fun dialog_setup()
+ {
+ local.box;
+ local.lock;
+ local.entry;
+ local.prompt_sprite;
+
+ box.image = ImageNew("box.png");
+ lock.image = ImageNew("lock.png");
+ entry.image = ImageNew("entry.png");
+
+ box.sprite = SpriteNew();
+ box.sprite.SetImage(box.image);
+ box.x = Window.GetX() + Window.GetWidth() / 2 - box.image.GetWidth()/2;
+ box.y = Window.GetY() + Window.GetHeight() / 2 - box.image.GetHeight()/2;
+ box.z = 10000;
+ box.sprite.SetPosition(box.x, box.y, box.z);
+
+ lock.sprite = SpriteNew();
+ lock.sprite.SetImage(lock.image);
+ lock.x = box.x + box.image.GetWidth()/2 - (lock.image.GetWidth() + entry.image.GetWidth()) / 2;
+ lock.y = box.y + box.image.GetHeight()/2 - lock.image.GetHeight()/2;
+ lock.z = box.z + 1;
+ lock.sprite.SetPosition(lock.x, lock.y, lock.z);
+
+ entry.sprite = SpriteNew();
+ entry.sprite.SetImage(entry.image);
+ entry.x = lock.x + lock.image.GetWidth();
+ entry.y = box.y + box.image.GetHeight()/2 - entry.image.GetHeight()/2;
+ entry.z = box.z + 1;
+ entry.sprite.SetPosition(entry.x, entry.y, entry.z);
+
+ prompt_sprite = SpriteNew();
+ prompt_sprite.SetPosition(box.x, box.y - 20, box.z);
+
+ global.dialog.box = box;
+ global.dialog.lock = lock;
+ global.dialog.entry = entry;
+ global.dialog.bullet_image = ImageNew("bullet.png");
+ global.dialog.prompt_sprite = prompt_sprite;
+ dialog_opacity (1);
+ }
+
+fun dialog_opacity(opacity)
+ {
+ dialog.box.sprite.SetOpacity(opacity);
+ dialog.lock.sprite.SetOpacity(opacity);
+ dialog.entry.sprite.SetOpacity(opacity);
+ dialog.prompt_sprite.SetOpacity(opacity);
+ for (index = 0; dialog.bullet[index]; index++)
+ {
+ dialog.bullet[index].sprite.SetOpacity(opacity);
+ }
+ }
+
+fun display_normal_callback ()
+ {
+ global.status = "normal";
+ if (global.dialog)
+ dialog_opacity (0);
+ }
+
+fun display_password_callback (prompt, bullets)
+ {
+ global.status = "password";
+ if (!global.dialog)
+ dialog_setup();
+ else
+ dialog_opacity(1);
+ motif.sprite.SetOpacity(0);
+ anim.sprite.SetOpacity(0);
+
+ dialog.prompt_sprite.SetImage(Image.Text(prompt, 1.0, 1.0, 1.0));
+ for (index = 0; dialog.bullet[index] || index < bullets; index++)
+ {
+
+ if (!dialog.bullet[index])
+ {
+ dialog.bullet[index].sprite = SpriteNew();
+ dialog.bullet[index].sprite.SetImage(dialog.bullet_image);
+ dialog.bullet[index].x = dialog.entry.x + index * dialog.bullet_image.GetWidth();
+ dialog.bullet[index].y = dialog.entry.y + dialog.entry.image.GetHeight() / 2 - dialog.bullet_image.GetHeight() / 2;
+ dialog.bullet[index].z = dialog.entry.z + 1;
+ dialog.bullet[index].sprite.SetPosition(dialog.bullet[index].x, dialog.bullet[index].y, dialog.bullet[index].z);
+ }
+ if (index < bullets)
+ dialog.bullet[index].sprite.SetOpacity(1);
+ else
+ dialog.bullet[index].sprite.SetOpacity(0);
+ }
+ }
+
+fun display_message_callback (prompt)
+ {
+
+prompt = Image.Text(prompt,1.0, 1.0, 1.0);
+sprite_prompt.SetImage(prompt);
+sprite_prompt.SetPosition(Window.GetX() + (Window.GetWidth() - prompt.GetWidth()) / 2, Window.GetY() + Window.GetHeight() * 0.93, 2);
+ }
+
+/* instantiate dialog at startup, to ensure all icons are loaded in memory before initrd is unmounted, in case /usr isn't mounted yet */
+dialog_setup(); dialog_opacity(0);
+Plymouth.SetDisplayNormalFunction(display_normal_callback);
+Plymouth.SetDisplayPasswordFunction(display_password_callback);
+Plymouth.SetMessageFunction(display_message_callback);
+
+
+#----------------------------------------- Quit --------------------------------
+
+fun quit_callback ()
+{
+ anim.sprite.SetOpacity (0);
+ if (Plymouth.GetMode() == "shutdown") {
+ motif.sprite.SetOpacity(0);
+ }
+}
+
+Plymouth.SetQuitFunction(quit_callback);
+
--- /dev/null
+# Only install the standard system and language packs.
+tasksel tasksel/first multiselect
+d-i pkgsel/language-pack-patterns string
+# No language support packages.
+d-i pkgsel/install-language-support boolean false
--- /dev/null
+#! /bin/sh -e
+
+. /usr/share/debconf/confmodule
+
+if CODENAME="$(lsb_release -cs)"; then
+ # TODO cjwatson 2006-04-07: wrong for Debian, I think
+ db_set mirror/suite "$CODENAME"
+ db_set mirror/codename "$CODENAME"
+fi
+
+rm -f /target/etc/apt/sources.list
+rm -f /target/etc/apt/sources.list.d/dvd.list
+PATH="/usr/lib/ubiquity/apt-setup:/usr/lib/ubiquity/choose-mirror:$PATH" \
+ OVERRIDE_BASE_INSTALLABLE=1 OVERRIDE_LEAVE_CD_MOUNTED=1 \
+ /usr/lib/ubiquity/apt-setup/apt-setup --log-output /target
+
+# UEFI support for VM's:
+if [ -e /target/boot/efi ] ; then
+ rm -f /target/boot/efi/startup.nsh*
+ touch /target/boot/efi/startup.nsh
+ ARCH=`archdetect | cut -d/ -f1`
+ if [ "${ARCH}" = "amd64" ] ; then
+ echo "fs0:\EFI\ubuntu\grubx64.efi" >> /target/boot/efi/startup.nsh
+ else
+ echo "fs0:\EFI\ubuntu\grubia32.efi" >> /target/boot/efi/startup.nsh
+ fi
+fi
+#~ # ^ replaced ^ by ^ section ^ below ^
+
+#~ yes | rm -f /target/boot/efi/startup.nsh*
+#~ mkdir -p /target/boot/efi
+#~ touch /target/boot/efi/startup.nsh
+#~ ARCH=`archdetect | cut -d/ -f1`
+#~ if [ "${ARCH}" = "amd64" ] ; then
+ #~ echo "fs0:\EFI\ubuntu\grubx64.efi" >> /target/boot/efi/startup.nsh
+#~ else
+ #~ echo "fs0:\EFI\ubuntu\grubia32.efi" >> /target/boot/efi/startup.nsh
+#~ fi
+
+
+rm -f /target/etc/gdm/custom.conf
+rm -f /target/etc/mdm/mdm.conf
--- /dev/null
+[Desktop Entry]
+Type=Application
+Version=1.0
+# Do not translate the word "RELEASE". It is used as a marker by casper.
+Name=Install _LIVE_CD_LABEL_
+Comment=Install this system permanently to your hard disk
+Comment[am]=ይኼን ሲስተም ሀርድ ዲስክዎ ላይ በቋሚነት ይጫኑት
+Comment[ar]=ثبّت هذا النظام على القرص الصلب
+Comment[ast]=Instalar permanentemente esti sistema nel to discu duru
+Comment[be]=Усталяваць гэтую сыстэму на ваш жорсткі дыск
+Comment[bg]=Инсталиране Ubuntu трайно на твърдия диск
+Comment[bn]=এই সিস্টেমটি আপনার হার্ডডিস্কে স্থায়ীভাবে ইনস্টল করুন।
+Comment[bs]=Instaliraj ovaj sistem trajno na hard disk
+Comment[ca]=Instal·la aquest sistema permanentment al disc dur
+Comment[cs]=Nainstalovat tento systém natrvalo na váš disk
+Comment[da]=Installér dette system permanent på din harddisk
+Comment[de]=Dieses System dauerhaft auf der Festplatte installieren
+Comment[el]=Εγκαταστήστε μόνιμα αυτό το σύστημα στο σκληρό σας δίσκο
+Comment[eo]=Instali ĉi tiun sistemon daŭre en via disko
+Comment[es]=Instalar permanentemente este sistema en su disco duro
+Comment[et]=Paigalda see süsteem jäädavalt oma kõvakettale
+Comment[eu]=Sistema hau betiko instalatu disko gogorrean
+Comment[fi]=Asenna tämä järjestelmä pysyvästi kiintolevyllesi
+Comment[fr]=Installer ce système de façon permanente sur votre disque dur
+Comment[ga]=Suiteáil an córas seo go buan ar do chruadhiosca
+Comment[gl]=Instalar o sistema de xeito permanente no disco ríxido
+Comment[gu]=આ સિસ્ટમ તમારી હાર્ડ ડિસ્ક પર હંમેશ માટે સ્થાપિત કરો
+Comment[he]=התקנת המערכת באופן קבוע על הכונן הקשיח
+Comment[hi]=इस तंत्र को आपके हार्ड डिस्क में स्थायी रूप से संस्थापित करें
+Comment[hr]=Trajno instaliraj sustav na čvrsti disk
+Comment[hu]=A rendszer telepítése merevlemezre
+Comment[id]=Memasang sistem ini secara permanen pada diska Anda
+Comment[it]=Installa questo sistema in modo permanente sul disco rigido
+Comment[ja]=このシステムをハードディスクにインストールします
+Comment[ka]=მოცემული სისტემის მყარ დისკზე ჩაყენება
+Comment[kk]=Осы жүйені қатқыл дискіңізге тұрақты орнату
+Comment[km]=ដំឡើងប្រព័ន្ធនេះជាអចិន្ត្រៃយ៍ទៅកាន់ថាសរឹងរបស់អ្នក
+Comment[ko]=이 시스템을 하드 디스크에 설치합니다.
+Comment[ku]=Sîstemê di hard dîskê xwe de saz bike
+Comment[lt]=Įdiegti Linux operacinę sistemą į kompiuterio (standųjį) diską
+Comment[lv]=Instalēt šo sistēmu cietajā diskā
+Comment[mk]=Инсталирајте го системот трајно на Вашиот тврд диск
+Comment[ml]=സ്ഥിരമായി ഹാര്ഡ് ഡിസ്കിലേക്ക് ഇന്സ്റ്റാള് ചെയ്യുക
+Comment[mr]=ही प्रणाली कायमची तुमच्या हार्ड डिस्कवर स्थापित करा
+Comment[ne]=यो प्रणाली तपाईको हार्ड डिस्कमा स्थाई रुपमा प्रतिस्थापन गर्नुहोस्
+Comment[nl]=Dit systeem definitief op uw harde schijf installeren
+Comment[pa]=ਇਹ ਸਿਸਟਮ ਪੱਕੇ ਤੌਰ ਉੱਤੇ ਆਪਣੀ ਹਾਰਡ ਡਿਸਕ ਉੱਤੇ ਇੰਸਟਾਲ
+Comment[pl]=Instaluje system na dysku twardym
+Comment[pt]=Instalar este sistema permanentemente no seu disco rígido
+Comment[pt_BR]=Instalar este sistema de maneira permanente no seu disco rígido
+Comment[ro]=Instalați permanent acest sistem pe discul calculatorului
+Comment[ru]=Установить эту систему на жёсткий диск
+Comment[sk]=Nainštalovať systém natrvalo na pevný disk
+Comment[sl]=Trajno namesti sistem na trdi disk
+Comment[sq]=Instalo këtë sistem përgjithmonë në Hard Disk
+Comment[sr]=Инсталирајте овај систем трајно на ваш хард диск
+Comment[sv]=Installera detta system permanent på din hårddisk
+Comment[ta]=இந்த கணினியை நிறந்திரமாக தங்களுடைய கணினியில் நிறுவுக
+Comment[th]=ติดตั้งระบบนี้อย่างถาวรลงบนฮาร์ดดิสก์ของคุณ
+Comment[tl]=Iluklok ng permanente ang systema sa iyong hard disk
+Comment[tr]=Bu sistemi sabit diskinize kalıcı olarak kurun
+Comment[uk]=Встановити цю систему на жорсткий диск
+Comment[vi]=Cài hệ thống vào đĩa cứng
+Comment[zh_CN]=将这个系统永久安装在您的硬盘上
+Comment[zh_TW]=將此系統安裝到您的硬碟中
+Keywords=ubiquity;
+#use sh because pkexec is broken under xfce/lxce http://pad.lv/1193526
+Exec=sudo ubiquity gtk_ui
+Icon=/usr/share/icons/bbinstall.png
+Terminal=false
+Categories=GTK;System;Settings;
+NotShowIn=KDE;
+NoDisplay=false
+#X-Ubuntu-Gettext-Domain=ubiquity-desktop
+X-Ayatana-Appmenu-Show-Stubs=False
--- /dev/null
+
+if loadfont /boot/grub/font.pf2 ; then
+ set gfxmode=auto
+ insmod efi_gop
+ insmod efi_uga
+ insmod gfxterm
+ terminal_output gfxterm
+fi
+
+set default="0"
+set menu_color_normal=white/black
+set menu_color_highlight=black/light-gray
+set_background_image "/isolinux/splash.png"
+set timeout=7
+
+menuentry "UEFI Boot __DISTNAME__ Live Disc" {
+ set gfxpayload=keep
+ linux /casper/vmlinuz.efi file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash --
+ initrd /casper/initrd.lz
+}
+#~ # New entry: ERROR - boots to black screen in VirtualBox
+#~ menuentry "Bodhi in safe mode" {
+ #~ linux /casper/vmlinuz.efi file=/cdrom/preseed/ubuntu.seed boot=casper xforcevesa quiet splash
+ #~ initrd /casper/initrd.lz
+#~ }
+#~ # New entry: ERROR - does not boot into cli
+#~ menuentry "Bodhi CLI" {
+ #~ linux /casper/vmlinuz.efi file=/cdrom/preseed/ubuntu.seed boot=casper textonly quiet splash
+ #~ initrd /casper/initrd.lz
+#~ }
+menuentry "Check disc for defects" {
+ set gfxpayload=keep
+ linux /casper/vmlinuz.efi boot=casper integrity-check quiet splash --
+ initrd /casper/initrd.lz
+}
+#~ # New entry: ERROR - /boot/memtest86+.bin not found
+#~ menuentry "Memory Test" {
+ #~ linux16 /boot/memtest86+.bin
+#~ }
+#~ # New entry: ERROR -
+#~ menuentry "Boot from the first hard disk" {
+ #~ set root=(hd0)
+ #~ chainloader +1
+#~ }
--- /dev/null
+menuentry "Try Lubuntu without installing" {
+ set gfxpayload=keep
+ linux /casper/vmlinuz.efi file=/cdrom/preseed/lubuntu.seed boot=casper iso-scan/filename=${iso_path} quiet splash ---
+ initrd /casper/initrd.lz
+}
+menuentry "Install Lubuntu" {
+ linux /casper/vmlinuz.efi file=/cdrom/preseed/lubuntu.seed boot=casper only-ubiquity iso-scan/filename=${iso_path} quiet splash ---
+ initrd /casper/initrd.lz
+}
+menuentry "Check disc for defects" {
+ linux /casper/vmlinuz.efi boot=casper integrity-check iso-scan/filename=${iso_path} quiet splash ---
+ initrd /casper/initrd.lz
+}
+menuentry "Test memory" {
+ linux16 /install/mt86plus
+}
--- /dev/null
+*acpi: acpi
+*all_functional_test: functional_test
+*background_image: gfxterm_background
+*cat: cat
+*cpuid: cpuid
+*crc: hashsum
+*cryptomount: cryptodisk
+*echo: echo
+*extract_syslinux_entries_configfile: syslinuxcfg
+*extract_syslinux_entries_source: syslinuxcfg
+*file: file
+*functional_test: functional_test
+*gettext: gettext
+*hashsum: hashsum
+*hdparm: hdparm
+*hello: hello
+*help: help
+*hexdump: hexdump
+*inb: iorw
+*inl: iorw
+*inw: iorw
+*keystatus: keystatus
+*kfreebsd: bsd
+*knetbsd: bsd
+*kopenbsd: bsd
+*list_env: loadenv
+*load_env: loadenv
+*loopback: loopback
+*ls: ls
+*lsacpi: lsacpi
+*lspci: lspci
+*md5sum: hashsum
+*menuentry: normal
+*pcidump: pcidump
+*probe: probe
+*read_byte: memrw
+*read_dword: memrw
+*read_word: memrw
+*regexp: regexp
+*save_env: loadenv
+*search: search
+*serial: serial
+*setpci: setpci
+*sha1sum: hashsum
+*sha256sum: hashsum
+*sha512sum: hashsum
+*sleep: sleep
+*submenu: normal
+*syslinux_configfile: syslinuxcfg
+*syslinux_source: syslinuxcfg
+*terminfo: terminfo
+*test_blockarg: test_blockarg
+*testspeed: testspeed
+*tr: tr
+*trust: verify
+*verify_detached: verify
+*xnu_splash: xnu
+*zfskey: zfscrypt
+.: configfile
+[: test
+appleloader: appleldr
+authenticate: normal
+background_color: gfxterm_background
+backtrace: backtrace
+badram: mmap
+blocklist: blocklist
+boot: boot
+break: normal
+cat: minicmd
+cbmemc: cbmemc
+chainloader: chain
+clear: normal
+cmp: cmp
+configfile: configfile
+continue: normal
+coreboot_boottime: cbtime
+cutmem: mmap
+date: date
+distrust: verify
+dump: minicmd
+eval: eval
+exit: minicmd
+export: normal
+extract_entries_configfile: configfile
+extract_entries_source: configfile
+extract_legacy_entries_configfile: legacycfg
+extract_legacy_entries_source: legacycfg
+fakebios: loadbios
+false: true
+fix_video: fixvideo
+fwsetup: efifwsetup
+gptsync: gptsync
+halt: halt
+help: minicmd
+initrd16: linux16
+initrd: linux
+initrdefi: linuxefi
+keymap: keylayouts
+kfreebsd_loadenv: bsd
+kfreebsd_module: bsd
+kfreebsd_module_elf: bsd
+knetbsd_module: bsd
+knetbsd_module_elf: bsd
+kopenbsd_ramdisk: bsd
+legacy_check_password: legacycfg
+legacy_configfile: legacycfg
+legacy_initrd: legacycfg
+legacy_initrd_nounzip: legacycfg
+legacy_kernel: legacycfg
+legacy_password: legacycfg
+legacy_source: legacycfg
+linux16: linux16
+linux: linux
+linuxefi: linuxefi
+list_trusted: verify
+loadbios: loadbios
+loadfont: font
+lscoreboot: cbls
+lsefi: lsefi
+lsefimmap: lsefimmap
+lsefisystab: lsefisystab
+lsfonts: font
+lsmmap: lsmmap
+lsmod: minicmd
+lssal: lssal
+macppcbless: macbless
+mactelbless: macbless
+module2: multiboot2
+module: multiboot
+multiboot2: multiboot2
+multiboot: multiboot
+nativedisk: nativedisk
+net_add_addr: net
+net_add_dns: net
+net_add_route: net
+net_bootp6: net
+net_bootp: net
+net_del_addr: net
+net_del_dns: net
+net_del_route: net
+net_get_dhcp_option: net
+net_ipv6_autoconf: net
+net_ls_addr: net
+net_ls_cards: net
+net_ls_dns: net
+net_ls_routes: net
+net_nslookup: net
+normal: normal
+normal_exit: normal
+outb: iorw
+outl: iorw
+outw: iorw
+parttool: parttool
+password: password
+password_pbkdf2: password_pbkdf2
+play: play
+read: read
+reboot: reboot
+return: normal
+rmmod: minicmd
+search.file: search_fs_file
+search.fs_label: search_label
+search.fs_uuid: search_fs_uuid
+setparams: normal
+shift: normal
+source: configfile
+terminal_input: terminal
+terminal_output: terminal
+test: test
+testload: testload
+time: time
+true: true
+usb: usbtest
+videoinfo: videoinfo
+videotest: videotest
+write_byte: memrw
+write_dword: memrw
+write_word: memrw
+xnu_devprop_load: xnu
+xnu_kernel64: xnu
+xnu_kernel: xnu
+xnu_kext: xnu
+xnu_kextdir: xnu
+xnu_mkext: xnu
+xnu_ramdisk: xnu
+xnu_resume: xnu
+xnu_uuid: xnu_uuid
+zfs-bootfs: zfsinfo
+zfsinfo: zfsinfo
--- /dev/null
+RIJNDAEL: gcry_rijndael
+RIJNDAEL192: gcry_rijndael
+RIJNDAEL256: gcry_rijndael
+AES128: gcry_rijndael
+AES-128: gcry_rijndael
+AES-192: gcry_rijndael
+AES-256: gcry_rijndael
+ADLER32: adler32
+CRC64: crc64
+ARCFOUR: gcry_arcfour
+BLOWFISH: gcry_blowfish
+CAMELLIA128: gcry_camellia
+CAMELLIA192: gcry_camellia
+CAMELLIA256: gcry_camellia
+CAST5: gcry_cast5
+CRC32: gcry_crc
+CRC32RFC1510: gcry_crc
+CRC24RFC2440: gcry_crc
+DES: gcry_des
+3DES: gcry_des
+DSA: gcry_dsa
+IDEA: gcry_idea
+MD4: gcry_md4
+MD5: gcry_md5
+RFC2268_40: gcry_rfc2268
+AES: gcry_rijndael
+AES192: gcry_rijndael
+AES256: gcry_rijndael
+RIPEMD160: gcry_rmd160
+RSA: gcry_rsa
+SEED: gcry_seed
+SERPENT128: gcry_serpent
+SERPENT192: gcry_serpent
+SERPENT256: gcry_serpent
+SHA1: gcry_sha1
+SHA224: gcry_sha256
+SHA256: gcry_sha256
+SHA512: gcry_sha512
+SHA384: gcry_sha512
+TIGER192: gcry_tiger
+TIGER: gcry_tiger
+TIGER2: gcry_tiger
+TWOFISH: gcry_twofish
+TWOFISH128: gcry_twofish
+WHIRLPOOL: gcry_whirlpool
--- /dev/null
+affs
+afs
+bfs
+btrfs
+cbfs
+cpio
+cpio_be
+exfat
+ext2
+fat
+hfs
+hfsplus
+iso9660
+jfs
+minix
+minix2
+minix2_be
+minix3
+minix3_be
+minix_be
+newc
+nilfs2
+ntfs
+odc
+procfs
+reiserfs
+romfs
+sfs
+squash4
+tar
+udf
+ufs1
+ufs1_be
+ufs2
+xfs
+zfs
--- /dev/null
+insmod part_acorn
+insmod part_amiga
+insmod part_apple
+insmod part_bsd
+insmod part_dfly
+insmod part_dvh
+insmod part_gpt
+insmod part_msdos
+insmod part_plan
+insmod part_sun
+insmod part_sunpc
+configfile /boot/grub/grub.cfg
--- /dev/null
+squash4: xzio gzio lzopio fshelp
+search_fs_uuid:
+lssal:
+legacycfg: gcry_md5 crypto password normal
+date: datetime normal
+bfs:
+uhci: usb
+multiboot2: boot video net acpi relocator mmap
+gcry_twofish: crypto
+cpio_be: archelp
+priority_queue:
+gcry_rijndael: crypto
+echo: extcmd
+cpio: archelp
+xzio: crypto
+part_sun:
+hfspluscomp: gzio hfsplus
+gcry_sha512: crypto
+gcry_cast5: crypto
+efi_gop: video video_fb
+boot:
+setjmp_test: setjmp functional_test
+odc: archelp
+ls: extcmd normal
+gzio:
+cbmemc: cbtable terminfo normal
+video:
+test_blockarg: extcmd normal
+linuxefi: boot
+gfxterm: video font
+cbtable:
+gcry_tiger: crypto
+gcry_serpent: crypto
+aout:
+macbless: disk
+gcry_blowfish: crypto
+appleldr: boot
+trig:
+extcmd:
+at_keyboard: boot keylayouts
+videoinfo: video
+testspeed: extcmd normal
+minix:
+keylayouts:
+xnu_uuid: gcry_md5
+usbtest: usb
+usbms: usb scsi
+reboot:
+morse:
+help: extcmd normal
+part_msdos:
+http: net
+gcry_rsa: mpi verify
+cbtime: cbtable
+blocklist:
+probe: extcmd
+pbkdf2: crypto
+lsefisystab:
+gcry_rfc2268: crypto
+ufs1_be:
+nativedisk:
+gcry_camellia: crypto
+fat:
+exfctest: functional_test
+parttool: normal
+lzopio: crypto
+linux: boot video relocator mmap
+gcry_md4: crypto
+zfsinfo: zfs
+usb_keyboard: keylayouts usb
+gcry_md5: crypto
+fshelp:
+ehci: boot usb cs5536
+datetime:
+bitmap_scale: bitmap
+ata: scsi
+usbserial_common: usb serial
+syslinuxcfg: extcmd normal
+net: priority_queue boot datetime bufio
+gcry_des: crypto
+div_test: functional_test
+time:
+reiserfs: fshelp
+dm_nv: diskfilter
+datehook: datetime normal
+mdraid09_be: diskfilter
+backtrace:
+ahci: boot ata
+kernel:
+video_cirrus: video video_fb
+part_plan:
+gcry_seed: crypto
+minix_be:
+crypto:
+video_colors:
+test:
+terminal:
+part_dvh:
+lsacpi: extcmd acpi
+jpeg: bufio bitmap
+bsd: boot video aout extcmd gcry_md5 crypto cpuid elf relocator serial mmap
+memdisk:
+gfxmenu: video gfxterm trig bitmap_scale video_colors bitmap normal font
+cmp:
+acpi: extcmd mmap
+xfs: fshelp
+elf:
+cpuid: extcmd
+affs: fshelp
+usb:
+videotest: video gfxmenu font
+tr: extcmd
+testload:
+relocator: mmap
+play:
+gfxterm_menu: video_fb functional_test procfs normal font
+cbfs: archelp
+adler32: crypto
+progress: normal
+password: crypto normal
+part_sunpc:
+video_fb:
+tftp: priority_queue net
+sleep: extcmd normal
+serial: extcmd terminfo
+search_fs_file:
+gcry_sha256: crypto
+gcry_rmd160: crypto
+exfat:
+search: search_fs_uuid extcmd search_fs_file search_label
+mdraid09: diskfilter
+chain: boot net efinet
+mpi: crypto
+memrw: extcmd
+cs5536:
+password_pbkdf2: gcry_sha512 pbkdf2 crypto normal
+mdraid1x: diskfilter
+linux16: boot video relocator mmap
+gcry_crc: crypto
+configfile: normal
+zfscrypt: gcry_rijndael extcmd pbkdf2 crypto zfs gcry_sha1
+signature_test: functional_test procfs
+raid5rec: diskfilter
+pcidump: extcmd
+gcry_arcfour: crypto
+part_dfly:
+minix2_be:
+gettext:
+pbkdf2_test: pbkdf2 gcry_sha1 functional_test
+hello: extcmd
+usbserial_pl2303: usbserial_common usb serial
+hashsum: extcmd crypto normal
+xnu_uuid_test: functional_test
+regexp: extcmd normal
+part_gpt:
+ohci: boot usb cs5536
+gptsync: disk
+zfs: gzio
+part_apple:
+hdparm: extcmd
+bufio:
+btrfs: gzio lzopio
+bitmap:
+true:
+terminfo: extcmd
+romfs: fshelp
+ntfscomp: ntfs
+lsefi:
+hfs:
+gcry_dsa: mpi verify
+cmdline_cat_test: video_fb functional_test procfs normal font
+ufs1:
+offsetio:
+legacy_password_test: legacycfg functional_test
+setjmp:
+ufs2:
+nilfs2: fshelp
+lsmmap: mmap
+gcry_sha1: crypto
+mmap:
+tar: archelp
+png: bufio bitmap
+lspci: extcmd
+hfsplus: fshelp
+cbls: cbtable
+tga: bufio bitmap
+minix2:
+setpci: extcmd
+scsi:
+pata: ata
+minix3:
+lvm: diskfilter
+functional_test: video extcmd video_fb btrfs
+eval: normal
+iso9660: fshelp
+crc64: crypto
+udf: fshelp
+search_label:
+raid6rec: diskfilter
+msdospart: parttool disk
+archelp:
+procfs:
+minix3_be:
+halt: acpi
+xnu: boot video extcmd bitmap_scale relocator bitmap macho
+read:
+multiboot: boot video net relocator mmap
+keystatus: extcmd
+cryptodisk: extcmd crypto procfs
+normal: boot extcmd crypto terminal gettext
+lsefimmap:
+loadbios:
+geli: gcry_sha512 pbkdf2 crypto gcry_sha256 cryptodisk
+spkmodem: terminfo
+gcry_idea: crypto
+video_bochs: video video_fb
+verify: extcmd crypto mpi gcry_sha1
+sfs: fshelp
+part_amiga:
+luks: pbkdf2 crypto cryptodisk
+loopback: extcmd
+jfs:
+gfxterm_background: gfxterm video extcmd bitmap_scale video_colors bitmap
+efifwsetup: reboot
+usbserial_usbdebug: usbserial_common usb serial
+part_acorn:
+newc: archelp
+macho:
+iorw: extcmd
+cat: extcmd
+afs:
+sleep_test: datetime functional_test
+ldm: part_msdos part_gpt diskfilter
+hexdump: extcmd
+efinet: net
+disk:
+usbserial_ftdi: usbserial_common usb serial
+minicmd:
+loadenv: extcmd disk
+gcry_whirlpool: crypto
+fixvideo:
+part_bsd: part_msdos
+font: video bufio
+ext2: fshelp
+diskfilter:
+videotest_checksum: video_fb functional_test font
+file: extcmd elf offsetio macho
+ntfs: fshelp
+efi_uga: video video_fb
+all_video: efi_gop efi_uga video_bochs video_cirrus
--- /dev/null
+part_acorn
+part_amiga
+part_apple
+part_bsd
+part_dfly
+part_dvh
+part_gpt
+part_msdos
+part_plan
+part_sun
+part_sunpc
--- /dev/null
+msdos: msdospart
--- /dev/null
+iat_keyboard: at_keyboard
+iserial: serial
+iserial_*: serial
+oaudio: morse
+ocbmemc: cbmemc
+ogfxterm: gfxterm
+oserial: serial
+oserial_*: serial
+ospkmodem: spkmodem
--- /dev/null
+efi_gop
+efi_uga
+video_bochs
+video_cirrus
--- /dev/null
+#!/bin/bash
+#
+
+# Install bodhibuilder into a system
+# This script needs to be run as root!
+#
+# Create the correct permissions and ownership
+# Distribute the files to the correct locations
+#
+
+
+
+###
+# Do some checks to see if we're running this script correctly.
+# must be root to run:
+if [ "$(whoami)" != "root" ]; then
+ echo "Need to be root or run with sudo. Exiting."
+ exit 1
+fi
+
+# must be in bodhibuilder directory:
+if [ ! "`echo $PWD | rev | cut -d/ -f1 | rev`" = "bodhibuilder" ] ; then
+ echo " Not in the correct directory. Exiting."
+ exit 0
+fi
+
+# must have certain files within the current path:
+if [ -f ./etc/bodhibuilder.conf -a -f ./usr/bin/bodhibuilder ] ; then
+ continue=1
+else
+ continue=0
+fi
+
+if [ "$continue" = 0 ] ; then
+ echo " Cannot find bodhibuilder files. Exiting."
+ exit 0
+fi
+
+# should have matching uid and gid, if not, issue a warning:
+bbuserid=`ls -n ./usr/bin/bodhibuilder | awk '{print $3}'`
+bbgroupid=`ls -n ./usr/bin/bodhibuilder | awk '{print $4}'`
+
+bcuserid=`ls -n ./etc/bodhibuilder.conf | awk '{print $3}'`
+bcgroupid=`ls -n ./etc/bodhibuilder.conf | awk '{print $4}'`
+
+if [ "${bbuserid}" != "${bbgroupid}" ] ; then
+ echo " User and Group ID's don't match for file:"
+ echo " ./usr/bin/bodhibuilder"
+ echo -n " <cr> to continue or <ctrl+C> to cancel."
+ read redy
+fi
+if [ "${bcuserid}" != "${bcgroupid}" ] ; then
+ echo " User and Group ID's don't match for file:"
+ echo " ./etc/bodhibuilder.conf"
+ echo -n " <cr> to continue or <ctrl+C> to cancel."
+ read redy
+fi
+
+
+
+ # Feedback
+ echo " Running installation for a 64-bit system."
+
+ # Check for needed commands
+ echo " Checking for dependencies and required commands:"
+ commands="memtest86+ coreutils dialog mkisofs genisoimage archdetect awk sed apt-get rsync cpio gunzip gzip lzma mksquashfs unsquashfs isohybrid xorriso dpkg-dev"
+ for c in $commands ; do
+ cmdcheck1="`which ${c}`"
+ echo -n " ${c}"
+ if [ ! "$cmdcheck1" ] ; then
+ cmdcheck2="`dpkg-query -W -f='${Status}\n' ${c}`"
+ if [ ! "$cmdcheck2" = "install ok installed" ] ; then
+ echo " -- Missing package."
+ echo " -- Install package containing --> $c"
+ echo " -- Exiting."
+ exit 0
+ fi
+ fi
+ done
+ echo ""
+
+
+ ###
+ # Create correct permissions
+ chmod -R 755 ./*
+ chmod 644 ./etc/bodhibuilder/grub.png # needs to change to root ownership
+ chmod 644 ./etc/bodhibuilder/isolinux/splash.png
+ chmod 644 ./etc/bodhibuilder/isolinux/isolinux.bin
+ chmod 644 ./etc/bodhibuilder/isolinux/isohdpfx.bin
+ chmod 664 ./etc/bodhibuilder/plymouth/bodhibuilder-theme/*
+ chmod 755 ./etc/bodhibuilder/plymouth/bodhibuilder-theme/bodhibuilder.png etc/bodhibuilder/plymouth/bodhibuilder-theme/progress_bar.png
+ chmod 700 ./usr/share/bodhibuilder-gtk ./usr/share/doc/bodhibuilder-gtk
+
+ # Change ownership on some files
+ chown root:root ./etc/bodhibuilder/grub.png ./etc/bodhibuilder ./etc/init.d/bodhibuilder-firstboot
+
+
+ ###
+ # Distribute files to correct location
+ #
+ # /etc/ files:
+ if [ -f /etc/bodhibuilder.conf ] ; then
+ echo ""
+ echo " Bodhibuilder Configuration file found."
+ echo " Overwrite your current '/etc/bodhibuilder.conf' with the default file?"
+ cp -pi ./etc/bodhibuilder.conf /etc/
+ echo ""
+ else
+ cp -pi ./etc/bodhibuilder.conf /etc/
+ fi
+
+ rm -r /etc/bodhibuilder/
+ cp -rp ./etc/bodhibuilder /etc/
+ cp -p ./etc/init.d/bodhibuilder-firstboot /etc/init.d/bodhibuilder-firstboot
+
+ # /usr/ files:
+ cp -p ./usr/bin/* /usr/bin/
+ rm -r /usr/share/bodhibuilder-gtk/
+ cp -rp ./usr/share/bodhibuilder-gtk/ /usr/share/
+
+ # docs
+ cp -rp ./usr/share/doc/* /usr/share/doc/
+
+ # icons
+ if [ -d /usr/share/icons/hicolor ] ; then
+ cp -p ./usr/share/icons/hicolor/128x128/apps/* /usr/share/icons/hicolor/128x128/apps/
+ cp -p ./usr/share/icons/hicolor/16x16/apps/* /usr/share/icons/hicolor/16x16/apps/
+ cp -p ./usr/share/icons/hicolor/22x22/apps/* /usr/share/icons/hicolor/22x22/apps/
+ cp -p ./usr/share/icons/hicolor/24x24/apps/* /usr/share/icons/hicolor/24x24/apps/
+ cp -p ./usr/share/icons/hicolor/32x32/apps/* /usr/share/icons/hicolor/32x32/apps/
+ cp -p ./usr/share/icons/hicolor/48x48/apps/* /usr/share/icons/hicolor/48x48/apps/
+ cp -p ./usr/share/icons/hicolor/64x64/apps/* /usr/share/icons/hicolor/64x64/apps/
+ else
+ mkdir /usr/share/icons/hicolor/
+ cp -r ./usr/share/icons/hicolor/* usr/share/icons/hicolor/
+ fi
+
+ # locale
+ if [ -d /usr/share/locale/bg/LC_MESSAGES/ ] ; then
+ cp -p ./usr/share/locale/bg/LC_MESSAGES/bodhibuilder-gtk.mo /usr/share/locale/bg/LC_MESSAGES/
+ else
+ mkdir -p /usr/share/locale/bg/LC_MESSAGES/
+ cp -p ./usr/share/locale/bg/LC_MESSAGES/bodhibuilder-gtk.mo /usr/share/locale/bg/LC_MESSAGES/
+ fi
+ if [ -d /usr/share/locale/en/LC_MESSAGES/ ] ; then
+ cp -p ./usr/share/locale/en/LC_MESSAGES/bodhibuilder-gtk.mo /usr/share/locale/en/LC_MESSAGES/
+ else
+ mkdir -p /usr/share/locale/en/LC_MESSAGES/
+ cp -p ./usr/share/locale/en/LC_MESSAGES/bodhibuilder-gtk.mo /usr/share/locale/en/LC_MESSAGES/
+ fi
+ if [ -d /usr/share/locale/zh_TW/LC_MESSAGES/ ] ; then
+ cp -p ./usr/share/locale/zh_TW/LC_MESSAGES/bodhibuilder-gtk.mo /usr/share/locale/zh_TW/LC_MESSAGES/
+ else
+ mkdir -p /usr/share/locale/zh_TW/LC_MESSAGES/
+ cp -p ./usr/share/locale/zh_TW/LC_MESSAGES/bodhibuilder-gtk.mo /usr/share/locale/zh_TW/LC_MESSAGES/
+ fi
+
+ # man pages
+ cp -p ./usr/share/man/man1/* /usr/share/man/man1/
+
+ # pixmaps
+ cp -p ./usr/share/pixmaps/bodhibuilder-gtk.png /usr/share/pixmaps/
+
+ # create link bb to bodhibuilder
+ ln -sf /usr/bin/bodhibuilder /usr/bin/bb
+
+ echo " INSTALLED"
+ echo ""
+ echo " Edit the file '/etc/bodhibuilder.conf' to customize."
+ echo ""
--- /dev/null
+#!/bin/bash
+
+# Bodhibuilder script to create or backup a Bodhi Linux ISO
+#
+# Modified to bodhibuilder from remastersys.
+#
+# For use on Bodhi Linux 3.0.0 and up.
+#
+# Copyright (C) 2015
+# Stace Fauske <stace.fauske@gmail.com> <-sef>
+# Jeff Hoogland <JeffHoogland@Linux.com>
+# Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+# ORIGINAL REMASTERSYS COMMENTS:
+# remastersys script to make an installable livecd/dvd from an (XK)Ubuntu installed
+# and customized system
+# Created by Tony "Fragadelic" Brijeski
+# Copyright 2007-2012 Tony "Fragadelic" Brijeski <tb6517@yahoo.com>
+# Originally Created February 12th, 2007
+# This version is only for Ubuntu's and variants of Lucid 10.04 and up
+# Code cleanup with suggestions and code from Ivailo (a.k.a. SmiL3y)
+#####
+
+
+
+
+
+# checking to make sure script is running with root privileges
+if [ "$(whoami)" != "root" ] ; then
+ echo "Need to be root or run with sudo. Exiting."
+ exit 1
+fi
+
+
+# load the bodhibuilder version
+. /etc/bodhibuilder/bodhibuilder.version
+
+
+
+##### FUNCTION helper #####
+#~ helper () {
+
+#~ less << FOO
+#~ Usage of bodhibuilder $BODHIBUILDERVERSION is as follows:
+
+ #~ sudo bodhibuilder -b|-c|-d|backup|clean|dist [[custom.iso]|[cdfs]|[iso custom.iso]]
+
+#~ See the file /etc/bodhibuilder.conf for more configuration options.
+
+ #~ The directory & file excludes are as follows:
+
+ #~ Use absolute paths (from the root directory)
+ #~ Exclude specific files using the path to the file = /path/to/file
+ #~ Exclude specific directories using a trailing slash = /path/to/directory/
+ #~ Exclude all directory contents with an asterisk = /path/to/directory/*
+ #~ Exclude all matching sets of files or directories using an asterisk as a wildcard = /path/to/something*
+ #~ If the entry does not exist as an actual file or directory, rsync & mksquashfs will simply skip over it
+ #~ Separate each entry with a space
+
+#~ Add custom repositories and the comments for them to the file
+
+ #~ /etc/bodhibuilder/apt/custom_repos
+
+ #~ and during firstboot of the newly installed OS, this entire file
+ #~ will be appended to /etc/apt/sources.list.
+
+ #~ * Be sure not to add repositories to this file that are already in /etc/apt/sources.list
+ #~ otherwise you will have duplicate entries in /etc/apt/sources.list and the system
+ #~ won't like it.
+
+
+#~ Usage examples:
+
+ #~ sudo bodhibuilder backup (to make a livecd/dvd backup of your system)
+ #~ sudo bodhibuilder -b
+
+ #~ sudo bodhibuilder backup custom.iso (to make a livecd/dvd backup and call the iso custom.iso)
+ #~ sudo bodhibuilder -b custom.iso
+
+ #~ sudo bodhibuilder clean (to clean up temporary files of bodhibuilder)
+ #~ sudo bodhibuilder -c
+
+ #~ sudo bodhibuilder dist (to make a distributable livecd/dvd of your system)
+ #~ sudo bodhibuilder -d
+
+ #~ sudo bodhibuilder dist cdfs (to make a distributable livecd/dvd filesystem only)
+ #~ sudo bodhibuilder -d cdfs
+
+ #~ sudo bodhibuilder dist iso custom.iso (to make a distributable iso named custom.iso but only
+ #~ sudo bodhibuilder -d iso custom.iso if the cdfs is already present)
+
+ #~ cdfs and iso options should only be used if you wish to modify something on the
+ #~ cd before the iso is created. An example of this would be to modify the isolinux
+ #~ portion of the livecd/dvd
+
+ #~ sudo bodhibuilder version (reports the current version of bodhibuilder)
+ #~ sudo bodhibuilder -v
+
+ #~ sudo bodhibuilder-gtk (use the graphical version of bodhibuilder)
+
+ #~ >> Type "Q" at any time to exit this help <<
+
+#~ FOO
+#~ }
+##### END function helper #####
+
+
+
+# load the bodhibuilder.conf file
+. /etc/bodhibuilder.conf
+
+# If helper or clean is all that's needed, just go ahead and do that
+case $1 in
+ backup|-b|dist|-d )
+ ;;
+ clean|-c )
+ echo "Removing the build directory now..."
+ rm -rf ${WORKDIR}
+ echo "Done...Exiting"
+ exit 0
+ ;;
+ version|-v )
+ echo " bodhibuilder ${BODHIBUILDERVERSION}"
+ exit 0
+ ;;
+ * )
+ man bodhibuilder
+ exit 1
+ #~ helper
+ #~ exit 1
+ ;;
+esac
+
+
+
+
+
+# Static variables
+ARCH=`archdetect | cut -d/ -f1`
+SUBARCH=`archdetect | cut -d/ -f2`
+CDBOOTTYPE="ISOLINUX"
+UBUVERSION=`lsb_release -r | awk '{print$2}' | cut -d. -f1`
+
+
+## if the bodhibuilder.conf file is incorrect or missing, make sure to set defaults
+
+# create the working directory
+if [ ! "${WORKDIR}" ] ; then
+ BASEWORKDIR="/home/bodhibuilder"
+ WORKDIR="/home/bodhibuilder/bodhibuilder"
+else
+ BASEWORKDIR="${WORKDIR}"
+ WORKDIR="${WORKDIR}/bodhibuilder"
+fi
+if [ ! -d ${WORKDIR} ] ; then
+ mkdir -p ${WORKDIR}
+ if [ ! -d ${WORKDIR} ] ; then
+ echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+ echo "! Could not create the working directory !"
+ echo "! ${WORKDIR} !"
+ echo "! Exiting !"
+ echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+ exit 1
+ fi
+fi
+
+cd ${WORKDIR}
+
+# create bodhibuilder.log
+if [ -f ${WORKDIR}/bodhibuilder.log ] ; then
+ rm -f ${WORKDIR}/bodhibuilder.log &> /dev/null
+fi
+touch ${WORKDIR}/bodhibuilder.log
+cat > ${WORKDIR}/bodhibuilder.log <<FOO
+
+ ===============================
+ == bodhibuilder log file ==
+ ===============================
+ bodhibuilder $BODHIBUILDERVERSION
+
+FOO
+
+
+#added log_msg to reduce size. code provided by Ivailo (a.k.a. SmiL3y)
+log_msg() {
+ echo "$1"
+ echo "$1" >>${WORKDIR}/bodhibuilder.log
+}
+
+
+# what kind of disk space are we dealing with to begin?
+echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+echo "Original disk size information" >>${WORKDIR}/bodhibuilder.log
+df -h >>${WORKDIR}/bodhibuilder.log
+echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+echo "Original mount information" >>${WORKDIR}/bodhibuilder.log
+mount >>${WORKDIR}/bodhibuilder.log
+echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+
+
+# echo bodhibuilder .conf & .version vars to log
+echo " bodhibuilder.conf variables received:" >>${WORKDIR}/bodhibuilder.log
+cat /etc/bodhibuilder.conf | grep -e '^[A-Z].*=".*"' >>${WORKDIR}/bodhibuilder.log
+echo " bodhibuilder version info:" >>${WORKDIR}/bodhibuilder.log
+cat /etc/bodhibuilder/bodhibuilder.version >>${WORKDIR}/bodhibuilder.log
+
+# echo info about system into log file
+echo " System info:" >>${WORKDIR}/bodhibuilder.log
+echo "ARCH = ${ARCH}" >>${WORKDIR}/bodhibuilder.log
+echo "SUBARCH = ${SUBARCH}" >>${WORKDIR}/bodhibuilder.log
+if [ -e "/sys/firmware/efi/efivars/*" ] ; then
+ BOOT_FIRMWARE="EFI"
+ echo "EFI vars found in /sys/firmware/efi/efivars/" >>${WORKDIR}/bodhibuilder.log
+else
+ BOOT_FIRMWARE="BIOS"
+ echo "no EFI vars found in /sys/firmware/efi/efivars/" >>${WORKDIR}/bodhibuilder.log
+fi
+echo "BOOT_FIRMWARE = ${BOOT_FIRMWARE}" >>${WORKDIR}/bodhibuilder.log
+echo "UBUVERSION = ${UBUVERSION} (bb's take on Ubuntu version)" >>${WORKDIR}/bodhibuilder.log
+
+echo " System lsb-release info:" >>${WORKDIR}/bodhibuilder.log
+cat /etc/lsb-release >>${WORKDIR}/bodhibuilder.log
+echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+echo "" >>${WORKDIR}/bodhibuilder.log
+
+# echo files/dirs in /etc/bodhibuilder to the log file
+echo " Files & Dirs in location /etc/bodhibuilder:" >>${WORKDIR}/bodhibuilder.log
+ls -l /etc/bodhibuilder/ >>${WORKDIR}/bodhibuilder.log
+
+
+if [ ! "${LIVEUSER}" ] ; then
+ #Somebody must have removed the username from the configuration file
+ echo "no LIVEUSER found, using default" >>${WORKDIR}/bodhibuilder.log
+ #this is a custom live user
+ LIVEUSER="custom"
+fi
+#make sure live user is all lowercase
+LIVEUSER="`echo ${LIVEUSER} | awk '{print tolower ($0)}'`"
+
+
+if [ ! "${LIVECDLABEL}" ] ; then
+ echo "no LIVECDLABEL found, using default" >>${WORKDIR}/bodhibuilder.log
+ LIVECDLABEL="Custom Live CD"
+fi
+
+
+if [ ! "${LIVECDURL}" ] ; then
+ echo "no LIVECDURL found, using default" >>${WORKDIR}/bodhibuilder.log
+ LIVECDURL="http://www.bodhilinux.com"
+fi
+
+
+if [ ! "${SQUASHFSOPTS}" ] ; then
+ echo "no SQUASHFSOPTS found, using default" >>${WORKDIR}/bodhibuilder.log
+ SQUASHFSOPTS="-no-recovery -always-use-fragments -b 1M -no-duplicates -comp xz -Xdict-size 100%"
+else
+ echo "Using SQUASHFSOPTS from bodhibuilder.conf" >> ${WORKDIR}/bodhibuilder.log
+ echo "SQUASHFSOPTS = ${SQUASHFSOPTS}" >> ${WORKDIR}/bodhibuilder.log
+fi
+
+
+if [ "${BACKUPSHOWINSTALL}" = "0" -o "${BACKUPSHOWINSTALL}" = "1" ] ; then
+ echo "Using BACKUPSHOWINSTALL from config file:" >> ${WORKDIR}/bodhibuilder.log
+ echo "BACKUPSHOWINSTALL=${BACKUPSHOWINSTALL}" >> ${WORKDIR}/bodhibuilder.log
+else
+ echo "BACKUPSHOWINSTALL incorrect, using default of 1" >>${WORKDIR}/bodhibuilder.log
+ BACKUPSHOWINSTALL="1"
+fi
+
+
+
+
+if [ "$2" ] ; then
+ case $2 in
+ cdfs )
+ log_msg "Creating the cd filesystem only"
+ ;;
+ iso )
+ log_msg "Creating the iso file only"
+ ;;
+ * )
+ CUSTOMISO="$2"
+ ;;
+ esac
+fi
+
+
+if [ "$3" ] ; then # $3 can only be an iso name
+ CUSTOMISO="$3"
+fi
+
+
+if [ ! "${CUSTOMISO}" ] ; then # if we still don't have an iso name
+ CUSTOMISO="custom_${1}.iso"
+fi
+
+
+
+
+# What type of remaster is it?
+case $1 in
+ backup|-b )
+ log_msg "System Backup Mode Selected"
+ OPT1="backup"
+ if [ "${CUSTOMISO}" == "bodhibuilder.iso" ] ; then
+ CUSTOMISO="bodhibuilder_backup.iso"
+ fi
+ ;;
+ clean|-c )
+ echo "Removing the build directory now..."
+ rm -rf ${WORKDIR}
+ echo "Done...Exiting"
+ exit 0
+ ;;
+ dist|-d )
+ log_msg "Distribution Mode Selected"
+ OPT1="dist"
+ if [ "${CUSTOMISO}" == "bodhibuilder.iso" ] ; then
+ CUSTOMISO="bodhibuilder_dist.iso"
+ fi
+ ;;
+ * )
+ man bodhibuilder
+ exit 1
+ #~ helper
+ #~ exit 1
+ ;;
+esac
+
+
+
+
+# check for UID and/or GID 999 being already used on a dist build
+# we need these ID's
+if [ "${OPT1}" == "dist" ] ; then
+ # check for uid 999 & associated username
+ uid_999_check=`id 999 | grep -o 'uid=999'`
+ uid_999_name=`id 999 | cut -d\( -f2 | cut -d\) -f1`
+ # check for gid 999 & associated group name
+ #~ gid_999_check=`id 999 | grep -o 'gid=999'`
+ gid_999_check=`grep '^.*:.*:999:' /etc/group`
+ gid_999_name=`grep '^.*:.*:999:' /etc/group | cut -d\: -f1`
+
+ if [ "${uid_999_check}" -o "${gid_999_check}" ] ; then
+ # first see if both are in use
+ if [ "${uid_999_check}" == "uid=999" -a "${gid_999_check}" ] ; then
+ log_msg ""
+ log_msg " !!!!! error !!!!!"
+ log_msg ""
+ log_msg " UID 999 = username --> ${uid_999_name}"
+ log_msg " GID 999 = group --> ${gid_999_name}"
+ log_msg ""
+ log_msg " Bodhibuilder needs to use 999 for both UID and GID"
+ log_msg " in a dist build."
+ log_msg ""
+ fi
+ # UID verbiage
+ if [ "${uid_999_check}" == "uid=999" ] ; then
+ log_msg ""
+ log_msg " !!!!! error !!!!!"
+ log_msg ""
+ log_msg " UID 999 was found to be user -- ${uid_999_name}"
+ log_msg ""
+ log_msg " Please change this user's UID number away from 999."
+ log_msg " Bodhibuilder needs to use this UID number for the"
+ log_msg " live username in a 'dist' ISO."
+ log_msg ""
+ log_msg " UID's between 100 - 999 are typically system users,"
+ log_msg " so you can probably change the UID of ${uid_999_name} to"
+ log_msg " the next available UID below 999 that is not used."
+ log_msg " Please check file /etc/passwd to find the next"
+ log_msg " available UID."
+ log_msg ""
+ log_msg " You can probably change the UID using the command 'usermod -u'."
+ log_msg " However, please check the man page for 'usermod' for usage"
+ log_msg " and also be aware that file permissions might need to be changed"
+ log_msg " on your system to accomodate the UID change."
+ log_msg " Please do your homework, bodhibuilder is not responsible for file"
+ log_msg " ownership/permission problems related to a UID change"
+ log_msg " which has been performed manually."
+ log_msg ""
+ fi
+ # GID verbiage
+ if [ "${gid_999_check}" ] ; then
+ log_msg ""
+ log_msg " !!!!! error !!!!!"
+ log_msg ""
+ log_msg " GID 999 was found to be group -- ${gid_999_name}"
+ log_msg ""
+ log_msg " Please change this group's GID number away from 999."
+ log_msg " Bodhibuilder needs to use this GID number for a"
+ log_msg " group in a 'dist' ISO."
+ log_msg ""
+ log_msg " GID's between 100 - 999 are typically system groups,"
+ log_msg " so you can probably change the GID of ${gid_999_name} to"
+ log_msg " the next available GID below 999 that is not used."
+ log_msg " Please check file /etc/group to find the next"
+ log_msg " available GID."
+ log_msg ""
+ log_msg " You can probably change the GID using the command 'groupmod -g'."
+ log_msg " However, please check the man page for 'groupmod' for usage"
+ log_msg " and also be aware that file permissions might need to be changed"
+ log_msg " on your system to accomodate the GID change."
+ log_msg " Please do your homework, bodhibuilder is not responsible for file"
+ log_msg " ownership/permission problems related to a GID change"
+ log_msg " which has been performed manually."
+ log_msg ""
+ fi
+ log_msg " exiting bodhibuilder"
+ echo -n " (press any key) "
+ read -n1 redy
+ exit 1
+ else
+ log_msg " GID & UID 999 are not in use, OK"
+ fi
+fi
+
+
+
+
+##### FUNCTION cdfs #####
+cdfs (){
+
+log_msg "Removing unnecessary packages, and cleaning up the system."
+ rm -rf /opt/teamviewer/config/global.conf
+ apt-get clean
+
+log_msg "Enabling bodhibuilder-firstboot"
+cp -f /etc/bodhibuilder/firstboot/file-firstboot /etc/init.d/bodhibuilder-firstboot
+chmod 755 /etc/init.d/bodhibuilder-firstboot
+update-rc.d bodhibuilder-firstboot defaults
+
+log_msg "Checking filesystem type of the Working Folder"
+DIRTYPE=`df -T -P ${WORKDIR} | grep "^\/dev" | awk '{print $2}'`
+log_msg "${WORKDIR} is on a ${DIRTYPE} filesystem"
+
+ #removing popularity-contest as it causes a problem when installing with ubiquity
+ log_msg "Making sure popularity contest is not installed"
+ apt-get -y -q remove popularity-contest &> /dev/null
+
+ # check whether system is kde based or other to load the correct ubiquity frontend
+ if [ "`ps axf | grep startkde | grep -v grep`" != "" -o "`ps axf | grep kwin | grep -v grep`" != "" ] ; then
+ log_msg "Installing the Ubiquity KDE frontend"
+ apt-get -y -q install ubiquity-frontend-kde &> /dev/null
+ apt-get -y -q remove ubiquity-frontend-gtk &> /dev/null
+ else
+ log_msg "Installing the Ubiquity GTK frontend"
+ apt-get -y -q install ubiquity-frontend-gtk &> /dev/null
+ apt-get -y -q remove ubiquity-frontend-kde &> /dev/null
+ fi
+
+
+### Don't check for lightdm anymore, just let whatever DM do it's thing
+#~ #lightdm check - changed for 16.04
+ #~ # Check if they are using lightdm and if it is setup properly for the live default session
+ #~ # Need to change this section a little
+ #~ # lightdm has changed a bit in 16.04, and the running of 'accountsservice' also means that 'lightdm.conf' file will not be read
+ #~ # but rather a file in /etc/lightdm/lightdm.conf.d/ such as 50-ubuntu.conf
+ #~ if [ "`grep lightdm /etc/X11/default-display-manager`" == "" ] ; then
+ #~ log_msg "Lightdm not setup properly. You must set your default desktop with lightdm prior to remastering"
+ #~ exit 1
+ #~ fi
+ #~
+ #~ # this test may be irrelevant in 16.04
+ #~ if [ ! -f /etc/lightdm/lightdm.conf ] ; then
+ #~ log_msg "Lightdm not setup properly for a default session. Missing file /etc/lightdm/lightdm.conf. You must set your default desktop with lightdm prior to remastering"
+ #~ exit 1
+ #~ fi
+ #~ # maybe create a default 51-bb.conf file to put into /etc/lightdm/lightdm.conf.d/ and then change it to this:
+ #~ ##~ if [ ! -f /etc/lightdm/lightdm.conf.d/51-bb.conf ] ; then
+ #~ ##~ log_msg "Lightdm not setup properly for a default session. Missing bb file in /etc/lightdm/lightdm.conf.d/. You must set your default desktop with lightdm prior to remastering"
+ #~ ##~ exit 1
+ #~ ##~ fi
+ #~
+ #~ if [ ! -f /usr/share/xsessions/*.desktop ] ; then
+ #~ log_msg "Lightdm not setup properly. Missing a (session).desktop file in /usr/share/xsessions/. Exiting."
+ #~ exit 1
+ #~ fi
+ #~ log_msg "Lightdm detected"
+
+
+ # Check and log the display manager in use:
+ currentdm_path="`cat /etc/X11/default-display-manager`"
+ currentdm=`basename ${currentdm_path}`
+ echo "Current Display Manager is ${currentdm} @ ${currentdm_path}"
+
+
+
+
+ sleep 1
+
+
+ # Step 3 - Create the CD tree in ${WORKDIR}/ISOTMP
+ log_msg "Checking if the ${WORKDIR} folder has been created"
+ if [ -d "${WORKDIR}/dummysys" ] ; then
+ rm -rf ${WORKDIR}/dummysys/var/*
+ rm -rf ${WORKDIR}/dummysys/etc/*
+ rm -rf ${WORKDIR}/dummysys/run/*
+ rm -rf ${WORKDIR}/ISOTMP/{isolinux,grub,.disk}
+ else
+ log_msg "Creating ${WORKDIR} folder tree"
+ mkdir -p ${WORKDIR}/ISOTMP/{casper,preseed}
+ mkdir -p ${WORKDIR}/dummysys/{dev,etc,proc,tmp,sys,mnt,media/cdrom,var}
+ rsync -a /dev/urandom ${WORKDIR}/dummysys/dev/
+ if [ -d /run ] ; then
+ mkdir -p ${WORKDIR}/dummysys/run
+ fi
+ chmod ug+rwx,o+rwt ${WORKDIR}/dummysys/tmp
+ fi
+
+ log_msg "Creating ${WORKDIR}/ISOTMP folder tree"
+ mkdir -p ${WORKDIR}/ISOTMP/{isolinux,install,.disk}
+
+ log_msg "Copying /var and /etc to temp area and excluding extra files ... this may take a while so please be patient"
+
+
+
+ ## new exclusions code
+ # All exclusions from config file
+ ALLEXCLUDES=
+ # Only the exclusions in the /var/ directory
+ VAREXCLUDES=
+ # Only the exclusions in the /etc/ directory
+ ETCEXCLUDES=
+ if [ "${EXCLUDES}" ] ; then
+ echo "EXCLUDES variable is not empty" >> ${WORKDIR}/bodhibuilder.log
+ for add in ${EXCLUDES} ; do # all exclusions
+ ALLEXCLUDES="${ALLEXCLUDES} --exclude='${add}' "
+ done
+ # echo some stuff to the log
+ echo "" >> ${WORKDIR}/bodhibuilder.log
+ echo " ALLEXCLUDES IS:" >> ${WORKDIR}/bodhibuilder.log
+ echo "${ALLEXCLUDES}" >> ${WORKDIR}/bodhibuilder.log
+
+ # exclusions for /var/
+ VAREXCLUDES=
+ for addvar in ${EXCLUDES} ; do # exclusions in the var dir
+ addvaryes=`echo ${addvar} | grep '/var/'`
+ if [ "${addvaryes}" ] ; then
+ VAREXCLUDES="${VAREXCLUDES} --exclude='${addvaryes}' "
+ fi
+ done
+ echo "" >> ${WORKDIR}/bodhibuilder.log
+ echo " Unedited VAREXCLUDES IS:" >> ${WORKDIR}/bodhibuilder.log
+ echo "${VAREXCLUDES}" >> ${WORKDIR}/bodhibuilder.log
+ VAREXCLUDES=`echo ${VAREXCLUDES} | sed 's/\/var\//\//g'` # Cleanup path for var exclusions for rsync
+ echo "" >> ${WORKDIR}/bodhibuilder.log
+ echo " Edited VAREXCLUDES IS:" >> ${WORKDIR}/bodhibuilder.log
+ echo "${VAREXCLUDES}" >> ${WORKDIR}/bodhibuilder.log
+
+ # exclusions for /etc/
+ ETCEXCLUDES=
+ for addetc in ${EXCLUDES} ; do # exclusions in the etc dir
+ addetcyes=`echo ${addetc} | grep '/etc/'`
+ if [ "${addetcyes}" ] ; then
+ ETCEXCLUDES="${ETCEXCLUDES} --exclude='${addetcyes}' "
+ fi
+ done
+ echo "" >> ${WORKDIR}/bodhibuilder.log
+ echo " Unedited ETCEXCLUDES IS:" >> ${WORKDIR}/bodhibuilder.log
+ echo "${ETCEXCLUDES}" >> ${WORKDIR}/bodhibuilder.log
+ ETCEXCLUDES=`echo ${ETCEXCLUDES} | sed 's/\/etc\//\//g'` # Cleanup path for etc exclusions for rsync
+ echo "" >> ${WORKDIR}/bodhibuilder.log
+ echo " Edited ETCEXCLUDES IS:" >> ${WORKDIR}/bodhibuilder.log
+ echo "${ETCEXCLUDES}" >> ${WORKDIR}/bodhibuilder.log
+ fi
+
+ ## rsync /etc/ & /var/ dirs
+ # fix - this var_sync isn't preserving permissions & ownerships for log files
+ #~ var_sync="rsync -a --exclude='*.log.*' --exclude='*.pid' --exclude='*.bak' --exclude='*.[0-9].gz' --exclude='*.deb' --exclude='kdecache*' --exclude='*~' ${VAREXCLUDES} /var/. ${WORKDIR}/dummysys/var/."
+ var_sync="rsync -a --exclude='*.log.[0-9]*' --exclude='*.log.old' --exclude='syslog.[0-9]*' --exclude='[bw]tmp.[0-9]*' --exclude='*.pid' --exclude='*.bak' --exclude='*.[0-9].gz' --exclude='*.deb' --exclude='kdecache*' --exclude='*~' ${VAREXCLUDES} /var/. ${WORKDIR}/dummysys/var/."
+ echo " syncing /var/ directory using:" >> ${WORKDIR}/bodhibuilder.log
+ echo "> ${var_sync}" >> ${WORKDIR}/bodhibuilder.log
+ eval ${var_sync}
+
+ etc_sync="rsync -a ${ETCEXCLUDES} /etc/. ${WORKDIR}/dummysys/etc/."
+ echo " syncing /etc/ directory using:" >> ${WORKDIR}/bodhibuilder.log
+ echo "> ${etc_sync}" >> ${WORKDIR}/bodhibuilder.log
+ eval ${etc_sync}
+ echo "done syncing" >> ${WORKDIR}/bodhibuilder.log
+
+
+
+
+ ## Custom grub config
+ if [ -e /etc/bodhibuilder/grub/grub.bodhi ] ; then
+ log_msg "Found custom grub for ${DISTNAME}"
+ cp -f /etc/bodhibuilder/grub/grub.bodhi ${WORKDIR}/dummysys/etc/default/
+ chmod 644 ${WORKDIR}/dummysys/etc/default/grub.bodhi
+ cp -f /etc/bodhibuilder/grub/grub.bodhi ${WORKDIR}/dummysys/etc/default/grub
+ if [ -d /etc/bodhibuilder/grub/backgrounds ] ; then
+ cp -rf /etc/bodhibuilder/grub/backgrounds/ ${WORKDIR}/dummysys/etc/grub.d/
+ fi
+ fi
+
+ # Put a custom name into grub - need to use DISTRIB_DESCRIPTION rather than DISTRIB_ID
+ if [ "${DISTNAME}" ] ; then
+ if [ -e "${WORKDIR}/dummysys/etc/lsb-release" ] ; then
+ sed -i "s/^DISTRIB_DESCRIPTION=.*$/DISTRIB_DESCRIPTION=\"${DISTNAME}\"/" ${WORKDIR}/dummysys/etc/lsb-release
+ sed -i 's/^GRUB_DISTRIBUTOR=.*$/GRUB_DISTRIBUTOR=\`lsb_release -d -s 2> \/dev\/null || echo Debian\`/' ${WORKDIR}/dummysys/etc/default/grub.bodhi
+ sed -i 's/^GRUB_DISTRIBUTOR=.*$/GRUB_DISTRIBUTOR=\`lsb_release -d -s 2> \/dev\/null || echo Debian\`/' ${WORKDIR}/dummysys/etc/default/grub
+ else
+ sed -i 's/^GRUB_DISTRIBUTOR=.*$/GRUB_DISTRIBUTOR=bodhibuilder/' ${WORKDIR}/dummysys/etc/default/grub
+ fi
+ fi
+
+
+
+
+ log_msg "Cleaning up files not needed for the live in ${WORKDIR}/dummysys"
+ rm -rf ${WORKDIR}/dummysys/var/cache/apt/archives/* &> /dev/null
+ rm -rf ${WORKDIR}/dummysys/var/cache/debconf/*-old &> /dev/null
+ rm -rf ${WORKDIR}/dummysys/var/lib/ureadahead/pack &> /dev/null
+ rm -f ${WORKDIR}/dummysys/etc/X11/xorg.conf*
+ rm -f ${WORKDIR}/dummysys/etc/{hosts,hostname,mtab*,fstab}
+ if [ ! -L ${WORKDIR}/dummysys/etc/resolv.conf ] ; then
+ rm -f ${WORKDIR}/dummysys/etc/resolv.conf
+ fi
+ rm -f ${WORKDIR}/dummysys/etc/udev/rules.d/70-persistent*
+ rm -f ${WORKDIR}/dummysys/etc/cups/ssl/{server.crt,server.key}
+ rm -f ${WORKDIR}/dummysys/etc/ssh/*key*
+ rm -f ${WORKDIR}/dummysys/var/lib/dbus/machine-id
+ rsync -a /dev/urandom ${WORKDIR}/dummysys/dev/
+ # fix - this rm is screwing up permissions & ownerships for log files, so removing the find in "${WORKDIR}/dummysys/var/log/"
+ #~ find ${WORKDIR}/dummysys/var/log/ ${WORKDIR}/dummysys/var/lock/ ${WORKDIR}/dummysys/var/backups/ ${WORKDIR}/dummysys/var/tmp/ ${WORKDIR}/dummysys/var/crash/ ${WORKDIR}/dummysys/var/lib/ubiquity/ -type f -exec rm -f {} \;
+ find ${WORKDIR}/dummysys/var/lock/ ${WORKDIR}/dummysys/var/backups/ ${WORKDIR}/dummysys/var/tmp/ ${WORKDIR}/dummysys/var/crash/ ${WORKDIR}/dummysys/var/lib/ubiquity/ -type f -exec rm -f {} \;
+
+
+ if [ "${OPT1}" = "dist" ] ; then
+ rm -rf ${WORKDIR}/dummysys/mnt/*
+ rm -rf ${WORKDIR}/dummysys/media/*
+ mkdir ${WORKDIR}/dummysys/media/cdrom
+ rm -f ${WORKDIR}/dummysys/etc/{group,passwd,shadow,shadow-,gshadow,gshadow-}
+ rm -f ${WORKDIR}/dummysys/etc/wicd/{wired-settings.conf,wireless-settings.conf}
+ rm -rf ${WORKDIR}/dummysys/etc/NetworkManager/system-connections/*
+ rm -f ${WORKDIR}/dummysys/etc/printcap
+ rm -f ${WORKDIR}/dummysys/etc/cups/printers.conf
+ touch ${WORKDIR}/dummysys/etc/printcap
+ touch ${WORKDIR}/dummysys/etc/cups/printers.conf
+ rm -f ${WORKDIR}/dummysys/var/cache/apt/*pkgcache.bin
+ rm -f ${WORKDIR}/dummysys/var/lib/mlocate/*
+ rm -rf ${WORKDIR}/dummysys/var/cache/gdm/*
+ rm -rf ${WORKDIR}/dummysys/var/lib/sudo/*
+ rm -rf ${WORKDIR}/dummysys/var/lib/AccountsService/users/*
+ rm -rf ${WORKDIR}/dummysys/var/lib/kdm/*
+ rm -rf ${WORKDIR}/dummysys/var/run/console/*
+ rm -f ${WORKDIR}/dummysys/etc/gdm/gdm.conf-custom
+ rm -f ${WORKDIR}/dummysys/etc/gdm/custom.conf
+ if [ ! -d /run ] ; then
+ find ${WORKDIR}/dummysys/var/run/ ${WORKDIR}/dummysys/var/mail/ ${WORKDIR}/dummysys/var/spool/ -type f -exec rm -f {} \;
+ else
+ find ${WORKDIR}/dummysys/var/mail/ ${WORKDIR}/dummysys/var/spool/ -type f -exec rm -f {} \;
+ unlink ${WORKDIR}/dummysys/var/run
+ cd ${WORKDIR}/dummysys/var
+ ln -sf ../run run
+ fi
+
+ ## create log files (fix - this method does not preserve ownerships or permissions, see 'find' below)
+ #~ for i in dpkg.log lastlog mail.log syslog auth.log daemon.log faillog lpr.log mail.warn user.log boot debug mail.err messages wtmp bootstrap.log dmesg kern.log mail.info; do
+ #~ touch ${WORKDIR}/dummysys/var/log/${i}
+ #~ done
+ # use this to preserve file ownership & permissions, but blank out the log files
+ log_msg "Blanking out var/log/ files"
+ find ${WORKDIR}/dummysys/var/log/ -type f -exec truncate -s 0 {} \;
+ # update the timestamp to right now
+ log_msg "Updating timestamp on var/log files"
+ find ${WORKDIR}/dummysys/var/log/ -exec touch {} \;
+
+
+
+ ## Locale and locate fixes added by uberstudent - notes below
+ log_msg "Purging pre-existing generated locale(s) from dummysys"
+ # Fixes http://forums.bodhilinux.com/index.php?/topic/10506-installation-crashes-by-some-languages-rc1/
+ # Ubiquity fails if the installation locale differs from the generated locale, so simply removing the
+ # generated locale confs fixes the issue.
+ if [ -e ${WORKDIR}/dummysys/etc/default/locale ] ; then
+ rm -f ${WORKDIR}/dummysys/etc/default/locale
+ fi
+ if [ -e ${WORKDIR}/dummysys/var/lib/locales/supported.d/local ] ; then
+ rm -f ${WORKDIR}/dummysys/var/lib/locales/supported.d/local
+ fi
+
+ log_msg "Cleaning locate database within dummysys"
+ # Blank the locale db because it can be a privacy issue, and can be
+ # rather large, and then regenerate it within the dummysys.
+ if [ -e ${WORKDIR}/dummysys/var/lib/mlocate/mlocate.db ]; then
+ rm -f ${WORKDIR}/dummysys/var/lib/mlocate/mlocate.db
+ updatedb -l 1 -o ${WORKDIR}/dummysys/var/lib/mlocate/mlocate.db
+ fi
+
+
+
+
+ # If lightdm has an autologin-user in lightdm.conf, change it to ${LIVEUSER}
+ if [ "${currentdm}" == "lightdm" ] ; then
+ if [ -f "${WORKDIR}/dummysys/etc/lightdm/lightdm.conf" ] ; then
+ ldm_auto_login_check=`grep -o 'autologin-user=' ${WORKDIR}/dummysys/etc/lightdm/lightdm.conf`
+ if [ "${ldm_auto_login_check}" ] ; then
+ sed -i "s/^autologin-user=.*\$/autologin-user=${LIVEUSER}/g" ${WORKDIR}/dummysys/etc/lightdm/lightdm.conf
+ fi
+ fi
+ fi
+
+
+
+
+ log_msg "Cleaning up passwd, group, shadow and gshadow files for the live system"
+
+ grep '^[^:]*:[^:]*:[0-9]:' /etc/passwd > ${WORKDIR}/dummysys/etc/passwd
+ grep '^[^:]*:[^:]*:[0-9][0-9]:' /etc/passwd >> ${WORKDIR}/dummysys/etc/passwd
+ grep '^[^:]*:[^:]*:[0-9][0-9][0-9]:' /etc/passwd >> ${WORKDIR}/dummysys/etc/passwd
+ grep '^[^:]*:[^:]*:[3-9][0-9][0-9][0-9][0-9]:' /etc/passwd >> ${WORKDIR}/dummysys/etc/passwd
+
+ grep '^[^:]*:[^:]*:[0-9]:' /etc/group > ${WORKDIR}/dummysys/etc/group
+ grep '^[^:]*:[^:]*:[0-9][0-9]:' /etc/group >> ${WORKDIR}/dummysys/etc/group
+ grep '^[^:]*:[^:]*:[0-9][0-9][0-9]:' /etc/group >> ${WORKDIR}/dummysys/etc/group
+ grep '^[^:]*:[^:]*:[3-9][0-9][0-9][0-9][0-9]:' /etc/group >> ${WORKDIR}/dummysys/etc/group
+
+ grep '^[^:]*:[^:]*:[5-9][0-9][0-9]:' /etc/passwd | awk -F ":" '{print $1}'> ${WORKDIR}/tmpusers1
+ grep '^[^:]*:[^:]*:[1-9][0-9][0-9][0-9]:' /etc/passwd | awk -F ":" '{print $1}'> ${WORKDIR}/tmpusers2
+ grep '^[^:]*:[^:]*:[1-2][0-9][0-9][0-9][0-9]:' /etc/passwd | awk -F ":" '{print $1}'> ${WORKDIR}/tmpusers3
+
+ cat ${WORKDIR}/tmpusers1 ${WORKDIR}/tmpusers2 ${WORKDIR}/tmpusers3 > ${WORKDIR}/tmpusers
+ rm -f ${WORKDIR}/tmpusers[0-9] &> /dev/null
+
+
+ cat ${WORKDIR}/tmpusers | while read LINE ;do
+
+ echo ${LINE} | xargs -i sed -e 's/,{}$//g' ${WORKDIR}/dummysys/etc/group > ${WORKDIR}/dummysys/etc/group.new1
+ echo ${LINE} | xargs -i sed -e 's/,{},/,/g' ${WORKDIR}/dummysys/etc/group.new1 > ${WORKDIR}/dummysys/etc/group.new2
+ echo ${LINE} | xargs -i sed -e 's/:{}$/:/g' ${WORKDIR}/dummysys/etc/group.new2 > ${WORKDIR}/dummysys/etc/group.new3
+ echo ${LINE} | xargs -i sed -e 's/:{},/:/g' ${WORKDIR}/dummysys/etc/group.new3 > ${WORKDIR}/dummysys/etc/group
+
+ rm -f ${WORKDIR}/dummysys/etc/group.new* &> /dev/null
+
+ done
+
+ fi
+
+
+ # make sure the adduser and autologin functions of casper as set according to the mode
+ log_msg "Making sure adduser and autologin functions of casper are set properly"
+ [ "${OPT1}" = "dist" ] && [ ! -d ${WORKDIR}/dummysys/home ] && mkdir ${WORKDIR}/dummysys/home
+ [ "${OPT1}" = "dist" ] && chmod 755 /usr/share/initramfs-tools/scripts/casper-bottom/*adduser /usr/share/initramfs-tools/scripts/casper-bottom/*autologin
+ [ "${OPT1}" = "backup" ] && [ -d ${WORKDIR}/dummysys/home ] && rm -rf ${WORKDIR}/dummysys/home
+ [ "${OPT1}" = "backup" ] && chmod 644 /usr/share/initramfs-tools/scripts/casper-bottom/*adduser /usr/share/initramfs-tools/scripts/casper-bottom/*autologin
+
+
+ # copy over some of the necessary stuff for the livecd
+
+ log_msg "Checking internet connection..."
+ netconnstatus=`dig | grep -o 'Got answer'` # report if ANY network hardware is connected
+ if [ "${netconnstatus}" ] ; then
+ #~ inetstatus=`wget -q --tries=10 --timeout=20 --spider http://ubuntu.com; echo $?`
+ inetstatus=`wget -q --timeout=20 --spider www.ubuntu.com; echo $?`
+ if [ "${inetstatus}" -ne 0 ] ; then # if above failed, do a double-check with google
+ log_msg " Could not connect to www.ubuntu.com"
+ inetstatus=`wget -q --timeout=20 --spider www.google.com; echo $?`
+ if [ "${inetstatus}" -ne 0 ] ; then # if above failed, do a triple-check with cisco
+ log_msg " Could not connect to www.google.com"
+ inetstatus=`wget -q --timeout=20 --spider www.cisco.com; echo $?`
+ if [ "${inetstatus}" -ne 0 ] ; then # Internet connectivity fail
+ log_msg " Could not connect to www.cisco.com"
+ fi
+ fi
+ fi
+ else # no hardware is connected
+ inetstatus=1 # set to 1 to skip downloading of deb packages
+ fi
+
+ if [ "${inetstatus}" -eq 0 ] ; then # internet connection detected
+ log_msg "connection to internet detected"
+ # make sure apt-get cache is updated, or it might try to download the wrong version
+ log_msg "Updating repos"
+ apt-get update >>${WORKDIR}/bodhibuilder.log
+ log_msg "Installing dpkg-dev if it's not already installed"
+ apt-get install -y -q --no-install-recommends dpkg-dev >>${WORKDIR}/bodhibuilder.log #CHARLES
+ if [ "${UBUVERSION}" -gt 14 ] ; then
+ log_msg "Installing isolinux"
+ apt-get install isolinux
+ fi
+
+
+ # packages to be downloaded and moved into pool: -- 32/64-bit -- ONE directory
+ if [ "${UBUVERSION}" -le 14 ] ; then
+ dlpkg_32="b43-fwcutter bcmwl-kernel-source dkms efibootmgr fakeroot grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-ia32 grub-efi-ia32-bin grub-pc grub-pc-bin grub2-common libfakeroot libuniconf4.6 libwvstreams4.6-base libwvstreams4.6-extras lupin-support mouseemu oem-config oem-config-gtk oem-config-slideshow-ubuntu secureboot-db setserial user-setup wvdial" # 32-bit packages
+ dlpkg_64="grub-efi-amd64-signed shim shim-signed" # 64-bit packages
+ else
+ dlpkg_32="b43-fwcutter bcmwl-kernel-source dkms efibootmgr fakeroot grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-ia32 grub-efi-ia32-bin grub-pc grub-pc-bin grub2-common libfakeroot libuniconf4.6 libwvstreams4.6-base libwvstreams4.6-extras lupin-support mokutil mouseemu oem-config oem-config-gtk oem-config-slideshow-ubuntu sbsigntool secureboot-db setserial user-setup wvdial" # 32-bit packages
+ dlpkg_64="grub-efi-amd64-signed shim shim-signed" # 64-bit packages
+ fi
+ case ${ARCH} in
+ amd64 )
+ dlpkg_all="${dlpkg_32} ${dlpkg_64}"
+ ;;
+ * )
+ dlpkg_all="${dlpkg_32}"
+ ;;
+ esac
+
+ log_msg " downloading latest deb files for ${ARCH} packages:"
+ log_msg "${dlpkg_all}"
+ # create temp directory in ${WORKDIR}/ ..... now working in ${WORKDIR}/dlpkgtempdir/ while downloading debs
+ cd ${WORKDIR} && mkdir dlpkgtempdir && cd dlpkgtempdir
+
+ # download pkgs
+ apt-get download ${dlpkg_all} | tee -a ${WORKDIR}/bodhibuilder.log
+ chmod 755 ./* # still working in dlpkgtempdir
+
+ # make sure ALL files were successfully downloaded
+ dlpkgpass="1"
+ for dlpkgchk in ${dlpkg_all} ; do
+ if [ ! -e ./${dlpkgchk}_* ] ; then
+ dlpkgpass="0"
+ echo "file ${dlpkgchk}_(Some.New.Rev.Num) - does NOT exist." >>${WORKDIR}/bodhibuilder.log
+ else
+ dlpkgchkname=`ls -b ./${dlpkgchk}_*`
+ echo "file ${dlpkgchkname} exists" >>${WORKDIR}/bodhibuilder.log
+ fi
+ done
+
+ # Didn't get all files downloaded, so get rid of temp directory
+ if [ "${dlpkgpass}" = "0" ] ; then
+ cd ${WORKDIR} && rm -rf ./dlpkgtempdir
+ fi
+
+
+ else # no internet connection detected
+ log_msg "no connection to internet detected"
+ log_msg "...not downloading latest uefi pool debs"
+ dlpkgpass="0"
+ fi
+
+ log_msg "Copying arch-specific debs into pool"
+ if [ "${ARCH}" = "amd64" ] ; then
+ echo "64-bit arch detected" >>${WORKDIR}/bodhibuilder.log
+ yes | rm -vrf /etc/bodhibuilder/uefi/pool/* >>${WORKDIR}/bodhibuilder.log
+ cp -av /etc/bodhibuilder/debs/amd64/* /etc/bodhibuilder/uefi/pool/ >>${WORKDIR}/bodhibuilder.log
+ else
+ echo "32-bit arch detected" >>${WORKDIR}/bodhibuilder.log
+ yes | rm -vrf /etc/bodhibuilder/uefi/pool/* >>${WORKDIR}/bodhibuilder.log
+ cp -av /etc/bodhibuilder/debs/i386/* /etc/bodhibuilder/uefi/pool/ >>${WORKDIR}/bodhibuilder.log
+ fi
+
+ log_msg "Moving all EFI files to the ISOTMP folder"
+ cp -av /etc/bodhibuilder/uefi/* ${WORKDIR}/ISOTMP/ >>${WORKDIR}/bodhibuilder.log
+
+ # Add custom DISTNAME to UEFI grub
+ sed -i 's/__DISTNAME__/'"${DISTNAME}"'/g' ${WORKDIR}/ISOTMP/boot/grub/grub.cfg
+
+ # now move deb files section if all have successfully downloaded:
+ # in the above step, the pool dir is copied into ISOTMP
+ # (we should still be working IN dlpkgtempdir if dlpkgpass == 1)
+ if [ "${dlpkgpass}" == "1" ] ; then # successful downloads
+ log_msg "moving deb files into pool"
+ rm -rf ${WORKDIR}/ISOTMP/pool/*
+ mv ${WORKDIR}/dlpkgtempdir/* ${WORKDIR}/ISOTMP/pool/ # mv all new files from dlpkgpass into pool
+ cd ${WORKDIR}
+ rm -rf ./dlpkgtempdir
+ else # unsuccessful downloads
+ log_msg "no new deb files being copied into pool so as to maintain compatibility"
+ pwd >>${WORKDIR}/bodhibuilder.log
+ fi
+
+ # Creating a repository for the Ubiquity install
+ # Note: in order for this to work correctly, the source system
+ # must be completely upgraded, as in 'apt-get dist-upgrade'
+ log_msg "Creating a Packages.gz repository for the Ubiquity install"
+ rm -f ${WORKDIR}/ISOTMP/dists/Packages.gz
+ cd ${WORKDIR}/ISOTMP/
+ dpkg-scanpackages pool /dev/null 2>>${WORKDIR}/bodhibuilder.log | gzip -9c > ./dists/Packages.gz
+ cd -
+
+ #copy any preseed files
+ log_msg "Copying any preseed files"
+ cp /etc/bodhibuilder/preseed/* ${WORKDIR}/ISOTMP/preseed/
+
+ #BOOT Type is isolinux
+ log_msg "Copying memtest86+ for the live system"
+ cp /boot/memtest86+.bin ${WORKDIR}/ISOTMP/install/memtest
+
+ # BB EFI BOOT
+ # Customize file '/etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu' to point to vmlinuz.efi
+
+ ## ARCH based:
+ #~ if [ "${ARCH}" = "amd64" ] ; then # replace 'vmlinuz' with 'vmlinuz.efi'
+ #~ log_msg "Converting isolinux.cfg.vesamenu to UEFI bootable (vmlinuz.efi)"
+ #~ sed -i 's/vmlinuz$/vmlinuz\.efi/g' /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu
+ #~ else # replace 'vmlinuz.efi' with 'vmlinuz'
+ #~ log_msg "Converting isolinux.cfg.vesamenu to 32-bit (vmlinuz)"
+ #~ sed -i 's/vmlinuz\.efi$/vmlinuz/g' /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu
+ #~ fi
+
+ ## BOOT_FIRMWARE based:
+ # ? Base on existence of /sys/firmware/efi/efivars/* files instead so it can be a 32b efi install?
+ #~ if [ "${BOOT_FIRMWARE}" = "EFI" ] ; then # replace 'vmlinuz' with 'vmlinuz.efi'
+ #~ log_msg "Converting isolinux.cfg.vesamenu to UEFI boot (vmlinuz.efi)"
+ #~ sed -i 's/vmlinuz$/vmlinuz\.efi/g' /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu
+ #~ elif [ "${BOOT_FIRMWARE}" = "BIOS" ] ; then # replace 'vmlinuz.efi' with 'vmlinuz'
+ #~ log_msg "Converting isolinux.cfg.vesamenu to NON-UEFI boot (vmlinuz)"
+ #~ sed -i 's/vmlinuz\.efi$/vmlinuz/g' /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu
+ #~ fi
+
+ ## Just make it vmlinuz.efi:
+ # (Reason to do this -- /etc/bodhibuilder/uefi/boot/grub/grub.cfg file points to vmlinuz.efi,
+ # as does /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu, by default. So far, vmlinuz.efi
+ # has not hurt anything even if it's not a remaster in a UEFI booted system.)
+ # Forget the above stuff, and have isolinux just point to vmlinuz.efi like this:
+ log_msg "Ensuring isolinux.cfg.vesamenu is UEFI bootable (vmlinuz.efi)"
+ sed -i 's/vmlinuz$/vmlinuz\.efi/g' /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu
+
+
+
+
+ # check and see if they have a custom isolinux already setup. eg. they copied over
+ # the isolinux folder from their original livecd or made a custom one for their distro
+ # and get files isohdpfx.bin & isolinux.bin
+ if [ ! -f /etc/bodhibuilder/customisolinux/isolinux.cfg ] ; then # no custom isolinux (bb default)
+ log_msg "Creating isolinux setup for the live system"
+ find /usr/lib/ -name 'isohdpfx.bin' -exec cp -f {} ${WORKDIR}/ISOTMP/isolinux/ \;
+ find /usr/lib/ -name 'isolinux.bin' -exec cp -f {} ${WORKDIR}/ISOTMP/isolinux/ \;
+ #find fix for vesamenu.32 provided by Krasimir S. Stefanov <lokiisyourmaster@gmail.com>
+ #~ VESAMENU=`find /usr -print0 | grep -FzZ "syslinux/vesamenu.c32"`
+ if [ "${UBUVERSION}" -le 14 ] ; then
+ VESAMENU=`find /usr/lib/syslinux/modules/bios/ -name "vesamenu.c32" | grep "vesamenu.c32"
+ cp ${VESAMENU} ${WORKDIR}/ISOTMP/isolinux/
+ elif [ "${UBUVERSION}" -gt 14 ] ; then
+ #~ case ${ARCH} in
+ #~ amd64 )
+ #~ VESAMENU=`find /usr/lib/ -name "vesamenu.c32" | grep "efi64/vesamenu.c32"`
+ #~ ;;
+ #~ * )
+ #~ #VESAMENU=`find /usr/lib/ -name "vesamenu.c32" | grep "efi32/vesamenu.c32"`
+ #~ VESAMENU=`find /usr/lib/ -name "vesamenu.c32" | grep "bios/vesamenu.c32"`
+ #~ ;;
+ #~ esac
+ # Copy the c32 files into isolinux ##### TEST
+ c32files=`find /usr/lib/ -name "*.c32" | grep "/bios/"`
+ for c in ${c32files} ; do
+ cp ${c} ${WORKDIR}/ISOTMP/isolinux/
+ done
+ fi
+ # setup isolinux for the livecd
+ #~ VERSION=`lsb_release -r | awk '{print $2}' | awk -F "." '{print $1}'`
+ sed -e 's/__DISTNAME__/'"${DISTNAME}"'/g' /etc/bodhibuilder/isolinux/isolinux.cfg.vesamenu > ${WORKDIR}/ISOTMP/isolinux/isolinux.cfg
+ cp /etc/bodhibuilder/isolinux/splash.png ${WORKDIR}/ISOTMP/isolinux/splash.png
+ else # custom isolinux
+ log_msg "Copying your custom isolinux setup to the live system"
+ cp /etc/bodhibuilder/customisolinux/* ${WORKDIR}/ISOTMP/isolinux/ &> /dev/null
+ fi
+
+ log_msg "Based on the ARCH of the system, setting the README.diskdefines file"
+
+ cat > ${WORKDIR}/ISOTMP/README.diskdefines <<FOO
+#define DISKNAME ${LIVECDLABEL}
+#define TYPE binary
+#define TYPEbinary 1
+#define ARCH ${ARCH}
+#define ARCH$ARCH 1
+#define DISKNUM 1
+#define DISKNUM1 1
+#define TOTALNUM 0
+#define TOTALNUM0 1
+FOO
+ cp ${WORKDIR}/ISOTMP/README.diskdefines ${WORKDIR}/ISOTMP/casper/README.diskdefines
+
+ sleep 1
+
+ # Step 4 - Make the filesystem.manifest and filesystem.manifest-desktop
+ log_msg "Creating filesystem.manifest and filesystem.manifest-desktop"
+ # May need to make change below on 'dpkg-query' line because 'version' var is not assigned earlier
+ # As a note I changed VERSION var to UBUVERSION earlier in script (note all CAPS) :
+ dpkg-query -W --showformat='${Package} ${Version}\n' > ${WORKDIR}/ISOTMP/casper/filesystem.manifest
+ cp ${WORKDIR}/ISOTMP/casper/filesystem.manifest ${WORKDIR}/ISOTMP/casper/filesystem.manifest-desktop
+
+ # Suggested by lkjoel from Ubuntu Forums - Joel Leclerc to remove the frontend so the Install menu item is not on the installed system
+ sed -i '/ubiquity-frontend/d' ${WORKDIR}/ISOTMP/casper/filesystem.manifest-desktop
+
+ sleep 1
+
+
+ # Step 5 - Prepare casper.conf depending on whether this is a backup or dist
+
+ if [ "${OPT1}" = "backup" ] ; then
+ BACKUPEXCLUDES=""
+ log_msg "Excluding folders from the backup that will cause issues"
+
+ for bi in `ls /home`; do
+ if [ -d /home/${bi}/.gvfs ] ; then
+ BACKUPEXCLUDES="${BACKUPEXCLUDES} /home/${bi}/.gvfs "
+ fi
+ if [ -d /home/${bi}/.cache ] ; then
+ BACKUPEXCLUDES="${BACKUPEXCLUDES} /home/${bi}/.cache "
+ fi
+ if [ -d /home/${bi}/.thumbnails ] ; then
+ BACKUPEXCLUDES="${BACKUPEXCLUDES} /home/${bi}/.thumbnails "
+ fi
+ if [ -d /home/${bi}/.local/share/gvfs-metadata ] ; then
+ BACKUPEXCLUDES="${BACKUPEXCLUDES} /home/${bi}/.local/share/gvfs-metadata "
+ fi
+ if [ -d /home/${bi}/.local/gvfs-metadata ] ; then
+ BACKUPEXCLUDES="${BACKUPEXCLUDES} /home/${bi}/.local/gvfs-metadata "
+ fi
+ if [ -d /home/${bi}/.local/share/Trash ] ; then
+ BACKUPEXCLUDES="${BACKUPEXCLUDES} /home/${bi}/.local/share/Trash "
+ fi
+ done
+
+ LIVEUSER="`who -u | grep -v root | cut -d " " -f1| uniq`"
+ if [ "`who -u | grep -v root | cut -d " " -f1| uniq | wc -l`" != "1" ] ; then
+ LIVEUSER="`grep '^[^:]*:[^:]*:1000:' /etc/passwd | awk -F ":" '{ print $1 }'`"
+ fi
+
+ if [ "${LIVEUSER}" = "" ] ; then
+ log_msg "Can't determine which user to use. Please logoff all users except for your main user and try again. Exiting."
+ exit 1
+ fi
+
+ LIVEHOME=`grep ${LIVEUSER} /etc/passwd | awk -F ":" '{print $6}'`
+ if [ "${BACKUPSHOWINSTALL}" = "1" ] ; then
+ # copy the install icon to the sudo users desktop
+ log_msg "Copying the ubiquity install icon to the desktop of ${LIVEUSER}"
+ if [ -e /etc/bodhibuilder/ubiquity/ubiquity.desktop ] ; then
+ UBIQUITYDESKTOP="/etc/bodhibuilder/ubiquity/ubiquity.desktop"
+ fi
+ if [ ! "${UBIQUITYDESKTOP}" ] ; then
+ UBIQUITYDESKTOP=`find /usr/share/applications -name 'ubiquity*.desktop' | head -1`
+ if [ ! "${UBIQUITYDESKTOP}" ] ; then
+ UBIQUITYDESKTOP=`find /usr -name 'ubiquity*.desktop' | head -1`
+ fi
+ fi
+ if [ "${UBIQUITYDESKTOP}" ] ; then
+ install -d -o ${LIVEUSER} -g ${LIVEUSER} /${LIVEHOME}/Desktop &> /dev/null
+ install -D -o ${LIVEUSER} -g ${LIVEUSER} ${UBIQUITYDESKTOP} /${LIVEHOME}/Desktop/ &> /dev/null
+ #~ sed -i "s/RELEASE/${LIVECDLABEL}/" "/${LIVEHOME}/Desktop/`basename ${UBIQUITYDESKTOP}`" &> /dev/null
+ sed -i "s/_LIVE_CD_LABEL_/${LIVECDLABEL}/" "/${LIVEHOME}/Desktop/`basename ${UBIQUITYDESKTOP}`" &> /dev/null
+ echo "ubiquity command: `grep -i exec= ${UBIQUITYDESKTOP}`" >>${WORKDIR}/bodhibuilder.log
+ fi
+ fi
+ elif [ "${OPT1}" = "dist" ] ; then
+ # copy over bb's ubiquity.desktop to the host system with the custom name 'Install ${LIVECDLABEL}'
+ log_msg "copying over bodhibuilder's ubiquity.desktop to the host system with the custom name 'Install ${LIVECDLABEL}'"
+ echo "- All available ubiquity files in /usr/share/applications/"
+ ls -l /usr/share/applications/UBIQUITY* >>${WORKDIR}/bodhibuilder.log
+ ls -l /usr/share/applications/ubiquity* >>${WORKDIR}/bodhibuilder.log
+ if [ ! -e /usr/share/applications/UBIQUITY.desktop_ORIG ] ; then
+ echo "- rename original ubiquity.desktop to UBIQUITY.desktop_ORIG" >>${WORKDIR}/bodhibuilder.log
+ find /usr/share/applications -name 'ubiquity.desktop' -execdir mv -v '{}' UBIQUITY.desktop_ORIG \; >>${WORKDIR}/bodhibuilder.log
+ fi
+ if [ -e /usr/share/applications/UBIQUITY.desktop ] ; then
+ yes | rm -vrf /usr/share/applications/UBIQUITY.desktop >>${WORKDIR}/bodhibuilder.log
+ fi
+ echo "- copy custom ubiquity.desktop into applications dir" >>${WORKDIR}/bodhibuilder.log
+ cp -vf /etc/bodhibuilder/ubiquity/ubiquity.desktop /usr/share/applications/ubiquity.desktop >>${WORKDIR}/bodhibuilder.log
+ echo "- set custom name to 'Install ${LIVECDLABEL}'" >>${WORKDIR}/bodhibuilder.log
+ sed -i "s/_LIVE_CD_LABEL_/${LIVECDLABEL}/" /usr/share/applications/ubiquity.desktop &> /dev/null
+ fi # end $OPT1 = backup or dist
+
+
+ # copy the desktop install icon into the icons dir
+ if [ -e /usr/share/icons/bbinstall.png ] ; then
+ if [ ! -e /usr/share/icons/bbinstall_previous.png ] ; then
+ cp -f /usr/share/icons/bbinstall.png /usr/share/icons/bbinstall_previous.png
+ fi
+ fi
+ echo "- copy install icon into icons dir" >>${WORKDIR}/bodhibuilder.log
+ cp -vf /etc/bodhibuilder/ubiquity/bbinstall.png /usr/share/icons/bbinstall.png
+
+
+ log_msg "Creating the casper.conf file."
+ # Added FLAVOUR= as the new casper live boot will make it the first word from the Live CD Name if FLAVOUR is not set
+ cat > /etc/casper.conf <<FOO
+# This file should go in /etc/casper.conf
+# Supported variables are:
+# USERNAME, USERFULLNAME, HOST, BUILD_SYSTEM
+
+export USERNAME="${LIVEUSER}"
+export USERFULLNAME="Live session user"
+export HOST="${LIVEUSER}"
+export BUILD_SYSTEM="Ubuntu"
+export FLAVOUR="${LIVEUSER}"
+FOO
+ cp /etc/casper.conf ${WORKDIR}/dummysys/etc/
+
+ sleep 1
+
+
+ # if the mode is dist then re-number the uid's for any user with a uid greater than 1000
+ # and make the passwdrestore file so the uid's are restored before the script finishes
+ # if this is not done, the livecd user will not be created properly
+ log_msg "Checking and setting user-setup-apply for the live system"
+
+ case ${OPT1} in
+ dist )
+ # make sure user-setup-apply is present in case backup mode was last used
+ if [ -f /usr/lib/ubiquity/user-setup/user-setup-apply.orig ] ; then
+ cp /usr/lib/ubiquity/user-setup/user-setup-apply.orig /usr/lib/ubiquity/user-setup/user-setup-apply
+ fi
+ ;;
+ * )
+ # since this is backup mode, prevent user-setup-apply from running during install
+ if [ ! -f /usr/lib/ubiquity/user-setup/user-setup-apply.orig ] ; then
+ mv /usr/lib/ubiquity/user-setup/user-setup-apply /usr/lib/ubiquity/user-setup/user-setup-apply.orig
+ fi
+ echo "exit 0"> /usr/lib/ubiquity/user-setup/user-setup-apply
+ chmod 755 /usr/lib/ubiquity/user-setup/user-setup-apply
+ ;;
+ esac
+
+
+ sleep 1
+
+
+ # Set the desired apt-setup commands for ubiquity
+ log_msg "Setting up casper and ubiquity options for ${OPT1} mode"
+
+ log_msg "Tweaking apt-setup"
+
+ # create a backup of the original apt-setup
+ if [ ! -f "/usr/share/ubiquity/apt-setup.0RIG" ] ; then
+ cp -f /usr/share/ubiquity/apt-setup /usr/share/ubiquity/apt-setup.0RIG
+ fi
+ rm -f /usr/share/ubiquity/apt-setup &> /dev/null
+ cp -f /etc/bodhibuilder/ubiquity/apt-setup.* /usr/share/ubiquity/
+ cp -f /etc/bodhibuilder/ubiquity/apt-setup.bb /usr/share/ubiquity/apt-setup # pre-configured apt-setup for bodhibuilder
+ chmod 755 /usr/share/ubiquity/apt-setup
+
+
+
+ # make a new initial ramdisk including the casper scripts
+ log_msg "Creating a new initial ramdisk for the live system"
+ mkinitramfs -o /boot/initrd.img-`uname -r` `uname -r`
+
+
+ log_msg "Copying your kernel and initrd for the livecd"
+ # new #
+
+ ## ARCH based:
+ #~ if [ "${ARCH}" = "amd64" ] ; then
+ #~ log_msg "Creating casper/vmlinuz.efi"
+ # simply renaming it to vmlinuz.efi hasn't hurt anything so far:
+ #~ cp /boot/vmlinuz-`uname -r` ${WORKDIR}/ISOTMP/casper/vmlinuz.efi
+ #~ else
+ #~ log_msg "Creating casper/vmlinuz"
+ #~ cp /boot/vmlinuz-`uname -r` ${WORKDIR}/ISOTMP/casper/vmlinuz
+ #~ fi
+
+ ## BOOT_FIRMWARE based:
+ #~ if [ "${BOOT_FIRMWARE}" = "EFI" ] ; then
+ #~ log_msg "Creating casper/vmlinuz.efi"
+ #~ cp /boot/vmlinuz-`uname -r` ${WORKDIR}/ISOTMP/casper/vmlinuz.efi
+ #~ elif [ "${BOOT_FIRMWARE}" = "BIOS" ] ; then
+ #~ log_msg "Creating casper/vmlinuz"
+ #~ cp /boot/vmlinuz-`uname -r` ${WORKDIR}/ISOTMP/casper/vmlinuz
+ #~ fi
+
+ ## Just make it vmlinuz.efi:
+ # (As stated earlier, so far, vmlinuz.efi has not hurt anything
+ # even if it's not a remaster in a UEFI booted system.)
+ log_msg "Creating casper/vmlinuz.efi"
+ cp /boot/vmlinuz-`uname -r` ${WORKDIR}/ISOTMP/casper/vmlinuz.efi
+
+
+
+
+ # Copy initrd into casper
+ cp -v /boot/initrd.img-`uname -r` ${WORKDIR}/ISOTMP/casper/initrd.lz
+
+
+ ## Process to create initrd.lz from initrd.img... in casper
+ # Provisional: DO NOT REMOVE UNLESS VERY SURE
+ # if /boot/initrd.img is in gzip format, some version
+ # of this will have to be implemented
+ #~ log_msg "Copying initrd.img to casper/initrd.gz"
+ #~ cp /boot/initrd.img-`uname -r` ${WORKDIR}/ISOTMP/casper/initrd.gz
+ #~ gunzip ${WORKDIR}/ISOTMP/casper/initrd.gz #changes initrd.gz to initrd
+ #~ mkdir ${WORKDIR}/ISOTMP/casper/tmpinitrd
+ #~ currdir=${PWD}
+ #~ cd ${WORKDIR}/ISOTMP/casper/tmpinitrd
+ #~ log_msg "Unpacking initrd.gz"
+ #~ cpio -id < ../initrd
+ #~ sleep 1
+ #~ #create the initrd.lz
+ #~ log_msg "Repacking and compressing as initrd.lz"
+ #~ find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../initrd.lz
+ #~ cd ${WORKDIR}/ISOTMP/casper
+ #~ log_msg "Cleaning up ${PWD}"
+ #~ if [ -d ./tmpinitrd ] ; then #remove unnecessary leftovers
+ #~ rm -r ./tmpinitrd
+ #~ fi
+ #~ if [ -f ./initrd ] ; then #remove unnecessary leftovers
+ #~ rm ./initrd
+ #~ fi
+ #~ cd ${currdir} #cd back to original dir & continue remastering
+ #~ log_msg "Working in ${PWD}"
+
+
+ #exit if missing vmlinuz.efi
+ if [ ! -f ${WORKDIR}/ISOTMP/casper/vmlinuz.efi ] ; then
+ log_msg "vmlinuz.efi not found in casper. Exiting"
+ exit 1
+ fi
+
+ #exit if missing... initrd.lz
+ if [ ! -f ${WORKDIR}/ISOTMP/casper/initrd.lz ] ; then
+ log_msg "Missing valid initial ramdisk. Exiting"
+ exit 1
+ fi
+
+
+ # Step 6 - Make filesystem.squashfs
+
+ if [ -f ${WORKDIR}/ISOTMP/casper/filesystem.squashfs ] ; then
+ rm -f ${WORKDIR}/ISOTMP/casper/filesystem.squashfs &> /dev/null
+ fi
+
+ log_msg "Creating filesystem.squashfs ... this will take a while so please be patient"
+
+ REALFOLDERS=""
+
+ # add folders to mksquashfs
+ for d in `ls -d ${WORKDIR}/dummysys/*`; do
+ REALFOLDERS="${REALFOLDERS} ${d}"
+ done
+
+
+ # set some folders to add or exclude from mksquashfs
+ case ${OPT1} in
+ backup )
+ # add folders to mksquashfs command
+ for d in `ls / | grep -v etc | grep -v run | grep -v tmp | grep -v sys | grep -v var | grep -v dev | grep -v media | grep -v mnt | grep -v lost+found | grep -v proc`; do
+ REALFOLDERS="${REALFOLDERS} /${d}"
+ done
+ ;;
+
+ dist )
+ # add folders to mksquashfs command
+ for d in `ls / | grep -v etc | grep -v run | grep -v tmp | grep -v sys | grep -v var | grep -v dev | grep -v media | grep -v mnt | grep -v lost+found | grep -v proc | grep -v home`; do
+ REALFOLDERS="${REALFOLDERS} /${d}"
+ done
+ ;;
+ esac
+
+
+
+ # Include only wanted icons & icon sets - multiple choices
+ if [ "${DISTICONS}" ] ; then
+ log_msg "Purging unwanted icon sets"
+ #~ EXCLUDEICONS=`ls -db /usr/share/icons/*`
+ EXCLUDEICONS=`find /usr/share/icons/* -maxdepth 0 -exec echo -n {} +` # all files in /usr/share/icons/
+ echo " EXCLUDEICONS started as:" >>${WORKDIR}/bodhibuilder.log
+ echo " > ${EXCLUDEICONS}" >>${WORKDIR}/bodhibuilder.log
+ for i in ${DISTICONS} ; do
+ if [ -e "/usr/share/icons/${i}" ] ; then
+ echo "Removing ${i} from EXCLUDEICONS" >>${WORKDIR}/bodhibuilder.log
+ EXCLUDEICONS=`echo ${EXCLUDEICONS} | sed -e "s/ \/usr\/share\/icons\/${i} / /"`
+ fi
+ done
+ # EXCLUDEICONS is now all files in /usr/share/icons/ except those from DISTICONS
+ echo " EXCLUDEICONS is now:" >>${WORKDIR}/bodhibuilder.log
+ echo " > ${EXCLUDEICONS}" >>${WORKDIR}/bodhibuilder.log
+ fi
+
+ # Include only wanted locales - multiple choices
+ if [ "${DISTLOCALE}" ] ; then
+ log_msg "Purging unwanted locales"
+ #~ EXCLUDELOCALES=`ls -db /usr/share/locale/*` # does not list directories only
+ EXCLUDELOCALES=`find /usr/share/locale/* -maxdepth 0 -type d -exec echo -n {} +` # lists all directories in /usr/share/locale/
+ echo " EXCLUDELOCALES started as:" >>${WORKDIR}/bodhibuilder.log
+ echo " > ${EXCLUDELOCALES}" >>${WORKDIR}/bodhibuilder.log
+ for i in ${DISTLOCALE} ; do
+ if [ -d "/usr/share/locale/${i}" ] ; then
+ echo "Removing ${i} from EXCLUDELOCALES" >>${WORKDIR}/bodhibuilder.log
+ EXCLUDELOCALES=`echo ${EXCLUDELOCALES} | sed -e "s/ \/usr\/share\/locale\/${i} / /"`
+ fi
+ done
+ # EXCLUDELOCALES is now all files in /usr/share/locale/ except those from DISTLOCALE
+ echo " EXCLUDELOCALES is now:" >>${WORKDIR}/bodhibuilder.log
+ echo " > ${EXCLUDELOCALES}" >>${WORKDIR}/bodhibuilder.log
+ fi
+
+
+
+ # set the mksquashfs command
+ case ${OPT1} in
+ backup )
+ squashcmd="mksquashfs ${REALFOLDERS} ${WORKDIR}/ISOTMP/casper/filesystem.squashfs ${SQUASHFSOPTS} -e root/.local/Trash root/.thumbnails root/.cache root/.bash_history root/.lesshst root/.nano_history /boot/grub /usr/share/applications/bodhibuilder-gtk.desktop ${BASEWORKDIR} ${EXCLUDEICONS} ${EXCLUDELOCALES} ${EXCLUDES} 2>>${WORKDIR}/bodhibuilder.log"
+ ;;
+ * )
+ squashcmd="mksquashfs ${REALFOLDERS} ${WORKDIR}/ISOTMP/casper/filesystem.squashfs ${SQUASHFSOPTS} -e root/.local/Trash root/.thumbnails root/.cache root/.bash_history root/.lesshst root/.nano_history /boot/grub /usr/share/applications/bodhibuilder-gtk.desktop ${BASEWORKDIR} ${EXCLUDEICONS} ${EXCLUDELOCALES} ${EXCLUDES} 2>>${WORKDIR}/bodhibuilder.log"
+ ;;
+ esac
+ echo "mksquashfs command:" >>${WORKDIR}/bodhibuilder.log
+ echo " > ${squashcmd}" >>${WORKDIR}/bodhibuilder.log
+ # make the squashfs
+ eval ${squashcmd}
+
+
+ sleep 1
+
+
+ #add some stuff the log in case of problems so I can troubleshoot it easier
+ echo "Updating the bodhibuilder.log"
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "Mount information" >>${WORKDIR}/bodhibuilder.log
+ mount >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "Disk size information" >>${WORKDIR}/bodhibuilder.log
+ df -h >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "Casper Script info" >>${WORKDIR}/bodhibuilder.log
+ ls -l /usr/share/initramfs-tools/scripts/casper-bottom/ >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "/etc/bodhibuilder.conf info" >>${WORKDIR}/bodhibuilder.log
+ cat /etc/bodhibuilder.conf >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "/etc/casper.conf info" >>${WORKDIR}/bodhibuilder.log
+ cat /etc/casper.conf >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "/etc/passwd info" >>${WORKDIR}/bodhibuilder.log
+ cat ${WORKDIR}/dummysys/etc/passwd >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "/etc/group info" >>${WORKDIR}/bodhibuilder.log
+ cat ${WORKDIR}/dummysys/etc/group >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "/etc/X11/default-display-manager info" >>${WORKDIR}/bodhibuilder.log
+ cat ${WORKDIR}/dummysys/etc/X11/default-display-manager >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "/etc/skel info" >>${WORKDIR}/bodhibuilder.log
+ find /etc/skel >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "lsb-release info" >>${WORKDIR}/bodhibuilder.log
+ cat ${WORKDIR}/dummysys/etc/lsb-release >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "bodhibuilder version info" >>${WORKDIR}/bodhibuilder.log
+ cat /etc/bodhibuilder/bodhibuilder.version >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "ISOTMP info" >>${WORKDIR}/bodhibuilder.log
+ ls -Rl ${WORKDIR}/ISOTMP >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "${WORKDIR}/tmpusers info" >>${WORKDIR}/bodhibuilder.log
+ cat ${WORKDIR}/tmpusers >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+ echo "Command-line options = $@" >>${WORKDIR}/bodhibuilder.log
+ echo "------------------------------------------------------" >>${WORKDIR}/bodhibuilder.log
+
+
+ # cleanup the install icons as they aren't needed on the current system
+
+ if [ "${OPT1}" = "backup" ] ; then
+ log_msg "Cleaning up the install icon from the user desktops"
+ rm -rf /home/*/Desktop/ubiquity*.desktop &> /dev/null
+ fi
+
+
+ ## Removed this in v2.1.0
+ #~ #remove frontend from the system so the Install menu item does not appear.
+ #~ log_msg "Removing the ubiquity frontend as it has been included and is not needed on the normal system"
+ #~ apt-get -y -q remove ubiquity-frontend-kde &> /dev/null
+ #~ apt-get -y -q remove ubiquity-frontend-gtk &> /dev/null
+
+
+ sleep 1
+
+
+ # add filesystem size for lucid
+ log_msg "Calculating the installed filesystem size for the installer"
+ unsquashfs -lls ${WORKDIR}/ISOTMP/casper/filesystem.squashfs | grep -v " inodes " | grep -v "unsquashfs:" | awk '{print $3}' | grep -v "," > /tmp/size.tmp
+ for i in `cat /tmp/size.tmp`; do a=$((${a}+${i})); done
+ echo ${a} > ${WORKDIR}/ISOTMP/casper/filesystem.size
+
+ # remove bodhibuilder-firstboot from the host system
+ log_msg "Removing bodhibuilder-firstboot from current system's startup"
+ update-rc.d -f bodhibuilder-firstboot remove
+ chmod 644 /etc/init.d/bodhibuilder-firstboot
+
+ # restore ubiquity.desktop
+ if [ "${OPT1}" = "dist" ] ; then
+ if [ -e /usr/share/applications/UBIQUITY.desktop_ORIG ] ; then
+ log_msg "restoring ubiquity.desktop on the host system"
+ mv -f /usr/share/applications/ubiquity.desktop /usr/share/applications/ubiquity.desktop_BB
+ mv -f /usr/share/applications/UBIQUITY.desktop_ORIG /usr/share/applications/ubiquity.desktop
+ fi
+ fi
+}
+##### END function cdfs #####
+
+
+
+
+
+##### FUNCTION iso #####
+iso (){
+
+ # If xorriso exists, use it to make the iso. It can be used to create a UEFI bootable iso via dd.
+ # Otherwise, make genisoimage primary because it supercedes mkisofs
+ CREATEISO="`which xorriso`"
+ if [ "${CREATEISO}" = "" ] ; then
+ CREATEISO="`which genisoimage`"
+ if [ "${CREATEISO}" = "" ] ; then
+ CREATEISO="`which mkisofs`"
+ fi
+ fi
+
+ case ${CREATEISO} in
+ *xorriso* )
+ ISOCMD="xorriso"
+ ;;
+ *genisoimage )
+ ISOCMD="genisoimage"
+ ;;
+ *mkisofs )
+ ISOCMD="mkisofs"
+ ;;
+ esac
+
+ # Feedback to the log about which will be used to create the ISO
+ log_msg "On first detection (this could change based on other parameters) ---"
+ log_msg " Found '${CREATEISO}'"
+ log_msg " Currently planning to use '${ISOCMD}' to create the ISO."
+
+ # check to see if the cd filesystem exists
+ if [ ! -f "${WORKDIR}/ISOTMP/casper/filesystem.squashfs" ] ; then
+ log_msg "The filesystem.squashfs filesystem is missing. Either there was a problem creating the compressed filesystem or you are trying to run sudo bodhibuilder dist iso before sudo bodhibuilder dist cdfs"
+ exit 1
+ fi
+
+ #checking the size of the compressed filesystem to ensure it meets the iso9660 spec for a single file"
+ ## Not worried about the squashfs size for xorriso because it doesn't care what size the iso will be
+ ## Although if genisoimage or mkisofs are being used they do care about the iso size <-sef>
+ case ${CREATEISO} in
+ *genisoimage|*mkisofs )
+ SQUASHFSSIZE=`ls -s ${WORKDIR}/ISOTMP/casper/filesystem.squashfs | awk -F " " '{print $1}'`
+ if [ "${SQUASHFSSIZE}" -gt "3999999" ] ; then
+ log_msg "The compressed filesystem is larger than genisoimage allows for a single file. You must try to reduce the amount of data you are backing up and try again."
+ exit 1
+ fi
+ ;;
+ esac
+
+
+ #Step 6.5 - Make ISO compatible with UEFI Grub Boot. This needs to be here or else UEFI boot won't work.
+ log_msg "Making disk compatible with UEFI Grub Boot."
+
+ #~ . /etc/lsb-release
+ # ^^ (test) changed above line to this so as to keep the custom DISTRIB_DESCRIPTION:
+ . ${WORKDIR}/dummysys/etc/lsb-release
+
+ touch ${WORKDIR}/ISOTMP/ubuntu
+ # ^^ (test) look into changing above line to this:
+ #~ touch ${WORKDIR}/ISOTMP/bodhi
+
+ touch ${WORKDIR}/ISOTMP/.disk/base_installable
+ echo "full_cd/single" > ${WORKDIR}/ISOTMP/.disk/cd_type
+ # starting with 12.04 need to have correct ubuntu version or startup disk creator uses syslinux-legacy which won't work
+ DISKINFONAME=`echo ${LIVECDLABEL} | awk '{print $1}'`
+ echo ${DISKINFONAME} ${DISTRIB_RELEASE} - Release ${ARCH} > ${WORKDIR}/ISOTMP/.disk/info
+ echo ${LIVECDURL} > ${WORKDIR}/ISOTMP/.disk/release_notes_url
+
+
+
+ # Step 7 - Make md5sum.txt for the files on the livecd - this is used during the
+ # checking function of the livecd
+ log_msg "Creating md5sum.txt for the livecd/dvd"
+ cd ${WORKDIR}/ISOTMP && find . -type f -print0 | xargs -0 md5sum > md5sum.txt
+
+
+ #isolinux mode
+
+ # remove files that change and cause problems with checking the disk
+ sed -e '/isolinux/d' md5sum.txt > md5sum.txt.new
+ sed -e '/md5sum/d' md5sum.txt.new > md5sum.txt
+ rm -f md5sum.txt.new &> /dev/null
+
+ sleep 1
+
+ # Step 8 - Make the ISO file
+ log_msg "Creating ${CUSTOMISO} in ${WORKDIR}"
+
+
+
+
+ # if file isohdpfx.bin doesn't exist, don't use xorriso
+ if [ ! -f "${WORKDIR}/ISOTMP/isolinux/isohdpfx.bin" ] ; then
+ log_msg "File '${WORKDIR}/ISOTMP/isolinux/isohdpfx.bin' not found."
+ log_msg "Can't use xorriso."
+ CREATEISO="`which genisoimage`"
+ ISOCMD="genisoimage"
+ if [ ! "${CREATEISO}" ] ; then
+ CREATEISO="`which mkisofs`"
+ ISOCMD="mkisofs"
+ fi
+ case ${CREATEISO} in
+ *genisoimage|*mkisofs )
+ log_msg " No longer using xorriso..."
+ log_msg " Now using '${ISOCMD}' @ '${CREATEISO}' to create the ISO."
+ ;;
+ esac
+ fi
+
+ # set ISO creation command based on architecture
+ # and then create the ISO
+ isopass=0
+ until [ "${isopass}" -eq 1 ] ; do
+
+ # do xorriso, genisoimage, or mkisofs depending on which will work best:
+ case ${CREATEISO} in
+ *xorriso* ) # Possibly create ISO using /usr/bin/xorriso - must be 64-bit OS
+ isopass=1 # Use xorriso regardless of ${ARCH}
+ ;; # end xorriso case select
+ # if isopass=0, goes back to beginning of loop
+
+ *genisoimage|*mkisofs ) # Create ISO using /usr/bin/genisoimage
+
+ #checking the size of the compressed filesystem to ensure it meets the iso9660 spec for a single file"
+ ## Not worried about the squashfs size for xorriso because it doesn't care what size the iso will be
+ ## Although if genisoimage or mkisofs are being used they do care about the iso size <-sef>
+ SQUASHFSSIZE=`ls -s ${WORKDIR}/ISOTMP/casper/filesystem.squashfs | awk -F " " '{print $1}'`
+ if [ "${SQUASHFSSIZE}" -gt "3999999" ] ; then
+ log_msg "The compressed filesystem is larger than genisoimage allows for a single file. You must try to reduce the amount of data you are backing up and try again."
+ exit 1
+ fi
+
+ # log message
+ if [ "${ISOCMD}" = "genisoimage" ] ; then
+ log_msg "Using genisoimage to create ISO."
+ elif [ "${ISOCMD}" = "mkisofs" ] ; then
+ log_msg "Using mkisofs to create ISO."
+ fi
+
+ # check architecture
+ if [ ! "${ARCH}" = "amd64" ] ; then
+ log_msg "This ISO may not be UEFI bootable. At this time, UEFI is only fully supported in 64-bit OS."
+ fi
+
+ isopass=1
+ ;; # end genisoimage|mkisofs case select
+
+ * ) # none of the three ISO creation programs are found on OS
+ log_msg "ERROR: xorriso, genisoimage, or mkisofs programs not found;"
+ log_msg "because of this the iso was not created. Exiting"
+ exit 1
+ ;;
+ esac # end CREATEISO check
+ done # end isopass loop check
+
+
+
+
+
+
+ ## Now actually create the ISO
+ case ${CREATEISO} in
+ *xorriso* ) #
+ # xorriso
+ # - Can boot to ISO in either UEFI or non-UEFI mode when dd'd to a USB, CD or DVD
+ # - Copy direct to CD or DVD using command: sudo xorrecord dev=/dev/sr0 speed=12 fs=8m blank=as_needed -eject padsize=300k file.iso
+ # - Copy direct to USB using command: sudo dd if=file.iso of=/dev/sdX
+ case ${ARCH} in
+ amd64 )
+ log_msg "creating 64-bit ISO with xorriso"
+ ${CREATEISO} -as mkisofs \
+ -isohybrid-mbr ${WORKDIR}/ISOTMP/isolinux/isohdpfx.bin \
+ -partition_offset 16 \
+ -cache-inodes -J -l \
+ -iso-level 3 \
+ -V "${LIVECDLABEL}" \
+ -c isolinux/boot.cat \
+ -b isolinux/isolinux.bin \
+ -no-emul-boot \
+ -boot-load-size 4 \
+ -boot-info-table \
+ -eltorito-alt-boot \
+ -e boot/grub/efi.img \
+ -no-emul-boot \
+ -isohybrid-gpt-basdat \
+ -isohybrid-apm-hfsplus \
+ -o ${WORKDIR}/${CUSTOMISO} "${WORKDIR}/ISOTMP" 2>>${WORKDIR}/bodhibuilder.log 1>>${WORKDIR}/bodhibuilder.log
+ ;;
+ * ) # 32-bit arch using xorriso
+ log_msg "creating 32-bit ISO with xorriso"
+ ${CREATEISO} -as mkisofs \
+ -isohybrid-mbr ${WORKDIR}/ISOTMP/isolinux/isohdpfx.bin \
+ -partition_offset 16 \
+ -cache-inodes -J -l \
+ -iso-level 3 \
+ -V "${LIVECDLABEL}" \
+ -c isolinux/boot.cat \
+ -b isolinux/isolinux.bin \
+ -no-emul-boot \
+ -boot-load-size 4 \
+ -boot-info-table \
+ -eltorito-alt-boot \
+ -e boot/grub/efi.img \
+ -no-emul-boot \
+ -isohybrid-gpt-basdat \
+ -isohybrid-apm-hfsplus \
+ -o ${WORKDIR}/${CUSTOMISO} "${WORKDIR}/ISOTMP" 2>>${WORKDIR}/bodhibuilder.log 1>>${WORKDIR}/bodhibuilder.log
+ ;;
+ esac
+ ;;
+ *genisoimage|*mkisofs ) #
+ log_msg "creating ISO with ${ISOCMD}"
+ # create the ISO
+ ${CREATEISO} -iso-level 3 -quiet -r -V "${LIVECDLABEL}" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ${WORKDIR}/${CUSTOMISO} "${WORKDIR}/ISOTMP" 2>>${WORKDIR}/bodhibuilder.log 1>>${WORKDIR}/bodhibuilder.log
+ ;;
+ esac
+
+
+
+
+ if [ ! -f ${WORKDIR}/${CUSTOMISO} ] ; then
+ log_msg "The iso was not created. There was a problem. Exiting"
+ exit 1
+ fi
+
+ log_msg "Copying apt-setup back to original"
+ if [ -f "/usr/share/ubiquity/apt-setup.0RIG" ] ; then
+ cp -f /usr/share/ubiquity/apt-setup.0RIG /usr/share/ubiquity/apt-setup
+ fi
+
+ # Make the iso hybrid so it can be simply dd copied to a usb flash drive.
+ case ${CREATEISO} in
+ *xorriso* ) # no need to make hybrid with xorriso
+ case ${ARCH} in
+ amd64 )
+ log_msg "================================================================================"
+ log_msg ""
+ log_msg "Good news, ${CUSTOMISO} was created using the xorriso package."
+ log_msg "You can now optionally use the following commands to make a medium"
+ log_msg "that is bootable in both UEFI or BIOS (non-UEFI) modes."
+ log_msg " *Create a bootable CD or DVD:"
+ log_msg " $ sudo xorrecord dev=/dev/sr0 speed=12 fs=8m blank=as_needed -eject padsize=300k ${WORKDIR}/${CUSTOMISO}"
+ log_msg " *Create a bootable USB:"
+ log_msg " (you will need to determine which device your USB has been assigned,"
+ log_msg " Do not copy & paste this command directly without changing '/dev/sdX', it won't work."
+ log_msg " dd CAN be dangerous ... now you've been warned.)"
+ log_msg " $ sudo dd if=${WORKDIR}/${CUSTOMISO} of=/dev/sdX"
+ log_msg ""
+ log_msg "================================================================================"
+ ;;
+ * )
+ log_msg ""
+ log_msg "32-bit xorriso, I don't really know what's going to happen with UEFI right now."
+ log_msg ""
+ ;;
+ esac
+ ;;
+ * ) # if not using xorriso, need to make it a hybrid, but it still might not be uefi bootable
+ log_msg "Making ${CUSTOMISO} a hybrid iso"
+ isohybrid ${WORKDIR}/${CUSTOMISO} # disable this when isohybrid has --uefi option available, as below command
+ #~ isohybrid --uefi ${WORKDIR}/${CUSTOMISO} # enable this when isohybrid has --uefi option available
+ ;;
+ esac
+
+ # create the md5 sum file so the user doesn't have to - this is good so the iso
+ # file can later be tested to ensure it hasn't become corrupted
+ log_msg "Creating ${CUSTOMISO}.md5 in ${WORKDIR}"
+ cd ${WORKDIR}
+ md5sum ${CUSTOMISO} > ${CUSTOMISO}.md5
+ sleep 1
+ # create the sha256 sum
+ log_msg "Creating ${CUSTOMISO}.sha256 in ${WORKDIR}"
+ cd ${WORKDIR}
+ sha256sum ${CUSTOMISO} > ${CUSTOMISO}.sha256
+
+ sleep 1
+
+ ISOSIZE1="`ls -hs ${WORKDIR}/${CUSTOMISO} | awk '{print $1}'`"
+ ISOSIZE2="`ls -l ${WORKDIR}/${CUSTOMISO} | awk '{print $5}'`"
+
+ log_msg " Custom ISO ${WORKDIR}/${CUSTOMISO} = ${ISOSIZE1} (${ISOSIZE2})"
+ log_msg " is ready to be burned or tested in a virtual machine."
+}
+##### END function iso #####
+
+
+
+
+
+# check to see if either iso or cdfs options have been invoked and proceed accordingly
+
+case $2 in
+ iso )
+ iso $@
+ ;;
+ cdfs )
+ cdfs $@
+ ;;
+ * )
+ cdfs $@
+ iso $@
+ ;;
+esac
+
+
+
+
+exit 0
--- /dev/null
+#!/bin/bash
+cd /usr/share/bodhibuilder-gtk/
+./bodhibuilder-gtk.py
--- /dev/null
+#!/bin/bash
+
+# bodhibulder-skelcopy script to copy user data to /etc/skel
+#
+# (C) 2015 Modified by:
+# Stace Fauske <stace.fauske@gmail.com> <-sef>
+# Jeff Hoogland <JeffHoogland@Linux.com>
+# Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+# ORIGINAL COMMENTS:
+#
+# Created by Tony "Fragadelic" Brijeski
+#
+# Copyright 2011,2012 Under the GNU GPL2 License
+#
+# Created November 23, 2011
+#
+testroot="`whoami`"
+
+if [ "$testroot" != "root" ]; then
+ echo "Must be root"
+ exit 1
+fi
+
+SKELUSER="$1"
+if [ "$SKELUSER" = "" ]; then
+ echo "Usage is: bodhibulder-skelcopy username"
+ echo "Where username is a valid user on the system"
+ exit 1
+fi
+
+SKELFOLDER=`grep "^$SKELUSER:" /etc/passwd | awk -F ":" '{print $6}'`
+
+if [ -d "$SKELFOLDER" ]; then
+ cd $SKELFOLDER
+ echo "Cleaning up /etc/skel of the files we will copy over"
+ rm -rf /etc/skel/.bacon
+ rm -rf /etc/skel/.xscreensaver
+ rm -rf /etc/skel/.gconf
+ rm -rf /etc/skel/.bashrc
+ rm -rf /etc/skel/.bash_aliases
+ rm -rf /etc/skel/.profile
+ rm -rf /etc/skel/.gconf
+ rm -rf /etc/skel/.gnome2
+ rm -rf /etc/skel/.config
+ rm -rf /etc/skel/.local
+ rm -rf /etc/skel/.icewm*
+ rm -rf /etc/skel/.fvwm*
+ rm -rf /etc/skel/.afterstep*
+ rm -rf /etc/skel/.gtkrc*
+ rm -rf /etc/skel/.mate*
+ rm -rf /etc/skel/.pekwm*
+ rm -rf /etc/skel/.qt*
+ rm -rf /etc/skel/.kde*
+ rm -rf /etc/skel/.razor
+ rm -rf /etc/skel/.wbar
+ rm -rf /etc/skel/.mplayer
+ echo "Copying config files to /etc/skel"
+ rsync -a .bacon /etc/skel/
+ rsync -a .xscreensaver /etc/skel
+ sed -i -e "s/$SKELUSER//g" /etc/skel/.xscreensaver
+ rsync -a .gconf /etc/skel/
+ rsync -a .bashrc /etc/skel/
+ rsync -a .bash_aliases /etc/skel/
+ rsync -a .profile /etc/skel/
+ rsync -a .gnome2 /etc/skel/
+ rsync -a .config /etc/skel/
+ rsync -a .local /etc/skel/
+ rsync -a .icewm* /etc/skel/
+ rsync -a .fvwm* /etc/skel/
+ rsync -a .afterstep* /etc/skel/
+ rsync -a .mate* /etc/skel/
+ rsync -a .gtkrc* /etc/skel/
+ rsync -a .qt* /etc/skel/
+ rsync -a .kde* /etc/skel/
+ rsync -a .pekwm /etc/skel/
+ rsync -a .razor /etc/skel/
+ rsync -a .wbar /etc/skel/
+ rsync -a .mplayer /etc/skel/
+ if [ -d ~/.e/ ] ; then rsync -a .e /etc/skel/ ; fi
+ rm -rf /etc/skel/.config/chromium
+ rm -rf /etc/skel/.config/midori/cookies.*
+ rm -rf /etc/skel/.config/midori/history.*
+ rm -rf /etc/skel/.config/midori/tabtrash.*
+ rm -rf /etc/skel/.config/midori/running*
+ rm -rf /etc/skel/.config/midori/bookmarks.*
+ rm -rf /etc/skel/.config/user-dirs.*
+ rm -rf /etc/skel/.gconf/system/networking
+ rm -rf /etc/skel/.local/gvfs-metadata
+ rm -rf /etc/skel/.local/share/gvfs-metadata
+ rm -rf /etc/skel/.local/share/applications/wine-*
+ rm -rf /etc/skel/.local/share/Trash
+ rm -rf /etc/skel/.local/share/akonadi
+ rm -rf /etc/skel/.local/share/webkit
+ rm -rf /etc/skel/.kde/share/apps/klipper
+ rm -rf /etc/skel/.kde/share/apps/nepomuk
+ rm -rf /etc/skel/.kde/share/apps/RecentDocuments/*
+ for i in /etc/skel/.gnome2/keyrings/*; do rm $i; done
+ find /etc/skel/ | grep "$SKELUSER" | xargs rm -rf '{}'
+ find /etc/skel/ -name "*socket*" | xargs rm -rf '{}'
+ find /etc/skel/ -name "*cache*" | xargs rm -rf '{}'
+ grep -Rl "$SKELUSER" /etc/skel | xargs rm -rf '{}'
+ chown -R root:root /etc/skel
+
+else
+ echo "$1 either not found or doesn't have a proper home folder - exiting."
+ exit 1
+fi
--- /dev/null
+#!/bin/bash
+
+chk_root () {
+
+ if [ ! $( id -u ) -eq 0 ]; then
+ echo Must be run as root
+ exit
+ fi
+
+}
+
+chk_root
+
+DURATION=$1
+
+if [ $# -ne 1 ]; then
+ DURATION=5
+fi
+
+plymouthd; plymouth --show-splash ; for ((I=0; I<$DURATION; I++)); do plymouth --update=test$I ; sleep 1; done; plymouth quit
--- /dev/null
+[Desktop Entry]
+Name=bodhibuilder
+Name[de]=bodhibuilder
+Name[es]=bodhibuilder
+Name[fi]=bodhibuilder
+Name[fr]=bodhibuilder
+Name[ko]=bodhibuilder
+Name[no]=bodhibuilder
+Name[pt_BR]=bodhibuilder
+Name[sl]=bodhibuilder
+Name[sv]=bodhibuilder
+Name[uk]=bodhibuilder
+Name[ro]=bodhibuilder
+Name[zh_TW]=bodhibuilder
+GenericName=bodhibuilder
+Comment=Backup your Ubuntu-based OS
+Comment[de]=Backup your Ubuntu-based OS
+Exec=su-to-root -X -c /usr/bin/bodhibuilder-gtk
+Icon=/usr/share/icons/bodhibuilder-gtk.png
+Terminal=false
+Type=Application
+Categories=GTK;System;
+StartupNotify=true
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<glade-interface>
+ <!-- interface-requires gtk+ 2.20 -->
+ <!-- interface-naming-policy toplevel-contextual -->
+ <widget class="GtkWindow" id="window1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes">Bodhibuilder</property>
+ <property name="window_position">center</property>
+ <property name="icon_name">bodhibuilder-gtk</property>
+ <signal name="delete_event" handler="on_window1_delete_event" swapped="no"/>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="n_rows">10</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <widget class="GtkButton" id="button1">
+ <property name="label" translatable="yes">Backup</property>
+ <property name="width_request">150</property>
+ <property name="height_request">32</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button1_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Backup complete system including user data</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button2">
+ <property name="label" translatable="yes">Dist</property>
+ <property name="height_request">32</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button2_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Make a Distributable copy to share with friends - both cdfs and iso will be created</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button3">
+ <property name="label" translatable="yes">Distcdfs</property>
+ <property name="height_request">32</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button3_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Make a Distributable copy filesystem only - good if you want to add files to the cd</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button4">
+ <property name="label" translatable="yes">Distiso</property>
+ <property name="height_request">32</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button4_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Make distributable iso file only - cd filesystem must have been completed already</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button5">
+ <property name="label">gtk-clear</property>
+ <property name="height_request">32</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button5_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Remove temporary files</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </widget>
+ <packing>
+ <property name="right_attach">3</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button9">
+ <property name="label" translatable="yes">Select</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button9_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Boot menu picture for the live cd (640x480 PNG)</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button10">
+ <property name="label" translatable="yes">Select</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button10_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Boot menu picture for the installed environment</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkProgressBar" id="progressbar1">
+ <property name="can_focus">False</property>
+ <property name="text" translatable="yes">Updating GRUB, please wait...</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button11">
+ <property name="label" translatable="yes">Select</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button11_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">User, whose current settings will be used as default</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip" translatable="yes">Clear everything from /etc/skel</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button13_clicked" swapped="no"/>
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-clear</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button12">
+ <property name="label" translatable="yes">Select</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button12_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Plymouth theme</property>
+ <property name="width_chars">60</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Actions</property>
+ </widget>
+ <packing>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="n_rows">12</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <widget class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Username</property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can change the livecd/dvd username.</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">CD Label</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can change the name of the livecd/dvd label.</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">ISO Filename</property>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can change the name of the ISO file that is created.</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Working directory</property>
+ </widget>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">13</property>
+ <property name="label" translatable="yes"><span color="red">Working directory must be on a drive formatted with a linux filesystem.
+Bodhibuilder will create the "bodhibuilder" working folder in this folder and will not harm any other files or folders.</span></property>
+ <property name="use_markup">True</property>
+ <property name="width_chars">100</property>
+ <property name="max_width_chars">80</property>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="y_padding">5</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Files to Exclude</property>
+ </widget>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can add any other files or directories
+to be excluded from the live filesystem
+ Use absolute paths
+ Exclude specific files using the path to the file:
+ /path/to/file
+ Exclude specific directories using a trailing slash:
+ /path/to/directory/
+ Exclude all directory contents with an asterisk:
+ /path/to/directory/*
+ Exclude all matching sets of files or
+ directories using an asterisk as a wildcard:
+ /path/to/something*
+ If the entry does not exist as an actual file or directory,
+ it's ok, rsync & mksquashfs will simply skip over it
+
+Separate each entry with a space.</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">URL for ISO</property>
+ </widget>
+ <packing>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can change the url for the usb-creator info.</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Squashfs options</property>
+ </widget>
+ <packing>
+ <property name="top_attach">10</property>
+ <property name="bottom_attach">11</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can change the mksquashfs options
+ OK to leave this empty, the defaults will use the best compression I know of (as of this writing).</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">10</property>
+ <property name="bottom_attach">11</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkbutton1">
+ <property name="label" translatable="yes">Show install icon on Backup mode desktop</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">11</property>
+ <property name="bottom_attach">12</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">GRUB name</property>
+ </widget>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Choose the distribution name you want to show up in GRUB.</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Locales to Include</property>
+ </widget>
+ <packing>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can specify locales to INCLUDE.
+ List here the locales you want to keep that are in this path:
+ /usr/share/locale/(locale name)
+ Do not list the whole path, just the directories of the
+ locales you wish to INCLUDE in that path.
+ ** If this var is empty, all locales will be included.</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Icons to Include</property>
+ </widget>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entry8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Here you can specify icons or icon sets to INCLUDE.
+ List here the icons or sets you want to keep that are in this path:
+ /usr/share/icons/(icon or icon set name)
+ Do not list the whole path, just the set or icon name in that path.
+ ** If this var is empty, all icons will be included.</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkEntry" id="entry6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip" translatable="yes">This is the temporary working directory and won't be included on the cd/dvd.</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button8">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip" translatable="yes">Select working directory</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button8_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Settings</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Output</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="button6">
+ <property name="label">gtk-about</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button6_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button7">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button7_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="GtkWindow" id="window2">
+ <property name="can_focus">False</property>
+ <property name="border_width">12</property>
+ <property name="title" translatable="yes">Default settings</property>
+ <property name="window_position">center</property>
+ <signal name="delete_event" handler="on_window2_delete_event" swapped="no"/>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Select the user, whose settings to be used as default:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <widget class="GtkTreeView" id="treeview1">
+ <property name="height_request">128</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes"><span color="red">WARNING: make sure you chose user with a SMALL home directory, not some with gigabytes of data!
+Even so, you must manually check the contents of /etc/skel afterwards, and make sure it does not contain sensitive information (especially in the hidden folders)!</span></property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkProgressBar" id="progressbar1">
+ <property name="can_focus">False</property>
+ <property name="text" translatable="yes">Copying files, please wait...</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="button2">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button2_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button1">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button1_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="GtkWindow" id="window3">
+ <property name="can_focus">False</property>
+ <property name="border_width">12</property>
+ <property name="title" translatable="yes">Select plymouth theme</property>
+ <property name="window_position">center</property>
+ <signal name="delete_event" handler="on_window3_delete_event" swapped="no"/>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Available plymouth themes:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="height_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <widget class="GtkTreeView" id="treeview1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkbutton1">
+ <property name="label" translatable="yes">Automatic selection</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip" translatable="yes">Auto-select the plymouth theme, based on the update-alternatives information</property>
+ <property name="use_action_appearance">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_checkbutton1_toggled" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkProgressBar" id="progressbar1">
+ <property name="can_focus">False</property>
+ <property name="text" translatable="yes">Updating initramfs, please wait...</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="button2">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip" translatable="yes">Use the currently selected plymouth theme</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button2_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button3">
+ <property name="label" translatable="yes">Create</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip" translatable="yes">Create a simple static plymouth theme</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button3_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button4">
+ <property name="label" translatable="yes">Preview</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip" translatable="yes">Preview the currently selected plymouth theme</property>
+ <property name="use_action_appearance">False</property>
+ <signal name="clicked" handler="on_button4_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button1">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_button1_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</glade-interface>
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+#
+#
+# Bodhibuilder script to create or backup a Bodhi Linux ISO
+#
+# Modified to bodhibuilder from remastersys.
+#
+# For use on Bodhi Linux 3.0.0 and up.
+#
+# Copyright (C) 2015
+# Stace Fauske <stace.fauske@gmail.com> <-sef>
+# Jeff Hoogland <JeffHoogland@Linux.com>
+# Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+# ORIGINAL COMMENTS:
+#Licence: GPLv3.0
+#Copyright: Krasimir S. Stefanov <lokiisyourmaster@gmail.com>
+#Modified by: Tony Brijeski <tb6517@yahoo.com>
+#Modified to 'bodhibuilder' by: Stace Fauske <stace.fauske@gmail.com> <-sef> - (C) 2015
+#
+# 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.
+#
+
+try:
+ import sys
+ import os
+ import os.path
+ import stat
+ import locale
+ import gettext
+ import pygtk
+ pygtk.require("2.0")
+ import gtk
+ import gtk.glade
+ import re
+ import shutil
+ import datetime
+ import time
+ import subprocess
+ import shlex
+ import ConfigParser
+ import vte
+except:
+ print "Please install all dependencies!"
+ sys.exit(1)
+
+APP = "bodhibuilder"
+DIR = "/usr/share/locale"
+APP_VERSION = "2.2.7"
+
+locale.setlocale(locale.LC_ALL, '')
+gettext.bindtextdomain(APP, DIR)
+gettext.textdomain(APP)
+_ = gettext.gettext
+
+LOCALE = locale.getlocale()[0]
+
+
+class appgui:
+ def __init__(self):
+ self.pathname = os.path.dirname(sys.argv[0])
+ self.abspath = os.path.abspath(self.pathname)
+ self.gladefile = self.abspath + "/bodhibuilder-gtk.glade"
+ self.window1 = gtk.glade.XML(self.gladefile,"window1",APP)
+ self.working_dir = os.path.expanduser("~")
+ self.callback_id = 0
+
+ dic = {
+ "on_button1_clicked" : self.on_button1_clicked,
+ "on_button2_clicked" : self.on_button2_clicked,
+ "on_button3_clicked" : self.on_button3_clicked,
+ "on_button4_clicked" : self.on_button4_clicked,
+ "on_button5_clicked" : self.on_button5_clicked,
+ "on_button6_clicked" : self.on_button6_clicked,
+ "on_button7_clicked" : self.quit,
+ "on_button8_clicked" : self.on_button8_clicked,
+ "on_button9_clicked" : self.on_button9_clicked,
+ "on_button10_clicked" : self.on_button10_clicked,
+ "on_button11_clicked" : self.on_button11_clicked,
+ "on_button12_clicked" : self.on_button12_clicked,
+ "on_button13_clicked" : self.on_button13_clicked,
+ "on_window1_delete_event" : self.quit
+ }
+
+ self.window1.signal_autoconnect (dic)
+ self.v = vte.Terminal ()
+ self.window1.get_widget("vbox2").add(self.v)
+ self.v.show()
+ self.load_settings()
+ msg_info(_("It is necessary to close all other windows and unmount any network shares while running Bodhibuilder Backup. Please do so now and then click OK when you are ready to continue."), self.window1.get_widget("window1"))
+
+ def run_command(self, cmd, done_callback):
+ argv = shlex.split(cmd)
+ self.callback_id = self.v.connect ("child-exited", done_callback)
+ self.v.fork_command(argv[0], argv)
+ #self.v.feed_child('set -e\n')
+ self.window1.get_widget("notebook1").set_current_page(2)
+ self.v.show()
+ #self.v.feed_child(cmd+'\nexit 0\n')
+
+ #~ Backup Button
+ def on_button1_clicked(self,widget):
+ self.update_conf()
+ if not msg_confirm(_("You have selected Backup Mode. Do not interrupt this process. Click OK to Start the Backup LiveCD/DVD process."), self.window1.get_widget("window1")):
+ return
+ self.run_command('bodhibuilder backup', self.on_backup_done)
+
+ def on_backup_done(self, widget, data = None):
+ if self.v.get_child_exit_status() == 0:
+ WORKDIR = self.window1.get_widget("entry6").get_text()
+ CUSTOMISO = self.window1.get_widget("entry3").get_text()
+ msg_info(_("Your %(iso)s and %(iso)s.md5 files are ready in %(dir)s. It is recommended to test it in a virtual machine or on a rewritable cd/dvd to ensure it works as desired. Click on OK to return to the main menu.")
+ % ({"iso" : CUSTOMISO, "dir" : WORKDIR+'/bodhibuilder'}), self.window1.get_widget("window1"))
+ else:
+ msg_error(_("The process was interrupted!"), self.window1.get_widget("window1"))
+ self.window1.get_widget("notebook1").set_current_page(0)
+ self.v.handler_disconnect(self.callback_id)
+
+ #~ Dist Button
+ def on_button2_clicked(self,widget):
+ self.update_conf()
+ if not msg_confirm(_("You have selected Dist Mode. Click OK to Start the Distributable LiveCD/DVD process."), self.window1.get_widget("window1")):
+ return
+ self.run_command('bodhibuilder dist', self.on_dist_done)
+
+ def on_dist_done(self, widget, data = None):
+
+ if self.v.get_child_exit_status() == 0:
+ WORKDIR = self.window1.get_widget("entry6").get_text()
+ CUSTOMISO = self.window1.get_widget("entry3").get_text()
+ msg_info(_("Your %(iso)s and %(iso)s.md5 files are ready in %(dir)s. It is recommended to test it in a virtual machine or on a rewritable cd/dvd to ensure it works as desired. Click on OK to return to the main menu.") % ({"iso" : CUSTOMISO, "dir" : WORKDIR+'/bodhibuilder'}))
+ else:
+ msg_error(_("The process was interrupted!"), self.window1.get_widget("window1"))
+ self.window1.get_widget("notebook1").set_current_page(0)
+ self.v.handler_disconnect(self.callback_id)
+
+ #~ Distcdfs Button
+ def on_button3_clicked(self,widget):
+ self.update_conf()
+ if not msg_confirm(_("You have selected Dist CDFS Mode. Click OK to Start the Distributable LiveCD/DVD filesystem build process.")):
+ return
+ self.run_command('bodhibuilder dist cdfs', self.on_dist_cdfs_done)
+
+ def on_dist_cdfs_done(self, widget, data = None):
+ if self.v.get_child_exit_status() == 0:
+ WORKDIR = self.window1.get_widget("entry6").get_text()
+ CUSTOMISO = self.window1.get_widget("entry3").get_text()
+ msg_info(_("Your livecd filesystem is ready in %s. You can now add files to the cd and then run the Distiso option when you are done. Click on OK to return to the main menu.") % WORKDIR+'/bodhibuilder')
+ else:
+ msg_error(_("The process was interrupted!"), self.window1.get_widget("window1"))
+ self.window1.get_widget("notebook1").set_current_page(0)
+ self.v.handler_disconnect(self.callback_id)
+
+ #~ Distiso Button
+ def on_button4_clicked(self,widget):
+ self.update_conf()
+ WORKDIR = self.window1.get_widget("entry6").get_text()
+ if os.path.exists(WORKDIR+'/bodhibuilder/ISOTMP/casper/filesystem.squashfs'):
+ if not msg_confirm(_("You have selected Dist ISO Mode. Click OK to create the iso file.")):
+ self.window1.get_widget("window1").show()
+ return
+ self.run_command('bodhibuilder dist iso', self.on_dist_iso_done)
+ else:
+ msg_error(_("The livecd filesystem does not exist. Click OK to go back to the main menu and try the normal Dist mode or the Dist CDFS again."))
+
+ def on_dist_iso_done(self, widget, data = None):
+ if self.v.get_child_exit_status() == 0:
+ WORKDIR = self.window1.get_widget("entry6").get_text()
+ CUSTOMISO = self.window1.get_widget("entry3").get_text()
+ msg_info(_("Your %(iso)s and %(iso)s.md5 files are ready in %(dir)s. It is recommended to test it in a virtual machine or on a rewritable cd/dvd to ensure it works as desired. Click on OK to return to the main menu.") % ({"iso" : CUSTOMISO, "dir" : WORKDIR+'/bodhibuilder'}))
+ else:
+ msg_error(_("The process was interrupted!"), self.window1.get_widget("window1"))
+ self.window1.get_widget("notebook1").set_current_page(0)
+ self.v.handler_disconnect(self.callback_id)
+
+ #~ Clear Button
+ def on_button5_clicked(self,widget):
+ self.update_conf()
+ if not msg_confirm(_("This will remove all the files from the temporary directory. Click OK to proceed.")):
+ return
+ #os.system('bodhibuilder clean')
+ self.run_command('bodhibuilder clean', self.on_clean_done)
+ #msg_info(_("Completed. Click OK to return to the main menu."))
+
+ def on_clean_done(self, widget, data = None):
+ if self.v.get_child_exit_status() == 0:
+ msg_info(_("Completed. Click OK to return to the main menu."))
+ else:
+ msg_error(_("The process was interrupted!"), self.window1.get_widget("window1"))
+ self.window1.get_widget("notebook1").set_current_page(0)
+ self.v.handler_disconnect(self.callback_id)
+
+ #~ About button
+ def on_button6_clicked(self,widget):
+ # show about dialog
+ about = gtk.AboutDialog()
+ about.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
+ about.set_program_name(_("Bodhibuilder"))
+ about.set_version(APP_VERSION)
+ about.set_authors([_(" "),
+ _(" -- bodhibuilder --"),
+ _("Stace Fauske <stace.fauske@gmail.com>"),
+ _("Jeff Hoogland <JeffHoogland@Linux.com>"),
+ _("Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi"),
+ _(" "),
+ _(" -- remastersys --"),
+ _("Krasimir S. Stefanov <lokiisyourmaster@gmail.com>"),
+ _("Tony Brijeski <tb6517@yahoo.com>")
+ ])
+ about.set_website("http://forums.bodhilinux.com/")
+ translators = [
+ _("Bulgarian - Krasimir S. Stefanov <lokiisyourmaster@gmail.com>"),
+ _("English - Krasimir S. Stefanov <lokiisyourmaster@gmail.com>"),
+ _("Traditional Chinese - Kent Chang <kentxchang@gmail.com>")
+ ]
+
+ about.set_translator_credits('\n'.join(translators))
+ about.set_logo_icon_name('bodhibuilder-gtk')
+ license = _('''PyGTK GUI for Bodhibuilder
+Copyright (C) 2011 Krasimir S. Stefanov, Tony Brijeski
+Modified to Bodhibuilder by Stace Fauske - (C) 2015
+This is Free Software
+Originally Remastersys, modified to Bodhibuilder
+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.
+Licence: GPLv3.0
+http://www.gnu.org/licenses/.''')
+ about.set_license(license)
+ about.run()
+ about.hide()
+
+ #~ Working dir selection pop-up
+ def on_button8_clicked(self,widget):
+ dialog = gtk.FileChooserDialog(_("Select working directory"),
+ None,
+ gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+ gtk.STOCK_OPEN, gtk.RESPONSE_OK))
+
+ dialog.set_default_response(gtk.RESPONSE_OK)
+
+ response = dialog.run()
+ if response == gtk.RESPONSE_OK:
+ self.window1.get_widget("entry6").set_text(dialog.get_filename())
+ dialog.destroy()
+
+ #~ Select boot menu picture for Live CD
+ def on_button9_clicked(self,widget):
+ dialog = gtk.FileChooserDialog(title=_("Select 640x480 PNG image..."),action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
+ dialog.set_default_response(gtk.RESPONSE_OK)
+ dialog.set_current_folder(self.working_dir)
+
+ filter = gtk.FileFilter()
+ filter.set_name(_("PNG Images"))
+ filter.add_mime_type("image/png")
+ dialog.add_filter(filter)
+
+ filter = gtk.FileFilter()
+ filter.set_name(_("All files"))
+ filter.add_pattern("*")
+ dialog.add_filter(filter)
+ response = dialog.run()
+ if response == gtk.RESPONSE_OK:
+ now = datetime.datetime.now()
+ filename = dialog.get_filename()
+ dialog.destroy()
+ self.working_dir = os.path.dirname(filename)
+ shutil.move("/etc/bodhibuilder/isolinux/splash.png", "/etc/bodhibuilder/isolinux/splash.png." + now.strftime("%Y%m%d%H%M%S"))
+ shutil.copy(filename, "/etc/bodhibuilder/isolinux/splash.png")
+ msg_info(_("%s has been copied to /etc/bodhibuilder/isolinux/splash.png becoming the default background for the LIVE menu.") % filename)
+ else:
+ dialog.destroy()
+
+ #~ Select boot menu picture for installed environment
+ def on_button10_clicked(self,widget):
+ dialog = gtk.FileChooserDialog(title=_("Select image..."),action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
+ dialog.set_default_response(gtk.RESPONSE_OK)
+ dialog.set_current_folder(self.working_dir)
+ response = dialog.run()
+ if response == gtk.RESPONSE_OK:
+ now = datetime.datetime.now()
+ filename = dialog.get_filename()
+ self.working_dir = os.path.dirname(filename)
+ name, ext = os.path.splitext(filename)
+ grub_bg = "/etc/bodhibuilder/grub" + ext
+ shutil.copy(filename, grub_bg)
+ dialog.destroy()
+
+
+ grub = open('/etc/default/grub').read()
+
+ m = re.search('(#?)GRUB_BACKGROUND=.*', grub)
+ if m != None:
+ grub.replace(m.group(0), 'GRUB_BACKGROUND="%s"' % grub_bg)
+ else:
+ grub += '\nGRUB_BACKGROUND="%s"' % grub_bg
+
+ f = open('/etc/default/grub', 'w+')
+ f.write(grub)
+ f.close()
+
+ msg_info(_("%(filename)s has been copied to %(grub_bg)s and is the default background for grub. Click OK to update grub with the new settings so you can see your picture on the next boot.") % ({'filename':filename, 'grub_bg':grub_bg}))
+ self.window1.get_widget("label17").hide()
+ self.window1.get_widget("progressbar1").show()
+ process = subprocess.Popen(['update-grub'], stdout=subprocess.PIPE, stderr=None)
+ while process.poll() == None:
+ while gtk.events_pending():
+ gtk.main_iteration_do()
+ time.sleep(.1)
+ self.window1.get_widget("progressbar1").pulse()
+ process.wait()
+ self.window1.get_widget("progressbar1").hide()
+ self.window1.get_widget("label17").show()
+ msg_info(_("GRUB has been updated."))
+ else:
+ dialog.destroy()
+
+ #~ Select user whose settings to use
+ def on_button11_clicked(self,widget):
+ self.window1.get_widget("window1").hide()
+ def cancel(widget, other = None):
+ ns.window.get_widget("window2").destroy()
+ self.window1.get_widget("window1").show()
+
+ def ok(widget, other = None):
+ model, treeiter = ns.window.get_widget("treeview1").get_selection().get_selected()
+ username = model.get(treeiter, 0)[0]
+ ns.window.get_widget("progressbar1").show()
+ ns.window.get_widget("hbuttonbox1").set_sensitive(False)
+ process = subprocess.Popen(['bodhibuilder-skelcopy', username], stdout=subprocess.PIPE, stderr=None)
+ while process.poll() == None:
+ while gtk.events_pending():
+ gtk.main_iteration_do()
+ time.sleep(.1)
+ ns.window.get_widget("progressbar1").pulse()
+ process.wait()
+ ns.window.get_widget("progressbar1").hide()
+ ns.window.get_widget("hbuttonbox1").set_sensitive(True)
+ ns.window.get_widget("window2").destroy()
+ self.window1.get_widget("window1").show()
+
+
+ ns = Namespace()
+ ns.window = gtk.glade.XML(self.gladefile,"window2" ,APP)
+ gtk.glade.bindtextdomain(APP,DIR)
+ dic = {
+ "on_window2_delete_event" : (cancel)
+ , "on_button1_clicked" : (cancel)
+ , "on_button2_clicked" : (ok)
+ }
+ ns.window.signal_autoconnect (dic)
+
+
+ ns.liststore = gtk.ListStore(str, str)
+ ns.window.get_widget("treeview1").set_model(ns.liststore)
+ ns.tvcolumn1 = gtk.TreeViewColumn(_('User'))
+ ns.tvcolumn2 = gtk.TreeViewColumn(_('Home directory'))
+
+ ns.cell1 = gtk.CellRendererText()
+ ns.cell2 = gtk.CellRendererText()
+
+ ns.tvcolumn1.pack_start(ns.cell1, True)
+ ns.tvcolumn2.pack_start(ns.cell2, True)
+ ns.tvcolumn1.set_attributes(ns.cell1, text=0)
+ ns.tvcolumn2.set_attributes(ns.cell2, text=1)
+
+ ns.window.get_widget("treeview1").append_column(ns.tvcolumn1)
+ ns.window.get_widget("treeview1").append_column(ns.tvcolumn2)
+
+
+ passwd = open('/etc/passwd', 'r').read().strip().split('\n')
+ for row in passwd:
+ data = row.split(':')
+ if int(data[2]) >= 1000 and int(data[2]) <= 1100:
+ ns.liststore.append([data[0], data[5]])
+ ns.window.get_widget("window2").show()
+
+ #~ Select Plymouth Theme
+ def on_button12_clicked(self,widget):
+ self.window1.get_widget("window1").hide()
+
+ def auto(widget, other = None):
+ active = ns.window.get_widget("checkbutton1").get_active()
+ ns.window.get_widget("treeview1").set_sensitive(not active)
+
+ def update_initramfs():
+ ns.window.get_widget("progressbar1").show()
+ ns.window.get_widget("hbuttonbox1").set_sensitive(False)
+ uname = os.popen('uname -r').read().strip()
+ process = subprocess.Popen(['mkinitramfs', '-o', '/boot/initrd.img-'+uname, uname], stdout=subprocess.PIPE, stderr=None)
+ while process.poll() == None:
+ while gtk.events_pending():
+ gtk.main_iteration_do()
+ time.sleep(.1)
+ ns.window.get_widget("progressbar1").pulse()
+ process.wait()
+ ns.window.get_widget("progressbar1").hide()
+ ns.window.get_widget("hbuttonbox1").set_sensitive(True)
+
+ def cancel(widget, other = None):
+ ns.window.get_widget("window3").destroy()
+ self.window1.get_widget("window1").show()
+
+ def ok(widget, other = None):
+ if ns.window.get_widget("checkbutton1").get_active():
+ os.system("update-alternatives --auto default.plymouth")
+ update_initramfs()
+ msg_info(_("Done! Now plymouth will use the default, auto-selected theme."))
+ else:
+ model, treeiter = ns.window.get_widget("treeview1").get_selection().get_selected()
+ if treeiter == None:
+ msg_error(_("Please, select a theme!"))
+ return
+ theme = model.get(treeiter, 1)[0]
+ os.system('update-alternatives --set default.plymouth "%s"' % theme)
+ update_initramfs()
+ ns.window.get_widget("window3").destroy()
+ self.window1.get_widget("window1").show()
+
+ def create(widget, other = None):
+ theme_name = msg_input('', _('Enter your plymouth theme name. eg. Bodhibuilder Theme (please use only alphanumeric characters)'), _('Name:'), 'Bodhibuilder Theme')
+ if theme_name == False or theme_name == None:
+ return
+ elif theme_name == '':
+ msg_error(_("You must specify theme name!"))
+ return
+
+ theme_name_fixed = theme_name.replace(' ','-').replace('/','-').replace('..','-').replace('\\','-')
+ theme_dir = "/lib/plymouth/themes/" + theme_name_fixed
+
+ if os.path.exists(theme_dir):
+ overwrite = msg_confirm(_('The theme "%s" already exists! Do you want to overwrite it?') % theme_name)
+ if overwrite:
+ shutil.rmtree(theme_dir)
+ else:
+ return
+
+ dialog = gtk.FileChooserDialog(title=_("Select 1920x1080 PNG image..."),action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
+ dialog.set_default_response(gtk.RESPONSE_OK)
+ dialog.set_current_folder(self.working_dir)
+
+ filter = gtk.FileFilter()
+ filter.set_name(_("PNG Images"))
+ filter.add_mime_type("image/png")
+ dialog.add_filter(filter)
+
+ filter = gtk.FileFilter()
+ filter.set_name(_("All files"))
+ filter.add_pattern("*")
+ dialog.add_filter(filter)
+
+ response = dialog.run()
+ if response == gtk.RESPONSE_OK:
+ filename = dialog.get_filename()
+ self.working_dir = os.path.dirname(filename)
+ dialog.destroy()
+ while gtk.events_pending():
+ gtk.main_iteration_do()
+ os.makedirs(theme_dir)
+ now = datetime.datetime.now()
+ theme_pic = os.path.join(theme_dir, os.path.basename(filename))
+ shutil.copy(filename, theme_pic)
+ shutil.copy('/etc/bodhibuilder/plymouth/bodhibuilder-theme/progress_bar.png', theme_dir+'/progress_bar.png')
+ shutil.copy('/etc/bodhibuilder/plymouth/bodhibuilder-theme/progress_box.png', theme_dir+'/progress_box.png')
+ script_name = "/lib/plymouth/themes/"+theme_name_fixed+"/"+theme_name_fixed+".script"
+ script = open("/etc/bodhibuilder/plymouth/bodhibuilder-theme/bodhibuilder-theme.script").read().replace("__THEMEPIC__", os.path.basename(theme_pic))
+ open(script_name, 'w+').write(script)
+
+ config_name = "/lib/plymouth/themes/"+theme_name_fixed+"/"+theme_name_fixed+".plymouth"
+ config = open("/etc/bodhibuilder/plymouth/bodhibuilder-theme/bodhibuilder-theme.plymouth").read()
+ config = config.replace("__THEMENAME__", theme_name)
+ config = config.replace("__THEMEDIR__", theme_name_fixed)
+ open(config_name, 'w+').write(config)
+
+
+ os.system('update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth "%(config_name)s" 80' % ({'config_name': config_name}))
+ os.system('update-alternatives --set default.plymouth "%(config_name)s"' % ({'config_name': config_name}))
+
+ ns.window.get_widget("checkbutton1").set_active(False)
+
+ update_initramfs()
+
+ msg_info(_("Your plymouth theme named %(theme_name)s with the picture %(theme_pic)s has been created.") % ({'theme_name': theme_name, 'theme_pic': theme_pic}))
+ else:
+ dialog.destroy()
+ shutil.rmtree(theme_dir)
+ list_themes()
+
+ def preview(widget, other = None):
+ if not os.path.isfile('/lib/plymouth/renderers/x11.so'):
+ msg_error(_("In order to be able to preview plymouth themes, you have to install plymouth-x11!"))
+ return
+
+ output = os.popen('update-alternatives --display default.plymouth').read().strip()
+ m = re.search('default.plymouth - (manual|auto) mode', output)
+ if m == None:
+ ns.window.get_widget("window3").show()
+ return
+ mode = m.group(1)
+
+ if mode == 'auto':
+ ns.window.get_widget("window3").hide()
+ while gtk.events_pending():
+ gtk.main_iteration_do()
+ os.system("plymouth-preview")
+ ns.window.get_widget("window3").show()
+ else:
+ model, treeiter = ns.window.get_widget("treeview1").get_selection().get_selected()
+ if treeiter == None:
+ msg_error(_("Please, select a theme!"))
+ return
+ theme = model.get(treeiter, 1)[0]
+ ns.window.get_widget("window3").hide()
+ while gtk.events_pending():
+ gtk.main_iteration_do()
+
+
+ output = os.popen('update-alternatives --display default.plymouth').read().strip()
+ m = re.search('default.plymouth - (manual|auto) mode', output)
+ if m == None:
+ ns.window.get_widget("window3").show()
+ return
+ mode = m.group(1)
+
+ m = re.search('link\s*currently\s*points\s*to\s*(.*)', output)
+ if m == None:
+ ns.window.get_widget("window3").show()
+ return
+ link = m.group(1)
+
+ os.system('update-alternatives --set default.plymouth "%s"' % theme)
+ os.system("plymouth-preview")
+ ns.window.get_widget("window3").show()
+
+ if mode == 'auto':
+ os.system('update-alternatives --auto default.plymouth')
+ else:
+ os.system('update-alternatives --set default.plymouth "%s"' % link)
+
+ def list_themes():
+ ns.liststore.clear()
+ output = os.popen('update-alternatives --display default.plymouth').read().strip()
+ m = re.search('default.plymouth - (manual|auto) mode', output)
+ if m == None:
+ ns.window.get_widget("window3").show()
+ return
+ mode = m.group(1)
+ m = re.search('link\s*currently\s*points\s*to\s*(.*)', output)
+ if m == None:
+ ns.window.get_widget("window3").show()
+ return
+ link = m.group(1)
+ lines = os.popen('update-alternatives --list default.plymouth').read().strip().split('\n')
+ for row in lines:
+ if row != "":
+ config = ConfigParser.ConfigParser()
+ config.readfp(open(row))
+ name = config.get('Plymouth Theme', 'Name')
+ iter = ns.liststore.append([name, row])
+ if mode == 'manual' and row == link:
+ ns.window.get_widget("treeview1").get_selection().select_iter(iter)
+ ns.window.get_widget("checkbutton1").set_active(mode == 'auto')
+
+ ns = Namespace()
+ ns.window = gtk.glade.XML(self.gladefile,"window3" ,APP)
+ gtk.glade.bindtextdomain(APP,DIR)
+ dic = {
+ "on_window3_delete_event" : (cancel)
+ , "on_button1_clicked" : (cancel)
+ , "on_button2_clicked" : (ok)
+ , "on_button3_clicked" : (create)
+ , "on_button4_clicked" : (preview)
+ , "on_checkbutton1_toggled" : (auto)
+ }
+ ns.window.signal_autoconnect (dic)
+
+
+ ns.liststore = gtk.ListStore(str, str)
+ ns.window.get_widget("treeview1").set_model(ns.liststore)
+ ns.tvcolumn1 = gtk.TreeViewColumn(_('Name'))
+ ns.tvcolumn2 = gtk.TreeViewColumn(_('Directory'))
+
+ ns.cell1 = gtk.CellRendererText()
+ ns.cell2 = gtk.CellRendererText()
+
+ ns.tvcolumn1.pack_start(ns.cell1, True)
+ ns.tvcolumn2.pack_start(ns.cell2, True)
+ ns.tvcolumn1.set_attributes(ns.cell1, text=0)
+ ns.tvcolumn2.set_attributes(ns.cell2, text=1)
+
+ ns.window.get_widget("treeview1").append_column(ns.tvcolumn1)
+ ns.window.get_widget("treeview1").append_column(ns.tvcolumn2)
+ list_themes()
+ ns.window.get_widget("window3").show()
+
+ #~ Clear /etc/skel button
+ def on_button13_clicked(self,widget):
+ if msg_confirm(_("Are you sure you want to delete the contents of /etc/skel?")):
+ shutil.rmtree('/etc/skel/')
+ os.makedirs('/etc/skel/')
+
+ def quit(self, widget, data = None):
+ self.update_conf()
+ gtk.main_quit()
+ exit(0)
+
+ def load_settings(self):
+ config_f = open("/etc/bodhibuilder.conf")
+ config_txt = config_f.read()
+ config_f.close()
+
+ self.window1.get_widget("entry1").set_text(
+ self.getvalue('LIVEUSER', config_txt, 'custom'))
+
+ self.window1.get_widget("entry2").set_text(
+ self.getvalue('LIVECDLABEL', config_txt, 'Custom Live CD'))
+
+ self.window1.get_widget("entry3").set_text(
+ self.getvalue('CUSTOMISO', config_txt, 'custom-$1.iso'))
+
+ self.window1.get_widget("entry4").set_text(
+ self.getvalue('EXCLUDES', config_txt, ''))
+
+ self.window1.get_widget("entry5").set_text(
+ self.getvalue('LIVECDURL', config_txt, 'http://www.bodhilinux.com'))
+
+ self.window1.get_widget("entry7").set_text(
+ self.getvalue('SQUASHFSOPTS', config_txt, '-no-recovery -always-use-fragments -b 1M -no-duplicates'))
+
+ self.window1.get_widget("checkbutton1").set_active(
+ self.getvalue('BACKUPSHOWINSTALL', config_txt, '1') == '1')
+
+ workdir = self.getvalue('WORKDIR', config_txt, '/home/bodhibuilder')
+ if not os.path.exists(workdir):
+ os.makedirs(workdir)
+ self.window1.get_widget("entry6").set_text(workdir)
+
+ self.window1.get_widget("checkbutton1").set_active(
+ self.getvalue('BACKUPSHOWINSTALL', config_txt, '1').upper() == '1')
+
+ self.window1.get_widget("entry8").set_text(
+ self.getvalue('DISTICONS', config_txt, ''))
+
+ self.window1.get_widget("entry9").set_text(
+ self.getvalue('DISTLOCALE', config_txt, ''))
+
+ self.window1.get_widget("entry10").set_text(
+ self.getvalue('DISTNAME', config_txt, 'Bodhi Linux'))
+
+ def update_conf(self):
+ if self.window1.get_widget("checkbutton1").get_active():
+ BACKUPSHOWINSTALL = '1'
+ else:
+ BACKUPSHOWINSTALL = '0'
+
+ conf_content = '''
+#Bodhibuilder Global Configuration File
+
+
+# This is the temporary working directory and won't be included on the cd/dvd
+WORKDIR="%(WORKDIR)s"
+
+
+# Here you can add any other files or directories to be excluded from the live filesystem
+# Use absolute paths
+# Exclude specific files using the path to the file = /path/to/file
+# Exclude specific directories using a trailing slash = /path/to/directory/
+# Exclude all directory contents with an asterisk = /path/to/directory/*
+# Exclude all matching sets of files or directories using an asterisk as a wildcard = /path/to/something*
+# If the entry does not exist as an actual file or directory, rsync & mksquashfs will simply skip over it
+# Separate each entry with a space
+EXCLUDES="%(EXCLUDES)s"
+
+
+# Here you can change the livecd/dvd username
+LIVEUSER="%(LIVEUSER)s"
+
+
+# Here you can change the name of the livecd/dvd label
+LIVECDLABEL="%(LIVECDLABEL)s"
+
+
+# Here you can change the name of the ISO file that is created
+CUSTOMISO="%(CUSTOMISO)s"
+
+
+# Here you can change the mksquashfs options
+# OK to leave this empty, the defaults will use the best compression I know of (as of this writing)
+SQUASHFSOPTS="%(SQUASHFSOPTS)s"
+
+
+# Here you can prevent the Install icon from showing up on the desktop in backup mode. 0 - to not show 1 - to show
+BACKUPSHOWINSTALL="%(BACKUPSHOWINSTALL)s"
+
+
+# Here you can change the url for the usb-creator info
+LIVECDURL="%(LIVECDURL)s"
+
+
+# Here you can specify icons or icon sets to include in a "dist" remaster only.
+# List here the icons or sets you want to keep that are in this path:
+# /usr/share/icons/(icon or icon set name)
+# Do not list the whole path, just the set or icon name.
+# If it's not a "dist" remaster, all icon sets will be included unless you specifically
+# exclude their directories in the main EXCLUDES section above.
+DISTICONS="%(DISTICONS)s"
+# Example:
+##~ DISTICONS="AwOken-Bodhi hicolor myfavoriteicon1.png myfavoriteicon2.png"
+
+
+# Here you can specify locales to include in a "dist" remaster only
+# List here the locales you want to keep that are in this path:
+# /usr/share/locale/(locale name)
+# Do not list the whole path, just the directories of the locales you wish to include.
+# If it's not a "dist" remaster, all locales will be included unless you specifically
+# exclude their directories in the main EXCLUDES section above.
+DISTLOCALE="%(DISTLOCALE)s"
+# Example:
+##~ DISTLOCALE="en en_AU en_CA en_GB de"
+
+
+# Choose the distribution name you want to show up in GRUB
+DISTNAME="%(DISTNAME)s"
+
+''' % ({
+ "WORKDIR" : self.window1.get_widget("entry6").get_text(),
+ "EXCLUDES" : self.window1.get_widget("entry4").get_text(),
+ "LIVEUSER" : self.window1.get_widget("entry1").get_text(),
+ "LIVECDLABEL" : self.window1.get_widget("entry2").get_text(),
+ "CUSTOMISO" : self.window1.get_widget("entry3").get_text(),
+ "SQUASHFSOPTS" : self.window1.get_widget("entry7").get_text(),
+ "BACKUPSHOWINSTALL" : BACKUPSHOWINSTALL,
+ "LIVECDURL" : self.window1.get_widget("entry5").get_text(),
+ "DISTICONS" : self.window1.get_widget("entry8").get_text(),
+ "DISTLOCALE" : self.window1.get_widget("entry9").get_text(),
+ "DISTNAME" : self.window1.get_widget("entry10").get_text()
+ })
+
+ conf = open('/etc/bodhibuilder.conf', 'w+')
+ conf.write(conf_content)
+ conf.close()
+
+ def getvalue(self, name, conf, default):
+ try:
+ m = re.search(name+'="(.*)"',conf)
+ return m.group(1)
+ except:
+ return default
+
+
+def msg_error(msg, window = None):
+ dialog = gtk.MessageDialog(
+ window,
+ gtk.DIALOG_MODAL,
+ gtk.MESSAGE_ERROR,
+ gtk.BUTTONS_OK, msg
+ )
+ dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
+ dialog.run()
+ dialog.destroy()
+
+def msg_info(msg, window = None):
+ dialog = gtk.MessageDialog(
+ window,
+ gtk.DIALOG_MODAL,
+ gtk.MESSAGE_INFO,
+ gtk.BUTTONS_OK,
+ msg
+ )
+ dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
+ dialog.run()
+ dialog.destroy()
+
+def msg_confirm(msg, window = None):
+ dialog = gtk.MessageDialog(
+ window
+ , gtk.DIALOG_DESTROY_WITH_PARENT
+ , gtk.MESSAGE_QUESTION
+ , gtk.BUTTONS_OK_CANCEL
+ , msg
+ )
+ dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
+ response = dialog.run()
+ dialog.destroy()
+
+ if response == gtk.RESPONSE_OK:
+ return True
+ else:
+ return False
+
+def msg_input(title, message, label, default = '', window = None, password = False):
+ def responseToDialog( entry, dialog, response):
+ dialog.response(response)
+
+ dialog = gtk.MessageDialog(
+ window,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+ gtk.MESSAGE_QUESTION,
+ gtk.BUTTONS_OK_CANCEL,
+ None
+ )
+ dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
+ dialog.set_markup(message)
+ dialog.set_title(title)
+
+ entry = gtk.Entry()
+ entry.set_text(default)
+ entry.set_visibility(not password)
+ entry.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)
+ hbox = gtk.HBox()
+ hbox.pack_start(gtk.Label(label), False, 5, 5)
+ hbox.pack_end(entry)
+ dialog.vbox.pack_end(hbox, True, True, 0)
+ dialog.show_all()
+ response = dialog.run()
+ text = entry.get_text()
+ dialog.destroy()
+
+ if response == gtk.RESPONSE_OK:
+ return text
+ else:
+ return None
+
+class Namespace: pass
+
+if os.popen('whoami').read().strip() != 'root':
+ os.chdir(os.path.dirname(os.path.realpath(__file__)))
+ if os.system('which gksu')==0:
+ if os.path.exists('/usr/share/applications/bodhibuilder-gtk.desktop'):
+ os.system('gksu -D "%s" ./bodhibuilder-gtk.py' % _('Bodhibuilder'))
+ else:
+ os.system('gksu -D "%s" ./bodhibuilder-gtk.py' % '/usr/share/applications/bodhibuilder-gtk.desktop')
+ elif os.system('which kdesudo')==0:
+ os.system('kdesudo ./bodhibuilder-gtk.py' )
+ elif os.system('which sudo')==0:
+ password = msg_input(_(''), _('Enter your password to perform administrative tasks'), 'Password:', '', None, True)
+ if password:
+ os.popen('sudo -S ./bodhibuilder-gtk.py','w').write(password)
+else:
+ if __name__ == '__main__':
+ app = appgui()
+ gtk.main()
+
--- /dev/null
+ Bodhibuilder
+
+- a script modified from Remastersys, which will now create a livecd/dvd
+from a working Bodhi Linux install version 3.0.0 and up.
+
+For more information, please visit http://forums.bodhilinux.com/ and
+feel free to ask questions, someone may be able to help you.
+
+Stace Fauske <stace.fauske@gmail.com> <-sef>
+Jeff Hoogland <JeffHoogland@Linux.com>
+Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+
+
+COMMENTS FROM REMASTERSYS' ORIGINAL AUTHOR:
+(I cannot guarantee the authenticity of these comments toward bodhibuilder scripts -sef)
+
+Limitations of remastering
+==========================
+
+Due to some common questions I keep getting asked repeatedly I have put the answers here.
+
+There are some limitations for remastering right now and they have absolutely nothing to do with Remastersys itlself.
+
+1 - Nvidia and ATI proprietary drivers are disabled at the kernel level by ubuntu's casper scripts - no workaround
+
+2 - limit of 4Gig for any single file on the iso file which is a limitation of the iso9660 spec which means the
+compressed filesystem must be 4G or less - no workaround
+
+3 - no official text mode installer for the livecd so all remasters that you want to be able to install must have a gui
+- no workaround
+
+4 - Install options limited to what Ubuntu's installer, Ubiquity can do - no workaround
+
+5 - In order for the Ubuntu casper scripts to create and boot into the livecd user, either gdm or kdm must be used
+as the login manager - no workaround
+
+6 - the livecd is limited to 1 iso file as casper only look for a single filesystem.squashfs file - no workaround
+
+7 - compression level of the filesystem.squashfs doesn't have lzma as the Ubuntu kernel and mksquashfs would need
+to be patched - unsupported/no workaround.
+
+8 - livecd only works properly with linux-generic livecd kernel - if you make your own kernel you are on your own
+- unsupported so please don't ask for help with this
+
+9 - if it isn't in the normal Ubuntu repositories or requires a patch of an app that changes it from stock ubuntu apps
+it is completely unsupported so please don't ask me for help with these
+
+10 - there are certain apps and libraries that Ubuntu doesn't have on their livecd's and for whatever reason they
+cause the livecd to fail if they are installed - no workaround
+
+11 - if your customizations are not showing up on the livecd then it means you have not made the changes in the
+correct place. You must figure out what files need to be changed or where the global configuration of the settings
+are that you are trying to change. I only use KDE so I couldn't answer any gnome related questions anyway.
+- you are on your own.
+
+I have no intentions of maintaining a fork of casper or ubiquity or any other app so please don't ask me to change
+any of the above. I make remastersys which helps you remaster a base Ubuntu desktop live system and thats it.
+
+These are not limitations of remastersys but rather the underlying tools that are used to remaster the
+livecd/run the livecd/install the livecd.
+
+These may change in the future if Ubuntu changes them but for now they are the limitations and there are no workarounds.
+
+Remastersys simply builds the livecd from the system you are running. If you have it setup correctly and
+nothing conflicts with Ubuntu's casper or ubiquity then it should build, run and install just fine.
+
+
+Information About Dist Mode
+===========================
+
+The dist mode of remastersys is unsupported for the most part.
+
+I have tested remastersys on stock installs of Ubuntu, Kubuntu and usually Xubuntu as well.
+
+Normal i386 and amd64 versions so I know remastersys works on stock installs.
+
+Most problems in dist mode are created by yourself due to customization or package choice.
+
+These issues have nothing to do with remastersys.
+They conflict with Ubuntu's casper livecd boot tool and Ubuntu's ubiquity installer and those aren't
+going to be changed to suit your needs. If you want to make changes to them, you will need to fork
+those projects off on your own.
+
+
+
+
+Regards,
+Tony Brijeski aka Fragadelic
--- /dev/null
+This software was modified from the original remastersys script to
+bodhibuilder.
+
+It is for use on Bodhi Linux distributions version 3.0.0 and up.
+
+(C) 2015 Modified by:
+Stace Fauske <stace.fauske@gmail.com> <-sef>
+Jeff Hoogland <JeffHoogland@Linux.com>
+Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+
+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 <http://www.gnu.org/licenses/>.
+
+
+ORIGINAL COMMENTS:
+
+This package was debianized by Tony Brijeski <tb6517@yahoo.com> on
+Sat, 03 Jan 2009 02:33:53 -0500.
+
+It was downloaded from <http://www.remastersys.com>
+
+Upstream Author(s):
+
+ Tony Brijeski <tb6517@yahoo.com>
+
+Copyright:
+
+ Copyright (C) 2007,2008,2009,2010,2011 Tony Brijeski
+
+License:
+
+ This package 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 2 of the License, or
+ (at your option) any later version.
+
+ This package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2009, Tony Brijeski <tb6517@yahoo.com> and
+is licensed under the GPL, see above.
+
+
--- /dev/null
+ Bodhibuilder
+
+- a script modified from Remastersys, which will now create a livecd/dvd
+from a working Bodhi Linux install version 3.0.0 and up.
+
+For more information, please visit http://forums.bodhilinux.com/ and
+feel free to ask questions, someone may be able to help you.
+
+Stace Fauske <stace.fauske@gmail.com> <-sef>
+Jeff Hoogland <JeffHoogland@Linux.com>
+Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+
+
+COMMENTS FROM REMASTERSYS' ORIGINAL AUTHOR:
+(I cannot guarantee the authenticity of these comments toward bodhibuilder scripts -sef)
+
+Limitations of remastering
+==========================
+
+Due to some common questions I keep getting asked repeatedly I have put the answers here.
+
+There are some limitations for remastering right now and they have absolutely nothing to do with Remastersys itlself.
+
+1 - Nvidia and ATI proprietary drivers are disabled at the kernel level by ubuntu's casper scripts - no workaround
+
+2 - limit of 4Gig for any single file on the iso file which is a limitation of the iso9660 spec which means the
+compressed filesystem must be 4G or less - no workaround
+
+3 - no official text mode installer for the livecd so all remasters that you want to be able to install must have a gui
+- no workaround
+
+4 - Install options limited to what Ubuntu's installer, Ubiquity can do - no workaround
+
+5 - In order for the Ubuntu casper scripts to create and boot into the livecd user, either gdm or kdm must be used
+as the login manager - no workaround
+
+6 - the livecd is limited to 1 iso file as casper only look for a single filesystem.squashfs file - no workaround
+
+7 - compression level of the filesystem.squashfs doesn't have lzma as the Ubuntu kernel and mksquashfs would need
+to be patched - unsupported/no workaround.
+
+8 - livecd only works properly with linux-generic livecd kernel - if you make your own kernel you are on your own
+- unsupported so please don't ask for help with this
+
+9 - if it isn't in the normal Ubuntu repositories or requires a patch of an app that changes it from stock ubuntu apps
+it is completely unsupported so please don't ask me for help with these
+
+10 - there are certain apps and libraries that Ubuntu doesn't have on their livecd's and for whatever reason they
+cause the livecd to fail if they are installed - no workaround
+
+11 - if your customizations are not showing up on the livecd then it means you have not made the changes in the
+correct place. You must figure out what files need to be changed or where the global configuration of the settings
+are that you are trying to change. I only use KDE so I couldn't answer any gnome related questions anyway.
+- you are on your own.
+
+I have no intentions of maintaining a fork of casper or ubiquity or any other app so please don't ask me to change
+any of the above. I make remastersys which helps you remaster a base Ubuntu desktop live system and thats it.
+
+These are not limitations of remastersys but rather the underlying tools that are used to remaster the
+livecd/run the livecd/install the livecd.
+
+These may change in the future if Ubuntu changes them but for now they are the limitations and there are no workarounds.
+
+Remastersys simply builds the livecd from the system you are running. If you have it setup correctly and
+nothing conflicts with Ubuntu's casper or ubiquity then it should build, run and install just fine.
+
+
+Information About Dist Mode
+===========================
+
+The dist mode of remastersys is unsupported for the most part.
+
+I have tested remastersys on stock installs of Ubuntu, Kubuntu and usually Xubuntu as well.
+
+Normal i386 and amd64 versions so I know remastersys works on stock installs.
+
+Most problems in dist mode are created by yourself due to customization or package choice.
+
+These issues have nothing to do with remastersys.
+They conflict with Ubuntu's casper livecd boot tool and Ubuntu's ubiquity installer and those aren't
+going to be changed to suit your needs. If you want to make changes to them, you will need to fork
+those projects off on your own.
+
+
+
+
+Regards,
+Tony Brijeski aka Fragadelic
--- /dev/null
+This software was modified from the original remastersys script to
+bodhibuilder.
+
+It is for use on Bodhi Linux distributions version 3.0.0 and up.
+
+(C) 2015 Modified by:
+Stace Fauske <stace.fauske@gmail.com> <-sef>
+Jeff Hoogland <JeffHoogland@Linux.com>
+Charles van de Beek <charles.beek@gmail.com> Charles@Bodhi
+
+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 <http://www.gnu.org/licenses/>.
+
+
+ORIGINAL COMMENTS:
+
+This package was debianized by Tony Brijeski <tb6517@yahoo.com> on
+Sat, 03 Jan 2009 02:33:53 -0500.
+
+It was downloaded from <http://www.remastersys.com>
+
+Upstream Author(s):
+
+ Tony Brijeski <tb6517@yahoo.com>
+
+Copyright:
+
+ Copyright (C) 2007,2008,2009,2010,2011 Tony Brijeski
+
+License:
+
+ This package 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 2 of the License, or
+ (at your option) any later version.
+
+ This package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2009, Tony Brijeski <tb6517@yahoo.com> and
+is licensed under the GPL, see above.
+
+
--- /dev/null
+#!/bin/bash
+#
+
+# used to update the version number throughout the necessary files in bodhibuilder
+# usr/share/bodhibuilder-gtk/bodhibuilder-gtk.py:APP_VERSION = "2.1.0"
+# etc/bodhibuilder/bodhibuilder.version:BODHIBUILDERVERSION="2.1.0"
+# DEBIAN/control:Version: 2.1.0
+#
+
+currversion=`cat ./etc/bodhibuilder/bodhibuilder.version | cut -d\" -f2`
+
+if [ ! "${1}" ] ; then # just echo out the version number
+ echo ""
+ echo " Current bodhibuilder version is : ${currversion}"
+ echo ""
+ echo " Example to change version :"
+ echo " sudo ./version-update.sh 2.2.nn"
+ echo ""
+else # change version number throughout files
+ echo ""
+ echo "usr/share/bodhibuilder-gtk/bodhibuilder-gtk.py"
+ grep 'APP_VERSION = \".*\"$' ./usr/share/bodhibuilder-gtk/bodhibuilder-gtk.py
+ echo " changed to"
+ sed -i "s/APP_VERSION = \".*\"$/APP_VERSION = \"${1}\"/" ./usr/share/bodhibuilder-gtk/bodhibuilder-gtk.py
+ grep 'APP_VERSION = \".*\"$' ./usr/share/bodhibuilder-gtk/bodhibuilder-gtk.py
+
+ echo ""
+ echo "etc/bodhibuilder/bodhibuilder.version"
+ grep 'BODHIBUILDERVERSION=\".*\"$' ./etc/bodhibuilder/bodhibuilder.version
+ echo " changed to"
+ sed -i "s/BODHIBUILDERVERSION=\".*\"$/BODHIBUILDERVERSION=\"${1}\"/" ./etc/bodhibuilder/bodhibuilder.version
+ grep 'BODHIBUILDERVERSION=\".*\"$' ./etc/bodhibuilder/bodhibuilder.version
+
+ echo ""
+ echo "DEBIAN/control"
+ grep 'Version:.*$' ./DEBIAN/control
+ echo " changed to"
+ sed -i "s/Version:.*$/Version: ${1}/" ./DEBIAN/control
+ grep 'Version:.*$' ./DEBIAN/control
+
+ currversion=`cat ./etc/bodhibuilder/bodhibuilder.version | cut -d\" -f2`
+ echo ""
+ echo " NEW bodhibuilder version is : ${currversion}"
+fi
+
+exit 0