brcon2024_adc.md - brcon2024-hackathons - Bitreichcon 2024 Hackathons HTML git clone git://bitreich.org/brcon2024-hackathons git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/brcon2024-hackathons DIR Log DIR Files DIR Refs DIR Tags DIR Submodules --- brcon2024_adc.md (17244B) --- 1 ## brcon2024 - 2024-08-08 2 3 title: Deep C programming - UNIX philosophy in distributed offshore systems 4 5 author: Anders Damsgaard (adc) 6 7 contact: anders@adamsgaard.dk 8 gopher://adamsgaard.dk 9 https://adamsgaard.dk 10 11 slides: gopher://adamsgaard.dk/tmp/brcon2024_adc.md 12 13 ## brcon2024 - 2024-08-08 14 15 title: Deep C programming - UNIX philosophy in distributed offshore systems 16 17 author: Anders Damsgaard (adc) 18 19 contact: anders@adamsgaard.dk 20 gopher://adamsgaard.dk 21 https://adamsgaard.dk 22 <marquee><blink> 23 slides: gopher://adamsgaard.dk/tmp/brcon2024_adc.md 24 </blink></marquee> 25 26 27 ## Previously.. 28 * brcon2020: Energy efficient programming in science 29 * brcon2021: Unix principles for science simulations 30 * brcon2022: Est. Bitreich Arctic Vault 31 * brcon2023: Using Unix and Bitreich tools for preparing scientific papers 32 * Today: UNIX philosophy in distributed offshore systems 33 #pause 34 * Tomorrow: UNOX philosophy in Vitré 35 36 ## Outline 37 * How we can benefit from hyped technology with true and tried principles 38 * Overview of the offshore system 39 * The talk transitions into hands-on exercises 40 * Ask questions along the way in #bitreich-con 41 42 ## Danish Geotechnical Institute (geo.dk) 43 * ~250 employees in Lyngby and Aarhus, Denmark 44 * Geotechnical investigations (onshore/offshore) 45 * Environmental consultancy 46 * Laboratory tests 47 * Geodata analysis 48 * Geoscientific software development 49 50 #pause 51 -> New offshore rig built from the ground up 52 53 ## Offshore geotechnical investigations 54 .* +------------------+ 55 \|\ | ,_____. | 56 _============. | | | | 57 \\# # # #/ | | ._______|--|--| | 58 | +.,| | Geo .--|--| | 59 _---------------------|-+-------|--|--|--|\ 60 \ MS/Bitreich | +--|--+ | | 61 ~~~~~~~~~~~~~~~~~\~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~|~|~~~~~~~~~~~~ 62 \ +------------------+'' ~ 63 \_________________________________/--+ ~ . ~~ 64 ~ 65 66 67 ><> 68 69 <>< 70 71 72 73 ---------------------------------------------------------------------- 74 75 76 ## Offshore geotechnical investigations 77 .* 78 \|\ ,_____. 79 _============. | | 80 \\# # # #/ | ._______|--|--| 81 | +., | Geo .--|--| 82 _---------------------+-+-------|--|--|---\ 83 \ MS/Bitreich +--|--+ | 84 ~~~~~~~~~~~~~~~~~\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~ 85 \ .-'' ~ 86 \_________________________________/--+ ~ . ~~ 87 ~ 88 89 90 ><> 91 92 <>< 93 94 95 96 ---------------------------------------------------------------------- 97 98 99 100 ## Offshore geotechnical investigations 101 .* 102 \|\ ,_____. 103 _============. | | 104 \\# # # #/ | ._______|--|--| 105 | +., | Geo | | | 106 _---------------------+-+-------|--|--|---\ 107 \ MS/Bitreich | | 108 ~~~~~~~~~~~~~~~~~\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~|~~~~~~~~~~~~ 109 \ | .-'' ~ 110 \_____________________________|___/--x~ ~ . ~~ 111 .--|--. ~ 112 | v | 113 +-----+ 114 ><> 115 116 <>< 117 118 119 120 ---------------------------------------------------------------------- 121 122 123 124 125 ## Offshore geotechnical investigations 126 .* 127 \|\ ,_____. 128 _============. | | 129 \\# # # #/ | ._______|--|--| 130 | +., | Geo | | | 131 _---------------------+-+-------|--|--|---\ 132 \ MS/Bitreich | | 133 ~~~~~~~~~~~~~~~~~\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~|~~~~~~~~~~~~ 134 \ | .-'~ ~ . ~~ 135 \_____________________________|___/--x ~ 136 | 137 | 138 | 139 ><> | 140 | 141 <>< | 142 | 143 .--|--. 144 | v | 145 ----------------------------------------------+-----+----------------- 146 147 148 149 150 ## Offshore geotechnical investigations 151 .* 152 \|\ ,_____. 153 _============. | | 154 \\# # # #/ | ._______|--|--| 155 | +., | Geo | | | 156 _---------------------+-+-------|--|--|---\ 157 \ MS/Bitreich | | 158 ~~~~~~~~~~~~~~~~~\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~|~~~~~~~~~~~~ 159 \ | .-'' ~ 160 \_____________________________|___/--x 161 | 162 | 163 | 164 ><> | 165 | 166 <>< | 167 | 168 .--|--. 169 | | | 170 ----------------------------------------------+--|--+----------------- 171 | 172 | 173 | 174 v 175 176 ## Offshore geotechnical investigations 177 | | 178 | | 179 | | 180 | | 181 | | 182 | | 183 | | 184 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~ 185 | | 186 | | 187 | | 188 | | 189 ? | | 190 ><> | | 191 | | 192 | | ! 193 | | <>< 194 | | 195 | | 196 -----------------------------------------|---------------|------------ 197 | | 198 | | 199 | | 200 | | 201 |_______________| 202 203 https://www.mdpi.com/energies/energies-17-01964/article_deploy/html/images/energies-17-01964-g001.png 204 205 ## Offshore systems overview 206 * Up to 800 sensors, usually 1-10 Hz 207 * SCADA, PLCs, environmental sensors, navigation, scientific results, 208 calibration data, ... 209 * Control messages 210 * Asynchronous data streams 211 * Event driven logic 212 * Raw sensor output into physical units 213 * Aggregation of time series and combination of sources 214 * Time series databases 215 * Development project with many involved partners 216 217 ## Approaches: Unix philosophy vs. Microsoft mentality 218 * Does the client know what they want? 219 * Do we know everything about what we want to solve? 220 * Do we know if our assumptions are valid, in particular in complex systems? 221 * Do we have full specifications? 222 * Should we produce a big integrated C# monolith to handle computations, 223 flow, storage, logic? 224 225 #pause 226 > yes no | head -n 5 227 228 229 ## Data routing system 230 * MQTT: Message Queuing Telemetry Transport 231 * Started as a proprietary protocol for SCADA systems in O&G 232 * Lightweight, publish-subscribe network protocol 233 * Constrained devices and low-bandwidth, high-latency networks 234 * Publish/Subscribe Model: Decouples message producers from consumers 235 * Data accessible via network, not living internally in an obscure program 236 237 Specifications: 238 - MQTT v5.0: https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html 239 - MQTT v3.1.1: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html 240 - https://github.com/mqtt/mqtt.org/wiki/Differences-between-3.1.1-and-5.0 241 - MQTT and TLS: https://www.rfc-editor.org/rfc/rfc9431.txt 242 243 ## Central concepts 244 * Broker: Central server that routes messages 245 * Clients: Devices that publish or subscribe to one or more topics 246 * Messages: Data packets sent between clients via the broker 247 * Topics: Hierarchical and dynamic name space for message 248 249 Libs for many languages, e.g., 250 - https://github.com/eclipse/paho.mqtt.c 251 - https://github.com/eclipse/paho.mqtt.golang 252 253 ## DISCLAIMER 254 255 The coming exercises mainly to demonstrate fundamentals and principles 256 257 Most are suboptimal or bad practice 258 259 But, let's have some #fun ... 260 261 ## MQTT use cases 262 * Home thermometers and weather stations (if you ask the web) 263 * IoT Devices: Smart homes, wearables, and industrial automation 264 * Mobile Applications: Real-time messaging and notifications 265 * Remote Monitoring: Environmental sensors, health monitoring 266 * Connected Vehicles: Telematics and fleet management 267 268 ## MQTT messages 269 * TCP/IP 270 * Limit to message size configurable 271 272 * New subscribers receive only new messages (no backlog) 273 * Retained Messages: Last known good value for new subscribers 274 * Last Will and Testament (LWT): Notifies other clients about an ungraceful disconnection 275 276 * Quality of Service (QoS): Three levels to ensure message delivery 277 * QoS 0: At most once delivery (fire and forget) 278 * QoS 1: At least once delivery (acknowledged delivery) 279 * QoS 2: Exactly once delivery (assured delivery) 280 281 ## Why MQTT for the offshore project? 282 * Hierarchial data structure through topics 283 * A node in the topic tree exists as soon as someone publishes or 284 subscribes to it 285 * Data accessible via network and all clients can read or publish 286 (by default) 287 288 #pause 289 rig/sensor1/raw 290 rig/sensor1/phys 291 rig/sensor2/raw 292 rig/sensor2/phys 293 ... 294 ship/navigation/easting 295 ship/navigation/northing 296 ... 297 298 ## Topic examples 299 Wildcards: #, + (subscribe only) 300 301 Subscription examples: 302 1) rig/sensor1/raw 303 2) ship/#: Subscribe to everything from the ship 304 3) rig/+/phys: Subscribe to all physical values 305 306 ## Example: Subscribe and publish 307 $ cat bin/timestamp # in case you don't have ts(1) 308 #!/bin/sh 309 while read -r REPLY 310 do 311 printf '%s %s\n' "$(date '+%Y-%m-%d %Z %H:%M:%S')" "$REPLY" 312 done 313 #pause 314 $ export MQTTURI='mqtt://bitreich:bitreich@mx2.adamsgaard.dk:65431/' 315 #pause 316 $ mosquitto_sub -L "${MQTTURI}#" -v -t '#' | timestamp | grep -v hatesensor 317 #pause 318 319 $ date | mosquitto_pub -L "${MQTTURI}$(hostname)/$(whoami)" -l 320 321 ## Reporting online status via last will and retain, reporting some metrics 322 323 gophers://duckless.org/0/tmp/mqtt-online 324 325 #!/bin/sh 326 online_topic="${ONLINE_TOPIC:-$(hostname)/online}" 327 mqtt_broker="${MQTT_BROKER:-mx2.adamsgaard.dk}" 328 mqtt_port="${MQTT_PORT:-65431}" 329 mqtt_user="${MQTT_USER:-bitreich}" 330 mqtt_password="${MQTT_PASSWORD:-bitreich}" 331 args="-h ${mqtt_broker} -p ${mqtt_port} -u ${mqtt_user} -P ${mqtt_password}" 332 mosquitto_pub ${args} -t "${online_topic}" -r -m "1" 333 while : 334 do 335 printf '%s\t%s\t%s\t%s\n' "$(date +%s)" "$(date)" "$(hostname)" "$(uptime)" 336 sleep 360 337 done | mosquitto_pub ${args} --will-topic "${online_topic}" \ 338 --will-retain --will-payload "0" -t "${online_topic}" -r -l 339 340 ## Data structure on the network 341 Interact with data hierarchy via small modular clients. 342 Brings all benefits of UNIX design into play. 343 344 The tenents of the UNIX philosophy: 345 346 - Small is beautiful 347 - Make each program do one thing well 348 - Build a prototype as soon as possible 349 - Choose portability over efficiency 350 - Store numerical data in flat ASCII files 351 - Use software leverage to your advantage 352 - Use shell scripts to increase leverage and portability 353 - Avoid captive user interfaces 354 - Make every program a filter 355 356 src: Make Gancarz 1995 "The UNIX Philosophy", ISBN 1-55558-123-4 357 358 ## Distributed computing 359 Assign small modular programs to read stdin from topics and post their 360 result to another topic 361 362 * Rudimentary distributed computing 363 * Each program acts as a text filter 364 * Each program can contribute local data 365 366 (disclaimer: for 1:1 connections, netcat or named pipes over SSH is simpler) 367 368 Broker statistics: $SYS/broker 369 mosquitto_sub -L "${MQTTURI}\$SYS/broker/#" -v 370 371 ## Connecting stdin, stdout, and stderr with MQTT topics 372 Full script: gophers://duckless.org/0/tmp/mqtt-wrapper 373 374 fifodir="$(mktemp -d)" || die 'mktemp' 375 fin="${fifodir}/in" 376 fout="${fifodir}/out" 377 ferr="${fifodir}/err" 378 mkfifo "$fin" "$fout" "$ferr" || die 'mkfifo' 379 380 #pause 381 mosquitto_sub ${mosquitto_args} -t $subscribe_args >"${fin}" & 382 mosquitto_pub ${mosquitto_args} -t "${output_topic}" -l <"${fout}" & 383 mosquitto_pub ${mosquitto_args} -t "${error_topic}" -l <"${ferr}" & 384 trap -- 'cleanup' ERR INT HUP EXIT CHLD 385 386 #pause 387 while : 388 do 389 $runtime $runtime_args <"${fin}" >"${fout}" 2>"${ferr}" 390 done 391 392 ## Connecting stdin, stdout, and stderr with MQTT topics (cont.) 393 394 Works if input is continuously evaluated (i.e., does not wait for EOF) 395 396 RUNTIME=bc ARGS="-l" sh -x ./mqtt-wrapper 397 RUNTIME=sh ARGS="your-favorite-cgi-script" sh -x ./mqtt-wrapper 398 RUNTIME=sh ARGS="your-sd-program" sh -x ./mqtt-wrapper 399 400 ## Outlook 401 * Lots of possibilities coupling pub/sub with text streams 402 * Use existing client/broker implementations and libraries 403 * Minimal C implementation would be nice, aiming at a subset of features 404 * Represent topic structure with virtual file system representation 405 (i.e., plan9 or /proc in linux) 406 407 ## Challenge 0: Installing a MQTT broker/client 408 Mosquitto (mostly C, BSD-like license). 409 Pretty bloated, a minimal alternative would be nice. 410 You just need the client for these exercises. 411 412 https://github.com/eclipse/mosquitto 413 414 Package names in common OS: 415 416 OpenBSD mosquitto broker+client 417 Arch mosquitto broker+client 418 Gentoo app-misc/mosquitto broker+client 419 Debian mosquitto-clients client 420 421 ## Challenge agenda 422 First one to post a working solution will get points towards a 423 price. 424 425 ## Challenge 1: Let's write a chat 426 Hints: 427 428 mosquitto_pub(1): Publish a message to a named topic 429 Useful flags: 430 -d: Show debug info 431 -l: Read messages from stdin (each line 1 message) 432 mosquitto_sub(1): Subscribe to a path in the topic hierarchy 433 -d: Show debug info 434 -v: Print topic for each received message as first field 435 436 Connection URI: 437 -L 'mqtt://bitreich:bitreich@mx2.adamsgaard.dk:65431/testtopic' 438 439 Let's use the message format: "nick\tmessage" 440 441 ## Challenge 2: Write a script that records the chat 442 Hint: The '#' wild card 443 444 What is the best choice for a time stamp? 445 * Time as the sender reports it? 446 * Time as the subscriber sees it? 447 448 ## Challenge 3: Let the data flow 449 Anyone has a funky data source? 450 451 * USB body thermometer? 452 * spoon -t 453 * while :; do printf '%s\t%s' "$(hostname)" "$(uptime)"; sleep 10; done 454 * ii/annna? 455 * vmstat(8) 456 457 Task: Publish some data and let the others guess what it is. 458 The funkier, the better. 459 460 Message format ideas: 461 TSV, JSON, XLSX? sfeed(5)? 462 VT100 control codes?? 463 464 ## Challenge 4: Raise an alert! 465 Set up a script that monitors one of the data sources, and triggers 466 an alert upon a condition (email, xmessage, log line, ...). 467 468 ## Challenge 5: Make some gnuplot 469 Monitor one of the sensors from the previous, and create a continuously 470 updating gnuplot (-t dumb) with a rolling window. 471 472 ## Challenge 6: Health check reporting 473 Write a script that monitors some gopher and reports their status to 474 475 gopherstatus/<uri> 476 up|down 477 478 ## Challenge 7: Tamagotchi 479 Make script that imitates a virtual pet, expecting to be feed 480 "cookies" as messages on stdin every 30 s. It should die if it gets to much or too little food. 481 482 Report its happyness to a topic with ASCII smileys. 483