From d39aee1ab68305c143809887a09152112773b4e1 Mon Sep 17 00:00:00 2001 From: Sergey Zhemoitel Date: Mon, 28 Jul 2014 21:39:24 +0400 Subject: [PATCH] update to 2.3.8, add agent config --- .abf.yml | 4 +- fusioninventory-agent-config | 392 +++++++++++++++++++++++++++++++++++ fusioninventory-agent.spec | 35 ++-- 3 files changed, 417 insertions(+), 14 deletions(-) create mode 100755 fusioninventory-agent-config diff --git a/.abf.yml b/.abf.yml index adb2a28..b7a259e 100644 --- a/.abf.yml +++ b/.abf.yml @@ -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 diff --git a/fusioninventory-agent-config b/fusioninventory-agent-config new file mode 100755 index 0000000..24bfc73 --- /dev/null +++ b/fusioninventory-agent-config @@ -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 = ; + 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 (); + 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 () { + 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 + + diff --git a/fusioninventory-agent.spec b/fusioninventory-agent.spec index 405376b..9267304 100644 --- a/fusioninventory-agent.spec +++ b/fusioninventory-agent.spec @@ -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