2021-05-27 11:06:26 +00:00
|
|
|
import * as Comm from 'app/server/lib/Comm';
|
2021-07-21 08:46:03 +00:00
|
|
|
import {parseExportFileName, parseExportParameters} from 'app/server/lib/Export';
|
|
|
|
import {makeCSV} from 'app/server/lib/ExportCSV';
|
|
|
|
import {makeXLSX} from 'app/server/lib/ExportXLSX';
|
|
|
|
import * as log from 'app/server/lib/log';
|
(core) support python3 in grist-core, and running engine via docker and/or gvisor
Summary:
* Moves essential plugins to grist-core, so that basic imports (e.g. csv) work.
* Adds support for a `GRIST_SANDBOX_FLAVOR` flag that can systematically override how the data engine is run.
- `GRIST_SANDBOX_FLAVOR=pynbox` is "classic" nacl-based sandbox.
- `GRIST_SANDBOX_FLAVOR=docker` runs engines in individual docker containers. It requires an image specified in `sandbox/docker` (alternative images can be named with `GRIST_SANDBOX` flag - need to contain python and engine requirements). It is a simple reference implementation for sandboxing.
- `GRIST_SANDBOX_FLAVOR=unsandboxed` runs whatever local version of python is specified by a `GRIST_SANDBOX` flag directly, with no sandboxing. Engine requirements must be installed, so an absolute path to a python executable in a virtualenv is easiest to manage.
- `GRIST_SANDBOX_FLAVOR=gvisor` runs the data engine via gvisor's runsc. Experimental, with implementation not included in grist-core. Since gvisor runs on Linux only, this flavor supports wrapping the sandboxes in a single shared docker container.
* Tweaks some recent express query parameter code to work in grist-core, which has a slightly different version of express (smoke test doesn't catch this since in Jenkins core is built within a workspace that has node_modules, and wires get crossed - in a dev environment the problem on master can be seen by doing `buildtools/build_core.sh /tmp/any_path_outside_grist`).
The new sandbox options do not have tests yet, nor does this they change the behavior of grist servers today. They are there to clean up and consolidate a collection of patches I've been using that were getting cumbersome, and make it easier to run experiments.
I haven't looked closely at imports beyond core.
Test Plan: tested manually against regular grist and grist-core, including imports
Reviewers: alexmojaki, dsagal
Reviewed By: alexmojaki
Differential Revision: https://phab.getgrist.com/D2942
2021-07-27 23:43:21 +00:00
|
|
|
import {integerParam, stringParam} from 'app/server/lib/requestUtils';
|
2021-07-21 08:46:03 +00:00
|
|
|
import * as contentDisposition from 'content-disposition';
|
|
|
|
import * as express from 'express';
|
2021-05-27 11:06:26 +00:00
|
|
|
|
|
|
|
export async function generateCSV(req: express.Request, res: express.Response, comm: Comm) {
|
|
|
|
log.info('Generating .csv file...');
|
2021-07-21 08:46:03 +00:00
|
|
|
const {
|
|
|
|
viewSectionId,
|
|
|
|
filters,
|
|
|
|
sortOrder
|
|
|
|
} = parseExportParameters(req);
|
2021-05-27 11:06:26 +00:00
|
|
|
|
(core) support python3 in grist-core, and running engine via docker and/or gvisor
Summary:
* Moves essential plugins to grist-core, so that basic imports (e.g. csv) work.
* Adds support for a `GRIST_SANDBOX_FLAVOR` flag that can systematically override how the data engine is run.
- `GRIST_SANDBOX_FLAVOR=pynbox` is "classic" nacl-based sandbox.
- `GRIST_SANDBOX_FLAVOR=docker` runs engines in individual docker containers. It requires an image specified in `sandbox/docker` (alternative images can be named with `GRIST_SANDBOX` flag - need to contain python and engine requirements). It is a simple reference implementation for sandboxing.
- `GRIST_SANDBOX_FLAVOR=unsandboxed` runs whatever local version of python is specified by a `GRIST_SANDBOX` flag directly, with no sandboxing. Engine requirements must be installed, so an absolute path to a python executable in a virtualenv is easiest to manage.
- `GRIST_SANDBOX_FLAVOR=gvisor` runs the data engine via gvisor's runsc. Experimental, with implementation not included in grist-core. Since gvisor runs on Linux only, this flavor supports wrapping the sandboxes in a single shared docker container.
* Tweaks some recent express query parameter code to work in grist-core, which has a slightly different version of express (smoke test doesn't catch this since in Jenkins core is built within a workspace that has node_modules, and wires get crossed - in a dev environment the problem on master can be seen by doing `buildtools/build_core.sh /tmp/any_path_outside_grist`).
The new sandbox options do not have tests yet, nor does this they change the behavior of grist servers today. They are there to clean up and consolidate a collection of patches I've been using that were getting cumbersome, and make it easier to run experiments.
I haven't looked closely at imports beyond core.
Test Plan: tested manually against regular grist and grist-core, including imports
Reviewers: alexmojaki, dsagal
Reviewed By: alexmojaki
Differential Revision: https://phab.getgrist.com/D2942
2021-07-27 23:43:21 +00:00
|
|
|
const clientId = stringParam(req.query.clientId);
|
|
|
|
const docFD = integerParam(req.query.docFD);
|
2021-05-27 11:06:26 +00:00
|
|
|
const client = comm.getClient(clientId);
|
|
|
|
const docSession = client.getDocSession(docFD);
|
|
|
|
const activeDoc = docSession.activeDoc;
|
|
|
|
|
|
|
|
// Generate a decent name for the exported file.
|
2021-07-21 08:46:03 +00:00
|
|
|
const name = parseExportFileName(activeDoc, req);
|
2021-05-27 11:06:26 +00:00
|
|
|
try {
|
2021-07-21 08:46:03 +00:00
|
|
|
const data = await makeCSV(activeDoc, viewSectionId, sortOrder, filters, req);
|
2021-05-27 11:06:26 +00:00
|
|
|
res.set('Content-Type', 'text/csv');
|
2021-07-21 08:46:03 +00:00
|
|
|
res.setHeader('Content-Disposition', contentDisposition(name + '.csv'));
|
2021-05-27 11:06:26 +00:00
|
|
|
res.send(data);
|
|
|
|
} catch (err) {
|
|
|
|
log.error("Exporting to CSV has failed. Request url: %s", req.url, err);
|
|
|
|
const errHtml =
|
|
|
|
`<!doctype html>
|
|
|
|
<html>
|
|
|
|
<body>There was an unexpected error while generating a csv file.</body>
|
|
|
|
</html>
|
|
|
|
`;
|
|
|
|
res.status(400).send(errHtml);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-21 08:46:03 +00:00
|
|
|
export async function generateXLSX(req: express.Request, res: express.Response, comm: Comm) {
|
|
|
|
log.debug(`Generating .xlsx file`);
|
(core) support python3 in grist-core, and running engine via docker and/or gvisor
Summary:
* Moves essential plugins to grist-core, so that basic imports (e.g. csv) work.
* Adds support for a `GRIST_SANDBOX_FLAVOR` flag that can systematically override how the data engine is run.
- `GRIST_SANDBOX_FLAVOR=pynbox` is "classic" nacl-based sandbox.
- `GRIST_SANDBOX_FLAVOR=docker` runs engines in individual docker containers. It requires an image specified in `sandbox/docker` (alternative images can be named with `GRIST_SANDBOX` flag - need to contain python and engine requirements). It is a simple reference implementation for sandboxing.
- `GRIST_SANDBOX_FLAVOR=unsandboxed` runs whatever local version of python is specified by a `GRIST_SANDBOX` flag directly, with no sandboxing. Engine requirements must be installed, so an absolute path to a python executable in a virtualenv is easiest to manage.
- `GRIST_SANDBOX_FLAVOR=gvisor` runs the data engine via gvisor's runsc. Experimental, with implementation not included in grist-core. Since gvisor runs on Linux only, this flavor supports wrapping the sandboxes in a single shared docker container.
* Tweaks some recent express query parameter code to work in grist-core, which has a slightly different version of express (smoke test doesn't catch this since in Jenkins core is built within a workspace that has node_modules, and wires get crossed - in a dev environment the problem on master can be seen by doing `buildtools/build_core.sh /tmp/any_path_outside_grist`).
The new sandbox options do not have tests yet, nor does this they change the behavior of grist servers today. They are there to clean up and consolidate a collection of patches I've been using that were getting cumbersome, and make it easier to run experiments.
I haven't looked closely at imports beyond core.
Test Plan: tested manually against regular grist and grist-core, including imports
Reviewers: alexmojaki, dsagal
Reviewed By: alexmojaki
Differential Revision: https://phab.getgrist.com/D2942
2021-07-27 23:43:21 +00:00
|
|
|
const clientId = stringParam(req.query.clientId);
|
|
|
|
const docFD = integerParam(req.query.docFD);
|
2021-07-21 08:46:03 +00:00
|
|
|
const client = comm.getClient(clientId);
|
|
|
|
const docSession = client.getDocSession(docFD);
|
|
|
|
const activeDoc = docSession.activeDoc;
|
|
|
|
try {
|
|
|
|
const data = await makeXLSX(activeDoc, req);
|
|
|
|
res.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
|
|
|
res.setHeader('Content-Disposition', contentDisposition((req.query.title || activeDoc.docName) + '.xlsx'));
|
|
|
|
res.send(data);
|
|
|
|
log.debug('XLSX file generated');
|
|
|
|
} catch (err) {
|
|
|
|
log.error("Exporting to XLSX has failed. Request url: %s", req.url, err);
|
|
|
|
// send a generic information to client
|
|
|
|
const errHtml =
|
|
|
|
`<!doctype html>
|
|
|
|
<html>
|
|
|
|
<body>There was an unexpected error while generating a xlsx file.</body>
|
|
|
|
</html>
|
|
|
|
`;
|
|
|
|
res.status(400).send(errHtml);
|
2021-05-27 11:06:26 +00:00
|
|
|
}
|
|
|
|
}
|