#!ipxe
{% regroup mirrorurls by country as mirrors_by_country %}

# Figure out if client is 64-bit capable
cpuid --ext 29 && set cpuarch x86_64 || set cpuarch i686

# allow only trusted images
imgtrust

# initial options
set bootarch ${cpuarch}
set release {{ releases.0 }}
set extrabootoptions ip=dhcp net.ifnames=0 BOOTIF=01-${netX/mac}
set countrycode

:main
menu {{ BRANDING_DISTRONAME }} Netboot
item --gap Settings
item set_architecture Architecture: ${bootarch}
item set_release Release: ${release}
isset ${mirrorurl} && item set_mirror Mirror: ${mirrorurl} || item set_mirror Choose a mirror
item set_options Boot options: ${extrabootoptions}
item
isset ${mirrorurl} && item boot Boot {{ BRANDING_DISTRONAME }} || item --gap Boot {{ BRANDING_DISTRONAME }}
item shell Drop to iPXE shell
item reboot Reboot
item exit Exit iPXE
isset ${mirrorurl} && choose --default set_options selected || choose --default set_mirror selected || goto shell
goto ${selected} || goto main

:shell
echo Type 'exit' to get the back to the menu
shell
goto main

:reboot
reboot

:exit
exit

:set_architecture
menu {{ BRANDING_DISTRONAME }} Netboot: Select Architecture
item back back
item
item --gap Available architectures:
iseq ${cpuarch} x86_64 && item x86_64 x64_64 ||
item i686 i686
choose selected || goto main
iseq ${selected} back && goto main ||
set bootarch ${selected}
goto main

:set_release
menu {{ BRANDING_DISTRONAME }} Netboot: Select Release
item back back
item
item --gap Available releases:
{% for release in releases %}item {{ release }} {{ release }}
{% endfor %}
choose selected || goto main
iseq ${selected} back && goto main ||
set release ${selected}
goto main

:set_mirror
goto select_mirror_country

:select_mirror_country
menu {{ BRANDING_DISTRONAME }} Netboot: Select Mirror
item back back
item
item --gap Custom Configuration:
item custom Enter mirror URL
item
item --gap Select Mirror By Country:
{% for mirrorgroup in mirrors_by_country %}
{% if mirrorgroup.grouper == '' %}
item 00 Global
{% else %}
item {{ mirrorgroup.grouper }} {{ mirrorgroup.grouper.name }}
{% endif %}
{% endfor %}
isset ${countrycode} && choose --default ${countrycode} selected || choose selected || goto main
iseq ${selected} back && goto main ||
iseq ${selected} custom && goto enter_mirror_url ||
set countrycode ${selected}
goto select_mirror_url

:enter_mirror_url
set countrycode
echo Enter the mirror URL including the trailing slash.
echo Example: http://some.host/archlinux/
echo
echo -n Mirror URL: ${} && read mirrorurl || goto select_mirror_country
goto main

:select_mirror_url
goto select_mirror_url_${countrycode} || goto select_mirror_country

{% for mirrorgroup in mirrors_by_country %}
{% if mirrorgroup.grouper == '' %}
:select_mirror_url_00
set countryname Global
{% else %}
:select_mirror_url_{{ mirrorgroup.grouper }}
set countryname {{ mirrorgroup.grouper.name }}
{% endif %}
menu {{ BRANDING_DISTRONAME }} Netboot: Select Mirror
item back back
item
item --gap Available mirrors in ${countryname}
{% for mirror in mirrorgroup.list %}item {{ mirror.url }} {{ mirror.mirror.name }}
{% endfor %}
choose selected || goto select_mirror_country
iseq ${selected} back && goto select_mirror_country ||
set mirrorurl ${selected}
goto main
{% endfor %}

:set_options
echo -n Boot options: ${} && read extrabootoptions ||
goto main

:boot
echo Booting {{ BRANDING_DISTRONAME }} ${bootarch} ${release} from ${mirrorurl}
echo
kernel ${mirrorurl}iso/${release}/arch/boot/${bootarch}/vmlinuz || goto failed_download
imgverify vmlinuz ${mirrorurl}iso/${release}/arch/boot/${bootarch}/vmlinuz.ipxe.sig || goto failed_verify
initrd ${mirrorurl}iso/${release}/arch/boot/${bootarch}/archiso.img || goto failed_download
imgverify archiso.img ${mirrorurl}iso/${release}/arch/boot/${bootarch}/archiso.img.ipxe.sig || goto failed_verify
imgargs vmlinuz initrd=archiso.img archiso_http_srv=${mirrorurl}iso/${release}/ archisobasedir=arch verify=y ${extrabootoptions}
boot || goto failed_boot

:failed_download
echo
echo Failed to download a file.
goto failed

:failed_verify
echo
echo Failed to verify a file.
goto failed

:failed_boot
echo
echo Boot failed.
goto failed

:failed
echo Press a key to return to the menu.
prompt
imgfree
goto main
