From 57d0c64427ee25451db3eec2873b5ed4fa703319 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:45:45 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- LICENSE | 339 ++++++++++++++++++++++++++++++++ Makefile | 53 +++++ README.md | 36 ++++ TODO | 6 + VERSION | 1 + demo/configurations.yaml | 235 ++++++++++++++++++++++ demo/custom/part/custom | 2 + demo/custom/part/n900 | 8 + demo/custom/part/n900-devel | 8 + demo/custom/scripts/buildname.nochroot | 3 + demo/custom/scripts/cleanup.post | 6 + demo/custom/scripts/flash.post | 5 + demo/custom/scripts/fstab-n900.post | 5 + demo/custom/scripts/inittab-n900.post | 3 + demo/custom/scripts/kboot.post | 3 + demo/custom/scripts/kernel-handset.post | 17 ++ demo/custom/scripts/prelink.post | 4 + demo/custom/scripts/rpm.post | 7 + demo/custom/scripts/serial-mfld.post | 4 + demo/custom/scripts/serial.post | 2 + demo/custom/scripts/u-boot.post | 4 + demo/netbook/meego-netbook.yaml | 17 ++ demo/repos.yaml | 17 ++ kickstart/Makefile | 20 ++ kickstart/kickstart.tmpl | 116 +++++++++++ kswriter/KSWriter.py | 172 ++++++++++++++++ kswriter/__init__.py | 1 + packaging/kickstarter.manifest | 5 + packaging/kickstarter.spec | 50 +++++ setup.py | 40 ++++ tools/fetch-configs.py | 29 +++ tools/kickstarter | 106 ++++++++++ 32 files changed, 1324 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 TODO create mode 100644 VERSION create mode 100644 demo/configurations.yaml create mode 100644 demo/custom/part/custom create mode 100644 demo/custom/part/n900 create mode 100644 demo/custom/part/n900-devel create mode 100644 demo/custom/scripts/buildname.nochroot create mode 100644 demo/custom/scripts/cleanup.post create mode 100644 demo/custom/scripts/flash.post create mode 100644 demo/custom/scripts/fstab-n900.post create mode 100644 demo/custom/scripts/inittab-n900.post create mode 100644 demo/custom/scripts/kboot.post create mode 100644 demo/custom/scripts/kernel-handset.post create mode 100644 demo/custom/scripts/prelink.post create mode 100644 demo/custom/scripts/rpm.post create mode 100644 demo/custom/scripts/serial-mfld.post create mode 100644 demo/custom/scripts/serial.post create mode 100644 demo/custom/scripts/u-boot.post create mode 100644 demo/netbook/meego-netbook.yaml create mode 100644 demo/repos.yaml create mode 100644 kickstart/Makefile create mode 100644 kickstart/kickstart.tmpl create mode 100644 kswriter/KSWriter.py create mode 100644 kswriter/__init__.py create mode 100644 packaging/kickstarter.manifest create mode 100644 packaging/kickstarter.spec create mode 100644 setup.py create mode 100755 tools/fetch-configs.py create mode 100755 tools/kickstarter diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a4da77f --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +VERSION = $(shell cat VERSION) +NAME=kickstarter +TAGVER = $(shell cat VERSION | sed -e "s/\([0-9\.]*\).*/\1/") + +ifeq ($(VERSION), $(TAGVER)) + TAG = $(TAGVER) +else + TAG = "HEAD" +endif + + +PYTHON=python +CHEETAH=cheetah +TEMPLATES=$(wildcard *.tmpl) +TEMPLATE_MODS=$(patsubst %.tmpl,%.py,$(TEMPLATES)) +.SECONDARY: $(TEMPLATE_MODS) +KS=$(wildcard *.ks) + +all: tmpls + python setup.py build + +tmpls: + cd kickstart; make + +install: tmpls + python setup.py build + python setup.py install + +%.py: %.tmpl + $(CHEETAH) compile --settings='useStackFrames=False' $< + +ks: $(TEMPLATES) configurations.yaml repos.yaml + kickstarter -c configurations.yaml -r repos.yaml + +tag: + git tag $(VERSION) + +dist-bz2: + git archive --format=tar --prefix=$(NAME)-$(TAGVER)/ $(TAG) | \ + bzip2 > $(NAME)-$(TAGVER).tar.bz2 + +dist-gz: + git archive --format=tar --prefix=$(NAME)-$(TAGVER)/ $(TAG) | \ + gzip > $(NAME)-$(TAGVER).tar.gz + +dist: dist-bz2 + +clean: + rm -f $(TEMPLATE_MODS) + rm -f $(addsuffix .bak,$(TEMPLATE_MODS)) + rm -f *.pyc *.pyo + rm -rf dist/ build/ kickstart/kickstart.py kickstart/__init__.py *~ */*~ + rm -rf *.egg-info/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..ac2f925 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +kickstarter +=========== + +Kickstart file generator based on YAML formated meta data + +Installation +------------ + +Install cheetah (http://www.cheetahtemplate.org/) templating system, PyYAML. + +run make +sudo python setup.py install + +Usage +----- + +kickstarter -c -r + +Example: + + kickstarter --configs configurations.yaml --repos repos.yaml + +This configuration.yaml file is an example only, for meego kickstart files, +consult the image-configurations package + +Repo file +--------- + +This file contains a list of repositories to be used in the kickstart files + +Configurations file +------------------- + +This file has the definition of configurations. The Configurations inherit +from platforms first then from the DEFAULT section. The image configurations +override the all other settings (in DEFAULT and platform sections). diff --git a/TODO b/TODO new file mode 100644 index 0000000..124d39f --- /dev/null +++ b/TODO @@ -0,0 +1,6 @@ +List of things to do: + - Support kickstart magic + Add addition options per image to describe how it should be created, i.e. image type and other options + The generated kickstart files should then have the line on top that can be evaluated by mic + - Make it act as a module, so it can be imported into other scripts and generate kickstart file + - diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..50c33df --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.15git diff --git a/demo/configurations.yaml b/demo/configurations.yaml new file mode 100644 index 0000000..b7d91ed --- /dev/null +++ b/demo/configurations.yaml @@ -0,0 +1,235 @@ +ExternalConfigs: + - netbook + +Default: + Active: True + Baseline: tizen-0.99 + Language: en_US.UTF-8 + Keyboard: us + PackageArgs: + SaveRepos: True + Timezone: America/Los_Angeles + RootPass: meego + DefaultUser: meego + DefaultUserPass: meego + PartSize: 1900 + FileSystem: ext3 + PostScripts: + - rpm + Groups: + - MeeGo Core + - MeeGo Compliance + +CORE: + PartSize: 1000 + BootloaderAppend: "quiet" + BootloaderTimeout: 0 + PostScripts: + - cleanup + Groups: + - MeeGo X Window System + NoChrootScripts: + - buildname +N900: + Part: n900 + BootloaderTimeout: + BootloaderAppend: + StartX: True + Groups: + - MeeGo Core + - Minimal MeeGo X Window System + - X for Handsets + - MeeGo Compliance + - MeeGo Handset Desktop + - MeeGo Handset Applications + - MeeGo Base Development + Kernel: kernel-adaptation-n900 + PostScripts: + - cleanup + NoChrootScripts: + - buildname + Architecture: armv7l + Repos: + - core + - handset + - non-oss +MFLD: + PartSize: 1700 + BootloaderAppend: "ro pci=noearly console=tty1 console=ttyS0 console=ttyMFD2 earlyprintk=mrst loglevel=8 s0ix_latency=160" + BootloaderTimeout: 2 + Bootloader: True + StartX: True + Groups: + - MeeGo Core + - Minimal MeeGo X Window System + - X for Handsets + - MeeGo Compliance + - MeeGo Handset Desktop + - MeeGo Handset Applications + - MeeGo Base Development + Kernel: kernel + PostScripts: + - prelink + - cleanup + NoChrootScripts: + - buildname + Architecture: ia32 + Repos: + - core + - handset + - non-oss +IVI: + PartSize: 2200 + Bootloader: True + BootloaderAppend: "quiet" + BootloaderTimeout: 0 + BootloaderOptions: --test + Session: "/usr/bin/startivi" + StartX: True + Groups: + - X for IVI + Kernel: kernel-adaptation-intel-automotive + PostScripts: + - prelink + - cleanup + NoChrootScripts: + - buildname + Architecture: ia32 +NETBOOK: + PartSize: 3000 + Bootloader: True + BootloaderAppend: "quiet" + BootloaderTimeout: 0 + StartX: True + Groups: + - X for Netbooks + - Virtual Machine Support + - Printing + - Games + - MeeGo Netbook Desktop + Kernel: kernel + PostScripts: + - prelink + - cleanup + NoChrootScripts: + - buildname + Architecture: ia32 + +Configurations: + - Name: MeeGo IVI Development + Active: True + Platform: IVI + Desktop: X-IVI + FileName: ivi-ia32 + Mic2Options: -f livecd + Groups: + - MeeGo IVI Desktop + - MeeGo Base Development + - MeeGo IVI Applications + - Development Tools + Repos: + - core + - ivi + ExtraPackages: + - mesa-libEGL + - Name: MeeGo IVI + Active: True + Platform: IVI + Desktop: X-IVI + FileName: ivi-ia32 + Mic2Options: -f livecd + Groups: + - MeeGo IVI Desktop + - MeeGo Base Development + - MeeGo IVI Applications + Repos: + - core + - ivi + ExtraPackages: + - mesa-libEGL + - Name: MeeGo Handset N900 Development + Part: n900-devel + Active: True + Platform: N900 + FileName: handset-armv7l-n900-devel + Mic2Options: -f raw --save-kernel --arch=armv7l + Architecture: armv7l + Desktop: DUI + Session: "/usr/bin/mcompositor" + Groups: + - Nokia N900 Support + - Nokia N900 Proprietary Support + - Development Tools + ExtraPackages: + - xorg-x11-utils-xev + - u-boot-tools + PostScripts: + - inittab-n900 + - fstab-n900 + - u-boot + - Name: MeeGo Handset N900 + Active: True + Platform: N900 + FileName: handset-armv7l-n900 + Mic2Options: -f raw --save-kernel --arch=armv7l + Architecture: armv7l + Desktop: DUI + Session: "/usr/bin/mcompositor" + Groups: + - Nokia N900 Support + - Nokia N900 Proprietary Support + ExtraPackages: + - xorg-x11-utils-xev + - u-boot-tools + PostScripts: + - inittab-n900 + - fstab-n900 + - u-boot + + - Name: MeeGo Handset MTF Development + PartSize: 2200 + Active: True + Platform: MFLD + FileName: handset-ia32-mtf-devel + Mic2Options: -f nand + Kernel: kernel-adaptation-medfield + Architecture: ia32 + Desktop: DUI + Session: "/usr/bin/mcompositor" + Groups: + - Moorestown Support + - Development Tools + PostScripts: + - kernel-handset + - kboot + - serial-mfld + - Name: MeeGo Handset MTF Pinetrail + Active: True + Platform: MFLD + FileName: handset-ia32-pinetrail-mtf + Mic2Options: -f livecd + Kernel: kernel + Architecture: ia32 + Desktop: DUI + Session: "/usr/bin/mcompositor" + - Name: MeeGo Handset MTF + Schedule: "* * * * 3" + Active: True + Platform: MFLD + FileName: handset-ia32-mtf + Mic2Options: -f nand + Kernel: kernel-adaptation-medfield + Architecture: ia32 + Desktop: DUI + Session: "/usr/bin/mcompositor" + Groups: + - Moorestown Support + PostScripts: + - kernel-handset + - kboot + - serial-mfld + PrePackages: + - Answer2theUltimateQuestionOfEverything + Attachment: + - ifwi + - /boot/vmlinuz-* diff --git a/demo/custom/part/custom b/demo/custom/part/custom new file mode 100644 index 0000000..d6c8b6b --- /dev/null +++ b/demo/custom/part/custom @@ -0,0 +1,2 @@ +part / --size 1300 --ondisk sda --grow --maxsize=1450 --fstype=ext3 +#part /home --size 1000 --grow --maxsize=1450 --ondisk sdb --fstype=ext3 diff --git a/demo/custom/part/n900 b/demo/custom/part/n900 new file mode 100644 index 0000000..bd7ac77 --- /dev/null +++ b/demo/custom/part/n900 @@ -0,0 +1,8 @@ +part / --size=1800 --ondisk mmcblk0p --fstype=btrfs + +# This is not used currently. It is here because the /boot partition +# needs to be the partition number 3 for the u-boot usage. +part swap --size=192 --ondisk mmcblk0p --fstype=swap + +# This partition is made so that u-boot can find the kernel +part /boot --size=64 --ondisk mmcblk0p --fstype=vfat diff --git a/demo/custom/part/n900-devel b/demo/custom/part/n900-devel new file mode 100644 index 0000000..e239fa8 --- /dev/null +++ b/demo/custom/part/n900-devel @@ -0,0 +1,8 @@ +part / --size=3400 --ondisk mmcblk0p --fstype=btrfs + +# This is not used currently. It is here because the /boot partition +# needs to be the partition number 3 for the u-boot usage. +part swap --size=256 --ondisk mmcblk0p --fstype=swap + +# This partition is made so that u-boot can find the kernel +part /boot --size=64 --ondisk mmcblk0p --fstype=vfat diff --git a/demo/custom/scripts/buildname.nochroot b/demo/custom/scripts/buildname.nochroot new file mode 100644 index 0000000..edd20a7 --- /dev/null +++ b/demo/custom/scripts/buildname.nochroot @@ -0,0 +1,3 @@ +if [ -n "$IMG_NAME" ]; then + echo "BUILD: $IMG_NAME" >> $INSTALL_ROOT/etc/meego-release +fi diff --git a/demo/custom/scripts/cleanup.post b/demo/custom/scripts/cleanup.post new file mode 100644 index 0000000..c36c2e4 --- /dev/null +++ b/demo/custom/scripts/cleanup.post @@ -0,0 +1,6 @@ + +# save a little bit of space at least... +rm -f /boot/initrd* + +# make sure there aren't core files lying around +rm -f /core* diff --git a/demo/custom/scripts/flash.post b/demo/custom/scripts/flash.post new file mode 100644 index 0000000..fe062d3 --- /dev/null +++ b/demo/custom/scripts/flash.post @@ -0,0 +1,5 @@ +# verify link of flash plugin +if [ -f /usr/lib/flash-plugin/setup ]; then + sh /usr/lib/flash-plugin/setup install + rm -f /root/oldflashplugins.tar.gz +fi diff --git a/demo/custom/scripts/fstab-n900.post b/demo/custom/scripts/fstab-n900.post new file mode 100644 index 0000000..03b6fc1 --- /dev/null +++ b/demo/custom/scripts/fstab-n900.post @@ -0,0 +1,5 @@ + +# Use eMMC swap partition as MeeGo swap as well. +# Because of the 2nd partition is swap for the partition numbering +# we can just change the current fstab entry to match the eMMC partition. +sed -i 's/mmcblk0p2/mmcblk1p3/g' /etc/fstab diff --git a/demo/custom/scripts/inittab-n900.post b/demo/custom/scripts/inittab-n900.post new file mode 100644 index 0000000..4650a2f --- /dev/null +++ b/demo/custom/scripts/inittab-n900.post @@ -0,0 +1,3 @@ + +# open serial line console for embedded system +echo "s0:235:respawn:/sbin/agetty -L 115200 ttyS2 vt100" >> /etc/inittab diff --git a/demo/custom/scripts/kboot.post b/demo/custom/scripts/kboot.post new file mode 100644 index 0000000..d5d5183 --- /dev/null +++ b/demo/custom/scripts/kboot.post @@ -0,0 +1,3 @@ +#Create Initrd if it does not exist and create symlinks for bzImage and initrd for kboot autoboot +echo "ro pci=noearly console=tty1 console=ttyS0 console=ttyMFD2 earlyprintk=mrst loglevel=8 s0ix_latency=160" > /boot/kboot.cmdline + diff --git a/demo/custom/scripts/kernel-handset.post b/demo/custom/scripts/kernel-handset.post new file mode 100644 index 0000000..cb07f6c --- /dev/null +++ b/demo/custom/scripts/kernel-handset.post @@ -0,0 +1,17 @@ +echo "Checking for kernel......." +Kernel_Name=`ls /boot | grep vmlinuz` +if [ -f /boot/$Kernel_Name ]; then + Kernel_Ver=`echo $Kernel_Name | sed s/vmlinuz-//` + if [ -f /boot/initrd* ]; then + echo "Initrd exists" > /dev/null + else + /usr/libexec/mkmrstinitrd /boot/initrd-$Kernel_Ver.img $Kernel_Ver + fi + #Create Symlinks + cd /boot + ln -s $Kernel_Name bzImage + ln -s initrd-$Kernel_Ver.img initrd + ln -s kboot.cmdline cmdline +else + echo "No Kernels were found" +fi diff --git a/demo/custom/scripts/prelink.post b/demo/custom/scripts/prelink.post new file mode 100644 index 0000000..527548c --- /dev/null +++ b/demo/custom/scripts/prelink.post @@ -0,0 +1,4 @@ +# Prelink can reduce boot time +if [ -x /usr/sbin/prelink ]; then + /usr/sbin/prelink -aRqm +fi diff --git a/demo/custom/scripts/rpm.post b/demo/custom/scripts/rpm.post new file mode 100644 index 0000000..6a07394 --- /dev/null +++ b/demo/custom/scripts/rpm.post @@ -0,0 +1,7 @@ +# work around for poor key import UI in PackageKit +rm -f /var/lib/rpm/__db* +rpm --rebuilddb + +if [ -f /etc/pki/rpm-gpg/RPM-GPG-KEY-meego ]; then + rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-meego +fi diff --git a/demo/custom/scripts/serial-mfld.post b/demo/custom/scripts/serial-mfld.post new file mode 100644 index 0000000..c3c62b0 --- /dev/null +++ b/demo/custom/scripts/serial-mfld.post @@ -0,0 +1,4 @@ +# open serial line console for embedded system +echo "s0:235:respawn:/sbin/agetty -L 115200 ttyS0 vt100" >> /etc/inittab +echo "s1:235:respawn:/sbin/agetty -L 115200 ttyMFD2 vt100" >> /etc/inittab +echo "ttyMFD2" >> /etc/securetty diff --git a/demo/custom/scripts/serial.post b/demo/custom/scripts/serial.post new file mode 100644 index 0000000..5961379 --- /dev/null +++ b/demo/custom/scripts/serial.post @@ -0,0 +1,2 @@ +# open serial line console for embedded system +echo "s0:235:respawn:/sbin/agetty -L 115200 ttyS0 vt100" >> /etc/inittab diff --git a/demo/custom/scripts/u-boot.post b/demo/custom/scripts/u-boot.post new file mode 100644 index 0000000..6377edc --- /dev/null +++ b/demo/custom/scripts/u-boot.post @@ -0,0 +1,4 @@ + + +# Create the /boot/uImage for u-boot support. +mkimage -A arm -O linux -T kernel -C none -a 80008000 -e 80008000 -n vmlinuz -d /boot/vmlinuz* /boot/uImage diff --git a/demo/netbook/meego-netbook.yaml b/demo/netbook/meego-netbook.yaml new file mode 100644 index 0000000..2c1e16a --- /dev/null +++ b/demo/netbook/meego-netbook.yaml @@ -0,0 +1,17 @@ +Name: MeeGo Netbook/Nettop +PartSize: 2580 +Active: True +Baseline: "1.1.80" +Platform: NETBOOK +Desktop: meego +FileName: netbook-ia32 +Mic2Options: -f livecd +Groups: + - MeeGo Netbook Desktop + - Base Double Byte IME Support + - MeeGo Base Development +Repos: + - core + - netbook +ExtraPackages: + - chromium diff --git a/demo/repos.yaml b/demo/repos.yaml new file mode 100644 index 0000000..38928c9 --- /dev/null +++ b/demo/repos.yaml @@ -0,0 +1,17 @@ +Repositories: + - Name: core-testing + Url: http://download.meego.com/testing/core/repos/@ARCH@/packages + - Name: netbook-testing + Url: http://download.meego.com/testing/netbook/repos/@ARCH@/packages + - Name: handset-testing + Url: http://download.meego.com/testing/handset/repos/@ARCH@/packages + - Name: core + Url: http://repo.meego.com/MeeGo/builds/@RELEASE@/@BUILD_ID@/core/repos/@ARCH@/packages + - Name: netbook + Url: http://repo.meego.com/MeeGo/builds/@RELEASE@/@BUILD_ID@/netbook/repos/@ARCH@/packages + - Name: handset + Url: http://repo.meego.com/MeeGo/builds/@RELEASE@/@BUILD_ID@/handset/repos/@ARCH@/packages + - Name: ivi + Url: http://repo.meego.com/MeeGo/builds/@RELEASE@/@BUILD_ID@/ivi/repos/@ARCH@/packages + - Name: non-oss + Url: http://repo.meego.com/MeeGo/builds/@RELEASE@/@BUILD_ID@/non-oss/repos/@ARCH@/packages diff --git a/kickstart/Makefile b/kickstart/Makefile new file mode 100644 index 0000000..ce2f89e --- /dev/null +++ b/kickstart/Makefile @@ -0,0 +1,20 @@ +# ex: set tabstop=4 noexpandtab: +PYTHON=python +CHEETAH=cheetah +TEMPLATES=$(wildcard *.tmpl) +TEMPLATE_MODS=$(patsubst %.tmpl,%.py,$(TEMPLATES)) +.SECONDARY: $(TEMPLATE_MODS) + +all: $(TEMPLATE_MODS) + +%.py: %.tmpl + $(CHEETAH) compile --settings='useStackFrames=False' $< + cp $@ __init__.py + +clean: + rm -f $(TEMPLATE_MODS) + rm -f $(addsuffix .bak,$(TEMPLATE_MODS)) + rm -f *.xsd *.wsdl + rm -f *.pyc *.pyo + rm -f *.py + rm -f *.bak diff --git a/kickstart/kickstart.tmpl b/kickstart/kickstart.tmpl new file mode 100644 index 0000000..2cfb83c --- /dev/null +++ b/kickstart/kickstart.tmpl @@ -0,0 +1,116 @@ +#if $metadata.has_key("Mic2Options") +# -*-mic2-options-*- ${metadata.Mic2Options} -*-mic2-options-*- + +#end if +# ############################################## +# Do not Edit! Generated by: +# kickstarter.py +# ############################################### + +lang ${metadata.Language} +keyboard ${metadata.Keyboard} +timezone --utc ${metadata.Timezone} +#if $metadata.Part == "" +part / --size ${metadata.PartSize} --ondisk sda --fstype=${metadata.FileSystem} +#else +${metadata.Part} +#end if +rootpw ${metadata.RootPass} +#if $metadata.has_key("StartX") +xconfig --startxonboot +#end if +#if $metadata.has_key("BootloaderTimeout") or $metadata.has_key("BootloaderAppend") or $metadata.has_key("BootloaderOptions") +bootloader #slurp +#end if +#if $metadata.has_key("BootloaderTimeout") + --timeout=${metadata.BootloaderTimeout} #slurp +#end if +#if $metadata.has_key("BootloaderAppend") + --append="${metadata.BootloaderAppend}" #slurp +#end if +#if $metadata.has_key("BootloaderOptions") + ${metadata.BootloaderOptions} +#end if + +#if $metadata.has_key("Desktop") +desktop --autologinuser=${metadata.DefaultUser} #slurp +#if $metadata.Desktop != "None" +--defaultdesktop=${metadata.Desktop} #slurp +#end if +#if $metadata.has_key("Session") +--session="${metadata.Session}" +#else + +#end if +#end if +user --name ${metadata.DefaultUser} --groups audio,video --password '${metadata.DefaultUserPass}' + +#set $options_global = "" +#if $metadata.SaveRepos +#set $options_global = "--save --debuginfo --source --gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-meego" +#end if +#for $r in $metadata.Repos +#for $rr in $repos +#if $rr.Name == $r +#set $options_repo = $options_global +#if $rr.has_key("Options") +#set $options_repo = $rr.Options +#end if +#if $rr.Name == "adobe" +#if $rr.has_key("Options") +repo --name=${r} --baseurl=${rr.Url} ${rr.Options} +#else +repo --name=${r} --baseurl=${rr.Url} +#end if +#else +repo --name=${r} --baseurl=${rr.Url} ${options_repo} +#end if +#end if +#end for +#end for + +#if $metadata.has_key("PackageArgs") +%packages --${metadata.PackageArgs} +#else +%packages +#end if + +#for $g in $metadata.Groups +@${g} +#end for + +#if $metadata.has_key("Kernel") +$metadata.Kernel +#end if + +#for $e in $metadata.ExtraPackages +${e} +#end for +#for $e in $metadata.RemovePackages +-${e} +#end for +%end + +#if $metadata.has_key("PrePackages") +%prepackages +#for $e in $metadata.PrePackages +${e} +#end for +%end +#end if + +#if $metadata.has_key("Attachment") +%attachment +#for $e in $metadata.Attachment +${e} +#end for +%end +#end if + +%post +${metadata.Post} +%end + +%post --nochroot +${metadata.NoChroot} +%end diff --git a/kswriter/KSWriter.py b/kswriter/KSWriter.py new file mode 100644 index 0000000..5e840ac --- /dev/null +++ b/kswriter/KSWriter.py @@ -0,0 +1,172 @@ +#!/usr/bin/python +import copy +import time +import yaml +import os, re +import sys +import errno +from urlparse import urlparse + +from kickstart import kickstart + +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST: + pass + else: raise + +class KSWriter(): + def __init__(self, configs=None, repos=None, outdir=".", config=None, packages=False): + self.dist = None + self.arch = None + self.image_filename = os.path.abspath(os.path.expanduser(configs)) + self.repo_filename = repos + self.outdir = outdir + self.packages = packages + self.config = config + self.image_stream = file(self.image_filename, 'r') + self.repo_stream = file(self.repo_filename, 'r') + self.extra = {} + self.repo_meta = yaml.load(self.repo_stream) + self.image_meta = yaml.load(self.image_stream) + + def merge(*input): + return list(reduce(set.union, input, set())) + + def dump(self): + print yaml.dump(yaml.load(self.stream)) + + def parse(self, img): + conf = copy.copy(self.image_meta['Default']) + plat = copy.copy(self.image_meta[img['Platform']]) + conf.update(plat) + conf.update(img) + lval = ['Repos', 'Groups', 'PostScripts', 'NoChrootScripts', 'RemovePackages', 'ExtraPackages'] + lvald = {} + for l in lval: + full = [] + if self.image_meta['Default'].has_key(l) and self.image_meta['Default'][l]: + full = full + self.image_meta['Default'][l] + if plat.has_key(l) and plat[l]: + full = full + plat[l] + if img.has_key(l) and img[l]: + full = full + img[l] + lvald[l] = sorted(set(full), key=full.index) + conf.update(lvald) + postscript = "" + meta_root = os.path.dirname(self.image_filename) + for scr in conf['PostScripts']: + if os.path.exists('%s/custom/scripts/%s.post' %(meta_root, scr)): + f = open('%s/custom/scripts/%s.post' %(meta_root, scr), 'r') + postscript += f.read() + postscript += "\n" + f.close() + else: + print '%s/custom/scripts/%s.post not found, skipping.' %(meta_root,scr ) + + nochrootscript = "" + for scr in conf['NoChrootScripts']: + if os.path.exists('%s/custom/scripts/%s.nochroot' %(meta_root,scr)): + f = open('%s/custom/scripts/%s.nochroot' %(meta_root, scr ), 'r') + nochrootscript += f.read() + nochrootscript += "\n" + f.close() + else: + print '%s/custom/scripts/%s.nochroot not found, skipping.' %(meta_root, scr ) + + ptab = "" + for g in [ plat, img ]: + if g.has_key("Part"): + f = open("%s/custom/part/%s" %(meta_root, g['Part']) ) + ptab = f.read() + f.close() + + conf['Part'] = ptab + conf['Post'] = postscript + conf['NoChroot'] = nochrootscript + return conf + + def process_files(self, meta, repos): + new_repos = [] + if ( meta.has_key("Architecture") and meta['Architecture'] ) or ( meta.has_key("Distribution") and meta['Distribution']): + for repo in repos: + r = {} + r['Name'] = repo['Name'] + repourl = repo['Url'] + if repo.has_key('Options'): + r['Options'] = repo['Options'] + if meta.has_key("Architecture") or self.arch: + repourl = repourl.replace("@ARCH@", self.arch or meta['Architecture']) + if meta.has_key("Distribution") or self.dist: + repourl = repourl.replace("@DIST@", self.dist or meta['Distribution']) + + url = repourl.replace("@RELEASE@", meta['Baseline']) + o = urlparse(url) + new_url = "%s://" % o[0] + if repo.has_key('Username') and repo['Username']: + new_url = "%s%s" % (new_url, repo['Username'] ) + if repo.has_key('Password') and repo['Password']: + new_url = "%s:%s@" % (new_url, repo['Password'] ) + r['Url'] = "%s%s%s" % (new_url, o[1], o[2] ) + new_repos.append(r) + else: + new_repos = repos + + nameSpace = {'metadata': meta, 'repos': new_repos} + t = kickstart(searchList=[nameSpace]) + a = str(t) + if meta.has_key('FileName') and meta['FileName']: + f = None + if meta.has_key("Baseline"): + mkdir_p("%s/%s" %(self.outdir, meta['Baseline'])) + f = open("%s/%s/%s.ks" %( self.outdir, meta['Baseline'], meta['FileName'] ), 'w') + else: + f = open("%s/%s.ks" %( self.outdir, meta['FileName'] ), 'w') + f.write(a) + f.close() + + def generate(self): + out = {} + repos = self.repo_meta['Repositories'] + if self.image_meta.has_key('Configurations'): + for img in self.image_meta['Configurations']: + conf = self.parse(img) + if self.config: + if img.has_key('FileName') and self.config == img['FileName']: + print "Creating %s (%s.ks)" %(img['Name'], img['FileName'] ) + self.process_files(conf, repos) + break + else: + if conf.has_key('Active') and conf['Active'] : + print "Creating %s (%s.ks)" %(img['Name'], img['FileName'] ) + self.process_files(conf, repos) + else: + print "%s is inactive, not generating %s at this time" %(img['Name'], img['FileName'] ) + for path in self.image_meta['ExternalConfigs']: + external_config_dir = os.path.join(os.path.dirname(self.image_filename), path) + for f in os.listdir(external_config_dir): + if f.endswith('.yaml'): + fp = file('%s/%s' %(external_config_dir, f), 'r') + local = yaml.load(fp) + conf = self.parse(local) + if self.config: + if self.config == conf['FileName']: + if self.packages: + out['baseline'] = conf['Baseline'] + out['groups'] = conf['Groups'] + out['packages'] = conf['ExtraPackages'] + else: + print "Creating %s (%s.ks)" %(conf['Name'], conf['FileName'] ) + self.process_files(conf, repos) + break + else: + if conf.has_key('Active') and conf['Active']: + print "Creating %s (%s.ks)" %(conf['Name'], conf['FileName'] ) + self.process_files(conf, repos) + else: + print "%s is inactive, not generate %s this time" %(conf['Name'], conf['FileName'] ) + else: + print "WARNING: File '%s' ignored." % (f) + return out diff --git a/kswriter/__init__.py b/kswriter/__init__.py new file mode 100644 index 0000000..82212cb --- /dev/null +++ b/kswriter/__init__.py @@ -0,0 +1 @@ +from KSWriter import KSWriter diff --git a/packaging/kickstarter.manifest b/packaging/kickstarter.manifest new file mode 100644 index 0000000..017d22d --- /dev/null +++ b/packaging/kickstarter.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/kickstarter.spec b/packaging/kickstarter.spec new file mode 100644 index 0000000..c7fe292 --- /dev/null +++ b/packaging/kickstarter.spec @@ -0,0 +1,50 @@ +%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} +Name: kickstarter +Summary: Create kickstart files for image creation +Version: 0.15 +Release: 1 +Group: System/Base +License: GPLv2 +BuildArch: noarch +URL: http://www.tizen.org +Source0: %{name}-%{version}.tar.bz2 +Source1001: packaging/kickstarter.manifest +Requires: python-yaml +Requires: python-cheetah +Requires: python-lxml +BuildRequires: python-devel +BuildRequires: python-cheetah + + +%description +Create Configuration files(kickstart) to build images + + +%prep +%setup -q -n %{name}-%{version} + + +%build +cp %{SOURCE1001} . +make tmpls + +CFLAGS="$RPM_OPT_FLAGS" %{__python} setup.py build + + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p %{buildroot}/usr/share/license +cp LICENSE %{buildroot}/usr/share/license/%{name} +%if 0%{?suse_version} +%{__python} setup.py install --root=$RPM_BUILD_ROOT --prefix=%{_prefix} +%else +%{__python} setup.py install --root=$RPM_BUILD_ROOT -O1 --prefix=%{_prefix} +%endif + + +%files +%manifest kickstarter.manifest +%defattr(-,root,root,-) +%{_bindir}/* +%{python_sitelib}/* +/usr/share/license/%{name} diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..735a510 --- /dev/null +++ b/setup.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +import os, sys +from distutils.core import setup +try: + import setuptools + # enable "setup.py develop", optional +except ImportError: + pass + +MOD_NAME = 'kickstart' + +version_path = 'VERSION' +if not os.path.isfile(version_path): + print 'No VERSION file in topdir, abort' + sys.exit(1) + +try: + # first line should be the version number + version = open(version_path).readline().strip() + if not version: + print 'VERSION file is invalid, abort' + sys.exit(1) + + ver_file = open('%s/__version__.py' % MOD_NAME, 'w') + ver_file.write("VERSION = \"%s\"\n" % version) + ver_file.close() +except IOError: + print 'WARNING: Cannot write version number file' + +setup(name='kickstarter', + version = version, + description='Kickstarter', + author='Anas Nashif', + author_email='anas.nashif@intel.com', + url='http://meego.com/', + scripts=['tools/kickstarter'], + packages=['kickstart', 'kswriter'] + ) + diff --git a/tools/fetch-configs.py b/tools/fetch-configs.py new file mode 100755 index 0000000..653af7f --- /dev/null +++ b/tools/fetch-configs.py @@ -0,0 +1,29 @@ +#!/usr/bin/python + +import urllib2 +from datetime import date +from xml.etree.ElementTree import ElementTree + +url = "http://download.meego.com/snapshots/1.1.90.8.20110317.88/builddata/image-configs.xml" +f = urllib2.urlopen(url) +tree = ElementTree() +tree.parse(f) +configs = tree.findall('config') +for c in configs: + planned = False + name = c.find('name').text + dow = date.today().weekday() + if c.find('schedule').text != '': + schedule = c.find('schedule').text + if schedule == '*': + planned = True + elif schedule in ["0","1","2","3","4","5","6"] and int(schedule) == dow: + planned = True + else: + planned = False + + if planned: + print "%s is scheduled to be created today" %name + else: + print "%s is not scheduled to be created today" %name + diff --git a/tools/kickstarter b/tools/kickstarter new file mode 100755 index 0000000..861bdd4 --- /dev/null +++ b/tools/kickstarter @@ -0,0 +1,106 @@ +#!/usr/bin/python +# Anas Nashif +import yaml, sys +import re, os +from kswriter import KSWriter + +import copy +import time +import optparse +from time import gmtime, strftime +try: + from lxml import etree +except ImportError: + try: + # Python 2.5 + import xml.etree.cElementTree as etree + except ImportError: + try: + # Python 2.5 + import xml.etree.ElementTree as etree + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree + except ImportError: + print("Failed to import ElementTree from any known place") + + +def image_xml(root, img): + s = etree.Element("config") + c = etree.Element('name') + c.text = "%s.ks" %img['FileName'] + s.append(c) + cc = etree.Element('path') + cc.text = "image-configs/%s.ks" %img['FileName'] + s.append(cc) + cc = etree.Element('description') + cc.text = "%s" %img['Name'] + s.append(cc) + + if img.has_key('Architecture'): + cc = etree.Element('arch') + cc.text = "%s" %img['Architecture'] + s.append(cc) + + cc = etree.Element('md5') + cc.text = "" + s.append(cc) + + cc = etree.Element('schedule') + if img.has_key('Schedule'): + cc.text = img['Schedule'] + s.append(cc) + root.append(s) + +def create_xml(image_meta): + root = etree.Element("image-configs") + if image_meta.has_key('Configurations'): + for img in image_meta['Configurations']: + image_xml(root,img) + for path in image_meta['ExternalConfigs']: + for f in os.listdir(path): + if f.endswith('.yaml'): + fp = file('%s/%s' %(path, f), 'r') + local = yaml.load(fp) + conf = ks.parse(local) + if conf.has_key('Active') and conf['Active']: + image_xml(root,conf) + + str = etree.tostring(root, pretty_print=True) + return str + +if __name__ == '__main__': + parser = optparse.OptionParser() + + parser.add_option("-c", "--configs", type="string", dest="configsfile", + help="configuration meta file") + parser.add_option("-o", "--outdir", type="string", dest="outdir", default=".", + help="outdir") + parser.add_option("-r", "--repos", type="string", dest="repofile", + help="repo meta file") + parser.add_option("-i", "--index", type="string", dest="indexfile", + help="generate index file") + parser.add_option("-C", "--config", type="string", dest="config", default=None, + help="Limit to this configuration file") + parser.add_option("-p", "--packages", action="store_true", dest="packages", default=False, + help="return list of packages to be installed for this configuration") + + (options, args) = parser.parse_args() + + if options.configsfile is None or options.repofile is None: + print "you need to provide meta files with --configs and --repos" + sys.exit(1) + + ks = KSWriter(options.configsfile, options.repofile, options.outdir, options.config, options.packages) + ks.generate() + + if options.indexfile: + str = create_xml(ks.image_meta) + f = open(options.indexfile, 'w') + f.write(str) + f.close() -- 2.7.4