Commit graph

2608 commits

Author SHA1 Message Date
Andrew Clayton
60eb6c43a7 Wasm-wc: Allow to use the 'reactor' adaptor again
With the initial port to wasmtime 17 we could no longer use the
'reactor' adaptor but had to switch to the more restrictive 'proxy'
adaptor.

This meant amongst other things (probably) we could no longer access the
filesystem.

Thanks to Joel Dice for pointing out the fix.

With this we can go back to using the 'reactor' adaptor again and things
are back to working as before.

It's worth noting that you can use either the 'proxy' or 'reactor'
adaptor depending on your requirements.

Cc: Joel Dice <joel.dice@fermyon.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
98f808af2c Wasm-wc: Upgrade to wasmtime 17
This brings WASI 0.2.0 support.

Link: <https://github.com/bytecodealliance/wasmtime/releases/tag/v17.0.0>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
ac3a54d671 Wasm-wc: Improve request buffer handling
When Unit receives a request, if the body of that request is greater
than a certain amount (16KiB by default) then it is written to a
temporary file.

When a language module goes to read the request body in such situations
it will end up using read(2).

The wasm-wasi-component language module was failing to properly read
request bodies of around 2GiB or more.

This is because (on Linux at least) read(2) (and other related system
calls) will only read (or write) at most 0x7ffff000 (2,147,479,552)
bytes, this is the case for both 32 and 64-bit systems.

Regardless, it's probably not a good idea doing IO in such large chunks
anyway.

This patch changes the wasm-wasi-component language module to read the
request buffer in 32MiB chunks (this matches the original 'wasm'
language module).

We are still limited to a 4GiB address space and can only upload files a
little under 4GiB.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
79c8177247 Wasm-wc: Run src/lib.rs through rustfmt
Run from the repository root like

  $ rustfmt --edition 2021 src/wasm-wasi-component/src/lib.rs

Also manually fix up some overly long comments.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
a9345dd46e Add a .rustfmt.toml file
This is used by the rustfmt program to format Rust code according to the
rules contained in this file.

Currently we just set the line width limit to 80 characters to match our
C code.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Alex Crichton
20ada4b5c1 Wasm-wc: Core of initial Wasm component model language module support
This is the work of Alex Crichton.

This is written in Rust. The problem is that there is currently no
support on the C side of things for the component model, which is the
point of this module.

It talks to Unit via automatically generated bindings.

I've (Andrew) just made some minor tweaks to src/lib.rs, build.rs &
Cargo.toml to adjust some paths, adjust where we get the language module
config from and the module name and where it's located in the source
tree,

I also removed and disabled the tracking of the Cargo.lock file, this is
constantly changing and not tracking it seems right for 'libraries' and
dropped the README's...

Other than that I have tried to leave his work intact, subsequent
commits will make some larger changes, but I didn't want to intermix
them with Alex's work.

One such commit will update the module to use wasmtime 17 which brings
WASI 0.2.0 support.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
f078272265 Wasm-wc: Add core configuration data structure
This is required to actually _build_ the 'wasm-wasi-componet' language
module.

The nxt_wasm_wc_app_conf_t structure consists of the component name, e.g
my_component.wasm, this is required. It also consists of an object to
store the directories that are allowed access to by the component, this
is optional.

The bulk of the configuration infrastructure will be added in a
subsequent commit.

Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
f2e6447567 Wasm-wc: Register a new Wasm component model language module type
This is the first commit in adding WebAssembly Component Model language
module support.

This just adds a new NXT_APP_WASM_WC type, required by subsequent
commits.

The WC stands for WASI_COMPONENT

This new module will have a type of 'wasm-wasi-component'.

Link: <https://github.com/nginx/unit/issues/1098>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:20:32 +00:00
Andrew Clayton
bca44630ed .mailmap: Map Dylan's GitHub address
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-21 16:06:42 +00:00
Dylan Arbour
56d3a1a72b Add GitHub Actions
This commit adds GitHub Actions configuration, running tests on
pull-requests and master push changes.

This change is meant to be a first-pass at our evolving CI processes.

- Tests run in parallel per language for speed and isolation
- Test matrix is composed by a string list of languages and versions
- `setup-${language}` actions are preferred over base (and changing)
  versions from `ubuntu-latest` operating system

A few caveats with the current setup:

- Only tests on Ubuntu (no FreeBSD or Alpine)
- Unpriviledged tests only
- No core dumps available on failure
2024-02-21 09:54:05 -05:00
Andrei Zeliankou
697a585062 Python: bytearray body support for ASGI module.
@filiphanes requested support for bytearray
and memoryview in the request body here:
<https://github.com/nginx/unit/issues/648>

