brlev at free.fr
2016-Jun-29 13:27 UTC
[syslinux] Fwd: [PATCH] {vesa}menu.c32 feature => hide menu entry for specific sources
good afternoon. As promised to Mr Cumm few weeks before, I forward you the mail that I had wrongly sent directly to Mr Anvin. This is something I've done for my company usage and I submit it to you. Feel free to include it if you think this can be usefull for others .. Context: In my company, we have several distinct PXE server (depending on the location: europe, asia, ....). each of these servers must have a some configuration adjustement ( mainly pxechain for local WDS ) Goal : Having a unique configuration file that can be synchronized (headachesfree updates ;) ) I've added an option "MENU HIDEIFNOT" that can take the following values : - "ISO" - "SYS" - an IP address (ie: 192.168.100.1) shorlty, the menu entry is hidden if : - you're booting from isolinux but option is not set to "ISO" - you're booting from syslinux but option is not set to "SYS" - you're booting from pxelinux but option is not set to the TFTP server from which the menu is downloaded --- syslinux-6.03/com32/menu/readconfig.c.orig 2016-05-06 16:45:43.589511704 +0200 +++ syslinux-6.03/com32/menu/readconfig.c 2016-05-06 18:37:06.573393370 +0200 @@ -232,6 +232,7 @@ struct labeldata { int save; int immediate; struct menu *submenu; + const char *visiblesource; }; /* Menu currently being parsed */ @@ -318,6 +319,7 @@ static void record(struct menu *m, struc int i; struct menu_entry *me; const struct syslinux_ipappend_strings *ipappend; + const union syslinux_derivative_info *sdi; if (!ld->label) return; /* Nothing defined */ @@ -326,6 +328,34 @@ static void record(struct menu *m, struc if (ld->menuhide) m = hide_menu; + /* if HIDEIFNOT is specified , then send this entry to "hidden menu" until source doesn't match */ + if (ld->visiblesource){ + sdi = syslinux_derivative_info(); + uint32_t srvip; + char strsrvip[50]; + switch (sdi->c.filesystem) { + case SYSLINUX_FS_ISOLINUX: + if (strcmp(ld->visiblesource, "ISO")!=0) // if booting from CD and ISO is not specified => hide + m = hide_menu; + break; + case SYSLINUX_FS_PXELINUX: // if booting from pxe and tftp sever IP address doesn't match => hide + srvip = sdi->pxe.ipinfo->serverip; + sprintf(strsrvip,"%u.%u.%u.%u",((uint8_t *)&srvip)[0], ((uint8_t *)&srvip)[1], ((uint8_t *)&srvip)[2], ((uint8_t *)&srvip)[3]); + if (strcmp(ld->visiblesource, strsrvip)!=0) + m = hide_menu; + break; + case SYSLINUX_FS_SYSLINUX: // if booting from syslinux and SYS is not specified => hide (can surely be improved with media type control) + if (strcmp(ld->visiblesource, "SYS")!=0) + m = hide_menu; + break; + case SYSLINUX_FS_UNKNOWN: // if booting from CD unknown => hide + break; + default: + m = hide_menu; + break; + } + } + if (ld->label) { char ipoptions[4096], *ipp; const char *a; @@ -744,9 +774,14 @@ static void parse_config_file(FILE * f) } else if ((ep = looking_at(p, "include"))) { goto do_include; } else if ((ep = looking_at(p, "background"))) { - p = skipspace(ep); - refstr_put(m->menu_background); - m->menu_background = refdup_word(&p); + p = skipspace(ep); + refstr_put(m->menu_background); + m->menu_background = refdup_word(&p); + } else if ((ep = looking_at(p, "hideifnot"))){ + if (ld.label) { + refstr_put(ld.visiblesource); + ld.visiblesource = refstrdup(skipspace(p + 9)); + } } else if ((ep = looking_at(p, "hidden"))) { hiddenmenu = 1; } else if (looking_at(p, "hiddenkey")) { As always , I'm sorry for my english :) !! hope this can help. Bruno Levert Developer's Certificate of Origin 1.1 By making a contribution to this project, I certify that (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. Bruno Levert <brlev at free.fr>