/portalis-server/server-core/src/main/java/fr/irisa/lis/portalis/server/core/AdminCmd.java

https://bitbucket.org/bekkers/portalis · Java · 729 lines · 618 code · 85 blank · 26 comment · 60 complexity · 73393bf2a3324f3bf830ec7335aa3e72 MD5 · raw file

  1. package fr.irisa.lis.portalis.server.core;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.util.ArrayList;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.Set;
  9. import javax.servlet.http.HttpSession;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import fr.irisa.lis.portalis.commons.core.CommonsUtil;
  13. import fr.irisa.lis.portalis.shared.admin.AdminProprietes;
  14. import fr.irisa.lis.portalis.shared.admin.Err;
  15. import fr.irisa.lis.portalis.shared.admin.ErrorMessages;
  16. import fr.irisa.lis.portalis.shared.admin.PortalisException;
  17. import fr.irisa.lis.portalis.shared.admin.Precondition;
  18. import fr.irisa.lis.portalis.shared.admin.RightValue;
  19. import fr.irisa.lis.portalis.shared.admin.Util;
  20. import fr.irisa.lis.portalis.shared.admin.XmlIdentifier;
  21. import fr.irisa.lis.portalis.shared.admin.data.ActiveLisService;
  22. import fr.irisa.lis.portalis.shared.admin.data.ActiveSite;
  23. import fr.irisa.lis.portalis.shared.admin.data.ActiveUser;
  24. import fr.irisa.lis.portalis.shared.admin.data.AnonymousUser;
  25. import fr.irisa.lis.portalis.shared.admin.data.LoginErr;
  26. import fr.irisa.lis.portalis.shared.admin.data.LoginResult;
  27. import fr.irisa.lis.portalis.shared.admin.data.PortActif;
  28. import fr.irisa.lis.portalis.shared.admin.data.PortalisService;
  29. import fr.irisa.lis.portalis.shared.admin.reponse.ActiveSiteReponse;
  30. import fr.irisa.lis.portalis.shared.admin.reponse.BooleanReponse;
  31. import fr.irisa.lis.portalis.shared.admin.reponse.LogReponse;
  32. import fr.irisa.lis.portalis.shared.admin.reponse.LoginReponse;
  33. import fr.irisa.lis.portalis.shared.admin.reponse.PidReponse;
  34. import fr.irisa.lis.portalis.shared.admin.reponse.PortsActifsReponse;
  35. import fr.irisa.lis.portalis.shared.admin.reponse.SiteReponse;
  36. import fr.irisa.lis.portalis.shared.admin.reponse.VersionReponse;
  37. import fr.irisa.lis.portalis.shared.admin.reponse.VoidReponse;
  38. import fr.irisa.lis.portalis.shared.admin.validation.CoreServiceNameValidator;
  39. import fr.irisa.lis.portalis.shared.camelis.http.CamelisHttp;
  40. import fr.irisa.lis.portalis.shared.camelis.reponse.PingReponse;
  41. import fr.irisa.lis.portalis.shared.camelis.reponse.StartReponse;
  42. import fr.irisa.lis.portalis.system.linux.LinuxInteractor;
  43. public class AdminCmd {
  44. private static final Logger LOGGER = LoggerFactory.getLogger(AdminCmd.class
  45. .getName());
  46. private static PortalisCtx ctx = PortalisCtx.getInstance();
  47. public final static String WEBAPP_PATH = AdminProprietes.portalis
  48. .getProperty("admin.webappsDirPath");
  49. public static final String LOG_FILE_PATH = AdminProprietes.portalis
  50. .getProperty("admin.camelis.logFilePath");
  51. private static final File logFile = new File(LOG_FILE_PATH);
  52. static {
  53. try {
  54. // test de la présence de WEBAPP_PATH
  55. File webapp = new File(WEBAPP_PATH);
  56. if (!webapp.exists()) {
  57. LOGGER.warn("pas de répertoire '" + WEBAPP_PATH
  58. + "' on essaie de le créer");
  59. if (!webapp.mkdirs())
  60. throw new PortalisException("répertoire " + WEBAPP_PATH
  61. + " impossible à créer");
  62. }
  63. // test de la présence de LOG_FILE_PATH
  64. File logFile = new File(LOG_FILE_PATH);
  65. File logPath = logFile.getParentFile();
  66. if (!logPath.exists()) {
  67. LOGGER.warn("pas de répertoire '" + logPath.getAbsolutePath()
  68. + "' on essaie de le créer");
  69. if (!logPath.mkdirs())
  70. throw new PortalisException("répertoire "
  71. + logPath.getAbsolutePath() + " impossible à créer");
  72. }
  73. } catch (Exception e) {
  74. LOGGER.error("Erreur lors de l'initialisation de la classes AdminCmd"
  75. + CommonsUtil.stack2string(e));
  76. }
  77. }
  78. public static String checkServiceName(String serviceFullName)
  79. throws PortalisException {
  80. return checkServiceName(serviceFullName, true);
  81. }
  82. public static String checkServiceName(String serviceFullName,
  83. boolean isKnown) throws PortalisException {
  84. String result = null;
  85. if (serviceFullName != null) {
  86. if (!CoreServiceNameValidator.getInstance().validate(
  87. serviceFullName)) {
  88. String mess = ErrorMessages.TEMOIN_INCORRECT_SERVICE_NAME
  89. + serviceFullName;
  90. throw new PortalisException(mess);
  91. }
  92. if (isKnown) {
  93. PortalisCtx.getInstance().getDataBase()
  94. .getService(serviceFullName);
  95. }
  96. result = serviceFullName;
  97. }
  98. return result;
  99. }
  100. public static LogReponse getLog(String camelisSessionID) {
  101. LogReponse logReponse = new LogReponse();
  102. try {
  103. // vérification du rôle
  104. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  105. RightValue.ADMIN);
  106. BufferedReader reader = new BufferedReader(new FileReader(logFile));
  107. String line = reader.readLine();
  108. while (line != null) {
  109. logReponse.addLine(line);
  110. line = reader.readLine();
  111. }
  112. reader.close();
  113. return logReponse;
  114. } catch (PortalisException e) {
  115. String mess = "getLog error";
  116. LOGGER.warn(mess, e);
  117. return new LogReponse(new Err(mess, e.getMessage()));
  118. } catch (Throwable t) {
  119. String mess = "getLog error";
  120. LOGGER.error(mess, t);
  121. return new LogReponse(new Err(mess, t));
  122. }
  123. }
  124. public static VoidReponse clearLog(String camelisSessionID) {
  125. try {
  126. // vérification du rôle
  127. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  128. RightValue.ADMIN);
  129. return LinuxCmd.clearLog(logFile);
  130. } catch (PortalisException e) {
  131. String mess = "clearLog error";
  132. LOGGER.warn(mess, e);
  133. return new LogReponse(new Err(mess, e.getMessage()));
  134. } catch (Throwable t) {
  135. String mess = "clearLog error";
  136. LOGGER.error(mess, t);
  137. return new LogReponse(new Err(mess, t));
  138. }
  139. }
  140. public static SiteReponse getSite(String camelisSessionID) {
  141. try {
  142. // vérification du rôle
  143. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  144. RightValue.READER);
  145. return new SiteReponse(ctx.getDataBase());
  146. } catch (PortalisException e) {
  147. String mess = "getSite error";
  148. LOGGER.warn(mess, e);
  149. return new SiteReponse(new Err(mess, e.getMessage()));
  150. } catch (Throwable t) {
  151. String mess = "getSite error";
  152. LOGGER.error(mess, t);
  153. return new SiteReponse(new Err(mess, t));
  154. }
  155. }
  156. public static ActiveSiteReponse getActiveSite(String camelisSessionID) {
  157. LOGGER.info("getActiveSite(" + camelisSessionID + ")");
  158. try {
  159. // vérification du rôle
  160. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  161. RightValue.READER);
  162. PingReponse pingReponse = getActiveLisServicesOnPortalis(camelisSessionID);
  163. ActiveSite activeSite = new ActiveSite(ctx.getDataBase(), pingReponse.getLesServices());
  164. return new ActiveSiteReponse(activeSite);
  165. } catch (PortalisException e) {
  166. String mess = "getActiveSite error";
  167. LOGGER.warn(mess, e);
  168. return new ActiveSiteReponse(new Err(mess, e.getMessage()));
  169. } catch (Throwable t) {
  170. String mess = "getActiveSite error";
  171. LOGGER.error(mess, t);
  172. return new ActiveSiteReponse(new Err(mess, t));
  173. }
  174. }
  175. public static VoidReponse adminPropertyFilesCheck(String camelisSessionID) {
  176. LOGGER.info("adminPropertyFilesCheck(" + camelisSessionID + ")");
  177. try {
  178. // vérification du rôle
  179. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  180. RightValue.READER);
  181. AdminProprietes.test();
  182. return new VoidReponse();
  183. } catch (PortalisException e) {
  184. String mess = "adminPropertyFilesCheck error";
  185. LOGGER.warn(mess, e);
  186. return new VoidReponse(new Err(mess, e.getMessage()));
  187. } catch (Throwable t) {
  188. String mess = "adminPropertyFilesCheck error";
  189. LOGGER.error(mess, t);
  190. return new VoidReponse(new Err(mess, t));
  191. }
  192. }
  193. public static VersionReponse getCamelisVersion(String camelisSessionID) {
  194. try {
  195. // vérification du rôle
  196. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  197. RightValue.READER);
  198. return new VersionReponse(LinuxCmd.getPortalisVersion());
  199. } catch (PortalisException e) {
  200. String mess = "getCamelisVersion error";
  201. LOGGER.warn(mess, e);
  202. return new VersionReponse(new Err(mess, e.getMessage()));
  203. } catch (Throwable t) {
  204. String mess = "getCamelisVersion error";
  205. LOGGER.error(mess, t);
  206. return new VersionReponse(new Err(mess, t));
  207. }
  208. }
  209. public static BooleanReponse portIsBusy(String camelisSessionID, int port) {
  210. try {
  211. // vérification du rôle
  212. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  213. RightValue.ADMIN);
  214. LOGGER.info("camelisSessionID = "+camelisSessionID+" port"+port);
  215. BooleanReponse reponse = new BooleanReponse(!Util.available(port));
  216. LOGGER.info("reponse = "+reponse);
  217. return reponse;
  218. } catch (PortalisException e) {
  219. String mess = "portIsBusy exception : "+e.getMessage();
  220. LOGGER.warn(mess);
  221. return new BooleanReponse(new Err(mess, e.getMessage()));
  222. } catch (Throwable t) {
  223. String mess = "portIsBusy error";
  224. LOGGER.error(mess, t);
  225. return new BooleanReponse(new Err(mess, t));
  226. }
  227. }
  228. public static PidReponse getCamelisProcessId(String camelisSessionID,
  229. String fullName) {
  230. try {
  231. // vérification du rôle
  232. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  233. RightValue.ADMIN);
  234. PidReponse pidReponse = new PidReponse();
  235. for (ActiveLisService service : getActiveLisServicesOnPortalis()
  236. .getLesServices()) {
  237. if (service.getFullName().equals(fullName)) {
  238. pidReponse.getPids().add(service.getPid());
  239. }
  240. }
  241. return pidReponse;
  242. } catch (PortalisException e) {
  243. String mess = "getCamelisProcessId error";
  244. LOGGER.warn(mess, e);
  245. return new PidReponse(new Err(mess, e.getMessage()));
  246. } catch (Throwable t) {
  247. String mess = "getCamelisProcessId error";
  248. LOGGER.error(mess, t);
  249. return new PidReponse(new Err(mess, t));
  250. }
  251. }
  252. public static PidReponse getCamelisProcessId(String camelisSessionId,
  253. int port) {
  254. LOGGER.info("==== AdminCmd ==== >> getCamelisProcessId(" + port + ")");
  255. PidReponse pidReponse = new PidReponse();
  256. try {
  257. // vérification du rôle
  258. PortalisCtx.getInstance().roleCheck(camelisSessionId, PortalisService.getInstance().getFullName(),
  259. RightValue.ADMIN);
  260. Set<Integer> pids = new HashSet<Integer>();
  261. int pid = LinuxCmd.getCamelisProcessId(port);
  262. if (pid != 0)
  263. pids.add(pid);
  264. pidReponse.setPids(pids);
  265. return pidReponse;
  266. } catch (PortalisException e) {
  267. return new PidReponse(new Err(e.getMessage()));
  268. } catch (Throwable t) {
  269. String mess = "getCamelisProcessId error";
  270. LOGGER.error(mess + t.getMessage());
  271. return new PidReponse(new Err(mess, t));
  272. }
  273. }
  274. public static PortsActifsReponse getActifsPorts(String camelisSessionID) {
  275. try {
  276. // vérification du rôle
  277. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  278. RightValue.ADMIN);
  279. PortsActifsReponse reponse = new PortsActifsReponse(
  280. LinuxCmd.getActifsCamelisPortsOnPortalis());
  281. LOGGER.info("==== AdminCmd ==== >> getActifsPorts() =\n" + reponse);
  282. return reponse;
  283. } catch (PortalisException e) {
  284. return new PortsActifsReponse(new Err(e.getMessage()));
  285. } catch (Throwable t) {
  286. String mess = "getActifsPorts error";
  287. LOGGER.error(mess + t.getMessage());
  288. return new PortsActifsReponse(new Err(mess, t));
  289. }
  290. }
  291. public static LoginReponse login(String email, String password,
  292. HttpSession httpSession) {
  293. return login(email, password, httpSession, null);
  294. }
  295. public static LoginReponse login(String email, String password,
  296. HttpSession httpSession, String maxInactiveInterval) {
  297. try {
  298. Precondition precondition = new Precondition();
  299. precondition.checkJavaArg(email != null, "Parameter %s is missing",
  300. XmlIdentifier.EMAIL());
  301. precondition.checkJavaArg(password != null,
  302. "Parameter %s is missing", XmlIdentifier.PASSWORD());
  303. if (!precondition.isOk()) {
  304. LOGGER.warn(precondition.getMessagesAsString());
  305. return new LoginReponse(new Err(precondition.getMessages()));
  306. }
  307. LoginResult loggingCheck = ctx.getDataBase().getUserInfo(email, password);
  308. if (loggingCheck.getLoginErr().equals(LoginErr.ok)) {
  309. LOGGER.info(new StringBuffer("email = ").append(email)
  310. .append(" password = ").append(password).append(")")
  311. .toString());
  312. ActiveUser activeUser = new ActiveUser(loggingCheck.getUserCore(),
  313. httpSession.getId());
  314. // creation de la session portalis associée
  315. if (maxInactiveInterval!=null) {
  316. ctx.userLogin(activeUser, httpSession, maxInactiveInterval);
  317. } else {
  318. ctx.userLogin(activeUser, httpSession);
  319. }
  320. return new LoginReponse(activeUser);
  321. } else {
  322. String mess = new StringBuffer("login impossible : ")
  323. .append(loggingCheck.getLoginErr().name()).append(" email = ")
  324. .append(email).append("password = ").append(password)
  325. .toString();
  326. LOGGER.warn(mess);
  327. return new LoginReponse(new Err(mess));
  328. }
  329. } catch (PortalisException e) {
  330. String mess = new StringBuffer("login impossible : ")
  331. .append(e.getMessage()).append(" email = ").append(email)
  332. .append("password = ").append(password)
  333. .toString();
  334. LOGGER.warn(mess, e);
  335. return new LoginReponse(new Err(mess, e.getMessage()));
  336. } catch (Throwable t) {
  337. String mess = new StringBuffer("login impossible : ")
  338. .append(t.getMessage()).append(" email = ").append(email)
  339. .append("password = ").append(password).append(")")
  340. .toString();
  341. LOGGER.warn(mess + CommonsUtil.stack2string(t));
  342. return new LoginReponse(new Err(mess, t));
  343. }
  344. }
  345. public static LoginReponse anonymousLogin(HttpSession httpSession) {
  346. return anonymousLogin(httpSession, null);
  347. }
  348. public static LoginReponse anonymousLogin(HttpSession httpSession, String maxInactiveInterval) {
  349. try {
  350. ActiveUser activeUser = new ActiveUser(new AnonymousUser(),
  351. httpSession.getId());
  352. // creation de la session portalis associée
  353. ctx.userLogin(activeUser, httpSession, maxInactiveInterval);
  354. return new LoginReponse(activeUser);
  355. } catch (PortalisException e) {
  356. return new LoginReponse(new Err(e.getMessage()));
  357. } catch (Throwable t) {
  358. String mess = "anonymousLogin error";
  359. LOGGER.error(mess + t.getMessage());
  360. return new LoginReponse(new Err(mess, t));
  361. }
  362. }
  363. public static PingReponse getActiveLisServicesOnPortalis(
  364. String camelisSessionID) {
  365. LOGGER.info("==== AdminCmd ==== >> getActiveLisServicesOnPortalis("
  366. + camelisSessionID + ")");
  367. try {
  368. // vérification du rôle
  369. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  370. RightValue.READER);
  371. return getActiveLisServicesOnPortalis();
  372. } catch (PortalisException e) {
  373. String mess = "getActiveLisServicesOnPortalis error";
  374. LOGGER.warn(mess, e);
  375. return new PingReponse(new Err(mess, e.getMessage()));
  376. } catch (Throwable t) {
  377. String mess = "getActiveLisServicesOnPortalis error";
  378. LOGGER.error(mess, t);
  379. return new PingReponse(new Err(mess, t));
  380. }
  381. }
  382. public static PingReponse getActiveLisServicesOnPortalis() {
  383. try {
  384. Set<PortActif> PortActifs = LinuxCmd
  385. .getActifsCamelisPortsOnPortalis();
  386. if (PortActifs.size()>0) {
  387. PortActif portActif = PortActifs.toArray(new PortActif[PortActifs.size()])[0];
  388. String host = portActif.getServer();
  389. assert(host!=null);
  390. }
  391. List<ActiveLisService> actifs = new ArrayList<ActiveLisService>();
  392. for (PortActif portActif : PortActifs) {
  393. int port = portActif.getPort();
  394. String host = portActif.getServer();
  395. PingReponse pingReponse = CamelisHttp.ping(host, port);
  396. if (pingReponse.getStatus().equals(XmlIdentifier.OK)) {
  397. ActiveLisService ActiveLisService = pingReponse
  398. .getFirstService();
  399. if (ActiveLisService == null) {
  400. String mess = "Erreur interne, il devrait y avoir un service camelis : "
  401. + pingReponse;
  402. throw new PortalisException(mess);
  403. }
  404. actifs.add(ActiveLisService);
  405. } else {
  406. LOGGER.info("==== AdminCmd ==== >> fin de getActiveLisServicesOnPortalis() reponse :\n"
  407. + pingReponse);
  408. return pingReponse;
  409. }
  410. }
  411. PingReponse pingReponse = new PingReponse(actifs);
  412. LOGGER.info("==== AdminCmd ==== >> fin de getActiveLisServicesOnPortalis() reponse :\n"
  413. + pingReponse);
  414. return pingReponse;
  415. } catch (PortalisException e) {
  416. String mess = "getActiveLisServicesOnPortalis error";
  417. LOGGER.warn(mess, e);
  418. return new PingReponse(new Err(mess, e.getMessage()));
  419. } catch (Throwable t) {
  420. String mess = "getActiveLisServicesOnPortalis error";
  421. LOGGER.error(mess, t);
  422. return new PingReponse(new Err(mess, t));
  423. }
  424. }
  425. /*
  426. * ------------------------------ startCamelis
  427. */
  428. public static StartReponse startCamelis(String camelisSessionID,
  429. String serviceName, String webApplicationDataPath, String logFile) {
  430. int port;
  431. try {
  432. port = PortService.choosePort();
  433. } catch (PortalisException e) {
  434. String mess = "startCamelis error";
  435. LOGGER.warn(mess, e);
  436. return new StartReponse(new Err(mess, e.getMessage()));
  437. }
  438. StartReponse rep = startCamelis(camelisSessionID, port, serviceName,
  439. webApplicationDataPath, logFile);
  440. return rep;
  441. }
  442. public static StartReponse startCamelis(String camelisSessionID,
  443. String port, String serviceName, String webApplicationDataPath,
  444. String logFile) {
  445. Precondition errors = new Precondition();
  446. int portNum = errors.checkIntArg(port,
  447. "Le parametre %s doit être un entier, sa valeur est %s",
  448. XmlIdentifier.PORT(), port);
  449. if (!errors.isOk()) {
  450. LOGGER.warn(errors.getMessagesAsString());
  451. return new StartReponse(new Err(errors.getMessages()));
  452. }
  453. return startCamelis(camelisSessionID, portNum, serviceName,
  454. webApplicationDataPath, logFile);
  455. }
  456. public static StartReponse startCamelis(String camelisSessionID, int port,
  457. String serviceName, String webApplicationDataPath, String logFile) {
  458. StartReponse startReponse = new StartReponse();
  459. try {
  460. // vérification du rôle
  461. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  462. RightValue.ADMIN);
  463. if (!Util.available(port)) {
  464. return new StartReponse(new Err("port "+port+" déjà occupé"));
  465. }
  466. LOGGER.info(String.format(
  467. "==== AdminCmd ==== >> startCamelis(%s, %d, %s, %s, %s)",
  468. camelisSessionID, port, serviceName,
  469. webApplicationDataPath, logFile));
  470. Precondition precond = new Precondition();
  471. precond.checkJavaArg(
  472. // TODO validation
  473. CoreServiceNameValidator.getInstance()
  474. .validate(serviceName),
  475. "Incorrect service name : %s", serviceName);
  476. ActiveUser activeUser = PortalisCtx.getInstance().getUser(
  477. camelisSessionID);
  478. precond.checkJavaArg(activeUser != null, "Utilisateur actif null");
  479. LOGGER.debug(String.format(
  480. "startCamelis1(%s, %d, %s, %s+Util.stack2string( %s))",
  481. camelisSessionID, port, serviceName,
  482. webApplicationDataPath, logFile));
  483. LOGGER.debug("startCamelis1 precond="
  484. + precond.getMessagesAsString());
  485. if (!precond.isOk()) {
  486. LOGGER.warn("erreur de paramêtre : "
  487. + precond.getMessagesAsString());
  488. return new StartReponse(new Err(precond.getMessages()));
  489. } else {
  490. final String creatorEmail = activeUser.getUserCore().getEmail();
  491. final String adminKey = activeUser.getPortalisSessionId();
  492. if (port == 0) {
  493. port = PortService.choosePort();
  494. }
  495. LOGGER.debug(String.format(
  496. "startCamelis2(%s, %s, %s+Util.stack2string( %s))",
  497. camelisSessionID, serviceName, webApplicationDataPath,
  498. logFile));
  499. if (logFile == null || logFile.length() == 0) {
  500. logFile = LOG_FILE_PATH;
  501. if (logFile == null || logFile.length() == 0) {
  502. return new StartReponse(new Err("La propriété logFilePath doit être initialisée"));
  503. }
  504. }
  505. LOGGER.debug(String.format(
  506. "startCamelis3(%s, %s, %s+Util.stack2string( %s))",
  507. camelisSessionID, serviceName, webApplicationDataPath,
  508. logFile));
  509. if (webApplicationDataPath == null
  510. || webApplicationDataPath.length() == 0) {
  511. webApplicationDataPath = WEBAPP_PATH;
  512. if (webApplicationDataPath == null
  513. || webApplicationDataPath.length() == 0) {
  514. return new StartReponse(new Err("La propriété webApplicationDataPath doit être initialisée"));
  515. }
  516. }
  517. LOGGER.debug(String.format(
  518. "startCamelis4(%s, %s, %s+Util.stack2string( %s))",
  519. camelisSessionID, serviceName, webApplicationDataPath,
  520. logFile));
  521. checkWebappsDir(webApplicationDataPath);
  522. String host = PortalisService.getInstance().getHost();
  523. String ActiveLisServiceId = host + ":" + port + "::"
  524. + serviceName;
  525. LOGGER.debug("startCamelis\n(" + adminKey + ", " + creatorEmail
  526. + ", " + serviceName + ", " + port + ", "
  527. + webApplicationDataPath + ", " + logFile + ")");
  528. String[][] httpReqArgs = {
  529. { XmlIdentifier.CREATOR(), creatorEmail },
  530. { XmlIdentifier.PORT(), port + "" },
  531. {
  532. XmlIdentifier.KEY(),
  533. (activeUser != null ? activeUser
  534. .getPortalisSessionId() : "none") },
  535. { XmlIdentifier.ACTIVE_SERVICE_ID(), ActiveLisServiceId },
  536. { XmlIdentifier.LOG(), logFile },
  537. { XmlIdentifier.DATADIR(), webApplicationDataPath } };
  538. precond.setHttpReqArgs(httpReqArgs);
  539. if (!precond.isOk()) {
  540. LOGGER.warn("erreur de paramêtre : "
  541. + precond.getMessagesAsString());
  542. startReponse = new StartReponse(new Err(
  543. precond.getMessages()));
  544. } else {
  545. final String cmd = ServerConstants.CAMELIS_APPLICATION_NAME
  546. + precond.getArgsAsLinuxCommandString();
  547. LinuxInteractor.executeCommand(cmd, false);
  548. // ici on ne peut pas attendre la fin du processus car, par
  549. // définition,
  550. // il ne va pas s'arrèter ...
  551. PingReponse pingReponse = CamelisHttp.ping(PortalisService
  552. .getInstance().getHost(), port);
  553. ActiveLisService ActiveLisService = pingReponse
  554. .getFirstService();
  555. if (ActiveLisService == null) {
  556. String mess = "Erreur interne, il devrait y avoir un ActiveLisServices sur le port "
  557. + port;
  558. LOGGER.debug(mess);
  559. startReponse = new StartReponse(new Err(mess));
  560. } else {
  561. startReponse = new StartReponse(ActiveLisService);
  562. ctx.broadCastStartCamelisToUsers(startReponse,
  563. activeUser);
  564. LisServerChecker.getInstance().starting(startReponse);
  565. }
  566. }
  567. }
  568. } catch (PortalisException e) {
  569. String mess = "startCamelis error";
  570. LOGGER.warn(mess, e);
  571. return new StartReponse(new Err(mess, e.getMessage()));
  572. } catch (Throwable t) {
  573. String mess = "startCamelis error";
  574. LOGGER.error(mess, t);
  575. return new StartReponse(new Err(mess, t));
  576. }
  577. LOGGER.info("==== AdminCmd ==== >> fin de startCamelis() Camelis is started, reponse :\n"
  578. + startReponse);
  579. return startReponse;
  580. }
  581. public static PingReponse killAllCamelisProcess(String camelisSessionID) {
  582. LOGGER.debug("-------------------> cleaning up all CamelisProcess("
  583. + camelisSessionID + ")\n");
  584. try {
  585. // vérification du rôle
  586. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  587. RightValue.ADMIN);
  588. PingReponse pingReponse = getActiveLisServicesOnPortalis(camelisSessionID);
  589. LisServerChecker.getInstance().stopServices(pingReponse);
  590. return getActiveLisServicesOnPortalis(camelisSessionID);
  591. } catch (PortalisException e) {
  592. String mess = "killAllCamelisProcess error";
  593. LOGGER.warn(mess, e);
  594. return new PingReponse(new Err(mess, e.getMessage()));
  595. } catch (Throwable t) {
  596. String mess = "killAllCamelisProcess error";
  597. LOGGER.error(mess, t);
  598. return new PingReponse(new Err(mess, t));
  599. }
  600. }
  601. public static PingReponse stopCamelis(String camelisSessionID,
  602. String dynamicServiceId) {
  603. LOGGER.info("==== AdminCmd ==== >> stopCamelis(" + dynamicServiceId
  604. + ")");
  605. try {
  606. // vérification du rôle
  607. PortalisCtx.getInstance().roleCheck(camelisSessionID, PortalisService.getInstance().getFullName(),
  608. RightValue.ADMIN);
  609. String host = ActiveLisService.extractHost(dynamicServiceId);
  610. int port = ActiveLisService.extractPort(dynamicServiceId);
  611. PingReponse pingReponse = CamelisHttp.ping(host, port);
  612. LisServerChecker.getInstance().stopServices(pingReponse);
  613. return getActiveLisServicesOnPortalis(camelisSessionID);
  614. } catch (PortalisException e) {
  615. String mess = "stopCamelis error";
  616. LOGGER.warn(mess, e);
  617. return new PingReponse(new Err(mess, e.getMessage()));
  618. } catch (Throwable t) {
  619. String mess = "stopCamelis error";
  620. LOGGER.error(mess, t);
  621. return new PingReponse(new Err(mess, t));
  622. }
  623. }
  624. private static void checkWebappsDir(String webApplicationDataPath)
  625. throws PortalisException {
  626. if (webApplicationDataPath == null) {
  627. String mess = "checkWebappsDir() : WebApplicationDataPath is null";
  628. LOGGER.error(mess);
  629. throw new PortalisException(mess);
  630. }
  631. File webappsDir = new File(webApplicationDataPath);
  632. if (!webappsDir.exists()) {
  633. LOGGER.warn("directory " + webApplicationDataPath
  634. + " does not exists, creating it !");
  635. if (!webappsDir.mkdirs()) {
  636. String mess = "checkWebappsDir() : Cannot create directory "
  637. + webApplicationDataPath;
  638. LOGGER.error(mess);
  639. throw new PortalisException(mess);
  640. }
  641. }
  642. }
  643. /* gestion des utilisateurs */
  644. }