Hi,
I’m not sure I fully understood your question but to get all the services from a particular host you can use this:
 
$ clapi -o service -a show | grep ';thehostname;' | cut -d';' -f4
and this:
 
$ clapi -o service -a show | grep ';thehostname;' | cut -d';' -f2,4
would give you both the hostname and service for all services of the host (this is probably what you want).
                
     
                                    
            	Hi,
	I’m not sure I fully understood your question but to get all the services from a particular host you can use this:
	 
	$ clapi -o service -a show | grep ';thehostname;' | cut -d';' -f4
	and this:
	 
	$ clapi -o service -a show | grep ';thehostname;' | cut -d';' -f2,4
	would give you both the hostname and service for all services of the host (this is probably what you want).
	  
Hello, thanks a lot for your answer.
When I execute that command on my centreon, I have nothing in answer, no error message, nothing being displayed.. Do you know what can cause that ? 
Moreover, where did you find that command, never saw that in clapi documentation.
 
Thank you !
                
     
                                    
            Hello everyone,
Wishing you a great week, I’m permitting myself to up this topic because I still didn’t find any solution yet :
                
     
                                    
            clapi was the old name of “centreon” (command line api), just use “centreon” instead of clapi, with your username and password like you did in your script
“centreon” should be in your path, but you can also use you “$CLAPI” variable, same thing.
 
For your original question : you have multiple options, for 1-shot massive change like you need, I usually dump all the services in a csv and work a bit in excel, then I do like I explained here :rename host | Community (centreon.com) with a bit of excel concatenation, then a copy/paste of the command in a big script with login/password in variables
 
there are other options of course, like using RestApi and python, but you can keep using bash with knowing how to use arrays and loops
 
For example, first : you can extract a specific list of service for a specific host with the centreon/clapi command and specifiying ‘-v “hostname;” ‘ (the semi colon is important)
no need to grep the whole service dump.
 
Then what you want is to nest a loop for each service, for each host, you can’t run clapi command on a list of services, you need to run each command individually
so :
let’s assume your hostname from the CSV is in a variable, let’s say $HOST (your script is not clear where the hostname is, maybe in $name, not sure)
you do something like this :
--- your script ater ...while
do
  IFS=$'\n' my_services=( $(centreon -u $CENTUSER -p $CENTPASS -o SERVICE -a show -v "$HOST;") )
  for svc in "${my_services[@]}:1"
  do
    SVC=$( echo ${svc} | awk -F  ";" '{print $4}' )
    # now you have $HOST and $SVC, you can put your centreon command here
    echo "$HOST -> $SVC"
  done
done...
---
 
the IFS line will get the csv generate and store a bash array “my_services”, then the for loop syntax is strange but you read each instance of the array but skip the first line, I won’t enter in the syntax more, way too much google to read and i barely understand
then you awk to split the line get the 4th item in the line, the service name, and voila
 
this snippet will echo and do nothing, but the 2 variable host and svc should be sufficient for your need
                
     
                                    
            	clapi was the old name of “centreon” (command line api), just use “centreon” instead of clapi, with your username and password like you did in your script
	“centreon” should be in your path, but you can also use you “$CLAPI” variable, same thing.
	 
	For your original question : you have multiple options, for 1-shot massive change like you need, I usually dump all the services in a csv and work a bit in excel, then I do like I explained here :rename host | Community (centreon.com) with a bit of excel concatenation, then a copy/paste of the command in a big script with login/password in variables
	 
	there are other options of course, like using RestApi and python, but you can keep using bash with knowing how to use arrays and loops
	 
	For example, first : you can extract a specific list of service for a specific host with the centreon/clapi command and specifiying ‘-v “hostname;” ‘ (the semi colon is important)
	no need to grep the whole service dump.
	 
	Then what you want is to nest a loop for each service, for each host, you can’t run clapi command on a list of services, you need to run each command individually
	so :
	let’s assume your hostname from the CSV is in a variable, let’s say $HOST (your script is not clear where the hostname is, maybe in $name, not sure)
	you do something like this :
	--- your script ater ...while
do
  IFS=$'\n' my_services=( $(centreon -u $CENTUSER -p $CENTPASS -o SERVICE -a show -v "$HOST;") )
  for svc in "${my_services[@]}:1"
  do
    SVC=$( echo ${svc} | awk -F  ";" '{print $4}' )
    # now you have $HOST and $SVC, you can put your centreon command here
    echo "$HOST -> $SVC"
  done
done...
---
	 
	the IFS line will get the csv generate and store a bash array “my_services”, then the for loop syntax is strange but you read each instance of the array but skip the first line, I won’t enter in the syntax more, way too much google to read and i barely understand
	then you awk to split the line get the 4th item in the line, the service name, and voila
	 
	this snippet will echo and do nothing, but the 2 variable host and svc should be sufficient for your need
	  
