View Single Post
Old 09-14-2009, 11:36 AM   #6
ISPsystem team
 
Join Date: Jan 2009
Posts: 111
GakcaT is on a distinguished road
Default

This small example reads information about services from /tmp/services.txt and allows to stop/start/edit the services. Also you can add/delete services with the plugin.
1) Add information about services to /tmp/services.txt. For example:
httpd /etc/init.d/httpd
mysqld /etc/init.d/mysqld

2) The content of ispmgr_mod_myplugin.xml file:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
        <handler name="servstate.pl" type="cgi">
                <func>service_management</func>
                <func>service_management.start</func>
                <func>service_management.stop</func>
                <func>service_management.edit</func>
                <func>service_management.delete</func>
        </handler>

        <mainmenu level="7">
                <node name="tool">
                        <node name="service_management"/>
                </node>
        </mainmenu>

        <metadata name="service_management" type="list" key="item">
                <toolbar>
                        <toolbtn func="service_management.edit" type="new" img="t-new" name="new"/>
                        <toolbtn func="service_management.edit" type="edit" img="t-edit" name="edit" default="yes"/>
                        <toolbtn func="service_management.start" type="group" img="t-start" name="start"/>
                        <toolbtn func="service_management.stop" type="group" img="t-stop" name="stop"/>
                        <toolbtn func="service_management.delete" type="group" img="t-delete" name="delete"/>
                </toolbar>
                <coldata>
                        <col sort="alpha" sorted="yes" name="item" type="data"/>
                        <col name="service_status" sort="status">
                                <prop name="active" onimg="p-on" defimg="p-off" stat="yes"/>
                        </col>
                </coldata>
        </metadata>
        <metadata name="service_management.edit" type="form">
                <form>
                        <field name="item">
                                <input type="text" name="item"/>
                        </field>
                        <field name="init_info">
                                <input type="text" name="init_info"/>
			</field>
                </form>
        </metadata>

        <lang name="en">
                <messages name="desktop">
                        <msg name="menu_service_management">Testing service</msg>
                </messages>
                <messages name="service_management">
                        <msg name="msg_service_management_start">Do you really want to start the services?</msg>
                        <msg name="msg_service_management_stop">Do you really want to stop the services?</msg>
                        <msg name="msg_service_management_delete">Do you really want to delete the services?</msg>
                </messages>
                <messages name="service_management.edit">
                        <msg name="title">Service properties</msg>
                        <msg name="item">Service name</msg>
                        <msg name="init_info">Path to start script</msg>
                </messages>
        </lang>
        <lang name="ru">
                <messages name="desktop">
                        <msg name="menu_service_management">Тестовый модуль</msg>
                </messages>
                <messages name="service_management.edit">
                        <msg name="title">Свойства службы</msg>
                        <msg name="item">Служба</msg>
                        <msg name="init_info">Путь к скрипту запуска</msg>
                </messages>
                 <messages name="service_management">
                        <msg name="msg_service_management_start">Вы действительно хотите запустить службы?</msg>
                        <msg name="msg_service_management_stop">Вы действительно хотите остановить службы?</msg>
                         <msg name="msg_service_management_delete">Вы действительно хотите удалить службы?</msg>
                 </messages>
        </lang>
</mgrdata>
Quote:
Originally Posted by getnetworks
When the page loads, all buttons are disabled, and when we click on the single item in the column data, the buttons activate, but if we click on any of the buttons, nothing happens.
As I think your buttons don't work because you didn't add the messages for them. For example:
<msg name="msg_service_management_start">Do you really want to start the services?</msg>


3) The content of servstate.pl:
Code:
#!/usr/bin/perl

use CGI;

$Q = new CGI;

$func = $Q->param("func");

print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
print "<doc>";

if ($func eq "service_management") {	
	&List;
} elsif ($func eq "service_management.start") {
	&Start;
} elsif ($func eq "service_management.stop") {
	&Stop;
} elsif ($func eq "service_management.delete") {	
	&Delete;
} elsif ($func eq "service_management.edit") {
	if ($Q->param("sok")) {
		if ($Q->param("elid")) {			
			&Set;
		} else {			
			&New;
		}
		print "<ok/>";
	} else {		 
		&Get;
	}
}
	
