Date: Sat, 15 Aug 2020 05:30:41 +0000 (UTC) From: "Tobias C. Berner" <tcberner@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r544909 - in head/www: . gwsocket gwsocket/files Message-ID: <202008150530.07F5UfbJ084181@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: tcberner Date: Sat Aug 15 05:30:41 2020 New Revision: 544909 URL: https://svnweb.freebsd.org/changeset/ports/544909 Log: New port: www/gwsocket Simple WebSocket Server gwsocket is a simple, standalone, language-agnostic, RFC6455 compliant WebSocket Server, written in C. It sits between your application and the client's browser, giving fast bidirectional communication between these two with ease and flexibility. More info at: http://gwsocket.io. PR: 247884 Submitted by: Daniel Morante <daniel@morante.net> Added: head/www/gwsocket/ head/www/gwsocket/Makefile (contents, props changed) head/www/gwsocket/distinfo (contents, props changed) head/www/gwsocket/files/ head/www/gwsocket/files/gwsocket.conf (contents, props changed) head/www/gwsocket/files/gwsocket.in (contents, props changed) head/www/gwsocket/files/pkg-message.in (contents, props changed) head/www/gwsocket/files/sample.html (contents, props changed) head/www/gwsocket/pkg-descr (contents, props changed) head/www/gwsocket/pkg-plist (contents, props changed) Modified: head/www/Makefile Modified: head/www/Makefile ============================================================================== --- head/www/Makefile Sat Aug 15 02:52:22 2020 (r544908) +++ head/www/Makefile Sat Aug 15 05:30:41 2020 (r544909) @@ -220,6 +220,7 @@ SUBDIR += gtkhtml4 SUBDIR += guacamole-client SUBDIR += guile-www + SUBDIR += gwsocket SUBDIR += h2o SUBDIR += h2o-devel SUBDIR += habari Added: head/www/gwsocket/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/Makefile Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,66 @@ +# Created by: Daniel Morante <daniel@morante.net> +# $FreeBSD$ + +PORTNAME= gwsocket +PORTVERSION= 0.3 +CATEGORIES= www +MASTER_SITES= http://tar.gwsocket.io/ + +MAINTAINER= daniel@morante.net +COMMENT= RFC6455 compliant WebSocket Server + +LICENSE= MIT +LICENSE_FILE= ${WRKSRC}/COPYING + +USES= alias compiler:c11 pkgconfig +GNU_CONFIGURE= yes + +PORTDOCS= AUTHORS COPYING ChangeLog NEWS README + +OPTIONS_DEFINE= DOCS DEBUG OPENSSL EXAMPLES +OPTIONS_SUB= yes + +DEBUG_CONFIGURE_ON= --enable-debug + +OPENSSL_USES= ssl autoreconf +OPENSSL_PATCH_SITES= https://github.com/allinurl/${PORTNAME}/commit/ +OPENSSL_PATCHFILES= 3d4e1d1585e5aa54e9500f58efede57feeed7d3d.patch:-p1 # https://github.com/allinurl/gwsocket/issues/28 +OPENSSL_LIBS= -lcrypto +OPENSSL_CONFIGURE_WITH= openssl + +USE_RC_SUBR= ${PORTNAME} + +USERS= www +GROUPS= www + +DEFAULT_RUNDIR?= /var/run/${PORTNAME} +DEFAULT_LOGDIR?= /var/log/${PORTNAME} + +SUB_FILES= pkg-message +SUB_LIST+= PORTNAME=${PORTNAME} \ + DEFAULT_USER=${USERS} \ + DEFAULT_GROUP=${GROUPS} \ + DEFAULT_RUNDIR=${DEFAULT_RUNDIR} \ + DEFAULT_LOGDIR=${DEFAULT_LOGDIR} + +PLIST_SUB+= DEFAULT_USER=${USERS} \ + DEFAULT_GROUP=${GROUPS} \ + DEFAULT_RUNDIR=${DEFAULT_RUNDIR} \ + DEFAULT_LOGDIR=${DEFAULT_LOGDIR} + +do-install-DOCS-on: + @${MKDIR} ${STAGEDIR}${DOCSDIR} + ${INSTALL_DATA} ${PORTDOCS:S,^,${WRKSRC}/,} ${STAGEDIR}${DOCSDIR} + +post-install-EXAMPLES-on: + @${MKDIR} ${STAGEDIR}${EXAMPLESDIR} + ${INSTALL_DATA} ${FILESDIR}/sample.html ${STAGEDIR}${EXAMPLESDIR} + +post-install: + @${MKDIR} ${STAGEDIR}${ETCDIR} \ + ${STAGEDIR}${DEFAULT_RUNDIR} \ + ${STAGEDIR}${DEFAULT_LOGDIR} + ${INSTALL_DATA} ${FILESDIR}/${PORTNAME}.conf \ + ${STAGEDIR}${ETCDIR}/${PORTNAME}.conf.sample + +.include <bsd.port.mk> Added: head/www/gwsocket/distinfo ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/distinfo Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,5 @@ +TIMESTAMP = 1594435125 +SHA256 (gwsocket-0.3.tar.gz) = b2a46bbbc99faaf2dd99095d81bc29128fe54298ba6f4f9203ec3d2e4cc4c528 +SIZE (gwsocket-0.3.tar.gz) = 146851 +SHA256 (3d4e1d1585e5aa54e9500f58efede57feeed7d3d.patch) = c9b34acbf596de86488aedb725be847c4478bb57eab62899d381c63966515235 +SIZE (3d4e1d1585e5aa54e9500f58efede57feeed7d3d.patch) = 1518 Added: head/www/gwsocket/files/gwsocket.conf ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/files/gwsocket.conf Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,42 @@ +# This config file is evaluated by the rc script from the FreeBSD port of www/gwsocket. +# It is not related to gwsocket(1) itself. +# +# Most options are set with "name=value" assignments. + +# Specifies the port to bind. (-p --port) +#port=7890 + +# Specifies the path/file for the access log. (--access-log=<path/file>) +#access-log=/var/log/gwsocket/gwsocket-access.log + +# Specifies the address to bind. (--addr=<addr>) +#addr=127.0.0.1 + +# Set the server to echo all received messages. (--echo-mode) +# Exclude, set to 'false' or 'no' to disable. Set to 'true' or 'yes' to enable +#echo-mode=no + +# Maximum size of a websocket frame. This includes received frames from the +# client and messages through the named pipe. (--max-frame-size=<bytes>) +#max-frame-size= + +# Ensure clients send the specified origin header upon the WebSocket +# handshake. (--origin=<origin>) +#origin= + +# Creates a named pipe (FIFO) that reads from on the given path/file. (--pipein=<path/file>) +#pipein= + +# Creates a named pipe (FIFO) that writes to the given path/file. (--pipeout=<path/file>) +#pipeout= + +# Parse messages using strict mode. See man page for more details. (--strict) +# Exclude, set to 'false' or 'no' to disable. Set to 'true' or 'yes' to enable +#strict=no + +# Path to TLS/SSL certificate. (--ssl-cert=<cert.crt>) +#ssl-cert= + +# Path to TLS/SSL private key. (--ssl-key=<priv.key>) +#ssl-key= + Added: head/www/gwsocket/files/gwsocket.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/files/gwsocket.in Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,138 @@ +#!/bin/sh + +# $FreeBSD$ +# +# PROVIDE: %%PORTNAME%% +# REQUIRE: LOGIN +# KEYWORD: shutdown + +# Add the following lines to /etc/rc.conf to enable %%PORTNAME%% +# %%PORTNAME%%_enable="YES" +# +# Add the following lines to /etc/rc.conf to enable multiple instances of %%PORTNAME%% +# %%PORTNAME%%_multi_enable="YES" +# An instance is created for each *.conf file found in the configration files directory +# +# %%PORTNAME%%_enable (bool): Set to YES to enable %%PORTNAME%% +# Default: NO +# %%PORTNAME%%_multi_enable (bool): Set to YES to run multiple instances (%%PORTNAME%%_config is ignored) +# Default: NO +# %%PORTNAME%%_conf_d (str): %%PORTNAME%% configration files directory +# Default: %%ETCDIR%% +# %%PORTNAME%%_config (str): %%PORTNAME%% configration file (ignored when %%PORTNAME%%_multi_enable="YES") +# Default: %%ETCDIR%%/%%PORTNAME%%.conf +# %%PORTNAME%%_user (str): %%PORTNAME%% daemon user +# Default: %%DEFAULT_USER%% +# %%PORTNAME%%_group (str): %%PORTNAME%% daemon group +# Default: %%DEFAULT_GROUP%% +# %%PORTNAME%%_logdir (str): %%PORTNAME%% log directory +# Default: %%DEFAULT_LOGDIR%% +# %%PORTNAME%%_piddir (str): %%PORTNAME%% pid file directory +# Default: %%DEFAULT_RUNDIR%% + +. /etc/rc.subr + +name="%%PORTNAME%%" +rcvar=%%PORTNAME%%_enable +load_rc_config $name + +: ${%%PORTNAME%%_enable:="NO"} +: ${%%PORTNAME%%_multi_enable:="NO"} +: ${%%PORTNAME%%_user:="%%DEFAULT_USER%%"} +: ${%%PORTNAME%%_group:="%%DEFAULT_GROUP%%"} +: ${%%PORTNAME%%_conf_d:="%%ETCDIR%%"} +: ${%%PORTNAME%%_config:="${%%PORTNAME%%_conf_d%/}/${name}.conf"} +: ${%%PORTNAME%%_logdir:="%%DEFAULT_LOGDIR%%"} +: ${%%PORTNAME%%_piddir:="%%DEFAULT_RUNDIR%%"} + +required_dirs="${%%PORTNAME%%_logdir} ${%%PORTNAME%%_piddir}" +required_files=${%%PORTNAME%%_config} +procname="%%PREFIX%%/bin/${name}" +procdesc="${name}" +pidfile="${%%PORTNAME%%_piddir%/}/${name}.pid" +logfile="${%%PORTNAME%%_logdir%/}/${name}.log" +command=/usr/sbin/daemon +start_precmd="%%PORTNAME%%_precmd" + +%%PORTNAME%%_precmd() +{ + # Loads the options declared in the configuration file into "$command_args". + %%PORTNAME%%_conf_to_args ${%%PORTNAME%%_config} +} + +%%PORTNAME%%_conf_to_args() +{ + local _line %%PORTNAME%%_config_param %%PORTNAME%%_config_value config_file_path=$1 + command_args="-f -t ${procdesc} -p ${pidfile} -o ${logfile} ${procname}" + + while read -r _line; do + # Only proceed with lines which contain variable declaration. + echo "${_line}" | grep -q -E \ + -e "^[[:blank:]]*[[:alpha:]_-][[:alnum:]_-]{0,30}=" || + continue + + %%PORTNAME%%_config_param=${_line%%=*} + %%PORTNAME%%_config_value=${_line#*=} + + # Properly handle flag type paramaters + if %%PORTNAME%%_is_flag_param ${%%PORTNAME%%_config_param}; then + if checkyesno %%PORTNAME%%_config_value; then + command_args="$command_args --${%%PORTNAME%%_config_param}" + fi + elif [ -n "${%%PORTNAME%%_config_value}" ]; then + command_args="$command_args --${%%PORTNAME%%_config_param}=${%%PORTNAME%%_config_value}" + fi + done < ${config_file_path} +} + +%%PORTNAME%%_find_instances() +{ + local instance_config + for instance_config in ${%%PORTNAME%%_conf_d%/}/*.conf; do + [ -f "$instance_config" ] || break + %%PORTNAME%%_instances="$%%PORTNAME%%_instances $(basename ${instance_config%.conf})"; + done +} + +%%PORTNAME%%_is_flag_param() +{ + case $1 in + 'echo-mode' | 'strict' ) + return 0 + ;; + *) + return 1 + ;; + esac +} + +# Handles multi-instance feature +if [ $# -eq 2 ]; then + # Performs action on single instance by name + _instance=$2 + echo "===> Instance: ${_instance}" + + # Setup for the requested instance name + %%PORTNAME%%_config="${%%PORTNAME%%_conf_d%/}/${_instance}.conf" + procdesc="${name}_${_instance}" + pidfile="${%%PORTNAME%%_piddir%/}/${_instance}.pid" + logfile="${%%PORTNAME%%_logdir%/}/${_instance}.log" + + # The config file for the named instance must exist + required_files="${%%PORTNAME%%_config}" +elif checkyesno %%PORTNAME%%_multi_enable; then + # Compile list of all instances or given instances + _swap=$*; shift; _instances=$* + %%PORTNAME%%_find_instances + _instances=${_instances:-${%%PORTNAME%%_instances}} + set -- ${_swap} + + # Performs action on each instance + for _instance in ${_instances}; do + %%PREFIX%%/etc/rc.d/${name} $1 ${_instance} + done + exit 0 +fi + +run_rc_command "$1" + Added: head/www/gwsocket/files/pkg-message.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/files/pkg-message.in Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,26 @@ +[ +{ type: install + message: <<EOM + +To run %%PORTNAME%% at startup, enable it in your /etc/rc.conf: +sysrc %%PORTNAME%%_enable="YES" + +To start %%PORTNAME%%: +service %%PORTNAME%% start + +To configure %%PORTNAME%% edit: +%%ETCDIR%%/%%PORTNAME%%.conf + +A client example can be found at %%EXAMPLESDIR%%/sample.html + +To run multiple instances of %%PORTNAME%%, enable it in your /etc/rc.conf: +sysrc %%PORTNAME%%_multi_enable="YES" + +An instance will be created for each *.conf file found in: +%%ETCDIR%% + +EOM +} +] + + Added: head/www/gwsocket/files/sample.html ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/files/sample.html Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html lang="en"> +<style> +pre { + background: #EEE; + border: 1px solid #CCC; + padding: 10px; +} +#page-wrapper { + border-top: 5px solid #69c773; + margin: 1em auto; + width: 950px; +} +</style> +<script> +window.onload = function() { + function $(selector) { + return document.querySelector(selector); + } + var socket = new WebSocket('ws://localhost:7890'); + socket.onopen = function(event) { + $('#messages').innerHTML = 'Connected<br>'; + }; + socket.onmessage = function(event) { + $('#messages').innerHTML += 'Received:<br>' + event.data + '<br>'; + }; + socket.onclose = function(event) { + $('#messages').innerHTML = 'Disconnected ' + event.reason; + }; + $('#submit').onclick = function(e) { + socket.send($('input').value); + $('#messages').innerHTML += 'Sent:<br>' + $('input').value + '<br>'; + $('input').value = ''; + }; +}; +</script> + +<div id="page-wrapper"> + <pre id="messages">Connecting...</pre> + <input id="message" required> + <button id="submit">Send Message</button> +</div> + Added: head/www/gwsocket/pkg-descr ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/pkg-descr Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,4 @@ +gwsocket is a simple, standalone, language-agnostic, RFC6455 compliant +WebSocket Server, written in C. + +WWW: https://gwsocket.io Added: head/www/gwsocket/pkg-plist ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/gwsocket/pkg-plist Sat Aug 15 05:30:41 2020 (r544909) @@ -0,0 +1,6 @@ +bin/gwsocket +man/man1/gwsocket.1.gz +%%PORTEXAMPLES%%%%EXAMPLESDIR%%/sample.html +@sample %%ETCDIR%%/gwsocket.conf.sample +@dir(%%DEFAULT_USER%%,%%DEFAULT_GROUP%%,) %%DEFAULT_LOGDIR%% +@dir(%%DEFAULT_USER%%,%%DEFAULT_GROUP%%,) %%DEFAULT_RUNDIR%%
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202008150530.07F5UfbJ084181>