Merge pull request #35 from 45Drives/dev-josh

Fix mangling large files during upload
This commit is contained in:
Josh Boudreau 2021-11-12 12:17:02 -04:00 committed by GitHub
commit c42ec10342
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 75 additions and 85 deletions

View File

@ -1,3 +1,3 @@
## Cockpit Navigator 0.5.5-2 ## Cockpit Navigator 0.5.6-1
* Fix sed command for packaging EL7. * Fix mangling of large files during upload.

View File

@ -3,8 +3,8 @@
"name": "cockpit-navigator", "name": "cockpit-navigator",
"title": "Cockpit Navigator", "title": "Cockpit Navigator",
"prerelease": false, "prerelease": false,
"version": "0.5.5", "version": "0.5.6",
"buildVersion": "2", "buildVersion": "1",
"author": "Josh Boudreau <jboudreau@45drives.com>", "author": "Josh Boudreau <jboudreau@45drives.com>",
"url": "https://github.com/45Drives/cockpit-navigator", "url": "https://github.com/45Drives/cockpit-navigator",
"category": "utils", "category": "utils",
@ -54,8 +54,8 @@
], ],
"changelog": { "changelog": {
"urgency": "medium", "urgency": "medium",
"version": "0.5.5", "version": "0.5.6",
"buildVersion": "2", "buildVersion": "1",
"ignore": [], "ignore": [],
"date": null, "date": null,
"packager": "Josh Boudreau <jboudreau@45drives.com>", "packager": "Josh Boudreau <jboudreau@45drives.com>",

View File

@ -148,13 +148,13 @@ export class FileUpload {
this.chunk_index++; this.chunk_index++;
this.progress.value = this.chunk_index; this.progress.value = this.chunk_index;
if (this.chunk_index < this.num_chunks) if (this.chunk_index < this.num_chunks)
this.reader.readAsArrayBuffer(this.chunks[this.chunk_index]); this.reader.readAsDataURL(this.chunks[this.chunk_index]);
else { else {
this.done(); this.done();
} }
}; };
try { try {
this.reader.readAsArrayBuffer(this.chunks[0]); this.reader.readAsDataURL(this.chunks[0]);
} catch { } catch {
this.reader.onload = () => {}; this.reader.onload = () => {};
if (this.using_webkit) { if (this.using_webkit) {
@ -167,27 +167,12 @@ export class FileUpload {
this.update_rates_interval = setInterval(this.display_xfr_rate.bind(this), 1000); this.update_rates_interval = setInterval(this.display_xfr_rate.bind(this), 1000);
} }
/**
*
* @param {ArrayBuffer} buffer
* @returns
*/
arrayBufferToBase64(buffer) {
let binary = '';
let bytes = new Uint8Array(buffer);
let len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
/** /**
* *
* @param {Event} evt * @param {Event} evt
*/ */
write_to_file(evt) { write_to_file(evt) {
var chunk_b64 = this.arrayBufferToBase64(evt.target.result); var chunk_b64 = evt.target.result.replace(/^data:[^\/]+\/[^;]+;base64,/, "");
const seek = this.chunk_index * this.chunk_size; const seek = this.chunk_index * this.chunk_size;
var obj = { var obj = {
seek: seek, seek: seek,

View File

@ -1,28 +1,28 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Cockpit Navigator - A File System Browser for Cockpit. Cockpit Navigator - A File System Browser for Cockpit.
Copyright (C) 2021 Josh Boudreau <jboudreau@45drives.com> Copyright (C) 2021 Josh Boudreau <jboudreau@45drives.com>
This file is part of Cockpit Navigator. This file is part of Cockpit Navigator.
Cockpit Navigator is free software: you can redistribute it and/or modify Cockpit Navigator is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Cockpit Navigator is distributed in the hope that it will be useful, Cockpit Navigator is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Cockpit Navigator. If not, see <https://www.gnu.org/licenses/>. along with Cockpit Navigator. If not, see <https://www.gnu.org/licenses/>.
""" """
""" """
Synopsis: `echo <newline delimited JSON objects> | write-chunks.py3` Synopsis: `echo <newline delimited JSON objects> | write-chunks.py3`
JSON objects are of form: JSON objects are of form:
obj = { obj = {
seek: <byte offset> seek: <byte offset>
chunk: <base64 encoded data chunk> chunk: <base64 encoded data chunk>
} }
""" """
@ -31,53 +31,48 @@ import os
import sys import sys
import json import json
def write_chunk(chunk, file): def write_chunk(chunk, fd):
if not file: seek = chunk["seek"]
path = sys.argv[1] data = base64.b64decode(chunk["chunk"])
parent_path = os.path.dirname(path) os.lseek(fd, seek, os.SEEK_SET)
try: os.write(fd, data)
if not os.path.exists(parent_path):
os.makedirs(parent_path, exist_ok=True) def create_path(path):
elif os.path.isfile(parent_path): try:
print(parent_path + ": exists and is not a directory.") if not os.path.exists(path):
sys.exit(1) os.makedirs(path, exist_ok=True)
file = open(path, "wb") elif os.path.isfile(path):
except Exception as e: print(path + ": exists and is not a directory.")
print(e) sys.exit(1)
sys.exit(1) except Exception as e:
seek = chunk["seek"] print(e)
data = base64.b64decode(chunk["chunk"]) sys.exit(1)
try:
file.seek(seek)
file.write(data)
except Exception as e:
print(e)
sys.exit(1)
def main(): def main():
file = None if len(sys.argv) != 2:
if len(sys.argv) != 2: print("Invalid number of arguments.")
print("Invalid number of arguments.") sys.exit(1)
sys.exit(1) fd = None
while True: path = sys.argv[1]
try: parent_path = os.path.dirname(path)
json_in = input() create_path(parent_path)
except EOFError: try:
break fd = os.open(sys.argv[1], os.O_WRONLY | os.O_TRUNC | os.O_CREAT)
json_list = json_in.split("\n") # need to split in case writes happen faster than reads while True:
for json_obj in json_list: try:
try: json_in = input()
obj_in = json.loads(json_obj) except EOFError:
except Exception as e: break
print(e) json_list = json_in.split("\n") # need to split in case writes happen faster than reads
log = open("/var/log/navigator.log", "w") for json_obj in json_list:
log.write(json_in) obj_in = json.loads(json_obj)
log.close() write_chunk(obj_in, fd)
sys.exit(1) except Exception as e:
write_chunk(obj_in, file) print(e)
if file: os.close(fd)
file.close() sys.exit(1)
sys.exit(0) os.close(fd)
sys.exit(0)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -32,6 +32,8 @@ rm -rf %{buildroot}
/usr/share/cockpit/navigator/* /usr/share/cockpit/navigator/*
%changelog %changelog
* Fri Nov 12 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.6-1
- Fix mangling of large files during upload.
* Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-2 * Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-2
- Fix sed command for packaging EL7. - Fix sed command for packaging EL7.
* Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-1 * Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-1

View File

@ -32,6 +32,8 @@ rm -rf %{buildroot}
/usr/share/cockpit/navigator/* /usr/share/cockpit/navigator/*
%changelog %changelog
* Fri Nov 12 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.6-1
- Fix mangling of large files during upload.
* Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-2 * Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-2
- Fix sed command for packaging EL7. - Fix sed command for packaging EL7.
* Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-1 * Mon Oct 04 2021 Joshua Boudreau <jboudreau@45drives.com> 0.5.5-1

View File

@ -1,3 +1,9 @@
cockpit-navigator (0.5.6-1focal) focal; urgency=medium
* Fix mangling of large files during upload.
-- Joshua Boudreau <jboudreau@45drives.com> Fri, 12 Nov 2021 08:06:44 -0400
cockpit-navigator (0.5.5-2focal) focal; urgency=medium cockpit-navigator (0.5.5-2focal) focal; urgency=medium
* Fix sed command for packaging EL7. * Fix sed command for packaging EL7.