### ### Copyright 2000-2007 University of Illinois Board of Trustees ### All rights reserved. ### ### PSGConf::Action::ChMod - chmod file action type for psgconf ### ### Campus Information Technologies and Educational Services ### University of Illinois at Urbana-Champaign ### package PSGConf::Action::ChMod; use strict; use File::stat; use PSGConf::Action; our @ISA = qw(PSGConf::Action); ############################################################################### ### constructor ############################################################################### sub new { my ($class, %opts) = @_; my ($self) = \%opts; $self->{mode} = 0644 if (!exists($self->{mode})); return PSGConf::Action::new($class, %$self); } ############################################################################### ### check method ############################################################################### sub check { my ($self, $psgconf) = @_; return if ($self->{mode} == -1); $self->{stat} = stat($self->{name}); ### check permissions $self->{changed} = 1 if (!defined $self->{stat} || ($self->{stat}->mode & 07777) != $self->{mode}); return $self->{changed}; } ############################################################################### ### diff method ############################################################################### sub diff { my ($self, $psgconf) = @_; return if ($self->{mode} == -1); $self->{stat} = stat($self->{name}); if (!defined $self->{stat} || ($self->{stat}->mode & 07777) != $self->{mode}) { print "###############################################################################\n"; print "### DIFF FOR $self->{name}\n"; print "###############################################################################\n"; printf "+ MODE CHANGE: %04o -> %04o\n\n", (!defined $self->{stat})? 0: ($self->{stat}->mode & 07777), $self->{mode}; } } ############################################################################### ### do() method ############################################################################### sub do { my ($self, $psgconf) = @_; return if ($self->{mode} == -1); $self->{stat} = stat($self->{name}); ### check permissions if (!defined $self->{stat} || ($self->{stat}->mode & 07777) != $self->{mode}) { if (!chmod($self->{mode}, $self->{name})) { warn "\t!!! chmod(\"$self->{name}\"): $!\n"; return -1; } } return 1; } ############################################################################### ### documentation ############################################################################### 1; __END__ =head1 NAME PSGConf::Action::ChMod - chmod file action type for psgconf =head1 SYNOPSIS use PSGConf::Action::ChMod; $psgconf->register_actions( PSGConf::Action::ChMod->new( 'name' => '/path/to/file', 'mode' => 'mode of file', ... ), ... ); =head1 DESCRIPTION The B module provides a B action class for changing a file's mode. The default mode is C<0644> and C<-1> means ignore the mode of the file. The B class is derived from the B class, but it defines/overrides the following methods: =over 4 =item check() If the file mode is correct, returns 0. Otherwise, returns 1. =item diff() Displays a message indicating that the file needs to be chmod()ed. =item do() Actually calls chmod(). =back =head1 SEE ALSO L Cchmod(1)E> L L =cut