/[fuse_dbi]/trunk/examples/webgui.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/examples/webgui.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 45 - (hide annotations)
Tue Nov 23 23:49:24 2004 UTC (17 years, 10 months ago) by dpavlin
File MIME type: text/plain
File size: 7230 byte(s)
fix support for PostgreSQL

1 dpavlin 11 #!/usr/bin/perl -w
2    
3     use strict;
4     use blib;
5     use Fuse::DBI;
6 dpavlin 27 use lib '/data/WebGUI/lib/';
7     use Data::Config;
8 dpavlin 11
9 dpavlin 27 =head1 NAME
10 dpavlin 11
11 dpavlin 27 webgui.pl - mount WebGUI templates as filesystem
12 dpavlin 11
13 dpavlin 27 =head1 SYNOPSIS
14    
15     webgui.pl /data/WebGUI/etc/webgui.conf /mnt
16    
17     =head1 DESCRIPTION
18    
19     With this script, you can utilize C<Fuse> and C<Fuse::DBI> modules to mount
20     templates from WebGUI and edit them using command-line utilities (like C<vi>
21     or C<ftp>).
22    
23     It will present templates in WebGUI as directory tree consisting of
24     directories (which represent template's namespace) and files (which are
25     templates from database). If template name has slash (C</>) in name, deeper
26     directories will be created.
27    
28     Template files will have correct lengths and write permissions which are
29     specified in WebGUI database.
30    
31     =head2 Fuse module
32    
33     C<Fuse::DBI> module (which is core of this utility) uses C<Fuse> perl
34     bindings. Perl bindings are rather new addition to C<Fuse>, so
35     you will need recent CVS version of C<Fuse>. Current stable version doesn't
36     include perl binding, so you will probably have to compile C<Fuse> yourself
37     (see FUSE documentation for details about compilation and installation).
38    
39     After compilation and installation of C<fuse> kernel module and C<Fuse> perl
40     bindings for it, you will have to load C<fuse> module into kernel. For that,
41     you will have to be root. If you are not administrator on particular
42     machine, ask your admin to install and load C<fuse> module for you.
43    
44     If you used C<fusermount> command before running this script, module will be
45     already loaded.
46    
47     =head2 unsupported operations
48    
49     There is no support for creation of new templates, renaming, or deleting.
50     Although those operations map nicely to file system semantics there are still
51     possible only using WebGUI web interface.
52    
53     =head2 unlink to invalidate cache
54    
55     Unlink command (C<rm>) is implemented on files with special function: it
56     will remove in-memory cache of particular template and reload it from
57     database. That enables usage of web interface to make small changes and then
58     continuing editing using this script without restarting it.
59    
60     In-memory cache is populated with data about available templates when you
61     start this script. Currently only way to refresh template list (after you
62     create copy of template through web interface) is to remove directory using
63     C<rmdir> or C<rm -rf>.
64    
65     B<Don't panic!> Destructive operations in filesystem (C<rm> and C<rmdir>)
66     just invalidate in-memory cache and re-read data from database (this will
67     also change ctime of file, so your editor will probably notice that file has
68     changed).
69    
70     In-memory cache is used to speed up operations like grep on templates. If it
71     wasn't there, grep wouldn't be useful at all. I think this is acceptable
72     compromise.
73    
74     =head2 invalidating of on-disk templates
75    
76     Every write operation will erase all templates on disk (so that next reload
77     on browser will show your changes). It would be better if just changed
78     template is erased, but this works well enough. You might notice performance
79     penalty of this simplification if you are running very loaded production
80     site.
81    
82     You have to have write permission on C<uploads/temp/templates/> directory
83     for your WebGUI instance for this to work. If you don't C<Fuse::DBI> will
84     complain.
85    
86     =head2 supported databases
87    
88     This script have embedded SQL queries for MySQL and PostgreSQL. Other databases
89     could be supported easily. Contributions are welcomed.
90    
91     =head2 database transactions
92    
93     C<Fuse::DBI> uses transactions (if your database supports them) to prevent
94     accidental corruption of data by reading old version. Depending on type of
95     database back-end, MySQL users might be out of luck.
96    
97     =head2 recovering from errors
98    
99     B<Transport endpoint is not connected> is very often error when Fuse perl
100     bindings exit without clean umount (through C<Fuse::DBI> C<umount> method or
101     with C<fusermount -u /mnt> command).
102    
103     This script will automatically run C<fusermount -u /mnt> if it receives
104     above error on startup. If it fails, mount point is still in use (that
105     happens if you changed directory to mount point in other shell). Solution is
106     simple, just change directory in other back to C<$HOME> (with just C<cd>)
107     and re-run this script.
108    
109     =head2 missing Data::Config
110    
111     If this script complains about missing C<Data::Config> module, you will have
112     to point path at top which points to lib directory of WebGUI installation.
113     By default it points to C</data/WebGUI>:
114    
115     use lib '/data/WebGUI/lib/';
116    
117     =cut
118    
119     my ($config_file,$mount) = @ARGV;
120    
121     unless ($config_file && $mount) {
122     print STDERR <<_USAGE_;
123     usage: $0 /data/WebGUI/etc/webgui.conf /mnt
124    
125     For more information see perldoc webgui.pl
126     _USAGE_
127     exit 1;
128     }
129    
130     system "fusermount -u $mount" unless (-w $mount);
131    
132     unless (-w $mount) {
133     print STDERR "Current user doesn't have permission on mount point $mount: $!";
134     exit 1;
135     }
136    
137     my $config = new Data::Config $config_file || "can't open config $config_file: $!";
138    
139     my $sql = {
140     'pg' => {
141     'filenames' => q{
142     select
143     oid as id,
144     namespace||'/'||name||' ['||oid||']' as filename,
145     length(template) as size,
146     iseditable as writable
147     from template ;
148     },
149     'read' => q{
150     select template
151     from template
152     where oid = ?;
153     },
154     'update' => q{
155     update template
156     set template = ?
157     where oid = ?;
158     },
159     },
160     'mysql' => {
161     'filenames' => q{
162     select
163     concat(templateid,name) as id,
164     concat(namespace,'/',name,'.html') as filename,
165     length(template) as size,
166     iseditable as writable
167     from template ;
168     },
169     'read' => q{
170     select template
171     from template
172     where concat(templateid,name) = ?;
173     },
174     'update' => q{
175     update template
176     set template = ?
177     where concat(templateid,name) = ?;
178     },
179     },
180 dpavlin 11 };
181    
182 dpavlin 27 my $dsn = $config->param('dsn');
183     my $db;
184    
185 dpavlin 45 if ($dsn =~ m/DBI:(mysql|pg):/i) {
186     $db = lc($1);
187 dpavlin 27 } else {
188     print STDERR "can't find supported database (mysql/pg) in dsn: $dsn\n";
189     exit 1;
190     }
191    
192     my $template_dir = $config->param('uploadsPath') . '/temp/templates/';
193    
194     print "using database '$db', template dir '$template_dir' and mountpoint $mount\n";
195    
196 dpavlin 13 my $mnt = Fuse::DBI->mount({
197 dpavlin 27 filenames => $sql->{$db}->{'filenames'},
198     read => $sql->{$db}->{'read'},
199     update => $sql->{$db}->{'update'},
200     dsn => $config->param('dsn'),
201     user => $config->param('dbuser'),
202     password => $config->param('dbpass'),
203     mount => $mount,
204     fork => 1,
205     invalidate => sub {
206     print STDERR "invalidating content in $template_dir\n";
207     opendir(DIR, $template_dir) || die "can't opendir $template_dir: $!";
208     map { unlink "$template_dir/$_" || warn "can't remove $template_dir/$_: $!" } grep { !/^\./ && -f "$template_dir/$_" } readdir(DIR);
209     closedir DIR;
210     },
211 dpavlin 11 });
212 dpavlin 13
213 dpavlin 45 if (! $mnt) {
214     print STDERR "can't mount filesystem!";
215     exit 1;
216     }
217    
218 dpavlin 13 print "Press enter to exit...";
219     my $foo = <STDIN>;
220    
221     $mnt->umount;
222 dpavlin 27
223     =head1 SEE ALSO
224    
225     C<Fuse::DBI> website
226     L<https://www.rot13.org/~dpavlin/fuse_dbi.html>
227    
228     C<FUSE (Filesystem in USErspace)> website
229 dpavlin 36 L<http://fuse.sourceforge.net/>
230 dpavlin 27
231     =head1 AUTHOR
232    
233     Dobrica Pavlinusic, E<lt>dpavlin@rot13.orgE<gt>
234    
235     =head1 COPYRIGHT AND LICENSE
236    
237     Copyright (C) 2004 by Dobrica Pavlinusic
238    
239     This library is free software; you can redistribute it and/or modify
240     it under the same terms as Perl itself, either Perl version 5.8.4 or,
241     at your option, any later version of Perl 5 you may have available.
242    
243     =cut
244    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26