This patch implements bytearray body support only.
Memoryview body still need to be implemented.
2024-02-21 14:06:43 +00:00
Andrei Zeliankou
f71ead5fa5 Updated copyright notice. 2024-02-20 16:08:36 +00:00
Alejandro Colomar
6aa5ef63ce
Tools: setup-unit: ctl edit: Append suffix to tmp file name
This allows the editor(1) to enable syntax highlighting.  See
suffixes(7).

Cc: Liam Crilly <liam@nginx.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-20 16:04:25 +01:00
Alejandro Colomar
bc093ab3ee
Tools: setup-unit: Fix error message
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-20 16:04:24 +01:00
Alejandro Colomar
565a8ed018
Tools: setup-unit: ctl edit: Print file name on error
When editing the configuration in-place, it's easy to make a mistake.
If the configuration is wrong, it will be passed to the control socket,
which will reject it, keeping the old configuration.  Those manual edits
would be lost, which can make it very uncomfortable to edit in-place.

By printing the name of the temporary file, we allow the user to recover
the changes.

Cc: Liam Crilly <liam@nginx.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-20 16:04:24 +01:00
Alejandro Colomar
e9a0c49dbc
Tools: setup-unit: Pass --fail-with-body to curl(1)
Suggested-by: Liam Crilly <liam@nginx.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-20 16:04:24 +01:00
Alejandro Colomar
d6ed000316
Tools: setup-unit: De-duplicate code
Centralize handling of the ssh(1) tunnel in the ctl command.
This is possible now that we do the cleanup with trap(1).

Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-20 16:04:24 +01:00
Alejandro Colomar
cca2c46e49
Tools: setup-unit: Use trap(1) to handle cleanup
This allows listening to command exit statuses.  Before this change, we
had to ignore the exit status of curl(1) (and a few other commands),
since otherwise the script would go kaboom and not cleanup the ssh(1)
tunnels.

Fixes: 543d478e12 ("Tools: setup-unit: ctl: added "edit" subcommand.")
Fixes: 3778877eb3 ("Tools: Added subcommands to setup-unit.")
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-20 16:04:23 +01:00
Andrei Zeliankou
2765522b94 Tests: NJS request variables 2024-02-20 14:55:00 +00:00
Dan Callahan
d52a9361a8 Docker: Update versions of Go, Node, PHP, Ruby
- Go: Drop 1.20, Add 1.22
- Node: Drop 18, Add 21
- PHP: Add 8.3
- Ruby: Add 3.3

Perl and Python are still up-to-date with upstream releases

Regenerating the Dockerfiles also picks up the logging change from
183a1e9d63
2024-02-20 13:43:05 +00:00
Andrew Clayton
914cd4e354 .mailmap: Map some more personal addresses
Add more entries for Andrei and Konstantin and an entry for Dan.

Reviewed-by: Dan Callahan <d.callahan@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-20 13:29:52 +00:00
Dan Callahan
bd0abdf083 Docker: Shallow clone the Unit repo
Saves on the order of 10 MBs of transfer for each build.

We call `rm -rf /usr/src/unit` later in this step, so the full repo has
never appeared in our published images anyway.
2024-02-20 12:35:50 +00:00
Gabor Javorszky
d24ae5a9a4 Add additional replace rules for node:* modules
In that particular issue the compiled nuxt files end up importing the
http module as node:http rather than http only. This bypasses unit's
custom loader implementation which only check for the http or unit-http
modules, and their websocket counterparts.

This changeset adds replace sources for both the node:http and
node:websocket import signatures.

Closes: https://github.com/nginx/unit/issues/1013
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-20 12:35:07 +00:00
Dan Callahan
53648ed564 Tools: Fix typo in tools/README.md
As suggested by @lcrilly
2024-02-20 12:28:43 +00:00
Konstantin Pavlov
5570d807d9 Packages: fixed a path to python 3.12 example app 2024-02-20 12:27:52 +00:00
Konstantin Pavlov
183a1e9d63 Docker: redirect logs to stderr
This allows to use /dev/stdout as application logs if users choose to do
so.

Closes: https://github.com/nginx/unit/issues/982
2024-02-20 12:25:00 +00:00
Zhidao HONG
33c6c4d4c0 NJS: variable access support
This commit introduces the 'vars' JavaScript object to NJS,
enabling direct access to native variables such as $uri and $arg_foo.
The syntax is `${vars.var_name}` or `${'vars[var_name]'}`.

For example:
    {
        "action": {
            "share": "`/www/html${vars.uri}`"
        }
    }
