#include "sysadm-servicemanager.h" #include "sysadm-general.h" #include #include using namespace sysadm; ServiceManager::ServiceManager(QString chroot, QString ip) { this->chroot = chroot; this->ip = ip; usingOpenRC = QFile::exists(chroot+"/sbin/rc-update"); loadRCdata(); //loadServices(); } Service ServiceManager::GetService(QString serviceName) { if(!services.isEmpty()){ for(int i=0; i ServiceManager::GetServices() { if(services.isEmpty()){ loadServices(); } return services; } // look at rcdata now QList ServiceManager::isRunning(QList services){ //return list in the same order as the input list QList out; for(int i=0; i run = isRunning( QList() << service); if(!run.isEmpty()){ return run.first(); } else{ return false; } } // see if service is in rcdata and not in unuseddata QList ServiceManager::isEnabled(QList services){ //return list in the same order as the input list QList out; //Now go through the list of services and report which ones are enabled for(int i=0; i use = isEnabled( QList() << service); if(!use.isEmpty()){ return use.first(); } else{ return false; } } // onestart doesn't matter anymore bool ServiceManager::Start(Service service) { if(service.Directory.isEmpty()){ return false; } // Start the process QString prog; QStringList args; bool once = !isEnabled(service) && !usingOpenRC; if ( chroot.isEmpty() ) { prog = "service"; args << service.Directory; args << (once ? "onestart" : "start") ; } else { prog = "warden"; args << "chroot" << ip << "service" << service.Directory << (once ? "onestart" : "start" ); } return General::RunQuickCommand(prog,args); } // onestop doesn't matter anymore bool ServiceManager::Stop(Service service) { if(service.Directory.isEmpty()){ return false; } // Start the process QString prog; QStringList args; bool once = !isEnabled(service) && !usingOpenRC; if ( chroot.isEmpty() ) { prog = "service"; args << service.Directory; args << (once ? "onestop" : "stop") ; } else { prog = "warden"; args << "chroot" << ip << "service" << service.Directory << (once ? "onestop" : "stop" ); } return General::RunQuickCommand(prog,args); } bool ServiceManager::Restart(Service service) { if(service.Directory.isEmpty()){ return false; } QString prog; QStringList args; bool once = !isEnabled(service) && !usingOpenRC; if ( chroot.isEmpty() ) { prog = "service"; args << service.Directory; args <<(once ? "one" : "" )+ QString("restart"); } else { prog = "warden"; args << "chroot" << ip << "service" << service.Directory << (once ? "one" : "" )+QString("restart"); } return General::RunQuickCommand(prog,args); } // Enable is rc-update add name runlevel bool ServiceManager::Enable(Service service) { if(!rcdata.contains(service.Name)){ return false; } return enableDisableService(service.Name, true); } // Disable is rc-update del name runlevel bool ServiceManager::Disable(Service service) { if(!rcdata.contains(service.Name)){ return false; } return enableDisableService(service.Name, false); } // get list of files from /etc/init.d and /usr/local/etc/init.d // Service::Name is pure filename // Service::Tag is nto used anymore // Service::Description is from file "name=", "desc=", "description=" // rc-status --nocolor --servicelist indicates "isRunning" // rc-status --nocolor --unused indicates services not enabled // Service ServiceManager::loadServices(QString name) { QString tmp; bool valid; Service service; // OpenRC directories are /etc/init.d and /usr/local/etc/init.d QStringList stringDirs; if(usingOpenRC){ //OpenRC stringDirs << chroot + "/etc/init.d" << chroot + "/usr/local/etc/init.d"; }else{ //FreeBSD rc.d stringDirs << chroot + "/etc/rc.d" << chroot + "/usr/local/etc/rc.d"; } for ( QString dir: stringDirs) { QDir directory( dir ); directory.setFilter( QDir::Files ); directory.setSorting( QDir::Name ); if ( directory.count() == 0 ) return Service(); for (unsigned int i = 0; i < directory.count(); i++ ) { if(!name.isEmpty() && directory[i]!=name){ continue; } //not the right service - go to the next one service = Service(); QFile file( dir + "/" + directory[i] ); if ( file.open( QIODevice::ReadOnly ) ) { valid=true; //false; service.Name = directory[i]; // filename is the service name now service.Directory=directory[i]; //filename only service.Path = dir+"/"+directory[i]; //full path w/ filename QTextStream stream( &file ); stream.setCodec("UTF-8"); QString line; while ( !stream.atEnd() ) { line = stream.readLine(); // line of text excluding '\n' if (line.simplified().startsWith("description=") || line.simplified().startsWith("desc=") || (line.simplified().startsWith("name=") && service.Description.isEmpty()) ) { service.Description = line.section("=\"",1,-1).section("\"",0,0); } } file.close(); if ( !valid ) continue; QString cDir = dir; if ( ! chroot.isEmpty() ) cDir.replace(chroot, ""); if ( service.Name.indexOf("$") == 0 ) service.Name = service.Directory; if(!name.isEmpty() ){ return service; } //found the requested service - return it services << service; //qDebug() << "Added Service:" << cDir << service.Directory << service.Name << service.Tag; } } } loadRunlevels(); return Service(); } // rc-status --nocolor --servicelist to get all services void ServiceManager::loadRCdata(){ rcdata.clear(); // output is spNAMEsp...[spSTATUSsp]\n QStringList info = sysadm::General::RunCommand("rc-status --nocolor --servicelist").split("\n"); for(int i=0; i