print "</doc>";
exit 0;

sub List {
	if (open(IN, "/tmp/services.txt")) {
		while (<IN>) {
			chomp;
			@Service_Info = split(/ /);
			$Service_Name = $Service_Info[0];
			open(PS_OUT, "ps -e | grep $Service_Name |") or print "<error>Can't execute 'ps'</error>";
			while (<PS_OUT>) {
				$output .= $_;;
			}
			if (index($output, $Service_Name) != -1) {
				print "<elem><item>$Service_Name</item><active/></elem>";
			} else {
				print "<elem><item>$Service_Name</item></elem>";
			}			
		}
		close(IN);
	}
}

sub Get {
	$elid = $Q->param("elid");
	
	if ($elid) {
		if (open(IN, "/tmp/services.txt")) {
			while (<IN>) {
				chomp;				
				@Service_Info = split(/ /);				
				if ($Service_Info[0] eq $elid) {
					print "<elid>$elid</elid><item>$elid</item><init_info>$Service_Info[1]</init_info>";
				}				
			}
			close(IN);
		}		
	}
}

sub Set {
	$item = $Q->param("item");
	$init_info = $Q->param("init_info");
	if (open(IN, "/tmp/services.txt")) {
		if (open(OUT, ">/tmp/services_new.txt")) {
			for (<IN>) {
				chomp;
				@Service_Info = split(/ /);
				if ($Service_Info[0] eq $item) {
					print OUT "$item $init_info\n";
				} else {
					print OUT "$_\n";
				}
			}
			print "<ok/>";
			close(OUT);
			close(IN);	
			rename("/tmp/services_new.txt", "/tmp/services.txt");		
		}		
	} else {
		print "<error>Can't update info</error>";
	}		
}

sub New {
	$item = $Q->param("item");
	$init_info = $Q->param("init_info");
	if (open(ADD, ">>/tmp/services.txt")) {
		print ADD "$item $init_info\n";
		close(ADD);
		print "<ok/>";		
	} else {
		print "<error>Item wasn't added</error>";
	}
}

sub Delete {
	$elid = $Q->param("elid");
	if (open(IN, "/tmp/services.txt")) {
		if (open(OUT, ">/tmp/services_new.txt")) {
			for (<IN>) {				
				chomp;
				@Service_Info = split(/ /);
				print OUT "$_\n" if ($Service_Info[0] ne $elid);				
			}
			close(OUT);
		}
		close(IN);
	}	
	
	rename("/tmp/services_new.txt", "/tmp/services.txt");
	print "<ok/>";
}

sub Start {
	$elid = $Q->param("elid");
	if (open(IN, "/tmp/services.txt")) {
		while (<IN>) {
			chomp;				
			@Service_Info = split(/ /);
			if ($elid eq $Service_Info[0]) {				
				if (open(START_OUT, "$Service_Info[1] start |")) {
					print "<ok/>";
				} else {
					print "<error>Can't start the application!</error>";
				}
			}		
		}
		close(IN);
	}		
}

sub Stop {
	$elid = $Q->param("elid");
	if (open(IN, "/tmp/services.txt")) {
		while (<IN>) {
			chomp;				
			@Service_Info = split(/ /);
			if ($elid eq $Service_Info[0]) {
				if (open(START_OUT, "$Service_Info[1] stop |")) {
					print "<ok/>";
				} else {
					print "<error>Can't stop the application!</error>";
				}
			}		
		}
		close(IN);
	}	
}
Quote:
Originally Posted by getnetworks
Ideally, we'd like for the system to recognize that the item is 'running' (we have a status in one of our columns) and then only activate the stop/restart buttons if it is running. If the status is reporting 'stopped', then only the start/restart buttons activate.
There are some restrictions in ISPmanager. It's impossible to change buttons activity.

Last edited by GakcaT; 09-17-2009 at 03:30 AM.
GakcaT is offline   Reply With Quote