From b71b2092c310f5c56a6ceb33349ffdc10ba48939 Mon Sep 17 00:00:00 2001 From: ztimson Date: Sun, 7 Jan 2024 16:36:14 -0500 Subject: [PATCH] Updated konsole --- src/modules/konsole/commands/cat.js | 14 ++++++ src/modules/konsole/commands/cd.js | 5 ++- src/modules/konsole/commands/ls.js | 11 ++++- src/modules/konsole/commands/mkdir.js | 1 + src/modules/konsole/commands/rm.js | 4 +- .../{shower-thoughts.js => shower-thought.js} | 0 src/modules/konsole/commands/touch.js | 12 +++++ src/modules/konsole/index.js | 4 +- src/modules/konsole/konsole.css | 1 + src/modules/konsole/konsole.js | 5 +-- src/modules/konsole/models/file.js | 45 +++++++++++++++++++ 11 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 src/modules/konsole/commands/cat.js rename src/modules/konsole/commands/{shower-thoughts.js => shower-thought.js} (100%) create mode 100644 src/modules/konsole/commands/touch.js create mode 100644 src/modules/konsole/models/file.js diff --git a/src/modules/konsole/commands/cat.js b/src/modules/konsole/commands/cat.js new file mode 100644 index 0000000..713fd18 --- /dev/null +++ b/src/modules/konsole/commands/cat.js @@ -0,0 +1,14 @@ +window.cli.exec['cat'] = { + autocomplete: () => { + return []; + }, + help: () => { + return 'Display file contents'; + }, + run: args => { + if(!args[0]) throw new Error('cat: missing operand'); + const file = window.cli.fs(args[0]); + if(file == null) throw new Error('cat: File does not exist'); + return file; + } +} diff --git a/src/modules/konsole/commands/cd.js b/src/modules/konsole/commands/cd.js index 14997e5..ea7fe4d 100644 --- a/src/modules/konsole/commands/cd.js +++ b/src/modules/konsole/commands/cd.js @@ -3,11 +3,12 @@ window.cli.exec['cd'] = { return []; }, help: () => { - return 'Clear console output'; + return 'Change present working directory'; }, run: args => { const path = window.cli.fs(args[0]); - if(!path) throw new Error(`cd: \'${args[0]}\': No such file or directory`) + if(!path) throw new Error(`cd: \'${args[0]}\': No such file or directory`); + if(typeof path != 'object') throw new Error(`cd: \'${args[0]}\': Not a directory`); window.cli.pwd = window.cli.path(args[0]); window.cli._prompt.innerText = window.cli._buildPrompt(); diff --git a/src/modules/konsole/commands/ls.js b/src/modules/konsole/commands/ls.js index 19e1896..635354e 100644 --- a/src/modules/konsole/commands/ls.js +++ b/src/modules/konsole/commands/ls.js @@ -7,7 +7,14 @@ window.cli.exec['ls'] = { }, run: args => { const target = window.cli.fs(args[0]); - if(!target) throw new Error(`ls: cannot access \'${args[0]}\': No such file or directory`) - return Object.keys(target).reduce((acc, p) => acc + `${p}\n`, ''); + if(!target || typeof target != 'object') throw new Error(`ls: cannot access \'${args[0]}\': No such file or directory`) + return Object.keys(target) + .sort((a, b) => { + if(a > b) return 1; + if(b > a) return -1; + return 0; + }) + .map(p => `-rwxrw---- 1 root root ${typeof target[p] =='object' ? '-' : target[p].length} ${p}`) + .join('\n'); } } diff --git a/src/modules/konsole/commands/mkdir.js b/src/modules/konsole/commands/mkdir.js index 930cbce..bcd70cd 100644 --- a/src/modules/konsole/commands/mkdir.js +++ b/src/modules/konsole/commands/mkdir.js @@ -7,6 +7,7 @@ window.cli.exec['mkdir'] = { }, run: args => { if(!args[0]) throw new Error('mkdir: missing operand'); + if(window.cli.fs(args[0]) != null) throw new Error('mkdir: File or directory already exists'); window.cli.fs(args[0], {}); } } diff --git a/src/modules/konsole/commands/rm.js b/src/modules/konsole/commands/rm.js index cab3bb8..5d02983 100644 --- a/src/modules/konsole/commands/rm.js +++ b/src/modules/konsole/commands/rm.js @@ -6,7 +6,7 @@ window.cli.exec['rm'] = { return 'Delete file or directory'; }, run: args => { - if(!args[0]) throw new Error('rm: missing operand'); - window.cli.fs(args[0], null); + if(!args.length) throw new Error('rm: missing operand'); + args.forEach(a => window.cli.fs(a, null)); } } diff --git a/src/modules/konsole/commands/shower-thoughts.js b/src/modules/konsole/commands/shower-thought.js similarity index 100% rename from src/modules/konsole/commands/shower-thoughts.js rename to src/modules/konsole/commands/shower-thought.js diff --git a/src/modules/konsole/commands/touch.js b/src/modules/konsole/commands/touch.js new file mode 100644 index 0000000..c5c6468 --- /dev/null +++ b/src/modules/konsole/commands/touch.js @@ -0,0 +1,12 @@ +window.cli.exec['touch'] = { + autocomplete: () => { + return []; + }, + help: () => { + return 'Change file timestamps & create file if missing'; + }, + run: args => { + if(!args[0]) throw new Error('touch: missing operand'); + if(!window.cli.fs(args[0])) window.cli.fs(args[0], ''); + } +} diff --git a/src/modules/konsole/index.js b/src/modules/konsole/index.js index 290bd5e..dc01e72 100644 --- a/src/modules/konsole/index.js +++ b/src/modules/konsole/index.js @@ -3,6 +3,7 @@ import './konsole.css'; // CLI Commands import './commands/banner.js'; +import './commands/cat.js'; import './commands/cd.js' import './commands/clear.js'; import './commands/date.js'; @@ -15,5 +16,6 @@ import './commands/man.js'; import './commands/mkdir.js'; import './commands/pwd.js'; import './commands/rm.js'; -import './commands/shower-thoughts.js'; +import './commands/shower-thought.js'; +import './commands/touch.js'; import './commands/whoami.js'; diff --git a/src/modules/konsole/konsole.css b/src/modules/konsole/konsole.css index 0cf087f..3755841 100644 --- a/src/modules/konsole/konsole.css +++ b/src/modules/konsole/konsole.css @@ -5,6 +5,7 @@ overflow-y: auto; min-height: 150px; max-height: 300px; + tab-size: 4; } .cli-stdout { diff --git a/src/modules/konsole/konsole.js b/src/modules/konsole/konsole.js index b06d9d0..7c78783 100644 --- a/src/modules/konsole/konsole.js +++ b/src/modules/konsole/konsole.js @@ -28,7 +28,7 @@ window.cli = {
- +
`; @@ -119,11 +119,10 @@ window.cli = { try { const args = parts.slice(1).map(a => (a[0] == '"' || a[0] == "'") ? a.slice(1, -1) : a); const out = exec.run(args); - if(!suppress) window.cli.stdOut(`${window.cli._buildPrompt()} ${command}${out ? '\n' + out : ''}`); + if(!suppress) window.cli.stdOut(`${window.cli._buildPrompt()} ${command}${out != null ? '\n' + (out || '\n') : ''}`); } catch(err) { console.error(err); if(!suppress) { - window.cli._output.removeChild(window.cli._output.children[window.cli._output.children.length - 1]); window.cli.stdErr(`${window.cli._buildPrompt()} ${command}\n${err.message || `${parts[0]}: exited with a non-zero status`}`); } } diff --git a/src/modules/konsole/models/file.js b/src/modules/konsole/models/file.js new file mode 100644 index 0000000..c384b30 --- /dev/null +++ b/src/modules/konsole/models/file.js @@ -0,0 +1,45 @@ +export class CliFile { + owner = window.cli.user; + group = window.cli.user; + permissions = 750; + created = new Date(); + modified = new Date(); + + #data; + get date() { return this.#data; } + set date(d) { + this.modified = new Date(); + this.#data = d; + } + + static instanceOf(f) { + return f.hasOwnProperty('data'); + } + + size() { + return this.#data.toString().length; + } + + permsString() { + return '-' + this.permissions.toString().split('').map(p => { + switch (p) { + case 0: + return '---'; + case 1: + return '--x'; + case 2: + return '-w-'; + case 3: + return '-wx'; + case 4: + return 'r--'; + case 5: + return 'r-x'; + case 6: + return 'rw-'; + case 7: + return 'rwx'; + } + }).join(''); + } +}