diff options
author | Julian Blake Kongslie <jblake@omgwallhack.org> | 2010-07-07 14:07:06 -0700 |
---|---|---|
committer | Julian Blake Kongslie <jblake@omgwallhack.org> | 2010-07-07 14:07:06 -0700 |
commit | 4fa79cd01321b079ad94c6041038bd3a7dcc0958 (patch) | |
tree | 5c55ffa7d5f06827a18a9c38e953226160530fa9 /usr/src/libpiny | |
parent | 7b243125659e9a13126198b2b790a697552d59e5 (diff) | |
download | piny-code-4fa79cd01321b079ad94c6041038bd3a7dcc0958.tar.gz piny-code-4fa79cd01321b079ad94c6041038bd3a7dcc0958.zip |
Lots more ikiwiki integration stuff in libpiny.
Diffstat (limited to 'usr/src/libpiny')
-rw-r--r-- | usr/src/libpiny/Build.PL | 32 | ||||
-rw-r--r-- | usr/src/libpiny/debian/changelog | 6 | ||||
-rw-r--r-- | usr/src/libpiny/lib/Piny/Environment.pm | 4 | ||||
-rw-r--r-- | usr/src/libpiny/lib/Piny/Group.pm | 30 | ||||
-rw-r--r-- | usr/src/libpiny/lib/Piny/Repo.pm | 183 | ||||
-rw-r--r-- | usr/src/libpiny/lib/Piny/User.pm | 24 | ||||
-rw-r--r-- | usr/src/libpiny/share/ikiwiki.setup | 77 |
7 files changed, 306 insertions, 50 deletions
diff --git a/usr/src/libpiny/Build.PL b/usr/src/libpiny/Build.PL index 09cf3fb..bfb5fd7 100644 --- a/usr/src/libpiny/Build.PL +++ b/usr/src/libpiny/Build.PL @@ -1,10 +1,30 @@ use Module::Build; -Module::Build->new - ( module_name => 'Piny' - , license => 'BSD-3' - , dist_version => '0.6' - , requires => + +open( DCH, "<", "debian/changelog" ) or die "changelog: $!"; + +my $version = "0"; +while ( defined ( my $line = <DCH> ) ) { + if ( $line =~ /\(([0-9.]+)\)/ ) { + $version = $1; + last; + }; +}; + +close( DCH ); + +my $build = Module::Build->new + ( 'module_name' => 'Piny' + , 'dist_version' => $version + , 'license' => 'BSD-3' + , 'setup_files' => { 'share/ikiwiki.setup' => 'share/ikiwiki.setup' } + , 'install_path' => + { 'share' => '/usr/share/libpiny' + } + , 'requires' => { 'Moose' => 0 , 'Email::Valid::Loose' => 0 } - )->create_build_script( ); + ); + +$build->add_build_element( "setup" ); +$build->create_build_script( ); diff --git a/usr/src/libpiny/debian/changelog b/usr/src/libpiny/debian/changelog index df872b4..cc6a89b 100644 --- a/usr/src/libpiny/debian/changelog +++ b/usr/src/libpiny/debian/changelog @@ -1,3 +1,9 @@ +libpiny-perl (0.7) unstable; urgency=low + + * Lots more ikiwiki integration. + + -- Julian Blake Kongslie <jblake@omgwallhack.org> Wed, 07 Jul 2010 13:45:42 -0700 + libpiny-perl (0.6) unstable; urgency=low * Added IkiWiki::FakeSetup for manipulating IkiWiki setup scripts. diff --git a/usr/src/libpiny/lib/Piny/Environment.pm b/usr/src/libpiny/lib/Piny/Environment.pm index 586cce3..fcd4392 100644 --- a/usr/src/libpiny/lib/Piny/Environment.pm +++ b/usr/src/libpiny/lib/Piny/Environment.pm @@ -24,11 +24,11 @@ sub _build_user { if ( defined $ENV{"SUDO_UID"} ) { return Piny::User->new( uid => $ENV{"SUDO_UID"} ); } elsif ( defined $ENV{"SUDO_USER"} ) { - return Piny::User->new( username => $ENV{"SUDO_USER"} ); + return Piny::User->new( name => $ENV{"SUDO_USER"} ); } elsif ( defined $ENV{"UID"} ) { return Piny::User->new( uid => $ENV{"UID"} ); } elsif ( defined $ENV{"USER"} ) { - return Piny::User->new( username => $ENV{"USER"} ); + return Piny::User->new( name => $ENV{"USER"} ); } else { return Piny::User->new( uid => $< ); }; diff --git a/usr/src/libpiny/lib/Piny/Group.pm b/usr/src/libpiny/lib/Piny/Group.pm index a4d3c27..ac064da 100644 --- a/usr/src/libpiny/lib/Piny/Group.pm +++ b/usr/src/libpiny/lib/Piny/Group.pm @@ -15,7 +15,7 @@ has 'gid' => , lazy_build => 1 ); -has 'groupname' => +has 'name' => ( is => 'ro' , isa => 'Str' , lazy_build => 1 @@ -41,7 +41,7 @@ sub add_member { my ( $s, @users ) = @_; foreach my $user ( @users ) { - system( "/usr/sbin/adduser", $user->username( ), $s->groupname( ) ); + system( "/usr/sbin/adduser", $user->name( ), $s->name( ) ); $user->clear_groups( ); }; @@ -52,7 +52,7 @@ sub remove_member { my ( $s, @users ) = @_; foreach my $user ( @users ) { - system( "/usr/sbin/deluser", $user->username( ), $s->groupname( ) ); + system( "/usr/sbin/deluser", $user->name( ), $s->name( ) ); $user->clear_groups( ); }; @@ -62,8 +62,8 @@ sub remove_member { # Builder methods # If constructed with just one argument, then -# * If that argument is numeric, treat it as a UID. -# * Otherwise, treat it as a username. +# * If that argument is numeric, treat it as a GID. +# * Otherwise, treat it as a name. around BUILDARGS => sub { my ( $orig, $class ) = ( shift, shift ); @@ -71,7 +71,7 @@ around BUILDARGS => sub { if ( $_[0] =~ m/^\d+$/ ) { return $class->$orig( gid => $_[0] ); } else { - return $class->$orig( groupname => $_[0] ); + return $class->$orig( name => $_[0] ); }; } else { return $class->$orig( @_ ); @@ -81,12 +81,12 @@ around BUILDARGS => sub { sub BUILD { my ( $s ) = @_; - if ( not ( $s->has_gid( ) or $s->has_groupname( ) ) ) { - die "You must provide either GID or groupname!"; + if ( not ( $s->has_gid( ) or $s->has_name( ) ) ) { + die "You must provide either GID or name!"; }; - if ( $s->has_gid( ) and $s->has_groupname( ) ) { - die "You must not provide both GID and groupname!"; + if ( $s->has_gid( ) and $s->has_name( ) ) { + die "You must not provide both GID and name!"; }; }; @@ -96,7 +96,7 @@ sub _build_gid { return $s->grent( )->[2]; }; -sub _build_groupname { +sub _build_name { my ( $s ) = @_; return $s->grent( )->[0]; @@ -109,9 +109,9 @@ sub _build_grent { my @res = getgrgid( $s->gid( ) ); die "getgrgid( " . $s->gid( ) . " ) failed: $!" unless @res; return \@res; - } elsif ( $s->has_groupname( ) ) { - my @res = getgrnam( $s->groupname( ) ); - die "getgrnam( " . $s->groupname( ) . " ) failed: $!" unless @res; + } elsif ( $s->has_name( ) ) { + my @res = getgrnam( $s->name( ) ); + die "getgrnam( " . $s->name( ) . " ) failed: $!" unless @res; return \@res; } else { die "Not enough information provided to lookup group!"; @@ -122,7 +122,7 @@ sub _build_members { my ( $s ) = @_; return [ ] if ( $s->grent( )->[3] eq "" ); - return [ map { Piny::User->new( username => $_ ) } split( /:/, $s->grent( )->[3] ) ]; + return [ map { Piny::User->new( name => $_ ) } split( /:/, $s->grent( )->[3] ) ]; }; # Moose boilerplate diff --git a/usr/src/libpiny/lib/Piny/Repo.pm b/usr/src/libpiny/lib/Piny/Repo.pm index 84b5bb4..091d59a 100644 --- a/usr/src/libpiny/lib/Piny/Repo.pm +++ b/usr/src/libpiny/lib/Piny/Repo.pm @@ -8,6 +8,8 @@ use Moose::Util::TypeConstraints; use File::Find qw( find ); +use IkiWiki::FakeSetup qw( readSetup writeSetup ); + use Piny::Group; use Piny::User; @@ -85,24 +87,80 @@ has 'globally_writable' => , init_arg => undef ); +has 'ikiwiki_setup' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'ikiwiki_destdir' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'ikiwiki_srcdir' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'url' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'ikiwiki_cgiuri' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'ikiwiki_historyurl' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'ikiwiki_diffurl' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + +has 'ikiwiki_cgipath' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + , init_arg => undef + ); + # Public methods sub add_access { my ( $s, @users ) = @_; - $s->group( )->add_member( @users ); + $s->group->add_member( @users ); }; sub remove_access { my ( $s, @users ) = @_; - $s->group( )->remove_member( @users ); + $s->group->remove_member( @users ); }; sub has_access { my ( $s, $user ) = @_; - return $s->owner( )->uid( ) == $user->uid( ) || $user->has_group( $s->group( ) ); + return $s->owner->uid == $user->uid || $user->has_group( $s->group ); }; # Triggers @@ -117,7 +175,16 @@ sub _rename_repo { rename( $olddir, $newdir ) or die "Couldn't rename $olddir to $newdir: $!"; - $s->clear_path( ); + warn "XXX Not renaming all the ikiwiki stuff!"; + + $s->clear_path; + $s->clear_ikiwiki_setup; + $s->clear_ikiwiki_destdir; + $s->clear_ikiwiki_srcdir; + $s->clear_url; + $s->clear_ikiwiki_cgiurl; + $s->clear_ikiwiki_historyurl; + $s->clear_ikiwiki_cgipath; }; sub _set_description { @@ -125,9 +192,9 @@ sub _set_description { return unless defined $old_description; - open( my $fd, ">", $s->path( ) . "/description" ) or die "Unable to open " . $s->path( ) . "/description for writing: $!"; + open( my $fd, ">", $s->path . "/description" ) or die "Unable to open " . $s->path . "/description for writing: $!"; print $fd $new_description; - close( $fd ) or die "Error when closing " . $s->path( ) . "/description: $!"; + close( $fd ) or die "Error when closing " . $s->path . "/description: $!"; }; sub _change_owner { @@ -135,7 +202,9 @@ sub _change_owner { return unless defined $old_owner; - find( { wanted => sub { chown( $new_owner->uid( ), -1, $_ ) or die "Couldn't chown $_: $!"; }, no_chdir => 1 }, $s->path( ) ); + find( { wanted => sub { chown( $new_owner->uid, -1, $_ ) or die "Couldn't chown $_: $!"; }, no_chdir => 1 }, $s->path ); + + $s->clear_ikiwiki_setup; }; # Class methods @@ -170,13 +239,13 @@ around BUILDARGS => sub { sub _build_group { my ( $s ) = @_; - return Piny::Group->new( groupname => "git-" . $s->name( ) ); + return Piny::Group->new( name => "git-" . $s->name ); }; sub _build_path { my ( $s ) = @_; - my $dir = "/srv/git/" . $s->name( ) . ".git"; + my $dir = "/srv/git/" . $s->name . ".git"; if ( -d $dir ) { return $dir; @@ -188,7 +257,7 @@ sub _build_path { sub _build_description { my ( $s ) = @_; - open( my $d, "<", $s->path( ) . "/description" ) or die "Unable to open " . $s->path( ) . "/description: $!"; + open( my $d, "<", $s->path . "/description" ) or die "Unable to open " . $s->path . "/description: $!"; my $desc; { local $/ = undef; @@ -202,15 +271,15 @@ sub _build_description { sub _build_repostat { my ( $s ) = @_; - my @res = stat( $s->path( ) ); - die "stat( " . $s->path( ) . " ) failed: $!" unless @res; + my @res = stat( $s->path ); + die "stat( " . $s->path . " ) failed: $!" unless @res; return \@res; }; sub _build_owner { my ( $s ) = @_; - my ( $uid ) = $s->repostat( )->[4]; + my ( $uid ) = $s->repostat->[4]; return Piny::User->new( uid => $uid ); }; @@ -218,13 +287,97 @@ sub _build_owner { sub _build_globally_readable { my ( $s ) = @_; - return ( $s->repostat( )->[2] & 0444 ) == 0444; + return ( $s->repostat->[2] & 0444 ) == 0444; }; sub _build_globally_writable { my ( $s ) = @_; - return ( $s->repostat( )->[2] & 0111 ) == 0111; + return ( $s->repostat->[2] & 0111 ) == 0111; +}; + +sub _build_ikiwiki_setup { + my ( $s ) = @_; + + my ( $package, $config ) = readSetup( "/usr/share/libpiny/ikiwiki.setup" ); + + $config->{"wikiname"} = $s->name; + $config->{"adminemail"} = $s->owner->email; + $config->{"srcdir"} = $s->ikiwiki_srcdir; + $config->{"destdir"} = $s->ikiwiki_destdir; + $config->{"url"} = $s->url; + $config->{"cgiurl"} = $s->ikiwiki_cgiurl; + $config->{"historyurl"} = $s->ikiwiki_historyurl; + $config->{"diffurl"} = $s->ikiwiki_diffurl; + + $config->{"wrappers"} = + [ { "wrapper" => $s->ikiwiki_cgipath + , "wrappergroup" => $s->group->name + , "wrappermode" => 06755 + , "cgi" => 1 + } + , { "wrapper" => $s->path . "/hooks/post-update" + , "wrappergroup" => $s->group->name + , "wrappermode" => 06755 + , "notify" => 0 + } + ]; + + return writeSetup( $package, $config ); +}; + +sub _build_ikiwiki_destdir { + my ( $s ) = @_; + + my $dir = "/srv/www/piny.be/" . $s->name; + + if ( -d $dir ) { + return $dir; + } else { + die "Expected destdir $dir does not exist!"; + }; +}; + +sub _build_ikiwiki_srcdir { + my ( $s ) = @_; + + my $dir = "/srv/ikiwiki/" . $s->name; + + if ( -d $dir ) { + return $dir; + } else { + die "Expected srcdir $dir does not exist!"; + }; +}; + +sub _build_url { + my ( $s ) = @_; + + return "http://piny.be/" . $s->name; +}; + +sub _build_ikiwiki_cgiurl { + my ( $s ) = @_; + + return "https://secure.piny.be/repos/" . $s->name . "/ikiwiki.cgi"; +}; + +sub _build_ikiwiki_cgipath { + my ( $s ) = @_; + + return "/srv/www/secure.piny.be/repos/" . $s->name . "/ikiwiki.cgi"; +}; + +sub _build_ikiwiki_historyurl { + my ( $s ) = @_; + + return "https://secure.piny.be/cgit/" . $s->name . "/log/[[file]]"; +}; + +sub _build_ikiwiki_diffurl { + my ( $s ) = @_; + + return "https://secure.piny.be/cgit/" . $s->name . "/diff/?id=[[sha1_commit]]"; }; # Moose boilerplate diff --git a/usr/src/libpiny/lib/Piny/User.pm b/usr/src/libpiny/lib/Piny/User.pm index 559adfd..173b592 100644 --- a/usr/src/libpiny/lib/Piny/User.pm +++ b/usr/src/libpiny/lib/Piny/User.pm @@ -25,7 +25,7 @@ has 'uid' => , lazy_build => 1 ); -has 'username' => +has 'name' => ( is => 'ro' , isa => 'Username' , lazy_build => 1 @@ -100,7 +100,7 @@ sub all_users { eval { my $user = $class->new( uid => $info[2] ); # Some forced early evaluation, so error checking happens now. - $user->username( ); + $user->name( ); $user->email( ); push( @ret, $user ); }; @@ -123,7 +123,7 @@ around BUILDARGS => sub { if ( $_[0] =~ m/^\d+$/ ) { return $class->$orig( uid => $_[0] ); } else { - return $class->$orig( username => $_[0] ); + return $class->$orig( name => $_[0] ); }; } else { return $class->$orig( @_ ); @@ -133,12 +133,12 @@ around BUILDARGS => sub { sub BUILD { my ( $s ) = @_; - if ( not ( $s->has_uid( ) or $s->has_username( ) ) ) { - die "You must provide either UID or username!"; + if ( not ( $s->has_uid( ) or $s->has_name( ) ) ) { + die "You must provide either UID or name!"; }; - if ( $s->has_uid( ) and $s->has_username( ) ) { - die "You must not provide both UID and username!"; + if ( $s->has_uid( ) and $s->has_name( ) ) { + die "You must not provide both UID and name!"; }; }; @@ -148,7 +148,7 @@ sub _build_uid { return $s->pwent( )->[2]; }; -sub _build_username { +sub _build_name { my ( $s ) = @_; return $s->pwent( )->[0]; @@ -161,9 +161,9 @@ sub _build_pwent { my @res = getpwuid( $s->uid( ) ); die "getpwuid( " . $s->uid( ) . " ) failed: $!" unless @res; return \@res; - } elsif ( $s->has_username( ) ) { - my @res = getpwnam( $s->username( ) ); - die "getpwnam( " . $s->username( ) . " ) failed: $!" unless @res; + } elsif ( $s->has_name( ) ) { + my @res = getpwnam( $s->name( ) ); + die "getpwnam( " . $s->name( ) . " ) failed: $!" unless @res; return \@res; } else { die "Not enough information provided to lookup user!"; @@ -193,7 +193,7 @@ sub _build_groups { while ( @ent = getgrent( ) ) { next if ( $ent[3] eq "" ); foreach my $member ( split( / /, $ent[3] ) ) { - if ( $member eq $s->username( ) ) { + if ( $member eq $s->name( ) ) { push @res, Piny::Group->new( gid => $ent[2] ); last; }; diff --git a/usr/src/libpiny/share/ikiwiki.setup b/usr/src/libpiny/share/ikiwiki.setup new file mode 100644 index 0000000..4cba4b2 --- /dev/null +++ b/usr/src/libpiny/share/ikiwiki.setup @@ -0,0 +1,77 @@ +#!/usr/bin/perl +# Configuration file for ikiwiki. +# Passing this to ikiwiki --setup will make ikiwiki generate wrappers and +# build the wiki. +# +# Remember to re-run ikiwiki --setup any time you edit this file. + +use IkiWiki::Setup::Standard { + # wikiname => "', # LATER MODIFIED BY LATER MODIFIED BY PINY + # adminemail => "', # LATER MODIFIED BY LATER MODIFIED BY PINY + # srcdir => "', # LATER MODIFIED BY PINY + # destdir => "', # LATER MODIFIED BY PINY + # url => "', # LATER MODIFIED BY PINY + # cgiurl => "', # LATER MODIFIED BY PINY + # historyurl => "', # LATER MODIFIED BY PINY + # diffurl => "', # LATER MODIFIED BY PINY + + templatedir => "/srv/templates", # TODO: user-customizable templates + underlaydir => "/etc/ikiwiki/share/underlay", + + rcs => "git", + gitorigin_branch => "origin", + gitmaster_branch => "master", + + # wrappers => [ ], controlled by piny + + # Generate rss feeds for blogs? + rss => 1, + # Generate atom feeds for blogs? + atom => 0, + # Include discussion links on all pages? + discussion => 0, + # To exclude files matching a regexp from processing. This adds to + # the default exclude list. + #exclude => qr/*\.wav/, + # To change the extension used for generated html files. + #htmlext => "htm", + # Time format (for strftime) + #timeformat => "%c", + # Locale to use. Must be a UTF-8 locale. + #locale => "en_US.UTF-8", + # Only send cookies over SSL connections. + sslcookie => 1, + # Logging settings: + verbose => 0, + syslog => 1, + # To link to user pages in a subdirectory of the wiki. + #userdir => "users", + # To create output files named page.html rather than page/index.html. + usedirs => 1, + # Simple spam prevention: require an account-creation password. + #account_creation_password => "example", + # Use new "!"-prefixed preprocessor directive syntax + prefix_directives => 1, + httpauth => 1, + # To add plugins, list them here. + add_plugins => [qw{sidebar toc meta table tag graphviz httpauth img attachment rename remove map teximg version edittemplate}], + disable_plugins => [qw{openid passwordauth}], + teximg_prefix => "\\documentclass{scrartcl} +\\usepackage[version=3]{mhchem} +\\usepackage{amsmath} +\\usepackage{amsfonts} +\\usepackage{amssymb} +\\pagestyle{empty} +\\newcommand{\\unit}[1]{\\ensuremath{\\, \\mathrm{#1}}} +\\begin{document}", + + teximg_dvipng => 1, + + # For use with the tag plugin, make all tags be located under a + # base page. + tagbase => "tag", + + # For use with the search plugin if your estseek.cgi is located + # somewhere else. + #estseek => "/usr/lib/estraier/estseek.cgi", +}; |