2024-02-20 06:09:23 +08:00
Zhidao HONG
63ad4deb8a NJS: Simplified nxt_js_call() 2024-02-20 06:09:23 +08:00
Zhidao HONG
465540157f Var: Introduced nxt_var_get()
This commit is for subsequent commits that will support njs variable
accessing. In this commit, nxt_var_get() is introduced to extend
the variable handling capabilities. Concurrently, nxt_var_ref_get()
has been refactored to use in both configuration and request phases.
2024-02-20 06:09:23 +08:00
Zhidao HONG
63507c499e Var: Make nxt_var_cache_value() more general
This commit enhances nxt_var_cache_value() to enable variable access
using string names, complementing the existing reference index method.
The modification ensures future compatibility with njs variable access.
2024-02-20 06:09:23 +08:00
Zhidao HONG
01fd121c4e Var: Refactored nxt_http_unknown_var_ref() 2024-02-20 06:09:23 +08:00
Zhidao HONG
62894ae77b Var: Refactored nxt_var_ref_get() 2024-02-20 06:09:23 +08:00
Andrew Clayton
30b410e490 Avoid a segfault in nxt_conn_io_sendbuf()
This is a simple temporary fix (doesn't address the underlying problem)
for an issue reported by a user on GitHub whereby downloading of files
from a PHP application would cause the router process to crash.

This is actually a generic problem that will affect anything sending
data via nxt_unit_response_write().

This is just a simple fix for the 1.32 release, after which the full
correct fix will be worked out.

Link: <https://github.com/nginx/unit/issues/1125>
Reported-by: rustedsword <https://github.com/rustedsword>
Co-developed-by: rustedsword <https://github.com/rustedsword>
Tested-by: rustedsword <https://github.com/rustedsword>
Tested-by: Andrew Clayton <a.clayton@nginx.com>
Reviewed-by: Zhidao Hong <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-19 22:02:49 +00:00
Andrew Clayton
0c98353091 Node.js: Build/install fix
A user on GitHub reported an issue when trying to build/install the
nodejs language module.

Doing a

  $ ./configure nodejs --node=/usr/bin/node --npm=/usr/bin/npm --node-gyp=/usr/bin/node-gyp
  $ make install

was throwing the following error

  mv build/src//usr/bin/node/unit-http-g/unit-http-1.31.1.tgz build//usr/bin/node-unit-http-g.tar.gz
  mv: cannot move 'build/src//usr/bin/node/unit-http-g/unit-http-1.31.1.tgz' to 'build//usr/bin/node-unit-http-g.tar.gz': No such file or directory
  make: *** [build/Makefile:2061: build//usr/bin/node-unit-http-g.tar.gz] Error 1

The fact that we're using the path given by --node= to then use as
directory locations seems erroneous.

But rather than risk breaking existing expectations the simple fix is to
just use build/src in the destination path above to match that of the
source.

These paths were added in some previous commits, and the missing 'src/'
component looks like an oversight.

After this commit both the following work

  $ ./configure nodejs --node-gyp=/usr/lib/node_modules/bin/node-gyp-bin/node-gyp --local=/opt/unit/node
  $ ./configure nodejs --node=/usr/bin/node --node-gyp=/usr/lib/node_modules/npm/bin/node-gyp-bin/node-gyp --local=/opt/unit/node

Reported-by: ruspaul013 <https://github.com/ruspaul013>
Tested-by: ruspaul013 <https://github.com/ruspaul013>
Fixes: 0ee8de554 ("Fixed Makefile target for NodeJS.")
Fixes: c84948386 ("Node.js: fixing module global installation.")
Reviewed-by: Timo Stark <t.stark@nginx.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-19 16:47:27 +00:00
Andrei Zeliankou
ea239635be Docker: Switch python3.12 to using github
Forgotten in
<c3af21e970>
2024-02-19 15:18:13 +00:00
Dan Callahan
756feafd54 Node.js: Use console.warn instead of stderr.write
Functionally identical, but marginally more idiomatic.

Refines: fbeb2065b1
2024-02-19 14:56:57 +00:00
Liam Crilly
1dca86028a Tools: disambiguate unitc control socket detection
Now that unitd has multiple --control* startup options, locating the
address of the control socket requires additional precision.

Signed-off-by: Liam Crilly <liam.crilly@nginx.com>
Acked-by: Andrew Clayton <a.clayton@nginx.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-19 13:00:26 +00:00
Andrew Clayton
2bd3b41876 Docs: Update man page for new --control-* options
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-19 13:00:16 +00:00
Andrew Clayton
b500c36d2e Allow to set the permissions of the Unix domain control socket
Several users in GitHub have asked for the ability to set the
permissions of the unitd UNIX Domain control socket.

This can of course be done externally, but can be done much cleaner by
Unit itself.

This commit adds three new options

  --control-mode	Set the mode of the socket, e.g 644

  --control-user	Set the user/owner of the socket, e.g unit

  --control-group	Set the group of the socket, e.g unit

Of course these only have an affect when using a UNIX Domain Socket for
the control socket.

Requested-by: michaelkosir <https://github.com/michaelkosir>
Requested-by: chopanovv <https://github.com/chopanovv>
Link: <https://github.com/nginx/unit/issues/254>
Link: <https://github.com/nginx/unit/issues/980>
Closes: https://github.com/nginx/unit/issues/840
Tested-by: Liam Crilly <liam.crilly@nginx.com>
Reviewed-by: Zhidao Hong <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-19 12:59:58 +00:00
Andrew Clayton
34b3a812b1 Add nxt_file_chown()
This wraps chown(2) but takes the user/owner and group as strings.

It's a little long winded as it uses the thread safe versions of
getpwnam()/getgrname() which require a little more work.

This function will be used by the following commit that allows to set
the permissions of the Unix domain control socket.

We need to cast uid & gid to long in the call to nxt_thread_log_alert()
to appease clang-ast as it's adamant that uid/gid are unsigned ints, but
chown(2) takes -1 for these values to indicate don't change this item,
and it'd be nice to show them in the error message.

Note that getpwnam()/getgrname() don't define "not found" as an error as
per their man page

  The  formulation given above under "RETURN VALUE" is from POSIX.1-2001.
  It does not call "not found" an error, and hence does not specify  what
  value errno might have in this situation.  But that makes it impossible
  to  recognize  errors.   One  might argue that according to POSIX errno
  should be left unchanged if an entry is not found.  Experiments on var‐
  ious UNIX-like systems show that lots of different values occur in this
  situation: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK,  EPERM,  and  probably
  others.

Thus if we log an error from these functions we can end up with the
slightly humorous error message

  2024/02/12 15:15:12 [alert] 99404#99404 getpwnam_r("noddy", ...) failed (0: Success) (User not found) while creating listening socket on unix:/opt/unit/control.unit.sock

Reviewed-by: Zhidao Hong <z.hong@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2024-02-19 12:59:29 +00:00
Konstantin Pavlov
baff936be1 Packages: Move dist target to git archive 2024-02-16 13:14:35 -08:00
Konstantin Pavlov
c3af21e970 Docker: Switch to github 2024-02-16 13:13:42 -08:00
Gabor Javorszky
fbeb2065b1
fix: Take options as well as requestListener (#1091)
* Take options as well as requestListener

Unit-http have not kept up with the signature of nodejs's http package
development. Nodejs allows an optional `options` object to be passed to
the `createServer` function, we didn't. This resulted in function
signature errors when user code that did make use of the options arg
tried to call unit's replaced function.

This change changes the signature to be more in line with how nodejs
does it discarding it and printing a message to stdout.

* Add test file to start node application with options

* Add changes to docs/changes.xml

Closes: https://github.com/nginx/unit/issues/1043
2024-02-14 18:16:01 +00:00
tclesius
2b0d93d1a7 Docker: Generated Dockerfile for Unit 1.31.1. 2024-02-13 17:53:43 -08:00
tclesius
661e918a70 Docker: added python3.12 to versions 2024-02-13 17:53:43 -08:00
Konstantin Pavlov
bad2c181e1 Packages: Added Fedora 39 support. 2024-02-09 14:31:36 -08:00
Konstantin Pavlov
ca1bc0625a contrib: updated njs to 0.8.2. 2024-02-09 14:31:36 -08:00
Konstantin Pavlov
8ebe04fd5d contrib: Bump libunit-wasm to 0.3.0. 2024-02-09 14:31:36 -08:00
Konstantin Pavlov
3a2687bb71 Packages: added Ubuntu 23.10 "mantic" support. 2024-02-09 14:31:36 -08:00
Alejandro Colomar
9e98670448
Configuration: Fix validation of "processes"
It's an integer, not a floating number.

Fixes: 68c6b67ffc ("Configuration: support for rational numbers.")
Closes: https://github.com/nginx/unit/issues/1115
Link: <https://github.com/nginx/unit/pull/1116>
Reviewed-by: Zhidao Hong <z.hong@f5.com>
Reviewed-by: Andrew Clayton <a.clayton@nginx.com>
Cc: Dan Callahan <d.callahan@f5.com>
Cc: Valentin Bartenev <vbartenev@gmail.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-02-08 15:04:33 +01:00