update to 2.3.8, add agent config

This commit is contained in:
Sergey Zhemoitel 2014-07-28 21:39:24 +04:00
parent 7ac37329d0
commit d39aee1ab6
3 changed files with 417 additions and 14 deletions

View file

@ -1,2 +1,4 @@
removed_sources:
FusionInventory-Agent-2.1.9.tar.gz: 01e14f27f5c4339abc71338203b2308cf3af7968
sources:
"FusionInventory-Agent-2.1.9.tar.gz": 01e14f27f5c4339abc71338203b2308cf3af7968
FusionInventory-Agent-2.3.8.tar.gz: 3511183b65a0957204d6bab6c447971a1e651239

392
fusioninventory-agent-config Executable file
View file

@ -0,0 +1,392 @@
#!/usr/bin/perl -w
use strict;
use lib 'lib';
use File::Path;
use UNIVERSAL::require;
use FusionInventory::Agent::Config;
# DEB/RPM/... maintainers, turn this to '1'
my $packaged = 0;
my $config;
my @cacert;
my $randomtime;
my $cron_line;
sub loadModules {
my @modules = @_;
foreach my $module (@modules) {
$module->require();
$module->import();
if ($@) {
print STDERR "Failed to load '$module': $@. Please install it and ".
"restart the fusioninventory-agent-config script.\n";
exit 1;
}
}
}
sub ask_yn {
my $promptUser = shift;
my $default = shift;
die unless $default =~ /^(y|n)$/;
my $cpt = 5;
while (1) {
my $line = prompt("$promptUser\nPlease enter 'y' or 'n'?>", $default);
return 1 if $line =~ /^y$/;
return if $line =~ /^n$/;
if ($cpt-- < 0) {
print STDERR "to much user input, exit...\n";
exit(0);
}
}
}
sub promptUser {
my ($promptUser, $default, $regex, $notice) = @_;
my $string = $promptUser;
$string .= "?>";
my $line;
my $cpt = 5;
while (1) {
$line = prompt($string, $default);
if ($regex && $line !~ /$regex/) {
print STDERR $notice."\n";
} else {
last;
}
if ($cpt-- < 0) {
print STDERR "to much user input, exit...\n";
exit(0);
}
}
return $line;
}
sub pickConfigdir {
my ($args) = @_;
my $dirs = $args->{dirs};
my $files = $args->{files};
foreach my $dir (@$dirs) {
foreach my $file (@$files) {
my $t = $dir.'/'.$file;
if (-f $t) {
return $dir."/".$file;
}
}
}
}
sub mkFullServerUrl {
my $server = shift;
my $ret = 'http://' unless $server =~ /^http(s|):\/\//;
$ret .= $server;
if ($server !~ /http(|s):\/\/\S+\/\S+/) {
$ret .= '/ocsinventory';
}
return $ret;
}
####################################################
################### main ###########################
####################################################
loadModules (qw/XML::Simple ExtUtils::MakeMaker/);
if (!ask_yn("Do you want to configure the agent", 'y')) {
exit 0;
}
my $defaultConfigDir = "/etc/fusioninventory";
my $defaultCfgFile = "agent.cfg";
my $newConfigFile = pickConfigdir ({
dirs => [
$defaultConfigDir,
"/usr/local/etc/fusioninventory"
],
files => [$defaultCfgFile]
});
my $ocsConfigFile = pickConfigdir ({
dirs => [
"/etc/ocsinventory",
"/usr/local/etc/ocsinventory",
"/etc/ocsinventory-agent"
],
files => ['ocsinventory-agent.cfg']
});
my $oldOcsConfigdir = "/etc/ocsinventory-client";
if (!-d $defaultConfigDir) {
if (ask_yn ("Do you want to create the directory ".
$defaultConfigDir."?", 'y')) {
if (!mkdir $defaultConfigDir) {
print "Failed to create ".$defaultConfigDir.". Are you root?\n";
exit 1;
}
} else {
print "Please create the ".$defaultConfigDir." directory first.\n";
exit 1;
}
}
if (-f $oldOcsConfigdir.'/ocsinv.conf' && ask_yn("Should the old linux_agent settings be imported?", 'y')) {
my $ocsinv = XMLin($oldOcsConfigdir.'/ocsinv.conf');
$config->{server} = mkFullServerUrl($ocsinv->{'OCSFSERVER'});
if (-f $oldOcsConfigdir.'/cacert.pem') {
open CACERT, $oldOcsConfigdir.'/cacert.pem' or die "Can'i import the CA certificat: ".$!;
@cacert = <CACERT>;
close CACERT;
}
my $admcontent = '';
if (-f "$oldOcsConfigdir/ocsinv.adm") {
if (!open(ADM, "<:encoding(iso-8859-1)", "$oldOcsConfigdir/ocsinv.adm")) {
warn "Can't open $oldOcsConfigdir/ocsinv.adm";
} else {
$admcontent .= $_ foreach (<ADM>);
close ADM;
my $admdata = XMLin($admcontent) or die;
if (ref ($admdata->{ACCOUNTINFO}) eq 'ARRAY') {
foreach (@{$admdata->{ACCOUNTINFO}}) {
$config->{tag} = $_->{KEYVALUE} if $_->{KEYNAME} =~ /^TAG$/;
}
} elsif (
exists($admdata->{ACCOUNTINFO}->{KEYNAME}) &&
exists($admdata->{ACCOUNTINFO}->{KEYVALUE}) &&
$admdata->{ACCOUNTINFO}->{KEYNAME} eq 'TAG'
) {
print $admdata->{ACCOUNTINFO}->{KEYVALUE}."\n";
$config->{tag} = $admdata->{ACCOUNTINFO}->{KEYVALUE};
}
}
}
}
foreach ($newConfigFile, $ocsConfigFile) {
if (-f $_) {
open (CONFIG, "<".$_) or
die "Can't open ".$_.": ".$!;
print "Load settings from $_\n";
foreach (<CONFIG>) {
s/#.+//;
if (/(\w+)\s*=\s*(.+)/) {
my $key = $1;
my $val = $2;
# Remove the quotes
$val =~ s/\s+$//;
$val =~ s/^'(.*)'$/$1/;
$val =~ s/^"(.*)"$/$1/;
$config->{$key} = $val;
}
}
close CONFIG;
last;
}
}
print "[info] The config file will be written in $defaultConfigDir/$defaultCfgFile,\n";
my $tmp = promptUser('What are the address of your inventory servers? You can enter a list of multiple servers separated by a comma (,).', exists
($config->{server})?$config->{server}:'http://ocsinventory-ng/ocsinventory');
$config->{server} = mkFullServerUrl($tmp);
if (!$config->{server}) {
print "Server is empty. Leaving...\n";
exit 1;
}
if (ask_yn ("Do you need credential for the server? (You probably don't)", 'n')) {
$config->{user} = promptUser("user", $config->{user});
$config->{password} = promptUser("password");
print "[info] The realm can be found in the login popup of your Internet browser.\n[info] In general, it's something like 'Restricted Area'.\n";
$config->{realm} = promptUser("realm");
} else {
delete ($config->{user});
delete ($config->{password});
delete ($config->{realm});
}
if (ask_yn('Do you want to apply an administrative tag on this machine', 'y')) {
$config->{tag} = promptUser("tag", $config->{tag});
} else {
delete($config->{tag});
}
chomp(my $binpath = `which fusioninventory-agent 2>/dev/null`);
print $binpath."\n";
if (! -x $binpath) {
# Packaged version with perl and agent ?
$binpath = $^X;
$binpath =~ s/perl/fusioninventory-agent/;
}
if (! -x $binpath) {
print "sorry, can't find fusioninventory-agent in \$PATH\n";
exit 1;
} else {
print "FusionInventory Agent found: $binpath\n";
}
if (!$packaged) {
$randomtime = int(rand(60)).' '.int(rand(24));
$cron_line = $randomtime." * * * root $binpath --lazy > /dev/null 2>&1\n";
if ($^O =~ /solaris/) {
if (ask_yn("Do yo want to install the cron task in current user crontab ?", 'y')) {
my $crontab = `crontab -l`;
# Let's suppress Linux cron/anacron user column
$cron_line =~ s/ root / /;
$crontab .= $cron_line;
open CRONP, "| crontab" || die "Can't run crontab: $!";
print CRONP $crontab;
close(CRONP);
}
}
elsif (-d "/etc/cron.d") {
if (ask_yn("Do yo want to install the cron task in /etc/cron.d", 'y')) {
open DEST, '>/etc/cron.d/fusioninventory-agent' or die $!;
# Save the root PATH
print DEST "PATH=".$ENV{PATH}."\n";
print DEST $randomtime." * * * root $binpath --lazy > /dev/null 2>&1\n";
close DEST;
}
}
my $old_vardir;
my $default_vardir = $config->{basevardir};
if ($^O =~ /solaris/) {
$default_vardir = '/var/opt/fusioninventory-agent';
$old_vardir = '/var/opt/ocsinventory-agent';
} else {
$default_vardir = '/var/lib/fusioninventory-agent';
$old_vardir = '/var/lib/ocsinventory-agent';
}
$config->{basevardir} = promptUser('Where do you want the agent to store its files? (You probably don\'t need to change it)', exists ($config->{basevardir})?$config->{basevardir}:$default_vardir, '^\/\w+', 'The location must begin with /');
if (!-d $config->{basevardir}) {
if (ask_yn ("Do you want to create the ".$config->{basevardir}." directory?\n", 'y')) {
mkdir $config->{basevardir} or die $!;
} else {
print "Please create the ".$config->{basevardir}." directory\n";
exit 1;
}
}
if (-d $config->{basevardir} && !-d $default_vardir && ask_yn("Do yo want to ".
"migration $old_vardir for FusionInventory Agent", 'y')) {
system('mv', $old_vardir, $default_vardir);
}
my @oldFiles = qw(
/etc/ocsinventory-client
/etc/logrotate.d/ocsinventory-agent
/etc/logrotate.d/ocsinventory-client
/usr/sbin/ocsinventory-agent
/usr/bin/ocsinventory-agent
/usr/sbin/ocsinventory-client.pl
/etc/cron.d/ocsinventory-client
/bin/ocsinv);
my $doCleanUp;
foreach (@oldFiles) {
if (-f||-d||-l) {
$doCleanUp=1;
last;
}
}
if ($doCleanUp && ask_yn ("Should I remove the Ocsinventory Agent files", 'n')) {
foreach (@oldFiles) {
next unless -f;
print $_."\n";
rmdir if -d;
unlink if -f || -l;
}
print "done\n"
}
# Create the vardirectory for this server
my $dir = $config->{server};
$dir =~ s/\//_/g;
$dir =~ s/:/../g if $^O =~ /^MSWin/; # Conditional because there is
my $vardir = $config->{basevardir}."/".$dir;
if (!-d $vardir && !mkpath($vardir)) {
die "Can't create $vardir!";
}
if (@cacert) { # we need to migrate the certificat
open CACERT, ">".$vardir."/cacert.pem" or die "Can't open ".$vardir.'/cacert.pem: '.$!;
print CACERT foreach (@cacert);
close CACERT;
print "Certificat copied in ".$vardir."/cacert.pem\n";
}
}
open CONFIG, ">$defaultConfigDir/$defaultCfgFile" or die "Can't write the config file in $defaultConfigDir/$defaultCfgFile: ".$!;
print CONFIG $_."=".$config->{$_}."\n" foreach (keys %$config);
close CONFIG;
chmod 0600, "$defaultConfigDir/$defaultCfgFile";
if (ask_yn("Do you want to send an inventory of this machine?", 'y')) {
system("$binpath --force");
}
print "################################\n";
print "New settings written! Thank you for using FusionInventory!\n";
print " http://www.FusionInventory.org\n";
__END__
=head1 NAME
fusioninventory-agent-config - FusionInventory Agent configuration script
=head1 SYNOPSIS
B<fusioninventory-agent-config>