Hello,
Thanks a lot for your answer it is really good.
I don’t know but, when I do this command : centreon -u $CENTUSER -p $CENTPASS -o SERVICE -a show -v "$HOST;"
 
It only gives me this result : 
host id;host name;id;description;check command;check command arg;normal check interval;retry check interval;max check attempts;active checks enabled;passive checks enabled;activate
 
Without the result for the host I precise
Do you know what can cause that ? 
                
     
                                    
            are you sure $HOST contains your host name? as I said, I don’t understand you script and where you get your host name, maybe in your script it is $name, I was not sure
try running the command manually and replace every $xxx by your values 
centreon -u jonn -p mypassw -o SERVICE -a show -v "TEST;" 
this should list you every service of the host TEST
also, add echo of your variable in your script if you are not sure
                
     
                                    
            	are you sure $HOST contains your host name? as I said, I don’t understand you script and where you get your host name, maybe in your script it is $name, I was not sure
	try running the command manually and replace every $xxx by your values 
	centreon -u jonn -p mypassw -o SERVICE -a show -v "TEST;" 
	this should list you every service of the host TEST
	also, add echo of your variable in your script if you are not sure
	 Hello,
My $name is fomr the CSV in the INPUT
And yes, I run that command manually, out of the script : 
centreon -u user -p passw -o SERVICE -a show -v "SERVERNAME;" 
And I’m still getting only this : 
host id;host name;id;description;check command;check command arg;normal check interval;retry check interval;max check attempts;active checks enabled;passive checks enabled;activate
 
Kind regards,
 
 
                
     
                                    
                                    
            Hello, 
I run the command with -v "SERVERNAME;" : i have a list of service
if I run the command with -v "SERVERNAME"  : I have an empty list with just the header like you
if I run the command with a wrong hostname, I also have an empty list 
 
so the only thing I can see is that you pass a wrong hostname, are you sure the hostname in your CSV matches exactly the hostname in centreon?
if you run this:
centreon -u xxx -p xxx -o HOST -a show > list.txt
are you finding your hostname in the file, and is it the exact same name, same upper/lower case?
 
 
                
     
                                    
            	Hello, 
	I run the command with -v "SERVERNAME;" : i have a list of service
	if I run the command with -v "SERVERNAME"  : I have an empty list with just the header like you
	if I run the command with a wrong hostname, I also have an empty list 
	 
	so the only thing I can see is that you pass a wrong hostname, are you sure the hostname in your CSV matches exactly the hostname in centreon?
	if you run this:
	centreon -u xxx -p xxx -o HOST -a show > list.txt
	are you finding your hostname in the file, and is it the exact same name, same upper/lower case?
	 
	 
	 Hello,
Thanks a lot for your help on this topic.
Even with or without the “;” at the end I still have an empty list :( 
And yes, I’m sure about the hostname, I tried with a lot of differents one
And it’s not about the script because I’m trying the command manually out of the script directly on the server
 
                
     
                                    
            Quick question 
What's your centreon version?
                
     
                                    
            	Quick question 
	What's your centreon version?
	 Hello, I have Centreon Engine 19.10.14
                
     
                                    
            ah, well
what I gave you works in 22.x, not sure the syntax was working back then… (you should consider upgrading, I think 19.x is not supported anymore)
 
Anyway,you could do the brute force grep, like stéphane suggested 
 
in the IFS command, instead of 
centreon -u jonn -p mypassw -o SERVICE -a show -v "TEST;" 
you do
centreon -u jonn -p mypassw -o SERVICE -a show | grep “;TEST;”
I didn’t test it, should work 
                
     
                                    
            	ah, well
	what I gave you works in 22.x, not sure the syntax was working back then… (you should consider upgrading, I think 19.x is not supported anymore)
	 
	Anyway,you could do the brute force grep, like stéphane suggested 
	 
	in the IFS command, instead of 
	centreon -u jonn -p mypassw -o SERVICE -a show -v "TEST;" 
	you do
	centreon -u jonn -p mypassw -o SERVICE -a show | grep “;TEST;”
	I didn’t test it, should work 
	 Hello, oh indeed it’s working, I have this result : 
996;TEST;8003;Disk-C;;;;;;2;2;1, and this for every services
Have to find a way to only have the “Disk-C” now ! 
Thanks a lot, don’t know why I didn’t notice that before.. 
 
And yes, I will consider about the upgrade, I need to read some doc to know how I can do that from 19, if it’s safe or no etc… If you have any information I’m not against get them haha