Re: [webmin-devel] Building a Google Gears manifest file of Webminstatic files

"Jamie Cameron" <[email protected]> Mon, 16 Feb 2009 10:56:25 -0800 (PST)
Newsgroups gmane.comp.web.webmin.devel
Message-ID <[email protected]>
On 16/Feb/2009 01:55 David Harrison wrote ..
> Hi,
> I have updated my Webmin theme with limited support for Google Gears:
> http://www.stress-free.co.nz/stressfree_webmin_theme_version_20_released
> 
> It doesn't provide true offline support for Webmin, but it caches some  
> static files so that users on a WAN can see significant performance  
> improvements.
> 
> At the moment the manifest file that lists what static files Gears  
> should cache is hard coded.
> Gears throws a wobbly if a file listed in the manifest isn't  
> available, this means hard coding file names for every possible file  
> isn't possible (or viable considering the number).
> 
> What I think would be cool is if this list could be dynamically built  
> based on what modules are installed.
> e.g. All jpg, gif, png, js and css files for the Webmin install.
> 
> Webmin would need to build this list very quickly (or cache it) as  
> Gears checks the manifest file regularly to ensure things are up to  
> date.
> 
> The problem is I don't know enough Perl or the inner workings of  
> Webmin to do this.
> 
> If anyone out there could provide a code sample on how to build a list  
> of static file names for a Webmin/Usermin install I would be very  
> grateful.
> 
> For reference I have included the existing manifest.cgi file that I  
> use below.
> You can see that if I could call a function that returned the list of  
> file names it would be trivial to iterate through all the relevant  
> entries.
> 
> 
> David
> 
> 
> 
> #!/usr/bin/perl
> ###########################################################################
> #
> # Email: [email protected]
> # Internet: http://www.stress-free.co.nz
> #
> # Javascript version originally contributed by Dwi Kristianto
> #
> ###########################################################################
> 
> do './web-lib.pl';
> 
> print "Content-type: text/javascript\n\n";
> 
> my $manifest = "{
> \"betaManifestVersion\" : 1,
> \"version\" : \"wmg-20090216-2130\",
> \"entries\" : [
> { \"url\" : \"$gconfig{'webprefix'}/images/favicon.ico\" },
> { \"url\" : \"$gconfig{'webprefix'}/webmin/index.cgi\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/theme.css\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/print.css\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/csshover.htc\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/theme_ie.css\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/theme_ie7.css\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/1x1.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/audio.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/back.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/bar-blue.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/bar-grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/bar-purple.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/bar-red.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/bar-white.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/binary.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/closed.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/critical.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/dir.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/down.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/first-grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/first.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/gap.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/image.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/last-grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/last.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/lc1.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/lc2.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/left-grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/left.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/major.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/minor.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/movedown.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/movegap.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/moveup.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/newlogo.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/nosort.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/ok.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/open.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/rc1.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/rc2.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/right-grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/right.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/smalllogo.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/sort.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/sortasc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/sortascgrey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/sortdesc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/sortdescgrey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/text.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/unknown.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/up.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/usermin.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/webmin-blue.png\" },
> { \"url\" : \"$gconfig{'webprefix'}/images/webmin.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/def.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/defines.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/dir.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/doc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/edit.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/icon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/mods.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/recon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/show.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/smallicon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_0.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_1.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_10.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_11.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_12.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_13.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_14.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_15.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_16.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_17.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_18.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_19.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_2.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_20.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_3.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_4.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_5.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_6.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_7.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_8.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/type_icon_9.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/virt.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/apache/images/virt_index.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/A.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/AAAA.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/ALL.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/CNAME.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/HINFO.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/KEY.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/LOC.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/MX.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/NS.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/PTR.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/RP.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/SPF.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/SRV.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/TXT.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/WKS.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/acls.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/close.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/controls.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/delegation.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/extra.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/files.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/findfree.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/font.txt\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/forward.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/forwarding.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/gen.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/hint.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/icon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/keys.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/logging.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/manual.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/master.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/misc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/net.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/no-home.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/open.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/options.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/rndc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/servers.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/slave.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/slaves.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/smallicon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/soa.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/stub.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/text.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/view.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/whois.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/bind8/images/zonedef.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/db.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/dirs.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/errors.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/icon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/limits.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/misc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/safe.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/session.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/smallicon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/phpini/images/vars.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/cnf.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/cprivs.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/db.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/dbs.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/delete.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/edit.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/hosts.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/icon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/index.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/mysql.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/procs.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/root.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/smallicon.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/table.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/tprivs.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/users.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/vars.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/mysql/images/view.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> background.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> bar_blue.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> bar_grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> bar_purple.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/bar_red.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> bar_white.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/button.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> button_hover.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> closebutton.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/closed.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/favicon.ico 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/first- 
> grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/first.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> footerbackground.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> form_background.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/gears- 
> bg.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/gears- 
> bgnotselected.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/gears- 
> bgselected.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/gears- 
> disabled.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/gears- 
> enabled.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> headerbackground.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/hidden- 
> background.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/last- 
> grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/last.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/lc2.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/left- 
> grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/left.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> loginbackground.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> menu_background.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> menuhover.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/open.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/rc2.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/right- 
> grey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/right.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> searchnotselected.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> searchresults.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> searchselected.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> sidebar_background.jpg\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/sortasc.gif 
> \" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> sortascgrey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> sortdesc.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> sortdescgrey.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> userminlogo.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/images/ 
> webminlogo.gif\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> application.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> builder.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> controls.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> dragdrop.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> effects.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> prototype.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> scriptaculous.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> slider.js\" },
> { \"url\" : \"$gconfig{'webprefix'}/theme-stressfree/javascript/ 
> unittest.js\" }
> ]}";
> 
> print $manifest;

Hi David,

Assuming you just want to cache all images and .js files, you could
build a full list with code like :

open(FIND, "find $root_directory -type f -name '*.{gif,png,jpg,js}' |");
while($file = <FIND>) {
  chop($file);
  $file =~ s/^\Q$root_directory\E//;
  $file = $gconfig{'webprefix'}.$file;
  $manifest .= "{ \"url\" : \"$file\" },";
}
print $manifest;

Does that help?

By the way, great work on the theme!

 - Jamie

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
-
Forwarded by the Webmin development list at [email protected]
To remove yourself from this list, go to
http://lists.sourceforge.net/lists/listinfo/webadmin-devel