1 | package Greenstone::Directory;
|
---|
2 |
|
---|
3 | use strict;
|
---|
4 | use warnings;
|
---|
5 | use utf8;
|
---|
6 | use base 'Exporter';
|
---|
7 |
|
---|
8 | use File::Path 'remove_tree';
|
---|
9 | use Greenstone::Config;
|
---|
10 |
|
---|
11 | our $VERSION = 1.00;
|
---|
12 | our @EXPORT = ( );
|
---|
13 |
|
---|
14 | sub new {
|
---|
15 | my ($parent, $class, $name, %args) = @_;
|
---|
16 | ref $class and die "Constructor used as object method\n";
|
---|
17 | defined $name or die "Must have a name\n";
|
---|
18 | my $self = bless (
|
---|
19 | {
|
---|
20 | name => $name,
|
---|
21 | parent => $parent,
|
---|
22 | },
|
---|
23 | $class
|
---|
24 | );
|
---|
25 | for my $param (keys %args) {
|
---|
26 | $self->{$param} = $args{$param};
|
---|
27 | }
|
---|
28 | return $self;
|
---|
29 | }
|
---|
30 |
|
---|
31 | sub list {
|
---|
32 | my $parent = shift;
|
---|
33 | ref $parent and die "Static method called on object\n";
|
---|
34 | my $dirs = {};
|
---|
35 | my $dir = "$Greenstone::Config::GSDL3HOME/$parent";
|
---|
36 | opendir DH, $dir or die "Could not open directory '$dir'\n";
|
---|
37 | while (my $entry = readdir DH) {
|
---|
38 | # skip hidden files and current/parent directory
|
---|
39 | $entry =~ /^\./ and next;
|
---|
40 | # skip non-directories
|
---|
41 | -d "$dir/$entry" or next;
|
---|
42 | # We don't really need to store anything more than the fact that the directory exists
|
---|
43 | # So we just store nothing, which is enough to put the key in the hash
|
---|
44 | # (i.e. it acts as a hashset)
|
---|
45 | $dirs->{$entry} = ();
|
---|
46 | }
|
---|
47 | closedir DH;
|
---|
48 | return $dirs;
|
---|
49 | }
|
---|
50 |
|
---|
51 | sub exists {
|
---|
52 | my $self = shift;
|
---|
53 | my $dirs = list $self->{parent};
|
---|
54 | return exists $dirs->{$self->{name}};
|
---|
55 | }
|
---|
56 |
|
---|
57 | sub dir {
|
---|
58 | my $self = shift;
|
---|
59 | return "$Greenstone::Config::GSDL3HOME/$self->{parent}/$self->{name}";
|
---|
60 | }
|
---|
61 |
|
---|
62 | sub create {
|
---|
63 | my $self = shift;
|
---|
64 | if ($self->exists) {
|
---|
65 | print STDERR "Site already exists\n";
|
---|
66 | return 0;
|
---|
67 | }
|
---|
68 | mkdir $self->dir or die "Failed to create directory: $!\n";
|
---|
69 | return 1;
|
---|
70 | }
|
---|
71 |
|
---|
72 | sub delete {
|
---|
73 | my $self = shift;
|
---|
74 | unless ($self->exists) {
|
---|
75 | print STDERR "Site doesn't exist\n";
|
---|
76 | return 0;
|
---|
77 | }
|
---|
78 | remove_tree $self->dir or die "Failed to remove directory: $!\n";
|
---|
79 | return 1;
|
---|
80 | }
|
---|
81 |
|
---|
82 | 1;
|
---|