<?xml version="1.0" encoding="UTF-8"?>\r
<executors>\r
+ <executor className="SafeDeleteRecursive.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="SaveMediaProxy.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="DeleteFile.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="TransferStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="IntegrationTestStep.java" maxConcurrent="1" isRemote="false" />\r
<executor className="QueryMissingProxyMediaStep.java" maxConcurrent="1" isRemote="false" />\r
- <executor className="PrepareRemoteTranscodeJobParametersStep.java" maxConcurrent="1" isRemote="false" />\r
+ <executor className="PrepareRemoteTranscodeStep.java" maxConcurrent="1" isRemote="false" />\r
<executor className="TramsferStep.java" maxConcurrent="1" isRemote="false" />\r
<executor className="PrepareMediaRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
<executor className="RemoteJobStep.java" maxConcurrent="1" isRemote="false" />\r
{"joblist":[\r
{\r
+ "active": false,\r
+ "executeimmediate": false,\r
+ "name" : "Rekurzív törlés /mnt/POLC/FINISHED_SHOWS (DEMO)",\r
+ "template": "safe-delete-recursive.xml",\r
+ "cronexpression": "0 */1 * * * ?",\r
+ "parameters": [ \r
+ {"name": "sourcePath", "value": "/mnt/POLC/FINISHED_SHOWS", "type": "java.lang.String"},\r
+ ]\r
+ },\r
+ {\r
+ "template": "integration-test.xml"\r
+ },\r
+ {\r
"template": "remote-transcode.xml",\r
+ "name" : "Proxy generálás",\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0 */1 * * * ?",\r
"parameters": [ \r
{"name": "remoteServer", "value": "http://10.11.1.111:9080", "type": "java.lang.String"}, \r
{"name": "transcodeTemplate", "value": "create-proxy-ffmpeg.xml", "type": "java.lang.String"}, \r
]\r
},\r
{\r
- "template": "test-fork-cancelable.xml",\r
- "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
- },\r
- {\r
- "active": true,\r
- "executeimmediate": true,\r
- "name" : "Proxy generálás",\r
- "template": "sys-recreate-lowres.xml",\r
- "cronexpression": "0 */1 * * * ?",\r
+ "template": "create-lowres-ondemand.xml",\r
+ "name" : "Manuális proxy generálás",\r
"parameters": [ \r
- {"name": "globalRetrievePath", "value": "file://10.11.1.90/data", "type": "java.lang.String"},\r
- {"name": "localRetrievePath", "value": "/mediacube/data", "type": "java.lang.String"},\r
- {"name": "localHiresPath", "value": "/mediacube/data", "type": "java.lang.String" },\r
- {"name": "globalHiresPath", "value": "\\\\10.11.1.90\\data", "type": "java.lang.String" },\r
- {"name": "localLowresPath", "value": "/mediacube/data/TRANSCODER_OUT", "type": "java.lang.String" },\r
- {"name": "transcoderAddress", "value": "http://10.11.1.111:65445/api/json/v1/", "type": "java.lang.String"},\r
- {"name": "transcoderTemplateName", "value": "MP4", "type": "java.lang.String"}\r
+ {"name": "remoteServer", "value": "http://10.11.1.111:9080", "type": "java.lang.String"}, \r
+ {"name": "transcodeTemplate", "value": "create-proxy-ffmpeg.xml", "type": "java.lang.String"}, \r
+ {"name": "jobName", "value": "Create proxy (slave process)", "type": "java.lang.String"}, \r
+ {"name": "profileName", "value": "proxy", "type": "java.lang.String"},\r
+ {"name": "tempStoreName", "value": "LOCAL", "type": "java.lang.String"},\r
+ {"name": "tempStoreProtocol", "value": "LOCAL", "type": "java.lang.String"}\r
]\r
},\r
{\r
+ "template": "test-fork-cancelable.xml",\r
+ "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+ },\r
+ {\r
"active": false,\r
"executeimmediate": false,\r
- "name" : "Rekurzív archiválás a POLC/FINISHED_SHOWS mappából",\r
+ "name" : "Rekurzív archiválás a /mediacube/data/ARCHIVE-TEST",\r
"template": "archive-recursive.xml",\r
"cronexpression": "0 */1 * * * ?",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "/mnt/POLC/FINISHED_SHOWS", "type": "java.lang.String"},\r
+ {"name": "sourcePath", "value": "/mediacube/data/ARCHIVE-TEST", "type": "java.lang.String"},\r
{"name": "killDateDays", "value": 1, "type": "java.lang.Integer"},\r
- {"name": "limit", "value": 1, "type": "java.lang.Integer"}\r
+ {"name": "limit", "value": 20, "type": "java.lang.Integer"},\r
+ {"name": "disableProxy", "value": true, "type": "java.lang.Boolean"}\r
]\r
},\r
{\r
"template": "delete-materials.xml",\r
"cronexpression": "0 */10 * * * ?",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "/mediacube/data/ARCHIVE", "type": "java.lang.String"}\r
+ {"name": "sourcePath", "value": "/mediacube/data/ARCHIVE", "type": "java.lang.String"},\r
+ {"name": "skipArchiveCheck", "value": false, "type": "java.lang.Boolean"}\r
]\r
}, \r
{\r
"template": "delete-materials.xml",\r
"cronexpression": "0 */10 * * * ?",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "/mediacube/data/OMARCHIVE", "type": "java.lang.String"}\r
+ {"name": "sourcePath", "value": "/mediacube/data/OMARCHIVE", "type": "java.lang.String"},\r
+ {"name": "skipArchiveCheck", "value": false, "type": "java.lang.Boolean"}\r
]\r
}, \r
{\r
"template": "delete-materials.xml",\r
"cronexpression": "0 */10 * * * ?",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "/mnt/PROMISE/ARCHIVE", "type": "java.lang.String"}\r
+ {"name": "sourcePath", "value": "/mnt/PROMISE/ARCHIVE", "type": "java.lang.String"},\r
+ {"name": "skipArchiveCheck", "value": false, "type": "java.lang.Boolean"}\r
]\r
}, \r
{\r
"template": "delete-materials.xml",\r
"cronexpression": "0 * 11 * * ?",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "/mnt/POLC/FINISHED_SHOWS", "type": "java.lang.String"}\r
+ {"name": "sourcePath", "value": "/mnt/POLC/FINISHED_SHOWS", "type": "java.lang.String"},\r
+ {"name": "skipArchiveCheck", "value": false, "type": "java.lang.Boolean"}\r
]\r
}, \r
{\r
"executeimmediate": false\r
},\r
{\r
- "template": "create-lowres-ondemand.xml",\r
- "active": false,\r
- "executeimmediate": false,\r
- "parameters": [ \r
- {"name": "globalRetrievePath", "value": "file://10.11.1.90/data", "type": "java.lang.String"},\r
- {"name": "localRetrievePath", "value": "/mediacube/data", "type": "java.lang.String"},\r
- {"name": "localHiresPath", "value": "/mediacube/data", "type": "java.lang.String" },\r
- {"name": "globalHiresPath", "value": "\\\\10.11.1.90\\data", "type": "java.lang.String" },\r
- {"name": "localLowresPath", "value": "/mediacube/data/TRANSCODER_OUT", "type": "java.lang.String" },\r
- {"name": "transcoderAddress", "value": "http://10.11.1.111:65445/api/json/v1/", "type": "java.lang.String"},\r
- {"name": "transcoderTemplateName", "value": "MP4", "type": "java.lang.String"}\r
- ]\r
- },\r
- {\r
"active": false,\r
"executeimmediate": false,\r
"template": "cancelable.xml",\r
try {\r
IJobRuntime runtime = jobEngine.submit(jobRuntime, null, JOBTEMPLATE, ARCHIVE,\r
ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays));\r
- \r
int progress = (i + 1) * 100 / archiveList.size();\r
setProgress(progress);\r
+ //TODO kivezetni a submit hibaüzenetet\r
if (runtime == null)\r
throw new Exception("Submit returned null runtime");\r
} catch (Exception e) {\r
import java.nio.file.attribute.BasicFileAttributes;\r
import java.text.SimpleDateFormat;\r
import java.util.Arrays;\r
+import java.util.HashSet;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.Set;\r
\r
import org.apache.commons.io.FilenameUtils;\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
import user.commons.JobStatus;\r
import user.commons.ListUtils;\r
+import user.commons.MediaCubeMarker;\r
import user.commons.mediatool.MediaInfo;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
import user.mediacube.metadata.interfaces.IMetadata;\r
import user.mediacube.metadata.interfaces.IMetadataProvider;\r
import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
private static final String KILL_DATE_DAYS = "killDateDays";\r
private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
\r
- private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", "VASAROLT", EscortFiles.STATUSFOLDER, EscortFiles.CONFLICTFOLDER);\r
+ private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
+ EscortFiles.CONFLICTFOLDER);\r
private int limit;\r
private int submitted;\r
private int killDateDays;\r
+ private boolean disableProxy;\r
\r
private boolean canReadMediaInfo(Path mediaFilePath) {\r
boolean result = false;\r
return result;\r
}\r
\r
- private void checkArchiveItem(ArchiveItem archiveItem, Path mediaPath) throws Exception {\r
+ private void checkArchiveItem(ArchiveItem archiveItem) throws Exception {\r
if (archiveItem == null)\r
- throw new Exception(mediaPath + " has no metadata specified.");\r
+ throw new Exception("No metadata specified.");\r
\r
if (StringUtils.isBlank(archiveItem.getItemHouseId()))\r
- throw new Exception(mediaPath + " has no Item HouseID specified in metadata.");\r
+ throw new Exception("No Item HouseID specified in metadata.");\r
\r
if (StringUtils.isBlank(archiveItem.getItemTitle()))\r
- throw new Exception(mediaPath + " has no Item Title specified in metadata.");\r
+ throw new Exception("No Item Title specified in metadata.");\r
\r
if (StringUtils.isBlank(archiveItem.getMediaHouseId()))\r
- throw new Exception(mediaPath + " has no Media HouseID specified in metadata.");\r
+ throw new Exception("No Media HouseID specified in metadata.");\r
\r
if (StringUtils.isBlank(archiveItem.getMediaTitle()))\r
- throw new Exception(mediaPath + " has no Media Title specified in metadata.");\r
+ throw new Exception("No Media Title specified in metadata.");\r
+ }\r
+\r
+ private String archiveItemJSON(ArchiveItem result) {\r
+ BasicDBObject obj = new BasicDBObject();\r
+ obj.put("itemHouseId", result.getItemHouseId());\r
+ obj.put("itemTitle", result.getItemTitle());\r
+ obj.put("mediaHouseId", result.getMediaHouseId());\r
+ obj.put("mediaTitle", result.getMediaTitle());\r
+ obj.put("mediaDescription", result.getMediaDescription());\r
+ obj.put("mediaType", result.getMediaType());\r
+ return obj.toPrettyString("");\r
}\r
\r
private ArchiveItem createArchiveItem(Path filePath) throws Exception {\r
String mediaHouseId = FilenameUtils.removeExtension(fileName);\r
try {\r
result = getPlanAirMetadata(mediaHouseId);\r
- } catch (Exception e) {\r
\r
- logger.error("PlanAir metadata error", e);\r
- //nem latja a drivert pl.\r
+ if (result != null) {\r
+ result.setMediaFile(filePath.toString());\r
+ // 210617 proxy keszites tiltasa\r
+ result.setDisableProxy(disableProxy);\r
+ }\r
+\r
+ logger.info(getSessionMarker(), "PlanAir query done for {}", filePath);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "PlanAir metadata error", e);\r
+ // nem latja a drivert pl.\r
throw e;\r
}\r
\r
+//210616 Ha nincs metaadat, nem archivalunk\r
if (result == null) {\r
result = new ArchiveItem();\r
BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);\r
result.setItemTitle(filePath.getParent().toString());\r
result.setMediaHouseId(mediaHouseId);\r
result.setMediaTitle(fileName);\r
- //TODO kesobb kivenni\r
- //result.setMediaDescription("/OMARCHIVE");\r
+ result.setMediaDescription("/ARCHIVE-TEST");\r
result.setMediaType("Generic");\r
+ result.setMediaFile(filePath.toString());\r
}\r
\r
- result.setMediaFile(filePath.toString());\r
return result;\r
}\r
\r
@StepEntry\r
- public Object[] execute(String sourcePath, int killDateDays, int limit) throws Exception {\r
+ public Object[] execute(String sourcePath, int killDateDays, int limit, boolean disableProxy) throws Exception {\r
this.killDateDays = killDateDays;\r
this.limit = limit;\r
+ this.disableProxy = disableProxy;\r
+ logger.info(getSessionMarker(), "Starting in {}", sourcePath);\r
try {\r
if (getJobRuntime().forkPrepare()) {\r
Files.walkFileTree(Paths.get(sourcePath), this);\r
}\r
} catch (Exception e) {\r
- logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+ logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
+ e.getMessage());\r
} finally {\r
if (submitted > 0)\r
getJobRuntime().forkWaitComplete();\r
else\r
getJobRuntime().cancelForkPrepare();\r
-\r
}\r
return null;\r
}\r
List<IMetadata> data = null;\r
\r
IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+ if (factory == null)\r
+ logger.info(getSessionMarker(), "IMetadataProviderFactory is null");\r
+\r
IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+ if (planairProvider == null)\r
+ logger.info(getSessionMarker(), "IMetadataProvider is null");\r
\r
ArchiveItem result = null;\r
data = planairProvider.list(opt);\r
if (getManager().isMediaFileExists(sourceFileName)) {\r
EscortFiles.createMediaCatch(mediaPath);\r
result = true;\r
-\r
- // try {\r
- // Path parent = sourcePath.getParent();\r
- // Path conflictPath = Paths.get(parent.toString(), CONFLICT);\r
- // File folder = conflictPath.toFile();\r
- // if (!folder.exists() || !folder.isDirectory()) {\r
- // Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
- // FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
- // try {\r
- // Files.createDirectories(conflictPath, attr);\r
- // } catch (Exception e) {\r
- // try {\r
- // Files.createDirectory(conflictPath);\r
- // } catch (Exception e1) {\r
- // logger.catching(e);\r
- // throw e;\r
- // }\r
- // }\r
- // }\r
- //\r
- // Path conflictFile = Paths.get(conflictPath.toString(), sourceFileName);\r
- // if (conflictFile.toFile().exists())\r
- // conflictFile = Paths.get(conflictPath.toString(), sourceFileName + (new Date()).getTime());\r
- // Files.move(sourcePath, conflictFile);\r
- // result = true;\r
- // } catch (Exception e1) {\r
- // logger.error(getSessionMarker(), "Hiba az '{}' állomány mappába mozgatásakor. A rendszer üzenete: {}", CONFLICT, e1.getMessage());\r
- // }\r
}\r
-\r
return result;\r
}\r
\r
}\r
\r
@Override\r
- public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes)\r
+ throws IOException {\r
Path dirName = dir.getFileName();\r
- logger.info("PreVisit {}", dir);\r
\r
- if (skipPathNames.contains(dirName.toString()))\r
+ if (skipPathNames.contains(dirName.toString())) {\r
+ logger.info(getSessionMarker(), "PreVisit skip {}", dir);\r
return FileVisitResult.SKIP_SUBTREE;\r
- else\r
- logger.info("PreVisit {}", dir);\r
+ } else\r
+ logger.info(getSessionMarker(), "PreVisit {}", dir);\r
\r
return FileVisitResult.CONTINUE;\r
}\r
\r
private boolean processPathItem(Path mediaPath) throws Exception {\r
- if (submitted == limit)\r
+ if (limit != 0 && submitted == limit) {\r
+ logger.info(getSessionMarker(), "Limit reached {}, canceling", limit);\r
+ return false;\r
+ }\r
+\r
+ String fileName = mediaPath.getFileName().toString();\r
+ if (fileName.startsWith(".") || fileName.endsWith(".nomd"))\r
return false;\r
\r
- // if (!"Transfered".equals(mediaPath.getParent().getFileName().toString()))\r
- // return false;\r
+ logger.info(getSessionMarker(), "Processing {}", mediaPath);\r
\r
- if (mediaPath.getFileName().toString().startsWith("."))\r
+ File mediaFile = mediaPath.toFile(); \r
+ if (mediaFile.isDirectory()) {\r
+ //logger.info(getSessionMarker(), "Skipping directory {}", mediaPath);\r
return false;\r
+ }\r
\r
- File mediaFile = mediaPath.toFile();\r
- if (mediaFile.isDirectory())\r
+ if (EscortFiles.isMediaCatched(mediaPath)) {\r
+ //logger.info(getSessionMarker(), "Skipping already catched {}", mediaPath);\r
return false;\r
+ }\r
\r
- if (EscortFiles.isMediaCatched(mediaPath))\r
+ Path nomdFile = Paths.get(mediaPath.toString() + ".nomd");\r
+\r
+ if (nomdFile.toFile().exists()) {\r
+ //logger.info(getSessionMarker(), "Skipping nomd file exists {}", nomdFile);\r
return false;\r
+ }\r
\r
- if (handleArchiveConflict(mediaPath))\r
+ if (handleArchiveConflict(mediaPath)) {\r
+ logger.info(getSessionMarker(), "Skipping archive db already contains {}", mediaPath);\r
return false;\r
+ }\r
\r
- if (!canReadMediaInfo(mediaPath))\r
+ if (!canReadMediaInfo(mediaPath)) {\r
+ logger.info(getSessionMarker(), "Skipping cant read mediainfo {}", mediaPath);\r
return false;\r
+ }\r
\r
ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
\r
+ if (archiveItem == null) {\r
+ Message msg = new ParameterizedMessage("Nincs metaadat!");\r
+ logger.info(new MediaCubeMarker("vasary@elgekko.net,muszak@mediavivantis.hu",\r
+ "Értesítés problémás " + mediaPath.getFileName().toString() + " archiválásról"), msg);\r
+ Files.createFile(nomdFile);\r
+ return false;\r
+ }\r
+\r
try {\r
- checkArchiveItem(archiveItem, mediaPath);\r
- submitted++;\r
+ checkArchiveItem(archiveItem);\r
\r
Map<String, Object> parameters = ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays);\r
IJobRuntime runtime = getEngine().submit(getJobRuntime(), e -> {\r
throw new Exception("Submit returned null runtime");\r
runtime.setRelated(mediaPath.toString());\r
EscortFiles.createMediaCatch(mediaPath);\r
+ String metadata = archiveItemJSON(archiveItem);\r
+ EscortFiles.createMetadata(mediaPath.getParent().toString(), mediaPath.getFileName().toString(), metadata);\r
+ submitted++;\r
} catch (Exception e) {\r
- String fileName = new File(archiveItem.getMediaFile()).getName();\r
- logger.error(getSessionMarker(), "Az '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", fileName, e.getMessage());\r
+ logger.error(getSessionMarker(),\r
+ "Az '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", mediaPath,\r
+ e.getMessage());\r
}\r
\r
return true;\r
\r
@Override\r
public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
- //logger.info("Will archived {}", filePath);\r
+ logger.info(getSessionMarker(), "Will checked {}", filePath);\r
try {\r
processPathItem(filePath);\r
} catch (Exception e) {\r
package user.jobengine.server.steps;\r
\r
-import org.apache.commons.net.ftp.FTPClient;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.apache.logging.log4j.Marker;\r
-import org.apache.logging.log4j.MarkerManager;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
\r
-import user.commons.StoreUri;\r
-import user.commons.remotestore.FtpDirectoryLister;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.MediaCubeMarker;\r
\r
public class CancelableStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
- int count = 10;\r
\r
@StepEntry\r
public Object[] execute(int param) throws Exception {\r
- try {\r
+ logger.info(getMarker(), "Executing");\r
+ Message msg = new ParameterizedMessage("");\r
+ logger.info(new MediaCubeMarker("vasary@elgekko.net,vasary@gmail.com", "MediaCube rendszerüzenet"), msg);\r
\r
- Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
- getJobRuntime().setRelated("TESZT" + param);\r
-\r
- for (int i = 0; i < count; i++) {\r
- if (getJobRuntime().isWaitingCancel())\r
- break;\r
- Thread.sleep(500);\r
- if (param==0)\r
- throw new Exception();\r
- if (param==1) {\r
- getJobRuntime().setDisableRetry(true);\r
- throw new Exception();\r
- }\r
- int progress = (i + 1) * 100 / count;\r
- setProgress(progress);\r
- }\r
- } catch (Exception e) {\r
- logger.info(e.getMessage());\r
- throw e;\r
+ for (int i = 0; i < 10; i++) {\r
+ logger.info(getMarker(), "Executing {}", i);\r
+ if (getJobRuntime().isWaitingCancel())\r
+ break;\r
+ Thread.sleep(100);\r
+ int progress = (i + 1) * 100 / 10;\r
+ setProgress(progress);\r
}\r
+\r
return null;\r
}\r
\r
import org.apache.logging.log4j.Logger;\r
import org.apache.logging.log4j.Marker;\r
\r
-import user.commons.RemoteFile;\r
-import user.commons.StoreUri;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
-import user.jobengine.db.Store;\r
-import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
\r
public class CleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
\r
\r
private Path sourcePath;\r
private SimpleDateFormat dateFormat;\r
- private StoreUri tsmStoreUri;\r
+ private boolean skipArchiveCheck;\r
\r
private Date checkExpiration(List<Path> killDateFiles) {\r
Date killDate = null;\r
}\r
\r
@StepEntry\r
- public Object[] execute(String sourceFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+ public Object[] execute(String sourceFolder, boolean skipArchiveCheck) throws Exception {\r
+ this.skipArchiveCheck = skipArchiveCheck;\r
marker = getSessionMarker();\r
sourcePath = Paths.get(sourceFolder);\r
DirectoryStream<Path> directoryStream = null;\r
throw new NullPointerException(String.format("Directory %s not exists.", sourceFolder));\r
}\r
\r
- Store tsmStore = getManager().getSystemStore(false);\r
- if (tsmStore == null)\r
- throw new NullPointerException("A TSM bejegyzés nem található!");\r
-\r
- tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
- if (tsmStoreUri == null)\r
- throw new NullPointerException("A TSM forrás elérése nem található!");\r
-\r
try {\r
setProgress(1);\r
dateFormat = new SimpleDateFormat(DATEFORMAT);\r
return result;\r
}\r
\r
- private boolean isArchived(Path filePath) {\r
- boolean result = false;\r
- String name = filePath.getFileName().toString();\r
- String[] tsmName = new String[] { null };\r
- String query = String.format("SELECT relativepath FROM MEDIAFILE WHERE houseid = '%s'", name);\r
- getManager().executeQuery(query, rs -> {\r
- tsmName[0] = rs.getString("relativepath");\r
- return false;\r
- }, null);\r
-\r
- if (tsmName[0] != null) {\r
- try {\r
- RemoteFile remoteFile = tsmStoreUri.getRemoteFile(tsmName[0]);\r
- result = remoteFile != null;\r
- } catch (Exception e) {\r
- logger.error(e.getMessage());\r
- } finally {\r
- tsmStoreUri.cleanUp();\r
- }\r
- }\r
- return result;\r
- }\r
-\r
@Override\r
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
if (!dir.equals(sourcePath) && isEmpty(dir)) {\r
if (killDate == null)\r
return;\r
\r
- if (!isArchived(filePath)) {\r
- logger.error(marker, "A(z) {} anyag törlésre van kijelölve, de nem található az archívumban.", filePath);\r
- return;\r
+ if (!skipArchiveCheck && filePath.toFile().length() > 0) {\r
+ if (!ItemManagerExtensions.isArchived(getManager(), filePath)) {\r
+ logger.error(marker, "A(z) {} anyag törlésre van kijelölve, de nem található az archívumban.", filePath);\r
+ return;\r
+ }\r
}\r
\r
if (removeFiles(filePath, killDateFiles))\r
import user.commons.nosql.NoSQLUtils;\r
import user.jobengine.db.IItemManager;\r
import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
\r
@StepEntry\r
public Object[] execute(String localHiresPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
Object[] result = new Object[] { null, null, "%s", null, 0, true };\r
+\r
DB db = NoSQLUtils.getNoSQLDB();\r
DBCollection collection = db.getCollection("missing_lowres");\r
IItemManager manager = jobEngine.getItemManager();\r
\r
private Media getFirstUntranscodedMedia(IItemManager manager, DBCollection collection) {\r
Media[] result = new Media[] { null };\r
- //MV\r
+ // MV\r
String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC";\r
\r
- //HTV\r
- //String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
+ // HTV\r
+ // String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
manager.executeQuery(query, rs -> {\r
try {\r
long mediaId = rs.getLong(1);\r
Media media = manager.getMedia(mediaId);\r
- //a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell nekunk\r
+ // a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell\r
+ // nekunk\r
String name = media.getMediaFileRealName();\r
- logger.info(getSessionMarker(), "Checking {}", name);\r
+ //logger.info(getSessionMarker(), "Checking {}", name);\r
long existing = collection.find(new BasicDBObject("name", name)).count();\r
if (existing > 0) {\r
- logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+ // logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+ return true;\r
+ }\r
+\r
+ // 210617 proxy keszites tiltasa\r
+ MediaFile mf = manager.getSystemMediaFile(media);\r
+ if (mf.isDisableProxy()) {\r
+ logger.info(getSessionMarker(), "Proxy disabled {}", name);\r
+ \r
return true;\r
}\r
\r
+++ /dev/null
-package user.jobengine.server.steps.shared;\r
-\r
-import user.commons.configuration.SystemConfiguration;\r
-\r
-public class ExternalCommandExecutor {\r
-\r
- public void execute(String profileName, String input, String output, IExternalCallback responseCallBack) throws Exception {\r
- ExternalCommand externalCommand = getExternalCommand(profileName);\r
- externalCommand.execute(input, output, false, responseCallBack);\r
- }\r
-\r
- private ExternalCommand getExternalCommand(String profileName) throws Exception {\r
- ExternalProfilesConfig config = SystemConfiguration.getInstance().load("settings/external-commands.yaml", ExternalProfilesConfig.class);\r
-\r
- if (config == null)\r
- throw new Exception("Missing external-commands.yaml configuration");\r
-\r
- ExternalProfile selectedProfile = null;\r
- for (ExternalProfile profile : config.getProfiles()) {\r
- if (profileName.equals(profile.getName())) {\r
- selectedProfile = profile;\r
- break;\r
- }\r
- }\r
-\r
- if (selectedProfile == null)\r
- throw new Exception("Missing profile " + profileName + " in external-commands.yaml configuration");\r
-\r
- return new ExternalCommand(selectedProfile);\r
- }\r
-\r
-}\r
+++ /dev/null
-package user.jobengine.server.steps.shared;\r
-\r
-import java.util.List;\r
-\r
-public class ExternalProfile {\r
- private String executable;\r
- private String name;\r
- private List<String> arguments;\r
-\r
- public List<String> getArguments() {\r
- return arguments;\r
- }\r
-\r
- public String getExecutable() {\r
- return executable;\r
- }\r
-\r
- public String getName() {\r
- return name;\r
- }\r
-\r
- public void setArguments(List<String> arguments) {\r
- this.arguments = arguments;\r
- }\r
-\r
- public void setExecutable(String executable) {\r
- this.executable = executable;\r
- }\r
-\r
- public void setName(String name) {\r
- this.name = name;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-package user.jobengine.server.steps.shared;\r
-\r
-import java.util.List;\r
-\r
-public class ExternalProfilesConfig {\r
- private List<ExternalProfile> profiles;\r
-\r
- public List<ExternalProfile> getProfiles() {\r
- return profiles;\r
- }\r
-\r
- public void setProfiles(List<ExternalProfile> profiles) {\r
- this.profiles = profiles;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-package user.jobengine.server.steps.shared;\r
-\r
-public interface IExternalCallback {\r
- void onResponse(String data);\r
-}
\ No newline at end of file
+++ /dev/null
-package user.jobengine.server.steps;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-import user.jobengine.db.IItemManager;\r
-import user.jobengine.db.IResultSetConsumer;\r
-\r
-public class ItemManagerExtensions {\r
-\r
- public static BasicDBObject getArchiveInfo(IItemManager manager, long houseid) {\r
- final BasicDBObject[] result = { null };\r
- StringBuilder query = new StringBuilder();\r
- query.append("select count(*) as count, sum(length) as duration FROM media");\r
- query.append(" ");\r
- query.append(String.format("where houseid='%d' and itemtypeid = 82", houseid));\r
- query.append(" ");\r
- query.append("group by houseid");\r
- IResultSetConsumer consumer = rs -> {\r
- BasicDBObject o = new BasicDBObject();\r
- o.put("count", rs.getLong("count"));\r
- o.put("duration", rs.getLong("duration"));\r
- result[0] = o;\r
- return false;\r
- };\r
- manager.executeQuery(query.toString(), consumer, null);\r
- return result[0];\r
- }\r
-\r
- public static long getExistingRundownMedia(IItemManager manager, String houseid) {\r
- final long[] result = { 0 };\r
- final String[] idToCheck = { houseid };\r
- int pos = houseid.lastIndexOf("-");\r
- //a hivas a CopyForArchiveNEXIOMaterialsStep-bol is johet, ott meg nincs idobelyegezve a nev!\r
- if (pos > 0 && houseid.length() - pos > 4)\r
- idToCheck[0] = houseid.substring(0, pos);\r
- MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(idToCheck[0]);\r
- if (metadataType == MetadataType.OctopusPlaceholder) {\r
- StringBuilder query = new StringBuilder();\r
- query.append("select mediaid, mediafilehouseid, filename");\r
- query.append(" ");\r
- query.append(String.format("from vw_rundown_items where mediafilehouseid like '%s%%'", idToCheck[0]));\r
- query.append(" ");\r
- query.append("order by filename, mediaid");\r
- IResultSetConsumer consumer = rs -> {\r
- String fileName = rs.getString("filename");\r
- if (idToCheck[0].equals(fileName)) {\r
- result[0] = rs.getLong("mediaid");\r
- return false;\r
- } else\r
- return true;\r
- };\r
- manager.executeQuery(query.toString(), consumer, null);\r
- }\r
-\r
- return result[0];\r
- }\r
-\r
-}\r
+++ /dev/null
-package user.jobengine.server.steps;\r
-\r
-import javax.ws.rs.client.Entity;\r
-import javax.ws.rs.client.Invocation.Builder;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.MultivaluedMap;\r
-import javax.ws.rs.core.Response;\r
-import javax.ws.rs.core.Response.Status;\r
-\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-import org.jboss.resteasy.client.jaxrs.ResteasyClient;\r
-import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
-import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;\r
-import org.jboss.resteasy.specimpl.MultivaluedMapImpl;\r
-\r
-import com.ibm.nosql.json.JSONUtil;\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-public class MediaCubeClient {\r
- private static Logger logger = LogManager.getLogger();\r
- private ResteasyWebTarget webTarget;\r
-\r
- public MediaCubeClient(String address) {\r
- ResteasyClient client = new ResteasyClientBuilder().build();\r
- webTarget = client.target(address);\r
- }\r
-\r
- BasicDBObject getDbObject(String json) {\r
- BasicDBObject result = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
-\r
- if (result == null)\r
- throw new NullPointerException("API Result is null!");\r
-\r
- if (result.containsKey("exception")) {\r
- BasicDBObject e = (BasicDBObject) result.get("exception");\r
- throw new RuntimeException(e.getString("message"));\r
- }\r
- //{"exception":{"message":"Invalid credentials.","publicName":"AuthenticationFailedException"}}\r
- return result;\r
- }\r
-\r
- public BasicDBObject getStatus(long jobId) {\r
- MultivaluedMap<String, Object> vars = new MultivaluedMapImpl<>();\r
- vars.add("jobId", jobId);\r
- Response response = query("services/rest/jobengine/jobstatus", vars).get();\r
- if (response.getStatus() != Status.OK.getStatusCode()) {\r
- logger.error(response.readEntity(String.class));\r
- System.out.println(response.readEntity(String.class));\r
- return null;\r
- }\r
- String result = response.readEntity(String.class);\r
- return getDbObject(result);\r
- }\r
-\r
- private Builder query(String path, MultivaluedMap<String, Object> vars) {\r
- ResteasyWebTarget target = webTarget.path(path).queryParams(vars);\r
- Builder result = target.request();\r
- return result;\r
- }\r
-\r
- public long startjob(String template, String name, BasicDBObject jobParams) throws Exception {\r
- MultivaluedMap<String, Object> vars = new MultivaluedMapImpl<>();\r
- vars.add("template", template);\r
- vars.add("name", name);\r
- Response response = query("services/rest/jobengine/startjob", vars).post(Entity.entity(jobParams.toString(), MediaType.APPLICATION_JSON));\r
-\r
- if (response.getStatus() != Status.OK.getStatusCode()) {\r
- logger.error(response.readEntity(String.class));\r
- return 0;\r
- }\r
-\r
- String resultObject = response.readEntity(String.class);\r
- return Long.parseLong(resultObject);\r
- }\r
-\r
-}\r
\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.apache.logging.log4j.Marker;\r
\r
-import user.commons.mediatool.MediaInfo;\r
+import user.commons.mediaarea.MediaArea;\r
import user.jobengine.db.Media;\r
\r
public class MediaToolStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
- private Marker marker;\r
\r
@StepEntry\r
public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia) throws Exception {\r
- marker = getSessionMarker();\r
-\r
- //TODO ez most minden esetben ujranezi\r
- // if (mediaCubeMedia.getLength() > 0)\r
- // return null;\r
-\r
Path filePath = Paths.get(archiveItem.getMediaFile());\r
- MediaInfo mi = new MediaInfo(filePath);\r
- try {\r
- mi.process();\r
- long frames = mi.getFrames();\r
- if (frames > 0) {\r
- mediaCubeMedia.setLength(frames);\r
- getManager().modify(mediaCubeMedia);\r
- }\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- logger.error(marker, "A '{}' média analizálása sikertelen. A rendszer üzenete: {}", filePath, e.getMessage());\r
+ MediaArea ma = new MediaArea(filePath);\r
+ ma.process();\r
+ long frames = ma.getFrameCount();\r
+ if (frames > 0) {\r
+ logger.info("Media {} length is {}", filePath, frames);\r
+ mediaCubeMedia.setLength(frames);\r
+ getManager().modify(mediaCubeMedia);\r
}\r
return null;\r
}\r
+++ /dev/null
-package user.jobengine.server.steps;\r
-\r
-public enum MetadataType {\r
- TrafficMaterial, TrafficPromo, TrafficAD, OctopusStory, OctopusPlaceholder, Generic\r
-}\r
+++ /dev/null
-package user.jobengine.server.steps;\r
-\r
-import org.apache.commons.lang.StringUtils;\r
-\r
-public class MetadataTypeDetector {\r
-\r
- private static final String HYPHEN = "-";\r
- private static final String DOT = ".";\r
-\r
- private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+$";\r
- private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
- private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
-\r
- public static MetadataType GuessMetadataType(String id) {\r
- if (StringUtils.isBlank(id))\r
- return MetadataType.Generic;\r
- if (id.matches(REGEXP_TRAFFICMATERIALID))\r
- return MetadataType.TrafficMaterial;\r
- if (id.matches(REGEXP_TRAFFICPROMOID))\r
- return MetadataType.TrafficPromo;\r
- if (id.matches(REGEXP_TRAFFICADID))\r
- return MetadataType.TrafficAD;\r
- if (id.matches(REGEXP_OCTOPUSSTORYID))\r
- return MetadataType.OctopusStory;\r
- if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
- return MetadataType.OctopusPlaceholder;\r
- if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
- return MetadataType.OctopusPlaceholder;\r
- return MetadataType.Generic;\r
- }\r
-\r
- public static String truncateExtension(String name) {\r
- String result = name;\r
- if (result != null && result.contains(DOT))\r
- result = result.substring(0, result.lastIndexOf(DOT));\r
- return result;\r
- }\r
-\r
- public static String truncateVersion(String name) {\r
- String result = name;\r
- if (result != null && result.contains(HYPHEN))\r
- result = result.split(HYPHEN)[0];\r
- return result;\r
- }\r
-\r
-}\r
import user.jobengine.db.ArchivedMedia;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
-\r
-/*\r
-package user.jobengine.server.steps.MetadataType;\r
-package user.jobengine.server.steps.MetadataTypeDetector;\r
-package user.jobengine.server.steps.EscortFiles;\r
-*/\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.server.steps.shared.MetadataType;\r
+import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
\r
public class OutputPathAndNameSelectorStep extends JobStep {\r
\r
package user.jobengine.server.steps;\r
\r
+import java.util.List;\r
+\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
\r
import user.commons.remotestore.RemoteStoreProtocol;\r
import user.jobengine.db.Media;\r
import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
\r
public class PrepareMediaRestoreStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
\r
@StepEntry\r
- public Object[] execute(Media media, String mediaStoreProtocol, String tempStoreName, String tempStoreProtocol) throws Exception {\r
+ public Object[] execute(Media media, String tempStoreName, String tempStoreProtocol) throws Exception {\r
StoreUri mediaStoreUri = null;\r
- for (MediaFile mediaFile : media.getMediaFiles()) {\r
- if (mediaFile.getStore().isSystem() && !mediaFile.getStore().isLowres()) {\r
- mediaStoreUri = mediaFile.getStore().getStoreUri(Enum.valueOf(RemoteStoreProtocol.class, mediaStoreProtocol));\r
+ List<MediaFile> mediaFiles = media.getMediaFiles();\r
+ if (mediaFiles.size() > 1)\r
+ throw new Exception("Media " + media.getId() + " already has proxy");\r
+ for (MediaFile mediaFile : mediaFiles) {\r
+ Store store = mediaFile.getStore();\r
+ if (store.isSystem() && !store.isLowres()) {\r
+ mediaStoreUri = store.getStoreUri(RemoteStoreProtocol.TSM);\r
if (mediaStoreUri != null)\r
break;\r
}\r
+++ /dev/null
-package user.jobengine.server.steps;\r
-\r
-import java.nio.file.Paths;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-public class PrepareRemoteTranscodeJobParametersStep extends JobStep {\r
- @StepEntry\r
- public Object[] execute(String profileName, String fileName) throws Exception {\r
- String transcoderInputDir = "m:\";\r
- String transcoderOutputDir = "m:\";\r
- String outFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".mp4";\r
- BasicDBObject parameters = new BasicDBObject();\r
- parameters.put("profile", profileName);\r
- parameters.put("input", Paths.get(transcoderInputDir, fileName));\r
- parameters.put("output", Paths.get(transcoderOutputDir, outFileName));\r
- return new Object[] { parameters };\r
- }\r
-\r
-}\r
import user.commons.nosql.NoSQLUtils;\r
import user.jobengine.db.IItemManager;\r
import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
\r
public class QueryMissingProxyMediaStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
\r
@StepEntry\r
public Object[] execute() throws Exception {\r
- Object[] result = new Object[] { null };\r
+ setDescription("Looking for missing proxy");\r
DB db = NoSQLUtils.getNoSQLDB();\r
DBCollection collection = db.getCollection("missing_lowres");\r
Media media = getFirstUntranscodedMedia(collection);\r
\r
- try {\r
- if (media == null) {\r
- logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
- // throw new Exception("Nincs feldolgozandó hiány.");\r
- cancel();\r
- return null;\r
- }\r
-\r
- String name = media.getMediaFileRealName();\r
- collection.save(new BasicDBObject("name", name));\r
- logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
- result[0] = media;\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- logger.error(getSessionMarker(), e.getMessage());\r
- throw e;\r
- } finally {\r
- setProgress(100);\r
+ if (media == null) {\r
+ logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
+ cancel();\r
+ return null;\r
}\r
- return result;\r
+\r
+ String name = media.getMediaFileRealName();\r
+ collection.save(new BasicDBObject("name", name));\r
+ logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
+ return new Object[] { media };\r
}\r
\r
private Media getFirstUntranscodedMedia(DBCollection collection) {\r
Media media = manager.getMedia(mediaId);\r
//a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell nekunk\r
String name = media.getMediaFileRealName();\r
- logger.info(getSessionMarker(), "Checking {}", name);\r
+ //logger.info(getSessionMarker(), "Checking {}", name);\r
long existing = collection.find(new BasicDBObject("name", name)).count();\r
if (existing > 0) {\r
- logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+ //logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+ return true;\r
+ }\r
+ // 210617 proxy keszites tiltasa\r
+ MediaFile mf = manager.getSystemMediaFile(media);\r
+ if (mf.isDisableProxy()) {\r
+ //logger.info(getSessionMarker(), "Proxy disabled {}", name);\r
+ \r
return true;\r
}\r
\r
\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
-/*\r
-import user.jobengine.server.steps.MediaCubeClient;\r
-*/\r
+import user.jobengine.server.steps.shared.MediaCubeClient;\r
+\r
public class RemoteJobStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
\r
@StepEntry\r
- public Object[] execute(String server, String template, String name, String profile) throws Exception {\r
- try {\r
- MediaCubeClient mc = new MediaCubeClient(server);\r
- BasicDBObject params = new BasicDBObject();\r
- params.put("profile", profile);\r
- params.put("input", "c:/_workspace/data/video/proba1.mxf");\r
- params.put("output", "c:/_video/proba1.mp4");\r
-\r
- long jobId = mc.startjob(template, name, params);\r
- logger.info(getMarker(), "Started {} on server {}", jobId, server);\r
- while (true) {\r
- BasicDBObject status = mc.getStatus(jobId);\r
- if (status != null)\r
- setProgress(status.getInt("progress"));\r
-\r
- String jobStatus = status.getString("status");\r
- if ("SUSPENDED".equals(jobStatus))\r
- throw new Exception(status.getString("description"));\r
-\r
- if ("FINISHED".equals(jobStatus))\r
- break;\r
- }\r
-\r
- } catch (Exception e) {\r
- throw e;\r
+ public Object[] execute(String remoteServer, String template, String name, BasicDBObject remoteJobParameters) throws Exception {\r
+ setDescription("Executing on {}, template {}, profile {}", remoteServer, template, remoteJobParameters.getString("profile"));\r
+ MediaCubeClient mc = new MediaCubeClient(remoteServer);\r
+ long jobId = mc.startjob(template, name, remoteJobParameters);\r
+ logger.info(getMarker(), "Started {} on server {}", jobId, remoteServer);\r
+ while (true) {\r
+ BasicDBObject status = mc.getStatus(jobId);\r
+ if (status != null)\r
+ setProgress(status.getInt("progress"));\r
+\r
+ Thread.sleep(2000);\r
+\r
+ String jobStatus = status.getString("status");\r
+ if ("SUSPENDED".equals(jobStatus))\r
+ throw new Exception(status.getString("description"));\r
+\r
+ if ("FINISHED".equals(jobStatus))\r
+ break;\r
}\r
- return new Object[] { null };\r
+\r
+ return null;\r
}\r
}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.apache.commons.io.FilenameUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.IEntityBase;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.MediaFileDAO;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class SafeDeleteRecursive extends JobStep implements FileVisitor<Path> {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String ITEM_TITLE = "itemTitle";\r
+ private static final String ITEM_HOUSEID = "itemHouseId";\r
+ private static final String MEDIA_HOUSEID = "mediaHouseId";\r
+ private static final String MEDIA_TITLE = "mediaTitle";\r
+ private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+ private static final String MEDIA_TYPE = "mediaType";\r
+ private static final String KILLDATEEXT = ".killdate";\r
+ private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");\r
+\r
+ private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
+ EscortFiles.CONFLICTFOLDER);\r
+ private Set<String> includeList;\r
+\r
+ private boolean canReadMediaInfo(Path mediaFilePath) {\r
+ boolean result = false;\r
+ try {\r
+ MediaInfo mi = new MediaInfo(mediaFilePath);\r
+ mi.process();\r
+ result = true;\r
+ } catch (Exception e) {\r
+ logger.warn(getSessionMarker(), e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private boolean checkArchiveItem(ArchiveItem archiveItem, Item item, Media media) {\r
+ if (archiveItem == null)\r
+ return false;\r
+\r
+ String itemHouseId = archiveItem.getItemHouseId() == null ? "" : archiveItem.getItemHouseId();\r
+ if (!itemHouseId.equals(item.getHouseId())) {\r
+ logger.error(getSessionMarker(), "ItemHouseId");\r
+ return false;\r
+ }\r
+\r
+ String itemTitle = archiveItem.getItemTitle() == null ? "" : archiveItem.getItemTitle();\r
+ if (!itemTitle.equals(item.getTitle())) {\r
+ logger.error(getSessionMarker(), "ItemTitle");\r
+ return false;\r
+ }\r
+ String mediaHouseId = archiveItem.getMediaHouseId() == null ? "" : archiveItem.getMediaHouseId();\r
+ if (!mediaHouseId.equals(media.getHouseId())) {\r
+ logger.error(getSessionMarker(), "MediaHouseId");\r
+ return false;\r
+ }\r
+ String mediaTitle = archiveItem.getMediaTitle() == null ? "" : archiveItem.getMediaTitle();\r
+ if (!mediaTitle.equals(media.getTitle())) {\r
+ logger.error(getSessionMarker(), "MediaTitle");\r
+ return false;\r
+ }\r
+\r
+ String mediaDescription = archiveItem.getMediaDescription() == null ? "" : archiveItem.getMediaDescription();\r
+ String storedMediaDescription = media.getDescription() == null ? "" : media.getDescription();\r
+ if (!mediaDescription.equals(storedMediaDescription)) {\r
+ logger.error(getSessionMarker(), "MediaDescription");\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ private ArchiveItem createArchiveItem(Path filePath) throws Exception {\r
+ ArchiveItem result = null;\r
+\r
+ String fileName = filePath.getFileName().toString();\r
+ String mediaHouseId = FilenameUtils.removeExtension(fileName);\r
+ try {\r
+ result = getPlanAirMetadata(mediaHouseId);\r
+\r
+ if (result != null)\r
+ result.setMediaFile(filePath.toString());\r
+\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "PlanAir metadata error", e);\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourcePath) throws Exception {\r
+ logger.info(getSessionMarker(), "Starting in {}", sourcePath);\r
+ logger.info(getSessionMarker(), "{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};", "Napló időbélyeg",\r
+ "Neve", "Elérése", "Mérete", "Létrehozva", "Módosítva", "Archiválva (MC)", "Archiválva (TSM)",\r
+ "Méret (TSM)", ".catched", ".killdate", ".nomd", "Archivált (MC)", "Archivált (TSM)",\r
+ "Metaadat egyezés", "Méret egyezés", "Törölhető", "Kezelendő");\r
+\r
+ try {\r
+ String location = "/opt/test-mediacube/file_list_original.txt";\r
+ includeList = loadIncludeList(location);\r
+ Files.walkFileTree(Paths.get(sourcePath), this);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
+ e.getMessage());\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private ArchiveItem getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+ PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+ opt.setSearch(mediaHouseId);\r
+ opt.setType(MetadataType.Material);\r
+\r
+ BasicDBObject json = null;\r
+ List<IMetadata> data = null;\r
+\r
+ IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+ if (factory == null)\r
+ logger.info(getSessionMarker(), "IMetadataProviderFactory is null");\r
+\r
+ IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+ if (planairProvider == null)\r
+ logger.info(getSessionMarker(), "IMetadataProvider is null");\r
+\r
+ ArchiveItem result = null;\r
+ data = planairProvider.list(opt);\r
+ if (data.size() != 0)\r
+ json = data.get(0).asJSON();\r
+ else {\r
+ opt.setType(MetadataType.Promo);\r
+ data = planairProvider.list(opt);\r
+ if (data.size() != 0)\r
+ json = data.get(0).asJSON();\r
+ else {\r
+ opt.setType(MetadataType.AD);\r
+ data = planairProvider.list(opt);\r
+ if (data.size() != 0)\r
+ json = data.get(0).asJSON();\r
+ }\r
+ }\r
+ if (json != null) {\r
+ result = new ArchiveItem();\r
+ result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
+ result.setItemTitle(json.getString(ITEM_TITLE));\r
+ result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
+ result.setMediaTitle(json.getString(MEDIA_TITLE));\r
+ result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
+ result.setMediaType(json.getString(MEDIA_TYPE));\r
+ }\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult postVisitDirectory(Path paramT, IOException paramIOException) throws IOException {\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes)\r
+ throws IOException {\r
+ Path dirName = dir.getFileName();\r
+\r
+ if (skipPathNames.contains(dirName.toString())) {\r
+ //logger.info(getSessionMarker(), "PreVisit skip {}", dir);\r
+ return FileVisitResult.SKIP_SUBTREE;\r
+ } //else\r
+ //logger.info(getSessionMarker(), "PreVisit {}", dir);\r
+\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ private boolean processPathItem(Path mediaPath) throws Exception {\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ return false;\r
+ }\r
+\r
+ BasicFileAttributes attr = Files.readAttributes(mediaPath, BasicFileAttributes.class);\r
+ File mediaFSFile = mediaPath.toFile();\r
+ String fileName = mediaPath.getFileName().toString();\r
+\r
+ if (mediaFSFile.isDirectory())\r
+ return true;\r
+\r
+ if (fileName.startsWith(".") || fileName.endsWith(".nomd"))\r
+ return true;\r
+\r
+ Path nomdFile = Paths.get(mediaPath.toString() + ".nomd");\r
+ ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
+ List<Path> killDateFiles = getKillDateFiles(mediaPath);\r
+ MediaFile mediaFile = getMediaFile(fileName);\r
+\r
+ long size = mediaFSFile.length();\r
+ Date lastModifiedDate = new Date(attr.lastModifiedTime().toMillis());\r
+ //Date lastAccesDate = new Date(attr.lastAccessTime().toMillis());\r
+ Date createDate = new Date(attr.creationTime().toMillis());\r
+ boolean catchedExists = EscortFiles.isMediaCatched(mediaPath);\r
+ boolean noMDExists = nomdFile.toFile().exists();\r
+ boolean killdateExists = killDateFiles.size() > 0;\r
+ //boolean mediaInfoAvailable = canReadMediaInfo(mediaPath);\r
+ boolean mcArchived = mediaFile != null;\r
+ boolean metadataEquals = false;\r
+ boolean tsmArchived = false;\r
+ boolean sizeEquals = false;\r
+ Date mcArchivedDate = null;\r
+ long tsmSize = 0;\r
+ Date tsmBackupDate = null;\r
+ boolean includeContains = includeList.contains(mediaPath.toString());\r
+\r
+ if (mcArchived) {\r
+ //metadata\r
+ Media media = getManager().getMedia(mediaFile.getMediaId());\r
+ mcArchivedDate = media.getCreated();\r
+ Item item = getManager().getItem(media.getItemId());\r
+ metadataEquals = checkArchiveItem(archiveItem, item, media);\r
+\r
+ //tsm\r
+ String tsmFileName = mediaFile.getRelativePath();\r
+ RemoteFile tsmFile = getTSMFile(tsmFileName);\r
+ tsmArchived = tsmFile != null;\r
+ if (tsmArchived) {\r
+ tsmSize = tsmFile.getSize();\r
+ tsmBackupDate = getTSMBackupDate(tsmFileName);\r
+ sizeEquals = tsmSize == size;\r
+ }\r
+ }\r
+\r
+ boolean canDelete = !noMDExists && catchedExists && killdateExists && mcArchived && tsmArchived\r
+ && metadataEquals;\r
+ Date now = new Date(System.currentTimeMillis());\r
+ logger.info(getSessionMarker(), "{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};{};", D(now), fileName,\r
+ mediaPath.getParent(), size, D(createDate), D(lastModifiedDate), D(mcArchivedDate), D(tsmBackupDate),\r
+ tsmSize, YN(catchedExists), YN(killdateExists), YN(noMDExists), YN(mcArchived), YN(tsmArchived),\r
+ YN(metadataEquals), YN(sizeEquals), YN(canDelete), YN(includeContains));\r
+\r
+ return true;\r
+ }\r
+\r
+ private Date getTSMBackupDate(String tsmFileName) throws Exception {\r
+ Date result = null;\r
+ IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+ if (factory == null)\r
+ return null;\r
+ IMetadataProvider provider = factory.getProvider(MetadataProviderType.TSM);\r
+ if (provider == null)\r
+ return null;\r
+\r
+ IMetadataListOptions opt = provider.createOptions(new BasicDBObject("fileName", tsmFileName));\r
+\r
+ List<IMetadata> tsmContents = provider.list(opt);\r
+ if (tsmContents != null && tsmContents.size() > 0) {\r
+\r
+ for (IMetadata md : tsmContents) {\r
+ Date backupDate = md.asJSON().getDate("backupDate");\r
+ if (result == null)\r
+ result = backupDate;\r
+ else {\r
+ if (backupDate.after(result))\r
+ result = backupDate;\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private char YN(boolean value) {\r
+ return value ? 'Y' : 'N';\r
+ }\r
+\r
+ private String D(Date value) {\r
+ return value == null ? "" : df.format(value);\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+ //logger.info(getSessionMarker(), "Will checked {}", filePath);\r
+ try {\r
+ if (!processPathItem(filePath))\r
+ return FileVisitResult.TERMINATE;\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ @Override\r
+ public FileVisitResult visitFileFailed(Path filePath, IOException paramIOException) throws IOException {\r
+ logger.info("Error archive {}", filePath);\r
+ return FileVisitResult.CONTINUE;\r
+ }\r
+\r
+ private List<Path> getKillDateFiles(Path filePath) {\r
+ String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
+ List<Path> result = new ArrayList<>();\r
+ Path statusPath = null;\r
+ try {\r
+ statusPath = Paths.get(filePath.getParent().toString(), EscortFiles.STATUSFOLDER);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ return null;\r
+ }\r
+ File statusPathFile = statusPath.toFile();\r
+ if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
+ try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
+ stream.forEach(p -> result.add(p));\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ }\r
+ Collections.sort(result);\r
+ return result;\r
+ }\r
+\r
+ MediaFile getMediaFile(String fileName) {\r
+ MediaFile result = null;\r
+ MediaFileDAO mfDAO = (MediaFileDAO) getManager().getBaseDAO(MediaFile.class);\r
+ List<IEntityBase> mfList = mfDAO.getByHouseId(fileName);\r
+ if (mfList != null && mfList.size() == 1)\r
+ result = (MediaFile) mfList.get(0);\r
+ return result;\r
+ }\r
+\r
+ RemoteFile getTSMFile(String mcFileName) {\r
+ RemoteFile result = null;\r
+ Store tsmStore = getManager().getSystemStore(false);\r
+ StoreUri tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+ try {\r
+ result = tsmStoreUri.getRemoteFile(mcFileName);\r
+ } catch (Exception e) {\r
+ logger.error(e);\r
+ } finally {\r
+ tsmStoreUri.cleanUp();\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private Set<String> loadIncludeList(String location) throws IOException {\r
+ Set<String> result = new LinkedHashSet<>();\r
+\r
+ Path path = Paths.get(location);\r
+ List<String> lines = FileUtils.readLines(path.toFile());\r
+\r
+ String lastDir = null;\r
+ for (String line : lines) {\r
+ line = line.trim();\r
+ if (line.startsWith("Directory of")) {\r
+ lastDir = line;\r
+ lastDir = lastDir.replace("Directory of", "");\r
+ lastDir = lastDir.replace("X:", "");\r
+ lastDir = lastDir.replace("\\", "/");\r
+ lastDir = lastDir.trim();\r
+ // if (!lastDir.endsWith(".STATUS"))\r
+ // System.out.println(">> " + lastDir);\r
+ }\r
+\r
+ if (lastDir != null && lastDir.endsWith(".STATUS"))\r
+ continue;\r
+\r
+ if (line.startsWith("2") && line.length() > 39) {\r
+ String file = line.substring(39).trim();\r
+\r
+ if (file.equals(".") || file.equals(".."))\r
+ continue;\r
+\r
+ String len = line.substring(21, 39).trim();\r
+ if (len.length() != 0) {\r
+ String fullpath = "/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file;\r
+ //System.out.println("/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file + " : " + len);\r
+ result.add(fullpath);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+}\r
\r
import java.io.File;\r
import java.io.IOException;\r
-import java.nio.file.Files;\r
-import java.nio.file.attribute.BasicFileAttributes;\r
import java.sql.Timestamp;\r
import java.util.Date;\r
import java.util.List;\r
\r
import user.commons.RemoteFile;\r
import user.commons.StoreUri;\r
+import user.commons.configuration.SystemConfiguration;\r
import user.commons.mediatool.Timecode;\r
import user.commons.mediatool.Timecode.Type;\r
import user.commons.remotestore.IProgressEventListener;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
import user.jobengine.server.JobEngineException;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
\r
public class TSMBackupStep extends JobStep {\r
private static final String MXFEXT = ".MXF";\r
private static final Logger logger = LogManager.getLogger();\r
+ private static boolean RANDOMIZE_ARCHIVES = SystemConfiguration.getInstance().value("tsm.randomize-archives");\r
private IItemManager manager;\r
private File sourceMediaFile;\r
private Store tsmStore;\r
\r
File sourceMediaFile = new File(archiveItem.getMediaFile());\r
String sourceFileName = sourceMediaFile.getName();\r
+ long fileSize = sourceMediaFile.length();\r
+\r
+ try {\r
+ Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+ String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), fileSize);\r
+ logger.info(marker, details);\r
+ getJobRuntime().setDescription(details);\r
+ } catch (Exception e) {\r
+ String details = String.format("%s (%d bytes)", sourceFileName, fileSize);\r
+ getJobRuntime().setDescription(details);\r
+ }\r
Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
- String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
+ String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), fileSize);\r
getJobRuntime().setDescription(details);\r
try {\r
\r
setAndCheck(archiveItem, mediaCubeMedia, getEngine());\r
\r
- //TODO mxf helyett az osszes kiterjesztest!!!!!\r
- //A dupla ellenorzes a napon beluli ismetlesek miatt kell\r
+ // TODO mxf helyett az osszes kiterjesztest!!!!!\r
+ // A dupla ellenorzes a napon beluli ismetlesek miatt kell\r
long existingMediaId = archiveItem.getExistingMediaId();\r
- if (sourceMediaFile.length() == 0 && existingMediaId == 0) {\r
- existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, sourceFileName.replace(MXFEXT, ""));\r
+\r
+ if (fileSize == 0 && existingMediaId == 0) {\r
+ existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager,\r
+ sourceFileName.replace(MXFEXT, ""));\r
if (existingMediaId == 0)\r
existingMediaId = -1;\r
}\r
\r
if (existingMediaId == 0)\r
- existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, sourceFileName.replace(MXFEXT, ""));\r
-\r
- boolean randomizeName = Boolean.parseBoolean(System.getProperty("jobengine.randomize.archives", "false"));\r
-\r
+ existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager,\r
+ sourceFileName.replace(MXFEXT, ""));\r
String targetFileName;\r
- if (randomizeName) {\r
+ if (RANDOMIZE_ARCHIVES) {\r
// a-z, A-Z, 0-9. For example: WRMcpIk7, s57JwCVA\r
- //veletlenszeru neveket adunk!\r
+ // veletlenszeru neveket adunk!\r
targetFileName = String.format("%s-%s", RandomStringUtils.randomAlphanumeric(8), sourceFileName);\r
} else\r
targetFileName = sourceFileName;\r
\r
if (existingMediaId == 0) {\r
- StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, sourceMediaFile.getParent().toString());\r
+ StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL,\r
+ sourceMediaFile.getParent().toString());\r
\r
final IJobRuntime runtime = getJobRuntime();\r
sourceUri.addProgressListener(new IProgressEventListener() {\r
}\r
\r
if (existingMediaId > 0)\r
- logger.info(marker, "Az '{}' TSM mentése nem szükséges, mert már megtalálható az archívumban.", sourceFileName);\r
+ logger.info(marker, "Az '{}' TSM mentése nem szükséges, mert már megtalálható az archívumban.",\r
+ sourceFileName);\r
\r
- //Fel kell szabadítani, hogy a kovetkezo archivalaskor is nekifusson\r
+ // Fel kell szabadítani, hogy a kovetkezo archivalaskor is nekifusson\r
if (existingMediaId == -1) {\r
- logger.info(marker, "Az '{}' mentése jelenleg nem lehetséges, mert a szükséges metaadat még nem található meg az archívumban.", sourceFileName);\r
+ logger.info(marker,\r
+ "Az '{}' mentése jelenleg nem lehetséges, mert a szükséges metaadat még nem található meg az archívumban.",\r
+ sourceFileName);\r
if (!archiveItem.removeCatchedFile())\r
logger.error(marker,\r
"Az '{}' állomány .catched jelző állománya nem törölhető. Az újabb archiválási kísérlethez annak kézi eltávolítása szükséges!",\r
sourceMediaFile.getName());\r
mediaCubeMedia.remove();\r
} else {\r
- saveMetadata(mediaCubeMedia, sourceMediaFile, targetFileName, existingMediaId);\r
+ saveMetadata(mediaCubeMedia, sourceMediaFile, targetFileName, existingMediaId, fileSize,\r
+ archiveItem.isDisableProxy());\r
logger.info(marker, "Az '{}' archiválása sikeres.", sourceFileName);\r
if (killDateDays != 0)\r
EscortFiles.createUNCKillDate(sourceMediaFile.getParent(), sourceFileName, killDateDays, marker);\r
\r
} catch (Exception e) {\r
logger.catching(e);\r
- Message m = new ParameterizedMessage("Az '{}' állomány archiválása sikertelen. A rendszer hibaüzenete: {}", details, e.getMessage());\r
+ Message m = new ParameterizedMessage("Az '{}' állomány archiválása sikertelen. A rendszer hibaüzenete: {}",\r
+ details, e.getMessage());\r
logger.error(marker, m);\r
if (!archiveItem.removeCatchedFile())\r
logger.error(marker,\r
return null;\r
}\r
\r
- private void saveMetadata(Media mediaCubeMedia, File sourceFile, String targetFileName, long existingMediaId) {\r
+ private void saveMetadata(Media mediaCubeMedia, File sourceFile, String targetFileName, long existingMediaId,\r
+ long fileSize, boolean disableProxy) {\r
\r
if (existingMediaId == 0) {\r
- MediaFile mediaFile = manager.createMediaFile(targetFileName, fileType, tsmStore, mediaCubeMedia);\r
- mediaFile.setHouseId(sourceFile.getName());\r
- mediaFile.add();\r
+ MediaFile mf = manager.createMediaFile(targetFileName, fileType, tsmStore, mediaCubeMedia);\r
+ mf.setHouseId(sourceFile.getName());\r
+ mf.setFileSize(fileSize);\r
+ // 210617 proxy keszites tiltasa\r
+ mf.setDisableProxy(disableProxy);\r
+ mf.add();\r
} else {\r
Media existingMedia = manager.getMedia(existingMediaId);\r
List<MediaFile> mediaFiles = existingMedia.getMediaFiles();\r
mf.setPersister(manager);\r
mf.setId(0);\r
mf.setMedia(mediaCubeMedia);\r
+ // mivel itt masolat keszul, nem allitunk at semmit\r
+// mf.setFileSize(fileSize);\r
+// mf.setDisableProxy(disableProxy);\r
mf.add();\r
}\r
}\r
}\r
mediaCubeMedia.setPersister(manager);\r
\r
+ // 210614 megis maradjon az aktualis idopont\r
+ mediaCubeMedia.setArchived(new Timestamp(new Date().getTime()));\r
+\r
+ /*\r
try {\r
BasicFileAttributes attr = Files.readAttributes(sourceFile.toPath(), BasicFileAttributes.class);\r
mediaCubeMedia.setArchived(new Timestamp(attr.creationTime().toMillis()));\r
} catch (IOException e) {\r
logger.catching(e);\r
- mediaCubeMedia.setArchived(new Timestamp(new Date().getTime()));\r
}\r
-\r
+ */\r
mediaCubeMedia.modify();\r
}\r
\r
- private void setAndCheck(ArchiveItem archiveItem, Media mediaCubeMedia, IJobEngine jobEngine) throws JobEngineException, IOException {\r
+ private void setAndCheck(ArchiveItem archiveItem, Media mediaCubeMedia, IJobEngine jobEngine)\r
+ throws JobEngineException, IOException {\r
if (jobEngine == null) {\r
logger.error(marker, "Az folyamatkezelő réteg nem elérhető.");\r
throw new NullPointerException("Internal error, missing JobEngine reference.");\r
sourceMediaFile = new File(archiveItem.getMediaFile());\r
if (sourceMediaFile == null) {\r
logger.error(marker, "A folyamat 'archiveItem' bemeneti paraméter 'mediaFile' értéke üres.");\r
- throw new NullPointerException("System is not configured properly, missing 'mediaFile' value in 'archiveItem' input parameter.");\r
+ throw new NullPointerException(\r
+ "System is not configured properly, missing 'mediaFile' value in 'archiveItem' input parameter.");\r
}\r
if (!sourceMediaFile.exists()) {\r
logger.error(marker, "Az {} állomány nem létezik vagy nem érhető el.", sourceMediaFile.getName());\r
}\r
if (mediaCubeMedia == null) {\r
logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
- throw new NullPointerException("System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+ throw new NullPointerException(\r
+ "System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
}\r
\r
}\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
\r
+/*\r
+import user.jobengine.server.steps.EscortFiles;\r
+*/\r
+\r
public class TSMExtendedRetrieveStep extends TSMRestoreStep {\r
private static String NEXIO_HOST = System.getProperty("nexio.host");\r
// private static String NEXIO_HOST = SystemConfiguration.getInstance().value("services.nexio.host");\r
import user.jobengine.db.Store;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
\r
public class TSMRestoreStep extends JobStep {\r
private static final String DOT = ".";\r
private Marker marker;\r
\r
protected void afterRestore(StoreUri targetUri, String targetPath, int killDateDays, String targetFileName) throws IOException, Exception {\r
- if (killDateDays > 0)\r
+ if (killDateDays != 0)\r
EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
}\r
\r
});\r
RemoteFile result = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
\r
- String globalTargetPath = Paths.get(targetPath, targetFileName).getParent().toString().replace(Paths.get(localRetrievePath).toString(),\r
- globalRetrievePath);\r
+ String globalTargetPath = Paths.get(targetPath, targetFileName)\r
+ .getParent()\r
+ .toString()\r
+ .replace(Paths.get(localRetrievePath).toString(), globalRetrievePath);\r
\r
logger.info(marker,\r
"Az '{}' állomány visszatöltése sikeres volt '{}' néven. A célmappa a <a href='{}' target='_blank'>ide kattintva</a> nyitható meg.",\r
import user.jobengine.db.Store;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
-import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
+import user.jobengine.server.steps.shared.MetadataType;\r
+import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
\r
public class UpdateGhostMediaDataStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
<?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate name="Felhasználói archiválás" useSessionLog="false">\r
+<jobtemplate name="Rkurzív archiválás" useSessionLog="false">\r
<declarations>\r
<parameters>\r
<parameter name="sourcePath" type="java.lang.String" />\r
<parameter name="killDateDays" type="java.lang.Integer" />\r
<parameter name="limit" type="java.lang.Integer" />\r
+ <parameter name="disableProxy" type="java.lang.Boolean" />\r
</parameters>\r
</declarations>\r
<commands>\r
<input>\r
<parameter name="limit" />\r
</input>\r
+ <input>\r
+ <parameter name="disableProxy" />\r
+ </input>\r
</inputs>\r
</calljobstep>\r
</commands>\r
<?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate multiInstance="true" useSessionLog="true">\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
<declarations>\r
<parameters>\r
<parameter name="param" type="java.lang.Integer" />\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Hiányzó PROXY videók pótlása" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+ <parameter name="deleteSource" type="java.lang.Boolean"/>\r
+ <parameter name="killDateDays" type="java.lang.Integer"/>\r
+ <parameter name="successRecipient" type="java.lang.String" />\r
+ <parameter name="localHiresPath" type="java.lang.String" />\r
+ <parameter name="globalHiresPath" type="java.lang.String" />\r
+ <parameter name="localLowresPath" type="java.lang.String" />\r
+ <parameter name="transcoderAddress" type="java.lang.String" />\r
+ <parameter name="transcoderTemplateName" type="java.lang.String" />\r
+ <parameter name="localRetrievePath" type="java.lang.String" />\r
+ <parameter name="globalRetrievePath" type="java.lang.String" />\r
+ <parameter name="targetNamePattern" type="java.lang.String" />\r
+ </parameters>\r
+ <variables>\r
+ <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+ </variables>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="CreateArchiveItemStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localHiresPath" />\r
+ </input>\r
+ </inputs>\r
+ <outputs>\r
+ <output>\r
+ <variable name="archiveItem" />\r
+ </output>\r
+ </outputs>\r
+ </calljobstep>\r
+ <calljobstep type="TSMRestoreStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localHiresPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetNamePattern" />\r
+ </input>\r
+ <input>\r
+ <parameter name="successRecipient" />\r
+ </input>\r
+ <input>\r
+ <parameter name="killDateDays" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localRetrievePath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="globalRetrievePath" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="MediaToolStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <variable name="archiveItem" />\r
+ </input>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="TranscodeFFAStranStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <variable name="archiveItem" />\r
+ </input>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ <input>\r
+ <parameter name="transcoderAddress" />\r
+ </input>\r
+ <input>\r
+ <parameter name="transcoderTemplateName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="globalHiresPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="localLowresPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="deleteSource" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="UpdateGhostMediaDataStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="mediaCubeMedia" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate name="Hiányzó PROXY videók pótlása" useSessionLog="false">\r
+<jobtemplate multiInstance="true" useSessionLog="true">\r
<declarations>\r
<parameters>\r
+ <!-- Media to transcode -->\r
<parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
- <parameter name="deleteSource" type="java.lang.Boolean"/>\r
- <parameter name="killDateDays" type="java.lang.Integer"/>\r
- <parameter name="successRecipient" type="java.lang.String" />\r
- <parameter name="localHiresPath" type="java.lang.String" />\r
- <parameter name="globalHiresPath" type="java.lang.String" />\r
- <parameter name="localLowresPath" type="java.lang.String" />\r
- <parameter name="transcoderAddress" type="java.lang.String" />\r
- <parameter name="transcoderTemplateName" type="java.lang.String" />\r
- <parameter name="localRetrievePath" type="java.lang.String" />\r
- <parameter name="globalRetrievePath" type="java.lang.String" />\r
- <parameter name="targetNamePattern" type="java.lang.String" />\r
+ <!-- Slave server address for transcode -->\r
+ <parameter name="remoteServer" type="java.lang.String" />\r
+ <!-- Slave server template for transcode -->\r
+ <parameter name="transcodeTemplate" type="java.lang.String" />\r
+ <!-- Slave server job display name -->\r
+ <parameter name="jobName" type="java.lang.String" />\r
+ <!-- Slave server transcode job profile -->\r
+ <parameter name="profileName" type="java.lang.String" />\r
+ <!-- TEMP store for media retrieve -->\r
+ <parameter name="tempStoreName" type="java.lang.String" />\r
+ <!-- TEMP store protocol for media retrieve -->\r
+ <parameter name="tempStoreProtocol" type="java.lang.String" />\r
</parameters>\r
<variables>\r
- <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+ <!-- Media file name -->\r
+ <variable name="fileName" type="java.lang.String" />\r
+ <!-- Media store uri -->\r
+ <variable name="mediaStoreUri" type="user.commons.StoreUri" />\r
+ <!-- TEMP store uri -->\r
+ <variable name="tempStoreUri" type="user.commons.StoreUri" />\r
+ <!-- Slave server remote job parameters -->\r
+ <variable name="remoteJobParameters" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+ <!-- Slave server remote job parameters -->\r
+ <variable name="proxyRelativePath" type="java.lang.String" />\r
</variables>\r
</declarations>\r
<commands>\r
- <calljobstep type="CreateArchiveItemStep.java" weight="1">\r
+ <calljobstep type="PrepareMediaRestoreStep.java" weight="1" >\r
<inputs>\r
<input>\r
<parameter name="mediaCubeMedia" />\r
</input>\r
<input>\r
- <parameter name="localHiresPath" />\r
+ <parameter name="tempStoreName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="tempStoreProtocol" />\r
</input>\r
</inputs>\r
<outputs>\r
<output>\r
- <variable name="archiveItem" />\r
+ <variable name="mediaStoreUri" />\r
+ </output>\r
+ <output>\r
+ <variable name="tempStoreUri" />\r
+ </output>\r
+ <output>\r
+ <variable name="fileName" />\r
</output>\r
</outputs>\r
- </calljobstep>\r
- <calljobstep type="TSMRestoreStep.java" weight="1">\r
+ </calljobstep> \r
+ <calljobstep type="TransferStep.java" weight="5" >\r
<inputs>\r
<input>\r
- <parameter name="mediaCubeMedia" />\r
- </input>\r
- <input>\r
- <parameter name="localHiresPath" />\r
- </input>\r
- <input>\r
- <parameter name="targetNamePattern" />\r
+ <variable name="mediaStoreUri" />\r
</input>\r
<input>\r
- <parameter name="successRecipient" />\r
+ <variable name="fileName" />\r
</input>\r
<input>\r
- <parameter name="killDateDays" />\r
+ <variable name="tempStoreUri" />\r
</input>\r
<input>\r
- <parameter name="localRetrievePath" />\r
- </input>\r
- <input>\r
- <parameter name="globalRetrievePath" />\r
+ <variable name="fileName" />\r
</input>\r
</inputs>\r
- </calljobstep>\r
- <calljobstep type="MediaToolStep.java" weight="1">\r
+ </calljobstep> \r
+ <calljobstep type="PrepareRemoteTranscodeStep.java" weight="1" >\r
<inputs>\r
<input>\r
- <variable name="archiveItem" />\r
+ <parameter name="profileName" />\r
</input>\r
<input>\r
- <parameter name="mediaCubeMedia" />\r
+ <variable name="fileName" />\r
</input>\r
</inputs>\r
- </calljobstep>\r
- <calljobstep type="TranscodeFFAStranStep.java" weight="1">\r
+ <outputs>\r
+ <output>\r
+ <variable name="remoteJobParameters" />\r
+ </output>\r
+ <output>\r
+ <variable name="proxyRelativePath" />\r
+ </output>\r
+ </outputs>\r
+ </calljobstep> \r
+ <calljobstep type="RemoteJobStep.java" weight="10" >\r
<inputs>\r
<input>\r
- <variable name="archiveItem" />\r
+ <parameter name="remoteServer" />\r
</input>\r
<input>\r
- <parameter name="mediaCubeMedia" />\r
+ <parameter name="transcodeTemplate" />\r
</input>\r
<input>\r
- <parameter name="transcoderAddress" />\r
+ <parameter name="jobName" />\r
</input>\r
<input>\r
- <parameter name="transcoderTemplateName" />\r
- </input>\r
- <input>\r
- <parameter name="globalHiresPath" />\r
+ <variable name="remoteJobParameters" />\r
</input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="DeleteFile.java" weight="1" >\r
+ <inputs>\r
<input>\r
- <parameter name="localLowresPath" />\r
+ <variable name="fileName" />\r
</input>\r
<input>\r
- <parameter name="deleteSource" />\r
+ <variable name="tempStoreUri" />\r
</input>\r
</inputs>\r
</calljobstep>\r
- <calljobstep type="UpdateGhostMediaDataStep.java" weight="1">\r
+ <calljobstep type="SaveMediaProxy.java" weight="10" >\r
<inputs>\r
<input>\r
<parameter name="mediaCubeMedia" />\r
</input>\r
+ <input>\r
+ <variable name="proxyRelativePath" />\r
+ </input>\r
</inputs>\r
</calljobstep>\r
</commands>\r
<declarations>\r
<parameters>\r
<parameter name="sourcePath" type="java.lang.String"/>\r
+ <parameter name="skipArchiveCheck" type="java.lang.Boolean"/>\r
</parameters>\r
</declarations>\r
<commands>\r
<input>\r
<parameter name="sourcePath" />\r
</input>\r
+ <input>\r
+ <parameter name="skipArchiveCheck" />\r
+ </input>\r
</inputs>\r
</calljobstep>\r
</commands>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+ <commands>\r
+ <calljobstep remote="true" type="IntegrationTestStep.java" weight="1" />\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate multiInstance="true" useSessionLog="true">\r
+<jobtemplate multiInstance="false" useSessionLog="false">\r
<declarations>\r
<parameters>\r
<!-- Slave server address for transcode -->\r
<variable name="tempStoreUri" type="user.commons.StoreUri" />\r
<!-- Slave server remote job parameters -->\r
<variable name="remoteJobParameters" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+ <!-- Slave server remote job parameters -->\r
+ <variable name="proxyRelativePath" type="java.lang.String" />\r
</variables>\r
</declarations>\r
<commands>\r
</input>\r
</inputs>\r
</calljobstep> \r
- <calljobstep type="PrepareRemoteTranscodeJobParametersStep.java" weight="1" >\r
+ <calljobstep type="PrepareRemoteTranscodeStep.java" weight="1" >\r
<inputs>\r
<input>\r
<parameter name="profileName" />\r
<output>\r
<variable name="remoteJobParameters" />\r
</output>\r
+ <output>\r
+ <variable name="proxyRelativePath" />\r
+ </output>\r
</outputs>\r
</calljobstep> \r
<calljobstep type="RemoteJobStep.java" weight="10" >\r
</input>\r
</inputs>\r
</calljobstep>\r
+ <calljobstep type="DeleteFile.java" weight="1" >\r
+ <inputs>\r
+ <input>\r
+ <variable name="fileName" />\r
+ </input>\r
+ <input>\r
+ <variable name="tempStoreUri" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ <calljobstep type="SaveMediaProxy.java" weight="10" >\r
+ <inputs>\r
+ <input>\r
+ <variable name="media" />\r
+ </input>\r
+ <input>\r
+ <variable name="proxyRelativePath" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
</commands>\r
</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Rekurzív törlés" useSessionLog="false">\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="sourcePath" type="java.lang.String" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep id="step1" type="SafeDeleteRecursive.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="sourcePath" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
--- /dev/null
+./stop-mediacube.sh
+./start-mediacube.sh
+
+
url: jdbc:db2://10.11.1.89:51500/tsmdb1\r
user: tsminst1\r
password: tsminst1\r
+ tsm: \r
+ url: jdbc:db2://10.11.1.90:52500/tsmdb1\r
+ user: tsminst1\r
+ password: passwordpassword\r
planair: \r
url: jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis;\r
user: MAM\r
--- /dev/null
+cd /opt/mediacube
+rm -fr tmp/*
+rm -fr configuration/org.eclipse.osgi
+export DSMI_CONFIG=/opt/mediacube/settings/dsm.opt
+export DSMI_LOG=/opt/mediacube/log
+export DSMI_DIR=/opt/tivoli/tsm/server/bin/dbbkapi
+export DSM_DIR=/opt/tivoli/tsm/server/bin/dbbkapi
+export LD_LIBRARY_PATH=/opt/tivoli/tsm/server/bin/dbbkapi:/opt/mediacube
+export LIBPATH=/opt/tivoli/tsm/server/bin/dbbkapi
+export SHLIB_PATH=/opt/tivoli/tsm/server/bin/dbbkapi
+#export TZ=NFT-1DFT,M3.5.0,M10.5.0
+export PATH=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/bin:$PATH
+java \
+-DPRODMEDIACUBE \
+-Dclean \
+-Dorg.eclipse.epp.logging.aeri.skipReports=true \
+-Declipse.ignoreApp=true \
+-Dosgi.noShutdown=true \
+-Dlog4j.configurationFile=settings/log4j2.xml \
+-Djetty.home=settings \
+-Djetty.etc.config.urls=jetty.xml \
+-Dgosh.home=configuration \
+-Djava.io.tmpdir=tmp \
+-Dfile.encoding=UTF-8 \
+-jar plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar \
+-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888 \
+-Xms512m \
+-Xmx4096m &
--- /dev/null
+pkill -f PRODMEDIACUBE
+#wget -qO- http://localhost:9080/services/rest/jobengine/halt
+