/
default.rb
96 lines (80 loc) · 2.9 KB
/
default.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Puppet::Type.type(:cpan).provide( :default ) do
@doc = "Manages cpan modules"
commands :cpan => 'cpan'
commands :perl => 'perl'
confine :osfamily => [:Debian, :RedHat, :Windows]
ENV['PERL_MM_USE_DEFAULT'] = '1'
def install
end
def force
end
def latest?
if resource[:local_lib]
ll = "-Mlocal::lib=#{resource[:local_lib]}"
end
current_version=`perl #{ll} -M#{resource[:name]} -e 'print $#{resource[:name]}::VERSION'`
cpan_str=`perl #{ll} -e 'use CPAN; my $mod=CPAN::Shell->expand("Module","#{resource[:name]}"); printf("%s", $mod->cpan_version eq "undef" || !defined($mod->cpan_version) ? "-" : $mod->cpan_version);'`
latest_version=cpan_str.match(/^[0-9]+.?[0-9]*$/)[0]
current_version.chomp
latest_version.chomp
if current_version < latest_version
return false else return true end
end
def create
Puppet.info("Installing cpan module #{resource[:name]}")
if resource[:local_lib]
ll = "-Mlocal::lib=#{resource[:local_lib]}"
end
umask = "umask #{resource[:umask]};" if resource[:umask]
Puppet.debug("cpan #{resource[:name]}")
if resource.force?
Puppet.info("Forcing install for #{resource[:name]}")
system("#{umask} yes | perl #{ll} -MCPAN -e 'CPAN::force CPAN::install #{resource[:name]}'")
else
system("#{umask} yes | perl #{ll} -MCPAN -e 'CPAN::install #{resource[:name]}'")
end
#cpan doesn't always provide the right exit code, so we double check
system("perl #{ll} -M#{resource[:name]} -e1 > /dev/null 2>&1")
estatus = $?.exitstatus
if estatus != 0
raise Puppet::Error, "cpan #{resource[:name]} failed with error code #{estatus}"
end
end
def destroy
end
def update
Puppet.info("Upgrading cpan module #{resource[:name]}")
Puppet.debug("cpan #{resource[:name]}")
if resource[:local_lib]
ll = "-Mlocal::lib=#{resource[:local_lib]}"
end
umask = "umask #{resource[:umask]};" if resource[:umask]
if resource.force?
Puppet.info("Forcing upgrade for #{resource[:name]}")
system("#{umask} yes | perl #{ll} -MCPAN -e 'CPAN::force CPAN::install #{resource[:name]}'")
else
system("#{umask} yes | perl #{ll} -MCPAN -e 'CPAN::install #{resource[:name]}'")
end
estatus = $?.exitstatus
if estatus != 0
raise Puppet::Error, "CPAN::install #{resource[:name]} failed with error code #{estatus}"
end
end
def exists?
if resource[:local_lib]
ll = "-Mlocal::lib=#{resource[:local_lib]}"
end
Puppet.debug("perl #{ll} -M#{resource[:name]} -e1 > /dev/null 2>&1")
output = `perl #{ll} -M#{resource[:name]} -e1 > /dev/null 2>&1`
estatus = $?.exitstatus
case estatus
when 0
true
when 2
Puppet.debug("#{resource[:name]} not installed")
false
else
raise Puppet::Error, "perl #{ll} -M#{resource[:name]} -e1 failed with error code #{estatus}: #{output}"
end
end
end