Не запрещать доступ на запись к файлам, но отбрасывать их?
У меня есть индекс Lucene (из Geonetwork 2.10.4) со следующими файлами.
_8yw_f.del _8yw_Lucene41_0.pos _8yx.cfe _8yy.si _8z0.si _8z2.si _8z4.si _8z7.si _8za.si _8zc.si _8ze.si write.lock
_8yw.fdt _8yw_Lucene41_0.tim _8yx.cfs _8yz.cfe _8z1.cfe _8z3.cfe _8z6.cfe _8z9.cfe _8zb.cfe _8zd.cfe _8zf.cfe
_8yw.fdx _8yw_Lucene41_0.tip _8yx.si _8yz.cfs _8z1.cfs _8z3.cfs _8z6.cfs _8z9.cfs _8zb.cfs _8zd.cfs _8zf.cfs
_8yw.fnm _8yw_nrm.cfe _8yy_1.del _8yz.si _8z1.si _8z3.si _8z6.si _8z9.si _8zb.si _8zd.si _8zf.si
_8yw_Lucene41_0.doc _8yw_nrm.cfs _8yy.cfe _8z0.cfe _8z2.cfe _8z4.cfe _8z7.cfe _8za.cfe _8zc.cfe _8ze.cfe segments_57i
_8yw_Lucene41_0.pay _8yw.si _8yy.cfs _8z0.cfs _8z2.cfs _8z4.cfs _8z7.cfs _8za.cfs _8zc.cfs _8ze.cfs segments.gen
Когда я устанавливаю папку или файлы только для чтения, Geonetwork выдает серьезную ошибку. Поскольку я не хочу менять приложение Tomcat, я пока оставил эту ошибку.
Теперь моя идея / вопрос: есть ли способ в Linux (Ubuntu и т. Д.) Отменить операции записи и разрешить операции чтения? (chmod 0444
не приводит к цели.) Я имею в виду программу или слой между приложением Tomcat и файловой системой, которая отбрасывает операции записи. Таким образом, Geonetwork записывает что-то в индекс, но в действительности этот процесс записи отбрасывается, и индекс не изменяется или остается таким, каким он был до процесса записи.
1 ответ
Первая попытка - фусепы - не удалась
Твик пример
Я просто взял
def write(self, path, buf, offset, fh):
os.lseek(fh, offset, os.SEEK_SET)
return os.write(fh, buf)
от
https://medium.com/the-python-corner/writing-a-fuse-filesystem-in-python-5e0f2de3a813
или точнее из
https://github.com/skorokithakis/python-fuse-sample/blob/master/passthrough.py
и заменил его
def write(self, path, buf, offset, fh):
print('path: ', path, 'len(buf): ', len(buf), 'offset: ', offset)
return len(buf)
это означает, что ничего не записывается в любой файл или fh (= дескриптор файла) в смонтированном пути. (os.write(...)
обычно возвращает длину записанных байтов.)
Скрыть индекс за моей собственной файловой системой
Для его монтажа я использовал
cd /var/lib/tomcat7/webapps/geonetwork/WEB-INF/data/
mv ./index/ ./index_for_fuse/
mkdir ./index/
python3 /opt/python-fuse-sample/passthrough.py ./index_for_fuse/ ./index/
Ошибка 1
2018-07-24 12:02:07,300 ERROR [jeeves.engine] - {Stack=java.lang.RuntimeException: Unable to create directory: /var/lib/tomcat7/webapps/geonetwork/WEB-INF/data/index
at org.fao.geonet.GeonetworkDataDirectory.setResourceDir(GeonetworkDataDirectory.java:323)
at org.fao.geonet.GeonetworkDataDirectory.setDataDirectory(GeonetworkDataDirectory.java:201)
at org.fao.geonet.GeonetworkDataDirectory.<init>(GeonetworkDataDirectory.java:61)
at org.fao.geonet.Geonetwork.start(Geonetwork.java:165)
at jeeves.server.JeevesEngine.initAppHandler(JeevesEngine.java:600)
at jeeves.server.JeevesEngine.init(JeevesEngine.java:206)
at jeeves.server.sources.http.JeevesServlet.init(JeevesServlet.java:91)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1240)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1184)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1081)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5256)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5539)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:473)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
at java.lang.Thread.run(Thread.java:748)
, Exception=java.lang.RuntimeException: Unable to create directory: /var/lib/tomcat7/webapps/geonetwork/WEB-INF/data/index, Message=Unable to create directory: /var/lib/tomcat7/webapps/geonetwork/WEB-INF/data/index, Handler=org.fao.geonet.Geonetwork, Error=Raised exception while starting appl handler. Skipped.}
Решение 1
Поместите это в код:
FUSE(Passthrough(root), mountpoint, nothreads=True, foreground=True, debug=True, allow_other=True)
Особенно allow_other=True
Это важно, поэтому Tomcat может писать в папку. Нашел здесь:
https://github.com/fusepy/fusepy/wiki/Sharing-fusepy-mount-via-Samba
Ошибка 2
Exception in thread "Lucene Merge Thread #0" org.apache.lucene.index.MergePolicy$MergeException: java.io.EOFException: read past EOF: MMapIndexInput(path="/var/lib/tomcat7/webapps/geonetwork/WEB-INF/data/index/taxonomy/_1.fnm")
at org.apache.lucene.index.ConcurrentMergeScheduler.handleMergeException(ConcurrentMergeScheduler.java:541)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:514)
Caused by: java.io.EOFException: read past EOF: MMapIndexInput(path="/var/lib/tomcat7/webapps/geonetwork/WEB-INF/data/index/taxonomy/_1.fnm")
at org.apache.lucene.store.ByteBufferIndexInput.readByte(ByteBufferIndexInput.java:77)
at org.apache.lucene.store.DataInput.readInt(DataInput.java:84)
at org.apache.lucene.store.ByteBufferIndexInput.readInt(ByteBufferIndexInput.java:128)
at org.apache.lucene.codecs.CodecUtil.checkHeader(CodecUtil.java:126)
at org.apache.lucene.codecs.lucene40.Lucene40FieldInfosReader.read(Lucene40FieldInfosReader.java:56)
at org.apache.lucene.index.SegmentCoreReaders.<init>(SegmentCoreReaders.java:101)
at org.apache.lucene.index.SegmentReader.<init>(SegmentReader.java:57)
at org.apache.lucene.index.ReadersAndLiveDocs.getMergeReader(ReadersAndLiveDocs.java:153)
at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:3635)
at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:3303)
at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:401)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:478)
Нет решения 2
Похоже, поток слияния не может объединить индекс, потому что он проверяет, что он пишет. ^^
Вторая попытка - BASH:)
Продолжение следует.