From 539cb88b94118aa0c8782b0d81f46e4d54c083a6 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 21 Jul 2013 21:12:47 -0700 Subject: [PATCH 001/206] Initial Commit --- Home.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Home.md diff --git a/Home.md b/Home.md new file mode 100644 index 000000000..1fc1b5fd1 --- /dev/null +++ b/Home.md @@ -0,0 +1 @@ +Welcome to the NodeOS wiki! \ No newline at end of file From ad0cb1254acc812c31afe21b054646b87051f72c Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 16:11:14 -0800 Subject: [PATCH 002/206] Updated Home (markdown) --- Home.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.md b/Home.md index 1fc1b5fd1..ed4b3bef9 100644 --- a/Home.md +++ b/Home.md @@ -1 +1 @@ -Welcome to the NodeOS wiki! \ No newline at end of file +- [[Technical Overview]] From 9509e3ee98263928d553709b216d4442da84de33 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:02:27 -0800 Subject: [PATCH 003/206] File system layout --- Technical-overview.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Technical-overview.md diff --git a/Technical-overview.md b/Technical-overview.md new file mode 100644 index 000000000..4aa007962 --- /dev/null +++ b/Technical-overview.md @@ -0,0 +1,16 @@ +## File System + +**Layout** +``` +/bin/ + node <--------------- node binary +/lib/ <--------------- shared libraries required by node +/usr/lib/ <------------ other shared libs required by node +/root/ <--------------- root users $HOME directory + bin/ <--------------- binaries exposed by node modules in $HOME/lib/node_modules + lib/ + node_modules/ <---- modules installed by npkg go here + bin-nsh + bin-fs + svc-init +``` From 2938790928b53d2108d56c81b192bd6fbf7776ad Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:02:50 -0800 Subject: [PATCH 004/206] Updated Technical overview (markdown) --- Technical-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Technical-overview.md b/Technical-overview.md index 4aa007962..2fbf0006a 100644 --- a/Technical-overview.md +++ b/Technical-overview.md @@ -1,7 +1,7 @@ ## File System **Layout** -``` +```text /bin/ node <--------------- node binary /lib/ <--------------- shared libraries required by node From cdd3e5b52b826363fd02786349b65578f324be94 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:04:26 -0800 Subject: [PATCH 005/206] some modules are global --- Technical-overview.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Technical-overview.md b/Technical-overview.md index 2fbf0006a..6490bdd71 100644 --- a/Technical-overview.md +++ b/Technical-overview.md @@ -4,13 +4,19 @@ ```text /bin/ node <--------------- node binary + npkg <--------------- npkg is globally intalled /lib/ <--------------- shared libraries required by node + node_modules/ <------ a few fundamental modules are globally installed + bin-npkg/ + npm /usr/lib/ <------------ other shared libs required by node /root/ <--------------- root users $HOME directory bin/ <--------------- binaries exposed by node modules in $HOME/lib/node_modules + init + nsh lib/ node_modules/ <---- modules installed by npkg go here bin-nsh bin-fs - svc-init + bin-init ``` From c1e7c82de91d2db00a5d5707a8731ab3a0d294ee Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:06:38 -0800 Subject: [PATCH 006/206] Updated Technical overview (markdown) --- Technical-overview.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Technical-overview.md b/Technical-overview.md index 6490bdd71..1b7fdb91e 100644 --- a/Technical-overview.md +++ b/Technical-overview.md @@ -20,3 +20,18 @@ bin-fs bin-init ``` + +## The Root User + +You've very likely logged in as the root user: + +- your `$HOME` is set to `/root` +- your `$PATH` is set to `$HOME/bin:/bin` + +## Using `npkg` to install modules + +The `npkg` command *always* installs modules relative to the current user. + +- modules are installed to `$HOME/lib/node_modules` +- executables are placed in `$HOME/bin` + From a2b0fd93bda36eb8be5bface51cfbf15c71a92aa Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:20:59 -0800 Subject: [PATCH 007/206] Updated Technical overview (markdown) --- Technical-overview.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Technical-overview.md b/Technical-overview.md index 1b7fdb91e..389c19b2d 100644 --- a/Technical-overview.md +++ b/Technical-overview.md @@ -1,21 +1,25 @@ +The base NodeOS install provides only enough to let `npkg` take over. +Everything else can be provided as a node module distributed through `npm`. +There is no attempt to version manage `node` via `nvm`, `nave`, or a similar tool. +NodeOS will always assume you are using the latest stable version of node. +If a package is incompatible with the latest node version, you should fix the broken package. + ## File System **Layout** ```text /bin/ node <--------------- node binary - npkg <--------------- npkg is globally intalled /lib/ <--------------- shared libraries required by node - node_modules/ <------ a few fundamental modules are globally installed - bin-npkg/ - npm /usr/lib/ <------------ other shared libs required by node /root/ <--------------- root users $HOME directory bin/ <--------------- binaries exposed by node modules in $HOME/lib/node_modules + npkg init nsh lib/ node_modules/ <---- modules installed by npkg go here + bin-npkg bin-nsh bin-fs bin-init @@ -34,4 +38,3 @@ The `npkg` command *always* installs modules relative to the current user. - modules are installed to `$HOME/lib/node_modules` - executables are placed in `$HOME/bin` - From bfb5ed8c45f37fc50a7bf51306d2fbdd88dd9956 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:24:03 -0800 Subject: [PATCH 008/206] Updated Technical overview (markdown) --- Technical-overview.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Technical-overview.md b/Technical-overview.md index 389c19b2d..55e87d607 100644 --- a/Technical-overview.md +++ b/Technical-overview.md @@ -4,6 +4,12 @@ There is no attempt to version manage `node` via `nvm`, `nave`, or a similar too NodeOS will always assume you are using the latest stable version of node. If a package is incompatible with the latest node version, you should fix the broken package. +There is absolutely *no* mandate to keep NodeOS purely JavaScript. +If you can find a way to distribute Ruby via npm then NodeOS will support Ruby. + +**Contents** +- [[Native Modules]] + ## File System **Layout** From e5d6966cf7353d984e81b779dd1a198f16168564 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:24:24 -0800 Subject: [PATCH 009/206] Updated Technical overview (markdown) --- Technical-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Technical-overview.md b/Technical-overview.md index 55e87d607..c6f7b7e57 100644 --- a/Technical-overview.md +++ b/Technical-overview.md @@ -7,7 +7,7 @@ If a package is incompatible with the latest node version, you should fix the br There is absolutely *no* mandate to keep NodeOS purely JavaScript. If you can find a way to distribute Ruby via npm then NodeOS will support Ruby. -**Contents** +**Topics** - [[Native Modules]] ## File System From d3f31442eb03cb86c7c227b53f2189104c496071 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 17:31:44 -0800 Subject: [PATCH 010/206] Created Native modules (markdown) --- Native-modules.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Native-modules.md diff --git a/Native-modules.md b/Native-modules.md new file mode 100644 index 000000000..b959c832e --- /dev/null +++ b/Native-modules.md @@ -0,0 +1,16 @@ +Native modules require compilation via a `gypfile`. +NodeOS comes with no build environment, and it may be quite a while before one exists. + +Despite a lack of build tools, NodeOS could not function without native dependencies. +Node has no native way to set an IP address, or configure the network gateway. +Node cannot mount file systems, or issue reboot commands. +Many system calls are not exposed natively by node, and as such require a native module interface. + +Some compiled modules required by NodeOS + +- src-sockios +- src-ioctl +- src-mount + +Until npm supports delivering pre-compiled dependencies, NodeOS will need a workaround. +The workaround is currently under development. From 96581c66e7c519bac55b7a3590a3752300553867 Mon Sep 17 00:00:00 2001 From: "Raynos (Jake Verbaten)" Date: Sun, 8 Dec 2013 22:52:21 -0800 Subject: [PATCH 011/206] Created Modules (markdown) --- Modules.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Modules.md diff --git a/Modules.md b/Modules.md new file mode 100644 index 000000000..f254fe88c --- /dev/null +++ b/Modules.md @@ -0,0 +1,13 @@ +# Modules + +This is a list of modules that are "built for nodeos" + +## [bin-nsh](https://github.com/jacobgroundwater/node-bin-nsh) + +## [bin-shutdown](https://github.com/jacobgroundwater/node-bin-shutdown) + +## [bin-route](https://github.com/jacobgroundwater/node-bin-route) + +## [bin-man](https://github.com/jacobgroundwater/node-bin-man) + +## [bin-fs](https://github.com/jacobgroundwater/node-bin-fs) From 62214930c6df27971ee9c35e8146fc7da935fe43 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Sun, 8 Dec 2013 22:53:48 -0800 Subject: [PATCH 012/206] Updated Home (markdown) --- Home.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.md b/Home.md index ed4b3bef9..cc4dea7f2 100644 --- a/Home.md +++ b/Home.md @@ -1 +1,2 @@ - [[Technical Overview]] +- [[Modules]] built for NodeOS From 16335a193f5f314a40ae0ddf1aa65766d1670206 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Thu, 12 Dec 2013 21:53:25 -0800 Subject: [PATCH 013/206] Updated Home (markdown) --- Home.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.md b/Home.md index cc4dea7f2..b29a4032f 100644 --- a/Home.md +++ b/Home.md @@ -1,2 +1,3 @@ - [[Technical Overview]] - [[Modules]] built for NodeOS +- [[People]] who've helped From a644e57372f0cab1791f19aa15ab7c07ef459097 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Thu, 12 Dec 2013 21:57:25 -0800 Subject: [PATCH 014/206] Created People (markdown) --- People.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 People.md diff --git a/People.md b/People.md new file mode 100644 index 000000000..ac3ea8f03 --- /dev/null +++ b/People.md @@ -0,0 +1,8 @@ +Here are some great people who have helped NodeOS in some significant way. +In order of joining: + +- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) +- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) +- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) + +Everyone above is awesome! From dc1511bb134cecc9be697bda06eab434323e4701 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 03:56:26 -0700 Subject: [PATCH 015/206] Updated People (markdown) --- People.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/People.md b/People.md index ac3ea8f03..da55f504f 100644 --- a/People.md +++ b/People.md @@ -4,5 +4,8 @@ In order of joining: - [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) - [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) - [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) +- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) +- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) +- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) Everyone above is awesome! From 11677f72e8467c550cbe4ac4f6e68050e259694b Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 03:58:59 -0700 Subject: [PATCH 016/206] Updated Home (markdown) --- Home.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Home.md b/Home.md index b29a4032f..f51e7fa73 100644 --- a/Home.md +++ b/Home.md @@ -1,3 +1,11 @@ +## design + - [[Technical Overview]] -- [[Modules]] built for NodeOS + +## resources + +- http://npkg.org + +## community + - [[People]] who've helped From c1d5b6220080468e691f4485ef8c7a5b936ca674 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 19:32:43 +0800 Subject: [PATCH 017/206] update --- FileSystem.md | 58 +++++++++++++++++++++++++++++++++++++++++++ Home.md | 4 ++- Technical-overview.md | 46 ---------------------------------- npkg.md | 16 ++++++++++++ services.md | 27 ++++++++++++++++++++ 5 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 FileSystem.md delete mode 100644 Technical-overview.md create mode 100644 npkg.md create mode 100644 services.md diff --git a/FileSystem.md b/FileSystem.md new file mode 100644 index 000000000..7e6a4b7a5 --- /dev/null +++ b/FileSystem.md @@ -0,0 +1,58 @@ +## system directories + +The base filesystem is laid out as follows. + +A few standard linux directories are now considered private, +and only included for compatibility with the current *libc*. + +``` +/bin <-- contains latest node executable +/lib +/usr +/etc +``` + +All user-editable content should be in user-directories. +The root user's home is in it's standard `/root` location. + +``` +/root <-- root user +/home <-- non-root users +``` + +Other standard kernel-provided file systems are mounted in their usual locations. + +``` +/dev <-- devfs +/proc <-- procfs +/sys <-- sysfs +/tmp <-- tmpfs +``` + +## user directories + +There are no *global* services, modules, or commands. +Directories that were once system-leve, like `etc`, and `var` are now user-local. + +``` +$HOME/ + bin/ <-- executable commands + ls, cp, mv + lib/ + node_modules/ <-- modules installed by npkg + log/ <-- logs from init jobs + etc/ <-- configuration files + var/ <-- persistent data + tmp/ <-- ephemeral data +``` + +In detail: + +- `bin` contains executable commands, linked during `npkg install`. +- `lib` contains `node_modules` which holds modules installed by `npkg`. +- `log` contains output from services and jobs. +- `etc` contains local config values for services and jobs +- `var` holds persistent data for services and jobs. +- `tmp` holds ephemeral data for services and jobs. + +These directories are used assumed by the `npkg` command. diff --git a/Home.md b/Home.md index f51e7fa73..1c098da16 100644 --- a/Home.md +++ b/Home.md @@ -1,6 +1,8 @@ ## design -- [[Technical Overview]] +- [[FileSystem]] an overview of how the file system is laid out +- [[npkg]] the npkg command is the main interface to the system +- [[services]] an overview of how services are managed ## resources diff --git a/Technical-overview.md b/Technical-overview.md deleted file mode 100644 index c6f7b7e57..000000000 --- a/Technical-overview.md +++ /dev/null @@ -1,46 +0,0 @@ -The base NodeOS install provides only enough to let `npkg` take over. -Everything else can be provided as a node module distributed through `npm`. -There is no attempt to version manage `node` via `nvm`, `nave`, or a similar tool. -NodeOS will always assume you are using the latest stable version of node. -If a package is incompatible with the latest node version, you should fix the broken package. - -There is absolutely *no* mandate to keep NodeOS purely JavaScript. -If you can find a way to distribute Ruby via npm then NodeOS will support Ruby. - -**Topics** -- [[Native Modules]] - -## File System - -**Layout** -```text -/bin/ - node <--------------- node binary -/lib/ <--------------- shared libraries required by node -/usr/lib/ <------------ other shared libs required by node -/root/ <--------------- root users $HOME directory - bin/ <--------------- binaries exposed by node modules in $HOME/lib/node_modules - npkg - init - nsh - lib/ - node_modules/ <---- modules installed by npkg go here - bin-npkg - bin-nsh - bin-fs - bin-init -``` - -## The Root User - -You've very likely logged in as the root user: - -- your `$HOME` is set to `/root` -- your `$PATH` is set to `$HOME/bin:/bin` - -## Using `npkg` to install modules - -The `npkg` command *always* installs modules relative to the current user. - -- modules are installed to `$HOME/lib/node_modules` -- executables are placed in `$HOME/bin` diff --git a/npkg.md b/npkg.md new file mode 100644 index 000000000..65fde5bea --- /dev/null +++ b/npkg.md @@ -0,0 +1,16 @@ +The `npkg` command is the *one command to rule them all*. +It's mostly a convenience. +We want a single command for + +1. installing and removing commands +2. installing and removing services +2. starting and stopping services +3. configuring services + +These are reflected in the commands + +```bash +npkg [install|uninstall] +npkg [start|stop] +npkg config +``` diff --git a/services.md b/services.md new file mode 100644 index 000000000..59c425cb0 --- /dev/null +++ b/services.md @@ -0,0 +1,27 @@ +Services are long-running processes that provide utility to the system. +Common services you might find on a Linux system are + +- `sshd` for ssh access +- `dhcpd` to set the IP address at boot +- `getty` for connecting the console to a login session +- `ntpd` for setting the time from the network + +These services are generally *automated* and *long running*. +Let's itemize the actual requirements of a service. + +1. services can be started at boot automatically +2. services should make an effort to retry on failure +3. users should be able to start services at runtime +4. services should survive a user logging out + +The above are standard for almost every service manager today. +Typically [[init]] or another service manager handles system services. + +- Mac OS X uses `launchd` +- Ubuntu uses `upstard` +- RHEL uses `systemd` +- Windows uses ? +- SmartOS uses `SMF` + +Right now, we call the node-os service manager *init* because it's also PID 1. +We probably want a better name for it :grin: From 5c895379563a741f240d7e6b9e8b4afec80ed8b6 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 04:34:54 -0700 Subject: [PATCH 018/206] Created _Sidebar (markdown) --- _Sidebar.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 _Sidebar.md diff --git a/_Sidebar.md b/_Sidebar.md new file mode 100644 index 000000000..8ed879084 --- /dev/null +++ b/_Sidebar.md @@ -0,0 +1,4 @@ +Design +- [[FileSystem]] +- [[npkg]] +- [[services]] From 08f1b84755b2fa88f9d33c2cc19e2c55d6f77433 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 04:37:10 -0700 Subject: [PATCH 019/206] Updated _Sidebar (markdown) --- _Sidebar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.md b/_Sidebar.md index 8ed879084..f8480de97 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,4 +1,4 @@ Design -- [[FileSystem]] +- [[file system|FileSystem]] - [[npkg]] - [[services]] From dcc6d6832a59b7ba2e3583574c99e72ed5a1bc7e Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 04:40:47 -0700 Subject: [PATCH 020/206] Updated Home (markdown) --- Home.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.md b/Home.md index 1c098da16..f908007e9 100644 --- a/Home.md +++ b/Home.md @@ -1,6 +1,6 @@ ## design -- [[FileSystem]] an overview of how the file system is laid out +- [[file system|FileSystem]] an overview of how the file system is laid out - [[npkg]] the npkg command is the main interface to the system - [[services]] an overview of how services are managed From da8392f5fcba88c91c8c0834331d9b2003dcd5de Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 04:46:38 -0700 Subject: [PATCH 021/206] Updated People (markdown) --- People.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/People.md b/People.md index da55f504f..76a2fa2de 100644 --- a/People.md +++ b/People.md @@ -1,5 +1,5 @@ Here are some great people who have helped NodeOS in some significant way. -In order of joining: +In no particular order: - [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) - [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) @@ -7,5 +7,6 @@ In order of joining: - [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) - [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) - [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) +- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) Everyone above is awesome! From 609c8a2166204d00a397560397a6889f889032b7 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Wed, 18 Jun 2014 01:58:56 +0800 Subject: [PATCH 022/206] update --- FileSystem.md | 2 + Modules.md | 13 ---- asgard.md | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++ init.md | 27 ++++++++ npkg.md | 42 +++++++++++++ root.md | 20 ++++++ 6 files changed, 262 insertions(+), 13 deletions(-) delete mode 100644 Modules.md create mode 100644 asgard.md create mode 100644 init.md create mode 100644 root.md diff --git a/FileSystem.md b/FileSystem.md index 7e6a4b7a5..ceb30310e 100644 --- a/FileSystem.md +++ b/FileSystem.md @@ -20,6 +20,8 @@ The root user's home is in it's standard `/root` location. /home <-- non-root users ``` +The [[root]] user is special because it boots the system. + Other standard kernel-provided file systems are mounted in their usual locations. ``` diff --git a/Modules.md b/Modules.md deleted file mode 100644 index f254fe88c..000000000 --- a/Modules.md +++ /dev/null @@ -1,13 +0,0 @@ -# Modules - -This is a list of modules that are "built for nodeos" - -## [bin-nsh](https://github.com/jacobgroundwater/node-bin-nsh) - -## [bin-shutdown](https://github.com/jacobgroundwater/node-bin-shutdown) - -## [bin-route](https://github.com/jacobgroundwater/node-bin-route) - -## [bin-man](https://github.com/jacobgroundwater/node-bin-man) - -## [bin-fs](https://github.com/jacobgroundwater/node-bin-fs) diff --git a/asgard.md b/asgard.md new file mode 100644 index 000000000..7079023c7 --- /dev/null +++ b/asgard.md @@ -0,0 +1,171 @@ +The service-manager (code name asgard) is a job-control service. + +## HTTP IPC + +You communicate with asgard over http. + +For example, to start a job you `PUT` to `/job/:name` where `:name` is the unique identifier for your job. + +```json +{ + "tasks": [ + { + "exec": "node", + "args": ["server.js"], + "envs": { + "PATH": "/bin:/root/lib/node_modules/myapp/node_modules/.bin" + }, + "cwd": "/root/lib/node_modules/myapp", + "fd": [] + } + ] +} +``` + +The following are optional for each *task* + +```javascript +{ + "exec": ... + + "user" : 2, // prefer numeric id + "group" : 3, +} +``` + +The following are reserved, but not implemented. +For more information see the Linux [clone](http://linux.die.net/man/2/clone) call. + +**these are a draft** + +```javascript +{ + "limit" : { + "memory" : "1GB", + "cpu" : "50%" + }, + "mount": { // create a new mount namespace + // TBD + }, + "iface": { // create a new network namespace + // TBD + }, + "newpid": true, // create a new PID space + "newpic": true, // create a new PIC space +} +``` + +All of the above are required, aside from `user` and `group`. + +## File Descriptors + +File descriptors are pointers to various IO conduits of a process. There are many *things* that can be represented by a file descriptor, + +- a normal file on the file system +- an unnamed pipe between two processes +- a named pipe +- a network socket +- a unix domain socket +- a block or character device + +Each of the above is represented by a file-descriptor, and various system calls can be made to each descriptor based on the *thing* it represents. + +Going forward, we probably want asgard to work with *all* of the above. + +```javascript +{ // a file + type: "file", + path: "/root/docs/myfile.txt", + mode: "rw", +} + +{ // a unix socket + type: "unix socket", + path: "/root/var/myapp.sock" +} + +{ // a network socket + type: "network socket", + bind: "127.0.0.1", + port: 8080 +} + +{ // a named pipe + type: "named pipe", + path: "..." +} +``` + +I don't want to support all of these yet, but it's something to keep in mind. I'm also not sure how to represent unnamed pipes between processes. + +Asgard should respond with `501 Not Implemented`, rather than a `400/500` error when using an unsupported file type. + +## Authentication + +HTTP is secure. If you think otherwise, you should stop using all websites. + +HTTP security can be poorly implemented however. We actually punt on handling security asgard the server. Instead, we require that you secure the socket. + +For simple cases, you can bind to `localhost`. Only processes on the same host can access asgard. + +A better approach might be binding to a unix domain socket, for example `/root/var/asgard.sock`. You can use file-system permissions to restrict access to the http server. This is how Docker works. + + +## Permissions + +There are no permissions. Either you have access to everything, or nothing. + +> Each copy of init spawns jobs requested by a particular user, so that user needs access to all jobs supervised by a single init process. We however don't want jobs to have access to each other. If jobs are spawned under the current user, then jobs will be able to call init on behalf of the user. +> +> On linux, the clone system call governs all new process (and thread) creation. Clone lets you decide what to share, and what not to share. If we require that all modules must contain all their dependencies, we could isolate each service in its own file system. This would cut the service off from having access to init. +> +> -[Jacob June 18](https://github.com/NodeOS/node-init/issues/3#issuecomment-46272433) + +In a multi-user environment, each user will run their own asgard service. + +``` +-+ asgard (root) + \ + +-+ asgard (bob) + | \ + | server.js (bob's server) + | + +-+ asgard (tom) + \ + server.js (tom's server) +``` + +## Restart Semantics + +There are no restart semantics. You can restart a job by defining a second restart task, e.g. + +```javascript +{ + tasks: [ + {...}, // job to run + {...} // command to restart job + ] +} +``` + +Restart semantics are difficult + +- A process that exits immediately due to an error can peg the CPU at 100%. +- Generally we do not want to ever *stop* trying to restart a process. + Do you care more if your CPU gets pegged for a while, or your website goes down? +- Sometimes we want notifications when processes exit. + +We let the caller to asgard decide how they want to handle restart. + +- Tasks are always run serially. + The previous task always exist before the next one starts. +- The exit code of the previous process is available via the + environment variable `TASK_EXIT`. + This will either be the number or signal name that + caused the previous task to exit. + +## Review + +- asgard is simple, yet flexible. +- asgard is focused on running tasks, and jobs. +- asgard should export a well-defined API, to allow multiple products interact with it. diff --git a/init.md b/init.md new file mode 100644 index 000000000..e307d181e --- /dev/null +++ b/init.md @@ -0,0 +1,27 @@ +Init *will* be a super-simple process. + +1. periodically reap dead children +2. start the root service manager [[asgard]] + +## zombies + +The way Linux works, +when a parent process dies it's children become children of PID 1. +When those children exit, +their PID number and exit status are recorded in the kernels process table. +The parent, in this cae init, +needs to periodically call `wait` or `waitpid` to clear the process table. +Processes which have exited but have not been cleared are called **zombies**. + +You don't want too many zombies. + +Init will inherit a lot of children, +and when they die it needs to stop the zombie apocalypse. + +## service manager + +We want to keep init simple. +Once init is up and ready to be the grim reaper, +it needs to pass control to someone else. + +The service manager [[asgard]] is what launches all the interesting processes on the system. diff --git a/npkg.md b/npkg.md index 65fde5bea..1e1daef5a 100644 --- a/npkg.md +++ b/npkg.md @@ -14,3 +14,45 @@ npkg [install|uninstall] npkg [start|stop] npkg config ``` + +## installing packages + +Packages installed with `npkg install` are installed to `$HOME/lib/node_modules`, +and any executables defined in the package are linked into `$HOME/bin`. +Since `npkg` always writes to your home directory, +you do not need root permissions. + +You can use `npkg install` to craft a custom interface to the systme, +unique to every user. + +```bash +$ ncurl google.com + ERROR ncurl not found +$ npkg install ncurl + --> installing ncurl from npmjs.org + --> okay, done +$ ncurl google.com + +... +``` + +## staring services + +Packages installed with `npkg install` can also be **services**. +A module defines a service by specifying a `scripts:start` key in it's `package.json` file. + + +```json +{ + "name": "my_app", + "scripts": { + "start": "node server.js" + } +} +``` + +You can one-step daemonize this module with + +```bash +$ npkg start my_app +``` diff --git a/root.md b/root.md new file mode 100644 index 000000000..580ef8014 --- /dev/null +++ b/root.md @@ -0,0 +1,20 @@ +The root user is like any other [user directory](FileSystem#user-directories) +but it's also in charge of booting the system. + +During boot after the kernel has loaded, +it passes control to another process typically called the *init process*. +The init process has PID 1, and *must* start the rest of the system. +If init fails to boot the rest of the system, +the kernel either panics or your box does nothing interesting. + +Typically on Linux init is located at `/sbin/init`. +In you don't specify where your init process is, +the kernel will automatically look in that spot. +During boot however any other process can be booted as your PID 1. +This is done by passing the kernel an `INIT=` argument on startup. + +On node-os there is no process at `/sbin/init`. +Instead our init command is simply an executable installed to `/root/bin/`. +Init is a node module, with a `bin` key in it's `package.json` file. +Any node module can be the node-os init, +but we try to provide a very useful, but minimal, init module. From 9f17024572a1e0df426133768bc7d1be08398eca Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Wed, 18 Jun 2014 13:01:59 +0800 Subject: [PATCH 023/206] update --- asgard.md | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/asgard.md b/asgard.md index 7079023c7..cfea245da 100644 --- a/asgard.md +++ b/asgard.md @@ -1,10 +1,29 @@ -The service-manager (code name asgard) is a job-control service. +The service-manager (code name asgard) is a task running service. + +Asgard provides a simple abstraction, upon which a tool like [[npkg]] can build a traditional service manager like *systemd* or *forever*. + +Asgard has two abstractions: + +1. a **task** is a real process that must be run +2. a **queue** is an ordered list of tasks + +This is a low-level abstraction, and not really of concern for the end user. The end-user will use a tool like [[npkg]] and in general never need to know about how asgard works. Similar to how there is no *spawn* system call, rather spawning a child process is just a combination of `fork` and `exec`. + +So for anyone who just wants to run your node process, have a look at [[npkg]]. For those interested in the gory details, here are a few high-level features of asgard: + +- tasks are run as soon as they are added to a queue +- tasks run sequentially per queue +- different queues run in parallel +- when a queue is empty, it just waits for new tasks to be added +- there is limited support for manipulating a queue + +Typically queues will only have a few tasks added to them at any time. ## HTTP IPC -You communicate with asgard over http. +You communicate with asgard over http using JSON encoded data. -For example, to start a job you `PUT` to `/job/:name` where `:name` is the unique identifier for your job. +For example, to start a queue you `PUT` to `/queue/:name` where `:name` is the unique identifier for your queue. ```json { @@ -16,7 +35,7 @@ For example, to start a job you `PUT` to `/job/:name` where `:name` is the uniqu "PATH": "/bin:/root/lib/node_modules/myapp/node_modules/.bin" }, "cwd": "/root/lib/node_modules/myapp", - "fd": [] + "fd": [...] } ] } @@ -33,6 +52,7 @@ The following are optional for each *task* } ``` +Eventually we would like to support segmenting processes, and limiting them via a quota. The following are reserved, but not implemented. For more information see the Linux [clone](http://linux.die.net/man/2/clone) call. @@ -55,8 +75,6 @@ For more information see the Linux [clone](http://linux.die.net/man/2/clone) cal } ``` -All of the above are required, aside from `user` and `group`. - ## File Descriptors File descriptors are pointers to various IO conduits of a process. There are many *things* that can be represented by a file descriptor, @@ -113,9 +131,9 @@ A better approach might be binding to a unix domain socket, for example `/root/v ## Permissions -There are no permissions. Either you have access to everything, or nothing. +There is no access-control. Either you have access to everything, or nothing. -> Each copy of init spawns jobs requested by a particular user, so that user needs access to all jobs supervised by a single init process. We however don't want jobs to have access to each other. If jobs are spawned under the current user, then jobs will be able to call init on behalf of the user. +> Each copy of init spawns queues requested by a particular user, so that user needs access to all queues supervised by a single init process. We however don't want queues to have access to each other. If queues are spawned under the current user, then queues will be able to call init on behalf of the user. > > On linux, the clone system call governs all new process (and thread) creation. Clone lets you decide what to share, and what not to share. If we require that all modules must contain all their dependencies, we could isolate each service in its own file system. This would cut the service off from having access to init. > @@ -137,18 +155,21 @@ In a multi-user environment, each user will run their own asgard service. ## Restart Semantics -There are no restart semantics. You can restart a job by defining a second restart task, e.g. +There are no restart semantics. You can restart a queue by defining a second restart task, e.g. ```javascript { tasks: [ - {...}, // job to run - {...} // command to restart job + {...}, // queue to run + {...} // command to restart queue ] } ``` -Restart semantics are difficult +The second command can decide how to restart the service, +since different tasks will demand different restart semantics. + +Why restart semantics are difficult: - A process that exits immediately due to an error can peg the CPU at 100%. - Generally we do not want to ever *stop* trying to restart a process. @@ -167,5 +188,5 @@ We let the caller to asgard decide how they want to handle restart. ## Review - asgard is simple, yet flexible. -- asgard is focused on running tasks, and jobs. +- asgard is focused on running tasks, and queues. - asgard should export a well-defined API, to allow multiple products interact with it. From 205ebdfa4e53fe9dd15f8eb7b08d9fd51221937a Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 22:07:11 -0700 Subject: [PATCH 024/206] Updated asgard (markdown) --- asgard.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/asgard.md b/asgard.md index cfea245da..39eb2a853 100644 --- a/asgard.md +++ b/asgard.md @@ -122,7 +122,7 @@ Asgard should respond with `501 Not Implemented`, rather than a `400/500` error HTTP is secure. If you think otherwise, you should stop using all websites. -HTTP security can be poorly implemented however. We actually punt on handling security asgard the server. Instead, we require that you secure the socket. +HTTP security can be poorly implemented however. We actually punt on handling security in asgard. Instead, we require that you secure the socket asgard is listening to. For simple cases, you can bind to `localhost`. Only processes on the same host can access asgard. @@ -132,15 +132,10 @@ A better approach might be binding to a unix domain socket, for example `/root/v ## Permissions There is no access-control. Either you have access to everything, or nothing. - -> Each copy of init spawns queues requested by a particular user, so that user needs access to all queues supervised by a single init process. We however don't want queues to have access to each other. If queues are spawned under the current user, then queues will be able to call init on behalf of the user. -> -> On linux, the clone system call governs all new process (and thread) creation. Clone lets you decide what to share, and what not to share. If we require that all modules must contain all their dependencies, we could isolate each service in its own file system. This would cut the service off from having access to init. -> -> -[Jacob June 18](https://github.com/NodeOS/node-init/issues/3#issuecomment-46272433) - In a multi-user environment, each user will run their own asgard service. +Since each users copy of asgard runs with user-permissions, not root permissions, it can only do as much damage as the user sending jobs to it. + ``` -+ asgard (root) \ From 6a2bbe28673ef68de7b669d1d505d040ce91da5a Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Tue, 17 Jun 2014 22:10:36 -0700 Subject: [PATCH 025/206] Updated _Sidebar (markdown) --- _Sidebar.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/_Sidebar.md b/_Sidebar.md index f8480de97..4dc15335f 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,4 +1,12 @@ +[[home]] + Design - [[file system|FileSystem]] - [[npkg]] - [[services]] +- [[asgard]] +- [[root]] +- [[init]] + +Special +- [[people]] \ No newline at end of file From 656e1b0f70a241c8a69100ef000d54d0f04fcb23 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Wed, 18 Jun 2014 00:56:06 -0700 Subject: [PATCH 026/206] Updated Home (markdown) --- Home.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Home.md b/Home.md index f908007e9..c43b3aed6 100644 --- a/Home.md +++ b/Home.md @@ -1,8 +1,14 @@ ## design - [[file system|FileSystem]] an overview of how the file system is laid out -- [[npkg]] the npkg command is the main interface to the system + +### components + +- [[init]] a minimal init - [[services]] an overview of how services are managed +- [[asgard]] the service manager's gory details +- [[npkg]] the user-friendly interface to downloading and running services +- [[root]] the user in charge of the above ## resources From 48a75d29e3fcadb9bfbee31b910c530342e22893 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Wed, 18 Jun 2014 01:00:29 -0700 Subject: [PATCH 027/206] Updated root (markdown) --- root.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/root.md b/root.md index 580ef8014..eaa0d56a6 100644 --- a/root.md +++ b/root.md @@ -1,6 +1,18 @@ The root user is like any other [user directory](FileSystem#user-directories) but it's also in charge of booting the system. +``` +/root/ + bin/ + init <-- boots the system + asgard <-- service manager started by init + lib/node_modules/ +``` + +The root directory at minimum needs the above, but will likely contain other modules helpful to booting the system. + +## the kernel and init + During boot after the kernel has loaded, it passes control to another process typically called the *init process*. The init process has PID 1, and *must* start the rest of the system. From d91cda368a8c13df0a59747434e803967aaec52a Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Wed, 18 Jun 2014 01:01:50 -0700 Subject: [PATCH 028/206] Updated root (markdown) --- root.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/root.md b/root.md index eaa0d56a6..2398b58e5 100644 --- a/root.md +++ b/root.md @@ -6,7 +6,9 @@ but it's also in charge of booting the system. bin/ init <-- boots the system asgard <-- service manager started by init - lib/node_modules/ + lib/ <-- installed node_modules for init/asgard + log/ <-- log files from init and other root services + var/ <-- persistent data for root services ``` The root directory at minimum needs the above, but will likely contain other modules helpful to booting the system. From 3a9f4083e0a73c02f7f9674c75192c0e3673f44d Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Wed, 18 Jun 2014 01:11:21 -0700 Subject: [PATCH 029/206] Updated npkg (markdown) --- npkg.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/npkg.md b/npkg.md index 1e1daef5a..9e4c8e96e 100644 --- a/npkg.md +++ b/npkg.md @@ -22,18 +22,24 @@ and any executables defined in the package are linked into `$HOME/bin`. Since `npkg` always writes to your home directory, you do not need root permissions. -You can use `npkg install` to craft a custom interface to the systme, -unique to every user. +You can use `npkg install` to craft a custom command line interface unique to every user. +For example: + +Install a package from *npm* which includes a [bin key](https://github.com/groundwater/node-bin-ifconfig/blob/master/package.json#L12-L14). ```bash -$ ncurl google.com - ERROR ncurl not found -$ npkg install ncurl - --> installing ncurl from npmjs.org - --> okay, done -$ ncurl google.com - -... +$ npkg install bin-ifconfig + --> installing bin-ifconfig from npmjs.org + --> linked executable `ifconfig` +``` + +Executables are installed to `$HOME/bin`, and should be immediately available to the CLI. + +```bash +$ ifconfig +{ + "lo0": { ip: "127.0.0.1", mask: "255.255.255.0" } +} ``` ## staring services From 15066a9f198da1f9d83f94b22d2ef9c843fcdc16 Mon Sep 17 00:00:00 2001 From: Jacob Groundwater Date: Thu, 19 Jun 2014 15:50:17 +0800 Subject: [PATCH 030/206] update --- asgard.md | 7 ++-- help.md | 2 ++ npkg.md | 9 +++++ product.md | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 help.md create mode 100644 product.md diff --git a/asgard.md b/asgard.md index 39eb2a853..40b737abf 100644 --- a/asgard.md +++ b/asgard.md @@ -35,7 +35,7 @@ For example, to start a queue you `PUT` to `/queue/:name` where `:name` is the u "PATH": "/bin:/root/lib/node_modules/myapp/node_modules/.bin" }, "cwd": "/root/lib/node_modules/myapp", - "fd": [...] + "fds": [...] } ] } @@ -45,8 +45,6 @@ The following are optional for each *task* ```javascript { - "exec": ... - "user" : 2, // prefer numeric id "group" : 3, } @@ -120,8 +118,7 @@ Asgard should respond with `501 Not Implemented`, rather than a `400/500` error ## Authentication -HTTP is secure. If you think otherwise, you should stop using all websites. - +HTTP is secure. If you think otherwise, you should stop using the web. HTTP security can be poorly implemented however. We actually punt on handling security in asgard. Instead, we require that you secure the socket asgard is listening to. For simple cases, you can bind to `localhost`. Only processes on the same host can access asgard. diff --git a/help.md b/help.md new file mode 100644 index 000000000..4b3c27688 --- /dev/null +++ b/help.md @@ -0,0 +1,2 @@ +The `help` command will be there to guide people through node-os. +This is a lot less like `man` and more like a http://nodeschool.io lesson. diff --git a/npkg.md b/npkg.md index 9e4c8e96e..b93e9c7e2 100644 --- a/npkg.md +++ b/npkg.md @@ -62,3 +62,12 @@ You can one-step daemonize this module with ```bash $ npkg start my_app ``` + +Once started with `npkg` the server is running in the background. +You can detach from the current login session without interrupting the server. + +Started services can be stopped with + +```bash +$ npkg stop my_app +``` diff --git a/product.md b/product.md new file mode 100644 index 000000000..d14129f6d --- /dev/null +++ b/product.md @@ -0,0 +1,98 @@ +Let's define some terminology used for this project. + +1. The **technology** is the clever abstraction. + It is performant, modularized, and flexible. + You need a mental model present to work with a technology, + but once it's in place you can do a lot. + + Unfortunately technology doesn't sell. + Technology is necessary, but it is not the end goal. +2. The **product** is the human face on technology. + It is specific, and focused. + If often uses only one aspect of a technology, + but it solves a real human problem. + + Designing a product is harder than designing a technology. + Smart people find products hard to design, + because products are all about compromise. + +Node-os is *both* a technology and a product, +so it's important to understand which part we're talking about at any given time. +For example: + +- [[asgard]] and [[init]] are a technologies, + they are clever abstractions that makes building + certain os-related products easier. +- [[npkg]] is a product. + It's designed to meet a human need, + and not require a lot of foreknowledge to use. +- [[help]] is a product. In many ways `help` should be the ambassador for the system. + Help is not `man` or `info`. It is not exhaustive; it is focused. + The `help` command focuses on guiding people through the system. +- A few things like the [[FileSystem]] are hybrids of technology and product. + We move things around to technically organize the system, + but we don't want the file system to seem foreign to users. + +## the product experience + +What should a users first experience with node-os be like? + +> users should want to have the node-os experience everywhere + +To that end, we want `npkg` to be the gateway to a users first experience. +It should quickly facilitate + +1. installing packages +2. running services +3. discovering packages +4. giving helpful feedback + +Where (4) may be most important. +There will not be an engineer standing over the should of most people's first +node-os experience. +You should be able to use node-os from the command line experience alone. + +### first experience + +What do we want the first experience to look like? *(let's improve on this)* + +```bash +welcome to node-os + +type help to get started + +$ +``` + +Typing `help` should display + +```bash +Try the following + + 1. help npkg learn about the npkg command + 2. help home learn about your home directory + +$ +``` + +Ideas + +1. make `help` stateful, so it can offer you conextual help + +### ongoing experience + +Why are people using node-os, and what problems are they trying to solve? +Answering these quesitons are important to creating a product that people will want to use. + +#### vanilla + +1. people want to run their node app quickly, without fussing around with init config files +2. people want to configure a system consistently without puppet/chef or other config-management tools + +#### wild + +1. people want to write a distributed file system with leveldb and http + +#### ultimate + +1. people want to do tcp/ip parsing in user-space with javascript From 81926679e196ca39ea27be838cda4d2df6aa4dc4 Mon Sep 17 00:00:00 2001 From: formula1 Date: Sun, 29 Jun 2014 02:01:11 -0700 Subject: [PATCH 031/206] Updated init (markdown) --- init.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.md b/init.md index e307d181e..545151886 100644 --- a/init.md +++ b/init.md @@ -9,7 +9,7 @@ The way Linux works, when a parent process dies it's children become children of PID 1. When those children exit, their PID number and exit status are recorded in the kernels process table. -The parent, in this cae init, +The parent, in this case init, needs to periodically call `wait` or `waitpid` to clear the process table. Processes which have exited but have not been cleared are called **zombies**. From 23ffbd5d4b31af6161860e25cd5067ed276b9772 Mon Sep 17 00:00:00 2001 From: piranna Date: Sun, 9 Nov 2014 16:19:09 -0800 Subject: [PATCH 032/206] Created GUI (markdown) --- GUI.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 GUI.md diff --git a/GUI.md b/GUI.md new file mode 100644 index 000000000..e64d52f2f --- /dev/null +++ b/GUI.md @@ -0,0 +1,27 @@ +Although is expected NodeOS to has in mid-term future support for audio & graphics, it will not have a GUI by itself. Instead, NodeOS will offer some graphic primitives that would allow to third-party Node.js modules to build a GUI by themselves. It's not clear yet how this low-level primitives APIs will be, but due to the relationship of Node.js with Javascript and this last one with the Web, there are two clear candidates that would allow an easy transition and/or adaptation to current available applications: + +# canvas +The [canvas](http://www.w3.org/wiki/HTML/Elements/canvas) object offer a bi-dimensional surface where pixels can be painted independently similar to other 2D environments like SDL or DirectFB, so it's a natural choice as a graphic primitive for drawing on a screen, and its API also has support for 3D drawing by using WebGL. + +## How can be done +This could be done by using [node-canvas](https://github.com/Automattic/node-canvas) by adapting it to use an EGL-backed Cairo graphic library, or [node-openvg-canvas](https://github.com/luismreis/node-openvg-canvas) that's compatible with node-canvas but more focused on screen rendering by using OpenVG library. + +## Use case +Canvas main use cases are pure Javascript flash-like applications fully build by using a canvas object like games and emulators, so they could be easily ported to Node.js and NodeOS. + +# web renderer +Canvas object and other framebuffer-like APIs are too low-level to use as basis for some applications. For more advanced desktop-like applications, a good alternative is to use a web renderer. This is similar to how ChromeOS or FirefoxOS works, and [there's interest on this happening on NodeOS](https://medium.com/javascript-ecosystem/booting-to-node-2d620ac5402). + +Currently there are some projects with a similar focus like [node-webkit](https://github.com/rogerwang/node-webkit), [atom-shell](https://github.com/atom/atom-shell) or [thrust](https://github.com/breach/thrust). Problems with them is that they are focused on development of desktop apps and integration using web technologies, so they are a little bit bloated for an environment like NodeOS where's no desktop at all and a thiner layer like the ones used in ChromeOS or FirefoxOS is a better alternative. Also, node-webkit and atom-shell allow direct access to Node.js functions from the DOM, making it more dificult to access to that applications remotely. + +## How can be done +The best alternative is [Chrome Embebed Framework](https://code.google.com/p/chromiumembedded/) (CEF), already being used by node-webkit, atom-shell and thrust. It should be used as a simple web renderer or web browser without any special intregation with Node.js or NodeOS, just only being compiled and packaged as a NPM package, and access to the Node.js app or NodeOS functionality by using a REST API or WebSockets, depending of the decision of the developer, and the interface files served by a static web server (that could be the same app server). If there's a common pattern on the development process, it could be bundle as a framework, but this is not intended at a short or medium term to allow more flexibility and creation liberty to the developers. + +This architecture allow the interface of the application to be isolated from the server functionality and the Node.js/NodeOS internal, so the app can be also accesible from an external web browser. An example of a Node.js application that follow this architecture is [Node.js Music Player](https://github.com/benkaiser/node-music-player). This is clearly more focused for daemonized applications, for "one shot" ones there should be needed to investigate how to do it, but an alternative is to exec the server and open the client window at the same time. + +## Use cases +Depending of the grade of integration between the GUI and the server done by the developer, we can see three kind of applications or use cases: + +* **webapp**: the application is fully build in client-side Javascript and HTML and don't need a server to run it, only a static web server to serve the files. This is the same concept that traditional web apps and will run entirely on the CEF environment. +* **server-side logic**: the logic of the application is fully on the Node.js server process, and the interface only show the results. This concept is similar to traditional or AJAX-based web architecture. +* **client-side logic**: the logic of the application is on the webapp, and the server acts as a proxy to allow access to the priviledged Node.js/NodeOS APIs (filesystem, TCP ports...). This is similar to the development of ChromeOS or FirefoxOS apps, with the difference that the use of priviledged APIs is not done by custom specific Javascript objects but instead by a custom protocol offered by the proxy server. This could be think to be added in the future as an uniform API on NodeOS itself instead of each developer crafting their own proxy server, for example by showing a REST API to that priviledged functionality or similar. \ No newline at end of file From 8b4ec248e360edec3826b2fadbf4d5d4a8904f74 Mon Sep 17 00:00:00 2001 From: piranna Date: Mon, 10 Nov 2014 01:00:19 -0800 Subject: [PATCH 033/206] Updated Home (markdown) --- Home.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.md b/Home.md index c43b3aed6..67d595aed 100644 --- a/Home.md +++ b/Home.md @@ -1,6 +1,7 @@ ## design - [[file system|FileSystem]] an overview of how the file system is laid out +- [[GUI]] guidelines to build graphical applications ### components From 0b8b018540f467ba51b3aef4e2a05457c5a28f33 Mon Sep 17 00:00:00 2001 From: piranna Date: Mon, 10 Nov 2014 01:30:19 -0800 Subject: [PATCH 034/206] Updated GUI (markdown) --- GUI.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GUI.md b/GUI.md index e64d52f2f..a788f4ee7 100644 --- a/GUI.md +++ b/GUI.md @@ -1,16 +1,16 @@ -Although is expected NodeOS to has in mid-term future support for audio & graphics, it will not have a GUI by itself. Instead, NodeOS will offer some graphic primitives that would allow to third-party Node.js modules to build a GUI by themselves. It's not clear yet how this low-level primitives APIs will be, but due to the relationship of Node.js with Javascript and this last one with the Web, there are two clear candidates that would allow an easy transition and/or adaptation to current available applications: +NodeOS is an operating system mainly designed to be run on head-less server machines, and although it's expected to has in mid-term future support for audio & graphics, it will not have a GUI by itself. Instead, NodeOS will offer some graphic primitives that would allow to third-party Node.js modules to build widget components and a GUI by themselves. It's not clear yet how this low-level primitives APIs will be, but due to the relationship of Node.js with Javascript and this last one with the Web ecosystem, there are two clear candidates that would allow an easy transition and/or adaptation to current available applications: # canvas -The [canvas](http://www.w3.org/wiki/HTML/Elements/canvas) object offer a bi-dimensional surface where pixels can be painted independently similar to other 2D environments like SDL or DirectFB, so it's a natural choice as a graphic primitive for drawing on a screen, and its API also has support for 3D drawing by using WebGL. +The [canvas](http://www.w3.org/wiki/HTML/Elements/canvas) object offer a bi-dimensional surface where pixels can be painted independently similar to other 2D environments like [SDL](https://www.libsdl.org/) or [DirectFB](http://directfb.org/), so it's a natural choice as a graphic primitive for drawing on a screen, and its API also has support for 3D drawing by using [WebGL](https://www.khronos.org/webgl/). Problem is, though, that the canvas object offer only low-level graphic primitives, so to create richer applications that works with images, windowing or z-buffer, it's needed to use external libraries and runtimes that offer that functionality on top of it. ## How can be done This could be done by using [node-canvas](https://github.com/Automattic/node-canvas) by adapting it to use an EGL-backed Cairo graphic library, or [node-openvg-canvas](https://github.com/luismreis/node-openvg-canvas) that's compatible with node-canvas but more focused on screen rendering by using OpenVG library. -## Use case -Canvas main use cases are pure Javascript flash-like applications fully build by using a canvas object like games and emulators, so they could be easily ported to Node.js and NodeOS. +## Use cases +Canvas main use cases are pure Javascript flash-like applications fully build by using a canvas object like games and emulators ported from web browsers, or new Node.js graphical applications build directly by using the canvas object, for example on low-resources environments or if the system will host only a single full-screen applications, like embebed systems. In that case it's encouraged (but not mandatory) to isolate the graphic interface from the logic of the application so this last one can be accessed from several UI clients (maybe richer ones build using a web renderer, see below), both locally or on remote machines. # web renderer -Canvas object and other framebuffer-like APIs are too low-level to use as basis for some applications. For more advanced desktop-like applications, a good alternative is to use a web renderer. This is similar to how ChromeOS or FirefoxOS works, and [there's interest on this happening on NodeOS](https://medium.com/javascript-ecosystem/booting-to-node-2d620ac5402). +Canvas object and other framebuffer-like APIs are too low-level to use as basis for some richer applications. For more advanced desktop-like applications, a good alternative is to use a web renderer, so this way you have all the functionality and flexibility of a standard web browser, at the cost of needing to use a heavier runtime. This is similar to how ChromeOS or FirefoxOS works, and [there's interest on this happening on NodeOS](https://medium.com/javascript-ecosystem/booting-to-node-2d620ac5402), as the project issues [has](https://github.com/NodeOS/NodeOS/issues/78) [shown](https://github.com/NodeOS/NodeOS/issues/79). Currently there are some projects with a similar focus like [node-webkit](https://github.com/rogerwang/node-webkit), [atom-shell](https://github.com/atom/atom-shell) or [thrust](https://github.com/breach/thrust). Problems with them is that they are focused on development of desktop apps and integration using web technologies, so they are a little bit bloated for an environment like NodeOS where's no desktop at all and a thiner layer like the ones used in ChromeOS or FirefoxOS is a better alternative. Also, node-webkit and atom-shell allow direct access to Node.js functions from the DOM, making it more dificult to access to that applications remotely. @@ -22,6 +22,6 @@ This architecture allow the interface of the application to be isolated from the ## Use cases Depending of the grade of integration between the GUI and the server done by the developer, we can see three kind of applications or use cases: -* **webapp**: the application is fully build in client-side Javascript and HTML and don't need a server to run it, only a static web server to serve the files. This is the same concept that traditional web apps and will run entirely on the CEF environment. +* **webapp**: the application is fully build in client-side Javascript and HTML and don't need a server to run it, only a static web server to serve the files. This is the same concept that traditional web apps and will run entirely on the CEF environment. Obviously, canvas-based graphical applications that don't rely on Node.js/NodeOS APIs and are executable on a web browser environment can fall in this category at the same time that they can be run directly on the Linux terminal by using a canvas object as shown previously. * **server-side logic**: the logic of the application is fully on the Node.js server process, and the interface only show the results. This concept is similar to traditional or AJAX-based web architecture. * **client-side logic**: the logic of the application is on the webapp, and the server acts as a proxy to allow access to the priviledged Node.js/NodeOS APIs (filesystem, TCP ports...). This is similar to the development of ChromeOS or FirefoxOS apps, with the difference that the use of priviledged APIs is not done by custom specific Javascript objects but instead by a custom protocol offered by the proxy server. This could be think to be added in the future as an uniform API on NodeOS itself instead of each developer crafting their own proxy server, for example by showing a REST API to that priviledged functionality or similar. \ No newline at end of file From beb823f024dd7d790ca2d6d97fe3af160242fd27 Mon Sep 17 00:00:00 2001 From: groundwater Date: Sun, 30 Nov 2014 12:04:50 -0800 Subject: [PATCH 035/206] Updated asgard (markdown) --- asgard.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/asgard.md b/asgard.md index 40b737abf..5a7a633d7 100644 --- a/asgard.md +++ b/asgard.md @@ -118,8 +118,7 @@ Asgard should respond with `501 Not Implemented`, rather than a `400/500` error ## Authentication -HTTP is secure. If you think otherwise, you should stop using the web. -HTTP security can be poorly implemented however. We actually punt on handling security in asgard. Instead, we require that you secure the socket asgard is listening to. +HTTP + SSL is secure. If you think otherwise, you should stop using the web. We actually punt on handling security in asgard. Instead, we require that you secure the socket asgard is listening to. For simple cases, you can bind to `localhost`. Only processes on the same host can access asgard. From 8526dbb27d9f5379ea2b4b37d256455a0ddf0f46 Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 12 Feb 2015 10:53:43 +0900 Subject: [PATCH 036/206] Created NodeO (markdown) --- NodeO.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 NodeO.md diff --git a/NodeO.md b/NodeO.md new file mode 100644 index 000000000..a608ffef3 --- /dev/null +++ b/NodeO.md @@ -0,0 +1,25 @@ +> scripts/install: line 93: genext2fs: command not found + +You need to install genext2fs. + +> cannnot find a C compiler + +The build probably got closed while in progress. Delete the `out` and `obj` folders you find in the sub folders of `node_modules` + +> scripts/start +Could not access KVM kernel module: No such file or directory +failed to initialize KVM: No such file or directory + +Your computer or virtual machine doesn't support kvm. Comment out [this line](https://github.com/NodeOS/NodeOS/blob/master/scripts/start#L34) + +> /usr/bin/env: node: No such file or directory + +Try +``` +sudo apt-get update +sudo apt-get dist-upgrade +``` + +> + +If you have any other errors when building NodeOS, check if there is an issue for the error. If there isn't please create [a new issue](https://github.com/NodeOS/NodeOS/issues/new). \ No newline at end of file From 89b400ab006f3d83f23d0b2d68ea3032ac80d85f Mon Sep 17 00:00:00 2001 From: zodern Date: Thu, 12 Feb 2015 10:57:18 +0900 Subject: [PATCH 037/206] Updated NodeO (markdown) --- NodeO.md => Fixing-NodeOS-Build-Errors.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename NodeO.md => Fixing-NodeOS-Build-Errors.md (92%) diff --git a/NodeO.md b/Fixing-NodeOS-Build-Errors.md similarity index 92% rename from NodeO.md rename to Fixing-NodeOS-Build-Errors.md index a608ffef3..b87cf5576 100644 --- a/NodeO.md +++ b/Fixing-NodeOS-Build-Errors.md @@ -1,6 +1,7 @@ + > scripts/install: line 93: genext2fs: command not found -You need to install genext2fs. +You need to install genext2fs: `sudo apt-get install genext2fs` > cannnot find a C compiler @@ -20,6 +21,4 @@ sudo apt-get update sudo apt-get dist-upgrade ``` -> - If you have any other errors when building NodeOS, check if there is an issue for the error. If there isn't please create [a new issue](https://github.com/NodeOS/NodeOS/issues/new). \ No newline at end of file From 645f68d2f472429175ee4457ad549cd674e66069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s=20Combarro?= Date: Sat, 26 Dec 2015 00:16:48 +0100 Subject: [PATCH 038/206] Updated GUI (markdown) --- GUI.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/GUI.md b/GUI.md index a788f4ee7..a5660cb8c 100644 --- a/GUI.md +++ b/GUI.md @@ -12,16 +12,18 @@ Canvas main use cases are pure Javascript flash-like applications fully build by # web renderer Canvas object and other framebuffer-like APIs are too low-level to use as basis for some richer applications. For more advanced desktop-like applications, a good alternative is to use a web renderer, so this way you have all the functionality and flexibility of a standard web browser, at the cost of needing to use a heavier runtime. This is similar to how ChromeOS or FirefoxOS works, and [there's interest on this happening on NodeOS](https://medium.com/javascript-ecosystem/booting-to-node-2d620ac5402), as the project issues [has](https://github.com/NodeOS/NodeOS/issues/78) [shown](https://github.com/NodeOS/NodeOS/issues/79). -Currently there are some projects with a similar focus like [node-webkit](https://github.com/rogerwang/node-webkit), [atom-shell](https://github.com/atom/atom-shell) or [thrust](https://github.com/breach/thrust). Problems with them is that they are focused on development of desktop apps and integration using web technologies, so they are a little bit bloated for an environment like NodeOS where's no desktop at all and a thiner layer like the ones used in ChromeOS or FirefoxOS is a better alternative. Also, node-webkit and atom-shell allow direct access to Node.js functions from the DOM, making it more dificult to access to that applications remotely. +Currently there are some projects with a similar focus like [node-webkit](https://github.com/rogerwang/node-webkit), [atom-shell](https://github.com/atom/atom-shell) or [thrust](https://github.com/breach/thrust). Problems with them is that they are focused on development of desktop apps and integration using web technologies, so they are a little bit bloated for an environment like NodeOS where there's no desktop at all, and a thinner layer like the ones used in ChromeOS or FirefoxOS is a better alternative. Also, node-webkit and atom-shell allow direct access to Node.js functions from the DOM, making it more dificult to access to that applications remotely. ## How can be done The best alternative is [Chrome Embebed Framework](https://code.google.com/p/chromiumembedded/) (CEF), already being used by node-webkit, atom-shell and thrust. It should be used as a simple web renderer or web browser without any special intregation with Node.js or NodeOS, just only being compiled and packaged as a NPM package, and access to the Node.js app or NodeOS functionality by using a REST API or WebSockets, depending of the decision of the developer, and the interface files served by a static web server (that could be the same app server). If there's a common pattern on the development process, it could be bundle as a framework, but this is not intended at a short or medium term to allow more flexibility and creation liberty to the developers. -This architecture allow the interface of the application to be isolated from the server functionality and the Node.js/NodeOS internal, so the app can be also accesible from an external web browser. An example of a Node.js application that follow this architecture is [Node.js Music Player](https://github.com/benkaiser/node-music-player). This is clearly more focused for daemonized applications, for "one shot" ones there should be needed to investigate how to do it, but an alternative is to exec the server and open the client window at the same time. +This architecture allow the interface of the application to be isolated from the server functionality and the Node.js/NodeOS internal, so the app can also be accesible from an external web browser. An example of a Node.js application that somewhat follow this architecture is [Node.js Music Player](https://github.com/benkaiser/node-music-player). This is clearly more focused for daemonized applications, for "one shot" ones there could be used an on-demand stateless web server, but an alternative is to exec the server and open the client window at the same time. ## Use cases Depending of the grade of integration between the GUI and the server done by the developer, we can see three kind of applications or use cases: -* **webapp**: the application is fully build in client-side Javascript and HTML and don't need a server to run it, only a static web server to serve the files. This is the same concept that traditional web apps and will run entirely on the CEF environment. Obviously, canvas-based graphical applications that don't rely on Node.js/NodeOS APIs and are executable on a web browser environment can fall in this category at the same time that they can be run directly on the Linux terminal by using a canvas object as shown previously. +* **webapp**: the application is fully build in client-side Javascript and HTML and don't need a server to run it, only a static web server to serve the files. This is the same concept that traditional web apps and will run entirely on the CEF environment. Obviously, canvas-based graphical applications that don't rely on Node.js/NodeOS APIs and are executable on a web browser environment can fall in this category at the same time that they can be run directly on the Linux terminal by using a canvas object as shown previously with some minor adaptions. * **server-side logic**: the logic of the application is fully on the Node.js server process, and the interface only show the results. This concept is similar to traditional or AJAX-based web architecture. -* **client-side logic**: the logic of the application is on the webapp, and the server acts as a proxy to allow access to the priviledged Node.js/NodeOS APIs (filesystem, TCP ports...). This is similar to the development of ChromeOS or FirefoxOS apps, with the difference that the use of priviledged APIs is not done by custom specific Javascript objects but instead by a custom protocol offered by the proxy server. This could be think to be added in the future as an uniform API on NodeOS itself instead of each developer crafting their own proxy server, for example by showing a REST API to that priviledged functionality or similar. \ No newline at end of file +* **client-side logic**: the logic of the application is on the webapp, and the server acts as a proxy to allow access to the priviledged Node.js/NodeOS APIs (filesystem, TCP ports...). This is similar to the development of ChromeOS or FirefoxOS apps, with the difference that the use of priviledged APIs is not done by custom specific Javascript objects but instead by a custom protocol offered by the proxy server. This could be think to be added in the future as an uniform API on NodeOS itself instead of each developer crafting their own proxy server, for example by showing a REST API to that priviledged functionality or similar. + +At this moment the prefered behaviour is the last one, where the static files are served by [Davius](https://github.com/piranna/Davius) DAV server or any other static HTTP server that autoclose itself. The autoclose mechanism can be implemented by using the [oneshoot](https://github.com/piranna/oneshoot) module or any other similar one. If the application needs to access some extra functionality it could use `oneshoot` or any other module to start an ad-hoc REST or WebSocket server. Also, it should be possible that the applications get executed standalone on a regular web browser without requiring to use any functionality provided by a particular desktop environment, or do it in an optional way. \ No newline at end of file From cda99ecb4c97cd3e3b521ebd83ed1efbcefd9cd8 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 22:59:37 -0600 Subject: [PATCH 039/206] Documenting program launcher --- Init-Scripts.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Init-Scripts.md diff --git a/Init-Scripts.md b/Init-Scripts.md new file mode 100644 index 000000000..b417ef50a --- /dev/null +++ b/Init-Scripts.md @@ -0,0 +1,23 @@ +# PalmTree, the NodeOS Program Launcher # + +## Introduction ## +Sometimes we need scripts to launch on startup. This is a remarkably easy task in NodeOS. +The startup program launcher on NodeOS is called PalmTree. PalmTree uses a simple .json file in the /etc/ folder called "palmtree.json". In this file, which we will refer to as the palmtree, is simply a JSON encoded array of objects. Each object contains at minimum the command to execute. Additionally, you may specify a name, or arguments to go along. Let's take a look at an example palmtree. + +`[ + { + "command": "plexdl", + "name": "PlexDL", + "args": ['beta-gui'] + } +]` + +As you can see, a command is specified, a name for the program, and an argument. Only the command is necessary. +On startup, with this palmtree, PalmTree would run the command "plexdl" with the argument "-beta-gui" and if there were any issues, it would report them and refer to the command as "PlexDL". + +## Adding or Removing Commands ## +### Manually ### +To add or remove programs from startup, simply remove the object from your palmtree. A graphical GUI is underworks to allow you to do this easily. + +### Programatically ### +To add or remove programs from startup programatically, the palmtree.json file is a perfectly formatted JSON file. In NodeJS, you can use `require` to load it, or use the fs module and JSON parse it. Then make your adjustments, be it adding or removing a program, then re-serialize the JSON object and write it back to the file. \ No newline at end of file From ce1c12686b733d43edafaac75f6efaa8907cb3d4 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:01:51 -0600 Subject: [PATCH 040/206] Updated Init Scripts (markdown) --- Init-Scripts.md => Service-Starter-(PalmTree).md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) rename Init-Scripts.md => Service-Starter-(PalmTree).md (54%) diff --git a/Init-Scripts.md b/Service-Starter-(PalmTree).md similarity index 54% rename from Init-Scripts.md rename to Service-Starter-(PalmTree).md index b417ef50a..0525ca4a6 100644 --- a/Init-Scripts.md +++ b/Service-Starter-(PalmTree).md @@ -1,7 +1,9 @@ # PalmTree, the NodeOS Program Launcher # +_REPOSITORY: _ [https://github.com/lite20/palmtree](https://github.com/lite20/palmtree) +_NPM MODULE:_ [https://www.npmjs.com/package/palmtree](https://www.npmjs.com/package/palmtree) ## Introduction ## -Sometimes we need scripts to launch on startup. This is a remarkably easy task in NodeOS. +Sometimes we need scripts, or services to launch on startup. This is a remarkably easy task in NodeOS. The startup program launcher on NodeOS is called PalmTree. PalmTree uses a simple .json file in the /etc/ folder called "palmtree.json". In this file, which we will refer to as the palmtree, is simply a JSON encoded array of objects. Each object contains at minimum the command to execute. Additionally, you may specify a name, or arguments to go along. Let's take a look at an example palmtree. `[ @@ -17,7 +19,7 @@ On startup, with this palmtree, PalmTree would run the command "plexdl" with the ## Adding or Removing Commands ## ### Manually ### -To add or remove programs from startup, simply remove the object from your palmtree. A graphical GUI is underworks to allow you to do this easily. +To add or remove scripts/services from startup, simply remove the object from your palmtree. A graphical GUI is underworks to allow you to do this easily. ### Programatically ### -To add or remove programs from startup programatically, the palmtree.json file is a perfectly formatted JSON file. In NodeJS, you can use `require` to load it, or use the fs module and JSON parse it. Then make your adjustments, be it adding or removing a program, then re-serialize the JSON object and write it back to the file. \ No newline at end of file +To add or remove scripts/services from startup programatically, the palmtree.json file is a perfectly formatted JSON file. In NodeJS, you can use `require` to load it, or use the fs module and JSON parse it. Then make your adjustments, be it adding or removing a program, then re-serialize the JSON object and write it back to the file. \ No newline at end of file From 02b871e96f16c64eae78528425030762cfbb1f1c Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:02:18 -0600 Subject: [PATCH 041/206] Fix formatting --- Service-Starter-(PalmTree).md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Service-Starter-(PalmTree).md b/Service-Starter-(PalmTree).md index 0525ca4a6..71c14a60c 100644 --- a/Service-Starter-(PalmTree).md +++ b/Service-Starter-(PalmTree).md @@ -1,5 +1,6 @@ # PalmTree, the NodeOS Program Launcher # -_REPOSITORY: _ [https://github.com/lite20/palmtree](https://github.com/lite20/palmtree) +_REPOSITORY:_ [https://github.com/lite20/palmtree](https://github.com/lite20/palmtree) + _NPM MODULE:_ [https://www.npmjs.com/package/palmtree](https://www.npmjs.com/package/palmtree) ## Introduction ## From c70a9fc470a9d92641a9048d63b14ff6454cfbfa Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:02:40 -0600 Subject: [PATCH 042/206] Updated Service Starter (PalmTree) (markdown) --- Service-Starter-(PalmTree).md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Service-Starter-(PalmTree).md b/Service-Starter-(PalmTree).md index 71c14a60c..9420d8387 100644 --- a/Service-Starter-(PalmTree).md +++ b/Service-Starter-(PalmTree).md @@ -1,4 +1,4 @@ -# PalmTree, the NodeOS Program Launcher # +# PalmTree, the NodeOS Service Starter # _REPOSITORY:_ [https://github.com/lite20/palmtree](https://github.com/lite20/palmtree) _NPM MODULE:_ [https://www.npmjs.com/package/palmtree](https://www.npmjs.com/package/palmtree) From 18bf25baa8449c1677b86d6febbc16d48cb89f17 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:05:29 -0600 Subject: [PATCH 043/206] Updated _Sidebar (markdown) --- _Sidebar.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_Sidebar.md b/_Sidebar.md index 4dc15335f..b9047308d 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,5 +1,8 @@ [[home]] +Systems +- [[Service Starter]] + Design - [[file system|FileSystem]] - [[npkg]] From 88f6c4b3fb342790f02e206de1ec47ff0ee1f8d5 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:10:38 -0600 Subject: [PATCH 044/206] Updated services (markdown) --- services.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services.md b/services.md index 59c425cb0..5378d66bd 100644 --- a/services.md +++ b/services.md @@ -23,5 +23,4 @@ Typically [[init]] or another service manager handles system services. - Windows uses ? - SmartOS uses `SMF` -Right now, we call the node-os service manager *init* because it's also PID 1. -We probably want a better name for it :grin: +NodeOS uses PalmTree as it's service starter. You can read more about working with it here on the wiki (see [[Service Starter|Service Starter (PalmTree)]]) and explore it's [repository](https://github.org/lite20/palmtree) too. \ No newline at end of file From fbe245096ea2b4f5ac25bed0109ac314a7f899c3 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:10:52 -0600 Subject: [PATCH 045/206] Updated _Sidebar (markdown) --- _Sidebar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.md b/_Sidebar.md index b9047308d..5d0c071f9 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,7 +1,7 @@ [[home]] Systems -- [[Service Starter]] +- [[Service Starter|Service Starter (PalmTree)]] Design - [[file system|FileSystem]] From 1bae8a154e36e2db5e9d8e4af58665745179f060 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:13:18 -0600 Subject: [PATCH 046/206] Updated asgard (markdown) --- asgard.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/asgard.md b/asgard.md index 5a7a633d7..89cff436f 100644 --- a/asgard.md +++ b/asgard.md @@ -1,3 +1,10 @@ +## _Warning! Deprecated_ ## +NodeOS now uses PalmTree as it's service manager. But we leave this here for now as it's quite a beautiful page :smile: + + + +*** + The service-manager (code name asgard) is a task running service. Asgard provides a simple abstraction, upon which a tool like [[npkg]] can build a traditional service manager like *systemd* or *forever*. From c3777fbc62cc641c5e7b554cb2c1ba41ed57add3 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:14:06 -0600 Subject: [PATCH 047/206] Updated asgard (markdown) --- asgard.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/asgard.md b/asgard.md index 89cff436f..ee33fee69 100644 --- a/asgard.md +++ b/asgard.md @@ -1,8 +1,6 @@ -## _Warning! Deprecated_ ## +## _Warning! Deprecated_ in place of [[PalmTree|Service Starter (PalmTree)]] ## NodeOS now uses PalmTree as it's service manager. But we leave this here for now as it's quite a beautiful page :smile: - - *** The service-manager (code name asgard) is a task running service. From ed3f8ecf1ec3dcb0a6c1418c20cc5d66023fc7a5 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:14:55 -0600 Subject: [PATCH 048/206] Updated _Sidebar (markdown) --- _Sidebar.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index 5d0c071f9..6f91a104c 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -3,13 +3,5 @@ Systems - [[Service Starter|Service Starter (PalmTree)]] -Design -- [[file system|FileSystem]] -- [[npkg]] -- [[services]] -- [[asgard]] -- [[root]] -- [[init]] - Special - [[people]] \ No newline at end of file From 687aaab64a612c0666155af19ba0449b88896d6b Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:16:58 -0600 Subject: [PATCH 049/206] Organizing to keep it clean :D --- Design.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Design.md diff --git a/Design.md b/Design.md new file mode 100644 index 000000000..cfa4bb7ae --- /dev/null +++ b/Design.md @@ -0,0 +1,12 @@ +## Here lies our collective conciousness ## + +Even as we discuss everything in the issues, additionally here you will find drafts for concepts and ideas for NodeOS. Feel free to contribute to an idea and should a great idea come across your mind, create a new Thread and page and link one to another! + + +### Current Designs ### +- [[file system|FileSystem]] +- [[npkg]] +- [[services]] +- [[asgard]] +- [[root]] +- [[init]] \ No newline at end of file From ac1c5f57169225ee83d6bba5300b3d0d4c349a5c Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:17:26 -0600 Subject: [PATCH 050/206] Updated _Sidebar (markdown) --- _Sidebar.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_Sidebar.md b/_Sidebar.md index 6f91a104c..62f34c7f4 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -4,4 +4,5 @@ Systems - [[Service Starter|Service Starter (PalmTree)]] Special -- [[people]] \ No newline at end of file +- [[Design]] +- [[Contributors|people]] \ No newline at end of file From 688ef2b96bca68895d48dfc5c31384899eb225a4 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:20:07 -0600 Subject: [PATCH 051/206] Created FAQ (markdown) --- FAQ.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 FAQ.md diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 000000000..aac3519e8 --- /dev/null +++ b/FAQ.md @@ -0,0 +1,8 @@ +# NodeOS Frequently Asked Questions # +(Or solutions to problems you seem to have often). + +Not many questions will be actually answered on this page, but rather linked to the respective page thank explains it to you nicely in detail. Hopefully at the start of the page a tl;dr will sum it all up for you if you don't have time. + +Fixing NodeOS Build Errors: [[Fixing-NodeOS-Build-Errors]] + +How do I add startup services?: [[PalmTree|service starter]] \ No newline at end of file From f96229803138e4f3957333d23c87adcb389a3c5a Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:20:32 -0600 Subject: [PATCH 052/206] Updated _Sidebar (markdown) --- _Sidebar.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_Sidebar.md b/_Sidebar.md index 62f34c7f4..38b7efc3e 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -3,6 +3,8 @@ Systems - [[Service Starter|Service Starter (PalmTree)]] +FAQ: +- [[FAQ]] Special - [[Design]] - [[Contributors|people]] \ No newline at end of file From 9595269e5701890c947d4d538b37e1e8adcce97b Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:20:46 -0600 Subject: [PATCH 053/206] Updated _Sidebar (markdown) --- _Sidebar.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_Sidebar.md b/_Sidebar.md index 38b7efc3e..b164a14e4 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -3,8 +3,9 @@ Systems - [[Service Starter|Service Starter (PalmTree)]] -FAQ: +FAQ - [[FAQ]] + Special - [[Design]] - [[Contributors|people]] \ No newline at end of file From 822844546a201cd20e042f05c98aaa86b907204a Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:22:21 -0600 Subject: [PATCH 054/206] Updated FAQ (markdown) --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index aac3519e8..b70ca6e0f 100644 --- a/FAQ.md +++ b/FAQ.md @@ -5,4 +5,4 @@ Not many questions will be actually answered on this page, but rather linked to Fixing NodeOS Build Errors: [[Fixing-NodeOS-Build-Errors]] -How do I add startup services?: [[PalmTree|service starter]] \ No newline at end of file +How do I add startup services?: [[PalmTree|Service Starter (PalmTree)]] \ No newline at end of file From d7137e38989f57936cfd2d0c376e34cd8fa125c2 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:22:39 -0600 Subject: [PATCH 055/206] Updated FAQ (markdown) --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index b70ca6e0f..a975f26ce 100644 --- a/FAQ.md +++ b/FAQ.md @@ -5,4 +5,4 @@ Not many questions will be actually answered on this page, but rather linked to Fixing NodeOS Build Errors: [[Fixing-NodeOS-Build-Errors]] -How do I add startup services?: [[PalmTree|Service Starter (PalmTree)]] \ No newline at end of file +How do I add startup services?: [[Service Starter (PalmTree)]] \ No newline at end of file From 90d60260965afeafdd42579bd092fde99f999528 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:29:06 -0600 Subject: [PATCH 056/206] Updated Home (markdown) --- Home.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Home.md b/Home.md index 67d595aed..0e62de340 100644 --- a/Home.md +++ b/Home.md @@ -1,20 +1,19 @@ -## design +# NodeOS Wiki # -- [[file system|FileSystem]] an overview of how the file system is laid out -- [[GUI]] guidelines to build graphical applications +Welcome to our humble abode. If you've come seeking explanations to NodeOS systems please take a look at the sidebar. Additionally, here is a nice listing of the documentation. -### components +Systems +- [[Service Starter|Service Starter (PalmTree)]] +FAQ +- [[FAQ]] + +Design - [[init]] a minimal init - [[services]] an overview of how services are managed - [[asgard]] the service manager's gory details - [[npkg]] the user-friendly interface to downloading and running services - [[root]] the user in charge of the above -## resources - -- http://npkg.org - -## community - -- [[People]] who've helped +Community +- [[People]] Notable contributors (Maybe you'll become one some day) From 0b130266994f81c92375f6b98a18b7197bf29f27 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Feb 2016 23:29:40 -0600 Subject: [PATCH 057/206] Updated Home (markdown) --- Home.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Home.md b/Home.md index 0e62de340..4859cf202 100644 --- a/Home.md +++ b/Home.md @@ -3,10 +3,10 @@ Welcome to our humble abode. If you've come seeking explanations to NodeOS systems please take a look at the sidebar. Additionally, here is a nice listing of the documentation. Systems -- [[Service Starter|Service Starter (PalmTree)]] +- [[Service Starter|Service Starter (PalmTree)]] the nodeos service starter FAQ -- [[FAQ]] +- [[FAQ]] frequently asked questions, and solutions to common problems Design - [[init]] a minimal init From 8ec07ad8c8412113ade947752d0175cbcec45eb1 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 23 Feb 2016 00:01:00 -0600 Subject: [PATCH 058/206] Updated _Sidebar (markdown) From 04789a79f51bb1832411ea2e3e8141296c22008a Mon Sep 17 00:00:00 2001 From: Philipp Date: Wed, 6 Apr 2016 21:06:21 +0200 Subject: [PATCH 059/206] Updated _Sidebar (markdown) --- _Sidebar.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index b164a14e4..713c4f978 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,11 +1,12 @@ [[home]] -Systems -- [[Service Starter|Service Starter (PalmTree)]] - -FAQ -- [[FAQ]] - -Special -- [[Design]] -- [[Contributors|people]] \ No newline at end of file +* Usage + * Building from Source + * [[Using Git]] +* Systems + * [[Service Starter|Service Starter (PalmTree)]] +* FAQ + * [[FAQ]] +* Special + * [[Design]] + * [[Contributors|people]] \ No newline at end of file From 6311b548e5674f148757e18cd16d3b2bbe3baa27 Mon Sep 17 00:00:00 2001 From: luii Date: Sat, 9 Apr 2016 15:42:49 +0200 Subject: [PATCH 060/206] edit sidebar and add new wiki pages --- _Sidebar.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index 713c4f978..db4383c3e 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,12 +1,19 @@ -[[home]] - -* Usage - * Building from Source - * [[Using Git]] -* Systems - * [[Service Starter|Service Starter (PalmTree)]] -* FAQ - * [[FAQ]] -* Special - * [[Design]] - * [[Contributors|people]] \ No newline at end of file +- [[What is NodeOS]] +- [[Introduction]] +- [[Getting Started]] + + - [[Using precompiled Binaries]] + - [[Building From Source]] + + - [[Building From Source#Step 1: Prerequisites|Prerequisites]] + - [[Debian/Ubuntu dependencies|Building From Source#Step 2a: Debian/Ubuntu dependencies]] + - [[Arch Linux dependencies|Building From Source#Step 2b: Arch Linux dependencies]] + - [[Installation|Building From Source#Step 3: Installation]] + - [[Run the build|Building From Source#Step 4: Run your fresh NodeOS build]] + + - [[Service Starter]] + +- [[Roadmap]] +- [[Contributing]] + + - [[Contributors|people]] From 93ef00eb9b665716ddfaa656ef0fbbb689a85ccb Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 15:49:35 +0200 Subject: [PATCH 061/206] update wiki sidebar --- _Sidebar.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index db4383c3e..d0ea1724d 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,19 +1,17 @@ -- [[What is NodeOS]] +- [[What is NodeOS|Home]] - [[Introduction]] -- [[Getting Started]] - +- Getting Started - [[Using precompiled Binaries]] - [[Building From Source]] - - - [[Building From Source#Step 1: Prerequisites|Prerequisites]] + - [[Prerequisites|Building From Source#Step 1: Prerequisites]] - [[Debian/Ubuntu dependencies|Building From Source#Step 2a: Debian/Ubuntu dependencies]] - [[Arch Linux dependencies|Building From Source#Step 2b: Arch Linux dependencies]] - [[Installation|Building From Source#Step 3: Installation]] - [[Run the build|Building From Source#Step 4: Run your fresh NodeOS build]] - - - [[Service Starter]] - -- [[Roadmap]] + - [[Service Starter|PalmTree]] + - [[Commands]] + - [[Filesystem]] +- Roadmaps + - [[Alpha Roadmap|https://github.com/NodeOS/NodeOS/issues/37]] + - [[Beta Roadmap|https://github.com/NodeOS/NodeOS/issues/146]] - [[Contributing]] - - - [[Contributors|people]] From 0c8cc734f43fdda388a0b0825f1f9c77e0b64bbc Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 15:54:37 +0200 Subject: [PATCH 062/206] update sidebar links --- _Sidebar.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index d0ea1724d..34f3f6227 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,17 +1,23 @@ - [[What is NodeOS|Home]] - [[Introduction]] - Getting Started + - [[Using precompiled Binaries]] - [[Building From Source]] - - [[Prerequisites|Building From Source#Step 1: Prerequisites]] - - [[Debian/Ubuntu dependencies|Building From Source#Step 2a: Debian/Ubuntu dependencies]] - - [[Arch Linux dependencies|Building From Source#Step 2b: Arch Linux dependencies]] - - [[Installation|Building From Source#Step 3: Installation]] - - [[Run the build|Building From Source#Step 4: Run your fresh NodeOS build]] + + - [Prerequisites](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 1: Prerequisites) + - [Debian/Ubuntu dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 2a: Debian/Ubuntu dependencies) + - [Arch Linux dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 2b: Arch Linux dependencies) + - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 3: Installation) + - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 4: Run your fresh NodeOS build) + - [[Service Starter|PalmTree]] - [[Commands]] - [[Filesystem]] + - Roadmaps - - [[Alpha Roadmap|https://github.com/NodeOS/NodeOS/issues/37]] - - [[Beta Roadmap|https://github.com/NodeOS/NodeOS/issues/146]] + + - [[Alpha Roadmap|]] + - [[Beta Roadmap|]] + - [[Contributing]] From 73c23cf1edbbabbc76b29e86c4ac268587b074fc Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Sun, 10 Apr 2016 15:55:15 +0200 Subject: [PATCH 063/206] Updated _Sidebar (markdown) --- _Sidebar.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index 34f3f6227..1defe3c69 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,23 +1,17 @@ - [[What is NodeOS|Home]] - [[Introduction]] - Getting Started - - [[Using precompiled Binaries]] - [[Building From Source]] - - [Prerequisites](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 1: Prerequisites) - [Debian/Ubuntu dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 2a: Debian/Ubuntu dependencies) - [Arch Linux dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 2b: Arch Linux dependencies) - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 3: Installation) - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 4: Run your fresh NodeOS build) - - [[Service Starter|PalmTree]] - [[Commands]] - [[Filesystem]] - - Roadmaps - - [[Alpha Roadmap|]] - [[Beta Roadmap|]] - - [[Contributing]] From 10edfee478bcaf667fb6a28ff3e4ee679f4c447f Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 15:56:00 +0200 Subject: [PATCH 064/206] add build from source page --- Building From Source.md | 127 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 Building From Source.md diff --git a/Building From Source.md b/Building From Source.md new file mode 100644 index 000000000..08cd703b7 --- /dev/null +++ b/Building From Source.md @@ -0,0 +1,127 @@ +# Building From Source + +## Step 1: Prerequisites + +- **Git**. To install using: + + - for **Debian/Ubuntu**: `apt-get install git` + - for **Arch**: `pacman -S git` + +- Node 4.x +- NPM 2.x + +**_Note: If you're using Node 5.x and NPM 3.x, the build process will crash, further Information under [[Troubleshooting]] or Issue #218_** + +After you installed the prerequisites just clone the repository + +```bash +$ git clone https://github.com/NodeOS/NodeOS.git +``` + +## Step 2a: Debian/Ubuntu dependencies + +Once you've installed the prerequisites you need the dependencies for Debian/Ubuntu using `apt-get`. First you need to update your cache. To do so run + +```bash +$ dpkg --add-architecture i386 +$ apt-get -qq -y update +``` + +Then you install the dependencies listed below + +- cross compiler dependencies: `apt-get -qq -y gcc g++ realpath texinfo` +- barebones dependencies: `apt-get -qq -y bc libpixman-1-dev` +- rootfs dependencies: `apt-get -qq -y genisoimage libuuid:i386` +- userfs dependencies: `apt-get -qq -y autoconf automake` +- qemu dependencies: `apt-get -qq -y libsdl1.2-dev` + +Or as a one liner: + +```bash +$ apt-get -qq -y gcc g++ realpath texinfo bc libpixman-1-dev genisoimage libuuid:i386 autoconf automake libsdl1.2-dev +``` + +Or just run if you're outside the folder + +```bash +$ cd NodeOS/ +$ bin/install-debian-deps +``` + +## Step 2b: Arch Linux dependencies + +Once you have installed the prerequisites you need the dependencies for Arch Linux + +- cross compiler dependencies: `pacman -S gcc g++ realpath texinfo python2` +- barebones dependencies: `pacman -S bc pixman lib32-pixman libpixman-1-dev` +- rootfs dependencies: `pacman -S genisoimage` +- initramfs dependencies: `pacman -S gpio` +- userfs dependencies: `pacman -S autoconf automake` +- qemu dependencies: `pacman -S sdl` + +**_Note: The initramfs dependencies are not shipped with the installation of Arch Linux thats why we need to install them on Arch Linux_** + +Or as one liner: + +```bash +$ pacman -S gcc g++ realpath texinfo python2 bc pixman lib32-pixman libpixman-1-dev genisoimage gpio autoconf automake sdl +``` + +Or just run if you're outside the folder + +```bash +$ cd NodeOS/ +$ bin/install-arch-deps +``` + +## Step 3: Installation + +Once you've installed the correct dependencies for your operating system you can start with the installation of NodeOS. + +**_Note: If you have Arch Linux you need to set python2 as default binary when you run `python`. Because the standart python binary is python3 and nodegyp dont uses it._** To do this, run following commands: + +```bash +$ cd /usr/bin +$ ln -sf python2 python +``` + +The next step is to install the npm dependencies and the bundled dependencies to do this run following command: + +```bash +$ npm install +``` + +If you want to change the Platform for running your NodeOS just write this infront of `npm install`. This would build NodeOS for QEMU 32bit + +```bash +$ PLATFORM=qemu_32 npm install +or +$ PLATFORM=docker npm install +``` + +Now it should install correctly, this process can take some time! Pick some microwave pop-corn and go to see a movie. No, really, do it. + +## Step 4: Run your fresh NodeOS build + +Now you can run your fresh build with: + +```bash +$ npm start +``` + +If NodeOS not boots into the REPL unless you want that then everything was compiled correctly. **If not look under [[Troubleshooting]]** + +After NodeOS has booted up you should see something like: + +``` +Hello! I'm a user init script :-) +``` + +Now you're prompted to enter your username and password. For now the username and password is `nodeos` + +``` +$ username: nodeos +$ password: nodeos +``` + +**Note: This is not permanent on later versions this will be changed** From afa6f72d7462b254e781f11ccf6177fd77e44798 Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:09:07 +0200 Subject: [PATCH 065/206] add Troubleshooting page --- Troubleshooting.md | 119 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 Troubleshooting.md diff --git a/Troubleshooting.md b/Troubleshooting.md new file mode 100644 index 000000000..09f3b043d --- /dev/null +++ b/Troubleshooting.md @@ -0,0 +1,119 @@ +# Troubleshooting + +If you have problems to compile your NodeOS version or get errors during the compile process then please look below. + +## NodeOS boots into the REPL + +This error occurs when NodeOS cant mount the filesystem. This will propably happen when you compile your NodeOS with Arch Linux. + +**Solution: No possible Solution** + +## Incorrect NPM Version + +This error mostly occurs when you use NPM 3 with Node.js 5.x because NPM 3 uses a flat dependency structure + +```bash +cp: the call of stat for 'node_modules/nodeos-barebones/out/latest' is not possible: file or directory not found +cp: the call of stat for 'node_modules/nodeos-initramfs/out/latest' is not possible: file or directory not found +cp: the call of stat for 'node_modules/nodeos-usersfs/out/latest' is not possible: file or directory not found +``` + +**Solution: Please change your Node.js version from 5.x to 4.x and your NPM version from 3.x to 2.x** + +Reference: Issue [#223](../issues/223) + +## Dissapearing nodeos-barebones + +This error occurs like the error above on the NPM version + +```bash +$ find . -name adjustEnvVars.sh +./node_modules/nodeos-barebones/node_modules/nodeos-cross-toolchain/scripts/adjustEnvVars.sh + +$ npm install + +> NodeOS@0.0.0 install /home/tbrooks/Projects/nodeos +> scripts/build + +scripts/build: line 7: /home/myprofile/Projects/node_modules/nodeos-barebones/node_modules/nodeos-cross-toolchain/scripts/adjustEnvVars.sh: No such file or directory + +npm ERR! Linux 4.4.1-2-ARCH +npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" +npm ERR! node v5.6.0 +npm ERR! npm v3.7.1 +npm ERR! code ELIFECYCLE +npm ERR! NodeOS@0.0.0 install: `scripts/build` +npm ERR! Exit status 1 +npm ERR! etc... +``` + +**Solution: Please change your Node version from 5.x to 4.x and your NPM version from 3.x to 2.x** + +Reference: Issue [#218](../issues/218) + +## NSH crashes on empty pipe + +If you're using a old NodeOS docker image and enter `|` then you can get something like this + +For the old Docker images: + +```bash +/root/lib/node_modules/bin-nsh/node_modules/lib-cmdparse/index.js:15 + if (env && item[0] != '-' && item.indexOf('=') > 0) { + ^ +TypeError: Object has no method "indexOf" + at /root/lib/node_modules/bin-nsh/node_modules/lib-cmdparse/index.js:15:39 + at Array.forEach (native) + at parse (/root/lib/node_modules/bin-nsh/node_modules/lib-cmdparse/index.js:13:9) + at run (/root/lib/node_modules/bin-nsh/nsh.js:123:16) + at readline (/root/lib/node_modules/bin-nsh/nsh.js:93:7) + at /root/lib/node_modules/bin-nsh/nsh.js:176:5 + at Interface._onLine (readline.js:200:5) + at Interface._line (readline.js:531:8) + at Interface._ttyWrite (readline.js:760:14) + at ReadStream.onkeypress (readline.js:99:10) +``` + +For the new versions: + +```bash +/ # | +readline.js:925 + throw err; + ^ + +TypeError: item.indexOf is not a function + at Stacktrace.. +``` + +**Solution: For now there is no solution for this problem** + +Reference: Issue [#217](../issues/217) + +## Error compiling NodeOS / QEMU + +In older version qemu were a normal dependency, for the new versions of NodeOS, is qemu now a npm dependency + +```bash +{ + [ Error: Command failed: ./configure --prefix=/home/triplebackslash/Documents/nodeos/node_modules/nodeos-barebones/usr --target-list=arm-softmmu,i386-softmmu,x86_64-softmmu,arm-linux-user,i386-linux-user,x86_64-linux-user --disable-docs --disable-vnc --enable-sdl ] + killed: false, + code: 1, + signal: null, + cmd: "./configure --prefix=/home/triplebackslash/Documents/nodeos/node_modules/nodeos-barebones/usr --target-list=arm-softmmu,i386-softmmu,x86_64-softmmu,arm-linux-user,i386-linux-user,x86_64-linux-user --disable-docs --disable-vnc --enable-sdl" +} +``` + +**Solution: Use newer version of NodeOS** + +Reference: Issue [#212](../issues/212) + +## genext2fs: command not found + +```bash +scripts/install: line 93: genext2fs: command not found +``` + +**Solution: You need to install genext2fs** + +## From f83ccbb4d2041b24ee7c22803cbe000ffdf072e2 Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:09:23 +0200 Subject: [PATCH 066/206] add commands page --- Commands.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Commands.md diff --git a/Commands.md b/Commands.md new file mode 100644 index 000000000..fa773ab4e --- /dev/null +++ b/Commands.md @@ -0,0 +1,31 @@ +# Commands + +This site describes all available Commands in NodeOS. At the moment there are not many commands but they can be extended by NPM Or you create your own commands. + +This list is helpful for Linux beginners, on the list below you find the Name and the description for the corresponding command. + +## List of Commands + +- `cat` - is one of the most frequently used commands on Unix-like operating systems. It has three related functions with regard to text files: displaying them, combining copies of them and creating new ones. +- `cp` - is an internel command of a unix shell to copy files. +- `davius` - Davius is a HTTP/WebDAV server that offer the content from the filesystem. +- `env` - is a unix command, that shows the environment variables when called with no arguments or it starts a program in another environment without changing the variables of the active one. +- `ln` - is a standard Unix command utility used to create a hard link (link) or a symbolic link (symlink) to an existing file. +- `ls` - is a command to list files in Unix and Unix-like operating systems. +- `man` - is used to format and display man (or manual) pages +- `mkdir` - is used to create a new folder +- `mv` - is used to move files or folders +- `node` - This is the node binary +- `npm` - is NodeOS's package Manager (like: pacman (Arch); yaourt (Arch); apt-get (Debian/Ubuntu)) +- `nsh` - is the shell of NodeOS (both "no shell" and "node shell" accurately describe nsh) +- `pwd` - Returns the current working directory +- `rm` - is a basic UNIX command used to remove objects such as files, directories, device nodes, symbolic links, and so on from the filesystem. +- `sh` - is a command language interpreter that shall execute commands read from a command line string, the standard input, or a specified file. +- `wget` - is a computer program that retrieves content from web servers. +- `ip` - The `ip` command is similar to ifconfig, but more powerful and is intented to be a replacement for it. +- `ifconfig` - stands for "interface configuration". It is used to view and change the configuration of the network interfaces on your system. +- `pstree` - pstree shows running processes as a tree. The tree is rooted at either pid or init if pid is omitted. +- `performance` - is a benchmark tool to check the speed of some (javascript?) functions +- `loadtest` - Runs a load test on the selected HTTP or WebSockets URL. +- `testserver-loadtest` - This command will show the number of requests received per second, the latency in answering requests and the headers for selected requests. +- `node-ntp-client` - This binary implements the NTP Protocol which gets the Network time over a specific Server (like 'pool.ntp.org') From f7d14574d8371e701caacfa2f209a0070249a3a7 Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:09:54 +0200 Subject: [PATCH 067/206] add introduction page --- Introduction.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Introduction.md diff --git a/Introduction.md b/Introduction.md new file mode 100644 index 000000000..645f1f355 --- /dev/null +++ b/Introduction.md @@ -0,0 +1,22 @@ +# Introduction + +Welcome to the developer doucmentation for NodeOS. NodeOS is a open source, high performance Operating System. + +This documentation is aimed at all Javascript developers who want to use Node.js as their main Operating System, as well as anyone interested in NodeOS's design and performance. This document introduces you to NodeOS, while the remaining documentation shows you how to use NodeOS for developing on it. + +# About NodeOS + +NodeOS is a Node.js based operating system, built-off of the Linux kernel. The NodeOS Project is aiming to, and can already run on some of the following platforms: + +- real hardware like desktops, laptops, or SoC's (Raspberry Pi) +- cloud providers like Joyent, Amazon or Rackspace +- virtual machines like QEmu, VirtualBox, VMWare and KVM +- PaaS providers like Heroku or Joyent's Manta +- container providers like Docker & Vagga + +Core development is being done in layers. There could be some differences to adjust better to each target platform, but the general structure is: + +- barebones custom Linux kernel with an initramfs that boots to a Node.js REPL +- initramfs Initram environment to mount the users partition & boot the system +- rootfs Read-only partition image to host Linux kernel and initramfs files +- usersfs multi-user environment with the same behaviour of traditional OSes From baed60cc8302100307cb87d47d3541138e14c044 Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:11:28 +0200 Subject: [PATCH 068/206] update home page --- Home.md | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/Home.md b/Home.md index 4859cf202..36cd3bb61 100644 --- a/Home.md +++ b/Home.md @@ -1,19 +1,22 @@ -# NodeOS Wiki # +NodeOS -Welcome to our humble abode. If you've come seeking explanations to NodeOS systems please take a look at the sidebar. Additionally, here is a nice listing of the documentation. +# What is NodeOS? -Systems -- [[Service Starter|Service Starter (PalmTree)]] the nodeos service starter +NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. -FAQ -- [[FAQ]] frequently asked questions, and solutions to common problems +**Quick links:** [[Getting Started]] | [[Building From Source]] -Design -- [[init]] a minimal init -- [[services]] an overview of how services are managed -- [[asgard]] the service manager's gory details -- [[npkg]] the user-friendly interface to downloading and running services -- [[root]] the user in charge of the above +## Contributers -Community -- [[People]] Notable contributors (Maybe you'll become one some day) +Here are some great people who have helped NodeOS in some significant way. In no particular order: + +- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) +- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) +- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) +- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) +- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) +- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) +- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) +- [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) + +Everyone above is awesome! From ad7eabee6835320d7cfcb711d56143272ad0329b Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:14:48 +0200 Subject: [PATCH 069/206] update links for sidebar again --- _Sidebar.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index 1defe3c69..7e58048e2 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,17 +1,24 @@ - [[What is NodeOS|Home]] - [[Introduction]] - Getting Started + - [[Using precompiled Binaries]] - [[Building From Source]] - - [Prerequisites](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 1: Prerequisites) - - [Debian/Ubuntu dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 2a: Debian/Ubuntu dependencies) - - [Arch Linux dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 2b: Arch Linux dependencies) - - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 3: Installation) - - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#Step 4: Run your fresh NodeOS build) + + - [Prerequisites](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-1-prerequisites) + - [Debian/Ubuntu dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-2a-debianubuntu-dependencies) + - [Arch Linux dependencies]( + - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-3-installation) + - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-4-run-your-fresh-nodeos-build) + - [[Service Starter|PalmTree]] - [[Commands]] - [[Filesystem]] + - Roadmaps - - [[Alpha Roadmap|]] - - [[Beta Roadmap|]] + + - [Alpha Roadmap](https://github.com/NodeOS/NodeOS/issues/37) + - [Beta Roadmap](https://github.com/NodeOS/NodeOS/issues/146) + - [[Contributing]] +- [[Troubleshooting]] From 13492fc5335c507ca4d768ec993dd2a002254453 Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:19:07 +0200 Subject: [PATCH 070/206] remove new lines --- _Sidebar.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/_Sidebar.md b/_Sidebar.md index 7e58048e2..4989724c5 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -1,24 +1,18 @@ - [[What is NodeOS|Home]] - [[Introduction]] - Getting Started - - [[Using precompiled Binaries]] - [[Building From Source]] - - [Prerequisites](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-1-prerequisites) - [Debian/Ubuntu dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-2a-debianubuntu-dependencies) - [Arch Linux dependencies]( - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-3-installation) - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-4-run-your-fresh-nodeos-build) - - [[Service Starter|PalmTree]] - [[Commands]] - [[Filesystem]] - - Roadmaps - - [Alpha Roadmap](https://github.com/NodeOS/NodeOS/issues/37) - [Beta Roadmap](https://github.com/NodeOS/NodeOS/issues/146) - - [[Contributing]] - [[Troubleshooting]] From 6cfa8dabdca133230295d7164572d6c414b0c5bf Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:20:12 +0200 Subject: [PATCH 071/206] fix corrupted link --- _Sidebar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.md b/_Sidebar.md index 4989724c5..8d7957ca3 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -5,7 +5,7 @@ - [[Building From Source]] - [Prerequisites](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-1-prerequisites) - [Debian/Ubuntu dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-2a-debianubuntu-dependencies) - - [Arch Linux dependencies]( + - [Arch Linux dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-2b-arch-linux-dependencies) - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-3-installation) - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-4-run-your-fresh-nodeos-build) - [[Service Starter|PalmTree]] From 82e2f8310df47fa9171b2a89e9395e6dedfb9ccd Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 16:21:19 +0200 Subject: [PATCH 072/206] remove headline b --- Introduction.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/Introduction.md b/Introduction.md index 645f1f355..78fed918d 100644 --- a/Introduction.md +++ b/Introduction.md @@ -1,5 +1,3 @@ -# Introduction - Welcome to the developer doucmentation for NodeOS. NodeOS is a open source, high performance Operating System. This documentation is aimed at all Javascript developers who want to use Node.js as their main Operating System, as well as anyone interested in NodeOS's design and performance. This document introduces you to NodeOS, while the remaining documentation shows you how to use NodeOS for developing on it. From 2fbf3bf010e517d80d746218eec36ecd17be3787 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Sun, 10 Apr 2016 20:54:57 +0200 Subject: [PATCH 073/206] Destroyed People (markdown) --- People.md | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 People.md diff --git a/People.md b/People.md deleted file mode 100644 index 76a2fa2de..000000000 --- a/People.md +++ /dev/null @@ -1,12 +0,0 @@ -Here are some great people who have helped NodeOS in some significant way. -In no particular order: - -- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) -- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) -- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) -- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) -- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) -- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) -- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) - -Everyone above is awesome! From 87c7785f2d7ecb4d6d356d0246a9fade92ffcddd Mon Sep 17 00:00:00 2001 From: luii Date: Sun, 10 Apr 2016 21:07:03 +0200 Subject: [PATCH 074/206] fix typos and some wrong dependencies for arch --- Building From Source.md | 10 +++++----- Introduction.md | 20 -------------------- 2 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 Introduction.md diff --git a/Building From Source.md b/Building From Source.md index 08cd703b7..80e9fa4ed 100644 --- a/Building From Source.md +++ b/Building From Source.md @@ -52,10 +52,10 @@ $ bin/install-debian-deps Once you have installed the prerequisites you need the dependencies for Arch Linux -- cross compiler dependencies: `pacman -S gcc g++ realpath texinfo python2` -- barebones dependencies: `pacman -S bc pixman lib32-pixman libpixman-1-dev` -- rootfs dependencies: `pacman -S genisoimage` -- initramfs dependencies: `pacman -S gpio` +- cross compiler dependencies: `pacman -S gcc texinfo python2` +- barebones dependencies: `pacman -S bc pixman lib32-pixman` +- rootfs dependencies: `pacman -S cdrkit` +- initramfs dependencies: `pacman -S cpio` - userfs dependencies: `pacman -S autoconf automake` - qemu dependencies: `pacman -S sdl` @@ -64,7 +64,7 @@ Once you have installed the prerequisites you need the dependencies for Arch Lin Or as one liner: ```bash -$ pacman -S gcc g++ realpath texinfo python2 bc pixman lib32-pixman libpixman-1-dev genisoimage gpio autoconf automake sdl +$ pacman -S gcc texinfo python2 bc pixman lib32-pixman cdrkit cpio autoconf automake sdl ``` Or just run if you're outside the folder diff --git a/Introduction.md b/Introduction.md deleted file mode 100644 index 78fed918d..000000000 --- a/Introduction.md +++ /dev/null @@ -1,20 +0,0 @@ -Welcome to the developer doucmentation for NodeOS. NodeOS is a open source, high performance Operating System. - -This documentation is aimed at all Javascript developers who want to use Node.js as their main Operating System, as well as anyone interested in NodeOS's design and performance. This document introduces you to NodeOS, while the remaining documentation shows you how to use NodeOS for developing on it. - -# About NodeOS - -NodeOS is a Node.js based operating system, built-off of the Linux kernel. The NodeOS Project is aiming to, and can already run on some of the following platforms: - -- real hardware like desktops, laptops, or SoC's (Raspberry Pi) -- cloud providers like Joyent, Amazon or Rackspace -- virtual machines like QEmu, VirtualBox, VMWare and KVM -- PaaS providers like Heroku or Joyent's Manta -- container providers like Docker & Vagga - -Core development is being done in layers. There could be some differences to adjust better to each target platform, but the general structure is: - -- barebones custom Linux kernel with an initramfs that boots to a Node.js REPL -- initramfs Initram environment to mount the users partition & boot the system -- rootfs Read-only partition image to host Linux kernel and initramfs files -- usersfs multi-user environment with the same behaviour of traditional OSes From 512f66b15f305bc23e472386a9b3a83c1e194076 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 11 Apr 2016 16:38:03 -0600 Subject: [PATCH 075/206] Updated Home (markdown) --- Home.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.md b/Home.md index 36cd3bb61..04a129a54 100644 --- a/Home.md +++ b/Home.md @@ -18,5 +18,5 @@ Here are some great people who have helped NodeOS in some significant way. In no - [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) - [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) - [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) - +- [Lite20](https://twitter.com/lightningboy24) (Wiki Maintainer) Everyone above is awesome! From 7f57953b7f67ddf7b0803fb9d6c35e3dd248512f Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 11 Apr 2016 16:55:03 -0600 Subject: [PATCH 076/206] Updated Building From Source (markdown) --- Building From Source.md => Building-From-Source.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename Building From Source.md => Building-From-Source.md (77%) diff --git a/Building From Source.md b/Building-From-Source.md similarity index 77% rename from Building From Source.md rename to Building-From-Source.md index 80e9fa4ed..be23f5136 100644 --- a/Building From Source.md +++ b/Building-From-Source.md @@ -18,7 +18,7 @@ After you installed the prerequisites just clone the repository $ git clone https://github.com/NodeOS/NodeOS.git ``` -## Step 2a: Debian/Ubuntu dependencies +## Step 2 (Debian/Ubuntu): Dependencies Once you've installed the prerequisites you need the dependencies for Debian/Ubuntu using `apt-get`. First you need to update your cache. To do so run @@ -48,7 +48,7 @@ $ cd NodeOS/ $ bin/install-debian-deps ``` -## Step 2b: Arch Linux dependencies +## Step 2 (Arch Linux): Dependencies Once you have installed the prerequisites you need the dependencies for Arch Linux @@ -78,7 +78,7 @@ $ bin/install-arch-deps Once you've installed the correct dependencies for your operating system you can start with the installation of NodeOS. -**_Note: If you have Arch Linux you need to set python2 as default binary when you run `python`. Because the standart python binary is python3 and nodegyp dont uses it._** To do this, run following commands: +**_Note: If you have Arch Linux you need to set python2 as default binary when you run `python`. Because the standard python binary is python3 and nodegyp doesn't uses it._** To do this, run following commands: ```bash $ cd /usr/bin @@ -91,7 +91,7 @@ The next step is to install the npm dependencies and the bundled dependencies to $ npm install ``` -If you want to change the Platform for running your NodeOS just write this infront of `npm install`. This would build NodeOS for QEMU 32bit +If you want to change the target platform to build NodeOS for, just prepend the `PLATFORM` argument before `npm install`. Example (NodeOS for QEMU 32bit): ```bash $ PLATFORM=qemu_32 npm install @@ -99,7 +99,7 @@ or $ PLATFORM=docker npm install ``` -Now it should install correctly, this process can take some time! Pick some microwave pop-corn and go to see a movie. No, really, do it. +Now it should install correctly. This process can take some time, so pick some microwave pop-corn and go to see a movie. No, really... do it. ## Step 4: Run your fresh NodeOS build @@ -109,7 +109,7 @@ Now you can run your fresh build with: $ npm start ``` -If NodeOS not boots into the REPL unless you want that then everything was compiled correctly. **If not look under [[Troubleshooting]]** +If NodeOS does not boot into the REPL, unless you wanted that, then everything was compiled correctly. **If not look under [[Troubleshooting]]** After NodeOS has booted up you should see something like: @@ -117,7 +117,7 @@ After NodeOS has booted up you should see something like: Hello! I'm a user init script :-) ``` -Now you're prompted to enter your username and password. For now the username and password is `nodeos` +Now you're prompted to enter your username and password. By default, the username and password is `nodeos` and cannot be changed without altering code. ``` $ username: nodeos From 14c1708ba5a25317357bae7ef29becd684bd8290 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 11 Apr 2016 16:57:02 -0600 Subject: [PATCH 077/206] Updated _Sidebar (markdown) --- _Sidebar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.md b/_Sidebar.md index 8d7957ca3..291e69d83 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -8,7 +8,7 @@ - [Arch Linux dependencies](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-2b-arch-linux-dependencies) - [Installation](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-3-installation) - [Run the build](https://github.com/NodeOS/NodeOS/wiki/Building-From-Source#step-4-run-your-fresh-nodeos-build) - - [[Service Starter|PalmTree]] + - [Service Starter](https://github.com/NodeOS/NodeOS/wiki/Service-Starter-(PalmTree)) - [[Commands]] - [[Filesystem]] - Roadmaps From 7c4478a1f4db9a47a1a2fc0ff40ff8e31b73d901 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 12 Apr 2016 21:22:41 -0600 Subject: [PATCH 078/206] Updated Home (markdown) --- Home.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.md b/Home.md index 04a129a54..c88b63566 100644 --- a/Home.md +++ b/Home.md @@ -19,4 +19,5 @@ Here are some great people who have helped NodeOS in some significant way. In no - [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) - [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) - [Lite20](https://twitter.com/lightningboy24) (Wiki Maintainer) + Everyone above is awesome! From f98a40bea43423c7c3d124391793a46cd8d8aef0 Mon Sep 17 00:00:00 2001 From: marten silbiger Date: Wed, 4 May 2016 16:20:26 -0700 Subject: [PATCH 079/206] spelling --- Home.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.md b/Home.md index c88b63566..5144d98b0 100644 --- a/Home.md +++ b/Home.md @@ -6,7 +6,7 @@ NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is a **Quick links:** [[Getting Started]] | [[Building From Source]] -## Contributers +## Contributors Here are some great people who have helped NodeOS in some significant way. In no particular order: From 4064f5b9949576b4ff34d757f2b426ae73af713d Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 12:36:02 -0600 Subject: [PATCH 080/206] Updated Home (markdown) From 566e172064d0bbd4da5fdc65f6c6c9d1dac1872c Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:50:35 +0000 Subject: [PATCH 081/206] Create SUMMARY.md --- SUMMARY.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 SUMMARY.md diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 000000000..e8c391919 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,4 @@ +# Summary + +* Home + From a67562626fb613b491c9114c495ee02aa858ede1 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:51:24 +0000 Subject: [PATCH 082/206] Update SUMMARY.md --- SUMMARY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SUMMARY.md b/SUMMARY.md index e8c391919..69d613faa 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,4 +1,6 @@ # Summary +* [Introduction](README.md) * Home +* ReadMe.md From 02cd81c9d69f3e8c96cf372c6dd428d75268f388 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:51:31 +0000 Subject: [PATCH 083/206] Create readmemd.md --- readmemd.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 readmemd.md diff --git a/readmemd.md b/readmemd.md new file mode 100644 index 000000000..0ba270608 --- /dev/null +++ b/readmemd.md @@ -0,0 +1,2 @@ +# ReadMe.md + From a88553d3fcb8b51578f1e78ccced3574a7b6cce0 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:51:32 +0000 Subject: [PATCH 084/206] Update SUMMARY.md --- SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index 69d613faa..22180b743 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -2,5 +2,5 @@ * [Introduction](README.md) * Home -* ReadMe.md +* [ReadMe.md](readmemd.md) From 88767fe67e6b508fd79c3255ceb6dde98f2cff3e Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:51:42 +0000 Subject: [PATCH 085/206] Move file readmemd.md to README.md --- readmemd.md => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename readmemd.md => README.md (100%) diff --git a/readmemd.md b/README.md similarity index 100% rename from readmemd.md rename to README.md From bb57f145a6a8a7b70c232f66a5c26c8e32728948 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:51:48 +0000 Subject: [PATCH 086/206] Delete readmemd.md From fe3c996d593c73f17c1490c5be5d27185f0e6c72 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Tue, 10 May 2016 18:51:49 +0000 Subject: [PATCH 087/206] Update SUMMARY.md --- SUMMARY.md | 1 - 1 file changed, 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index 22180b743..451a1cd54 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -2,5 +2,4 @@ * [Introduction](README.md) * Home -* [ReadMe.md](readmemd.md) From 5f6e7861959570a434565e9c39bda4c029a81c5a Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:39:57 +0000 Subject: [PATCH 088/206] Create LANGS.md --- LANGS.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 LANGS.md diff --git a/LANGS.md b/LANGS.md new file mode 100644 index 000000000..e69de29bb From 3bc58e769a87a872b274ce46b312538a56df456d Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:43:27 +0000 Subject: [PATCH 089/206] Update LANGS.md --- LANGS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/LANGS.md b/LANGS.md index e69de29bb..422b28cf7 100644 --- a/LANGS.md +++ b/LANGS.md @@ -0,0 +1,4 @@ +* [English](en/) +* [French](fr/) +* [Español](es/) +* [Deutsch](de/) \ No newline at end of file From c06e33f701f6e58d17e9b377c8699838570df7c9 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:45:52 +0000 Subject: [PATCH 090/206] Create de/README.md --- de/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 de/README.md diff --git a/de/README.md b/de/README.md new file mode 100644 index 000000000..e69de29bb From 3e14b6ef3357a8447a28219599a937235ca77642 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:45:55 +0000 Subject: [PATCH 091/206] Create en/README.md --- en/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 en/README.md diff --git a/en/README.md b/en/README.md new file mode 100644 index 000000000..e69de29bb From 753a439d87b819769b689ada94a80d2f1b7e66ce Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:45:59 +0000 Subject: [PATCH 092/206] Create es/README.md --- es/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 es/README.md diff --git a/es/README.md b/es/README.md new file mode 100644 index 000000000..e69de29bb From 18a11a066a166d3ee99c487fd0bc674b9e448334 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:46:02 +0000 Subject: [PATCH 093/206] Create fr/README.md --- fr/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fr/README.md diff --git a/fr/README.md b/fr/README.md new file mode 100644 index 000000000..e69de29bb From 8a63cf134ef3794f256727b6bb0c124ea50efa06 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:55:35 +0000 Subject: [PATCH 094/206] Create de/Summary --- de/Summary | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 de/Summary diff --git a/de/Summary b/de/Summary new file mode 100644 index 000000000..e69de29bb From 011606dfe0127280f0807451546f85e1344bce63 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:55:47 +0000 Subject: [PATCH 095/206] Move file de/Summary to de/SUMMARY.md --- de/{Summary => SUMMARY.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename de/{Summary => SUMMARY.md} (100%) diff --git a/de/Summary b/de/SUMMARY.md similarity index 100% rename from de/Summary rename to de/SUMMARY.md From a77fc629fb0fbe194876e2f1946f817537c9ee91 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:55:57 +0000 Subject: [PATCH 096/206] Create en/SUMMARY.md --- en/SUMMARY.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 en/SUMMARY.md diff --git a/en/SUMMARY.md b/en/SUMMARY.md new file mode 100644 index 000000000..e69de29bb From f51730b3499ce842deb86186e700f97bc9354afa Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:56:03 +0000 Subject: [PATCH 097/206] Create es/SUMMARY.md --- es/SUMMARY.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 es/SUMMARY.md diff --git a/es/SUMMARY.md b/es/SUMMARY.md new file mode 100644 index 000000000..e69de29bb From 4a8d7ae4df198ccc829214dbb4bcca57d21f639f Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:56:09 +0000 Subject: [PATCH 098/206] Create fr/SUMMARY.md --- fr/SUMMARY.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fr/SUMMARY.md diff --git a/fr/SUMMARY.md b/fr/SUMMARY.md new file mode 100644 index 000000000..e69de29bb From 208f78002c2a7df7af245f3fd3e68d8be26c3dde Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:58:50 +0000 Subject: [PATCH 099/206] Update de/SUMMARY.md --- de/SUMMARY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/de/SUMMARY.md b/de/SUMMARY.md index e69de29bb..995eecb53 100644 --- a/de/SUMMARY.md +++ b/de/SUMMARY.md @@ -0,0 +1,3 @@ +* [Was ist NodeOS](what-is-nodeos.md) +* [Einleitung](introduction.md) +* \ No newline at end of file From 14877e6b2891c60a7d123fbb895eeb736b82cfd2 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:59:39 +0000 Subject: [PATCH 100/206] Create de/what-is-nodeos.md --- de/what-is-nodeos.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 de/what-is-nodeos.md diff --git a/de/what-is-nodeos.md b/de/what-is-nodeos.md new file mode 100644 index 000000000..e69de29bb From c9cbba3d2856f027ad0a9b131d8c5c7f76df66c2 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 16:59:49 +0000 Subject: [PATCH 101/206] Create de/introduction.md --- de/introduction.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 de/introduction.md diff --git a/de/introduction.md b/de/introduction.md new file mode 100644 index 000000000..e69de29bb From 90c25e0370259576ad88965c6a4e27fee256d8fc Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:03:40 +0000 Subject: [PATCH 102/206] Move file de/what-is-nodeos.md to de/was-ist-nodeos.md --- de/{what-is-nodeos.md => was-ist-nodeos.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename de/{what-is-nodeos.md => was-ist-nodeos.md} (100%) diff --git a/de/what-is-nodeos.md b/de/was-ist-nodeos.md similarity index 100% rename from de/what-is-nodeos.md rename to de/was-ist-nodeos.md From e441d5f65960dc286faa2a0b2fc62fe4eada68e8 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:03:46 +0000 Subject: [PATCH 103/206] Move file de/introduction.md to de/einleitung.md --- de/{introduction.md => einleitung.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename de/{introduction.md => einleitung.md} (100%) diff --git a/de/introduction.md b/de/einleitung.md similarity index 100% rename from de/introduction.md rename to de/einleitung.md From ddd287509df583d7445459ecf4b7bb34b4f1b2e4 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:04:08 +0000 Subject: [PATCH 104/206] Update de/SUMMARY.md --- de/SUMMARY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/de/SUMMARY.md b/de/SUMMARY.md index 995eecb53..c6ce904c6 100644 --- a/de/SUMMARY.md +++ b/de/SUMMARY.md @@ -1,3 +1,3 @@ -* [Was ist NodeOS](what-is-nodeos.md) -* [Einleitung](introduction.md) +* [Was ist NodeOS](was-ist-nodeos.md) +* [Einleitung](einleitung.md) * \ No newline at end of file From 9b7eab778c265f2c89d9936e94cc9de0449ad3de Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:05:14 +0000 Subject: [PATCH 105/206] Update de/SUMMARY.md --- de/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/de/SUMMARY.md b/de/SUMMARY.md index c6ce904c6..d7d95d0f3 100644 --- a/de/SUMMARY.md +++ b/de/SUMMARY.md @@ -1,3 +1,3 @@ * [Was ist NodeOS](was-ist-nodeos.md) * [Einleitung](einleitung.md) -* \ No newline at end of file +* [Erste Schritte](erste-schritte.md) \ No newline at end of file From bb762d3db4bf29606bbf209ab1782247b4dbc330 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:05:29 +0000 Subject: [PATCH 106/206] Create de/erste-schritte.md --- de/erste-schritte.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 de/erste-schritte.md diff --git a/de/erste-schritte.md b/de/erste-schritte.md new file mode 100644 index 000000000..e69de29bb From 29aa51a9ac8787e34d4ac3b52213a96dc62bdba0 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:06:48 +0000 Subject: [PATCH 107/206] Update de/SUMMARY.md --- de/SUMMARY.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/de/SUMMARY.md b/de/SUMMARY.md index d7d95d0f3..ee21ef90b 100644 --- a/de/SUMMARY.md +++ b/de/SUMMARY.md @@ -1,3 +1,4 @@ * [Was ist NodeOS](was-ist-nodeos.md) * [Einleitung](einleitung.md) -* [Erste Schritte](erste-schritte.md) \ No newline at end of file +* [Erste Schritte](erste-schritte.md) + * \ No newline at end of file From 70448a2eba58cc944edef0c83ecc5c863827ad00 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:16:36 +0000 Subject: [PATCH 108/206] Update de/was-ist-nodeos.md --- de/was-ist-nodeos.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/de/was-ist-nodeos.md b/de/was-ist-nodeos.md index e69de29bb..fa1963311 100644 --- a/de/was-ist-nodeos.md +++ b/de/was-ist-nodeos.md @@ -0,0 +1,3 @@ +# Was ist NodeOS? + +NodeOS ist ein minimalistisches Betriebssystem welches Node.js für den "Userspace" benutzt. NodeOS ist vollständig in Javascript gemacht und durch NPM (als Packetmanager) kontrolliert. Jedes Packet dass bei NPM vorhanden ist, ist gleichzeitig auch ein Packet \ No newline at end of file From cd06f4497a83c71215d4680677854de1013f7388 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:22:57 +0000 Subject: [PATCH 109/206] Update de/was-ist-nodeos.md --- de/was-ist-nodeos.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/de/was-ist-nodeos.md b/de/was-ist-nodeos.md index fa1963311..c6c6a9339 100644 --- a/de/was-ist-nodeos.md +++ b/de/was-ist-nodeos.md @@ -1,3 +1,6 @@ # Was ist NodeOS? -NodeOS ist ein minimalistisches Betriebssystem welches Node.js für den "Userspace" benutzt. NodeOS ist vollständig in Javascript gemacht und durch NPM (als Packetmanager) kontrolliert. Jedes Packet dass bei NPM vorhanden ist, ist gleichzeitig auch ein Packet \ No newline at end of file +NodeOS ist ein minimalistisches Betriebssystem welches Node.js für den "Userspace" benutzt. NodeOS ist vollständig in Javascript gemacht und durch NPM (als Packetmanager) kontrolliert. Jedes Packet dass bei NPM vorhanden ist, ist gleichzeitig auch ein Packet für NodeOS, das heißt dass es 244,180 (nach letzter zählung) potenzielle Packete für NodeOS gibt. + +Das Ziel von NodeOS ist grade soviel bereitzustellen damit NPM den rest bereitstellen kann. +Da jeder auf NPM hochladen kann, kann auch jeder ein NodeOS Packet erstellen. \ No newline at end of file From e2679b435bd7108dbed123b6bb5387411648a101 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Tue, 24 May 2016 17:24:50 +0000 Subject: [PATCH 110/206] Update de/SUMMARY.md --- de/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/de/SUMMARY.md b/de/SUMMARY.md index ee21ef90b..68f863296 100644 --- a/de/SUMMARY.md +++ b/de/SUMMARY.md @@ -1,4 +1,4 @@ -* [Was ist NodeOS](was-ist-nodeos.md) +* [Was ist NodeOS?](was-ist-nodeos.md) * [Einleitung](einleitung.md) * [Erste Schritte](erste-schritte.md) * \ No newline at end of file From 154c20a98fc4e16d4c1057c1b17ac72fec0fd378 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:08:30 +0000 Subject: [PATCH 111/206] Update README.md --- README.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ba270608..c60ebb207 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,25 @@ -# ReadMe.md +NodeOS + +# What is NodeOS? + +NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. + +**Quick links:** [[Getting Started]] | [[Building From Source]] + +## Contributors + +Here are some great people who have helped NodeOS in some significant way. In no particular order: + +- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) +- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) +- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) +- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) +- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) +- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) +- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) +- [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) +- [Lite20](https://twitter.com/lightningboy24) (Wiki Maintainer) + +Everyone above is awesome! + From 5d853c7920ad7de33c595de6db90f32199f9a990 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:31:14 +0000 Subject: [PATCH 112/206] Update en/README.md --- en/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/en/README.md b/en/README.md index e69de29bb..c60ebb207 100644 --- a/en/README.md +++ b/en/README.md @@ -0,0 +1,25 @@ +NodeOS + +# What is NodeOS? + +NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. + +**Quick links:** [[Getting Started]] | [[Building From Source]] + +## Contributors + +Here are some great people who have helped NodeOS in some significant way. In no particular order: + +- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) +- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) +- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) +- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) +- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) +- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) +- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) +- [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) +- [Lite20](https://twitter.com/lightningboy24) (Wiki Maintainer) + +Everyone above is awesome! + + From 0728f9c62e1d001cd0506dd494b6cf4c5c7987fe Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:39:52 +0000 Subject: [PATCH 113/206] Update en/README.md --- en/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/README.md b/en/README.md index c60ebb207..2ac72f7db 100644 --- a/en/README.md +++ b/en/README.md @@ -1,8 +1,8 @@ -NodeOS +NodeOS # What is NodeOS? -NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. +NodeOS is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. **Quick links:** [[Getting Started]] | [[Building From Source]] From 74d504cb39ce995377a23bca17b71094f046dad9 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:51:51 +0000 Subject: [PATCH 114/206] Move file Service-Starter-(PalmTree).md to en/Service-Starter-(PalmTree).md --- Service-Starter-(PalmTree).md => en/Service-Starter-(PalmTree).md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Service-Starter-(PalmTree).md => en/Service-Starter-(PalmTree).md (100%) diff --git a/Service-Starter-(PalmTree).md b/en/Service-Starter-(PalmTree).md similarity index 100% rename from Service-Starter-(PalmTree).md rename to en/Service-Starter-(PalmTree).md From 12ba6a754679723ea5d1f40187f98c6ae1aa403a Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:52:33 +0000 Subject: [PATCH 115/206] Delete Home.md --- Home.md | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 Home.md diff --git a/Home.md b/Home.md deleted file mode 100644 index 5144d98b0..000000000 --- a/Home.md +++ /dev/null @@ -1,23 +0,0 @@ -NodeOS - -# What is NodeOS? - -NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. - -**Quick links:** [[Getting Started]] | [[Building From Source]] - -## Contributors - -Here are some great people who have helped NodeOS in some significant way. In no particular order: - -- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) -- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) -- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) -- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) -- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) -- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) -- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) -- [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) -- [Lite20](https://twitter.com/lightningboy24) (Wiki Maintainer) - -Everyone above is awesome! From 2f12227cad91474a2410c3d023b14970679fb092 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:55:08 +0000 Subject: [PATCH 116/206] Create en/nsh/README.md --- en/nsh/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 en/nsh/README.md diff --git a/en/nsh/README.md b/en/nsh/README.md new file mode 100644 index 000000000..e69de29bb From 5bcedf993cc69070ee9eb4116dad15253d4c97c9 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:55:16 +0000 Subject: [PATCH 117/206] Move file Commands.md to en/Commands.md --- Commands.md => en/Commands.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Commands.md => en/Commands.md (100%) diff --git a/Commands.md b/en/Commands.md similarity index 100% rename from Commands.md rename to en/Commands.md From e4fd423e59db3d39de29a1419e83c59c72be6458 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 03:55:32 +0000 Subject: [PATCH 118/206] Move file en/Commands.md to en/nsh/Commands.md --- en/{ => nsh}/Commands.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename en/{ => nsh}/Commands.md (100%) diff --git a/en/Commands.md b/en/nsh/Commands.md similarity index 100% rename from en/Commands.md rename to en/nsh/Commands.md From 87a08257dc4e4b766f71622d79e60127da789b4f Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 20:49:55 +0000 Subject: [PATCH 119/206] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c60ebb207..678992e8a 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. **Quick links:** [[Getting Started]] | [[Building From Source]] +## Overview + +Know where you're looking for? Here's a list of what's in the wiki! If you're just reading to learn how NodeOS works, start with the first one! + ## Contributors From 716a13824e195f1fbfc24a8141693f0463623c2d Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 20:51:15 +0000 Subject: [PATCH 120/206] Delete README.md --- README.md | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 678992e8a..000000000 --- a/README.md +++ /dev/null @@ -1,29 +0,0 @@ -NodeOS - -# What is NodeOS? - -NodeOs is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. - -**Quick links:** [[Getting Started]] | [[Building From Source]] -## Overview - -Know where you're looking for? Here's a list of what's in the wiki! If you're just reading to learn how NodeOS works, start with the first one! - - -## Contributors - -Here are some great people who have helped NodeOS in some significant way. In no particular order: - -- [David Xu](https://twitter.com/dvdxu) (Early website, testing, and adoption) -- [Forrest Norvell](https://twitter.com/othiym23) (NodeOS on Raspberry Pi) -- [Max Ogden](https://twitter.com/maxogden) (Docker testing, deploy, and evangelizing) -- [Max Bernstein](https://github.com/tekknolagi) (Crazy asm madness and docker testing) -- [Jake Verbaten](https://github.com/raynos) (Giving the wiki a push) -- [Jesús Leganés Combarro](https://github.com/piranna) (In depth discussions) -- [Adam Ulvi](https://github.com/aulvi) (for taking charge of #node-os on irc) -- [Philipp Czarnetzki](https://github.com/luii) (Updating the Wiki) -- [Lite20](https://twitter.com/lightningboy24) (Wiki Maintainer) - -Everyone above is awesome! - - From 31ca74ecdd0ba0202807864d50c43a9ac8906917 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 20:53:20 +0000 Subject: [PATCH 121/206] Move file npkg.md to README.md --- npkg.md => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename npkg.md => README.md (100%) diff --git a/npkg.md b/README.md similarity index 100% rename from npkg.md rename to README.md From 6ae151f6bebe6cc6656c71f90730bd163f527b07 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 20:57:48 +0000 Subject: [PATCH 122/206] Update README.md --- README.md | 71 ++++--------------------------------------------------- 1 file changed, 4 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index b93e9c7e2..348dce4d1 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,10 @@ -The `npkg` command is the *one command to rule them all*. -It's mostly a convenience. -We want a single command for +NodeOS -1. installing and removing commands -2. installing and removing services -2. starting and stopping services -3. configuring services +# Read wiki... -These are reflected in the commands +[in ENGLISH](./en/) +[en ESpañol](./es/) -```bash -npkg [install|uninstall] -npkg [start|stop] -npkg config -``` -## installing packages -Packages installed with `npkg install` are installed to `$HOME/lib/node_modules`, -and any executables defined in the package are linked into `$HOME/bin`. -Since `npkg` always writes to your home directory, -you do not need root permissions. -You can use `npkg install` to craft a custom command line interface unique to every user. -For example: - -Install a package from *npm* which includes a [bin key](https://github.com/groundwater/node-bin-ifconfig/blob/master/package.json#L12-L14). - -```bash -$ npkg install bin-ifconfig - --> installing bin-ifconfig from npmjs.org - --> linked executable `ifconfig` -``` - -Executables are installed to `$HOME/bin`, and should be immediately available to the CLI. - -```bash -$ ifconfig -{ - "lo0": { ip: "127.0.0.1", mask: "255.255.255.0" } -} -``` - -## staring services - -Packages installed with `npkg install` can also be **services**. -A module defines a service by specifying a `scripts:start` key in it's `package.json` file. - - -```json -{ - "name": "my_app", - "scripts": { - "start": "node server.js" - } -} -``` - -You can one-step daemonize this module with - -```bash -$ npkg start my_app -``` - -Once started with `npkg` the server is running in the background. -You can detach from the current login session without interrupting the server. - -Started services can be stopped with - -```bash -$ npkg stop my_app -``` From 84b3b340714f24ee32040bf303e710a79c22a997 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Sun, 12 Jun 2016 21:01:14 +0000 Subject: [PATCH 123/206] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 348dce4d1..25c2a47ba 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ # Read wiki... [in ENGLISH](./en/) -[en ESpañol](./es/) - - +[en ESPAÑOL](./es/) +[en FRANÇAIS](./fr/) +[auf Deutsch](./de/) From 8ca0f8f119685cd022eb1ef9cdc3977f6ca51241 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Wed, 29 Jun 2016 02:46:04 -0500 Subject: [PATCH 124/206] Update Fixing-NodeOS-Build-Errors.md --- Fixing-NodeOS-Build-Errors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fixing-NodeOS-Build-Errors.md b/Fixing-NodeOS-Build-Errors.md index b87cf5576..aa594ef37 100644 --- a/Fixing-NodeOS-Build-Errors.md +++ b/Fixing-NodeOS-Build-Errors.md @@ -3,7 +3,7 @@ You need to install genext2fs: `sudo apt-get install genext2fs` -> cannnot find a C compiler +> can not find a C compiler The build probably got closed while in progress. Delete the `out` and `obj` folders you find in the sub folders of `node_modules` From 60f1f9d8753d028c81b218597ea6f2db811bdb23 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Wed, 29 Jun 2016 02:51:31 -0500 Subject: [PATCH 125/206] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 25c2a47ba..43bbdec05 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,11 @@ # Read wiki... [in ENGLISH](./en/) + [en ESPAÑOL](./es/) + [en FRANÇAIS](./fr/) + [auf Deutsch](./de/) From 338e5920b9f00aaa50f277cf5c308786a7a17ff4 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:39:48 -0600 Subject: [PATCH 126/206] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43bbdec05..9bfe584fa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -NodeOS +NodeOS # Read wiki... From bd7494b9217fa695c98eefd4f82f21dc5ada0365 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:40:51 -0600 Subject: [PATCH 127/206] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 9bfe584fa..5853e85e1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -NodeOS - +NodeOS # Read wiki... [in ENGLISH](./en/) From facf8b4893b327c12e0d966998942f808de83384 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:42:34 -0600 Subject: [PATCH 128/206] Move file Building-From-Source.md to en/Building-From-Source.md --- Building-From-Source.md => en/Building-From-Source.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Building-From-Source.md => en/Building-From-Source.md (100%) diff --git a/Building-From-Source.md b/en/Building-From-Source.md similarity index 100% rename from Building-From-Source.md rename to en/Building-From-Source.md From c53ceba3f5953b1c2b2d80a92540fc67b151453e Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:43:38 -0600 Subject: [PATCH 129/206] Update en/README.md --- en/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/README.md b/en/README.md index 2ac72f7db..4df313604 100644 --- a/en/README.md +++ b/en/README.md @@ -2,9 +2,9 @@ # What is NodeOS? -NodeOS is a lightweight operating system using Node.js as userspace. NodeOS is an operating system build entirely in Javascript and managed by npm. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. +NodeOS is a lightweight operating system using Node.js as userspace. NodeOS is an operating system built entirely in Javascript and using npm as it's package manager. Any package in npm is a NodeOS package, which at last count was 244, 180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. -**Quick links:** [[Getting Started]] | [[Building From Source]] +**Quick links:** [[Getting Started]] | [[Building From Source](./Building-From-Source.md)] ## Contributors From 0b76ca8ee8506e57c429313a15757b87fffc4bb8 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:44:07 -0600 Subject: [PATCH 130/206] Update en/Building-From-Source.md --- en/Building-From-Source.md | 1 + 1 file changed, 1 insertion(+) diff --git a/en/Building-From-Source.md b/en/Building-From-Source.md index be23f5136..48bc6d6b3 100644 --- a/en/Building-From-Source.md +++ b/en/Building-From-Source.md @@ -1,3 +1,4 @@ +**Note: This document has not yet been revised.** # Building From Source ## Step 1: Prerequisites From f3ee608e41037c702d7121556473a6c5ee9b3d93 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:44:46 -0600 Subject: [PATCH 131/206] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 5853e85e1..b371f5982 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -NodeOS # Read wiki... [in ENGLISH](./en/) From 7096df391b5303ceb5d931933aa8deb0395d127d Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:47:23 -0600 Subject: [PATCH 132/206] Update en/SUMMARY.md --- en/SUMMARY.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/en/SUMMARY.md b/en/SUMMARY.md index e69de29bb..29407daa3 100644 --- a/en/SUMMARY.md +++ b/en/SUMMARY.md @@ -0,0 +1,5 @@ +# Summary + +* [Introduction](README.md) +* Building From Source + From 6391dfdf0a2c338ba8606cbfe0ea6bf2ffd5a2e8 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:47:32 -0600 Subject: [PATCH 133/206] Create en/building_from_source.md --- en/building_from_source.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 en/building_from_source.md diff --git a/en/building_from_source.md b/en/building_from_source.md new file mode 100644 index 000000000..25704bcb0 --- /dev/null +++ b/en/building_from_source.md @@ -0,0 +1,2 @@ +# Building From Source + From 4489e93a58b8126107e8966726209bf5dbc9f498 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:47:33 -0600 Subject: [PATCH 134/206] Update en/SUMMARY.md --- en/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/SUMMARY.md b/en/SUMMARY.md index 29407daa3..dde3762eb 100644 --- a/en/SUMMARY.md +++ b/en/SUMMARY.md @@ -1,5 +1,5 @@ # Summary * [Introduction](README.md) -* Building From Source +* [Building From Source](building_from_source.md) From 16f067cbaa5b74a749271333b6aafcd9e7d0e180 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:47:46 -0600 Subject: [PATCH 135/206] Delete en/Building-From-Source.md --- en/Building-From-Source.md | 128 ------------------------------------- 1 file changed, 128 deletions(-) delete mode 100644 en/Building-From-Source.md diff --git a/en/Building-From-Source.md b/en/Building-From-Source.md deleted file mode 100644 index 48bc6d6b3..000000000 --- a/en/Building-From-Source.md +++ /dev/null @@ -1,128 +0,0 @@ -**Note: This document has not yet been revised.** -# Building From Source - -## Step 1: Prerequisites - -- **Git**. To install using: - - - for **Debian/Ubuntu**: `apt-get install git` - - for **Arch**: `pacman -S git` - -- Node 4.x -- NPM 2.x - -**_Note: If you're using Node 5.x and NPM 3.x, the build process will crash, further Information under [[Troubleshooting]] or Issue #218_** - -After you installed the prerequisites just clone the repository - -```bash -$ git clone https://github.com/NodeOS/NodeOS.git -``` - -## Step 2 (Debian/Ubuntu): Dependencies - -Once you've installed the prerequisites you need the dependencies for Debian/Ubuntu using `apt-get`. First you need to update your cache. To do so run - -```bash -$ dpkg --add-architecture i386 -$ apt-get -qq -y update -``` - -Then you install the dependencies listed below - -- cross compiler dependencies: `apt-get -qq -y gcc g++ realpath texinfo` -- barebones dependencies: `apt-get -qq -y bc libpixman-1-dev` -- rootfs dependencies: `apt-get -qq -y genisoimage libuuid:i386` -- userfs dependencies: `apt-get -qq -y autoconf automake` -- qemu dependencies: `apt-get -qq -y libsdl1.2-dev` - -Or as a one liner: - -```bash -$ apt-get -qq -y gcc g++ realpath texinfo bc libpixman-1-dev genisoimage libuuid:i386 autoconf automake libsdl1.2-dev -``` - -Or just run if you're outside the folder - -```bash -$ cd NodeOS/ -$ bin/install-debian-deps -``` - -## Step 2 (Arch Linux): Dependencies - -Once you have installed the prerequisites you need the dependencies for Arch Linux - -- cross compiler dependencies: `pacman -S gcc texinfo python2` -- barebones dependencies: `pacman -S bc pixman lib32-pixman` -- rootfs dependencies: `pacman -S cdrkit` -- initramfs dependencies: `pacman -S cpio` -- userfs dependencies: `pacman -S autoconf automake` -- qemu dependencies: `pacman -S sdl` - -**_Note: The initramfs dependencies are not shipped with the installation of Arch Linux thats why we need to install them on Arch Linux_** - -Or as one liner: - -```bash -$ pacman -S gcc texinfo python2 bc pixman lib32-pixman cdrkit cpio autoconf automake sdl -``` - -Or just run if you're outside the folder - -```bash -$ cd NodeOS/ -$ bin/install-arch-deps -``` - -## Step 3: Installation - -Once you've installed the correct dependencies for your operating system you can start with the installation of NodeOS. - -**_Note: If you have Arch Linux you need to set python2 as default binary when you run `python`. Because the standard python binary is python3 and nodegyp doesn't uses it._** To do this, run following commands: - -```bash -$ cd /usr/bin -$ ln -sf python2 python -``` - -The next step is to install the npm dependencies and the bundled dependencies to do this run following command: - -```bash -$ npm install -``` - -If you want to change the target platform to build NodeOS for, just prepend the `PLATFORM` argument before `npm install`. Example (NodeOS for QEMU 32bit): - -```bash -$ PLATFORM=qemu_32 npm install -or -$ PLATFORM=docker npm install -``` - -Now it should install correctly. This process can take some time, so pick some microwave pop-corn and go to see a movie. No, really... do it. - -## Step 4: Run your fresh NodeOS build - -Now you can run your fresh build with: - -```bash -$ npm start -``` - -If NodeOS does not boot into the REPL, unless you wanted that, then everything was compiled correctly. **If not look under [[Troubleshooting]]** - -After NodeOS has booted up you should see something like: - -``` -Hello! I'm a user init script :-) -``` - -Now you're prompted to enter your username and password. By default, the username and password is `nodeos` and cannot be changed without altering code. - -``` -$ username: nodeos -$ password: nodeos -``` - -**Note: This is not permanent on later versions this will be changed** From c543972b214d092c7bfb0098f79514e2ef28f795 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:48:04 -0600 Subject: [PATCH 136/206] Update en/building_from_source.md --- en/building_from_source.md | 126 +++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/en/building_from_source.md b/en/building_from_source.md index 25704bcb0..48bc6d6b3 100644 --- a/en/building_from_source.md +++ b/en/building_from_source.md @@ -1,2 +1,128 @@ +**Note: This document has not yet been revised.** # Building From Source +## Step 1: Prerequisites + +- **Git**. To install using: + + - for **Debian/Ubuntu**: `apt-get install git` + - for **Arch**: `pacman -S git` + +- Node 4.x +- NPM 2.x + +**_Note: If you're using Node 5.x and NPM 3.x, the build process will crash, further Information under [[Troubleshooting]] or Issue #218_** + +After you installed the prerequisites just clone the repository + +```bash +$ git clone https://github.com/NodeOS/NodeOS.git +``` + +## Step 2 (Debian/Ubuntu): Dependencies + +Once you've installed the prerequisites you need the dependencies for Debian/Ubuntu using `apt-get`. First you need to update your cache. To do so run + +```bash +$ dpkg --add-architecture i386 +$ apt-get -qq -y update +``` + +Then you install the dependencies listed below + +- cross compiler dependencies: `apt-get -qq -y gcc g++ realpath texinfo` +- barebones dependencies: `apt-get -qq -y bc libpixman-1-dev` +- rootfs dependencies: `apt-get -qq -y genisoimage libuuid:i386` +- userfs dependencies: `apt-get -qq -y autoconf automake` +- qemu dependencies: `apt-get -qq -y libsdl1.2-dev` + +Or as a one liner: + +```bash +$ apt-get -qq -y gcc g++ realpath texinfo bc libpixman-1-dev genisoimage libuuid:i386 autoconf automake libsdl1.2-dev +``` + +Or just run if you're outside the folder + +```bash +$ cd NodeOS/ +$ bin/install-debian-deps +``` + +## Step 2 (Arch Linux): Dependencies + +Once you have installed the prerequisites you need the dependencies for Arch Linux + +- cross compiler dependencies: `pacman -S gcc texinfo python2` +- barebones dependencies: `pacman -S bc pixman lib32-pixman` +- rootfs dependencies: `pacman -S cdrkit` +- initramfs dependencies: `pacman -S cpio` +- userfs dependencies: `pacman -S autoconf automake` +- qemu dependencies: `pacman -S sdl` + +**_Note: The initramfs dependencies are not shipped with the installation of Arch Linux thats why we need to install them on Arch Linux_** + +Or as one liner: + +```bash +$ pacman -S gcc texinfo python2 bc pixman lib32-pixman cdrkit cpio autoconf automake sdl +``` + +Or just run if you're outside the folder + +```bash +$ cd NodeOS/ +$ bin/install-arch-deps +``` + +## Step 3: Installation + +Once you've installed the correct dependencies for your operating system you can start with the installation of NodeOS. + +**_Note: If you have Arch Linux you need to set python2 as default binary when you run `python`. Because the standard python binary is python3 and nodegyp doesn't uses it._** To do this, run following commands: + +```bash +$ cd /usr/bin +$ ln -sf python2 python +``` + +The next step is to install the npm dependencies and the bundled dependencies to do this run following command: + +```bash +$ npm install +``` + +If you want to change the target platform to build NodeOS for, just prepend the `PLATFORM` argument before `npm install`. Example (NodeOS for QEMU 32bit): + +```bash +$ PLATFORM=qemu_32 npm install +or +$ PLATFORM=docker npm install +``` + +Now it should install correctly. This process can take some time, so pick some microwave pop-corn and go to see a movie. No, really... do it. + +## Step 4: Run your fresh NodeOS build + +Now you can run your fresh build with: + +```bash +$ npm start +``` + +If NodeOS does not boot into the REPL, unless you wanted that, then everything was compiled correctly. **If not look under [[Troubleshooting]]** + +After NodeOS has booted up you should see something like: + +``` +Hello! I'm a user init script :-) +``` + +Now you're prompted to enter your username and password. By default, the username and password is `nodeos` and cannot be changed without altering code. + +``` +$ username: nodeos +$ password: nodeos +``` + +**Note: This is not permanent on later versions this will be changed** From ed8c8f8e8e57f58fe3d91e37f307862edf1c946a Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:48:31 -0600 Subject: [PATCH 137/206] Update en/SUMMARY.md --- en/SUMMARY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/en/SUMMARY.md b/en/SUMMARY.md index dde3762eb..b5ad7f3bf 100644 --- a/en/SUMMARY.md +++ b/en/SUMMARY.md @@ -2,4 +2,5 @@ * [Introduction](README.md) * [Building From Source](building_from_source.md) +* Inner Workings From 4133ff9bf71814a4b72efb3b8dcc523d2229cb21 Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Thu, 4 Aug 2016 13:49:59 -0600 Subject: [PATCH 138/206] Update en/SUMMARY.md --- en/SUMMARY.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/en/SUMMARY.md b/en/SUMMARY.md index b5ad7f3bf..8f07f60cd 100644 --- a/en/SUMMARY.md +++ b/en/SUMMARY.md @@ -1,6 +1,8 @@ # Summary * [Introduction](README.md) +* Contribution Guide * [Building From Source](building_from_source.md) -* Inner Workings +* System Modules +* Additional Modules From db82af4c89f0c17729a4998c5b9f065d2163c8ab Mon Sep 17 00:00:00 2001 From: Lite McFish Date: Mon, 22 Aug 2016 17:18:19 -0600 Subject: [PATCH 139/206] Create Dependencies.md --- en/Dependencies.md | 235 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 en/Dependencies.md diff --git a/en/Dependencies.md b/en/Dependencies.md new file mode 100644 index 000000000..98b0ea9ce --- /dev/null +++ b/en/Dependencies.md @@ -0,0 +1,235 @@ +# Main repositories +* [NodeOS](https://github.com/NodeOS/NodeOS) + [![Build Status](https://semaphoreapp.com/api/v1/projects/71d72807-779a-40d3-a8d4-523cd0a52eb3/356164/shields_badge.svg)](https://semaphoreapp.com/nodeos/nodeos) + [![Stories in Ready](https://badge.waffle.io/NodeOS/NodeOS.png?label=ready&title=Ready)](https://waffle.io/NodeOS/NodeOS) + [![Join the chat at https://gitter.im/NodeOS/NodeOS](https://badges.gitter.im/NodeOS/NodeOS.svg)](https://gitter.im/NodeOS/NodeOS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + [![bitHound Overall Score](https://www.bithound.io/github/NodeOS/NodeOS/badges/score.svg)](https://www.bithound.io/github/NodeOS/NodeOS) + [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg)](https://opensource.org/licenses/mit-license.php) + * [nodeos-cross-toolchain](https://github.com/NodeOS/nodeos-cross-toolchain) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/nodeos-cross-toolchain/branches/master/shields_badge.svg)](https://semaphoreci.com/nodeos/nodeos-cross-toolchain) + * async + * *download-manager* + * fs-extra + * prebuild-install + * prebuild + * [nodeos-barebones](https://github.com/NodeOS/nodeos-barebones) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/nodeos-barebones/branches/master/badge.svg)](https://semaphoreci.com/nodeos/nodeos-barebones) + * [cpio2tar](https://github.com/piranna/cpio2tar) + * cpio-stream + * tar-stream + * *download-manager* + * minimist (^1.2.0) + * *nodeos-nodejs* + * *qemu* + * suppose (^0.6.1) + * [nodeos-initramfs](https://github.com/NodeOS/nodeos-initramfs) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/nodeos-initramfs/branches/master/badge.svg)](https://semaphoreci.com/nodeos/nodeos-initramfs) + * *download-manager* + * [nodeos-mount-filesystems](https://github.com/NodeOS/nodeos-mount-filesystems) + * async (^1.5.2) + * mkdirp (^0.5.1) + * rimraf (^2.5.2) + * prompt (*) + * [nodeos-mount-utils](https://github.com/NodeOS/nodeos-mount-utils) + * mkdirp (^0.5.1) + * [nodeos-mount](https://github.com/NodeOS/nodeos-mount) + [![bitHound Score](https://www.bithound.io/NodeOS/nodeos-mount/badges/score.svg)](https://www.bithound.io/NodeOS/nodeos-mount) + * async (^1.5.2) + * nan (^2.2.0) + * grunt (~0.4.5) + * grunt-mocha-test (~0.12.7) + * grunt-contrib-watch (~0.6.1) + * grunt-node-gyp (~3.0.0) + * q (~1.4.1) + * posix (^4.0.0) + * chai (^3.5.0) + * errno-codes (^1.0.2) + * istanbul (^0.4.3) + * mocha (^2.4.5) + * proxyquire (^1.7.4) + * rimraf (^2.5.2) + * sinon (^1.17.3) + * sinon-chai (^2.8.0) + * *nodeos-nodejs* + * [usrbinenv](https://github.com/piranna/usrbinenv) + * kexec (^2.0.0) + * *qemu* + * suppose (^0.6.1) + * [nodeos-rootfs](https://github.com/NodeOS/nodeos-rootfs) + * *download-manager* + * [genfatfs](https://github.com/NodeOS/genfatfs) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/genfatfs/branches/master/badge.svg)](https://semaphoreci.com/nodeos/genfatfs) + * prebuild-install (^1.1.0) + * prebuild (^4.2.2) + * *qemu* + * [nodeos-usersfs](https://github.com/NodeOS/nodeos-usersfs) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/nodeos-usersfs/branches/master/badge.svg)](https://semaphoreci.com/nodeos/nodeos-usersfs) + * [bin-man](https://www.npmjs.com/package/bin-man) + * [bin-pwd](https://www.npmjs.com/package/bin-pwd) + * [davius](https://github.com/piranna/Davius) + * finalhandler (^0.4.1) + * fs-extra (^0.26.2) + * minimist (^1.2.0) + * [oneshoot](https://github.com/piranna/oneshoot) + * async (^1.5.0) + * escape-html (^1.0.3) + * serve-static (^1.10.0) + * ws (^0.8.0) + * [recv](https://github.com/piranna/recv) + * rimraf (^2.4.4) + * *[serve-static](https://github.com/piranna/serve-static)* + * parseurl (~1.3.0) + * *[send](https://github.com/piranna/send/tree/index)* + * istanbul (0.4.1) + * mocha (2.3.4) + * supertest (1.1.0) + * dhcpjs (^0.5.0) + * [debugfs](https://github.com/piranna/DebugFS) + * async (^1.5.0) + * *[forever](https://github.com/piranna/forever/tree/starter)* + * *[forever-monitor](https://github.com/piranna/forever-monitor)* + * [genext2fs](https://github.com/NodeOS/genext2fs) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/genext2fs/branches/master/badge.svg)](https://semaphoreci.com/nodeos/genext2fs) + * prebuild-install (1.0.2) + * prebuild (^4.2.2) + * [ifconfig](https://github.com/NodeOS/ifconfig) + * *src-sockios* + * [src-ifaddrs](https://github.com/NodeOS/node-src-ifaddrs) + * nan (^2.0.9) + * [src-errno](https://github.com/NodeOS/node-src-errno) + * nan (^2.0.9) + * [ip](https://github.com/NodeOS/ip) + * *src-sockios* + * loadtest (^1.4.3) + * [logon](https://github.com/piranna/logon) + [![Build Status](https://travis-ci.org/piranna/logon.svg?branch=master)](https://travis-ci.org/piranna/logon) + * colors (^1.1.2) + * kexec (^2.0.2) + * posix (^4.0.0) + * prompt (^1.0.0) + * mocha (^2.4.5) + * mocha-eslint (^2.0.2) + * [node-bin-getty](https://github.com/NodeOS/node-bin-getty) + * [src-unistd](https://github.com/NodeOS/node-src-unistd) + * nan (^2.0.9) + * [src-termios](https://github.com/NodeOS/node-src-termios) + * nan (^2.0.9) + * [node-wget](https://github.com/tylerl0706/wgetjs) + [![NPM version](https://badge.fury.io/js/wgetjs.png?branch=master)](http://badge.fury.io/js/wgetjs) + [![Build Status](https://travis-ci.org/angleman/wgetjs.png?branch=master)](https://travis-ci.org/angleman/wgetjs) + [![Dependency Status](https://gemnasium.com/angleman/wgetjs.png?branch=master)](https://gemnasium.com/angleman/wgetjs) + [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](#licensemit) + * request (~2.27.0) + * license-md (~0.2.5) + * grunt (~0.4.1) + * grunt-bump (~0.0.11) + * grunt-license (~0.1.4) + * mocha (~1.12.0) + * should (~1.2.2) + * *nodeos-nodejs* + * [nodeos-reverse-proxy](https://github.com/piranna/nodeos-reverse-proxy) + [![Build Status](https://travis-ci.org/piranna/nodeos-reverse-proxy.svg?branch=master)](https://travis-ci.org/piranna/nodeos-reverse-proxy) + * basic-auth (^1.0.4) + * concat-stream (^1.5.1) + * finalhandler (^0.5.0) + * http-proxy (^1.14.0) + * kexec (^2.0.2) + * posix (^4.0.2) + * uuid (^2.0.2) + * mocha (^2.5.3) + * supertest (^1.2.0) + * npm (^3.9.6) + * [nsh](https://github.com/piranna/nsh) + [![Build Status](https://travis-ci.org/piranna/nsh.svg?branch=master)](https://travis-ci.org/piranna/nsh) + [![Coverage Status](https://coveralls.io/repos/github/piranna/nsh/badge.svg?branch=master)](https://coveralls.io/github/piranna/nsh?branch=master) + * array-flatten (^2.1.0) + * async (^2.0.1) + * decode-prompt (^0.0.2) + * glob (~7.0.5) + * [lib-pathcomplete](https://github.com/piranna/node-lib-pathcomplete) + * glob (~7.0.5) + * pathchop (0.0.0) + * *[lib-pathsearch](https://github.com/piranna/node-lib-pathsearch)* + * mkdirp (~0.5.1) + * mkfifo (^0.1.5) + * npm-path (^2.0.2) + * shell-parse (^0.0.2) + * to-string-stream (^0.1.0) + * uuid (^2.0.2) + * concat-stream (^1.5.1) + * *easy-coveralls* + * mocha (^2.5.3) + * string-to-stream (^1.1.0) + * ntp-client (^0.5.3) + * performance (^1.1.0) + * [pstree](https://github.com/piranna/pstree) + * archy (^1.0.0) + * async (^1.5.2) + * scanf (^0.7.2) + * slap (^0.1.60) + * *qemu* + +# Common packages +* [download-manager](https://github.com/piranna/download-manager) + [![Build Status](https://travis-ci.org/piranna/download-manager.svg?branch=master)](https://travis-ci.org/piranna/download-manager) + [![Coverage Status](https://coveralls.io/repos/github/piranna/download-manager/badge.svg?branch=master)](https://coveralls.io/github/piranna/download-manager?branch=master) + * async (^2.0.1) + * [bzip2-maybe](https://github.com/piranna/bzip2-maybe) + [![build status](http://img.shields.io/travis/piranna/bzip2-maybe.svg?style=flat)](http://travis-ci.org/piranna/bzip2-maybe) + [![Coverage Status](https://coveralls.io/repos/github/piranna/bzip2-maybe/badge.svg?branch=master)](https://coveralls.io/github/piranna/bzip2-maybe?branch=master) + * is-bzip2 (^1.0.0) + * peek-stream (^1.1.1) + * pumpify (^1.3.5) + * through2 (^2.0.1) + * unbzip2-stream (^1.0.9) + * concat-stream (^1.5.1) + * *easy-coveralls* + * standard (^8.0.0-beta.5) + * tape (^4.6.0) + * diff + * [download-checksum](https://github.com/piranna/download-checksum) + [![Build Status](https://travis-ci.org/piranna/download-checksum.svg?branch=master)](https://travis-ci.org/piranna/download-checksum) + [![Coverage Status](https://coveralls.io/repos/github/piranna/download-checksum/badge.svg?branch=master)](https://coveralls.io/github/piranna/download-checksum?branch=master) + * inherits (^2.0.1) + * openpgp (^2.3.2) + * force-array (^3.1.0) + * got (^6.3.0) + * gunzip-maybe (^1.3.1) + * multi-progress (^2.0.0) + * pump (^1.0.1) + * rimraf (^2.5.4) + * strip-dirs (^2.0.0) + * tar-fs (^1.13.0) + * *easy-coveralls* + * mocha (^3.0.2) + * nock (^8.0.0) + * tmp (0.0.28) +* [nodeos-nodejs](https://github.com/NodeOS/nodejs) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/nodejs/branches/master/badge.svg)](https://semaphoreci.com/nodeos/nodejs) + * prebuild-install (1.0.2) + * [buho](https://github.com/piranna/buho) + [![Build Status](https://travis-ci.org/piranna/buho.svg?branch=master)](https://travis-ci.org/piranna/buho) + [![Coverage Status](https://coveralls.io/repos/github/piranna/buho/badge.svg?branch=master)](https://coveralls.io/github/piranna/buho?branch=master) + * concat-stream (^1.5.1) + * *[github-basic](https://github.com/piranna/github-basic)* + * github-from-package (0.0.0) + * github-url-to-object (^2.2.3) + * minimist (^1.2.0) + * *easy-coveralls* + * mocha (^2.5.3) + * nock (^8.0.0) + * prebuild (^4.2.2) + * *[publish](https://github.com/piranna/node-publish)* +* [qemu](https://github.com/NodeOS/qemu) + [![Build Status](https://semaphoreci.com/api/v1/nodeos/qemu/branches/master/shields_badge.svg)](https://semaphoreci.com/nodeos/qemu) + * prebuild-install (1.0.2) + * prebuild (^4.2.2) +* [src-sockios](https://github.com/NodeOS/sockios) + * nan (^2.0.9) +* [easy-coveralls](https://github.com/piranna/easy-coveralls) + [![Build Status](https://travis-ci.org/piranna/easy-coveralls.svg?branch=master)](https://travis-ci.org/piranna/easy-coveralls) + [![Coverage Status](https://coveralls.io/repos/github/piranna/easy-coveralls/badge.svg?branch=master)](https://coveralls.io/github/piranna/easy-coveralls?branch=master) + * coveralls (^2.11.11) + * fs-extra (^0.30.0) + * *[jscoverage](https://github.com/piranna/jscoverage)* + * mocha-lcov-reporter (^1.2.0) From b5c096287a3748913abfa447117674e5e8aa6fec Mon Sep 17 00:00:00 2001 From: Axel Navarro Date: Wed, 14 Dec 2016 19:55:04 -0300 Subject: [PATCH 140/206] Update README.md fix link to get-involved old blog post --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f858b94d..f7acfd8c3 100644 --- a/README.md +++ b/README.md @@ -156,7 +156,7 @@ build them from source code. sudo docker run -t -i nodeos/nodeos ``` - or learn how to make a [Custom Build](http://node-os.com/blog/get-involved/) + or learn how to make a [Custom Build](http://node-os.com/blog/get-involved) ## Build from Source From 5b881543331fb00f4a120acc46fdc6bcdd3ecde1 Mon Sep 17 00:00:00 2001 From: Axel Navarro Date: Thu, 15 Dec 2016 07:45:00 -0300 Subject: [PATCH 141/206] fix build each layer when cd command fails --- scripts/build | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/build b/scripts/build index 7e74867a0..da9e3605f 100755 --- a/scripts/build +++ b/scripts/build @@ -9,10 +9,10 @@ source $TOOLCHAIN/scripts/adjustEnvVars.sh || exit $? # Build each layer up # -( cd node_modules/nodeos-barebones ; npm run build ) && -( cd node_modules/nodeos-initramfs ; npm run build ) && -( cd node_modules/nodeos-rootfs ; npm run build ) && -( cd node_modules/nodeos-usersfs ; npm run build ) || err $? +( cd node_modules/nodeos-barebones && npm run build ) && +( cd node_modules/nodeos-initramfs && npm run build ) && +( cd node_modules/nodeos-rootfs && npm run build ) && +( cd node_modules/nodeos-usersfs && npm run build ) || err $? # From 948ef7dc949f624ddbc3df468000f13788c59a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 14:50:43 +0100 Subject: [PATCH 142/206] Build NodeOS with new refactored scheme --- .gitignore | 6 +-- package.json | 22 +++++----- scripts/build | 103 ++++++++++++++++++++++++++++++++++++-------- scripts/postinstall | 9 ++++ scripts/unbuild | 2 +- 5 files changed, 110 insertions(+), 32 deletions(-) create mode 100755 scripts/postinstall diff --git a/.gitignore b/.gitignore index d3b0af3c2..54b7333cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ node_modules/ npm-debug.log -out/ .vagga/ -deps/ .vagrant/ -ubuntu-xenial-16.04-cloudimg-console.log +build/ +deps/ +out/ prebuilds/ diff --git a/package.json b/package.json index 9abba370f..980fad4e1 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "dockerBuild": "scripts/dockerBuild", "build": "scripts/build", "postbuild": "scripts/postbuild", + "postinstall": "scripts/postinstall", "publish": "scripts/publish", "start": "scripts/start", "test": "scripts/test", @@ -33,19 +34,18 @@ "homepage": "http://node-os.com", "private": true, "dependencies": { - "nodeos-barebones": "NodeOS/nodeos-barebones", - "nodeos-cross-toolchain": "NodeOS/nodeos-cross-toolchain", - "nodeos-initramfs": "NodeOS/nodeos-initramfs", - "nodeos-rootfs": "NodeOS/nodeos-rootfs", - "nodeos-usersfs": "NodeOS/nodeos-usersfs" + "nodeos-barebones": "^1.0.0-RC3.1", + "nodeos-initramfs": "^1.0.0-RC3.1", + "nodeos-usersfs": "^1.0.0-RC3.1" }, "devDependencies": { + "cpio2tar": "^0.0.5", + "minimist": "^1.2.0", + "nodeos-bootfs": "^1.0.0-RC3.0", + "nodeos-cross-toolchain": "^1.0.0-RC3.1", "prebuild": "piranna/prebuild#prerelease", - "qemu": "NodeOS/qemu", - "suppose": "^0.6.1" - }, - "engines": { - "node": "^0.12.0", - "npm": "^3.0.0" + "qemu": "^2.8.0", + "suppose": "^0.6.1", + "tar2ext": "^0.0.2" } } diff --git a/scripts/build b/scripts/build index da9e3605f..1948981b9 100755 --- a/scripts/build +++ b/scripts/build @@ -1,41 +1,110 @@ #!/usr/bin/env bash -TOOLCHAIN=`pwd`/node_modules/nodeos-cross-toolchain +set -o pipefail + + +while getopts ":k:p:" opt; do + case $opt in + k) + KERNEL="$OPTARG" # linux, netbsd, nokernel + ;; + + p) + PLATFORM="$OPTARG" # lxc, qemu, wsl + ;; + esac +done + + +# Default kernel and platform +if [[ -z "$KERNEL" ]]; then + KERNEL=linux +fi + +if [[ -z "$PLATFORM" ]]; then + PLATFORM=qemu +fi + + +TOOLCHAIN=`node -p "require('nodeos-cross-toolchain')"` +BAREBONES=`node -p "require('nodeos-barebones')"` +INITRAMFS=`node -p "require('nodeos-initramfs')"` +USERSFS=` node -p "require('nodeos-usersfs')"` source $TOOLCHAIN/scripts/adjustEnvVars.sh || exit $? +OUT_DIR=`pwd`/out/$CPU_FAMILY/$MACHINE/$PLATFORM + +export MACHINE + + # # Build each layer up # -( cd node_modules/nodeos-barebones && npm run build ) && -( cd node_modules/nodeos-initramfs && npm run build ) && -( cd node_modules/nodeos-rootfs && npm run build ) && -( cd node_modules/nodeos-usersfs && npm run build ) || err $? +( cd $BAREBONES && KERNEL=$kERNEL npm install --arch=$NODE_ARCH --production ) && +( cd $INITRAMFS && npm install --arch=$NODE_ARCH --production ) && +( cd $USERSFS && npm install --arch=$NODE_ARCH --production ) || exit 10 # # Wrap the system up and pack it # -OUT_DIR=`pwd`/out/$CPU_FAMILY/$PLATFORM -mkdir -p $OUT_DIR -case $PLATFORM in - *_qemu|docker|vagga) - cp node_modules/nodeos-barebones/out/latest $OUT_DIR/barebones - cp node_modules/nodeos-initramfs/out/latest $OUT_DIR/initramfs +BAREBONES=$BAREBONES/out/$CPU +INITRAMFS=$INITRAMFS/out/$CPU +USERSFS=$USERSFS/out/$CPU.tar.gz + +STEP_DIR=$OUT_DIR + +mkdir -p $STEP_DIR + +case $MACHINE in + pc) + case $PLATFORM in + img) + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 40 + + nodeos-bootfs \ + -F $PLATFORM \ + -K $BAREBONES/bzImage \ + -I $INITRAMFS \ + -O $STEP_DIR/bootfs.img \ + -U $STEP_DIR/usersfs.img || err 41 + ;; + + iso) + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 50 + + nodeos-bootfs \ + -F $PLATFORM \ + -K $BAREBONES/bzImage \ + -I $INITRAMFS \ + -O $STEP_DIR/bootfs.iso \ + -U $STEP_DIR/usersfs.img || err 51 + ;; + + qemu) + cp $BAREBONES/bzImage $STEP_DIR/kernel || err 60 + cp $INITRAMFS $STEP_DIR/initramfs.cpio.gz || err 61 + + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 62 + ;; + + *) + echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" + err 90 + ;; + esac ;; - *_iso|*_img) - cp node_modules/nodeos-rootfs/out/latest $OUT_DIR/rootfs ;; *) - echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" - exit 10 + echo -e "${RED}Unknown machine '$MACHINE'${CLR}" + exit 130 ;; esac -cp node_modules/nodeos-usersfs/out/latest $OUT_DIR/usersfs -ln -sfn $CPU_FAMILY/$PLATFORM out/latest +ln -sfn $CPU_FAMILY/$MACHINE/$PLATFORM out/latest diff --git a/scripts/postinstall b/scripts/postinstall new file mode 100755 index 000000000..7d3722c64 --- /dev/null +++ b/scripts/postinstall @@ -0,0 +1,9 @@ +#!/usr/bin/env sh + +# HACK `npm` add all the binaries to the `node_modules/.bin` folder without +# matter what package installed it, so `env` from `usrbinenv` gets available on +# the `$PATH` during build process, making it to fail since its shebang is +# `#!/bin/node`, that's only valid on NodeOS, so we need to remove the symlink +# to make it not interfere with the build process + +rm -f node_modules/.bin/env diff --git a/scripts/unbuild b/scripts/unbuild index a5839d321..f513d6eee 100755 --- a/scripts/unbuild +++ b/scripts/unbuild @@ -1,3 +1,3 @@ #!/usr/bin/env sh -rm -rf deps/ out/ prebuilds/ || exit $? +rm -rf deps/ build/ out/ prebuilds/ || exit $? From 3956357813d786af63c43c9012b0f44d401e54b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 15:00:45 +0100 Subject: [PATCH 143/206] Update `start` and `test` script to new refactored scheme --- scripts/start | 46 +++++++++++++++++-------------------- scripts/test | 63 +++++++++++++++++++++++++++------------------------ 2 files changed, 55 insertions(+), 54 deletions(-) diff --git a/scripts/start b/scripts/start index 28be88b1a..454316de1 100755 --- a/scripts/start +++ b/scripts/start @@ -10,24 +10,16 @@ const QEMU_SYSTEM = 'qemu-system-' var link = fs.readlinkSync('out/latest').split('/'); -var cpu_family = link[link.length-2] +var cpu_family = link[link.length-3] +var machine = link[link.length-2] var platform = link[link.length-1] -var type = platform.split('_')[1] - -var machine -switch(cpu_family) -{ - case 'arm': - machine = 'versatilepb' - break -} - var command = QEMU_SYSTEM+cpu_family var args = [ + '-machine', machine, '-enable-kvm', '-vga', 'std', '-m', '256M', @@ -35,17 +27,23 @@ var args = '-redir', 'tcp:50443::443' ] -const outDir = join('out', cpu_family, platform) -switch(type) +switch(process.argv[2]) +{ + case 'curses' : args.push('-curses') ; break + case 'nographic': args.push('-nographic'); break +} + +const outDir = join('out', cpu_family, machine, platform) +switch(platform) { case 'img': - args.push('-hda', join(outDir, 'rootfs')) - args.push('-hdb', join(outDir, 'usersfs')) + args.push('-hda', join(outDir, 'bootfs.img'), + '-hdb', join(outDir, 'usersfs.img')) break case 'iso': - args.push('-cdrom', join(outDir, 'rootfs')) - args.push('-hdb' , join(outDir, 'usersfs')) + args.push('-cdrom', join(outDir, 'bootfs.iso'), + '-hda' , join(outDir, 'usersfs.img')) break case 'qemu': @@ -59,30 +57,26 @@ switch(type) { case 'nographic': append.push('console=ttyS0') // redirect to terminal - args.push('-nographic') break case 'curses': append.push('vga=extended') // 80x50 - args.push('-curses') break default: append.push('vga=0x344') // 1024x768x32 } - args.push('--kernel', join(outDir, 'barebones')) - args.push('--initrd', join(outDir, 'initramfs')) - args.push('-hda', join(outDir, 'usersfs')) - args.push('-append', append.join(' ')) + args.push('--kernel', join(outDir, 'kernel'), + '--initrd', join(outDir, 'initramfs.cpio.gz'), + '-hda', join(outDir, 'usersfs.img'), + '-append', append.join(' ')) break default: throw 'Unknown platform "'+platform+'"' } -if(machine) args.unshift('-machine', machine) - // check if kvm is supported var kvm = /(vmx|svm)/; var contents = ""; @@ -101,5 +95,7 @@ if(kvm.test(contents) === false) args.shift(); } + +// Exec NodeOS spawn(command, args, {stdio: 'inherit'}) .on('error', console.trace.bind(console)); diff --git a/scripts/test b/scripts/test index 661d5a233..1db74a720 100755 --- a/scripts/test +++ b/scripts/test @@ -13,7 +13,8 @@ const TIMEOUT = 300 // seconds var link = fs.readlinkSync('out/latest').split('/'); -var cpu_family = link[link.length-2] +var cpu_family = link[link.length-3] +var machine = link[link.length-2] var platform = link[link.length-1] var type = platform.split('_')[1] || platform @@ -21,7 +22,6 @@ var type = platform.split('_')[1] || platform var args = processArguments(process.argv.slice(2)) var cpu = args.cpu -var machine = args.machine var exe var timeout = setTimeout(function() @@ -37,29 +37,23 @@ var command = 'qemu-system-'+args.cpu_family var args = [ + '-machine', machine, // '-enable-kvm', + '-m', '256M', '-nographic', ] -const outDir = join('out', cpu_family, platform) +const outDir = join('out', cpu_family, machine, platform) switch(type) { case 'img': - fs.accessSync(join(outDir, 'rootfs')) - fs.accessSync(join(outDir, 'usersfs')) - process.exit() - - // args.push('-hda', join(outDir, 'rootfs')) - // args.push('-hdb', join(outDir, 'usersfs')) + args.push('-hda', join(outDir, 'bootfs.img'), + '-hdb', join(outDir, 'usersfs.img')) break case 'iso': - fs.accessSync(join(outDir, 'rootfs')) - fs.accessSync(join(outDir, 'usersfs')) - process.exit() - -// args.push('-cdrom', join(outDir, 'rootfs')) -// args.push('-hdb' , join(outDir, 'usersfs')) + args.push('-cdrom', join(outDir, 'bootfs.iso'), + '-hda' , join(outDir, 'usersfs.img')) break case 'qemu': @@ -69,20 +63,24 @@ switch(type) 'console=ttyS0' ] - args.push('--kernel', join(outDir, 'barebones'), - '--initrd', join(outDir, 'initramfs'), - '-hda', join(outDir, 'usersfs'), + args.push('--kernel', join(outDir, 'kernel'), + '--initrd', join(outDir, 'initramfs.cpio.gz'), + '-hda', join(outDir, 'usersfs.img'), '-append', append.join(' ')) break - case 'vagga': - fs.accessSync(join(outDir, 'barebones')) - fs.accessSync(join(outDir, 'initramfs')) - fs.accessSync(join(outDir, 'usersfs')) + case 'tar': + fs.accessSync(join(outDir, 'bootfs.tar.gz')) + fs.accessSync(join(outDir, 'usersfs.tar.gz')) process.exit() + break -// args.push('-cdrom', join(outDir, 'rootfs')) -// args.push('-hdb' , join(outDir, 'usersfs')) + case 'docker': + case 'vagga': + fs.accessSync(join(outDir, 'barebones.tar.gz')) + fs.accessSync(join(outDir, 'initramfs.tar.gz')) + fs.accessSync(join(outDir, 'usersfs.tar.gz')) + process.exit() break default: @@ -107,14 +105,21 @@ switch(type) // args.shift(); // } -if(machine) args.unshift('-machine', machine) -exe = suppose(command, args, {debug: true, stripAnsi: true}) +// Exec test +exe = suppose(command, args, {stripAnsi: true}) + +// On disk images, hook on the bootloader and force kernel to output to console +if(type === 'img' || type === 'iso') + exe = exe.when('boot: ').respond('NodeOS console=ttyS0\n') + +exe = exe .when('username: ').respond('nodeos\n') .when('password: ').respond('nodeos\n') - .when('# ').respond('node\n') - .when('> ').respond('setTimeout(console.log, 2000, "this is","a test")\n') - .when(/this is a test/, function(exe) +// .when('# ').respond('node\n') +// .when('> ').respond('setTimeout(console.log, 2000, "this is","a test")\n') +// .when(/this is a test/, function(exe) + .when('~ > ', function(exe) { exe.kill() }) From 0d1c0b0f0d494271a0294f63739a7ee2850a9f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 15:22:43 +0100 Subject: [PATCH 144/206] Generate releases using refactored scheme --- scripts/postbuild | 93 ++++++++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 33 deletions(-) diff --git a/scripts/postbuild b/scripts/postbuild index af6ecf347..4cbb84481 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -9,26 +9,32 @@ TOOLCHAIN=`pwd`/node_modules/nodeos-cross-toolchain source $TOOLCHAIN/scripts/adjustEnvVars.sh || exit $? -OUT_DIR=`pwd`/out/$CPU_FAMILY/$PLATFORM +# Default kernel and platform +if [[ -z "$PLATFORM" ]]; then + PLATFORM=qemu +fi + +OUT_DIR=`pwd`/out/$CPU_FAMILY/$MACHINE/$PLATFORM -# Disk images are a composition of rootfs and usersfs + +# Disk images are a composition of bootfs and usersfs function createDiskImage() { mkdir -p `dirname $OBJECTS` # ToDo: sizes would need to be on cylinders and retain DOS compatibility # http://elinux.org/RPi_Advanced_Setup#Advanced_SD_card_setup - ROOTFS=$OUT_DIR/rootfs + BOOTFS=$OUT_DIR/bootfs USERSFS=$OUT_DIR/usersfs - SIZE_MBR=$((2*1024)) - SIZE_ROOTFS=$(stat -L -c%s "$ROOTFS") - SIZE_ROOTFS=$(($SIZE_ROOTFS/512)) - START_USERSFS=$(($SIZE_MBR+$SIZE_ROOTFS)) + SIZE_MBR=$((2*1024)) # Reserve first megabyte for MBR and partitions table + SIZE_BOOTFS=$(stat -L -c%s "$BOOTFS") + SIZE_BOOTFS=$(($SIZE_BOOTFS/512)) + START_USERSFS=$(($SIZE_MBR+$SIZE_BOOTFS)) dd if=/dev/zero of=$OBJECTS count=$SIZE_MBR && - cat $ROOTFS >> $OBJECTS && + cat $BOOTFS >> $OBJECTS && cat $USERSFS >> $OBJECTS || exit 10 eval "echo \"$(< resources/sfdisk.txt)\"" | \ @@ -42,32 +48,54 @@ if [[ ! -z "$RELEASE" ]]; then mkdir -p prebuilds rm -f $ZIP_FILE - case $PLATFORM in - pc_qemu) - zip -j $ZIP_FILE \ - resources/runners/README.md \ - $OUT_DIR/barebones \ - $OUT_DIR/initramfs \ - $OUT_DIR/usersfs || exit 20 + case $MACHINE in + pc) + case $PLATFORM in + img) + createDiskImage || exit $? - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/qemu.sh >> /tmp/run.sh || exit 21 + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/img.sh >> /tmp/run.sh || exit 30 - chmod +x /tmp/run.sh && - zip -j $ZIP_FILE /tmp/run.sh || exit 22 - ;; + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 31 - pc_iso) - zip -j $ZIP_FILE \ - resources/runners/README.md \ - $OUT_DIR/rootfs \ - $OUT_DIR/usersfs || exit 30 + zip -j $ZIP_FILE resources/runners/README.md || exit 32 + ;; - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/iso.sh >> /tmp/run.sh || exit 31 + iso) + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/bootfs \ + $OUT_DIR/usersfs || exit 40 - chmod +x /tmp/run.sh && - zip -j $ZIP_FILE /tmp/run.sh || exit 32 + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/iso.sh >> /tmp/run.sh || exit 41 + + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 42 + ;; + + qemu) + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/barebones \ + $OUT_DIR/initramfs \ + $OUT_DIR/usersfs || exit 50 + + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/qemu.sh >> /tmp/run.sh || exit 51 + + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 52 + ;; + + + *) + echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" + exit 70 + ;; + esac ;; raspberry_image) @@ -94,8 +122,8 @@ if [[ ! -z "$RELEASE" ]]; then ;; *) - echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" - exit 60 + echo -e "${RED}Unknown machine '$MACHINE'${CLR}" + exit 110 ;; esac fi @@ -121,12 +149,11 @@ case $PLATFORM in echo -e "${WHT} vagga run${CLR}" ;; - *_img|*_iso|*_qemu) + img|iso|qemu) echo -e "${WHT} npm start${CLR}" ;; *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" - exit 70 ;; esac From 5f87ebe643bcca631def8e649f26a5402d7bcf5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 15:32:11 +0100 Subject: [PATCH 145/206] Add support for Docker (experimental) --- Dockerfile | 5 ----- resources/Dockerfile | 12 ++++++++++ resources/runners/README_docker.md | 6 +++++ resources/runners/docker.sh | 10 +++++++++ scripts/build | 36 ++++++++++++++++++++++++++++++ scripts/docker | 14 +++++------- scripts/dockerBuild | 33 +++++++++++++-------------- scripts/postbuild | 21 +++++++++++++++-- 8 files changed, 105 insertions(+), 32 deletions(-) delete mode 100644 Dockerfile create mode 100644 resources/Dockerfile create mode 100644 resources/runners/README_docker.md create mode 100644 resources/runners/docker.sh diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 3bf3a283f..000000000 --- a/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM rootfs - -MAINTAINER Jesús Leganés Combarro 'piranna' - -ENTRYPOINT ["/init"] diff --git a/resources/Dockerfile b/resources/Dockerfile new file mode 100644 index 000000000..59c263ce7 --- /dev/null +++ b/resources/Dockerfile @@ -0,0 +1,12 @@ +FROM nodeos/barebones + +MAINTAINER Jesús Leganés Combarro 'piranna' + +ADD initramfs.tar.gz / + +VOLUME /tmp +ADD usersfs.tar.gz /tmp + +ENV root container + +ENTRYPOINT ["/init"] diff --git a/resources/runners/README_docker.md b/resources/runners/README_docker.md new file mode 100644 index 000000000..c01164f58 --- /dev/null +++ b/resources/runners/README_docker.md @@ -0,0 +1,6 @@ +This zip file host a pre-build NodeOS instance with a demo users filesystem, you +can find info about how to build your own users filesystem at +[NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. + +To run this demo, simply exec the ```run.sh``` script. You'll need to have +[Docker](https://www.docker.com) installed. diff --git a/resources/runners/docker.sh b/resources/runners/docker.sh new file mode 100644 index 000000000..2e5d3f5f1 --- /dev/null +++ b/resources/runners/docker.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + +docker import barebones.tar.gz nodeos/barebones +docker build -t nodeos/initramfs . + +docker run -it \ + --cap-add SYS_ADMIN \ + --security-opt=apparmor:unconfined \ + --device /dev/fuse \ + nodeos/initramfs diff --git a/scripts/build b/scripts/build index 1948981b9..e89aea16d 100755 --- a/scripts/build +++ b/scripts/build @@ -60,9 +60,30 @@ STEP_DIR=$OUT_DIR mkdir -p $STEP_DIR +function copyAndConvertInitrams() { + cpio2tar $BAREBONES/barebones.cpio.gz | gzip -c > $STEP_DIR/barebones || err 20 + cpio2tar $INITRAMFS | gzip -c > $STEP_DIR/initramfs || err 21 +} + case $MACHINE in pc) case $PLATFORM in + docker) + copyAndConvertInitrams || exit $? + + # gunzip $STEP_DIR/barebones -c | \ + # tar --delete dev/console sbin/init | \ + # gzip > $STEP_DIR/barebones.tar.gz || err 30 + + mv $STEP_DIR/barebones $STEP_DIR/barebones.tar.gz || err 30 + mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 31 + + cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 32 + + # Delete temporal initrams + rm -f $STEP_DIR/barebones || err 33 + ;; + img) tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 40 @@ -92,6 +113,21 @@ case $MACHINE in tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 62 ;; + tar) + copyAndConvertInitrams || exit $? + + nodeos-bootfs \ + -B $STEP_DIR/barebones \ + -F $PLATFORM \ + -I $STEP_DIR/initramfs \ + -O $STEP_DIR/bootfs.tar.gz || err 70 + + cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 71 + + # Delete temporal initrams + rm -f $STEP_DIR/barebones $STEP_DIR/initramfs || err 72 + ;; + *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" err 90 diff --git a/scripts/docker b/scripts/docker index 016bf6c47..a0edff819 100755 --- a/scripts/docker +++ b/scripts/docker @@ -1,10 +1,8 @@ #!/usr/bin/env sh -IMAGE=NodeOS -USERSFS=out/latest/usersfs - -docker run -it \ - --cap-add SYS_ADMIN \ - --device /dev/fuse \ - -v $USERSFS:/dev/sda \ - $IMAGE +docker run -it \ + --cap-add SYS_ADMIN \ + --security-opt=apparmor:unconfined \ + --device /dev/fuse \ + nodeos/initramfs +# -v usersfs:/tmp \ diff --git a/scripts/dockerBuild b/scripts/dockerBuild index 523471e2b..8c549e1b3 100755 --- a/scripts/dockerBuild +++ b/scripts/dockerBuild @@ -1,29 +1,28 @@ #!/usr/bin/env bash +set -o pipefail + + BLD=$(tput bold) +CLR="\e[0m" + +GRN="\e[32m" GRY="\e[90m" +WHT="\e[37m" + + +CONTEXT=out/latest -TOOLCHAIN=`pwd`/node_modules/nodeos-cross-toolchain +cp resources/Dockerfile $CONTEXT || exit 10 -source $TOOLCHAIN/scripts/adjustEnvVars.sh || exit $? +cd $CONTEXT || exit 20 +docker import barebones.tar.gz nodeos/barebones || exit 30 +docker build -t nodeos/initramfs . || exit 31 -( - cd node_modules/nodeos-barebones && - npm run dockerBuild || exit 10 -) && -( - cd node_modules/nodeos-initramfs && - npm run dockerBuild || exit 20 -) && -( - cd node_modules/nodeos-rootfs && - npm run dockerBuild || exit 30 -) && -( - docker build -t nodeos . || exit 40 -) || exit $? +#docker volume create --name usersfs || exit 32 +#cat usersfs.tar.gz | docker cp - usersfs:/ || exit 33 echo -e "${GRY}------------------------------------------${CLR}" diff --git a/scripts/postbuild b/scripts/postbuild index 4cbb84481..e401df386 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -51,6 +51,21 @@ if [[ ! -z "$RELEASE" ]]; then case $MACHINE in pc) case $PLATFORM in + docker) + cp resources/runners/README_docker.md /tmp/README.md || exit 20 + + cp resources/runners/docker.sh /tmp/run.sh && + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 21 + + zip -j $ZIP_FILE \ + /tmp/README.md \ + $OUT_DIR/barebones.tar.gz \ + $OUT_DIR/initramfs.tar.gz \ + $OUT_DIR/usersfs.tar.gz \ + resources/Dockerfile || exit 22 + ;; + img) createDiskImage || exit $? @@ -138,11 +153,13 @@ echo -e "- Interactively run your image with:" case $PLATFORM in docker) - echo -e "${WHT} npm run dockerBuild ${CLR}" - echo -e "${WHT} docker run -t -i NodeOS${CLR}" + echo -e "${WHT} npm run dockerBuild${CLR}" + echo -e "${WHT} npm run docker${CLR}" echo echo -e "- Share your creation with:" echo -e "${WHT} docker push NodeOS${CLR}" + echo + echo -e "You would need administrator permissions to exec that commands" ;; vagga) From 95b314ead1810989a2f0eed3114fcc72c9047ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 15:36:38 +0100 Subject: [PATCH 146/206] Support for vagga (experimental) --- resources/vagga.yaml | 16 ++++++++++------ scripts/build | 15 +++++++++++++++ scripts/postbuild | 18 ++++++++++-------- vagga.yaml | 27 ++++++++++++++++++--------- 4 files changed, 53 insertions(+), 23 deletions(-) diff --git a/resources/vagga.yaml b/resources/vagga.yaml index a6c642c8a..ba06118c4 100644 --- a/resources/vagga.yaml +++ b/resources/vagga.yaml @@ -5,17 +5,21 @@ containers: url: ./barebones - !Tar url: ./initramfs - volumes: - /tmp: !BindRW ./usersfs + usersfs: + data-dirs: [/nodeos, /root] + setup: + - !Tar + url: ./usersfs commands: run: !Command description: Start NodeOS - container: NodeOS + container: bootfs + volumes: + /tmp: !Container usersfs environ: - PWD: / - root: '' +# PWD: / + root: 'container' pid1mode: exec run: [/init] -# run: /tmp/bin/logon write-mode: transient-hard-link-copy diff --git a/scripts/build b/scripts/build index e89aea16d..83bc60287 100755 --- a/scripts/build +++ b/scripts/build @@ -128,6 +128,21 @@ case $MACHINE in rm -f $STEP_DIR/barebones $STEP_DIR/initramfs || err 72 ;; + vagga) + copyAndConvertInitrams || exit $? + + gunzip $STEP_DIR/barebones -c | \ + tar --delete dev/console sbin/init | \ + gzip > $STEP_DIR/barebones.tar.gz || err 80 + + mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 81 + + cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 82 + + # Delete temporal initrams + rm -f $STEP_DIR/barebones || err 83 + ;; + *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" err 90 diff --git a/scripts/postbuild b/scripts/postbuild index e401df386..37481a7ba 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -105,6 +105,16 @@ if [[ ! -z "$RELEASE" ]]; then zip -j $ZIP_FILE /tmp/run.sh || exit 52 ;; + vagga) + cp resources/runners/README_vagga.md /tmp/README.md || exit 60 + + zip -j $ZIP_FILE \ + /tmp/README.md \ + $OUT_DIR/barebones \ + $OUT_DIR/initramfs \ + $OUT_DIR/usersfs \ + resources/vagga.yaml || exit 61 + ;; *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" @@ -125,15 +135,7 @@ if [[ ! -z "$RELEASE" ]]; then zip -j $ZIP_FILE resources/runners/README.md || exit 42 ;; - vagga) - cp resources/runners/README_vagga.md /tmp/README.md || exit 50 - zip -j $ZIP_FILE \ - /tmp/README.md \ - $OUT_DIR/barebones \ - $OUT_DIR/initramfs \ - $OUT_DIR/usersfs \ - resources/vagga.yaml || exit 51 ;; *) diff --git a/vagga.yaml b/vagga.yaml index e95c3c726..5976d5b60 100644 --- a/vagga.yaml +++ b/vagga.yaml @@ -1,21 +1,30 @@ containers: - NodeOS: + bootfs: + auto-clean: true + hosts-file-path: null + resolv-conf-path: null setup: - !Tar - url: ./out/latest/barebones + url: ./out/latest/barebones.tar.gz - !Tar - url: ./out/latest/initramfs + url: ./out/latest/initramfs.tar.gz + - !Tar + url: ./out/latest/usersfs.tar.gz + path: /tmp volumes: - /tmp: !BindRW ./out/latest/usersfs + /tmp: !Persistent usersfs commands: run: !Command description: Start NodeOS - container: NodeOS + container: bootfs +# volumes: +# /tmp: !Persistent +# name: usersfs environ: - PWD: / - root: '' - pid1mode: exec +# PWD: / +# root: '' + root: 'container' +# pid1mode: exec run: [/init] -# run: /tmp/bin/logon write-mode: transient-hard-link-copy From 0629e3f8508c4aacb2b70a08c2f1a799dac891d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 17:21:57 +0100 Subject: [PATCH 147/206] Renamed `rootfs` to `bootfs` on the missing places --- bin/installUSB | 12 ++++++------ resources/runners/iso.sh | 4 ++-- resources/sfdisk.txt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bin/installUSB b/bin/installUSB index 7af5e39df..8a64a02d0 100755 --- a/bin/installUSB +++ b/bin/installUSB @@ -9,17 +9,17 @@ fi DEVICE=$1 PARTITION=${DEVICE}2 -ROOTFS=$2 +BOOTFS=$2 USERSFS=$3 -# Copy rootfs & usersfs partition images on USB device +# Copy bootfs & usersfs partition images on USB device -SIZE_ROOTFS=$(stat -L -c%s "$ROOTFS") -SIZE_ROOTFS=$(($SIZE_ROOTFS/512)) +SIZE_BOOTFS=$(stat -L -c%s "$BOOTFS") +SIZE_BOOTFS=$(($SIZE_BOOTFS/512)) -dd if=$ROOTFS of=$DEVICE && -dd if=$USERSFS of=$DEVICE seek=$SIZE_ROOTFS || exit 11 +dd if=$BOOTFS of=$DEVICE && +dd if=$USERSFS of=$DEVICE seek=$SIZE_BOOTFS || exit 11 sync diff --git a/resources/runners/iso.sh b/resources/runners/iso.sh index 3e8069a11..8d8eb30e6 100644 --- a/resources/runners/iso.sh +++ b/resources/runners/iso.sh @@ -18,5 +18,5 @@ $QEMU \ -m 256M \ -redir tcp:50080::80 \ -redir tcp:50443::443 \ - -hda rootfs \ - -hdb usersfs + -cdrom bootfs.iso \ + -hda usersfs.img diff --git a/resources/sfdisk.txt b/resources/sfdisk.txt index 0f8a332a2..da0a6c936 100644 --- a/resources/sfdisk.txt +++ b/resources/sfdisk.txt @@ -1,2 +1,2 @@ -$SIZE_MBR,$SIZE_ROOTFS,0C,* +$SIZE_MBR,$SIZE_BOOTFS,0C,* $START_USERSFS,,, From 41af1f957b118e1ff16a5f15c6a2d258c90ec34a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 17:34:35 +0100 Subject: [PATCH 148/206] Fix names of generated prebuilds after refactor --- resources/runners/disk.sh | 21 +++++++++++++++ resources/runners/img.sh | 22 +++++++++++++++ resources/runners/qemu.sh | 16 +++++------ scripts/postbuild | 56 ++++++++++++++++++++------------------- 4 files changed, 80 insertions(+), 35 deletions(-) create mode 100644 resources/runners/disk.sh create mode 100644 resources/runners/img.sh diff --git a/resources/runners/disk.sh b/resources/runners/disk.sh new file mode 100644 index 000000000..06e0a1360 --- /dev/null +++ b/resources/runners/disk.sh @@ -0,0 +1,21 @@ +while [ ! $# -eq 0 ] +do + case "$1" in + --terminal | -t) + QEMU="$QEMU -nographic" + ;; + esac + shift +done + +grep -q -e "vmx" -e "svm" /proc/cpuinfo +if [ $? -eq 0 ]; then + QEMU="$QEMU -enable-kvm" +fi + +$QEMU \ + -vga std \ + -m 256M \ + -redir tcp:50080::80 \ + -redir tcp:50443::443 \ + -hda disk.img diff --git a/resources/runners/img.sh b/resources/runners/img.sh new file mode 100644 index 000000000..99be1bedd --- /dev/null +++ b/resources/runners/img.sh @@ -0,0 +1,22 @@ +while [ ! $# -eq 0 ] +do + case "$1" in + --terminal | -t) + QEMU="$QEMU -nographic" + ;; + esac + shift +done + +grep -q -e "vmx" -e "svm" /proc/cpuinfo +if [ $? -eq 0 ]; then + QEMU="$QEMU -enable-kvm" +fi + +$QEMU \ + -vga std \ + -m 256M \ + -redir tcp:50080::80 \ + -redir tcp:50443::443 \ + -hda bootfs.img \ + -hdb usersfs.img diff --git a/resources/runners/qemu.sh b/resources/runners/qemu.sh index beddb8820..8253fe06f 100644 --- a/resources/runners/qemu.sh +++ b/resources/runners/qemu.sh @@ -15,12 +15,12 @@ if [ $? -eq 0 ]; then QEMU="$QEMU -enable-kvm" fi -$QEMU \ - -vga std \ - -m 256M \ - -redir tcp:50080::80 \ - -redir tcp:50443::443 \ - --kernel barebones \ - --initrd initramfs \ - -hda usersfs \ +$QEMU \ + -vga std \ + -m 256M \ + -redir tcp:50080::80 \ + -redir tcp:50443::443 \ + --kernel keernel \ + --initrd initramfs.cpio.gz \ + -hda usersfs.img \ -append "$APPEND" diff --git a/scripts/postbuild b/scripts/postbuild index 37481a7ba..65e3d8fcf 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -20,25 +20,25 @@ OUT_DIR=`pwd`/out/$CPU_FAMILY/$MACHINE/$PLATFORM # Disk images are a composition of bootfs and usersfs function createDiskImage() { - mkdir -p `dirname $OBJECTS` + DISK=$OUT_DIR/disk.img # ToDo: sizes would need to be on cylinders and retain DOS compatibility # http://elinux.org/RPi_Advanced_Setup#Advanced_SD_card_setup - BOOTFS=$OUT_DIR/bootfs - USERSFS=$OUT_DIR/usersfs + BOOTFS=$OUT_DIR/bootfs.img + USERSFS=$OUT_DIR/usersfs.img SIZE_MBR=$((2*1024)) # Reserve first megabyte for MBR and partitions table SIZE_BOOTFS=$(stat -L -c%s "$BOOTFS") SIZE_BOOTFS=$(($SIZE_BOOTFS/512)) START_USERSFS=$(($SIZE_MBR+$SIZE_BOOTFS)) - dd if=/dev/zero of=$OBJECTS count=$SIZE_MBR && - cat $BOOTFS >> $OBJECTS && - cat $USERSFS >> $OBJECTS || exit 10 + dd if=/dev/zero of=$DISK count=$SIZE_MBR && + dd if=$BOOTFS of=$DISK seek=$SIZE_MBR && + dd if=$USERSFS of=$DISK seek=$START_USERSFS || exit 10 eval "echo \"$(< resources/sfdisk.txt)\"" | \ - /sbin/sfdisk -uS --force $OBJECTS || exit 11 + /sbin/sfdisk -uS --force $DISK || exit 11 } @@ -75,44 +75,46 @@ if [[ ! -z "$RELEASE" ]]; then chmod +x /tmp/run.sh && zip -j $ZIP_FILE /tmp/run.sh || exit 31 - zip -j $ZIP_FILE resources/runners/README.md || exit 32 + zip -j $ZIP_FILE \ + $OUT_DIR/bootfs.img \ + $OUT_DIR/usersfs.img || exit 32 ;; iso) - zip -j $ZIP_FILE \ - resources/runners/README.md \ - $OUT_DIR/bootfs \ - $OUT_DIR/usersfs || exit 40 - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/iso.sh >> /tmp/run.sh || exit 41 + cat resources/runners/iso.sh >> /tmp/run.sh || exit 40 chmod +x /tmp/run.sh && - zip -j $ZIP_FILE /tmp/run.sh || exit 42 - ;; + zip -j $ZIP_FILE /tmp/run.sh || exit 41 - qemu) zip -j $ZIP_FILE \ resources/runners/README.md \ - $OUT_DIR/barebones \ - $OUT_DIR/initramfs \ - $OUT_DIR/usersfs || exit 50 + $OUT_DIR/bootfs.iso \ + $OUT_DIR/usersfs.img || exit 42 + ;; + qemu) eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/qemu.sh >> /tmp/run.sh || exit 51 + cat resources/runners/qemu.sh >> /tmp/run.sh || exit 50 chmod +x /tmp/run.sh && - zip -j $ZIP_FILE /tmp/run.sh || exit 52 + zip -j $ZIP_FILE /tmp/run.sh || exit 51 + + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/kernel \ + $OUT_DIR/initramfs.cpio.gz \ + $OUT_DIR/usersfs.img || exit 52 ;; vagga) cp resources/runners/README_vagga.md /tmp/README.md || exit 60 - zip -j $ZIP_FILE \ - /tmp/README.md \ - $OUT_DIR/barebones \ - $OUT_DIR/initramfs \ - $OUT_DIR/usersfs \ + zip -j $ZIP_FILE \ + /tmp/README.md \ + $OUT_DIR/barebones.tar.gz \ + $OUT_DIR/initramfs.tar.gz \ + $OUT_DIR/usersfs.tar.gz \ resources/vagga.yaml || exit 61 ;; From 006e1c35b05bedb5a31d923e75fbca71921afb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 17:35:32 +0100 Subject: [PATCH 149/206] Add support for Raspberry Pi (experimental) --- scripts/build | 27 +++++++++++++++++++++++++++ scripts/postbuild | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/scripts/build b/scripts/build index 83bc60287..fed4681d8 100755 --- a/scripts/build +++ b/scripts/build @@ -150,6 +150,33 @@ case $MACHINE in esac ;; + raspi|raspi2|raspi3) + case $PLATFORM in + img) + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 100 + + nodeos-bootfs \ + -D $BAREBONES/dts \ + -F $PLATFORM \ + -K $BAREBONES/zImage \ + -I $INITRAMFS \ + -O $STEP_DIR/bootfs.img \ + -U $STEP_DIR/usersfs.img || err 101 + ;; + + qemu) + cp $BAREBONES/zImage $STEP_DIR/kernel || err 110 + cp $BAREBONES/dts $STEP_DIR/dts || err 111 + cp $INITRAMFS $STEP_DIR/initramfs.cpio.gz || err 112 + + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 113 + ;; + + *) + echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" + err 120 + ;; + esac ;; *) diff --git a/scripts/postbuild b/scripts/postbuild index 65e3d8fcf..0ff15f96d 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -125,19 +125,42 @@ if [[ ! -z "$RELEASE" ]]; then esac ;; - raspberry_image) - createDiskImage || exit $? + raspi|raspi2|raspi3) + case $PLATFORM in + img) + createDiskImage || exit $? - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/raspberry.sh >> /tmp/run.sh || exit 40 + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/disk.sh >> /tmp/run.sh || exit 80 - chmod +x /tmp/run.sh && - zip -j $ZIP_FILE /tmp/run.sh || exit 41 + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 81 - zip -j $ZIP_FILE resources/runners/README.md || exit 42 - ;; + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/disk.img || exit 82 + ;; + qemu) + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/qemu.sh >> /tmp/run.sh || exit 90 + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 91 + + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/kernel \ + $OUT_DIR/dts \ + $OUT_DIR/initramfs.cpio.gz \ + $OUT_DIR/usersfs.img || exit 92 + ;; + + *) + echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" + exit 100 + ;; + esac ;; *) From 03832a5da5c70c19315a8ee1d3f786b4d74ad8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 17:35:58 +0100 Subject: [PATCH 150/206] Generate PC disk images --- scripts/build | 2 +- scripts/postbuild | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/scripts/build b/scripts/build index fed4681d8..fe65a3305 100755 --- a/scripts/build +++ b/scripts/build @@ -84,7 +84,7 @@ case $MACHINE in rm -f $STEP_DIR/barebones || err 33 ;; - img) + img|disk) tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 40 nodeos-bootfs \ diff --git a/scripts/postbuild b/scripts/postbuild index 0ff15f96d..1e5adcd8b 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -51,6 +51,20 @@ if [[ ! -z "$RELEASE" ]]; then case $MACHINE in pc) case $PLATFORM in + disk) + createDiskImage || exit $? + + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/disk.sh >> /tmp/run.sh || exit 30 + + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 31 + + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/disk.img || exit 32 + ;; + docker) cp resources/runners/README_docker.md /tmp/README.md || exit 20 @@ -67,8 +81,6 @@ if [[ ! -z "$RELEASE" ]]; then ;; img) - createDiskImage || exit $? - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && cat resources/runners/img.sh >> /tmp/run.sh || exit 30 From 69a9dca9598f54e0759142f06ab6bfe978dce397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 17:37:59 +0100 Subject: [PATCH 151/206] BigRedButton for PC img, iso, qemu and docker images --- scripts/BigRedButton | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/scripts/BigRedButton b/scripts/BigRedButton index c6e128596..0d6389813 100755 --- a/scripts/BigRedButton +++ b/scripts/BigRedButton @@ -1,10 +1,28 @@ #!/usr/bin/env bash +# This script should generate all the possible build combinations of NodeOS and +# test them by being able to login and exec a Node.js REPL. In some cases This +# is not fully possible and so they should be improved in the future -PLATFORM=iso_32 npm run build --no-spin && npm test || exit 1 -PLATFORM=iso_64 npm run build --no-spin && npm test || exit 2 -PLATFORM=qemu_32 npm run build --no-spin || exit 3 -PLATFORM=qemu_64 npm run build --no-spin && npm test || exit 4 -#PLATFORM=raspberry npm run build --no-spin && npm test || exit 5 -PLATFORM=vagga_32 npm run build --no-spin && npm test || exit 6 -PLATFORM=vagga_64 npm run build --no-spin && npm test || exit 7 + +BUILD="npm run build --no-spin" +TEST="npm test" + + +eval MACHINE=pc PLATFORM=img BITS=32 $BUILD && $TEST || exit 1 +eval MACHINE=pc PLATFORM=img BITS=64 $BUILD && $TEST || exit 2 +eval MACHINE=pc PLATFORM=iso BITS=32 $BUILD && $TEST || exit 3 +eval MACHINE=pc PLATFORM=iso BITS=64 $BUILD && $TEST || exit 4 +eval MACHINE=pc PLATFORM=qemu BITS=32 $BUILD && $TEST || exit 5 +eval MACHINE=pc PLATFORM=qemu BITS=64 $BUILD && $TEST || exit 6 + +eval MACHINE=pc PLATFORM=docker BITS=32 KERNEL=nokernel $BUILD || exit 7 +eval MACHINE=pc PLATFORM=docker BITS=64 KERNEL=nokernel $BUILD || exit 8 + +# eval MACHINE=pc PLATFORM=tar BITS=32 KERNEL=nokernel $BUILD && $TEST || exit 9 +# eval MACHINE=pc PLATFORM=tar BITS=64 KERNEL=nokernel $BUILD && $TEST || exit 10 +# eval MACHINE=pc PLATFORM=vagga BITS=32 KERNEL=nokernel $BUILD && $TEST || exit 11 +# eval MACHINE=pc PLATFORM=vagga BITS=64 KERNEL=nokernel $BUILD && $TEST || exit 12 + +# eval MACHINE=raspi2 PLATFORM=img $BUILD && $TEST || exit 13 +# eval MACHINE=raspi2 PLATFORM=qemu $BUILD && $TEST || exit 14 From 595561fb3b4bf96939ac73dd0ac0656bb068c579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 15 Jan 2017 17:38:43 +0100 Subject: [PATCH 152/206] 1.0.0-RC3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 980fad4e1..4969439b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "NodeOS", - "version": "1.0.0-RC2", + "version": "1.0.0-RC3", "description": "Lightweight operating system using Node.js as userspace", "scripts": { "BigRedButton": "scripts/BigRedButton", From 3e500b5721ae9d68d597beb92d17fdb9ea6e04ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro?= Date: Sun, 15 Jan 2017 18:25:21 +0100 Subject: [PATCH 153/206] Add mtools dependency for nodeos-bootfs --- bin/install-dependencies | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/install-dependencies b/bin/install-dependencies index 13ad143d3..f6883d383 100755 --- a/bin/install-dependencies +++ b/bin/install-dependencies @@ -25,8 +25,8 @@ $APT install gcc git || exit 20 # barebones $APT install bc || exit 21 -# rootfs -$APT install genisoimage libc6-i386 libuuid1:i386 || exit 22 +# bootfs +$APT install genisoimage mtools libc6-i386 libuuid1:i386 || exit 22 # qemu From 3d2298aa9c35ee56bb5821b476354b9c259a2a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 22 Jan 2017 19:36:21 +0100 Subject: [PATCH 154/206] Support for Docker and disk images --- package.json | 1 + resources/palmtree.json | 12 +++++++++ scripts/BigRedButton | 41 +++++++++++++++++------------- scripts/build | 29 +++++++++++++++------- scripts/postbuild | 24 ++++++++++++++---- scripts/test | 55 ++++++++++++++++++++++++++--------------- 6 files changed, 111 insertions(+), 51 deletions(-) create mode 100644 resources/palmtree.json diff --git a/package.json b/package.json index 4969439b2..dd8b13434 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "BigRedButton": "scripts/BigRedButton", "docker": "scripts/docker", "dockerBuild": "scripts/dockerBuild", + "dockerClean": "docker volume rm $(docker volume ls -qf dangling=true) || exit 0", "build": "scripts/build", "postbuild": "scripts/postbuild", "postinstall": "scripts/postinstall", diff --git a/resources/palmtree.json b/resources/palmtree.json new file mode 100644 index 000000000..9845d58de --- /dev/null +++ b/resources/palmtree.json @@ -0,0 +1,12 @@ +[ + { + "command": "/bin/logon", + "minUptime": 2000, + "enabled": true + }, + { + "command": "/bin/nodeos-reverse-proxy", + "minUptime": 2000, + "enabled": true + } +] diff --git a/scripts/BigRedButton b/scripts/BigRedButton index 0d6389813..172b4722a 100755 --- a/scripts/BigRedButton +++ b/scripts/BigRedButton @@ -6,23 +6,30 @@ BUILD="npm run build --no-spin" +DOCKER="npm run dockerBuild" TEST="npm test" -eval MACHINE=pc PLATFORM=img BITS=32 $BUILD && $TEST || exit 1 -eval MACHINE=pc PLATFORM=img BITS=64 $BUILD && $TEST || exit 2 -eval MACHINE=pc PLATFORM=iso BITS=32 $BUILD && $TEST || exit 3 -eval MACHINE=pc PLATFORM=iso BITS=64 $BUILD && $TEST || exit 4 -eval MACHINE=pc PLATFORM=qemu BITS=32 $BUILD && $TEST || exit 5 -eval MACHINE=pc PLATFORM=qemu BITS=64 $BUILD && $TEST || exit 6 - -eval MACHINE=pc PLATFORM=docker BITS=32 KERNEL=nokernel $BUILD || exit 7 -eval MACHINE=pc PLATFORM=docker BITS=64 KERNEL=nokernel $BUILD || exit 8 - -# eval MACHINE=pc PLATFORM=tar BITS=32 KERNEL=nokernel $BUILD && $TEST || exit 9 -# eval MACHINE=pc PLATFORM=tar BITS=64 KERNEL=nokernel $BUILD && $TEST || exit 10 -# eval MACHINE=pc PLATFORM=vagga BITS=32 KERNEL=nokernel $BUILD && $TEST || exit 11 -# eval MACHINE=pc PLATFORM=vagga BITS=64 KERNEL=nokernel $BUILD && $TEST || exit 12 - -# eval MACHINE=raspi2 PLATFORM=img $BUILD && $TEST || exit 13 -# eval MACHINE=raspi2 PLATFORM=qemu $BUILD && $TEST || exit 14 +eval MACHINE=pc PLATFORM=disk BITS=32 $BUILD && $TEST || exit 1 +eval MACHINE=pc PLATFORM=disk BITS=64 $BUILD && $TEST || exit 2 +eval MACHINE=pc PLATFORM=img BITS=32 $BUILD && $TEST || exit 3 +eval MACHINE=pc PLATFORM=img BITS=64 $BUILD && $TEST || exit 4 +eval MACHINE=pc PLATFORM=iso BITS=32 $BUILD && $TEST || exit 5 +eval MACHINE=pc PLATFORM=iso BITS=64 $BUILD && $TEST || exit 6 +eval MACHINE=pc PLATFORM=qemu BITS=32 $BUILD && $TEST || exit 7 +eval MACHINE=pc PLATFORM=qemu BITS=64 $BUILD && $TEST || exit 8 + +eval MACHINE=pc PLATFORM=docker BITS=32 $BUILD && $DOCKER && $TEST || exit 9 +eval MACHINE=pc PLATFORM=docker BITS=64 $BUILD && $DOCKER && $TEST || exit 10 + +# eval MACHINE=pc PLATFORM=tar BITS=32 $BUILD && $TEST || exit 11 +# eval MACHINE=pc PLATFORM=tar BITS=64 $BUILD && $TEST || exit 12 +# eval MACHINE=pc PLATFORM=vagga BITS=32 $BUILD && $TEST || exit 13 +# eval MACHINE=pc PLATFORM=vagga BITS=64 $BUILD && $TEST || exit 14 + +# eval MACHINE=raspi PLATFORM=disk $BUILD && $TEST || exit 15 +# eval MACHINE=raspi PLATFORM=img $BUILD && $TEST || exit 16 +# eval MACHINE=raspi PLATFORM=qemu $BUILD && $TEST || exit 17 +# eval MACHINE=raspi2 PLATFORM=disk $BUILD && $TEST || exit 18 +# eval MACHINE=raspi2 PLATFORM=img $BUILD && $TEST || exit 19 +# eval MACHINE=raspi2 PLATFORM=qemu $BUILD && $TEST || exit 20 diff --git a/scripts/build b/scripts/build index fe65a3305..910530e4e 100755 --- a/scripts/build +++ b/scripts/build @@ -38,14 +38,20 @@ OUT_DIR=`pwd`/out/$CPU_FAMILY/$MACHINE/$PLATFORM export MACHINE +if [[ "$PLATFORM" == "docker" ]]; then + export KERNEL=nokernel +fi + +NPMi="npm install --arch=$NODE_ARCH --production" + # # Build each layer up # -( cd $BAREBONES && KERNEL=$kERNEL npm install --arch=$NODE_ARCH --production ) && -( cd $INITRAMFS && npm install --arch=$NODE_ARCH --production ) && -( cd $USERSFS && npm install --arch=$NODE_ARCH --production ) || exit 10 +( cd $BAREBONES && $NPMi ) && +( cd $INITRAMFS && $NPMi ) && +( cd $USERSFS && $NPMi ) || exit 10 # @@ -71,17 +77,22 @@ case $MACHINE in docker) copyAndConvertInitrams || exit $? - # gunzip $STEP_DIR/barebones -c | \ - # tar --delete dev/console sbin/init | \ - # gzip > $STEP_DIR/barebones.tar.gz || err 30 + # Docker already provides `/dev/console` by default + gunzip $STEP_DIR/barebones -c | \ + tar --delete dev/console | \ + gzip > $STEP_DIR/barebones.tar.gz || err 30 - mv $STEP_DIR/barebones $STEP_DIR/barebones.tar.gz || err 30 mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 31 - cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 32 + # Exec `logon` directly instead of use `node-bin-getty` on the console + gunzip $USERSFS -c | \ + tar --delete root/etc/palmtree.json > $STEP_DIR/usersfs || err 32 + + tar -f $STEP_DIR/usersfs -r resources/palmtree.json | \ + gzip > $STEP_DIR/usersfs.tar.gz || err 33 # Delete temporal initrams - rm -f $STEP_DIR/barebones || err 33 + rm -f $STEP_DIR/barebones $STEP_DIR/usersfs || err 34 ;; img|disk) diff --git a/scripts/postbuild b/scripts/postbuild index 1e5adcd8b..507c6b8ca 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -43,7 +43,7 @@ function createDiskImage() { if [[ ! -z "$RELEASE" ]]; then - ZIP_FILE=prebuilds/$CPU_FAMILY-$PLATFORM.zip + ZIP_FILE=prebuilds/$CPU_FAMILY-$MACHINE-$PLATFORM.zip mkdir -p prebuilds rm -f $ZIP_FILE @@ -139,6 +139,20 @@ if [[ ! -z "$RELEASE" ]]; then raspi|raspi2|raspi3) case $PLATFORM in + disk) + createDiskImage || exit $? + + eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && + cat resources/runners/disk.sh >> /tmp/run.sh || exit 30 + + chmod +x /tmp/run.sh && + zip -j $ZIP_FILE /tmp/run.sh || exit 31 + + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/disk.img || exit 32 + ;; + img) createDiskImage || exit $? @@ -191,6 +205,10 @@ echo echo -e "- Interactively run your image with:" case $PLATFORM in + disk|img|iso|qemu) + echo -e "${WHT} npm start${CLR}" + ;; + docker) echo -e "${WHT} npm run dockerBuild${CLR}" echo -e "${WHT} npm run docker${CLR}" @@ -205,10 +223,6 @@ case $PLATFORM in echo -e "${WHT} vagga run${CLR}" ;; - img|iso|qemu) - echo -e "${WHT} npm start${CLR}" - ;; - *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" ;; diff --git a/scripts/test b/scripts/test index 1db74a720..d8dd58536 100755 --- a/scripts/test +++ b/scripts/test @@ -46,6 +46,18 @@ var args = const outDir = join('out', cpu_family, machine, platform) switch(type) { + case 'docker': + command = 'docker' + args = + [ + 'run', '-t', + '--cap-add', 'SYS_ADMIN', + '--security-opt=apparmor:unconfined', + '--device', '/dev/fuse', + 'nodeos/initramfs' + ] + break + case 'img': args.push('-hda', join(outDir, 'bootfs.img'), '-hdb', join(outDir, 'usersfs.img')) @@ -75,7 +87,6 @@ switch(type) process.exit() break - case 'docker': case 'vagga': fs.accessSync(join(outDir, 'barebones.tar.gz')) fs.accessSync(join(outDir, 'initramfs.tar.gz')) @@ -111,27 +122,31 @@ exe = suppose(command, args, {stripAnsi: true}) // On disk images, hook on the bootloader and force kernel to output to console if(type === 'img' || type === 'iso') - exe = exe.when('boot: ').respond('NodeOS console=ttyS0\n') + exe.when('boot: ').respond('NodeOS console=ttyS0\n') + +exe.when('username: ') -exe = exe - .when('username: ').respond('nodeos\n') +if(type !== 'docker') + exe.respond('nodeos\n') .when('password: ').respond('nodeos\n') // .when('# ').respond('node\n') // .when('> ').respond('setTimeout(console.log, 2000, "this is","a test")\n') // .when(/this is a test/, function(exe) - .when('~ > ', function(exe) - { - exe.kill() - }) - .on('error', function(error) - { - if(error.message.indexOf('terminating on signal 15 from pid') < 0) - console.trace(error) - }) - .end(function() - { - clearTimeout(timeout) - - var expects = this.expects.length - if(expects) process.exit(expects) - }) + .when('~ > ') + +exe.respond(function(exe) +{ + exe.kill() +}) +.on('error', function(error) +{ + if(error.message.indexOf('terminating on signal 15 from pid') < 0) + console.trace(error) +}) +.end(function() +{ + clearTimeout(timeout) + + var expects = this.expects.length + if(expects) process.exit(expects) +}) From 4952aa9603ee2637dc87acd84ef9486af3e439fb Mon Sep 17 00:00:00 2001 From: luii Date: Tue, 7 Feb 2017 16:58:25 +0100 Subject: [PATCH 155/206] Specified raw format on start and test script --- scripts/start | 2 +- scripts/test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/start b/scripts/start index 454316de1..62edb466e 100755 --- a/scripts/start +++ b/scripts/start @@ -69,7 +69,7 @@ switch(platform) args.push('--kernel', join(outDir, 'kernel'), '--initrd', join(outDir, 'initramfs.cpio.gz'), - '-hda', join(outDir, 'usersfs.img'), + '-drive', `file=${join(outDir, 'usersfs.img')},format=raw,index=0`, '-append', append.join(' ')) break diff --git a/scripts/test b/scripts/test index 1db74a720..8fc5f12af 100755 --- a/scripts/test +++ b/scripts/test @@ -65,7 +65,7 @@ switch(type) args.push('--kernel', join(outDir, 'kernel'), '--initrd', join(outDir, 'initramfs.cpio.gz'), - '-hda', join(outDir, 'usersfs.img'), + '-drive', `file=${join(outDir, 'usersfs.img')},format=raw,index=0`, '-append', append.join(' ')) break From 0b7795fdf025e61f34ae3e9a6b28aeeaa7f73755 Mon Sep 17 00:00:00 2001 From: luii Date: Tue, 7 Feb 2017 18:21:29 +0100 Subject: [PATCH 156/206] Update deprecated -redir option to -net --- scripts/start | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/start b/scripts/start index 454316de1..72dfcc14e 100755 --- a/scripts/start +++ b/scripts/start @@ -23,8 +23,9 @@ var args = '-enable-kvm', '-vga', 'std', '-m', '256M', - '-redir', 'tcp:50080::80', - '-redir', 'tcp:50443::443' + '-net', 'nic', + '-net', 'user,id=eth0,hostfwd=tcp::50080-:80', + '-net', 'user,id=eth1,hostfwd=tcp::50443-:443' ] switch(process.argv[2]) From a385bc3842d22b2dda8ced636e7d9b7823ec85d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Wed, 15 Feb 2017 11:40:06 +0100 Subject: [PATCH 157/206] Fix adaption of `usersfs` for Docker --- scripts/build | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/build b/scripts/build index 910530e4e..065819ce1 100755 --- a/scripts/build +++ b/scripts/build @@ -85,14 +85,16 @@ case $MACHINE in mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 31 # Exec `logon` directly instead of use `node-bin-getty` on the console - gunzip $USERSFS -c | \ - tar --delete root/etc/palmtree.json > $STEP_DIR/usersfs || err 32 + mkdir -p root/etc && cp resources/palmtree.json root/etc || err 32 - tar -f $STEP_DIR/usersfs -r resources/palmtree.json | \ - gzip > $STEP_DIR/usersfs.tar.gz || err 33 + gunzip $USERSFS -c | \ + tar --delete root/etc/palmtree.json > $STEP_DIR/usersfs.tar || err 33 + + tar -f $STEP_DIR/usersfs.tar -r root/etc/palmtree.json || err 34 + gzip -f $STEP_DIR/usersfs.tar || err 35 # Delete temporal initrams - rm -f $STEP_DIR/barebones $STEP_DIR/usersfs || err 34 + rm -rf root $STEP_DIR/barebones $STEP_DIR/usersfs.tar || err 36 ;; img|disk) From e35642f02d0e3bf0f385cf6e6312d6cd42bb69bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 19 Feb 2017 12:29:41 +0100 Subject: [PATCH 158/206] Update `nodeos-initramfs` and `nodeos-usersfs` to fix Docker boot --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dd8b13434..f36e2a733 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ "private": true, "dependencies": { "nodeos-barebones": "^1.0.0-RC3.1", - "nodeos-initramfs": "^1.0.0-RC3.1", - "nodeos-usersfs": "^1.0.0-RC3.1" + "nodeos-initramfs": "^1.0.0-RC3.2", + "nodeos-usersfs": "^1.0.0-RC3.2" }, "devDependencies": { "cpio2tar": "^0.0.5", From ca1b65a1dd59982c6d26d17e416afe225fbd453b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 19 Feb 2017 12:30:37 +0100 Subject: [PATCH 159/206] Run Docker with `npm start` --- resources/Dockerfile | 4 +++- scripts/start | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/resources/Dockerfile b/resources/Dockerfile index 59c263ce7..a3758c0a7 100644 --- a/resources/Dockerfile +++ b/resources/Dockerfile @@ -1,3 +1,5 @@ +# Autogenerated by `npm run dockerBuild` + FROM nodeos/barebones MAINTAINER Jesús Leganés Combarro 'piranna' @@ -5,7 +7,7 @@ MAINTAINER Jesús Leganés Combarro 'piranna' ADD initramfs.tar.gz / VOLUME /tmp -ADD usersfs.tar.gz /tmp +ADD usersfs.tar.gz /tmp/ ENV root container diff --git a/scripts/start b/scripts/start index 454316de1..1b9b5226e 100755 --- a/scripts/start +++ b/scripts/start @@ -36,6 +36,11 @@ switch(process.argv[2]) const outDir = join('out', cpu_family, machine, platform) switch(platform) { + case 'docker': + command = 'scripts/docker' + args = [] + break + case 'img': args.push('-hda', join(outDir, 'bootfs.img'), '-hdb', join(outDir, 'usersfs.img')) @@ -98,4 +103,8 @@ if(kvm.test(contents) === false) // Exec NodeOS spawn(command, args, {stdio: 'inherit'}) -.on('error', console.trace.bind(console)); +.on('error', console.trace.bind(console)) +.on('exit', function(code, signal) +{ + process.exit(code || signal) +}) From 3df1da5787e5a3291fc6040461c66f2fc29d3645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 20 Feb 2017 00:27:27 +0100 Subject: [PATCH 160/206] Generate disk images by `nodeos-bootfs` and test them --- package.json | 2 +- resources/sfdisk.txt | 2 - scripts/build | 92 +++++++++++++++++++++++++++++--------------- scripts/postbuild | 35 ++--------------- scripts/start | 4 ++ scripts/test | 4 ++ 6 files changed, 73 insertions(+), 66 deletions(-) delete mode 100644 resources/sfdisk.txt diff --git a/package.json b/package.json index f36e2a733..4a4cde479 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "devDependencies": { "cpio2tar": "^0.0.5", "minimist": "^1.2.0", - "nodeos-bootfs": "^1.0.0-RC3.0", + "nodeos-bootfs": "NodeOS/nodeos-bootfs", "nodeos-cross-toolchain": "^1.0.0-RC3.1", "prebuild": "piranna/prebuild#prerelease", "qemu": "^2.8.0", diff --git a/resources/sfdisk.txt b/resources/sfdisk.txt deleted file mode 100644 index da0a6c936..000000000 --- a/resources/sfdisk.txt +++ /dev/null @@ -1,2 +0,0 @@ -$SIZE_MBR,$SIZE_BOOTFS,0C,* -$START_USERSFS,,, diff --git a/scripts/build b/scripts/build index 065819ce1..545e5bb4b 100755 --- a/scripts/build +++ b/scripts/build @@ -74,56 +74,69 @@ function copyAndConvertInitrams() { case $MACHINE in pc) case $PLATFORM in + disk) + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 30 + + nodeos-bootfs \ + -F $PLATFORM \ + -K $BAREBONES/bzImage \ + -I $INITRAMFS \ + -O $STEP_DIR/disk.img \ + -U $STEP_DIR/usersfs.img || err 31 + + rm -f $STEP_DIR/usersfs.img || err 32 + ;; + docker) copyAndConvertInitrams || exit $? # Docker already provides `/dev/console` by default gunzip $STEP_DIR/barebones -c | \ tar --delete dev/console | \ - gzip > $STEP_DIR/barebones.tar.gz || err 30 + gzip > $STEP_DIR/barebones.tar.gz || err 40 - mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 31 + mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 41 # Exec `logon` directly instead of use `node-bin-getty` on the console - mkdir -p root/etc && cp resources/palmtree.json root/etc || err 32 + mkdir -p root/etc && cp resources/palmtree.json root/etc || err 42 gunzip $USERSFS -c | \ - tar --delete root/etc/palmtree.json > $STEP_DIR/usersfs.tar || err 33 + tar --delete root/etc/palmtree.json > $STEP_DIR/usersfs.tar || err 43 - tar -f $STEP_DIR/usersfs.tar -r root/etc/palmtree.json || err 34 - gzip -f $STEP_DIR/usersfs.tar || err 35 + tar -f $STEP_DIR/usersfs.tar -r root/etc/palmtree.json || err 44 + gzip -f $STEP_DIR/usersfs.tar || err 45 # Delete temporal initrams - rm -rf root $STEP_DIR/barebones $STEP_DIR/usersfs.tar || err 36 + rm -rf root $STEP_DIR/barebones $STEP_DIR/usersfs.tar || err 46 ;; - img|disk) - tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 40 + img) + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 50 nodeos-bootfs \ -F $PLATFORM \ -K $BAREBONES/bzImage \ -I $INITRAMFS \ -O $STEP_DIR/bootfs.img \ - -U $STEP_DIR/usersfs.img || err 41 + -U $STEP_DIR/usersfs.img || err 51 ;; iso) - tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 50 + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 60 nodeos-bootfs \ -F $PLATFORM \ -K $BAREBONES/bzImage \ -I $INITRAMFS \ -O $STEP_DIR/bootfs.iso \ - -U $STEP_DIR/usersfs.img || err 51 + -U $STEP_DIR/usersfs.img || err 61 ;; qemu) - cp $BAREBONES/bzImage $STEP_DIR/kernel || err 60 - cp $INITRAMFS $STEP_DIR/initramfs.cpio.gz || err 61 + cp $BAREBONES/bzImage $STEP_DIR/kernel || err 70 + cp $INITRAMFS $STEP_DIR/initramfs.cpio.gz || err 71 - tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 62 + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 72 ;; tar) @@ -133,12 +146,12 @@ case $MACHINE in -B $STEP_DIR/barebones \ -F $PLATFORM \ -I $STEP_DIR/initramfs \ - -O $STEP_DIR/bootfs.tar.gz || err 70 + -O $STEP_DIR/bootfs.tar.gz || err 80 - cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 71 + cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 81 # Delete temporal initrams - rm -f $STEP_DIR/barebones $STEP_DIR/initramfs || err 72 + rm -f $STEP_DIR/barebones $STEP_DIR/initramfs || err 82 ;; vagga) @@ -146,27 +159,41 @@ case $MACHINE in gunzip $STEP_DIR/barebones -c | \ tar --delete dev/console sbin/init | \ - gzip > $STEP_DIR/barebones.tar.gz || err 80 + gzip > $STEP_DIR/barebones.tar.gz || err 90 - mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 81 + mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 91 - cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 82 + cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 92 # Delete temporal initrams - rm -f $STEP_DIR/barebones || err 83 + rm -f $STEP_DIR/barebones || err 93 ;; *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" - err 90 + err 100 ;; esac ;; raspi|raspi2|raspi3) case $PLATFORM in + disk) + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 110 + + nodeos-bootfs \ + -D $BAREBONES/dts \ + -F $PLATFORM \ + -K $BAREBONES/zImage \ + -I $INITRAMFS \ + -O $STEP_DIR/disk.img \ + -U $STEP_DIR/usersfs.img || err 111 + + rm -f $STEP_DIR/usersfs.img || err 112 + ;; + img) - tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 100 + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 120 nodeos-bootfs \ -D $BAREBONES/dts \ @@ -174,27 +201,30 @@ case $MACHINE in -K $BAREBONES/zImage \ -I $INITRAMFS \ -O $STEP_DIR/bootfs.img \ - -U $STEP_DIR/usersfs.img || err 101 + -U $STEP_DIR/usersfs.img || err 121 ;; qemu) - cp $BAREBONES/zImage $STEP_DIR/kernel || err 110 - cp $BAREBONES/dts $STEP_DIR/dts || err 111 - cp $INITRAMFS $STEP_DIR/initramfs.cpio.gz || err 112 + cp $BAREBONES/zImage $STEP_DIR/kernel || err 130 + + mkdir -p $STEP_DIR/dts && + cp -r $BAREBONES/dts/* $STEP_DIR/dts || err 131 + + cp $INITRAMFS $STEP_DIR/initramfs.cpio.gz || err 132 - tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 113 + tar2ext $USERSFS nodeos 1 1 $STEP_DIR/usersfs.img || err 133 ;; *) echo -e "${RED}Unknown platform '$PLATFORM'${CLR}" - err 120 + err 140 ;; esac ;; *) echo -e "${RED}Unknown machine '$MACHINE'${CLR}" - exit 130 + exit 150 ;; esac diff --git a/scripts/postbuild b/scripts/postbuild index 507c6b8ca..f85dd895b 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -18,30 +18,6 @@ fi OUT_DIR=`pwd`/out/$CPU_FAMILY/$MACHINE/$PLATFORM -# Disk images are a composition of bootfs and usersfs -function createDiskImage() { - DISK=$OUT_DIR/disk.img - - # ToDo: sizes would need to be on cylinders and retain DOS compatibility - # http://elinux.org/RPi_Advanced_Setup#Advanced_SD_card_setup - - BOOTFS=$OUT_DIR/bootfs.img - USERSFS=$OUT_DIR/usersfs.img - - SIZE_MBR=$((2*1024)) # Reserve first megabyte for MBR and partitions table - SIZE_BOOTFS=$(stat -L -c%s "$BOOTFS") - SIZE_BOOTFS=$(($SIZE_BOOTFS/512)) - START_USERSFS=$(($SIZE_MBR+$SIZE_BOOTFS)) - - dd if=/dev/zero of=$DISK count=$SIZE_MBR && - dd if=$BOOTFS of=$DISK seek=$SIZE_MBR && - dd if=$USERSFS of=$DISK seek=$START_USERSFS || exit 10 - - eval "echo \"$(< resources/sfdisk.txt)\"" | \ - /sbin/sfdisk -uS --force $DISK || exit 11 -} - - if [[ ! -z "$RELEASE" ]]; then ZIP_FILE=prebuilds/$CPU_FAMILY-$MACHINE-$PLATFORM.zip @@ -52,8 +28,6 @@ if [[ ! -z "$RELEASE" ]]; then pc) case $PLATFORM in disk) - createDiskImage || exit $? - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && cat resources/runners/disk.sh >> /tmp/run.sh || exit 30 @@ -140,8 +114,6 @@ if [[ ! -z "$RELEASE" ]]; then raspi|raspi2|raspi3) case $PLATFORM in disk) - createDiskImage || exit $? - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && cat resources/runners/disk.sh >> /tmp/run.sh || exit 30 @@ -154,17 +126,16 @@ if [[ ! -z "$RELEASE" ]]; then ;; img) - createDiskImage || exit $? - eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/disk.sh >> /tmp/run.sh || exit 80 + cat resources/runners/img.sh >> /tmp/run.sh || exit 80 chmod +x /tmp/run.sh && zip -j $ZIP_FILE /tmp/run.sh || exit 81 zip -j $ZIP_FILE \ resources/runners/README.md \ - $OUT_DIR/disk.img || exit 82 + $OUT_DIR/bootfs.img \ + $OUT_DIR/usersfs.img || exit 82 ;; qemu) diff --git a/scripts/start b/scripts/start index edb4bd3fe..568aa5cf0 100755 --- a/scripts/start +++ b/scripts/start @@ -37,6 +37,10 @@ switch(process.argv[2]) const outDir = join('out', cpu_family, machine, platform) switch(platform) { + case 'disk': + args.push('-hda', join(outDir, 'disk.img')) + break + case 'docker': command = 'scripts/docker' args = [] diff --git a/scripts/test b/scripts/test index 30031f8d0..6f35ec733 100755 --- a/scripts/test +++ b/scripts/test @@ -46,6 +46,10 @@ var args = const outDir = join('out', cpu_family, machine, platform) switch(type) { + case 'disk': + args.push('-hda', join(outDir, 'disk.img')) + break + case 'docker': command = 'docker' args = From 6543c0771f0a0e0f702a7e0b455e2a1b170860f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 20 Feb 2017 01:00:12 +0100 Subject: [PATCH 161/206] Fix test of disk images --- scripts/test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/test b/scripts/test index 6f35ec733..46074f969 100755 --- a/scripts/test +++ b/scripts/test @@ -122,10 +122,10 @@ switch(type) // Exec test -exe = suppose(command, args, {stripAnsi: true}) +exe = suppose(command, args, {stripAnsi: true, debug: process.argv[2] === 'debug'}) // On disk images, hook on the bootloader and force kernel to output to console -if(type === 'img' || type === 'iso') +if(type === 'disk' || type === 'img' || type === 'iso') exe.when('boot: ').respond('NodeOS console=ttyS0\n') exe.when('username: ') From 78e3745853f24276eb0f34825473eafd1a8eca5d Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Fri, 24 Feb 2017 21:24:24 +0100 Subject: [PATCH 162/206] Added default user info to prebuilt readme --- resources/runners/README.md | 15 +++++++++++++-- resources/runners/README_docker.md | 13 +++++++++++++ resources/runners/README_vagga.md | 14 ++++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/resources/runners/README.md b/resources/runners/README.md index 710b3c512..c71d2bfb6 100644 --- a/resources/runners/README.md +++ b/resources/runners/README.md @@ -2,5 +2,16 @@ This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at [NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. -To run this demo, simply exec the ```run.sh``` script. You'll need to have -[QEmu](http://wiki.qemu.org/Main_Page) installed. +# Getting started +This pre-build requires [QEmu](http://wiki.qemu.org/Main_Page). +Please make sure that it's installed. + +To run this demo, simply exec the ```run.sh``` script. + +You should be greeted by the NodeOS-usersfs. +It will ask you for a username and a password. +``` +$ username: nodeos +$ password: nodeos +``` +If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) diff --git a/resources/runners/README_docker.md b/resources/runners/README_docker.md index c01164f58..09a474a84 100644 --- a/resources/runners/README_docker.md +++ b/resources/runners/README_docker.md @@ -4,3 +4,16 @@ can find info about how to build your own users filesystem at To run this demo, simply exec the ```run.sh``` script. You'll need to have [Docker](https://www.docker.com) installed. + +# Getting started +You'll need to have [Docker](https://www.docker.com) installed. + +To run this demo, simply exec the ```run.sh``` script. + +You should be greeted by the NodeOS-usersfs. +It will ask you for a username and a password. +``` +$ username: nodeos +$ password: nodeos +``` +If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) diff --git a/resources/runners/README_vagga.md b/resources/runners/README_vagga.md index ac859d6ec..f9cec46a0 100644 --- a/resources/runners/README_vagga.md +++ b/resources/runners/README_vagga.md @@ -2,5 +2,15 @@ This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at [NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. -To run this demo, simply exec ```vagga run```. You'll need to have -[vagga](https://github.com/tailhook/vagga) installed. +# Getting started +You'll need to have [vagga](https://github.com/tailhook/vagga) installed. + +To run this demo, simply exec ```vagga run```. + +You should be greeted by the NodeOS-usersfs. +It will ask you for a username and a password. +``` +$ username: nodeos +$ password: nodeos +``` +If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) From ea69073e73bdcbbcbf37c588b10be854b69c4996 Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Sun, 26 Feb 2017 21:48:36 +0100 Subject: [PATCH 163/206] Added ISO image information to readme --- resources/runners/README.md | 16 ++++++++++++++-- resources/runners/README_docker.md | 10 +++++----- resources/runners/README_vagga.md | 7 +++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/resources/runners/README.md b/resources/runners/README.md index c71d2bfb6..eec250409 100644 --- a/resources/runners/README.md +++ b/resources/runners/README.md @@ -1,12 +1,13 @@ +# NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at [NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. -# Getting started +## Getting started This pre-build requires [QEmu](http://wiki.qemu.org/Main_Page). Please make sure that it's installed. -To run this demo, simply exec the ```run.sh``` script. +To run this demo, simply exec the ```run.sh``` script in the root directory. You should be greeted by the NodeOS-usersfs. It will ask you for a username and a password. @@ -15,3 +16,14 @@ $ username: nodeos $ password: nodeos ``` If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) + +## Burning to CD or USB +The ISO release can be burned to a CD-R or a USB flashdrive. +However it will run as readonly which means everything is handled in memory and it will be +lost on shutdown. + +You can you can use the script `bin/installUSB`, which will automatically create a read/write filesystem. +The script will use the remaining space on the USB drive for the filesystem. + +## What now? +When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) \ No newline at end of file diff --git a/resources/runners/README_docker.md b/resources/runners/README_docker.md index 09a474a84..6050d60dc 100644 --- a/resources/runners/README_docker.md +++ b/resources/runners/README_docker.md @@ -1,14 +1,12 @@ +#NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at [NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. -To run this demo, simply exec the ```run.sh``` script. You'll need to have -[Docker](https://www.docker.com) installed. - -# Getting started +## Getting started You'll need to have [Docker](https://www.docker.com) installed. -To run this demo, simply exec the ```run.sh``` script. +To run this demo, simply exec the ```run.sh``` script in the root directory. You should be greeted by the NodeOS-usersfs. It will ask you for a username and a password. @@ -17,3 +15,5 @@ $ username: nodeos $ password: nodeos ``` If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) +## What now? +When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) diff --git a/resources/runners/README_vagga.md b/resources/runners/README_vagga.md index f9cec46a0..2b5e88d1b 100644 --- a/resources/runners/README_vagga.md +++ b/resources/runners/README_vagga.md @@ -1,11 +1,12 @@ +#NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at [NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. -# Getting started +## Getting started You'll need to have [vagga](https://github.com/tailhook/vagga) installed. -To run this demo, simply exec ```vagga run```. +To run this demo, simply exec ```vagga run``` in the root directory. You should be greeted by the NodeOS-usersfs. It will ask you for a username and a password. @@ -14,3 +15,5 @@ $ username: nodeos $ password: nodeos ``` If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) +## What now? +When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) From a1e6bd9dda4273e4de19af47cc8b3f0898b3d4dd Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Sun, 26 Feb 2017 22:00:27 +0100 Subject: [PATCH 164/206] Fixed typo in qemu script, preventing it from starting --- resources/runners/qemu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/runners/qemu.sh b/resources/runners/qemu.sh index 8253fe06f..34033ab62 100644 --- a/resources/runners/qemu.sh +++ b/resources/runners/qemu.sh @@ -20,7 +20,7 @@ $QEMU \ -m 256M \ -redir tcp:50080::80 \ -redir tcp:50443::443 \ - --kernel keernel \ + --kernel kernel \ --initrd initramfs.cpio.gz \ -hda usersfs.img \ -append "$APPEND" From d8027ad75a2f8a315799d37dcd09cec6c6fd025d Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Sun, 26 Feb 2017 22:08:16 +0100 Subject: [PATCH 165/206] Fixed a typo --- resources/runners/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/runners/README.md b/resources/runners/README.md index eec250409..ccc1b93ea 100644 --- a/resources/runners/README.md +++ b/resources/runners/README.md @@ -22,7 +22,7 @@ The ISO release can be burned to a CD-R or a USB flashdrive. However it will run as readonly which means everything is handled in memory and it will be lost on shutdown. -You can you can use the script `bin/installUSB`, which will automatically create a read/write filesystem. +You can use the script `bin/installUSB`, which will automatically create a read/write filesystem. The script will use the remaining space on the USB drive for the filesystem. ## What now? From c016fb90f7655666d41acc380386169d6d929b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro?= Date: Mon, 27 Feb 2017 09:50:31 +0100 Subject: [PATCH 166/206] Update qemu.sh --- resources/runners/qemu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/runners/qemu.sh b/resources/runners/qemu.sh index 34033ab62..505679f2c 100644 --- a/resources/runners/qemu.sh +++ b/resources/runners/qemu.sh @@ -20,7 +20,7 @@ $QEMU \ -m 256M \ -redir tcp:50080::80 \ -redir tcp:50443::443 \ - --kernel kernel \ + --kernel kernel \ --initrd initramfs.cpio.gz \ -hda usersfs.img \ -append "$APPEND" From b35afb9288cd4f4a95af6f38fb8da491b6da39e5 Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 17:12:10 +0100 Subject: [PATCH 167/206] Added readme for iso build --- resources/runners/README_iso.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 resources/runners/README_iso.md diff --git a/resources/runners/README_iso.md b/resources/runners/README_iso.md new file mode 100644 index 000000000..fe3ae07f6 --- /dev/null +++ b/resources/runners/README_iso.md @@ -0,0 +1,33 @@ +# NodeOS +This zip file host a pre-build NodeOS instance with a demo users filesystem, you +can find info about how to build your own users filesystem at +[NodeOS-usersfs](node_modules/nodeos-usersfs/README.md) package. + +## Getting started +This pre-build requires [QEmu](http://wiki.qemu.org/Main_Page). +Please make sure that it's installed. + +To run this demo, simply exec the ```run.sh``` script in the root directory. + +You should be greeted by the NodeOS-usersfs. +It will ask you for a username and a password. +``` +$ username: nodeos +$ password: nodeos +``` +If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) + +## Burning to CD or USB +This is the ISO release, so it can be burned to a CD-R or a USB flashdrive. +However it will run as readonly which means everything is handled in memory and it will be +lost on shutdown. + +You can use the script `bin/installUSB`, which will automatically create a read/write filesystem. +You must provide the script with the device to write to, the rootfs and the usersfs files. + +*Tip: run the script with no arguments for the usage* + +The script will use the remaining space on the USB drive for the filesystem. + +## What now? +When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) \ No newline at end of file From 7ea02c552d767894044f4d00df67de4d6f106fd4 Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 17:12:36 +0100 Subject: [PATCH 168/206] Removed iso burning info from other readme's --- resources/runners/README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/resources/runners/README.md b/resources/runners/README.md index ccc1b93ea..60189a3ce 100644 --- a/resources/runners/README.md +++ b/resources/runners/README.md @@ -17,13 +17,5 @@ $ password: nodeos ``` If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) -## Burning to CD or USB -The ISO release can be burned to a CD-R or a USB flashdrive. -However it will run as readonly which means everything is handled in memory and it will be -lost on shutdown. - -You can use the script `bin/installUSB`, which will automatically create a read/write filesystem. -The script will use the remaining space on the USB drive for the filesystem. - ## What now? When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) \ No newline at end of file From 024cd4d6ab5e05fc7680f99d2ee7d8074f10b6dc Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 17:13:07 +0100 Subject: [PATCH 169/206] New readme for iso --- scripts/postbuild | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/postbuild b/scripts/postbuild index f85dd895b..76bf93d5d 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -73,10 +73,10 @@ if [[ ! -z "$RELEASE" ]]; then chmod +x /tmp/run.sh && zip -j $ZIP_FILE /tmp/run.sh || exit 41 - zip -j $ZIP_FILE \ - resources/runners/README.md \ - $OUT_DIR/bootfs.iso \ - $OUT_DIR/usersfs.img || exit 42 + zip -j $ZIP_FILE \ + resources/runners/README_iso.md \ + $OUT_DIR/bootfs.iso \ + $OUT_DIR/usersfs.img || exit 42 ;; qemu) From 180f51e68ba190cdf0c271572755e4a7b2a7f49f Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 17:55:34 +0100 Subject: [PATCH 170/206] Add flashing script to iso build --- scripts/postbuild | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/postbuild b/scripts/postbuild index 76bf93d5d..b89edcb76 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -75,6 +75,7 @@ if [[ ! -z "$RELEASE" ]]; then zip -j $ZIP_FILE \ resources/runners/README_iso.md \ + bin/installUSB \ $OUT_DIR/bootfs.iso \ $OUT_DIR/usersfs.img || exit 42 ;; From 7c498f5eb7261ca4457847dd92e26e920724fe61 Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 18:42:13 +0100 Subject: [PATCH 171/206] cp to temp to avoid postfix --- scripts/postbuild | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/postbuild b/scripts/postbuild index b89edcb76..7c7686b9f 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -68,13 +68,14 @@ if [[ ! -z "$RELEASE" ]]; then iso) eval "echo -e \"$(< resources/runners/runner_header.sh)\"" > /tmp/run.sh && - cat resources/runners/iso.sh >> /tmp/run.sh || exit 40 + cat resources/runners/iso.sh >> /tmp/run.sh && + cp resources/runners/README_iso.md /tmp/README.md || exit 40 chmod +x /tmp/run.sh && zip -j $ZIP_FILE /tmp/run.sh || exit 41 zip -j $ZIP_FILE \ - resources/runners/README_iso.md \ + /tmp/README.md \ bin/installUSB \ $OUT_DIR/bootfs.iso \ $OUT_DIR/usersfs.img || exit 42 From 31a1246fcc3c457e0f49dc8d700d14c02f7f54de Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 18:42:25 +0100 Subject: [PATCH 172/206] Changed path to match location --- resources/runners/README_iso.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/runners/README_iso.md b/resources/runners/README_iso.md index fe3ae07f6..92ac2c194 100644 --- a/resources/runners/README_iso.md +++ b/resources/runners/README_iso.md @@ -22,7 +22,7 @@ This is the ISO release, so it can be burned to a CD-R or a USB flashdrive. However it will run as readonly which means everything is handled in memory and it will be lost on shutdown. -You can use the script `bin/installUSB`, which will automatically create a read/write filesystem. +You can use the script `installUSB`, which will automatically create a read/write filesystem. You must provide the script with the device to write to, the rootfs and the usersfs files. *Tip: run the script with no arguments for the usage* From 125ffe88b6e6318c7d8a218d1ea3d01fc1f594cb Mon Sep 17 00:00:00 2001 From: Niclas Sommer Date: Tue, 28 Feb 2017 18:45:31 +0100 Subject: [PATCH 173/206] Add readme to img --- scripts/postbuild | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/postbuild b/scripts/postbuild index 7c7686b9f..dc4f6d9d3 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -61,9 +61,10 @@ if [[ ! -z "$RELEASE" ]]; then chmod +x /tmp/run.sh && zip -j $ZIP_FILE /tmp/run.sh || exit 31 - zip -j $ZIP_FILE \ - $OUT_DIR/bootfs.img \ - $OUT_DIR/usersfs.img || exit 32 + zip -j $ZIP_FILE \ + resources/runners/README.md \ + $OUT_DIR/bootfs.img \ + $OUT_DIR/usersfs.img || exit 32 ;; iso) From ddac4e7659366b76d409a428f50f2fa3a98feebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Wed, 15 Mar 2017 22:03:35 +0100 Subject: [PATCH 174/206] Updated readme --- README.md | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index f7acfd8c3..15b7ec044 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ Lightweight operating system using [Node.js](http://nodejs.org) as userspace. NodeOS is an operating system build entirely in Javascript and managed by [npm](https://www.npmjs.com). Any package in `npm` is a NodeOS package, which at -last count was 301,660 packages. The goal of NodeOS is to provide just enough to -let `npm` provide the rest. Since anyone can contribute to it, anyone can create -NodeOS packages. +last count was more than 400,000 packages. The goal of NodeOS is to provide just +enough to let `npm` provide the rest. Since anyone can contribute to it, anyone +can create NodeOS packages. This project won the spanish [9th National Free Software Championship](https://www.concursosoftwarelibre.org/1415) on the Systems category and was Honorable Mention of its [10th edition](https://www.concursosoftwarelibre.org/1516). @@ -47,16 +47,15 @@ adjust better to each target platform, but the general structure is: - *barebones* custom Linux kernel with an initramfs that boots to a Node.js REPL - *initramfs* Initram environment to mount the users partition & boot the system -- *rootfs* Read-only partition image to host Linux kernel and initramfs files - *usersfs* multi-user environment with the same behaviour of traditional OSes ### Booting process All the layers are bootable, leading *barebones* to a raw naked Node.js -[REPL](http://nodejs.org/api/repl.html) prompt as PID 1, while *initramfs* (and -by extension *rootfs*) exec actual NodeOS code to mount the *usersfs* partition. -In all the cases, it will be used an initramfs as root filesystem and all the -changes will be lost when powered-off. +[REPL](http://nodejs.org/api/repl.html) prompt as PID 1, while *initramfs* exec +actual NodeOS code to mount the *usersfs* partition. In all the cases, it will +be used an initramfs as root filesystem and all the changes will be lost when +powered-off. If a *usersfs* partition is being set at boot time, it will be mounted and the system will considerate each one of its folders as the home folder for a valid @@ -67,15 +66,15 @@ permissions once the system has booted. ### Hacking -If you are hacking on NodeOS as a somewhat production server, you are likely -building *usersfs* images since each user is isolated of others, but you can be -able to customize all layers. For example, you could be able to modify +If you are hacking on NodeOS for a somewhat production environment, you are +likely building *usersfs* images since each user is isolated of others, but you +can be able to customize all layers. For example, you could be able to modify *initramfs* to login the users and mount their home folders from a cloud service or craft a system without global services (no `root` user) or also dedicate a full NodeOS instance to a single Node.js application. -# Pre-built Images +## Pre-built Images Ready to use [pre-build images](https://github.com/NodeOS/NodeOS/releases) are automatically generated after each commit in master branch that sucessfully @@ -90,7 +89,7 @@ pendrive, it's recomended to do it by using `bin/installUSB` command so it will create automatically a read-write usersfs partition to fill the remaining space so your changes will persist. -# Build NodeOS in five steps +## Build NodeOS in five steps 1. Download the project source code: @@ -112,7 +111,7 @@ so your changes will persist. npm install ``` -3. Build NodeOS: +4. Build NodeOS: ```bash npm run build @@ -123,8 +122,6 @@ so your changes will persist. process by passing some environment variables. For example, to force to build for 32 bits, use `PLATFORM=qemu_32 npm install` instead. -4. Pick some microwave pop-corn and go to see a movie. No, really, do it. - 5. Exec your fresh compiled NodeOS image: ```bash @@ -140,17 +137,18 @@ If you encounter an error when building NodeOS, take a look at [the wiki](https://github.com/NodeOS/NodeOS/wiki/Fixing-NodeOS-Build-Errors) or open an [issue](https://github.com/NodeOS/NodeOS/issues). -# NodeOS on LXC containers (Docker and vagga) +## NodeOS on LXC containers (Docker and vagga) + +NodeOS fully officially supports Docker, although is not publishing the images +on DockerHub (pull-requests welcome), so they are totally outdated. If you are +interested in help or testing, you can build them from source code. -Currently LXC containers support is unmaintained due to the inability to mount -filesystems from inside them. There are some NodeOS images on Docker Hub, but -they are totally outdated. If you are interested in help or testing, you can -build them from source code. +Vagga support is fairly experimental, and help here will be greatly appreciated. -## Quick Start +### Quick Start 1. [Install Docker](http://docs.docker.io/en/latest/installation/) -2. One Liner +2. One Liner (outdated images) ```bash sudo docker run -t -i nodeos/nodeos @@ -158,7 +156,7 @@ build them from source code. or learn how to make a [Custom Build](http://node-os.com/blog/get-involved) -## Build from Source +### Build from Source *Warning*: the build process is hairy, it probably won't work the first time. I'm working on that. From 0d2d3cd8a2fd765c12c004fbf98427484ec6c88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Wed, 15 Mar 2017 22:38:42 +0100 Subject: [PATCH 175/206] Stick to 80-columns for `Contribuing.md` file --- Contributing.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Contributing.md b/Contributing.md index 6f2a1006e..029f96dae 100644 --- a/Contributing.md +++ b/Contributing.md @@ -7,14 +7,16 @@ This repository is for: 3. high-level planning You should feel free to shoot from the hip when posting issues. -Having said that, please take a moment to *search* for [open issues](https://github.com/NodeOS/NodeOS/issues "open issues on NodeOs") before posting. -Long threads are okay. +Having said that, please take a moment to *search* for +[open issues](https://github.com/NodeOS/NodeOS/issues "open issues on NodeOs") +before posting. Long threads are okay. ## Contributing FAQ > Why not a mailing list? -1. it's *yet another* point of contact. This repo should be your single source of truth in exploring node-os. +1. it's *yet another* point of contact. This repo should be your single source + of truth in exploring node-os. 2. github issues can be setup to mail you, and you can reply from email 3. better linking to actual code 4. markdown is good From ddb4a6daed607066f590fb37aab5036ae365ed19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Wed, 15 Mar 2017 22:39:46 +0100 Subject: [PATCH 176/206] Added license text on all files --- .gitignore | 7 +++++++ Contributing.md | 9 +++++++++ LICENSE.txt | 2 +- README.md | 13 +++++++++++++ Vagrantfile | 7 +++++++ bin/install-dependencies | 7 +++++++ bin/installUSB | 6 ++++++ resources/Dockerfile | 7 +++++++ resources/runners/README.md | 11 ++++++++++- resources/runners/README_docker.md | 9 +++++++++ resources/runners/README_iso.md | 13 +++++++++++-- resources/runners/README_vagga.md | 9 +++++++++ resources/runners/disk.sh | 7 +++++++ resources/runners/docker.sh | 7 +++++++ resources/runners/img.sh | 7 +++++++ resources/runners/iso.sh | 7 +++++++ resources/runners/qemu.sh | 7 +++++++ resources/runners/runner_header.sh | 7 +++++++ resources/vagga.yaml | 7 +++++++ scripts/BigRedButton | 7 +++++++ scripts/build | 7 +++++++ scripts/docker | 7 +++++++ scripts/dockerBuild | 7 +++++++ scripts/postbuild | 7 +++++++ scripts/postinstall | 7 +++++++ scripts/publish | 9 +++++++++ scripts/start | 9 +++++++++ scripts/test | 9 +++++++++ scripts/unbuild | 7 +++++++ vagga.yaml | 7 +++++++ 30 files changed, 228 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 54b7333cb..9eba4f2c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + node_modules/ npm-debug.log .vagga/ diff --git a/Contributing.md b/Contributing.md index 029f96dae..208fa33f1 100644 --- a/Contributing.md +++ b/Contributing.md @@ -1,3 +1,12 @@ + + ## Overview This repository is for: diff --git a/LICENSE.txt b/LICENSE.txt index d89060479..e060d7545 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2013-2016 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' and +Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' and other contributors This software consists of voluntary contributions made by many individuals. For diff --git a/README.md b/README.md index 15b7ec044..5d205607a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ + + [![Build Status](https://semaphoreapp.com/api/v1/projects/71d72807-779a-40d3-a8d4-523cd0a52eb3/356164/shields_badge.svg)](https://semaphoreapp.com/nodeos/nodeos) [![Stories in Ready](https://badge.waffle.io/NodeOS/NodeOS.png?label=ready&title=Ready)](https://waffle.io/NodeOS/NodeOS) [![Join the chat at https://gitter.im/NodeOS/NodeOS](https://badges.gitter.im/NodeOS/NodeOS.svg)](https://gitter.im/NodeOS/NodeOS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -166,3 +175,7 @@ git clone https://github.com/NodeOS/NodeOS.git cd NodeOS PLATFORM=docker npm install ``` + +## License + +MIT diff --git a/Vagrantfile b/Vagrantfile index 50a40d202..3556a5190 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -1,6 +1,13 @@ # -*- mode: ruby -*- # vi: set ft=ruby : +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + Vagrant.configure(2) do |config| config.vm.box = "ubuntu/trusty64" diff --git a/bin/install-dependencies b/bin/install-dependencies index f6883d383..1d191909d 100755 --- a/bin/install-dependencies +++ b/bin/install-dependencies @@ -1,5 +1,12 @@ #! /usr/bin/env bash +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + set -o pipefail diff --git a/bin/installUSB b/bin/installUSB index 8a64a02d0..5163cbd96 100755 --- a/bin/installUSB +++ b/bin/installUSB @@ -1,5 +1,11 @@ #!/usr/bin/env bash +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License if [ "$#" -ne 3 ]; then echo "Usage: $0 " diff --git a/resources/Dockerfile b/resources/Dockerfile index a3758c0a7..0464ec06a 100644 --- a/resources/Dockerfile +++ b/resources/Dockerfile @@ -1,5 +1,12 @@ # Autogenerated by `npm run dockerBuild` +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + FROM nodeos/barebones MAINTAINER Jesús Leganés Combarro 'piranna' diff --git a/resources/runners/README.md b/resources/runners/README.md index 60189a3ce..f9140bbd4 100644 --- a/resources/runners/README.md +++ b/resources/runners/README.md @@ -1,3 +1,12 @@ + + # NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at @@ -18,4 +27,4 @@ $ password: nodeos If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) ## What now? -When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) \ No newline at end of file +When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) diff --git a/resources/runners/README_docker.md b/resources/runners/README_docker.md index 6050d60dc..ad3004f06 100644 --- a/resources/runners/README_docker.md +++ b/resources/runners/README_docker.md @@ -1,3 +1,12 @@ + + #NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at diff --git a/resources/runners/README_iso.md b/resources/runners/README_iso.md index 92ac2c194..1c934e8cc 100644 --- a/resources/runners/README_iso.md +++ b/resources/runners/README_iso.md @@ -1,3 +1,12 @@ + + # NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at @@ -18,7 +27,7 @@ $ password: nodeos If you run into trouble, please checkout the [troubleshooting here](https://github.com/NodeOS/NodeOS/wiki/Troubleshooting) ## Burning to CD or USB -This is the ISO release, so it can be burned to a CD-R or a USB flashdrive. +This is the ISO release, so it can be burned to a CD-R or a USB flashdrive. However it will run as readonly which means everything is handled in memory and it will be lost on shutdown. @@ -30,4 +39,4 @@ You must provide the script with the device to write to, the rootfs and the user The script will use the remaining space on the USB drive for the filesystem. ## What now? -When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) \ No newline at end of file +When you have NodeOS up and running you should take a look at the [commands](https://github.com/NodeOS/NodeOS/wiki/Commands) diff --git a/resources/runners/README_vagga.md b/resources/runners/README_vagga.md index 2b5e88d1b..b732cd3c8 100644 --- a/resources/runners/README_vagga.md +++ b/resources/runners/README_vagga.md @@ -1,3 +1,12 @@ + + #NodeOS This zip file host a pre-build NodeOS instance with a demo users filesystem, you can find info about how to build your own users filesystem at diff --git a/resources/runners/disk.sh b/resources/runners/disk.sh index 06e0a1360..b24072522 100644 --- a/resources/runners/disk.sh +++ b/resources/runners/disk.sh @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + while [ ! $# -eq 0 ] do case "$1" in diff --git a/resources/runners/docker.sh b/resources/runners/docker.sh index 2e5d3f5f1..2b306f750 100644 --- a/resources/runners/docker.sh +++ b/resources/runners/docker.sh @@ -1,5 +1,12 @@ #!/usr/bin/env sh +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + docker import barebones.tar.gz nodeos/barebones docker build -t nodeos/initramfs . diff --git a/resources/runners/img.sh b/resources/runners/img.sh index 99be1bedd..4c1a2f208 100644 --- a/resources/runners/img.sh +++ b/resources/runners/img.sh @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + while [ ! $# -eq 0 ] do case "$1" in diff --git a/resources/runners/iso.sh b/resources/runners/iso.sh index 8d8eb30e6..23a7ada1b 100644 --- a/resources/runners/iso.sh +++ b/resources/runners/iso.sh @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + while [ ! $# -eq 0 ] do case "$1" in diff --git a/resources/runners/qemu.sh b/resources/runners/qemu.sh index 505679f2c..a7dfeff92 100644 --- a/resources/runners/qemu.sh +++ b/resources/runners/qemu.sh @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + APPEND="root=/dev/sda ip=dhcp vga=0x344" while [ ! $# -eq 0 ] do diff --git a/resources/runners/runner_header.sh b/resources/runners/runner_header.sh index fe32f6c20..6176fa074 100644 --- a/resources/runners/runner_header.sh +++ b/resources/runners/runner_header.sh @@ -1,3 +1,10 @@ #!/usr/bin/env sh +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + QEMU=qemu-system-$CPU_FAMILY diff --git a/resources/vagga.yaml b/resources/vagga.yaml index ba06118c4..aaf047cc9 100644 --- a/resources/vagga.yaml +++ b/resources/vagga.yaml @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + containers: NodeOS: setup: diff --git a/scripts/BigRedButton b/scripts/BigRedButton index 172b4722a..53f5a3aff 100755 --- a/scripts/BigRedButton +++ b/scripts/BigRedButton @@ -1,5 +1,12 @@ #!/usr/bin/env bash +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + # This script should generate all the possible build combinations of NodeOS and # test them by being able to login and exec a Node.js REPL. In some cases This # is not fully possible and so they should be improved in the future diff --git a/scripts/build b/scripts/build index 545e5bb4b..6c70706d7 100755 --- a/scripts/build +++ b/scripts/build @@ -1,5 +1,12 @@ #!/usr/bin/env bash +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + set -o pipefail diff --git a/scripts/docker b/scripts/docker index a0edff819..aaff566a5 100755 --- a/scripts/docker +++ b/scripts/docker @@ -1,5 +1,12 @@ #!/usr/bin/env sh +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + docker run -it \ --cap-add SYS_ADMIN \ --security-opt=apparmor:unconfined \ diff --git a/scripts/dockerBuild b/scripts/dockerBuild index 8c549e1b3..d7418752e 100755 --- a/scripts/dockerBuild +++ b/scripts/dockerBuild @@ -1,5 +1,12 @@ #!/usr/bin/env bash +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + set -o pipefail diff --git a/scripts/postbuild b/scripts/postbuild index dc4f6d9d3..3a57f42f0 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -1,5 +1,12 @@ #!/usr/bin/env bash +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + BLD=$(tput bold) GRY="\e[90m" diff --git a/scripts/postinstall b/scripts/postinstall index 7d3722c64..464c3e264 100755 --- a/scripts/postinstall +++ b/scripts/postinstall @@ -1,5 +1,12 @@ #!/usr/bin/env sh +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + # HACK `npm` add all the binaries to the `node_modules/.bin` folder without # matter what package installed it, so `env` from `usrbinenv` gets available on # the `$PATH` during build process, making it to fail since its shebang is diff --git a/scripts/publish b/scripts/publish index 690851df0..dbec97450 100755 --- a/scripts/publish +++ b/scripts/publish @@ -1,5 +1,14 @@ #!/usr/bin/env node +/** + * NodeOS + * + * @copyright 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' + * and other contributors + * + * @license MIT + */ + const readdir = require('fs').readdir const upload = require('prebuild/upload') diff --git a/scripts/start b/scripts/start index 568aa5cf0..d13230b15 100755 --- a/scripts/start +++ b/scripts/start @@ -1,5 +1,14 @@ #!/usr/bin/env node +/** + * NodeOS + * + * @copyright 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' + * and other contributors + * + * @license MIT + */ + var fs = require('fs') var join = require('path').join var spawn = require('child_process').spawn diff --git a/scripts/test b/scripts/test index 46074f969..96e95bd91 100755 --- a/scripts/test +++ b/scripts/test @@ -1,5 +1,14 @@ #!/usr/bin/env node +/** + * NodeOS + * + * @copyright 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' + * and other contributors + * + * @license MIT + */ + var join = require('path').join var fs = require('fs') diff --git a/scripts/unbuild b/scripts/unbuild index f513d6eee..bd58a74c0 100755 --- a/scripts/unbuild +++ b/scripts/unbuild @@ -1,3 +1,10 @@ #!/usr/bin/env sh +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + rm -rf deps/ build/ out/ prebuilds/ || exit $? diff --git a/vagga.yaml b/vagga.yaml index 5976d5b60..b803a59ab 100644 --- a/vagga.yaml +++ b/vagga.yaml @@ -1,3 +1,10 @@ +# NodeOS +# +# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' +# and other contributors +# +# MIT License + containers: bootfs: auto-clean: true From d09298423ab9b5a98088c21c469ad9d7aa87d25a Mon Sep 17 00:00:00 2001 From: h4rvey Date: Mon, 27 Mar 2017 01:13:39 +0300 Subject: [PATCH 177/206] deleted one space :)) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5d205607a..1ec2a666c 100644 --- a/README.md +++ b/README.md @@ -118,10 +118,10 @@ so your changes will persist. ```bash npm install - ``` + ``` 4. Build NodeOS: - + ```bash npm run build ``` From 8130ba68c8c2cee68570495c65f7246091989cc3 Mon Sep 17 00:00:00 2001 From: h4rvey Date: Mon, 27 Mar 2017 17:45:11 +0300 Subject: [PATCH 178/206] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ec2a666c..3d078a24d 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ so your changes will persist. ``` 4. Build NodeOS: - + ```bash npm run build ``` From 74b022b3635406d5dba879eed34c72ace85b5060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Thu, 30 Mar 2017 23:18:58 +0200 Subject: [PATCH 179/206] Clarified license --- LICENSE.txt | 8 -------- README.md | 4 ++++ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index e060d7545..5b783d1ef 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -3,14 +3,6 @@ MIT License Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' and other contributors -This software consists of voluntary contributions made by many individuals. For -exact contribution history, see the revision history available at -https://github.com/NodeOS/NodeOS - -The following license applies to all parts of this software: - -==== - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/README.md b/README.md index 5d205607a..f59f9d6f1 100644 --- a/README.md +++ b/README.md @@ -179,3 +179,7 @@ PLATFORM=docker npm install ## License MIT + +This software consists of voluntary contributions made by many individuals. For +exact contribution history, see the revision history available at +https://github.com/NodeOS/NodeOS From b6f4f51640c2a11bc7f6aca86fefe933f2320955 Mon Sep 17 00:00:00 2001 From: ovidiubute Date: Sun, 30 Apr 2017 10:25:57 +0300 Subject: [PATCH 180/206] Improve style & fix typos --- README.md | 47 +++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 0c561d9fd..302361775 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,12 @@ MIT License Lightweight operating system using [Node.js](http://nodejs.org) as userspace. -NodeOS is an operating system build entirely in Javascript and managed by -[npm](https://www.npmjs.com). Any package in `npm` is a NodeOS package, which at -last count was more than 400,000 packages. The goal of NodeOS is to provide just +NodeOS is an operating system built entirely in Javascript and managed by +[npm](https://www.npmjs.com). Any package in `npm` is a NodeOS package, that means a selection of more than 400.000 packages. The goal of NodeOS is to provide just enough to let `npm` provide the rest. Since anyone can contribute to it, anyone can create NodeOS packages. -This project won the spanish [9th National Free Software Championship](https://www.concursosoftwarelibre.org/1415) +This project won the Spanish [9th National Free Software Championship](https://www.concursosoftwarelibre.org/1415) on the Systems category and was Honorable Mention of its [10th edition](https://www.concursosoftwarelibre.org/1516). It was also presented as the degree thesis of [Jesús Leganes Combarro](https://github.com/piranna) with a qualification of 10/10 with distinction. @@ -64,21 +63,21 @@ All the layers are bootable, leading *barebones* to a raw naked Node.js [REPL](http://nodejs.org/api/repl.html) prompt as PID 1, while *initramfs* exec actual NodeOS code to mount the *usersfs* partition. In all the cases, it will be used an initramfs as root filesystem and all the changes will be lost when -powered-off. +powered off. If a *usersfs* partition is being set at boot time, it will be mounted and the -system will considerate each one of its folders as the home folder for a valid +system will consider each one of its folders as the home folder for a valid user on the system, and will execute a `init` file in the root of each of them. -If found, `root` user will be the first to be considerated and will have access -to all the home directories, but by design it will not be possible to elevate -permissions once the system has booted. +If found, the `root` user will be the first to be considered and will have access +to all of the home directories, but by design it will not be possible to elevate +permissions once the system has finished booting. ### Hacking If you are hacking on NodeOS for a somewhat production environment, you are likely building *usersfs* images since each user is isolated of others, but you -can be able to customize all layers. For example, you could be able to modify -*initramfs* to login the users and mount their home folders from a cloud service +can customize all layers. For example, you can modify +*initramfs* to login users and mount their home folders from a cloud service or craft a system without global services (no `root` user) or also dedicate a full NodeOS instance to a single Node.js application. @@ -90,13 +89,12 @@ automatically generated after each commit in master branch that sucessfully [pass the tests](https://semaphoreapp.com/nodeos/nodeos). To exec them, you'll need to have [QEmu](http://wiki.qemu.org/Main_Page) installed on your system. -The *iso* can be written to a CD-R or flashed to an USB pendrive, but will only -provide the read-only rootfs and the changes will be done in memory loosing them -after reboot, so you'll need to set manually a read-write usersfs partition if -you want to persist them. On the other hand, if you want to flash it to an USB -pendrive, it's recomended to do it by using `bin/installUSB` command so it will -create automatically a read-write usersfs partition to fill the remaining space -so your changes will persist. +The *iso* can be written to a CD-R or flashed to a USB pendrive, but will only +provide the read-only rootfs and the changes will be done in memory losing them +after reboot, so you'll manually need to set a read-write usersfs partition if +you want to persist them. On the other hand, if you want to flash it to a USB +pendrive, I recommended doing it by using `bin/installUSB` command so it will +automatically create a read-write usersfs partition to fill the remaining space and your changes will be persistent. ## Build NodeOS in five steps @@ -107,8 +105,7 @@ so your changes will persist. cd NodeOS ``` -2. Install the required build tools, on a Ubuntu based system you can do it by - executing +2. Install the required build tools. On a Ubuntu based system you can do it by executing: ```bash sudo bin/install-dependencies @@ -127,11 +124,11 @@ so your changes will persist. ``` By default it will generate some files that can be used with QEmu, compiled - for your current machine architecture. You can be able to configure the build + for your current machine architecture. You can configure the build process by passing some environment variables. For example, to force to build for 32 bits, use `PLATFORM=qemu_32 npm install` instead. -5. Exec your fresh compiled NodeOS image: +5. Exec your freshly compiled NodeOS image: ```bash npm start @@ -140,7 +137,7 @@ so your changes will persist. It will automatically detect what CPU architecture will need to be used on QEmu and exec the correct emulation. -...and profit! :-D +...profit! :-D If you encounter an error when building NodeOS, take a look at [the wiki](https://github.com/NodeOS/NodeOS/wiki/Fixing-NodeOS-Build-Errors) or @@ -148,9 +145,7 @@ open an [issue](https://github.com/NodeOS/NodeOS/issues). ## NodeOS on LXC containers (Docker and vagga) -NodeOS fully officially supports Docker, although is not publishing the images -on DockerHub (pull-requests welcome), so they are totally outdated. If you are -interested in help or testing, you can build them from source code. +NodeOS fully officially supports Docker, but the images published to DockerHub are totally outdated (we're accepting PRs!). If you are interested in helping or testing, you can build them from source code. Vagga support is fairly experimental, and help here will be greatly appreciated. From bf25ec926f69e5d46fafe6c51e8a4aaa3c0fee51 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 11 May 2017 19:05:01 +0000 Subject: [PATCH 181/206] docs(readme): add Greenkeeper badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 302361775..d995cc2a2 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ MIT License # NodeOS +[![Greenkeeper badge](https://badges.greenkeeper.io/NodeOS/NodeOS.svg)](https://greenkeeper.io/) + Lightweight operating system using [Node.js](http://nodejs.org) as userspace. NodeOS is an operating system built entirely in Javascript and managed by From 5c63f433b6da4b8fffbb718d5bfd1b298bd047ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 15 May 2017 01:27:57 +0200 Subject: [PATCH 182/206] [docs] Updated layers images --- doc/NodeOS Layer 1 - barebonesfs.png | Bin 0 -> 10443 bytes doc/NodeOS Layer 2 - initramfs.png | Bin 0 -> 13349 bytes doc/NodeOS Layer 3 - usersfs.png | Bin 0 -> 18277 bytes doc/NodeOS bootfs.png | Bin 0 -> 18908 bytes doc/NodeOS layer 1.png | Bin 10426 -> 0 bytes doc/NodeOS layer 2.png | Bin 13320 -> 0 bytes doc/NodeOS layer 3.png | Bin 13953 -> 0 bytes doc/NodeOS layer 4.png | Bin 18764 -> 0 bytes doc/NodeOS.dia | Bin 2563 -> 2553 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/NodeOS Layer 1 - barebonesfs.png create mode 100644 doc/NodeOS Layer 2 - initramfs.png create mode 100644 doc/NodeOS Layer 3 - usersfs.png create mode 100644 doc/NodeOS bootfs.png delete mode 100644 doc/NodeOS layer 1.png delete mode 100644 doc/NodeOS layer 2.png delete mode 100644 doc/NodeOS layer 3.png delete mode 100644 doc/NodeOS layer 4.png diff --git a/doc/NodeOS Layer 1 - barebonesfs.png b/doc/NodeOS Layer 1 - barebonesfs.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdb4417a237bb4123973133c59385aa8db096c9 GIT binary patch literal 10443 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 iFUG|H8m^N*p%$2x)e;&SaRuIjRGw%)E`9hs_% z_pNnxKIg+5R`4OX;tBnWybkxR^H06{a8yj&X`vv*u?10xXn%GH%3{O(Axh=e2}grR z=S>s7lpszi^Bjg8Ayv{0q=f3v}Ol^p58;A1%d8dF=7CLKE5wH0s=iz96kgB z-MUEv+Qh{|L7*ut3g|)#1T#$ye*gY`akRV*p9S3HweRoS&Ou+j znph^E*KJOhbr@*H0|vVs{^zg$!-!t9B5k8kP#v#|FeWNh69oGDrsy^6TKi2_3H8xY zKYCy=(=pJwC+*<8>(br}sh)eXCqVaCu9J?&ZoTOKq_ekG))xOkb8oBZP!vb;T=x+C z-Ofh;@EpbkX?MsKC`< zfJvf#*%v1Lp}*cD8jb6`?SConuV)lkSV;S*Xlui+N(_R7Of4X2(%9V%EhM=8rl-$>7mlaCffJ@iZR+8z4rx5+8`Ff1`%mo#fF(tY?ba= z;?9`HKpUj0VQs3ZrF4R1evnFpody#qB;o_~m9l9nZPxzlvFi{>$Z6*cN}Zmd^KNWMc5z1TE{fwF)0pv}JuoFgDN!t%ulNh}arG7pCz zsO>J=RW?i<1lm!?KSK7;UF0EJYu?(Hm)8>?w z)jvN4;}gQC=39z*ZRH_7F8b$kO^jF!AXdl&hkvlpYj(a9+q|6dh0)y!;KxxUh|s1E z1V<%?8C1HY^f;HO3tr?f9`E^jSoT9fHc3}AudB{+^QhR{qN21T+o&nM;vK!mZA09O zk>r)Ga)x%WB(tYH79-7!*YiErDJ=l0?$M#0cMdf74HvUUv0?|B4NwB|4GC2;xxGQd z-=)UZQiC&2oimlQDA9|#eb4krIwo}%ML*R+p{490QI*3=REH&T#sFiix#@U292=jI zMNZe%WsjogF01$RO8{a1gDKwMkWjA2^Te^5_uja$2K&#;m(*L{t^;F$u|6t*S~0U@ zr5(kbAFWP1zqT4VtRX$z*e8>E0?6~Y=&lCpN4Ev#ZX^Ily!JP#~Hr5=w>cCWNG zEyiy;u6Q-<_^QbWf0l{1{2G{foptEp0A9!Z<>uACt_;3R1E5#ua@p`BARWJzojVY!UN*2k%iBrw|bJ5k&rLjhXe7yc}G(0AFaPGOOh%&8%)Y%j{Z@YvG8yDCh^F7s}4A*f`bwdk!ENX@3J>Ol%M(ngC3}^VqjfrcKl?GQ783PriH}(2^5(R*FQ7(g01ELE8Y6~W>dl}uPC0F?B z(y~t3A_Y`o{=y|T5L#WYlq;m^0&Ogqf4-)78wDlyH{%~ZxX&9TUq|`+^gmlf*4Lq+ zEtXwjhm_=)GpQxOHv01qJoj6^!77qu$j_;oTm2Un(JMl|__(0|sU-y@V$|WSpx_@| zk!Yo#LjDobj>i^gCXJ5evCy9vHZOL??f0Q_7T5l;kAh8e&&$f1CKp$D&+_@Nye*6hfwt6 zdVR6FdrnK6_xG`X@Yxw9a#79AyI|w{)zO{v$IFepeOKn2BZI#=$SV!6TASOgww@7= z=}2n*-qOB5&%bR?hnlR`t3M5dzo;rc>`r$clo)GZmi5)}`?9sasNa@o^LuUohvep^ z23HS~w_hJBs|=Xsf?P3)tOasYy0(l4-ls_N*U;oV*)Ij$a8`RYyybuH(7_vYIH*bO zWeuHXXHrvjY_e4L!SG8BxH?27f=a!1_z^K4{*Y~M*Z(4D{QTQp^4^1RqIb#yS!?h% z@@&A3vg+a=KA5J;?~~&5WDMxsePF2UL$#$^(pmt&1H)NMa-Zrpn75oS@hJ8|(V)L)9q)vcZoKOxnIKXS;e6X-sz zrU;RkeSBz1{u35>-VGHUh2$i*rJMU*U24O}Pc~o_z4?le#`S_h{W*_kyBHcpR-zbP zx1O55bRHX-${3y8px%Dk=&+17pCZOI<+G0F-^om>rpsYntl78TI6F|HEg2I8I$%V| zJS4I~;?*lyqQ*{spw6eN{CB61b9(qwIwp9i4ntj$GrT4AX__l-C#Uf7wU53v^qrPh zU&EbrUXw0gGGd^KKjw?yRDOri!<3jih--sQ*F3XD%YL~x>ZGymw0(4qS`@v9a8E@m z9RgLd0PW{KI@)th@USNZeXv!XfFH-$V`PQ?fcOx2^U)W%p-IE4r{QO{ZxX~igdhzdBWR>NsuBgV=0kI{iWe`Y9T|_ifLf zp62b{Im$i{y}H{!f?o@Y6J0_Ni0_q6^}BM)lDpS$1%RjEE!ZI6rDwR7o|{fPDmrZu zl}bIdz+OC*#K@B2|1f~ck~`skhX<(Kk&`N7z{ zm%P2Q`&$$%^5r0ch2oi!QkP16I?NZP%B1`nUJftM)>EJLfgH&;*VZ7Q)o1l+$4(qY zY>rCFcT4firh1oDO9y@>Fa_=Ze76HUkwIgyO<`~)u{3b%Sb1 zI5k@xQ-V2>Uo2YrWv4{dUOUyR+$+@U-Nx$*1C%D~4YMg!RttuYR}m&^4CX6NWL1q( zF;F4F&)L^UdZ3f5gUpFG`F3Kmj*~mSfaPdz-ArmXQ_^+kU$b)txV12Je@SkjkW3^5 z(S&)&U?F@Dv+G#ud9%Zc}>8^+QQp~T&!H$9%L=zE`N@N z%s%diD^HpjAsK;{ERYhOWAFCgN(o2P_jlJ#QibiO!b10PoASk9?d8S}FZ*srr;x-P zM0d0F+G1E5+^Ejw%V~Q*`A>7p?k1&}_$+LU6>y$9%jpNSD=ZSW?_P_^Fx*mazNKa$ zpcXiljV_qU2g~Pwt4ejo+Xn6a z3e`{ydn_L11TJn9RoYJ9lO?+b(`y@hE8jY3@xXf?HgJq3mk({nIEAtf+TXe5{o`BI zX>R7x$jR}Ixi>Bs>Q{6dcu3W0=%W3(FoujgY^mkzh1LtXvOD`pT}+GJolo#(tGksK zmi;T#t*x6|)nG2@^0l34{8<%Lm1SHGOz83*Ym3(9#eM(%&F?=%APzzhl!8hUQl+y* zn3t2QMTHz6U$@WlIguCL8y5ZsXG3=<$J8o$lEQ|T`oFZj>%?Zb2gY2Iz47p-E0~mX z%EwLjZPAg8QrHr*Kq4kpVE@`u;=ODf7lczeNo6T}6Qctw)QB7AW+Fl;@aMTL^(y{O zI%`kstRb)AlDz6*odSNF8ljRm6CS&V)%iy`WOKEk4ppurjT`Q-H~rVB@g)OX$agaj ztPSDt*Gf!6V->gk)GKCq=9SeIgA^N9{Gx8MN*APkd_DT9ZU81m+}D!DFORM-r3YT3 z1r?0yzuLDA2J zey9+(>ZKLEZ%0vx5_~~;QP+toz<@1bQIQg^j~>C{uL9=R(LX=gax;D5l3HrHs}6kz zH{*_(pq>7yH-ry10}NN?+DD_jETQ|)pl2rEvQ=33@kq-{Y1Kj-rgP1N>(jH4Y_f{I z_SW1CJ??U@K*GCMj2P^+cP|lDG3H~8Q-HI;s~aX}-t`(Oc^K-gm9$>Kn8oj!_?hp# zYm;90KI>@lxWMf)&Sr5$$Vx+?buh9+_=mjPuaKL|sgl*L=l$eZw_|5AKK3XSeNeg7 z>*^lV7RH|BVzx86NktI+)Ltkr?U+~E78|oLv*R*8^;hVM;lo`1z)k`R6N;7HKU-Qs= zU-rR!4B0c{{$TPx&_B>JXF7a16sSI#k!bg%vut|;Ol*VolACjfpMBde45;4Ud zUe~XjtC;3jxk%}gU}C@BVawj4C0MoXk8Hx9&m& zNmb*i4cm`S^9ZUWzi9o=5**+TOzY}IYaM+fAZylssdr)2j<(Tuc6OHIM~C^HnUZ-b zTVIWDm;MsiYiZKzt4Iu|;O%zV6(yo-ubw#`-FqXiJFYP<0-gk)z$DN(V#v-NqiZb) z;ZqT(ZYbPLek@ilz(073qGeGv7oo#`mBpH z%ab2a%KO>JF}@fE?s7Rq=f1=Al?&u;V)|xDb#UN5sjACqmgi}K{p4p~qirLz$%T8? z9UuDBlvE>5M19!k3^91d)?!Xuo^>{N9FQm`1D;bRpo$q>){!5fJ=pbKQfiPd*!u#9 z55#%TEiFzI_{=M&HLUA45E1k9Z{CEB%ZUaNZIVQvk6W*al(WzJ$k97rHlXo+)w{0^ zEZkRZ43tlm=;Xq7R$}B;b+TJAju?hYm#QI_=&RCegUPulfd!1Ec{n!iCZcQa(=BeAAiJRY+ zm#axqReGC(wC(8aggS$0y4PMb$@>N7t=XohPETMBw)tJI0qJxnDOy|R9;(0IpD5WiM}DA-W%3Umft5ejRt##r;FzxbR&Ay9 z>!4b`QVb{isIN7YPh+dXMQ~K#BzPO2&W_{Sk4@N~TkrkO#Pllb=6%iSaqA{FOnnel zn6nccFGd?!1sstSj^!M-9I*=IScg~ktV@T7zG)btw}7uh3v}r6xNnu+175StqyE7e zQnNX)Yo)X(L^C(SPe-y}6aMDmpBJpzo7lADw9#wS%LUHLyVoC%F|F!5n((;DX78*s zuovK*zf}8CAH~p)_-}9mx$I|c`7M9Yox?^9D`AgJzMS{L797d~vxpPT_@gZko%rK7 z==n$P(6y9%Oy7W1XjAItD2Y3DU+wp!z_jDW_gxTAMcj?d1XXQJ4&~iF7|kD;KQM)e zW00HD%wZC{F+k3D?d=CB=%A1B2Bk-(Mt8O}vl_29AJ+7gwD?E5awdR%F#b^r=8yPf z_@mt2BO`w##235~9qmkSvK*Ztx0`Ps&R`{B{aG%lZB;A>SB3U+dOg>j$FOM#Ot8wi z8%@Nfonkp7_sdkuPyJ@KbY~-XoACbFE~=q`E9zb3>hr+CkZX-UgsyGkpFSLZSu&y{ zAeDwl`G^qZrSMDPB|58&A=(Nkb#NIr4js3NR2wox>mw(YNO>B@clZ2Ls<;Q2#QV1! zwV)&}2P20U<@D5mXXLBYb)&4t{vZN2&iUA&_@Qe0*lwrF=1)BIP~H|Z68D;9&%o4$ zePd;frf0kRTt5DYBB)K87!Ik&vDMbg~a^}P4#JZD`UciN|yY2Gtma} zJKThsj)$;~1Z&|21FYTZGbXzD5^e4tfZr#V=E#RWZ$3jZoiJTQH=X?P|4JtRWgPz* zRUPV!MA{flvW8=eO{x(}F&s3G$Ie=j7Pmp5fXF{Nw3s>Q)kW`K+)56I?8ZKo#__1w zvcy@K2?P@RTZ_L?&jL-zo@6oNuv&jVtK2yLAz;s!pT%v{dgXL*Rm^l^tdgipDzcnH z+ZB_(1p=M>=wLOR|2>)=Jbx9SR5O&m&nm6YF3opK(IVhFWS2@J77l$0 z9jh8j^C7m!PIodVx=t327^;2z{NoA0GK=dE1`CWLl{Fo&IrtTccIco^;04~$OQJxit_EWjr#B>DV^F{6%B(luyLJ!Z0uy90#K(Y z_1(Ta{PuiAOcMM!;~=UsB4VRQI$6B<#cCDKx*XzRv>f)~9J}OawG?Y3;((G`ir-Q# zP%b#~LW<&E9{Yp4)jejsljtonhfgiwVv%mxU7H>9S%^LzWw=BRn8x zb;My4=+|QaudE?w^mx~#>iL4Em;>Cir~mVVy09Y}#afP-PP z0CG0w7znf#XJd3|)9e-S^to^TQa)M#%_f5y=e+eT%?}oVTwytw@C zUz9oy0_WdUeED0vL{ABHtz=Lq*QvLTg9ZWc4itQlcY>KfVqepz$>+D4-hT3<(|?yt zirfAL)%}1Oph%-U_xs4n#YFFzFRqxCPeBXppr>bg)Xv^`n9_o z9PGE^VF}tSztz)^NUE2rkCTDrxUc#>g)`LwQ*Z>Se$JQd0#K@ivVjTT3MBG< z+*vr8xCi@bKalb7PKwW|%S3j!?46SVr#MhK-Vx z2!7X|!O|<>09_-ghz1>)%VLSW!9}|F)|0froq5(6zLDFS_zRqW40G$As8)eKqsgij9ahPM1PI9>^)#5rN%iqCEVFcxA{<3R0Xycv(T0+ z_UlS9zF4rga5h6s#7K~pxYPjyXm|6=xl{81@x6XzmP3EXY3Ss@n6sZ~w_VB+(9?6s zvt0I0oI{Zx;0J^>E-ObdwPXtc8@z^mL9|i8Pg_*F6n&pGt}cF2_R#b38~&uRBZjo>^sNKUr;pbue8v9*K8l=y@YK)?X_5=G;Or)`^ya9?V@LYWPALLV9rC$WoGf+*6me4RaPNk;2O9Tl*>ua z>;8nq0aKfpU8+eST5Xz%U6 zYe9Q?{VeAXe+NwE1wW|&&w}%?oG5nMrzN$vl2p!S@-nNK+iYEASJL{uLo4TzXAieF zScL_ZS;rRQgJ?ZpZiX}U?#|7l8}`%Tu~_^cK9k49BvE`};e11Ts>iP>zuEQ&h4@%6 zskjdCigSq$mc5wzFhyf$;?wmi>KiI~(E-{zu?}{_n`IprN*5u;x?3T@)ic1=@)**- z1v6-Jd;_)l3gJoL37K&5(d`;VlegfLQgFr8^Z& zfXDvu{gp192uJKZB{;tp_H(5bdIa8w|J0LuzhP;6 zxsx+~t!BZiQtKJMrWhVq!5YtB8R|tJKQ-Q5{V{Nr(q$kdFJr*2=b4p2{-WD+!Z%ScOA3y^ zM_%Sp=Fn)ywGMnnJoBf%3}6UmlXb00#2RTmaLTN2E4xwM#DKei?Pk&7zsLGKK^b0X*xIa7TLCVoF$4O6s8T_TTJ8WxwkOzX)S1E_@8t~el-y=_p0+o>pBUYx`q@@(5 z4P>Q=Go5Ba+Y$q>NLS^$(!>M=o_Oz8QRLY>yQ1C}`0q%~Lm~?B*Jx|8T?3Oaull^_ zfSW&nbinwEOuM5CYWoWY9t-Mrlrr2hojCzM8>~`;8n|K?{wC~fgYC0&{bB>*-O>QZ zS^SX%*P%5ENy2GxUE?A8#k@1byDqQ=Hh9Piu|~KA(v${DNU^sBBjlTI5EUOk8Y%`@ z!_{ZH6V2NU+)G{K7g$+`1#+UY>WA#vxt6*{bbQNsXbGI>&-3PAlc&Q^@#D>8ZXqgX z+T1tb;2?a0i_!25HYQD`i2TbkF!wB(^E@;3sjGfu)zWf+OV3)1>%<6oZ?`Ra%caFG zdgpapvp4 zYr;?G$O|ac-%7u7$8WKdIw_@ZxV2tQ@9ynd5?Qz>EN20F`O3<0rTAY`SjO7c6MjlD zmm~{jIkvJobFPN-UEMLen}cVzQitB@##JP2=yqzi9StcrKN7ylDp|3z&@Y@QkbHML zY#UGeL$4%gadg6@(vjZXMlLqr?9Vp16&e<5pgrpQBEd^njoEw3T&M9TvC>n_sSBBE z;3H>0M>RuBDOe|rj}%M@H*(3`cs3DXQPp-%$%UNE1uZ#G`XdMu$_CI z{$fF>?K|e{cxs8fUv=KX2*6eZ?fKbE#onBP5=EUbgUF%_SWiY3)aC@%Vtcu(m*Lhe zX%$mFZ;tfB=mM!8l~x^9-K{ab;1R&v#u}%RW*$EV;-^N~%7^^2xnLll&1C4*NrL>n z)n*BElYK(?)uzL*0O7_;ZC!eX2$`Vd%E{{50hXY_-VJbg#`EBP>5IEL>g;uL-YG%}|QvG^#{E4E#nO5+WCa6KhlSB*TvB+79`Xuky=uV#g2N|2cj6(oYPO zC7t;XR&Sh6Z&+yfuD<{XBmro+lI8-}%Yh;$XyxKRXCHsTy#Eye*m8I%-+O=(p`QEs zu)Y!W{%^Pe*fl%SpKbe}Sh;R)0ebN2-<1yh|K&IUDgz`lJ)Mc%9mRTD4+XmLH$kA! zZ~Q-fT{ZgufS14z{E-mXyQJfw6CVE)JjAvj$uMzBp4>2BqIMbtQu#X}f?rH2Tiut?{WHqKxqbTSJcC&#v zVw$fLL8^10-*0qzp;s8B*Y6H}$Gdb9fW2nUpRf>1cs<_Wb8)X@ z_XXq4INN#)WBNM9*e^FIEkCPG)XvvEvvAWc=<|59N=9*m=f*e5P(yRP44~3dtK=p< zStwK&1R#UY*@5ZG?9c`D-vsW=D7NlCoq54ds67glM@rJX_ z63gEeJ;Z9pL}#e|ep#TdutMhb2yy|Xj$3ay=r1yzp?twO8^E)MuQo@#6Y}jdlnVEP zYo4Fl@pzqXT2O2Rb}?ACq(lprtIQ|bT=H3tgTqHXeiU4-<`;Oxa9UR$IlamBi)0vU zEFr{xU(ws%F^YIe{shy|RF+;vF!=<#R8FA<2C>iT`!brH8sHC1I5|(yX#P=8yX5Cq z%Ej}DW+gGFu(`>+LSaBXq=c!kb^N6Ft+NMG>39pm&%qZZmQana&-|uPIUfS9yp7PD ziWss-KY#;zoht^U>U~z3G%G_8Xz)hm?B!v$!ipuIS>}c9nD{{@*jaYH2bq4}K(`IG zek2l~@moY;S)i!zOQeT&wd1aNHkiGc4%^Ycw|uH{lBPLx3>cT2IQQK47e=`5bS_Jod*%6XdVs_ zIqJ{2cZ(h8{t}A+1hLNxaxeu(*G~De3neYZY z&cD7JRaJT27^LGx`Y6>Q>OFGvMqDZZ~XTkRl)bm zz8i^ij};&QBILGd__2$sCUKv|XdFjDO}KXO{jxz`2xRqtUw)sgx`!7$1QZeG{{!5|9%oLQi|Hca8mTHmA8dD!ZFSj^0i$x~K1zno+OeFyvYY@0Ib`KvWHI-7D-=aMqT+^uaM`>94rt;2Q)M-08DDG#Zt$Nz8+3sJp%NQN)U|toX zP;t^FWp=nC#u?TCH#Q-Z!`kY&R6U$ZN41rBjU9L=^k!Z&1XzBF=kG3DFhHwfm5bq* z?Z0?UOZtY1nmPzTW92*wf;E%*pdXS|nzPfGD+vK-BH2&fK7Y|j36ng_Nw=AkH-ABo zjFlK)`zBj0eJTThZ&^yGY=bL^p;UDHBy|^nZ!Agl*+dkD?T6WRutvjnMlarX_t8xN zm%+AiJ%lPI^Ic+_x7l=h?Y`gc>I`CRwA>2!?URO_sD#bbSQLG45f>S5Hnl0KQA2x) zu9B8@8J}Qk+#_Ipdi{phyQc$7RC`r}mFJZWl=-tc;ZV#CLW7FIIG_g#1aRk`waQk+xDX1F*X`>o^o#{mR*G_%q0r1$!HPq^N`5bb421{>3LpxmX zRkYlPzP0DIpc?Y?GSpT=o%8gCf0B9(>!Y64SSK|mdBFX&OITTje|j3IF2S$ZoUVpg zsFcH>=jU$}ZDht@cTUiU^g^K7moPWEDLxQYc(96KHW(9!u_f4H(~u7jslVbTi8_sc zU%htYhPL*DAllzm24j+)CTYVDFpckJcgyeHAPq;ljMdlF2Qsw1#`|QOBvJr@5f2kd z+Sd@D-@L2z=rQ|9%4|W}C1>2k_IT=SBpy|U-=@Z}uTDhtauo;otO6uQbjIHJIPv|! zF78{dagt0P&rsZ#v`g!JW@T9$RU4>5MU>`FQ@E8^i%L}&(!h*Kk~A z&`a@y0yz`_-Jd=?%h@A;S+ArKz8Hv>CIZB-K1PREm3>`^$9li2{F^ry1pr*wrp!>K z7=StIf8QbTgT9#*WbmHg({foO%sKREkW8^KbG(dq<45m!Q5Eow?j%LkUHEY^dC4Y* z>Fi9*Yjy5iNE_Tt+XRBCf_;04dB9upt2@I;8{NQVpD0oU|BRiq_x|m$^mHMNCkxkH*Uqh!8BiKn%9GlTIse_ z1bTu?FzyumM1HOH&>)ome)kJSKa(+YEn9IWi4+6=#(U+z`5@t!Nc-Jao3 zp+ry|7yAe8Y%3U7iZ1P!toQ9E$cimH#79=1hfDO=X6CAna2@=?%&oYLPiES*&P|H^ zMBwb_aF`O55JY>oqm%w=0`+iSsWk>7N8hMZV%%BonoSfiSh~m|wKiOI1>2S(ooP^A z5!~q3yBG`vkFVUEmc(S$TzO0zHNt;yCqx#v;)=ONc#>Z-SPn0}?`P=1Ef$*|e@PX( zFQwSj^()3MS zRU4Uq`TR@Juuif-6qS1Csc2oD#SD4t$?9#9niRcPen36vN9;{!VX5vbE3uDErUg>a z4DOw;sN>e4J8cq}JNECr%Fs%O%d?ODGCR@%2A$gy64<7>H|74V-mcDmaN0&!4zNKP(=f;%1R3=tttKQ&n+o&<+hDR*)Oj#vu7v_e6ZwK0G$QrzzsP` z027YNY6yL;NOF!i$V~{(f)|AK_A!34*FHlfq6U*RjoC0HDje1!yVm z92oPT3;F*s!}z~Acl1wr*Z}}^3r}#OT0;R!yZ)nOS7Ozz>rfT#XRf$+3OM3-_-H;L ziFMMs&@d#nj}iX;Dmk>DUg5XI^1-Mr{h99?s|hyV%=|{NmUjKGJ%=#W@`Pc8>8y2i z-9c{k`^C5d2%zU!_p&9EN0*l0PyWT%q)7#PB!Jux=tdTfS7<^F)DmTW{Og?R@IBJs z)yY7jx^Z|7Tm)o-#xnp0!vnfAwJwvG16AWCNQY@sNBqcVxK=) zU>kO#>B%AAGhHfG(n9`6&fQ5)ka-K^n$^>zU$W2jN*8Ske|^}^VKLF4C3V*TczjS; z-oa8nIj{11~iW5`~!yvqPc?m z(vJU`+~|Ld-#-uN<#CvN0n+1xbq0vTgT+JJ0d~=?n$GoqvKBnOr-M}gqLye@g=G0Q z`iISEg5h#>QR2it=ii(daAn5ZFa2DQvMsOyg4R2N3ZM{ztp|dg3KO`v;UxHle3@F^ z9`h>RzkdM#nTS=XVi*^jZ)vW?O+XwDv>}dqfRuk!XWWPdDEnUed#pc^3IlMKCQ!8b z?>TVzr{DhvPRPb+xd^!D;Uu0fDe8JwdZ>YA2i*k)#t1Tx{fh+lxM(Z?1 zc?;BK)-P%0LpiJYV$*vUJ5QGlUQ=Pr8bsvxknz>Q2~y>*|M}PbxOfgAMQA#X>}0cpf9&5 zVm5C%F6XakYOu*`=iLnLlr2izt?)K+&$J;-3!&z2s4e88past}=~rwnp~pWv3KgL6 z!V>XD|l?9HP zZfclzGBb`<-d-hN;SiN|s5q<9Jy$$^CpK4~^Tcy&_RoslKFJ&>7`6IWr`y)`QFN)X zFR^oY?bQTXU(6RYHwaI9xb3YVqYb6^4}J;Xn4#bnL&9|toF<7JjmQmy$j1K6tVwd2^M!8K5?_fV-hjD=dlyco17z4&J5tNZ zF$#=>ElV>OeH*=m?X&AVdd-d}O=2chna}Hs!lM_2j-SyVbXy|See=L^;JF4x5a27_ z?s78}nB+vDFCp_y{b51#nZh8RjUk%}RTk>3{e(ESasqQlB_?`!o~gjM8S_o;3W|hh z#*zmWmXZ^N^raqpeo-h!1wN;-F`OqC!4D9zNut{2+6ZmgD6< z%?+H9dt;u>&11GZV>Yv!Xk^;Z!qc!3sY8svS1w&r+^2!oGadDH$XzRni!JW{lx@i9X9)mKxXuja)LzdB{akav=>Te&xnX*tQQ#4k|zBQ|oIU!(C2 z&IGyMB`_Sh0uesj4^_?h3~yGVJbtW{46YuuACk72|6bzfCBRX;&OMCKA5Y4q)Ty!* z%7ifMmYhGQdl1})rN|9rvbP#Ee_(!js}Wf=-6l=dyLwuN8Z6x489ruOW+j<1`nhrYfpI@eRQj?~6eV0M~T-?R?G4i#q)<;VsvA3zE zNenAvrvi6$2+v}o!G*<1b&`zG?H&#mxwfQK|Dr3IZ+CfqNMrXN=G$ zyK8(VT0e^L+X}Ohs65pl9n3I4$IipEoUwpiD;G>Ayz+fe zlaz4V`jR9$LBTSC{e4!lsCn%zN+l^~y6uWkz!w3JixD0SLoF~^fEntpQ~;1EGiF9!7Hyh_jg|HyEl4i z-0%(JSjXi%;}^|N=sbO=`r}Jn>r@#1$wbacA+?;XwsDxv+0ajFSCM+W{g0eZqtrfl zhk3WWPsp>0uFTdft7zDrnZ(V@R8!@sSkEN4bSnR?aZjmUPvNVuAemljY8HY68gLH1 z@6ybUP>J8;<@GREx}l)Z#p2-OxIx+KOevqIxD++k^fb6Qjvi)y@}9$#vh!}MXkeVM z^V+|cbkzHONXRu3Xq&QIotm+sbIZOt>Rnx6UC*|ZA6%84GY@rRBIa_NczXFp75|ZZxc)Fv?>>hxmze#d84FD|BHU>i8}_tz8WeQVfXlkPcB|Qbm+nG zgFZFEK{c#hpZwL~F0yqWK0wl=i$zyP%)L4xL(3)~)vK7&Tc63!CbAVDPsA>)MkS|i z_K()G-QhEqk;6W@lVvI9Lu8YXB)@;0sM)T^epSnWy&JrgOTn+BJd9tRPH61`C+%Lg z*>N3_-afQ>opf!XQ*~pW;ogG0%om6WW@&sVD^Weyez>~zozwK%LgRB!gK`esPq5Q< zB@K?gzEW=&t*?*p%Y^RnQ@vJ&AGd9ib-qyjv$`Mh{9%_C%A71EOB)+=5EE4?gQb~R z4P2j>^Df?73ktFMdT`UrCs>Cq5BYAqFN>%t8i78aeKDso%CtK;n7Eu9;8*pn&Wz5u zXS@_cde@Cw=F7zin-7_xRp@o|#G*3sg8Gp{JEWPnpKxBW^n;AMm3lp$ZtLIX&PKfl ztC5Q?{JMMi@T;ODzq+0q*1i8DN==M+4m8)T-+eguQ`gP(u=z1uG$FL!RHguY>P5{;H{4 z?knA_$XQO*wtN}1Yc~HVG$y>lxtgh(a*66@H@e5Q&jmT%si!q9+GcChdZVj;6md4E z?2IU@zGpaB8agj4H}&i!Q|T)i#rtj_pds}O4WE-HdnmVp(jMPIKcP6L&NZS5-Ep*W zsm#U)*w>j~I`XU6*esA%!z}(kx<9VV#(;?`g$$gojGdU^F^#; ze?)}tOiV41vT{Y;v;@=C1Kp7fhOo{EG4vBNS#1HXPfVqqkqr@l-t1t=cMA0l0`-Ll zbNwwPiyTQ%aMimm*RzCo-EsjLup7>1#Tm4_V=^O%n`Wy#UOUs23w}-+1F7dQ`;Iym zHa+8KV)80Qil3#G;iIh6l+DVGJ}#OST^PB0_*IylVF-OpgR~S3?v_rnadW;6cNK&t z*O@@=xqQh_#?ksB2)E>zMaq0t&YZgQ2*H>fNL4Y*XuXoCH;aH0!ojKS+C~Mn<@Jc- zDDKQyEp{iY1>Q5LYvz#t)3y^Qt|8Cgnp$jBYJ1OSS7*> z?~r@tllV$k)8qYLk0&s1GA7lZ zvSN;XuWpln)~WYruS?I@iVSaJWRkyJ6Ko^j2$dtcGiLfy&%CIBs|Ea$^(JVL1d?-< znM=lv=*D%ci4QG=mkGXRs>sjPut_&z$|ZE#?@St0S_M~(4(3Q`5LRv1Amf}X(pG1qh$BKHQmW^gbZw?%I1IBL|FRPXKDQ=7nQf?mm= zgf@8v`ZjnA1cqRwjc#Fr5{ZHl58SAje4*@9GRPd7PyX;@%L`^ZY$T~vZd)_St7=|! z;mzH{Pb1RLUsc~~mz{0N`~bh>|LF)Qr2Zs8`+m^-4M4?zb8IQUifc+ zbIk=sL^4am4HFSjgmM8vP{vF1tA>eS7Fz005xmcl{?6UAT|UA}*?vp@vFoO@!+C&g>-7RxfdBxG z036Ssy_#IinM`^fkZ@17LUh&JdvsNota3Rg@YOdrRMmgHr2G2iwRg?is|-dZPhRUg z?H@`2Uf-7cBJ{q}W&iz^&ifyye|OpHn>|Or+pc}|9*v=8M!=aBxVST|&FUx!76GTn zDqbScT)3%j*u8Qa0Jc|di)wsp);Wm)KvShhr6PMF3ILc(58MWDssIAghuPl)Uc{&D z1pHX?*U(>{_zM$%g~DG+;jdiy|FJ3rpw^s1USL;;oyGGJ3VX?5lh*w10(!Jh1mRGb}4q70s zCK^bKK!Fv6fqIWxvvz9@zW(YMJLqM}|J6q1(w)`6KXo=oIe2V{DU`A88(8Xb6X!7e z&)S$N1!^LxAN2eHEYCTHSmjKr_j40pzPK+YM&eE+Rv3LE3xfMUr6u3&SeGhRY7@Ai zKDz_F{N21yX5a-CAvLU!1)_>r9nZ5%5DQDrr@*9gHM8&p=q%v+7yS@fZ(U5E7l>f* zM%2h=<}l3N4_n%(LXPtX2VC{S#s@IV<0_fOab9jIFil(Q7MQ+zmNPsXiRfW6YdvEb zw=sez#j&?{FUU5)mD<@*dmuzdH4vdtTR8yhV#Iw^ja|BpkyW~2E5TE}qq0e7&zjIt zWm9p6@Z!1SI4OBsdS^{epm6R(BszLjt;k*KX@n^QPhCk3>oGKoyoL6)Uz$8&rg{7A zrLJfyctP7IW}vzy6bU|>PlGRMAQQSnYd#BU*oczPOpz)cE_aYBqv-Q7-nbI~_a_BV z=O}4cBJtB#wG#%|4s$cqrD3`#Ly!<4C8Tqd^x?0!+^O8r8alY%Q8(fb? zE-ZKDRKsY8EFn&AD7ZL`#bNY|rmZ&mwgUn@dS7NL)DotNOsXm$1T4SNqU}?ET5iUm zpL_!OFt8=D{!u~?b0~mM)e7Tg`uGkoQ2nzB79T-(CC47kzSH29I5%FutC?n{>W>gC z4G*lzxOL#`iSR77g6i))0B4kQ8(_0I>sbyXvIENc@BkkC;I5_k)8S=KWJBWUp%Mvw zWW{MvmfW$Kxwt%QBk(|9GnR>J*GEw^4qAP3yoRC%=Js2LqtfDUT2Nq12ZXB+3&cNn z*Zi*R-mj6}gjE5&$Sid4eC-VsSgPha>Ff~k_rb&y49)nVvl>JtKvR`R<>~lsfE>4f z3_LqKh6-Q~BzmQ`2$B;^N{;}f_8Y})$Gh~a1;b(ICh*(;`4KDJ|70lo8Yt#W($(^- z;*@_7H*EgQn#;eM*fM(GT7RBV#k~~M!vl3dp-!$*ZQws|hyVUVl z0TmXSlp()!>Xg>*Q_;#j992>ki{kJqB@f} z<>4XuuWRq_e!zVHM(!TXOs6t9QgS$rfOB8x>MC8za2q>qOT!Q26GOe=Tq(BqS6LE3 z@jN*bi@8n`|BO2Mfd5Z)`(CJ0*s1cDZ>NO-QS+njM~xzeETLBUekduXAjeOXatz?z z%tn+8)^y_^1l|jkufqmh*FoQt?iDpYbDJVqGmkHkk1JtMp<7wo-ldNWjn%)ZYk9d) z{Lk(_8PSe8`qb_Ewq0%AkGhM*@_7bZ9)==_$h<~GxJ*3ek#6+dCMwo`^KmF{`+zRT z3L;`caQgvOQtL347tbJ40g7>7z-Db6fB3*|M68XXhGPbA>);N!@ zIBl(`T2ub=P+A&Xy1 z?bq5`7KixY^p3aDyqK!Htp^YR!09`ev+gnUQ4k6pztPE-Eq!wA(b`x)pbTLhgP|~+ z*~lU@anrP&^!Jvir2Y>YL~%DTFtDlqw#dxg?k=y#F8PDefoJy1905HLdrtgb6?B^Q z${3o)D6wnkDI#vr^qBU7Nbv$@^?jV(TSl$JqUqN;T+(wXC=87O8Z%@Tgh0TJ zb@b^bt3$!byfd*8v8g;v2uU4I(RSCtJ4>UB*&pQk0Gx?`qdnrgK^B)T<=OO?-g89KtdYUE)xOVKz3R ze5onsw8+dLeBAo?sm@43#YsgsOgBS24gpO}0_=J#(5cX?7;y!=@;pq#d>U+uvs^}<&0U!~#(KvP+U|x$ zF#anz?e}Ujdux}TugWa&-0|eT8piTyiP7oVR~Hll3oVicKZZfW7!UM-j})o#3zVp4 zPLVNoxmep-#kfOm)~NyfXQp2?p7lWsy7mi;+3#j5qhc(iU*$#GY@t)U)W#O+WU6K# zJQXfq|2_@7cA$AGXU#l$>ZLd}#0wHyF*B@9_#;^8cv_$fl$#czy`YEVlkbz~MrNwp zN*>2tN_4l&Z-3tJ)=_vkSJ6>d+gh993~%=r7%q>`q|eOF5VQ%!!J-Cx(S_Kr-*yS} zZv3X!j`OIzD&;K3sT%ul5F|;~U%%`?Cr_ibgu{-mu=w{rEE<@Upw})-uhTen8#^iR z@A!mAO1l!w$CmrFl9zHcK(dcr`-;I6hMelKl|L?c5;xWz=;+BS*yy;~)l3{e_96 zLJw0+oy7xajfX3dt}3T1yOyNir$a*nd6#(O9dyMxg_NBy>|0MzO)U+mm31xOh~9s} z+3k5@Pd!#Zp-ccEJ<@+&E)zYO52x60N4T3#Z=eZmU=n^%;*~88Aj4*LPwA3fB5s|y z>wC^);8pi1h>2{!SfhJzi!?zY<~D_FLem1N{+0RL z6{d@uu5Dp=rk{Zyo6u?q4Dp{nL}{(ML#wn^LlaNNtnxH8t75)5>9860A9lQZ;ZXoz zy<&D6_HS1EChI%s>D<>YmFvMPaxNwzJ!(8u!7#l&{uZI07~yXxH}nx9%)O{-VYPeu zP)fwDEi1Rkl)~W_&|E&wV~cq$ToqpKW8s~m2{Smj2)4Hi(P#$Ye;)6Ry01_csrIAa8aV1D5# zAYFRvKgm`Ao`(MqIjKF9gh8qSUI_kAj~sws%kBzWi@9ly(Y=F&6~b3Y z^Vu_kwVs6n@vQXw7fU72BN=k&DISvW()?a5K`byK)akthN5TZcLeE++$*`#7O2ejk zVT*1MLOWY;K`-B+NJq16c6Ij5Ab2XpDxV>sHC_+xpNAjIZrOB?D>!jRaQ zSn>RX%L~-7{+XDK{NObB430ptE)-4@J`=Er9(Y7PCu!R?3>0kh+O%vu-csfAuWNa> z*N*u-Zy)}=iE@)77g3A#;VlZcYCNJk3@_n_jZ=5dX^pz57^ZHzOs)bE#}EWU0wG3p z9h(kyr~{Pn!y8_6fnkd|{)O5;ImKQUl2RWh^%_UJcmH8WG=q(=^Bwgrih zLwO^*=Ja9$;gtg^`EF*2zO7oz?3=8=qm~mk?ZzS0L(0LWRpjrTqP&#-E43@#0tULa z117Kj8Ip=Q(`Nzi-j)4Rhwu+5{uhNw;GepGE%%;&F4^V>z)&1ySn*G}M12&vqfTnI z10ecI{BNA^zryWbH1uD1P-%hiKG&(N1-%1saQO{6T%gjlmCFLM*XvGJx^aY7fb@IS zrezM9|MrISAN$=uA-2_n0#-YwVTFygx1jCpaq#Bu0Kc@&6JY3B{Hdd_&FBV7f=% z)l+ZcT*kDmBMWf!-=20SB}!BSi?TOgudjY>Z1|X>VVpqCIvnrIVf&Wy7cJF1*vXxq z&>~~WAHtQPqu}-8EWgs}GLg7%IYX@@^zra9>5mvFN)H6lA{tikgwTq-l|ygr@$-D){lfmelZ zLT->2`18YF)?9_m*zs9#pDKT-*z44X8f7NmvymFcUjv1HhOaYeu@V*QtG*9E_4?!9 zN0#_3=K|xpAk7sev{I9FknX|Pi=cb-)kaywG;Wgs7D_ZM?_@;R#;rb1TaGd;KPmYF zm3d-Py#v9`=8}6<%P$ic;Y_s|TC5M7CHMRN239Z)gK|?F*8DayGh>H!gdbfoGp&)0 zY$qUg$y~USFpyo>Q87J`eB(-}4J~DgY{thVCDni7D6<}3Fzn`JK?SBy4J9J z=JuK=4D2ProNObUEwOz_d@S0;h+${&w5QBNP%cHmGC^eV1Br-DF6AC}I%b zw!UFI5jJH`g=R7A0oCV5#Hcc;3$J3`iOi9h2a&SfcGP8lW22d8$U0eZhfC zo?;IO>fl$8was%l67xR{W1RVl3ZQPTcGUIY=&|BvNHS@ z|Cn>BQ+$-acb7J9J8rr`t-uT~T(Jt`BRPnfb1{8GA&lT8yYVUB7kYD=@>xU$t1h@h zGj)M!IlZjn>4t6RSPCZ5>l^o|1#2`X3b>0AQBmqf({)_;Nj%h>ASm+tLR?dTs6wbVMqW-t66%`bU52Z7-#qnbHG|cPDYvwVQsL zF!WQZFY0{*&sJy6A+yja1YBn$zR69i_Eg}GVGzJw#J+EKWCh*}G!Y9orO(Dm$L15o z6s?HX4H+*Mn`FdBgB5&jG_1pOvxb8|)Thm({9G_;7u6dRq<_nsb;u0FUy0kx@ocFG z4pA_wVYanN^w+R)-l3OqE++5hzMtD^kEu;OKb@c+noXfd=OET(C>O>p+Z3U_8n)F$ z2R5wjstV4TrLW|vxW{ZdOf)7i|CYBiGXl8a;%_ed#kHZcHAJB{xMxd3OcpQo6Z9W& zLhj!?Uw6j%H6A10Z%C~44?3^Q@wH&Ru^hc~qYvAc#532PL`zf*YonwKPPJCG4Ax3^ z#dybt@R7J7*yr5HlDCf(*t$+fyWhaHEhGi1MH(Ma)RyP4`Es#YoHu{ksZ0n*q^$KE zk|qNu!cteyPY=jNXAV2UqW^=}=Ec)#x9IIY9QH9{ldWHv+l@;5u*92_n|%`@+)Uxb zbd=#3ZzlJYwH4ZQj~s57XpFpV(W7yd@gk!?COu`18_1YX-U}_r8>qeVRLrzkDXTJacs9%M)BBHxwQUHsHcE>vQgu!dT>yVPIc z5Pt*uBP#Horcdi>d;Ht=)lX=<$E_ZOuc@@qQ88|8#wU_ zZp#=;o4rE%$zUz@*gPq0Z0MQ$H-De*;kH_Jtw?c(wO?9cw0Pd$a_NPJ+{B4S+>PnQ z^|o<|3lZO@5c5mP-5I(iD@e_%>uQySJSd~s#{n&WCsf|LN`#p*{D*9Vqs_$wq zZ&JIcwuBNrmO@pjsPC`F?FLq1(9%JD4GqOZ0AmC(Y!_wsSwX;^D2`(9TF-1iOjHb0 zdGT|a1zFn|SKM7>ZQWZQQDN2mu}+mpoMa5Zpr>PKt>zPT(E~@rn(W+fk_-HjM4#l_ z=})IQLEJ|`N=>&MqXVHlC%=KWB=2Uynn>P}5W`QTWav%oW6E=!B5wQS)f#3`LJMi* zou-<36HZ9cC`yU}rKUiYxyvU)gVB>GQ6d&?tt2h@W|T-q&xOS-O2e&VR`d;PPt@YG zIls=Q-egvfXE15;FphacR3Ozl?G`65dJX3RGr2W3v`FS2E$ZAf?L0G;{9QcBOVHH1 z^hqH5ZAtc0Ark}xNms7QlTJ4J#>P-_l8gNOL_cpbREo`?{VkxOZ`9T|Dnnjfr=G1@ zM^fqiHSRYGsA+8xkozwFgcBtY-5K{JJpzd@4|6oNY3;rSvfcFgR*=d|f3%fs9$EX6 zJn4oFyQIT{wI^<8S2@QmW~bh0=3u7=RooftqTK%c;D^fp;R`)Z;4O|__t%XaUT+XL zB{;~8O8)*=tKY`=@a4qBFSQMh^3N}en!MdnWvRUNu zYaL&IDbw>>s4k(;IhNEw@)h_9$)B+J+C+0l(tW{*#uXvQZ_g1v_GyOJ)lgW(BAS`5?*HD+yyOAcEg; z5$W+u2=k6|vc|!KQF{k)ypeXAAUIPWku?71LFUul9C`i8o<2Jil4Ku< z%}j%LP2f;Hzs|E{15t)tea3;FMaoV49s)j69P~8xW_Oq6MwY=FYts4)jYe6KRp6bE zp4al0bbZ1i=``-ZfG^~?%dEernoB7=+p47%>sPw4oBWjwdfw5#ecRgGwN+)HrARLl zk=u7lvPkz+F(ecKgR>F5IokM#r#-CpAS>)65xSKZgIUoU$QD3@cJDsFo)+}TNSr-i zT;+TC*Kj;=*H^jO&jat(f@jJ8@#i?~v(}-sLjitW-P4VrNxLTsDR(lmz3n>$xtx|;&@^#Z zGn>Nzhiui+gK|}+jmg7@uJfBK0&IKh(<=34qnjJ+8F8#qa32#_9~F`H>B(+poa!li zPCt9UKJ?A9eqE^ay_}U=^3C{9&`TfMCPOhZ8?}?U!6D+G$1$g0Ly;4j;kIujat<)o zcT({2aI!DuB3O(TZep>RhnJ7wwg-5^?6VVk67R$ba=|hq;f%1^890d74b%M0cXful zFQS(GeN(IKg!z{7`Rn^y<9VJB^Zg>?-E2(s+A9(Z?&>v*j=a>J9(~QRzTG1~y~Z(G zkYm!$7u(iN4Sk0Rd7!Ygf!apBUDXcD zPZL7qe(IOj(b8g{K^%5l;A0rS3KAFkJ6~wanQ)PL)QPe!pLO+p^T3r)G$2PqO0OQz z)h1VJ4DJCahUfm|sGQRE-;nbDFH!0Ly~_TCnVKlz`l7ylr8Y+d~0%eF0r8e((OVc}aB0Ua;6ov;1*`u+a}64QJk diff --git a/doc/NodeOS layer 2.png b/doc/NodeOS layer 2.png deleted file mode 100644 index 3f556832e561518fcc285a14d48bddf8b6b73c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13320 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 lxp)1aUKa&{3Xp%bi diff --git a/doc/NodeOS layer 3.png b/doc/NodeOS layer 3.png deleted file mode 100644 index 572ca168dc9ae09f2c30cf6f91c692275eb42ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13953 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 B(9-|_ diff --git a/doc/NodeOS layer 4.png b/doc/NodeOS layer 4.png deleted file mode 100644 index a2880c7ae7bdd6d05b001dd74d58cb91f490a33c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18764 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 PKYsc@3opy%ZKnVLMJV?F literal 2563 zcmV+e3jFmSiwFP!000021MQt%kLorW$M4UlK%85~#CBesPG_pFwpA;g-974_YA=rh zF_1PSC^0j`O+WiOAu~X5ATM@?oEmA6V1l0{JpSkRyx@HQ!^=7xJ<%i$;^<)vfiWJ@ zXde4Pw0s!<{^jR8GXCN5!}osReaHWniMJl{Pef_<>S4TMZ1df8`uzM1!d>dII00d> z1u32W<%OX)J1=->u@!!+4^dtu(~eUa}0Lb6foUg!_|$fQ8-cVMAhJ z13CEhyfimA>(^Y^ueqdOb3yub6DKV30(Ne47RMp=qPD&vsi(NV_*nady zz*u}`{}*1E);WOv+ix?j>Fix5fq!}Oo@`Mu%5&he)z=qAr)xj@PSNO3K^n|LD%$%X zV$z1+$r--Iewh)_#L*F5zqdhb5u90225Q20G0Mk%t{PQC&t~P36Ta_Wv<&HfbQ`$V z`-^HgHW~Fxd*jF&cNla?b&*Fy@R$EJS}*V1TTqWCR^{0VvaBT1RjYUEW{3X6+7rm zkfl)Vvhht|@~9)X1fbQ{T;@X8#ICeWrKcq298n!lxftYEO|3X$B175xqlLE)!X4iq zFG|OwlJ~~z6WO_C=@GVoIcEMMo)dNhTpX@a+>t0sVHp> zd10`O)>QmW(rCLb&SFg~!jwj{x$ufL5$(=FsHId9q4}nW z*ciSdwm)076w%U(s16ZULaa^`k)t(HYvKSj@z*F| ziMLi*hY&b8`Yb3W|}XxcjNY5!Fi7L4}gkQYB__;?txzQ7X)p%K*ap zeCWMzW+RBAdM4VJMkP0mT~hG8#MHiOP|Z+g6Nb88)pWbc37_43imQw%kqK<k|1(-~aVq?i#W~uH4*z`^lk?W}vq5F6q?oy2=Z14=Pn5QPSQ&I>q2@ix({7Gx zrfR)EWv3tX`CF9aZ&*ebQe29`yfiIvlqbq`%&nh;OyoVEtgQTEvj z*IyD!HE}8LEaRS-Zua^Dhe!R0>?kH~^Q`2XM7N9t~Ur1FnT( zlZ6H@X~5OFaUWr&z=a^N%p>5+n)t0D0oN>u?v|9XohB~jIWDY;YskcfZkD(@|GWUH zO>v>46qnlzaVbr4VNG1OLtLKk6KdZQarJ;jotx{C11z;*WCQM9)&YzNz{IhJ14d!I zj3W(2%AqKCM2$tm#Uk_lv8YNWJ9pfhhEkElF0fr2y@{l00Bm3~9FYV7Xo*xUk(m=} zfxHQUJeMp>ZY1YOSb~hGUX=$qhh=#%QXI;)KcIJCIL91BELS(P-JzrW9TxnnK?g)i z`y^Jm8YLuvxWwU80NBL3=aUT@5Kk}!7!Cjre);jYfBx^s-+ua=F#-YvWe*6kZMYcr z(>;j|;1JCS!wjOFra_b>4eZ=PZX%@-k_k%@64DWpj*vu7s3W8sjgYSWa5!Va&B-9m zVkTrlUWbRIReDh{AzADb|Yx>OTuWk8@T)s?Zv z_b3rZRLx?l#`p3N##J?%v>V^dqcXbce&di!84uBnZigWVN}0m=w5FwM5~G~6-;e~G z06|e@tMQF{gvfCfOq!rcd9|F)x)M$n69?^U_CLXzs^BR@p=i_@>I~wU<}_Q1k7xCDlP{c#>nlL7uVb+ z*xe!sX}U`pU8lO(sC?msy;o-Vg>|`cfXx<2V#m6py0~e}h-^7(AVYazTQF39&qkPM z+7Rj`)zC&Q|x1XU} zZ_`kxsQOP)6|O2+&r_$UhM%Ic<))}E3a*s=laz(m4b=;;7wBXO&`Hh0>xR1Ylcm#7 zI{l>Vw>zkF-#SDkmXe=aGJuoyg}qUf2~gHIc1BURnp@i6OYJU*0;aP{%CkzS3Yc_O zX&6~0qWC8~Vzj}Xmp4a>(FPu|O>t8h)og>*vJKKVmC{o)A3#&rjcw|maR}4^+<45?Y z;mH*=JgF+ybv(R!#X3tD>u$d>zMPf1iL#)qiXWEJl8)?B2b3x`Fo6q?+Moz9h@cDV z_UnDyG?{VQj-LMRMZZispk*TBLep^iDf$)OD(H;TMZdup{cx+k^d>FmPDRW4{$=Rx ZX!7`B|APN56L01JM8g From 43c30e31eca07be088ac6bc3b94a11a592d9c28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 15 May 2017 01:41:14 +0200 Subject: [PATCH 183/206] Clean-up --- scripts/start | 5 +---- scripts/test | 45 +++++++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/scripts/start b/scripts/start index 568aa5cf0..3daada699 100755 --- a/scripts/start +++ b/scripts/start @@ -5,9 +5,6 @@ var join = require('path').join var spawn = require('child_process').spawn -const QEMU_SYSTEM = 'qemu-system-' - - var link = fs.readlinkSync('out/latest').split('/'); var cpu_family = link[link.length-3] @@ -15,7 +12,7 @@ var machine = link[link.length-2] var platform = link[link.length-1] -var command = QEMU_SYSTEM+cpu_family +var command = 'qemu-system-'+cpu_family var args = [ diff --git a/scripts/test b/scripts/test index 46074f969..2af79dfe5 100755 --- a/scripts/test +++ b/scripts/test @@ -1,27 +1,24 @@ #!/usr/bin/env node -var join = require('path').join -var fs = require('fs') +const join = require('path').join +const fs = require('fs') -var suppose = require('suppose') +const suppose = require('suppose') -var processArguments = require('nodeos-barebones/scripts/processArguments') +const processArguments = require('nodeos-barebones/scripts/processArguments') const TIMEOUT = 300 // seconds -var link = fs.readlinkSync('out/latest').split('/'); +const args = processArguments(process.argv.slice(2)) +const link = fs.readlinkSync('out/latest').split('/') || [] -var cpu_family = link[link.length-3] -var machine = link[link.length-2] -var platform = link[link.length-1] +const cpu_family = args.cpu_family || link[link.length-3] +const machine = args.machine || link[link.length-2] +const platform = args.platform || link[link.length-1] -var type = platform.split('_')[1] || platform - -var args = processArguments(process.argv.slice(2)) - -var cpu = args.cpu +const cpu = args.cpu var exe var timeout = setTimeout(function() @@ -35,7 +32,7 @@ var timeout = setTimeout(function() var command = 'qemu-system-'+args.cpu_family -var args = +var argv = [ '-machine', machine, // '-enable-kvm', @@ -44,15 +41,15 @@ var args = ] const outDir = join('out', cpu_family, machine, platform) -switch(type) +switch(platform) { case 'disk': - args.push('-hda', join(outDir, 'disk.img')) + argv.push('-hda', join(outDir, 'disk.img')) break case 'docker': command = 'docker' - args = + argv = [ 'run', '-t', '--cap-add', 'SYS_ADMIN', @@ -63,23 +60,23 @@ switch(type) break case 'img': - args.push('-hda', join(outDir, 'bootfs.img'), + argv.push('-hda', join(outDir, 'bootfs.img'), '-hdb', join(outDir, 'usersfs.img')) break case 'iso': - args.push('-cdrom', join(outDir, 'bootfs.iso'), + argv.push('-cdrom', join(outDir, 'bootfs.iso'), '-hda' , join(outDir, 'usersfs.img')) break case 'qemu': - var append = + const append = [ 'root=/dev/sda', 'console=ttyS0' ] - args.push('--kernel', join(outDir, 'kernel'), + argv.push('--kernel', join(outDir, 'kernel'), '--initrd', join(outDir, 'initramfs.cpio.gz'), '-drive', `file=${join(outDir, 'usersfs.img')},format=raw,index=0`, '-append', append.join(' ')) @@ -122,15 +119,15 @@ switch(type) // Exec test -exe = suppose(command, args, {stripAnsi: true, debug: process.argv[2] === 'debug'}) +exe = suppose(command, argv, {stripAnsi: true, debug: process.argv[2] === 'debug'}) // On disk images, hook on the bootloader and force kernel to output to console -if(type === 'disk' || type === 'img' || type === 'iso') +if(platform === 'disk' || platform === 'img' || platform === 'iso') exe.when('boot: ').respond('NodeOS console=ttyS0\n') exe.when('username: ') -if(type !== 'docker') +if(platform !== 'docker') exe.respond('nodeos\n') .when('password: ').respond('nodeos\n') // .when('# ').respond('node\n') From d29ed3c51abb300aae4fe18adfc4201a1cd84a56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 15 May 2017 01:44:21 +0200 Subject: [PATCH 184/206] Improved tests by checking execution of Node.js from inside new `nsh` shell --- package.json | 2 +- scripts/test | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 4a4cde479..95c4757ea 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "nodeos-barebones": "^1.0.0-RC3.1", "nodeos-initramfs": "^1.0.0-RC3.2", - "nodeos-usersfs": "^1.0.0-RC3.2" + "nodeos-usersfs": "NodeOS/nodeos-usersfs" }, "devDependencies": { "cpio2tar": "^0.0.5", diff --git a/scripts/test b/scripts/test index 2af79dfe5..4f828f83e 100755 --- a/scripts/test +++ b/scripts/test @@ -125,15 +125,15 @@ exe = suppose(command, argv, {stripAnsi: true, debug: process.argv[2] === 'debug if(platform === 'disk' || platform === 'img' || platform === 'iso') exe.when('boot: ').respond('NodeOS console=ttyS0\n') -exe.when('username: ') +exe +.when(/username: /, 'nodeos\n') +.when(/password: /, 'nodeos\n') +.when('~ > ') if(platform !== 'docker') - exe.respond('nodeos\n') - .when('password: ').respond('nodeos\n') -// .when('# ').respond('node\n') -// .when('> ').respond('setTimeout(console.log, 2000, "this is","a test")\n') -// .when(/this is a test/, function(exe) - .when('~ > ') + exe.respond('node"\n') + .when('> ', 'setTimeout(console.log, 2000, "this is","a test")\n') + .when(/this is a test/) exe.respond(function(exe) { From 743e53c9011d9ce27d51c63e1ff7294b34da4572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Wed, 24 May 2017 01:53:28 +0200 Subject: [PATCH 185/206] Run tests with Docker --- scripts/test | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/test b/scripts/test index 4f828f83e..985c713d7 100755 --- a/scripts/test +++ b/scripts/test @@ -51,7 +51,8 @@ switch(platform) command = 'docker' argv = [ - 'run', '-t', + // TODO find a way to correctly set `stdio` as a TTY. Maybe with `pty.js`? + 'run', '-i', '--cap-add', 'SYS_ADMIN', '--security-opt=apparmor:unconfined', '--device', '/dev/fuse', @@ -131,7 +132,7 @@ exe .when('~ > ') if(platform !== 'docker') - exe.respond('node"\n') + exe.respond('node\n') .when('> ', 'setTimeout(console.log, 2000, "this is","a test")\n') .when(/this is a test/) From 53168575649bae0c89dc2254675ea993014bda34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Wed, 24 May 2017 01:53:41 +0200 Subject: [PATCH 186/206] Updated dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 95c4757ea..88eb65c41 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,8 @@ "nodeos-bootfs": "NodeOS/nodeos-bootfs", "nodeos-cross-toolchain": "^1.0.0-RC3.1", "prebuild": "piranna/prebuild#prerelease", - "qemu": "^2.8.0", - "suppose": "^0.6.1", + "qemu": "^2.9.0", + "suppose": "^0.6.2", "tar2ext": "^0.0.2" } } From 305731464697f7f0496713b2854ad00626ec55f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Thu, 8 Jun 2017 22:53:58 +0200 Subject: [PATCH 187/206] Fix Docker images to publish to DockerHub --- resources/Dockerfile | 4 +--- resources/Dockerfile-initramfs | 9 +++++++++ scripts/docker | 2 +- scripts/dockerBuild | 21 +++++++++++++-------- 4 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 resources/Dockerfile-initramfs diff --git a/resources/Dockerfile b/resources/Dockerfile index a3758c0a7..d8786ef66 100644 --- a/resources/Dockerfile +++ b/resources/Dockerfile @@ -1,11 +1,9 @@ # Autogenerated by `npm run dockerBuild` -FROM nodeos/barebones +FROM nodeos/initramfs MAINTAINER Jesús Leganés Combarro 'piranna' -ADD initramfs.tar.gz / - VOLUME /tmp ADD usersfs.tar.gz /tmp/ diff --git a/resources/Dockerfile-initramfs b/resources/Dockerfile-initramfs new file mode 100644 index 000000000..fb1ebf4e2 --- /dev/null +++ b/resources/Dockerfile-initramfs @@ -0,0 +1,9 @@ +# Autogenerated by `npm run dockerBuild` + +FROM nodeos/barebones + +MAINTAINER Jesús Leganés Combarro 'piranna' + +ADD initramfs.tar.gz / + +ENTRYPOINT ["/init"] diff --git a/scripts/docker b/scripts/docker index a0edff819..46a5ed51c 100755 --- a/scripts/docker +++ b/scripts/docker @@ -4,5 +4,5 @@ docker run -it \ --cap-add SYS_ADMIN \ --security-opt=apparmor:unconfined \ --device /dev/fuse \ - nodeos/initramfs + nodeos/nodeos # -v usersfs:/tmp \ diff --git a/scripts/dockerBuild b/scripts/dockerBuild index 8c549e1b3..a6a159e33 100755 --- a/scripts/dockerBuild +++ b/scripts/dockerBuild @@ -14,25 +14,30 @@ WHT="\e[37m" CONTEXT=out/latest -cp resources/Dockerfile $CONTEXT || exit 10 +cp resources/Dockerfile $CONTEXT || exit 10 +cp resources/Dockerfile-initramfs $CONTEXT || exit 12 cd $CONTEXT || exit 20 -docker import barebones.tar.gz nodeos/barebones || exit 30 -docker build -t nodeos/initramfs . || exit 31 +ORG=nodeos -#docker volume create --name usersfs || exit 32 -#cat usersfs.tar.gz | docker cp - usersfs:/ || exit 33 +docker import barebones.tar.gz $ORG/barebones || exit 30 +docker build -t $ORG/initramfs -f Dockerfile-initramfs . || exit 31 +#docker volume create --name $ORG/usersfs || exit 32 +#cat usersfs.tar.gz | docker cp - $ORG/usersfs:/ || exit 33 -echo -e "${GRY}------------------------------------------${CLR}" +docker build -t $ORG/nodeos . || exit 34 + + +echo -e "${GRY}-----------------------------------------${CLR}" echo -e "${GRN}${BLD}Success!${CLR}" echo -e "${GRN}You just registered a custom NodeOS image${CLR}" -echo -e "${GRY}------------------------------------------${CLR}" +echo -e "${GRY}-----------------------------------------${CLR}" echo echo -e "- Interactively run your image with:" echo -e "${WHT} npm run docker${CLR}" echo echo -e "- Share your creation with:" -echo -e "${WHT} docker push NodeOS${CLR}" +echo -e "${WHT} docker push $ORG/nodeos${CLR}" From 8ac3de10055351381bde1fe2fb2bc10875c50929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Fri, 9 Jun 2017 10:15:59 +0200 Subject: [PATCH 188/206] [fix] Exec test with correct Docker image --- scripts/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test b/scripts/test index a04b03bcf..8a3dcaa47 100755 --- a/scripts/test +++ b/scripts/test @@ -65,7 +65,7 @@ switch(platform) '--cap-add', 'SYS_ADMIN', '--security-opt=apparmor:unconfined', '--device', '/dev/fuse', - 'nodeos/initramfs' + 'nodeos/nodeos' ] break From 6749a663dd05f5c8c0b473c075db63e34332c564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Sun, 11 Jun 2017 16:27:00 +0200 Subject: [PATCH 189/206] Unified execution code for `test` and `start` scripts --- lib/index.js | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- scripts/docker | 15 ------ scripts/start | 103 ++------------------------------------- scripts/test | 108 +++++++++-------------------------------- 5 files changed, 154 insertions(+), 201 deletions(-) create mode 100644 lib/index.js delete mode 100755 scripts/docker diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 000000000..a991474f7 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,127 @@ +/** + * NodeOS + * + * @copyright 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' + * and other contributors + * + * @license MIT + */ + +const fs = require('fs') +const join = require('path').join + +const processArguments = require('nodeos-barebones/scripts/processArguments') + + +function prepareCommandLine(argv, output) +{ + const args = processArguments(argv) + const link = fs.readlinkSync('out/latest').split('/') || [] + + const cpu_family = args.cpu_family || link[link.length-3] + const machine = args.machine || link[link.length-2] + const platform = args.platform || link[link.length-1] + + const cpu = args.cpu + + let command = 'qemu-system-'+cpu_family + + argv = + [ + '-machine', machine, + '-m', '256M', + '-vga', 'std', + '-net', 'nic', + '-net', 'user,id=eth0,hostfwd=tcp::50080-:80', + '-net', 'user,id=eth1,hostfwd=tcp::50443-:443' + ] + + switch(output) + { + case 'curses' : argv.push('-curses') ; break + case 'nographic': argv.push('-nographic'); break + } + + // check if kvm is supported + let contents = "" + + try + { + contents = fs.readFileSync('/proc/cpuinfo'); + } catch(e){ + if(e.code !== 'ENOENT') throw(e) + } + + if(/(vmx|svm)/.test(contents) !== false) argv.push('-enable-kvm') + + // CWD + const cwd = join('out', cpu_family, machine, platform) + + switch(platform) + { + case 'disk': + argv.push('-hda', 'disk.img') + break + + case 'docker': + command = 'docker' + argv = + [ + 'run', '-it', + '--cap-add', 'SYS_ADMIN', + '--security-opt=apparmor:unconfined', + '--device', '/dev/fuse', + 'nodeos/nodeos', + // '-v', 'usersfs:/tmp' + ] + break + + case 'img': + argv.push('-hda', 'bootfs.img', + '-hdb', 'usersfs.img') + break + + case 'iso': + argv.push('-cdrom', 'bootfs.iso', + '-hda' , 'usersfs.img') + break + + case 'qemu': + const append = + [ + 'root=/dev/sda', + 'ip=dhcp' + ] + + switch(output) + { + case 'nographic': + append.push('console=ttyS0') // redirect to terminal + break + + case 'curses': + append.push('vga=extended') // 80x50 + break + + default: + append.push('vga=0x344') // 1024x768x32 + } + + argv.push('--kernel', 'kernel', + '--initrd', 'initramfs.cpio.gz', + '-drive', `file=usersfs.img,format=raw,index=0`, + '-append', append.join(' ')) + break + + case 'tar': + case 'vagga': break + + default: + throw 'Unknown platform "'+platform+'"' + } + + return {command, argv, cwd, platform} +} + + +module.exports = prepareCommandLine diff --git a/package.json b/package.json index 88eb65c41..4cf5f4d8e 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "NodeOS", "version": "1.0.0-RC3", "description": "Lightweight operating system using Node.js as userspace", + "main": "lib", "scripts": { "BigRedButton": "scripts/BigRedButton", - "docker": "scripts/docker", "dockerBuild": "scripts/dockerBuild", "dockerClean": "docker volume rm $(docker volume ls -qf dangling=true) || exit 0", "build": "scripts/build", diff --git a/scripts/docker b/scripts/docker deleted file mode 100755 index 0b28c7465..000000000 --- a/scripts/docker +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env sh - -# NodeOS -# -# Copyright (c) 2013-2017 Jacob Groundwater, Jesús Leganés-Combarro 'piranna' -# and other contributors -# -# MIT License - -docker run -it \ - --cap-add SYS_ADMIN \ - --security-opt=apparmor:unconfined \ - --device /dev/fuse \ - nodeos/nodeos -# -v usersfs:/tmp \ diff --git a/scripts/start b/scripts/start index c3c84b5b9..7087362c0 100755 --- a/scripts/start +++ b/scripts/start @@ -9,111 +9,16 @@ * @license MIT */ -var fs = require('fs') -var join = require('path').join -var spawn = require('child_process').spawn +const spawn = require('child_process').spawn +const prepareCommandLine = require('..') -var link = fs.readlinkSync('out/latest').split('/'); -var cpu_family = link[link.length-3] -var machine = link[link.length-2] -var platform = link[link.length-1] - - -var command = 'qemu-system-'+cpu_family - -var args = -[ - '-machine', machine, - '-enable-kvm', - '-vga', 'std', - '-m', '256M', - '-net', 'nic', - '-net', 'user,id=eth0,hostfwd=tcp::50080-:80', - '-net', 'user,id=eth1,hostfwd=tcp::50443-:443' -] - -switch(process.argv[2]) -{ - case 'curses' : args.push('-curses') ; break - case 'nographic': args.push('-nographic'); break -} - -const outDir = join('out', cpu_family, machine, platform) -switch(platform) -{ - case 'disk': - args.push('-hda', join(outDir, 'disk.img')) - break - - case 'docker': - command = 'scripts/docker' - args = [] - break - - case 'img': - args.push('-hda', join(outDir, 'bootfs.img'), - '-hdb', join(outDir, 'usersfs.img')) - break - - case 'iso': - args.push('-cdrom', join(outDir, 'bootfs.iso'), - '-hda' , join(outDir, 'usersfs.img')) - break - - case 'qemu': - var append = - [ - 'root=/dev/sda', - 'ip=dhcp' - ] - - switch(process.argv[2]) - { - case 'nographic': - append.push('console=ttyS0') // redirect to terminal - break - - case 'curses': - append.push('vga=extended') // 80x50 - break - - default: - append.push('vga=0x344') // 1024x768x32 - } - - args.push('--kernel', join(outDir, 'kernel'), - '--initrd', join(outDir, 'initramfs.cpio.gz'), - '-drive', `file=${join(outDir, 'usersfs.img')},format=raw,index=0`, - '-append', append.join(' ')) - break - - default: - throw 'Unknown platform "'+platform+'"' -} - -// check if kvm is supported -var kvm = /(vmx|svm)/; -var contents = ""; - -try -{ - contents = fs.readFileSync('/proc/cpuinfo'); -} catch(e){ - throw(e); -} - -if(kvm.test(contents) === false) -{ - // disable kvm - console.log("Your computer does not support kvm. NodeOS will be slower without it."); - args.shift(); -} +const {command, argv, cwd} = prepareCommandLine(process.argv.slice(2)) // Exec NodeOS -spawn(command, args, {stdio: 'inherit'}) +spawn(command, argv, {stdio: 'inherit', cwd}) .on('error', console.trace.bind(console)) .on('exit', function(code, signal) { diff --git a/scripts/test b/scripts/test index 8a3dcaa47..18e8476aa 100755 --- a/scripts/test +++ b/scripts/test @@ -10,52 +10,20 @@ */ const join = require('path').join -const fs = require('fs') const suppose = require('suppose') -const processArguments = require('nodeos-barebones/scripts/processArguments') +const prepareCommandLine = require('..') -const TIMEOUT = 300 // seconds +const TIMEOUT = 30 // seconds -const args = processArguments(process.argv.slice(2)) -const link = fs.readlinkSync('out/latest').split('/') || [] +let {command, argv, cwd, platform} = prepareCommandLine(process.argv.slice(2), + 'nographic') -const cpu_family = args.cpu_family || link[link.length-3] -const machine = args.machine || link[link.length-2] -const platform = args.platform || link[link.length-1] - -const cpu = args.cpu - -var exe -var timeout = setTimeout(function() -{ - exe.kill() - - console.error('Timeout while waiting an answer') - process.exit(-2) -}, TIMEOUT*1000) - - -var command = 'qemu-system-'+args.cpu_family - -var argv = -[ - '-machine', machine, -// '-enable-kvm', - '-m', '256M', - '-nographic', -] - -const outDir = join('out', cpu_family, machine, platform) switch(platform) { - case 'disk': - argv.push('-hda', join(outDir, 'disk.img')) - break - case 'docker': command = 'docker' argv = @@ -69,67 +37,35 @@ switch(platform) ] break - case 'img': - argv.push('-hda', join(outDir, 'bootfs.img'), - '-hdb', join(outDir, 'usersfs.img')) - break - - case 'iso': - argv.push('-cdrom', join(outDir, 'bootfs.iso'), - '-hda' , join(outDir, 'usersfs.img')) - break - - case 'qemu': - const append = - [ - 'root=/dev/sda', - 'console=ttyS0' - ] - - argv.push('--kernel', join(outDir, 'kernel'), - '--initrd', join(outDir, 'initramfs.cpio.gz'), - '-drive', `file=${join(outDir, 'usersfs.img')},format=raw,index=0`, - '-append', append.join(' ')) - break - case 'tar': - fs.accessSync(join(outDir, 'bootfs.tar.gz')) - fs.accessSync(join(outDir, 'usersfs.tar.gz')) + fs.accessSync(join(cwd, 'bootfs.tar.gz')) + fs.accessSync(join(cwd, 'usersfs.tar.gz')) process.exit() break case 'vagga': - fs.accessSync(join(outDir, 'barebones.tar.gz')) - fs.accessSync(join(outDir, 'initramfs.tar.gz')) - fs.accessSync(join(outDir, 'usersfs.tar.gz')) + fs.accessSync(join(cwd, 'barebones.tar.gz')) + fs.accessSync(join(cwd, 'initramfs.tar.gz')) + fs.accessSync(join(cwd, 'usersfs.tar.gz')) process.exit() break - - default: - throw 'Unknown platform "'+platform+'"' } -// // check if kvm is supported -// var kvm = /(vmx|svm)/; -// var contents = ""; -// -// try -// { -// contents = fs.readFileSync('/proc/cpuinfo'); -// } catch(e){ -// throw(e); -// } -// -// if(kvm.test(contents) === false) -// { -// // disable kvm -// console.log("Your computer does not support kvm. NodeOS will be slower without it."); -// args.shift(); -// } - // Exec test -exe = suppose(command, argv, {stripAnsi: true, debug: process.argv[2] === 'debug'}) +let exe +let timeout = setTimeout(function() +{ + exe.kill() + + console.error('Timeout while waiting an answer') + process.exit(-2) +}, TIMEOUT*1000) + + +const options = {stripAnsi: true, debug: true, cwd} +//const options = {stripAnsi: true, debug: process.argv[2] === 'debug', cwd} +exe = suppose(command, argv, options) // On disk images, hook on the bootloader and force kernel to output to console if(platform === 'disk' || platform === 'img' || platform === 'iso') From c243fc6684802f76020fd29fee940d8076268702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 12 Jun 2017 00:39:59 +0200 Subject: [PATCH 190/206] Fix messages of Docker commands --- scripts/dockerBuild | 2 +- scripts/postbuild | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/dockerBuild b/scripts/dockerBuild index ce40dd399..d7e129393 100755 --- a/scripts/dockerBuild +++ b/scripts/dockerBuild @@ -44,7 +44,7 @@ echo -e "${GRY}-----------------------------------------${CLR}" echo echo -e "- Interactively run your image with:" -echo -e "${WHT} npm run docker${CLR}" +echo -e "${WHT} npm start${CLR}" echo echo -e "- Share your creation with:" echo -e "${WHT} docker push $ORG/nodeos${CLR}" diff --git a/scripts/postbuild b/scripts/postbuild index 3a57f42f0..a49970051 100755 --- a/scripts/postbuild +++ b/scripts/postbuild @@ -192,10 +192,10 @@ case $PLATFORM in docker) echo -e "${WHT} npm run dockerBuild${CLR}" - echo -e "${WHT} npm run docker${CLR}" + echo -e "${WHT} npm start${CLR}" echo echo -e "- Share your creation with:" - echo -e "${WHT} docker push NodeOS${CLR}" + echo -e "${WHT} docker push nodeos/nodeos${CLR}" echo echo -e "You would need administrator permissions to exec that commands" ;; From 10fd2c7c63012bc986d57a9b07f60178d64058e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 12 Jun 2017 00:41:34 +0200 Subject: [PATCH 191/206] Test Docker with TTY --- package.json | 2 +- scripts/test | 24 +++--------------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 4cf5f4d8e..3486ec488 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "nodeos-cross-toolchain": "^1.0.0-RC3.1", "prebuild": "piranna/prebuild#prerelease", "qemu": "^2.9.0", - "suppose": "^0.6.2", + "suppose": "jprichardson/node-suppose", "tar2ext": "^0.0.2" } } diff --git a/scripts/test b/scripts/test index 18e8476aa..155ee9ddc 100755 --- a/scripts/test +++ b/scripts/test @@ -24,19 +24,6 @@ let {command, argv, cwd, platform} = prepareCommandLine(process.argv.slice(2), switch(platform) { - case 'docker': - command = 'docker' - argv = - [ - // TODO find a way to correctly set `stdio` as a TTY. Maybe with `pty.js`? - 'run', '-i', - '--cap-add', 'SYS_ADMIN', - '--security-opt=apparmor:unconfined', - '--device', '/dev/fuse', - 'nodeos/nodeos' - ] - break - case 'tar': fs.accessSync(join(cwd, 'bootfs.tar.gz')) fs.accessSync(join(cwd, 'usersfs.tar.gz')) @@ -74,14 +61,9 @@ if(platform === 'disk' || platform === 'img' || platform === 'iso') exe .when(/username: /, 'nodeos\n') .when(/password: /, 'nodeos\n') -.when('~ > ') - -if(platform !== 'docker') - exe.respond('node\n') - .when('> ', 'setTimeout(console.log, 2000, "this is","a test")\n') - .when(/this is a test/) - -exe.respond(function(exe) +.when('~ > ' , 'node\n') +.when('> ', 'setTimeout(console.log, 2000, "this is","a test")\n') +.when(/this is a test/, function(exe) { exe.kill() }) From bb1e1deccadf6d5f7469ac4d320c2f8299225a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 12 Jun 2017 01:22:42 +0200 Subject: [PATCH 192/206] Check if QEmu has permissions to use KVM device if it's available --- lib/index.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/index.js b/lib/index.js index a991474f7..4937c702e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -7,8 +7,9 @@ * @license MIT */ -const fs = require('fs') -const join = require('path').join +const fs = require('fs') +const join = require('path').join +const spawnSync = require('child_process').spawnSync const processArguments = require('nodeos-barebones/scripts/processArguments') @@ -47,12 +48,19 @@ function prepareCommandLine(argv, output) try { - contents = fs.readFileSync('/proc/cpuinfo'); + contents = fs.readFileSync('/proc/cpuinfo') } catch(e){ if(e.code !== 'ENOENT') throw(e) } - if(/(vmx|svm)/.test(contents) !== false) argv.push('-enable-kvm') + // We have support for KVM, let's see if QEmu has permissions to use it + if(/(vmx|svm|0xc0f)/.test(contents) !== false) + try + { + spawnSync(command, {timeout: 1000}) + } catch(e){ + argv.push('-enable-kvm') + } // CWD const cwd = join('out', cpu_family, machine, platform) From 4d19828afcdfe0774335fb8aaed563b84bdd85c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 12 Jun 2017 01:37:41 +0200 Subject: [PATCH 193/206] Restored tests timeout to 300 seconds & reduce rate if KVM is available --- lib/index.js | 5 ++++- scripts/test | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/index.js b/lib/index.js index 4937c702e..bdd7793b4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -53,6 +53,8 @@ function prepareCommandLine(argv, output) if(e.code !== 'ENOENT') throw(e) } + let timeout_rate = 1 + // We have support for KVM, let's see if QEmu has permissions to use it if(/(vmx|svm|0xc0f)/.test(contents) !== false) try @@ -60,6 +62,7 @@ function prepareCommandLine(argv, output) spawnSync(command, {timeout: 1000}) } catch(e){ argv.push('-enable-kvm') + timeout_rate = 0.1 } // CWD @@ -128,7 +131,7 @@ function prepareCommandLine(argv, output) throw 'Unknown platform "'+platform+'"' } - return {command, argv, cwd, platform} + return {command, argv, cwd, platform, timeout_rate} } diff --git a/scripts/test b/scripts/test index 155ee9ddc..437f87b99 100755 --- a/scripts/test +++ b/scripts/test @@ -16,11 +16,11 @@ const suppose = require('suppose') const prepareCommandLine = require('..') -const TIMEOUT = 30 // seconds +const TIMEOUT = 300 // seconds -let {command, argv, cwd, platform} = prepareCommandLine(process.argv.slice(2), - 'nographic') +let {command, argv, cwd, platform, timeout_rate} = + prepareCommandLine(process.argv.slice(2), 'nographic') switch(platform) { @@ -47,7 +47,7 @@ let timeout = setTimeout(function() console.error('Timeout while waiting an answer') process.exit(-2) -}, TIMEOUT*1000) +}, TIMEOUT*timeout_rate*1000) const options = {stripAnsi: true, debug: true, cwd} From dc4722773d133aa42f51e092ca880bf601f657de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Mon, 12 Jun 2017 23:36:44 +0200 Subject: [PATCH 194/206] Disable Docket tests on BigRedButton & updated Readme.md file --- README.md | 62 ++++++++++++++++++++++---------------------- scripts/BigRedButton | 7 +++-- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index d995cc2a2..2a5164fad 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,10 @@ MIT License Lightweight operating system using [Node.js](http://nodejs.org) as userspace. NodeOS is an operating system built entirely in Javascript and managed by -[npm](https://www.npmjs.com). Any package in `npm` is a NodeOS package, that means a selection of more than 400.000 packages. The goal of NodeOS is to provide just -enough to let `npm` provide the rest. Since anyone can contribute to it, anyone -can create NodeOS packages. +[npm](https://www.npmjs.com). Any package in `npm` is a NodeOS package, that +means a selection of more than 400.000 packages. The goal of NodeOS is to +provide just enough to let `npm` provide the rest. Since anyone can contribute +to it, anyone can create NodeOS packages. This project won the Spanish [9th National Free Software Championship](https://www.concursosoftwarelibre.org/1415) on the Systems category and was Honorable Mention of its [10th edition](https://www.concursosoftwarelibre.org/1516). @@ -42,8 +43,8 @@ with a qualification of 10/10 with distinction. ## Introduction -NodeOS is a Node.js based operating system, built-off of the Linux kernel. -The NodeOS Project is aiming to, and can already run on some of the following +NodeOS is a Node.js based operating system, built-off of the Linux kernel. The +NodeOS Project is aiming to, and can already run on some of the following platforms: - **real hardware** like desktops, laptops, or SoC's (Raspberry Pi) @@ -63,25 +64,25 @@ adjust better to each target platform, but the general structure is: All the layers are bootable, leading *barebones* to a raw naked Node.js [REPL](http://nodejs.org/api/repl.html) prompt as PID 1, while *initramfs* exec -actual NodeOS code to mount the *usersfs* partition. In all the cases, it will -be used an initramfs as root filesystem and all the changes will be lost when -powered off. +actual NodeOS code to isolate user code from the core system and, if available, +mount a partition with the users' home directories and root filesystems. If a *usersfs* partition is being set at boot time, it will be mounted and the -system will consider each one of its folders as the home folder for a valid -user on the system, and will execute a `init` file in the root of each of them. -If found, the `root` user will be the first to be considered and will have access +system will consider each one of its folders as the home folder for a valid user +on the system, and will execute a `init` file in the root of each of them. If +found, the `root` user will be the first to be considered and will have access to all of the home directories, but by design it will not be possible to elevate permissions once the system has finished booting. ### Hacking If you are hacking on NodeOS for a somewhat production environment, you are -likely building *usersfs* images since each user is isolated of others, but you -can customize all layers. For example, you can modify -*initramfs* to login users and mount their home folders from a cloud service -or craft a system without global services (no `root` user) or also dedicate a -full NodeOS instance to a single Node.js application. +likely interested on building a custom *usersfs* image or modify it once booted, +since each user is isolated from the others and everyone can be able to define +its own root filesystem, but you can customize all other layers if you want. For +example, you can modify *initramfs* to login users and mount their home folders +from a cloud service or craft a system without global services (no `root` user), +or also dedicate a full NodeOS instance to a single Node.js application. ## Pre-built Images @@ -92,11 +93,12 @@ automatically generated after each commit in master branch that sucessfully need to have [QEmu](http://wiki.qemu.org/Main_Page) installed on your system. The *iso* can be written to a CD-R or flashed to a USB pendrive, but will only -provide the read-only rootfs and the changes will be done in memory losing them -after reboot, so you'll manually need to set a read-write usersfs partition if +provide the read-only rootfs and the changes will be done in memory, losing them +after reboot, so you'll manually need to set a read-write *usersfs* partition if you want to persist them. On the other hand, if you want to flash it to a USB -pendrive, I recommended doing it by using `bin/installUSB` command so it will -automatically create a read-write usersfs partition to fill the remaining space and your changes will be persistent. +pendrive, We recommended doing it by using `bin/installUSB` command so it will +automatically create a read-write *usersfs* partition to fill the remaining +space and use it as persistent storage. ## Build NodeOS in five steps @@ -107,7 +109,8 @@ automatically create a read-write usersfs partition to fill the remaining space cd NodeOS ``` -2. Install the required build tools. On a Ubuntu based system you can do it by executing: +2. Install the required build tools. On a Ubuntu based system you can do it by + executing: ```bash sudo bin/install-dependencies @@ -126,9 +129,9 @@ automatically create a read-write usersfs partition to fill the remaining space ``` By default it will generate some files that can be used with QEmu, compiled - for your current machine architecture. You can configure the build - process by passing some environment variables. For example, to force to build - for 32 bits, use `PLATFORM=qemu_32 npm install` instead. + for your current machine architecture. You can configure the build process + by passing some environment variables. For example, to force to build for 32 + bits, use `BITS=32 npm install` instead. 5. Exec your freshly compiled NodeOS image: @@ -147,26 +150,23 @@ open an [issue](https://github.com/NodeOS/NodeOS/issues). ## NodeOS on LXC containers (Docker and vagga) -NodeOS fully officially supports Docker, but the images published to DockerHub are totally outdated (we're accepting PRs!). If you are interested in helping or testing, you can build them from source code. +NodeOS fully officially supports Docker, published images are available at the +[DockerHub NodeOS organization](https://hub.docker.com/u/nodeos). If you are +interested in helping or testing, you can build them from source code. Vagga support is fairly experimental, and help here will be greatly appreciated. ### Quick Start 1. [Install Docker](http://docs.docker.io/en/latest/installation/) -2. One Liner (outdated images) +2. One Liner ```bash sudo docker run -t -i nodeos/nodeos ``` - or learn how to make a [Custom Build](http://node-os.com/blog/get-involved) - ### Build from Source -*Warning*: the build process is hairy, it probably won't work the first time. -I'm working on that. - ```bash git clone https://github.com/NodeOS/NodeOS.git cd NodeOS diff --git a/scripts/BigRedButton b/scripts/BigRedButton index 53f5a3aff..290450d4a 100755 --- a/scripts/BigRedButton +++ b/scripts/BigRedButton @@ -26,8 +26,11 @@ eval MACHINE=pc PLATFORM=iso BITS=64 $BUILD && $TEST || exit 6 eval MACHINE=pc PLATFORM=qemu BITS=32 $BUILD && $TEST || exit 7 eval MACHINE=pc PLATFORM=qemu BITS=64 $BUILD && $TEST || exit 8 -eval MACHINE=pc PLATFORM=docker BITS=32 $BUILD && $DOCKER && $TEST || exit 9 -eval MACHINE=pc PLATFORM=docker BITS=64 $BUILD && $DOCKER && $TEST || exit 10 +# Docket tests disabled because SemaphoreCI don't support OverlayFS (yet) +eval MACHINE=pc PLATFORM=docker BITS=32 $BUILD && $DOCKER || exit 9 +eval MACHINE=pc PLATFORM=docker BITS=64 $BUILD && $DOCKER || exit 10 +# eval MACHINE=pc PLATFORM=docker BITS=32 $BUILD && $DOCKER && $TEST || exit 9 +# eval MACHINE=pc PLATFORM=docker BITS=64 $BUILD && $DOCKER && $TEST || exit 10 # eval MACHINE=pc PLATFORM=tar BITS=32 $BUILD && $TEST || exit 11 # eval MACHINE=pc PLATFORM=tar BITS=64 $BUILD && $TEST || exit 12 From 3801639f13f6751e75b09dd5fc222599f8f2f67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Fri, 30 Jun 2017 22:00:19 +0200 Subject: [PATCH 195/206] Single Process OS --- README.md | 9 +++++++++ package.json | 2 +- scripts/build | 32 +++++++++++++++++++------------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2a5164fad..24d0b22e3 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,15 @@ If you encounter an error when building NodeOS, take a look at [the wiki](https://github.com/NodeOS/NodeOS/wiki/Fixing-NodeOS-Build-Errors) or open an [issue](https://github.com/NodeOS/NodeOS/issues). +## Single Process OS + +NodeOS can be used as a Single Process OS, where only run a single executable. +To do so, set the `SINGLE_USER` environment variable to the name of a `npm` +module when executing `npm run build`. This will run fully from initram, +persistence can be achieved by setting this environment variable to an empty +string and later using a custom `usersfs` partition, but this is still +experimental. + ## NodeOS on LXC containers (Docker and vagga) NodeOS fully officially supports Docker, published images are available at the diff --git a/package.json b/package.json index 3486ec488..38084a2f4 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "private": true, "dependencies": { "nodeos-barebones": "^1.0.0-RC3.1", - "nodeos-initramfs": "^1.0.0-RC3.2", + "nodeos-initramfs": "NodeOS/nodeos-initramfs", "nodeos-usersfs": "NodeOS/nodeos-usersfs" }, "devDependencies": { diff --git a/scripts/build b/scripts/build index 6c70706d7..90b55f498 100755 --- a/scripts/build +++ b/scripts/build @@ -49,6 +49,9 @@ if [[ "$PLATFORM" == "docker" ]]; then export KERNEL=nokernel fi +# Default: multiple users system +export SINGLE_USER=${SINGLE_USER-"nodeos-boot-multiUser"} + NPMi="npm install --arch=$NODE_ARCH --production" @@ -57,8 +60,11 @@ NPMi="npm install --arch=$NODE_ARCH --production" # ( cd $BAREBONES && $NPMi ) && -( cd $INITRAMFS && $NPMi ) && -( cd $USERSFS && $NPMi ) || exit 10 +( cd $INITRAMFS && $NPMi ) || exit 10 + +if [ "$SINGLE_USER" == "nodeos-boot-multiUser" ]; then + ( cd $USERSFS && $NPMi ) || exit 11 +fi # @@ -66,7 +72,7 @@ NPMi="npm install --arch=$NODE_ARCH --production" # BAREBONES=$BAREBONES/out/$CPU -INITRAMFS=$INITRAMFS/out/$CPU +INITRAMFS=$INITRAMFS/out/$CPU-$SINGLE_USER USERSFS=$USERSFS/out/$CPU.tar.gz STEP_DIR=$OUT_DIR @@ -74,8 +80,8 @@ STEP_DIR=$OUT_DIR mkdir -p $STEP_DIR function copyAndConvertInitrams() { - cpio2tar $BAREBONES/barebones.cpio.gz | gzip -c > $STEP_DIR/barebones || err 20 - cpio2tar $INITRAMFS | gzip -c > $STEP_DIR/initramfs || err 21 + cpio2tar $BAREBONES/barebones.cpio.gz | gzip -c > $STEP_DIR/barebones || err 20 + cpio2tar $INITRAMFS | gzip -c > $STEP_DIR/initramfs-$SINGLE_USER || err 21 } case $MACHINE in @@ -102,7 +108,7 @@ case $MACHINE in tar --delete dev/console | \ gzip > $STEP_DIR/barebones.tar.gz || err 40 - mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 41 + mv $STEP_DIR/initramfs-$SINGLE_USER $STEP_DIR/initramfs.tar.gz || err 41 # Exec `logon` directly instead of use `node-bin-getty` on the console mkdir -p root/etc && cp resources/palmtree.json root/etc || err 42 @@ -149,16 +155,16 @@ case $MACHINE in tar) copyAndConvertInitrams || exit $? - nodeos-bootfs \ - -B $STEP_DIR/barebones \ - -F $PLATFORM \ - -I $STEP_DIR/initramfs \ - -O $STEP_DIR/bootfs.tar.gz || err 80 + nodeos-bootfs \ + -B $STEP_DIR/barebones \ + -F $PLATFORM \ + -I $STEP_DIR/initramfs-$SINGLE_USER \ + -O $STEP_DIR/bootfs.tar.gz || err 80 cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 81 # Delete temporal initrams - rm -f $STEP_DIR/barebones $STEP_DIR/initramfs || err 82 + rm -f $STEP_DIR/barebones $STEP_DIR/initramfs-$SINGLE_USER || err 82 ;; vagga) @@ -168,7 +174,7 @@ case $MACHINE in tar --delete dev/console sbin/init | \ gzip > $STEP_DIR/barebones.tar.gz || err 90 - mv $STEP_DIR/initramfs $STEP_DIR/initramfs.tar.gz || err 91 + mv $STEP_DIR/initramfs-$SINGLE_USER $STEP_DIR/initramfs.tar.gz || err 91 cp $USERSFS $STEP_DIR/usersfs.tar.gz || err 92 From 96b0b4fcfadee31c800e89c4b36e23af50c2fd39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Legan=C3=A9s-Combarro=20=27piranna?= Date: Fri, 30 Jun 2017 22:02:21 +0200 Subject: [PATCH 196/206] Don't show QEmu window when checking for KVM & check it only for QEmu images --- lib/index.js | 51 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lib/index.js b/lib/index.js index bdd7793b4..3be958503 100644 --- a/lib/index.js +++ b/lib/index.js @@ -14,6 +14,31 @@ const spawnSync = require('child_process').spawnSync const processArguments = require('nodeos-barebones/scripts/processArguments') +function checkKvm(qemuBin) +{ + let contents = "" + + try + { + contents = fs.readFileSync('/proc/cpuinfo') + } catch(e){ + if(e.code !== 'ENOENT') throw(e) + + return false + } + + if(! /(vmx|svm|0xc0f)/.test(contents)) return false + + // We have support for KVM, let's see if QEmu has permissions to use it + try + { + spawnSync(qemuBin, ['-nographic'], {timeout: 1000}) + } catch(e){ + return true + } +} + + function prepareCommandLine(argv, output) { const args = processArguments(argv) @@ -44,26 +69,16 @@ function prepareCommandLine(argv, output) } // check if kvm is supported - let contents = "" - - try - { - contents = fs.readFileSync('/proc/cpuinfo') - } catch(e){ - if(e.code !== 'ENOENT') throw(e) - } - let timeout_rate = 1 - // We have support for KVM, let's see if QEmu has permissions to use it - if(/(vmx|svm|0xc0f)/.test(contents) !== false) - try + function qemuKvm() + { + if(checkKvm(command)) { - spawnSync(command, {timeout: 1000}) - } catch(e){ argv.push('-enable-kvm') timeout_rate = 0.1 } + } // CWD const cwd = join('out', cpu_family, machine, platform) @@ -71,6 +86,8 @@ function prepareCommandLine(argv, output) switch(platform) { case 'disk': + qemuKvm() + argv.push('-hda', 'disk.img') break @@ -88,16 +105,22 @@ function prepareCommandLine(argv, output) break case 'img': + qemuKvm() + argv.push('-hda', 'bootfs.img', '-hdb', 'usersfs.img') break case 'iso': + qemuKvm() + argv.push('-cdrom', 'bootfs.iso', '-hda' , 'usersfs.img') break case 'qemu': + qemuKvm() + const append = [ 'root=/dev/sda', From 16a5e6406d6e3f3dd8f4e11a685b2919a72cf703 Mon Sep 17 00:00:00 2001 From: luii Date: Thu, 14 Dec 2017 20:49:28 +0100 Subject: [PATCH 197/206] Added support for Dependency Installation on Arch, Debian and Gentoo --- bin/install-dependencies | 81 +++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/bin/install-dependencies b/bin/install-dependencies index 1d191909d..426d8bfef 100755 --- a/bin/install-dependencies +++ b/bin/install-dependencies @@ -7,39 +7,58 @@ # # MIT License +# This particular option sets the exit code of a pipeline to that of the +#rightmost command to exit with a non-zero status, +#or to zero if all commands of the pipeline exit successfully. set -o pipefail +NODESOURCE=https://deb.nodesource.com/setup_6.x + +if [ -f /etc/redhat-release ]; then +PKGMGR='yum' + +elif [ -f /etc/arch-release ]; then +PKGMGR='pacman -S -y --noconfirm' +$PKGMGR gcc texinfo python2 || exit 1 # cross compiler +$PKGMGR bc libcurl-gnutls pixman || exit 10 # barebones +$PKGMGR cdrkit || exit 20 # bootfs +$PKGMGR cpio || exit 30 # initramfs +$PKGMGR autoconf automake || exit 40 # usersfs +$PKGMGR sdl || exit 50 # qemu +$PKGMGR nodejs-lts-boron || exit 60 # nodejs + +ln -sf /usr/bin/python2 /usr/bin/python # symlink to python 2 +npm config set python /usr/bin/python2 + +elif [ -f /etc/gentoo-release ]; then +PKGMGR='emerge --ask n' + +$PKGMGR sys-devel/gcc texinfo python-2.7 || exit 1 +$PKGMGR sys-devel/bc x11-libs/pixman net-libs/gnutls || exit 10 +$PKGMGR net-misc/curl || exit 21 +$PKGMGR app-cdr/cdrtools || exit 30 +$PKGMGR app-arch || exit 40 +$PKGMGR dev-vcs/git || exit 50 +$PKGMGR sys-fs/mtools || exit 60 +$PKGMGR sys-libs/glibc || exit 70 +$PKGMGR sys-libs/libuuid || exit 80 +$PKGMGR media-libs/libsdl || exit 90 + +elif [ -f /etc/SuSE-release ]; then +PKGMGR='zypp' + +elif [ -f /etc/debian_version ]; then +PKGMGR='apt-get -qq -y' + +dpkg --add-architecture i386 && $PKGMGR update || exit 1 +$PKGMGR install curl || exit 10 +$PKGMGR install gcc git || exit 20 +$PKGMGR install bc || exit 21 +$PKGMGR install genisoimage mtools libc6-i386 libuuid1:i386 || exit 22 +$PKGMGR install libsdl1.2-dev || exit 30 -APT='apt-get -qq -y' - - -# -# Install Ubuntu dependencies -# The dependencies of one level would also be needed for the next ones -# - -# Update cache -dpkg --add-architecture i386 && -$APT update || exit 1 - - -# Install dependencies $ Node.js -$APT install curl || exit 10 - -# cross-compiler -$APT install gcc git || exit 20 - -# barebones -$APT install bc || exit 21 - -# bootfs -$APT install genisoimage mtools libc6-i386 libuuid1:i386 || exit 22 - - -# qemu -$APT install libsdl1.2-dev || exit 30 +# Update Node.js to v6.x (npm3) from the NodeSource repository +curl -sL $NODESOURCE | bash && $APT install nodejs || exit 40 +fi -# Update Node.js to v6.x (npm3) from the NodeSource repository -curl -sL https://deb.nodesource.com/setup_6.x | bash && -$APT install nodejs || exit 40 From 578a52bc34497d13189a5fd85112c0f3ed7e18b9 Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Fri, 22 Dec 2017 20:52:26 +0100 Subject: [PATCH 198/206] Fix initramfs copy path Recently i encountered the exit code 71 which i traced back to line #75 in scripts/build and saw that it used a - (minus) instead of a _ (underscore) so i changed the concatenation of the strings --- scripts/build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build b/scripts/build index 90b55f498..48871ad98 100755 --- a/scripts/build +++ b/scripts/build @@ -72,7 +72,7 @@ fi # BAREBONES=$BAREBONES/out/$CPU -INITRAMFS=$INITRAMFS/out/$CPU-$SINGLE_USER +INITRAMFS=$INITRAMFS/out/${CPU}_${SINGLE_USER} USERSFS=$USERSFS/out/$CPU.tar.gz STEP_DIR=$OUT_DIR From 79b3d23f114fb065b94579978be1b67f9ba0b3a2 Mon Sep 17 00:00:00 2001 From: seanewest Date: Sun, 31 Dec 2017 18:57:02 -0700 Subject: [PATCH 199/206] Add npm to install-dependencies --- bin/install-dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/install-dependencies b/bin/install-dependencies index 426d8bfef..625ffd732 100755 --- a/bin/install-dependencies +++ b/bin/install-dependencies @@ -26,6 +26,7 @@ $PKGMGR cpio || exit 30 # initramfs $PKGMGR autoconf automake || exit 40 # usersfs $PKGMGR sdl || exit 50 # qemu $PKGMGR nodejs-lts-boron || exit 60 # nodejs +$PKGMGR npm || exit 70 # npm ln -sf /usr/bin/python2 /usr/bin/python # symlink to python 2 npm config set python /usr/bin/python2 From 22ad07794d8b4a9de58cfbda3e50e7baebfea09f Mon Sep 17 00:00:00 2001 From: seanewest Date: Sun, 31 Dec 2017 19:01:04 -0700 Subject: [PATCH 200/206] Minor formatting change to install-dependencies --- bin/install-dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/install-dependencies b/bin/install-dependencies index 625ffd732..6086829bc 100755 --- a/bin/install-dependencies +++ b/bin/install-dependencies @@ -26,7 +26,7 @@ $PKGMGR cpio || exit 30 # initramfs $PKGMGR autoconf automake || exit 40 # usersfs $PKGMGR sdl || exit 50 # qemu $PKGMGR nodejs-lts-boron || exit 60 # nodejs -$PKGMGR npm || exit 70 # npm +$PKGMGR npm || exit 70 # npm ln -sf /usr/bin/python2 /usr/bin/python # symlink to python 2 npm config set python /usr/bin/python2 From 9fc4e2fc0865c11658746ff64532d888fa101a88 Mon Sep 17 00:00:00 2001 From: Rahul Jain Date: Mon, 5 Feb 2018 11:13:41 +0530 Subject: [PATCH 201/206] Fixed browse_from_source.md Link Link gives 404 error previously --- docs/en/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/README.md b/docs/en/README.md index 4df313604..c76d84a4e 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -4,7 +4,7 @@ NodeOS is a lightweight operating system using Node.js as userspace. NodeOS is an operating system built entirely in Javascript and using npm as it's package manager. Any package in npm is a NodeOS package, which at last count was 244, 180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. -**Quick links:** [[Getting Started]] | [[Building From Source](./Building-From-Source.md)] +**Quick links:** [[Getting Started]] | [[Building From Source](./building_from_source.md)] ## Contributors From e2529769be4a88d6d566bf4dbfe25990d5b07cdf Mon Sep 17 00:00:00 2001 From: Rahul Jain Date: Mon, 5 Feb 2018 12:56:54 +0530 Subject: [PATCH 202/206] fixing Semaphore CI Build Failure --- bin/install-dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/install-dependencies b/bin/install-dependencies index 426d8bfef..2e280bdc0 100755 --- a/bin/install-dependencies +++ b/bin/install-dependencies @@ -58,7 +58,7 @@ $PKGMGR install genisoimage mtools libc6-i386 libuuid1:i386 || exit 22 $PKGMGR install libsdl1.2-dev || exit 30 # Update Node.js to v6.x (npm3) from the NodeSource repository -curl -sL $NODESOURCE | bash && $APT install nodejs || exit 40 +curl -sL $NODESOURCE | bash && $PKGMGR install nodejs || exit 40 fi From fd89bddc67dbee95676f3d47cdccac4863a1cbbf Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Sat, 26 May 2018 13:32:31 +0200 Subject: [PATCH 203/206] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..cdfaa8399 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,43 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + + + +## Description + + +## Expected Behavior + + +## Actual Behavior + + +## Possible Fix + + +## Screenshots or Log + + +## Steps to Reproduce + + +1. +2. +3. +4. + +## Context + + +## Your Environment + +* Operating System used: +* Platform used: +* Node Version used (locally): +* NPM Version used (locally): +* NodeOS Version used: +* Special Environment Variables used: +* Link to your project: From 465db332120c99e7aa4e84cccb1af48e6ca1dead Mon Sep 17 00:00:00 2001 From: Philipp Czarnetzki Date: Fri, 1 Jun 2018 20:45:57 +0200 Subject: [PATCH 204/206] Add feature request template --- .github/ISSUE_TEMPLATE/feature_request.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..cecab4519 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** + +> + +**Describe the solution you'd like** + +> + +**Describe alternatives you've considered** + +> + +**Additional context** + +> From bcf18abd2d0835c65da345d6aeed0bc73c8132da Mon Sep 17 00:00:00 2001 From: Michael Lefkowitz <1746853+lfkwtz@users.noreply.github.com> Date: Fri, 17 Aug 2018 11:52:32 -0500 Subject: [PATCH 205/206] Update README.md --- docs/en/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/README.md b/docs/en/README.md index c76d84a4e..77948463b 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -2,7 +2,7 @@ # What is NodeOS? -NodeOS is a lightweight operating system using Node.js as userspace. NodeOS is an operating system built entirely in Javascript and using npm as it's package manager. Any package in npm is a NodeOS package, which at last count was 244, 180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. +NodeOS is a lightweight operating system using Node.js as userspace. NodeOS is an operating system built entirely in Javascript and using npm as it's package manager. Any package in npm is a NodeOS package, which at last count was 244,180 packages. The goal of NodeOS is to provide just enough to let npm provide the rest. Since anyone can contribute to npm, anyone can create NodeOS packages. **Quick links:** [[Getting Started]] | [[Building From Source](./building_from_source.md)] From c6d67d04e006a96463db3592b6a950469900a2b9 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 25 Sep 2018 15:47:38 -0700 Subject: [PATCH 206/206] remove bithound badge bithound is no longer in business. The badge is broken. Remove it. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 24d0b22e3..2a5bc18db 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ MIT License [![Build Status](https://semaphoreapp.com/api/v1/projects/71d72807-779a-40d3-a8d4-523cd0a52eb3/356164/shields_badge.svg)](https://semaphoreapp.com/nodeos/nodeos) [![Stories in Ready](https://badge.waffle.io/NodeOS/NodeOS.png?label=ready&title=Ready)](https://waffle.io/NodeOS/NodeOS) [![Join the chat at https://gitter.im/NodeOS/NodeOS](https://badges.gitter.im/NodeOS/NodeOS.svg)](https://gitter.im/NodeOS/NodeOS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![bitHound Overall Score](https://www.bithound.io/github/NodeOS/NodeOS/badges/score.svg)](https://www.bithound.io/github/NodeOS/NodeOS) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg)](https://opensource.org/licenses/mit-license.php) # NodeOS