View file

@ -3,17 +3,21 @@
%endif
Name: fusioninventory-agent
Version: 2.1.9
Release: 4
Version: 2.3.8
Release: 2
Summary: Linux agent for OCSNG
License: GPL
Group: System/Servers
URL: http://fusioninventory.org/wordpress/
Source0: http://search.cpan.org/CPAN/authors/id/F/FU/FUSINV/FusionInventory-Agent-%{version}.tar.gz
Source1: %{name}.init
BuildArch: noarch
Source2: %{name}-config
BuildArch: noarch
Requires: perl-Net-SSLeay
BuildRequires: perl-devel
BuildRequires: perl-devel
BuildRequires: perl-Proc-Daemon
BuildRequires: perl(Module::Install)
BuildRequires: perl(Module::CoreList)
%description
FusionInventory-Agent is an agent for OCS NG & GLPI.
@ -22,7 +26,7 @@ FusionInventory-Agent is an agent for OCS NG & GLPI.
%setup -q -n FusionInventory-Agent-%{version}
%build
%__perl Makefile.PL INSTALLDIRS=vendor
%__perl Makefile.PL INSTALLDIRS=vendor PREFIX=/usr SYSCONFDIR=/etc/fusioninventory
%make
%install
@ -54,22 +58,27 @@ EOF
install -d -m 755 %{buildroot}%{_initrddir}
install -m 755 %{SOURCE1} %{buildroot}%{_initrddir}/fusioninventory-agent
install -d -m 755 %{buildroot}%{_bindir}
install -m 755 %{SOURCE2} %{buildroot}%{_bindir}/%{name}-config
install -d -m 755 %{buildroot}%{_localstatedir}/log/%{name}
install -d -m 755 %{buildroot}%{_localstatedir}/lib/%{name}
%files
%doc AUTHORS Changes THANKS LICENSE
%{_bindir}/fusioninventory-agent
%{_bindir}/fusioninventory-agent-config
%{_bindir}/fusioninventory-injector
%doc README Changes THANKS LICENSE
#{_bindir}/fusioninventory-agent
#{_bindir}/fusioninventory-agent-config
%{_bindir}/fusioninventory-*
%{_mandir}/man1/*
%{_mandir}/man3/*
%{perl_vendorlib}/FusionInventory
%{perl_vendorlib}/auto/share/dist/FusionInventory-Agent
#{_mandir}/man3/*
%{_datadir}/fusioninventory
#{_sysconfdir}/fusioniventory/agent.cfg
#{perl_vendorlib}/FusionInventory
#{perl_vendorlib}/auto/share/dist/FusionInventory-Agent
%{_localstatedir}/log/fusioninventory-agent
%{_localstatedir}/lib/fusioninventory-agent
%config(noreplace) %{_sysconfdir}/sysconfig/fusioninventory-agent
%config(noreplace) %{_sysconfdir}/logrotate.d/fusioninventory-agent
%config(noreplace) %{_sysconfdir}/cron.daily/fusioninventory-agent
%{_initrddir}/fusioninventory-agent
%config(noreplace) %{_sysconfdir}/fusioninventory/agent.cfg