aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/NOTES.txt
diff options
context:
space:
mode:
Diffstat (limited to 'src/NOTES.txt')
-rw-r--r--src/NOTES.txt183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/NOTES.txt b/src/NOTES.txt
new file mode 100644
index 0000000..1758ac8
--- /dev/null
+++ b/src/NOTES.txt
@@ -0,0 +1,183 @@
1I'm re-purposing this for SledjHamr https://sledjhamr.org/git/docs/index.html
2
3The general structure of SledjHamr is a bunch of servers talking to each
4other via Internet (or just local) connections. One of them is a web
5server for assets, world data, and inventory.
6
7Originally I didn't think using a web based world client was a good idea,
8however it might be better to have one, for reasons. Now I need a web
9management console that can do all the things the current tmux console
10can, including OpenSim console and commands. Plus account management for
11users. I can also use a web based Jabber / XMPP front end to chat, IM,
12and group chatter, which would run in the normal viewers web browser.
13This provides a doorway into putting SledjHamr stuff in existing viewers
14without needing them to support it. So a web based viewer now makes more
15sense, and also means we can get away with not needing a viewer at all.
16
17Toybox itself doesn't include a web server, and I don't think there is
18one on the roadmap. So we have to use an external web server, which was
19a design goal of SledjHamr in the first place, using existing mature
20HTTP infrastructure, coz that's already solved problems for a bunch of
21things that plague OS/SL to this day. Clear your cache! Pffft.
22
23So sledjchisl.c will be the "love world server", though initially it just
24drives OpenSim_SC in tmux via tmux commands to send keys and read output.
25Later it might run opensim_SC directly and use STDIN and STDOUT to do
26everything. It'll also provide the text management front end that runs
27in the left tmux panel of the first window, which is why it's based on
28boxes in the first place. Later still it can take over opensim_SC
29functions as I move them out of mono.
30
31We will need a text, web, and GUI version of this management front end.
32Hmmm, maybe don't need a GUI version, GUI users can just run a terminal.
33
34After much research, FastCGI / FCGI seems to be the most portable way of
35interfacing with existing web servers. FCGI protocol closes STDERR and
36STDOUT, and uses STDIN as it's two way communications channel to the web
37server, so our FCGI module can't be used as the text management front
38end. This is probably a good idea to keep them seperate anyway, for
39security, coz the web server is exposed to the world, the console isn't.
40
41Currently sledjchisl.c tests to see if it's running in tmux already, if
42it isn't it starts up tmux runs itself into this new tmux, then exits.
43So it could also test if it's running from FCGI, and switch to web mode,
44then it'll need to find the tmuxed instance to send commands to it.
45Either via nails connection, or sending tmux commands via shell.
46
47FCGI has methods of dealing with auth and templates. B-)
48
49So for now I think I'll have the text and web management front ends in
50sledjchisl.c, and the love world server as well. I can split them up
51later if I need to.
52
53
54
55
56I has Apache 2.4.25-3+deb9u9
57 MariaDB 10.1.44-MariaDB
58
59
60https://gist.github.com/dermesser/e2f9b66457ae19ebd116
61 Multithreaded example in C.
62
63
64-------------------------------------------------------------------
65
66Apache doesn't seem to support FCGI filter role, so I might have to do
67without. Might be better anyway.
68
69
70"A Filter is similar in functionality to a Responder that takes a data
71file as a parameter. The difference is that with a Filter, both the data
72file and the Filter itself can be access controlled using the Web
73server's access control mechanisms, while a Responder that takes the name
74of a data file as a parameter must perform its own access control checks
75on the data file."
76
77 Which is fine, our access control checks will be "Is this database
78 defined user already logged on via our FCGI script?". We should have
79 total control over that. I was planning on using the FCGI auth
80 mechanism anyway.
81
82
83RESPONDER
84 web server sends FCGI_PARAMS
85 CONTENT_LENGTH
86 web server sends input body FCGI_STDIN
87 fcgi app sends result data over FCGI_STDOUT and error messages over FCGI_STDERR
88 it has to finish reading FCGI_PARAMS first
89 fcgi app sends FCGI_END_REQUEST(protocolStatus = FCGI_REQUEST_COMPLETE)
90
91
92FILTER
93 filtered file has last modified time
94 web server sets FCGI_DATA_LAST_MOD accordingly
95 web server sends FCGI_PARAMS
96 CONTENT_LENGTH FCGI_DATA_LAST_MOD FCGI_DATA_LENGTH
97 web server sends input body FCGI_STDIN
98 web servers sends file over FCGI_DATA
99 fcgi app can ignore FCGI_DATA and use it's own cached copy based on FCGI_DATA_LAST_MOD
100 fcgi app sends result data over FCGI_STDOUT and error messages over FCGI_STDERR
101 it has to finish reading FCGI_STDIN first, but not FCGI_DATA
102 fcgi app sends FCGI_END_REQUEST(protocolStatus = FCGI_REQUEST_COMPLETE)
103
104
105Soooo, FILTER might be slower anyway if we are caching the filtered file,
106or mmapping it, coz filter has to start sending the filtered file, even
107if it's to be served from cache. Plus no need to wait for FCGI_STDIN
108before spewing it out.
109
110
111PLAN -
112. add "webRoot" to the config, point it at /opt/opensim_SC/web
113. /opt/opensim_SC/web/fcgi-bin/sledjchisl.fcgi a symlink to /opt/opensim_SC/bin/sledjchisl
114. /opt/opensim_SC/web/html/ the static web files and templates.
115. https://localhost/opensim_SC/fcgi-bin/sledjchisl.fcgi/foo.html
116. check the if modified since bit against the replaceable bits last fetch time / /opt/opensim_SC/web/html/foo.html last modified time
117. check if /opt/opensim_SC/web/html/foo.html is cached, or if it's been modified since last cache.
118. mmap /opt/opensim_SC/web/html/foo.html
119. put it in a cache
120. scan through it looking for the replacable bits
121. store pointers to them
122. check if the replaceable bits need refreshing
123. loop through the pointers to the cache
124. spew out the non replacable bits
125. spew out the replacements for the replacable bits
126. repeat until done
127
128Last update time for parameters, plus an update frequency. Once a minute.
129Hash of page file names
130. last modified time for file
131 Linked list of page fragments -> array (qlibc can convert a linked list into an array?), or try the growable thingy.
132. struct
133. enum telling us what this bit is
134. bit of verbatim text
135. replaceable parameter, pointer to the data that is also stored in the ssi hash, so that changes propogate
136. <!--#echo var="???" -->
137 bit of Lua
138
139 NOTE - SSI is a bit more complex than what I'm currently using.
140 https://en.wikipedia.org/wiki/Server_Side_Includes
141 <!--#include virtual="menu.cgi" -->
142 <!--#include file="footer.html" -->
143 <!--#exec cgi="/cgi-bin/foo.cgi" -->
144 <!--#exec cmd="ls -l" -->
145. <!--#echo var="REMOTE_ADDR" -->
146 <!--#config timefmt="%y %m %d" -->
147 <!--#config sizefmt="bytes" -->
148 <!--#config errmsg="SSI command failed!" -->
149 <!--#flastmod virtual="index.html" -->
150 <!--#fsize file="script.pl" -->
151 <!--#if expr="${Sec_Nav}" -->
152 <!--#include virtual="secondary_nav.txt" -->
153 <!--#elif expr="${Pri_Nav}" -->
154 <!--#include virtual="primary_nav.txt" -->
155 <!--#else -->
156 <!--#include virtual="article.txt" -->
157 <!--#endif -->
158 <!--#set var="foo" value="bar" -->
159 <!--#printenv -->
160 https://www.w3.org/Jigsaw/Doc/User/SSI.html
161 Adds lots of others, including Java stuff.
162 Mine
163 <!--#lua lua="print(table[key])" -->
164 <!--#lua file="/path/to/script.lua" -->
165 <!--#lua virtual="https://example.com/script.lua" -->
166
167BTW - /opt/opensim_SC/web/html/foo.html should have it's image URLS and other
168static data set to https://localhost/opensim_SC/SledjHamr.png, which
169would map to /opt/opensim_SC/web/html/SledjHamr.png and be treated as ordinary
170static files by the web server.
171
172ALSO - when spewing results, we have to manually send the headers first
173our selves, this should include the HTTP status code and string, content
174type, cookies, etc.
175
176-------------------------------------------------------------------
177
178https://project-awesome.org/aleksandar-todorovic/awesome-c
179 A curated list of C good stuff.
180
181https://wolkykim.github.io/qdecoder/
182 CGI library made by the qlibc guy, does support FCGI.
183 Might be a wrapper around the fcgi_stdio stuff I'm already using?