Explorar el Código

Merge branch 'stretch' of https://github.com/bashrc/freedombone

Bob Mottram hace 7 años
padre
commit
15bc6b1f91

+ 64
- 0
doc/EN/app_icecast.org Ver fichero

1
+#+TITLE:
2
+#+AUTHOR: Bob Mottram
3
+#+EMAIL: bob@freedombone.net
4
+#+KEYWORDS: freedombone, icecast
5
+#+DESCRIPTION: How to use Icecast
6
+#+OPTIONS: ^:nil toc:nil
7
+#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="freedombone.css" />
8
+
9
+#+BEGIN_CENTER
10
+[[file:images/logo.png]]
11
+#+END_CENTER
12
+
13
+#+BEGIN_EXPORT html
14
+<center>
15
+<h1>Icecast</h1>
16
+</center>
17
+#+END_EXPORT
18
+
19
+Icecast enables you to run something like an internet radio station. So if you have multiple audio files and want to be able to stream those in sequence from a web site then this can be useful.
20
+
21
+This system is available only via an onion address, which should mitigate the potential for copyright disputes over streamed content. By default it's only set up to stream to a small number of users so that it doesn't put too much stress on CPU or memory requirements, although you can increase the maximum limit if you have a more powerful system and enough bandwidth.
22
+
23
+* Installation
24
+Log into your system with:
25
+
26
+#+begin_src bash
27
+ssh myusername@mydomain -p 2222
28
+#+end_src
29
+
30
+Using cursor keys, space bar and Enter key select *Administrator controls* and type in your password.
31
+
32
+Select *Add/Remove Apps*. If Vim is selected then you might want to unselect and uninstall it first, then select *icecast*.
33
+
34
+If you then go to the *About* screen you'll see the onion address for Icecast and can navigate to it in a Tor compatible browser.
35
+
36
+* Adding files to be streamed
37
+There are two ways to get files onto the system: either via ssh or via a USB drive. File types can be *ogg, ogv, mp3 or mp4* format.
38
+
39
+It may take a while for the files to import, especially on a low power single board computer, since any mp3 or mp4 files will be converted to ogg or ogv. If you want to speed this up then you could do this conversion manually on a laptop with ffmpeg before storing files onto the USB drive or uploading them via ssh.
40
+
41
+** From a USB drive
42
+Create a directory on the USB drive named *icestream* and copy your files into there. Plug the drive into your server.
43
+
44
+Go to the *Administrator control panel*, select *App settings*, then *icecast*, then *Import stream files from USB drive*.
45
+
46
+** Via ssh
47
+Make a directory named *icestream* and copy your files into it. Then copy the directory to your server.
48
+
49
+#+begin_src bash
50
+scp -r -P 2222 icestream myusername@mydomain:/home/myusername
51
+#+end_src
52
+
53
+Log into your server with:
54
+
55
+#+begin_src bash
56
+ssh myusername@mydomain -p 2222
57
+#+end_src
58
+
59
+Select *Administrator controls*, enter your password, then go to *App settings* followed by *icecast* and *Import stream files*. Choose the directory with up and down cursors and space bar to select.
60
+
61
+* Access controls
62
+By default anyone who happens to find your Icecast onion address can listen to your stream. If you only want it to be available to a few friends or family then you can add an extra login password.
63
+
64
+Go to the *Administrator control panel*, select *App settings*, then *icecast*, then *Enable login for stream users*. Take a note of the password and you can give that out to whoever needs access, preferably via an encrypted chat app or sneakernet. If you need to copy and paste then hold the shift key while highlighting the password.

+ 4
- 0
doc/EN/apps.org Ver fichero

68
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
68
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
69
 
69
 
70
 [[./app_hubzilla.html][How to use it]]
70
 [[./app_hubzilla.html][How to use it]]
71
+* Icecast media stream
72
+Make your own internet radio station.
73
+
74
+[[./app_icecast.html][How to use it]]
71
 * IRC Server (ngirc)
75
 * IRC Server (ngirc)
72
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
76
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
73
 
77
 

BIN
img/mesh_mobileapps.jpg Ver fichero


+ 765
- 0
src/freedombone-app-icecast Ver fichero

1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Icecast application
12
+#
13
+# Notes: An attempt was made to get ices2 running with systemd, but that
14
+#        was very unsuccessful. Instead there's a hacky cron entry which
15
+#        starts icecast2 and ices2 if necessary
16
+#
17
+# License
18
+# =======
19
+#
20
+# Copyright (C) 2017 Bob Mottram <bob@freedombone.net>
21
+#
22
+# This program is free software: you can redistribute it and/or modify
23
+# it under the terms of the GNU Affero General Public License as published by
24
+# the Free Software Foundation, either version 3 of the License, or
25
+# (at your option) any later version.
26
+#
27
+# This program is distributed in the hope that it will be useful,
28
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
29
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30
+# GNU Affero General Public License for more details.
31
+#
32
+# You should have received a copy of the GNU Affero General Public License
33
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
34
+
35
+VARIANTS='full'
36
+
37
+IN_DEFAULT_INSTALL=0
38
+SHOW_ON_ABOUT=1
39
+SHOW_ICANN_ADDRESS_ON_ABOUT=0
40
+
41
+ICECAST_DOMAIN_NAME=
42
+ICECAST_CODE=
43
+ICECAST_PORT=8005
44
+ICECAST_ONION_PORT=8146
45
+ICECAST_DIR=/icestream
46
+ICECAST_PLAYLIST_FILE=/etc/ices2/playlist.txt
47
+ICECAST_LOGIN_TEXT=$"Icecast login"
48
+
49
+icecast_variables=(MY_USERNAME
50
+                   MY_EMAIL_ADDRESS
51
+                   ONION_ONLY
52
+                   ICECAST_DOMAIN_NAME
53
+                   ICECAST_CODE
54
+                   DEFAULT_LANGUAGE)
55
+
56
+function icecast_rescan {
57
+    if [ -d $ICECAST_DIR ]; then
58
+        if [ -f $ICECAST_PLAYLIST_FILE ]; then
59
+            rm $ICECAST_PLAYLIST_FILE
60
+        fi
61
+        icecast_add_file_to_playlist $ICECAST_DIR
62
+    fi
63
+}
64
+
65
+function icecast_update_daemon {
66
+    systemctl stop icecast2
67
+    if [ -f /etc/init.d/icecast2 ]; then
68
+        rm /etc/init.d/icecast2
69
+    fi
70
+
71
+    echo '#!/bin/sh' > /usr/bin/stop_icecast
72
+    echo 'kill $(pidof ices2)' >> /usr/bin/stop_icecast
73
+    echo 'systemctl stop icecast2' >> /usr/bin/stop_icecast
74
+    chmod +x /usr/bin/stop_icecast
75
+
76
+    # Note that the sleep here actually is important
77
+    echo '#!/bin/bash' > /usr/bin/start_icecast
78
+    echo 'isrunning=$(ps aux | grep ices2)' >> /usr/bin/start_icecast
79
+    echo 'if [[ "$isrunning" != *"ices-playlist"* ]]; then' >> /usr/bin/start_icecast
80
+    echo '    systemctl start icecast2' >> /usr/bin/start_icecast
81
+    echo '    sleep 3' >> /usr/bin/start_icecast
82
+    echo '    cd /etc/ices2' >> /usr/bin/start_icecast
83
+    echo '    ices2 ices-playlist.xml' >> /usr/bin/start_icecast
84
+    echo 'fi' >> /usr/bin/start_icecast
85
+    chmod +x /usr/bin/start_icecast
86
+
87
+    echo '[Unit]' > /etc/systemd/system/icecast2.service
88
+    echo 'Description=Icecast' >> /etc/systemd/system/icecast2.service
89
+    echo 'After=network.target' >> /etc/systemd/system/icecast2.service
90
+    echo 'After=tor.service' >> /etc/systemd/system/icecast2.service
91
+    echo '' >> /etc/systemd/system/icecast2.service
92
+    echo '[Service]' >> /etc/systemd/system/icecast2.service
93
+    echo 'User=icecast2' >> /etc/systemd/system/icecast2.service
94
+    echo 'Group=icecast' >> /etc/systemd/system/icecast2.service
95
+    echo 'ExecStart=/usr/bin/icecast2 -c /etc/icecast2/icecast.xml' >> /etc/systemd/system/icecast2.service
96
+    echo 'Restart=on-failure' >> /etc/systemd/system/icecast2.service
97
+    echo 'RestartSec=10' >> /etc/systemd/system/icecast2.service
98
+    echo '' >> /etc/systemd/system/icecast2.service
99
+    echo '[Install]' >> /etc/systemd/system/icecast2.service
100
+    echo 'WantedBy=multi-user.target' >> /etc/systemd/system/icecast2.service
101
+
102
+    chown -R icecast2:icecast /etc/ices2
103
+    chown -R icecast2:icecast /etc/icecast2
104
+    systemctl daemon-reload
105
+    systemctl enable icecast2
106
+
107
+    if ! grep -q "start_icecast" /etc/crontab; then
108
+        echo '*/1            * *   *   *   root /usr/bin/start_icecast > /dev/null' >> /etc/crontab
109
+    fi
110
+}
111
+
112
+function change_password_icecast {
113
+    curr_username="$1"
114
+    new_user_password="$2"
115
+
116
+    stop_icecast
117
+
118
+    sed -i  -e "s|<source-password>[^<]*</source-password>|<source-password>$new_user_password</source-password>|" \
119
+        -e "s|<relay-password>[^<]*</relay-password>|<relay-password>$new_user_password</relay-password>|" \
120
+        -e "s|<admin-password>[^<]*</admin-password>|<admin-password>$new_user_password</admin-password>|" \
121
+        /etc/icecast2/icecast.xml
122
+    sed -i "s|<password>.*|<password>${new_user_password}</password>|g" /etc/ices2/ices-playlist.xml
123
+
124
+    ${PROJECT_NAME}-pass -u "$curr_username" -a icecast -p "$new_user_password"
125
+    start_icecast
126
+}
127
+
128
+function logging_on_icecast {
129
+    echo -n ''
130
+}
131
+
132
+function logging_off_icecast {
133
+    echo -n ''
134
+}
135
+
136
+function reconfigure_icecast {
137
+    echo -n ''
138
+}
139
+
140
+function icecast_convert_files {
141
+    clear
142
+    cd ${1}
143
+
144
+    echo $'Converting any mp3 files to ogg format'
145
+    find . -type f -name '*.mp3' -exec bash -c 'ffmpeg -i "$0" -c:a libvorbis -q:a 4 "${0/%mp3/ogg}"' '{}' \;
146
+    find . -name "*.mp3" -print0 | xargs -0 rm -f
147
+
148
+    echo $'Converting any mp4 files to ogv format'
149
+    find . -type f -name '*.mp4' -exec bash -c 'ffmpeg -i "$0" -c:a libvorbis -q:a 4 "${0/%mp3/ogv}"' '{}' \;
150
+    find . -name "*.mp4" -print0 | xargs -0 rm -f
151
+
152
+    chown -R icecast2:icecast $ICECAST_DIR
153
+}
154
+
155
+function icecast_add_file_to_playlist {
156
+    files_dir=${1}
157
+    if [ ! -d $files_dir ]; then
158
+        return
159
+    fi
160
+
161
+    echo $'Adding ogg files to playlist'
162
+    find $files_dir -type f -name '*.ogg' -print0 | while read -d $'\0' file; do
163
+        if ! grep -q "$file" $ICECAST_PLAYLIST_FILE; then
164
+            echo "$file" >> $ICECAST_PLAYLIST_FILE
165
+        fi
166
+    done
167
+
168
+    echo $'Adding ogv files to playlist'
169
+    find $files_dir -type f -name '*.ogv' -print0 | while read -d $'\0' file; do
170
+        if ! grep -q "$file" $ICECAST_PLAYLIST_FILE; then
171
+            echo "$file" >> $ICECAST_PLAYLIST_FILE
172
+        fi
173
+    done
174
+
175
+    chown icecast2:icecast $ICECAST_PLAYLIST_FILE
176
+    stop_icecast
177
+    start_icecast
178
+}
179
+
180
+function icecast_import_from_directory {
181
+    data=$(tempfile 2>/dev/null)
182
+    dialog --title "Choose a directory containing stream files" --dselect /home/$MY_USERNAME/ 30 60 2> $data
183
+    selected_dir=$(cat $data)
184
+    rm $data
185
+    if [[ "$selected_dir" == "$ICECAST_DIR" ]]; then
186
+        return
187
+    fi
188
+    if [ ! -d $selected_dir ]; then
189
+        return
190
+    fi
191
+    if [[ "$selected_dir" == "/home/$MY_USERNAME/" ]]; then
192
+        return
193
+    fi
194
+    if [[ "$selected_dir" == "/home/$MY_USERNAME/."* ]]; then
195
+        return
196
+    fi
197
+    if [[ "$selected_dir" == *"/Maildir" || "$selected_dir" == *"/Sync" ]]; then
198
+        return
199
+    fi
200
+
201
+    dialog --title $"Import stream files directory into Icecast" \
202
+           --backtitle $"Freedombone Control Panel" \
203
+           --defaultno \
204
+           --yesno $"\nImport the directory:\n\n  $selected_dir" 12 75
205
+    sel=$?
206
+    case $sel in
207
+        1) return;;
208
+        255) return;;
209
+    esac
210
+
211
+    if [ ! -d $ICECAST_DIR ]; then
212
+        mkdir -p $ICECAST_DIR
213
+    fi
214
+
215
+    dest_dir=$(basename "$selected_dir")
216
+    mv "$selected_dir" $ICECAST_DIR
217
+
218
+    icecast_convert_files $ICECAST_DIR/$dest_dir
219
+    icecast_add_file_to_playlist $ICECAST_DIR/$dest_dir
220
+
221
+    dialog --title $"Import stream files directory into Icecast" \
222
+           --msgbox $"Import success" 6 40
223
+}
224
+
225
+function icecast_import_from_usb {
226
+    clear
227
+    detect_usb_drive
228
+
229
+    if [ ! -b $USB_DRIVE ]; then
230
+        dialog --title $"Import stream files from USB drive" --msgbox $'No USB drive found' 6 50
231
+        return
232
+    fi
233
+
234
+    backup_mount_drive ${USB_DRIVE}
235
+    if [ ! -d $USB_MOUNT$ICECAST_DIR ]; then
236
+        dialog --title $"Import stream files from USB drive" --msgbox $'No stream files directory found on USB drive' 6 50
237
+        backup_unmount_drive ${USB_DRIVE}
238
+    fi
239
+    cp -ru $USB_MOUNT$ICECAST_DIR/* $ICECAST_DIR
240
+    backup_unmount_drive ${USB_DRIVE}
241
+    icecast_convert_files $ICECAST_DIR
242
+    dialog --title $"Import stream files from USB drive" --msgbox $'Import complete. You may now remove the USB drive' 6 50
243
+}
244
+
245
+function icecast_export_to_usb {
246
+    clear
247
+    detect_usb_drive
248
+
249
+    if [ ! -b $USB_DRIVE ]; then
250
+        dialog --title $"Export stream files to USB drive" --msgbox $'No USB drive found' 6 50
251
+        return
252
+    fi
253
+
254
+    backup_mount_drive ${USB_DRIVE}
255
+    if [ ! -d $USB_MOUNT$ICECAST_DIR ]; then
256
+        mkdir -p $USB_MOUNT$ICECAST_DIR
257
+    fi
258
+    cp -ru $ICECAST_DIR/* $USB_MOUNT$ICECAST_DIR
259
+    backup_unmount_drive ${USB_DRIVE}
260
+    dialog --title $"Export stream files to USB drive" --msgbox $'Export complete. You may now remove the USB drive' 6 50
261
+}
262
+
263
+function icecast_format_drive {
264
+    detect_usb_drive
265
+    data=$(tempfile 2>/dev/null)
266
+    trap "rm -f $data" 0 1 2 5 15
267
+    dialog --title $"Format USB drive $USB_DRIVE for stream file storage" \
268
+           --backtitle $"Freedombone Control Panel" \
269
+           --defaultno \
270
+           --yesno $"\nPlease confirm that you wish to format drive\n\n    ${USB_DRIVE}\n\nAll current data on the drive will be lost, and you will be prompted to give a password used to encrypt the drive.\n\nDANGER: If you screw up here and format the wrong drive it's your own fault!" 16 60
271
+    sel=$?
272
+    case $sel in
273
+        1) return;;
274
+        255) return;;
275
+    esac
276
+    rm $data
277
+
278
+    clear
279
+    echo ''
280
+    echo $"Formatting drive $USB_DRIVE. ALL CONTENTS WILL BE LOST."
281
+    echo ''
282
+    ${PROJECT_NAME}-format $USB_DRIVE
283
+    dialog --title $"Format USB drive $USB_DRIVE for stream file storage" --msgbox $'Format complete. You may now export stream files or remove the USB drive' 6 50
284
+}
285
+
286
+function icecast_edit_playlist {
287
+    editor $ICECAST_PLAYLIST_FILE
288
+    stop_icecast
289
+    start_icecast
290
+}
291
+
292
+function icecast_change_login {
293
+    read_config_param $MY_USERNAME
294
+    ICECAST_USER_PASSWORD=$(${PROJECT_NAME}-pass -u $MY_USERNAME -a icecastuser)
295
+
296
+    data=$(tempfile 2>/dev/null)
297
+    trap "rm -f $data" 0 1 2 5 15
298
+    dialog --title $"Change Icecast stream visitor login" \
299
+           --backtitle $"Freedombone Control Panel" \
300
+           --inputbox $"Enter the new login password for stream visitors" 8 60 "$ICECAST_USER_PASSWORD" 2>$data
301
+    sel=$?
302
+    case $sel in
303
+        0)  ICECAST_USER_PASSWORD=$(<$data)
304
+            if [[ "$ICECAST_USER_PASSWORD" != *' '* ]]; then
305
+                if [ ${#ICECAST_USER_PASSWORD} -gt 8 ]; then
306
+                    ${PROJECT_NAME}-pass -u $MY_USERNAME -a icecastuser -p $ICECAST_USER_PASSWORD
307
+                    dialog --title $"Change Icecast stream visitor login" \
308
+                           --msgbox $"Password changed to $ICECAST_USER_PASSWORD" 6 75
309
+                fi
310
+            fi
311
+            ;;
312
+    esac
313
+    rm $data
314
+}
315
+
316
+function icecast_enable_login {
317
+    dialog --title $"Enable Icecast login" \
318
+           --backtitle $"Freedombone Control Panel" \
319
+           --defaultno \
320
+           --yesno $"\nDo you want to add a login so that random web users can't access your stream?" 10 60
321
+    sel=$?
322
+    case $sel in
323
+        0) if grep -q '#auth_basic' /etc/nginx/sites-available/icecast; then
324
+               sed -i 's|#auth_basic|auth_basic|g' /etc/nginx/sites-available/icecast
325
+               systemctl restart nginx
326
+           fi
327
+           read_config_param $MY_USERNAME
328
+           ICECAST_USER_PASSWORD=$(${PROJECT_NAME}-pass -u $MY_USERNAME -a icecastuser)
329
+           dialog --title $"Enable Icecast login" \
330
+                  --msgbox $"Icecast logins are now enabled with the password $ICECAST_USER_PASSWORD" 6 65
331
+           ICECAST_USER_PASSWORD=
332
+           ;;
333
+        1) if ! grep -q '#auth_basic' /etc/nginx/sites-available/icecast; then
334
+               sed -i 's|auth_basic|#auth_basic|g' /etc/nginx/sites-available/icecast
335
+               systemctl restart nginx
336
+           fi
337
+           dialog --title $"Disable Icecast login" \
338
+                  --msgbox $"Icecast logins are now disabled. Anyone can access your stream." 6 65
339
+           ;;
340
+    esac
341
+}
342
+
343
+function icecast_set_stream_name {
344
+    data=$(tempfile 2>/dev/null)
345
+    trap "rm -f $data" 0 1 2 5 15
346
+    dialog --backtitle $"Freedombone Control Panel" \
347
+           --title $"Change Icecast stream details" \
348
+           --form "\n" 8 60 4 \
349
+           $"Stream name:" 1 1 "Example stream name" 1 18 40 1000 \
350
+           $"Description:" 2 1 "A short description of your stream" 2 18 40 1000 \
351
+           $"Genre:" 3 1 "Example genre" 3 18 40 1000 \
352
+           2> $data
353
+    sel=$?
354
+    case $sel in
355
+        1) return;;
356
+        255) return;;
357
+    esac
358
+    stream_name=$(cat $data | sed -n 1p)
359
+    stream_description=$(cat $data | sed -n 2p)
360
+    stream_genre=$(cat $data | sed -n 3p)
361
+    if [ ${#stream_name} -gt 2 ]; then
362
+        sed -i "s|<name>.*|<name>${stream_name}</name>|g" /etc/ices2/ices-playlist.xml
363
+    fi
364
+    if [ ${#stream_description} -gt 2 ]; then
365
+        sed -i "s|<description>.*|<description>${stream_description}</description>|g" /etc/ices2/ices-playlist.xml
366
+    fi
367
+    if [ ${#stream_genre} -gt 2 ]; then
368
+        sed -i "s|<genre>.*|<genre>${stream_genre}</genre>|g" /etc/ices2/ices-playlist.xml
369
+    fi
370
+    rm $data
371
+    stop_icecast
372
+    start_icecast
373
+}
374
+
375
+function icecast_set_maximum_streams {
376
+    data=$(tempfile 2>/dev/null)
377
+    trap "rm -f $data" 0 1 2 5 15
378
+    dialog --title $"Set the maximum clients" \
379
+           --backtitle $"Freedombone Control Panel" \
380
+           --inputbox $"Maximum number of clients" 8 40 "10" 2>$data
381
+    sel=$?
382
+    case $sel in
383
+        0)
384
+            max_clients=$(<$data)
385
+            if [ ${#max_clients} -gt 0 ]; then
386
+                if [[ "$max_clients" != *' '* ]]; then
387
+                    if [[ $max_clients =~ '^[0-9]+$' ]] ; then
388
+                        sed -i "s|<clients>.*|<clients>${max_clients}</clients>|g" /etc/icecast2/icecast.xml
389
+                        stop_icecast
390
+                        start_icecast
391
+                        dialog --title $"Set the maximum clients" \
392
+                               --msgbox $"\nMaximum Icecast clients was set to ${max_clients}" 8 50
393
+                    fi
394
+                fi
395
+            fi
396
+            ;;
397
+    esac
398
+    rm $data
399
+}
400
+
401
+function configure_interactive_icecast {
402
+    while true
403
+    do
404
+        data=$(tempfile 2>/dev/null)
405
+        trap "rm -f $data" 0 1 2 5 15
406
+        dialog --backtitle $"Freedombone Control Panel" \
407
+               --title $"Icecast" \
408
+               --radiolist $"Choose an operation:" 19 70 12 \
409
+               1 $"Import stream files from directory" off \
410
+               2 $"Import stream files from USB drive" off \
411
+               3 $"Format a USB drive for stream file storage" off \
412
+               4 $"Export stream files to USB drive" off \
413
+               5 $"Manually edit playlist" off \
414
+               6 $"Enable login for stream visitors" off \
415
+               7 $"Change password for stream visitors" off \
416
+               8 $"Re-scan playlist" off \
417
+               9 $"Restart stream" off \
418
+               10 $"Set Stream Name/Description/Genre" off \
419
+               11 $"Set maximum number of clients/streams" off \
420
+               12 $"Exit" on 2> $data
421
+        sel=$?
422
+        case $sel in
423
+            1) break;;
424
+            255) break;;
425
+        esac
426
+        case $(cat $data) in
427
+            1) icecast_import_from_directory;;
428
+            2) icecast_import_from_usb;;
429
+            3) icecast_format_drive;;
430
+            4) icecast_export_to_usb;;
431
+            5) icecast_edit_playlist;;
432
+            6) icecast_enable_login;;
433
+            7) icecast_change_login;;
434
+            8) clear
435
+               echo $'Rescanning Icecast playlist'
436
+               icecast_rescan;;
437
+            9) clear
438
+               echo $'Restarting Icecast stream'
439
+               stop_icecast
440
+               start_icecast;;
441
+            10) icecast_set_stream_name;;
442
+            11) icecast_set_maximum_streams;;
443
+            12) break;;
444
+        esac
445
+    done
446
+}
447
+
448
+function upgrade_icecast {
449
+    icecast_update_daemon
450
+}
451
+
452
+function backup_local_icecast {
453
+    if [ ! -d $ICECAST_DIR ]; then
454
+        return
455
+    fi
456
+    stop_icecast
457
+
458
+    cp /etc/nginx/.icepasswd $ICECAST_DIR
459
+    cp /etc/ices2/ices-playlist.xml $ICECAST_DIR
460
+
461
+    function_check backup_directory_to_usb
462
+    backup_directory_to_usb $ICECAST_DIR icecast
463
+
464
+    rm $ICECAST_DIR/.icepasswd
465
+    start_icecast
466
+}
467
+
468
+function restore_local_icecast {
469
+    if [ ! -d $ICECAST_DIR ]; then
470
+        return
471
+    fi
472
+    stop_icecast
473
+    temp_restore_dir=/root/tempicecast
474
+    function_check restore_directory_from_usb
475
+    restore_directory_from_usb $temp_restore_dir icecast
476
+    if [ -d $temp_restore_dir$ICECAST_DIR ]; then
477
+        cp -r $temp_restore_dir$ICECAST_DIR $ICECAST_DIR/
478
+    else
479
+        cp -r $temp_restore_dir/* $ICECAST_DIR/*
480
+    fi
481
+    cp $ICECAST_DIR/.icepasswd /etc/nginx/.icepasswd
482
+    rm $ICECAST_DIR/.icepasswd
483
+    cp $ICECAST_DIR/ices-playlist.xml /etc/ices2
484
+    rm $ICECAST_DIR/ices-playlist.xml
485
+    chown -R icecast2:icecast $ICECAST_DIR
486
+    chown -R icecast2:icecast /etc/ices2
487
+
488
+    start_icecast
489
+    rm -rf $temp_restore_dir
490
+}
491
+
492
+function backup_remote_icecast {
493
+    if [ ! -d $ICECAST_DIR ]; then
494
+        return
495
+    fi
496
+    stop_icecast
497
+
498
+    cp /etc/nginx/.icepasswd $ICECAST_DIR
499
+    cp /etc/ices2/ices-playlist.xml $ICECAST_DIR
500
+
501
+    function_check backup_directory_to_friend
502
+    backup_directory_to_friend $ICECAST_DIR icecast
503
+
504
+    rm $ICECAST_DIR/.icepasswd
505
+    start_icecast
506
+}
507
+
508
+function restore_remote_icecast {
509
+    if [ ! -d $ICECAST_DIR ]; then
510
+        return
511
+    fi
512
+    stop_icecast
513
+    temp_restore_dir=/root/tempicecast
514
+    function_check restore_directory_from_friend
515
+    restore_directory_from_friend $temp_restore_dir icecast
516
+    if [ -d $temp_restore_dir$ICECAST_DIR ]; then
517
+        cp -r $temp_restore_dir$ICECAST_DIR $ICECAST_DIR/
518
+    else
519
+        cp -r $temp_restore_dir/* $ICECAST_DIR/*
520
+    fi
521
+    cp $ICECAST_DIR/.icepasswd /etc/nginx/.icepasswd
522
+    rm $ICECAST_DIR/.icepasswd
523
+    cp $ICECAST_DIR/ices-playlist.xml /etc/ices2
524
+    rm $ICECAST_DIR/ices-playlist.xml
525
+    chown -R icecast2:icecast $ICECAST_DIR
526
+
527
+    start_icecast
528
+    rm -rf $temp_restore_dir
529
+}
530
+
531
+function remove_icecast {
532
+    nginx_dissite icecast
533
+
534
+    sed -i '/start_icecast/d' /etc/crontab
535
+    stop_icecast
536
+    systemctl disable icecast2
537
+    rm /etc/systemd/system/icecast2.service
538
+    rm /usr/bin/start_icecast
539
+    rm /usr/bin/stop_icecast
540
+
541
+    if [ -f /etc/nginx/sites-available/icecast ]; then
542
+        rm /etc/nginx/sites-available/icecast
543
+    fi
544
+
545
+    if [ -d /var/www/icecast ]; then
546
+        rm -rf /var/www/icecast
547
+    fi
548
+
549
+    apt-get -yq remove --purge icecast2
550
+
551
+    if [ -d /etc/icecast2 ]; then
552
+        rm -rf /etc/icecast2
553
+    fi
554
+    if [ -d /etc/ices2 ]; then
555
+        rm -rf /etc/ices2
556
+    fi
557
+    function_check remove_onion_service
558
+    remove_onion_service icecast ${ICECAST_ONION_PORT}
559
+    sed -i '/icecast/d' $COMPLETION_FILE
560
+}
561
+
562
+function install_icecast {
563
+    apt-get -yq install software-properties-common debconf-utils
564
+    apt-get -yq update
565
+
566
+    debconf-set-selections <<< "icecast2 icecast2/icecast-setup boolean false"
567
+    apt-get -yq install icecast2
568
+    apt-get -yq install ices2 ffmpeg apache2-utils
569
+
570
+    if [ ! -f /etc/icecast2/icecast.xml ]; then
571
+        echo $'Icecast not installed'
572
+        exit 7923528
573
+    fi
574
+
575
+    if [ ! ${ICECAST_PASSWORD} ]; then
576
+        if [ -f ${IMAGE_PASSWORD_FILE} ]; then
577
+            ICECAST_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
578
+        else
579
+            ICECAST_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
580
+        fi
581
+    fi
582
+
583
+    ICECAST_ONION_HOSTNAME=$(add_onion_service icecast 80 ${ICECAST_ONION_PORT})
584
+
585
+    sed -i  -e "s|<source-password>[^<]*</source-password>|<source-password>$ICECAST_PASSWORD</source-password>|" \
586
+        -e "s|<relay-password>[^<]*</relay-password>|<relay-password>$ICECAST_PASSWORD</relay-password>|" \
587
+        -e "s|<admin-password>[^<]*</admin-password>|<admin-password>$ICECAST_PASSWORD</admin-password>|" \
588
+        -e "s|<hostname>[^<]*</hostname>|<hostname>$ICECAST_ONION_HOSTNAME</hostname>|" \
589
+        /etc/icecast2/icecast.xml
590
+
591
+    sed -i "s|<clients>.*|<clients>10</clients>|g" /etc/icecast2/icecast.xml
592
+    sed -i "s|<port>.*|<port>$ICECAST_PORT</port>|g" /etc/icecast2/icecast.xml
593
+    sed -i "s|<admin-user>.*|<admin-user>$MY_USERNAME</admin-user>|g" /etc/icecast2/icecast.xml
594
+    sed -i "s|<admin>.*|<admin>$MY_EMAIL_ADDRESS</admin>|g" /etc/icecast2/icecast.xml
595
+    sed -i "s|<location>.*|<location>The Interwebs</location>|g" /etc/icecast2/icecast.xml
596
+    #sed -i 's|<!-- <bind-address>.*|<bind-address>127.0.0.1</bind-address>|g' /etc/icecast2/icecast.xml
597
+
598
+    if [ ! -d /var/www/icecast/htdocs ]; then
599
+        mkdir -p /var/www/icecast/htdocs
600
+    fi
601
+
602
+    icecast_nginx_site=/etc/nginx/sites-available/icecast
603
+    echo 'server {' > $icecast_nginx_site
604
+    echo "    listen 127.0.0.1:$ICECAST_ONION_PORT default_server;" >> $icecast_nginx_site
605
+    echo "    server_name $ICECAST_ONION_HOSTNAME;" >> $icecast_nginx_site
606
+    echo '' >> $icecast_nginx_site
607
+    echo '  # Logs' >> $icecast_nginx_site
608
+    echo '  access_log /dev/null;' >> $icecast_nginx_site
609
+    echo '  error_log /dev/null;' >> $icecast_nginx_site
610
+    echo '' >> $icecast_nginx_site
611
+    echo '  location / {' >> $icecast_nginx_site
612
+    function_check nginx_limits
613
+    nginx_limits $ICECAST_ONION_HOSTNAME '15m'
614
+    echo "      proxy_pass http://localhost:$ICECAST_PORT;" >> $icecast_nginx_site
615
+    echo "      #auth_basic \"${ICECAST_LOGIN_TEXT}\";" >> $icecast_nginx_site
616
+    echo '      #auth_basic_user_file /etc/nginx/.icepasswd;' >> $icecast_nginx_site
617
+    echo '  }' >> $icecast_nginx_site
618
+    echo '}' >> $icecast_nginx_site
619
+
620
+    if [ ! -d /var/log/ices ]; then
621
+        mkdir -p /var/log/ices
622
+    fi
623
+    if [ ! -d /etc/ices2 ]; then
624
+        mkdir -p /etc/ices2
625
+    fi
626
+
627
+    echo '<?xml version="1.0"?>' > /etc/ices2/ices-playlist.xml
628
+    echo '<ices>' >> /etc/ices2/ices-playlist.xml
629
+    echo '    <!-- run in background -->' >> /etc/ices2/ices-playlist.xml
630
+    echo '    <background>1</background>' >> /etc/ices2/ices-playlist.xml
631
+    echo '    <!-- where logs, etc go. -->' >> /etc/ices2/ices-playlist.xml
632
+    echo '    <logpath>/var/log/ices</logpath>' >> /etc/ices2/ices-playlist.xml
633
+    echo '    <logfile>ices.log</logfile>' >> /etc/ices2/ices-playlist.xml
634
+    echo '    <!-- 1=error,2=warn,3=info,4=debug -->' >> /etc/ices2/ices-playlist.xml
635
+    echo '    <loglevel>1</loglevel>' >> /etc/ices2/ices-playlist.xml
636
+    echo '    <!-- set this to 1 to log to the console instead of to the file above -->' >> /etc/ices2/ices-playlist.xml
637
+    echo '    <consolelog>0</consolelog>' >> /etc/ices2/ices-playlist.xml
638
+    echo '' >> /etc/ices2/ices-playlist.xml
639
+    echo '    <!-- optional filename to write process id to -->' >> /etc/ices2/ices-playlist.xml
640
+    echo '    <!-- <pidfile>/home/ices/ices.pid</pidfile> -->' >> /etc/ices2/ices-playlist.xml
641
+    echo '' >> /etc/ices2/ices-playlist.xml
642
+    echo '    <stream>' >> /etc/ices2/ices-playlist.xml
643
+    echo '        <!-- metadata used for stream listing (not currently used) -->' >> /etc/ices2/ices-playlist.xml
644
+    echo '        <metadata>' >> /etc/ices2/ices-playlist.xml
645
+    echo '            <name>Example stream name</name>' >> /etc/ices2/ices-playlist.xml
646
+    echo '            <genre>Example genre</genre>' >> /etc/ices2/ices-playlist.xml
647
+    echo '            <description>A short description of your stream</description>' >> /etc/ices2/ices-playlist.xml
648
+    echo '        </metadata>' >> /etc/ices2/ices-playlist.xml
649
+    echo '' >> /etc/ices2/ices-playlist.xml
650
+    echo '        <!-- input module' >> /etc/ices2/ices-playlist.xml
651
+    echo '' >> /etc/ices2/ices-playlist.xml
652
+    echo '            The module used here is the playlist module - it has ' >> /etc/ices2/ices-playlist.xml
653
+    echo '            "submodules" for different types of playlist. There are' >> /etc/ices2/ices-playlist.xml
654
+    echo '            two currently implemented, "basic", which is a simple' >> /etc/ices2/ices-playlist.xml
655
+    echo '            file-based playlist, and "script" which invokes a command' >> /etc/ices2/ices-playlist.xml
656
+    echo '            to returns a filename to start playing. -->' >> /etc/ices2/ices-playlist.xml
657
+    echo '' >> /etc/ices2/ices-playlist.xml
658
+    echo '        <input>' >> /etc/ices2/ices-playlist.xml
659
+    echo '            <module>playlist</module>' >> /etc/ices2/ices-playlist.xml
660
+    echo '            <param name="type">basic</param>' >> /etc/ices2/ices-playlist.xml
661
+    echo "            <param name=\"file\">$ICECAST_PLAYLIST_FILE</param>" >> /etc/ices2/ices-playlist.xml
662
+    echo '            <!-- random play -->' >> /etc/ices2/ices-playlist.xml
663
+    echo '            <param name="random">0</param>' >> /etc/ices2/ices-playlist.xml
664
+    echo '            <!-- if the playlist get updated that start at the beginning -->' >> /etc/ices2/ices-playlist.xml
665
+    echo '            <param name="restart-after-reread">0</param>' >> /etc/ices2/ices-playlist.xml
666
+    echo '            <!-- if set to 1 , plays once through, then exits. -->' >> /etc/ices2/ices-playlist.xml
667
+    echo '            <param name="once">0</param>' >> /etc/ices2/ices-playlist.xml
668
+    echo '        </input>' >> /etc/ices2/ices-playlist.xml
669
+    echo '' >> /etc/ices2/ices-playlist.xml
670
+    echo '            <!-- Stream instance' >> /etc/ices2/ices-playlist.xml
671
+    echo '            You may have one or more instances here. This allows you to ' >> /etc/ices2/ices-playlist.xml
672
+    echo '            send the same input data to one or more servers (or to different' >> /etc/ices2/ices-playlist.xml
673
+    echo '            mountpoints on the same server). Each of them can have different' >> /etc/ices2/ices-playlist.xml
674
+    echo '            parameters. This is primarily useful for a) relaying to multiple' >> /etc/ices2/ices-playlist.xml
675
+    echo '            independent servers, and b) encoding/reencoding to multiple' >> /etc/ices2/ices-playlist.xml
676
+    echo '            bitrates.' >> /etc/ices2/ices-playlist.xml
677
+    echo '            If one instance fails (for example, the associated server goes' >> /etc/ices2/ices-playlist.xml
678
+    echo '            down, etc), the others will continue to function correctly.' >> /etc/ices2/ices-playlist.xml
679
+    echo '            This example defines two instances as two mountpoints on the' >> /etc/ices2/ices-playlist.xml
680
+    echo '            same server.  -->' >> /etc/ices2/ices-playlist.xml
681
+    echo '        <instance>' >> /etc/ices2/ices-playlist.xml
682
+    echo '            <!-- Server details:' >> /etc/ices2/ices-playlist.xml
683
+    echo '                You define hostname and port for the server here, along with' >> /etc/ices2/ices-playlist.xml
684
+    echo '                the source password and mountpoint.  -->' >> /etc/ices2/ices-playlist.xml
685
+    echo '            <hostname>localhost</hostname>' >> /etc/ices2/ices-playlist.xml
686
+    echo "            <port>$ICECAST_PORT</port>" >> /etc/ices2/ices-playlist.xml
687
+    echo "            <password>$ICECAST_PASSWORD</password>" >> /etc/ices2/ices-playlist.xml
688
+    echo '            <mount>/example1.ogg</mount>' >> /etc/ices2/ices-playlist.xml
689
+    echo '            <!-- Reconnect parameters:' >> /etc/ices2/ices-playlist.xml
690
+    echo '                When something goes wrong (e.g. the server crashes, or the' >> /etc/ices2/ices-playlist.xml
691
+    echo '                network drops) and ices disconnects from the server, these' >> /etc/ices2/ices-playlist.xml
692
+    echo '                control how often it tries to reconnect, and how many times' >> /etc/ices2/ices-playlist.xml
693
+    echo '                it tries to reconnect. Delay is in seconds.' >> /etc/ices2/ices-playlist.xml
694
+    echo '                If you set reconnectattempts to -1, it will continue ' >> /etc/ices2/ices-playlist.xml
695
+    echo '                indefinately. Suggest setting reconnectdelay to a large value' >> /etc/ices2/ices-playlist.xml
696
+    echo '                if you do this.' >> /etc/ices2/ices-playlist.xml
697
+    echo '            -->' >> /etc/ices2/ices-playlist.xml
698
+    echo '            <reconnectdelay>2</reconnectdelay>' >> /etc/ices2/ices-playlist.xml
699
+    echo '            <reconnectattempts>5</reconnectattempts> ' >> /etc/ices2/ices-playlist.xml
700
+    echo '' >> /etc/ices2/ices-playlist.xml
701
+    echo '            <!-- maxqueuelength:' >> /etc/ices2/ices-playlist.xml
702
+    echo '                This describes how long the internal data queues may be. This' >> /etc/ices2/ices-playlist.xml
703
+    echo '                basically lets you control how much data gets buffered before' >> /etc/ices2/ices-playlist.xml
704
+    echo '                ices decides it cant send to the server fast enough, and ' >> /etc/ices2/ices-playlist.xml
705
+    echo '                either shuts down or flushes the queue (dropping the data)' >> /etc/ices2/ices-playlist.xml
706
+    echo '                and continues. ' >> /etc/ices2/ices-playlist.xml
707
+    echo '                For advanced users only.' >> /etc/ices2/ices-playlist.xml
708
+    echo '            -->' >> /etc/ices2/ices-playlist.xml
709
+    echo '            <maxqueuelength>80</maxqueuelength>' >> /etc/ices2/ices-playlist.xml
710
+    echo '' >> /etc/ices2/ices-playlist.xml
711
+    echo '            <!-- Live encoding/reencoding:' >> /etc/ices2/ices-playlist.xml
712
+    echo '                Currrently, the parameters given here for encoding MUST' >> /etc/ices2/ices-playlist.xml
713
+    echo '                match the input data for channels and sample rate. That ' >> /etc/ices2/ices-playlist.xml
714
+    echo '                restriction will be relaxed in the future.' >> /etc/ices2/ices-playlist.xml
715
+    echo '                Remove this section if you dont want your files getting reencoded.' >> /etc/ices2/ices-playlist.xml
716
+    echo '            -->' >> /etc/ices2/ices-playlist.xml
717
+    echo '            <encode>  ' >> /etc/ices2/ices-playlist.xml
718
+    echo '                <nominal-bitrate>64000</nominal-bitrate>' >> /etc/ices2/ices-playlist.xml
719
+    echo '                <samplerate>22050</samplerate>' >> /etc/ices2/ices-playlist.xml
720
+    echo '                <channels>1</channels>' >> /etc/ices2/ices-playlist.xml
721
+    echo '            </encode>' >> /etc/ices2/ices-playlist.xml
722
+    echo '        </instance>' >> /etc/ices2/ices-playlist.xml
723
+    echo '' >> /etc/ices2/ices-playlist.xml
724
+    echo '        </stream>' >> /etc/ices2/ices-playlist.xml
725
+    echo '</ices>' >> /etc/ices2/ices-playlist.xml
726
+
727
+    sed -i 's|ENABLE=.*|ENABLE=true|g' /etc/default/icecast2
728
+
729
+    if [ ! -d $ICECAST_DIR ]; then
730
+        mkdir $ICECAST_DIR
731
+    fi
732
+    chown -R icecast2:icecast $ICECAST_DIR
733
+
734
+
735
+    # create a password for users
736
+    ICECAST_USER_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
737
+    if grep -q "$MY_USERNAME:" /etc/nginx/.icepasswd; then
738
+        sed -i "/$MY_USERNAME:/d" /etc/nginx/.icepasswd
739
+    fi
740
+    echo "$ICECAST_USER_PASSWORD" | htpasswd -i -s -c /etc/nginx/.icepasswd $MY_USERNAME
741
+    if [ ! -f /etc/nginx/.icepasswd ]; then
742
+        echo $'/etc/nginx/.icepasswd not found'
743
+        exit 73528235
744
+    fi
745
+
746
+    ${PROJECT_NAME}-pass -u $MY_USERNAME -a icecast -p "$ICECAST_PASSWORD"
747
+    ${PROJECT_NAME}-pass -u $MY_USERNAME -a icecastuser -p "$ICECAST_USER_PASSWORD"
748
+
749
+    groupadd icecast
750
+    useradd -c "Icecast system account" -d /etc/icecast2 -m -r -g icecast icecast2
751
+
752
+    icecast_update_daemon
753
+    nginx_ensite icecast
754
+    systemctl restart nginx
755
+    icecast_rescan
756
+    start_icecast
757
+
758
+    APP_INSTALLED=1
759
+}
760
+
761
+function install_interactive_icecast {
762
+    install_icecast
763
+}
764
+
765
+# NOTE: deliberately no exit 0

+ 1
- 1
src/freedombone-app-koel Ver fichero

175
 
175
 
176
 function koel_import_from_directory {
176
 function koel_import_from_directory {
177
     data=$(tempfile 2>/dev/null)
177
     data=$(tempfile 2>/dev/null)
178
-    dialog --title "test" --dselect /home/$MY_USERNAME/ 30 60 2> $data
178
+    dialog --title "Choose a directory containing music" --dselect /home/$MY_USERNAME/ 30 60 2> $data
179
     selected_dir=$(cat $data)
179
     selected_dir=$(cat $data)
180
     rm $data
180
     rm $data
181
     if [[ "$selected_dir" == '/music' ]]; then
181
     if [[ "$selected_dir" == '/music' ]]; then

+ 376
- 0
website/EN/app_icecast.html Ver fichero

1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
+<head>
6
+<!-- 2017-11-27 Mon 12:35 -->
7
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
+<meta name="viewport" content="width=device-width, initial-scale=1" />
9
+<title>&lrm;</title>
10
+<meta name="generator" content="Org mode" />
11
+<meta name="author" content="Bob Mottram" />
12
+<meta name="description" content="How to use Icecast"
13
+ />
14
+<meta name="keywords" content="freedombone, icecast" />
15
+<style type="text/css">
16
+ <!--/*--><![CDATA[/*><!--*/
17
+  .title  { text-align: center;
18
+             margin-bottom: .2em; }
19
+  .subtitle { text-align: center;
20
+              font-size: medium;
21
+              font-weight: bold;
22
+              margin-top:0; }
23
+  .todo   { font-family: monospace; color: red; }
24
+  .done   { font-family: monospace; color: green; }
25
+  .priority { font-family: monospace; color: orange; }
26
+  .tag    { background-color: #eee; font-family: monospace;
27
+            padding: 2px; font-size: 80%; font-weight: normal; }
28
+  .timestamp { color: #bebebe; }
29
+  .timestamp-kwd { color: #5f9ea0; }
30
+  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
31
+  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
32
+  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
33
+  .underline { text-decoration: underline; }
34
+  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
35
+  p.verse { margin-left: 3%; }
36
+  pre {
37
+    border: 1px solid #ccc;
38
+    box-shadow: 3px 3px 3px #eee;
39
+    padding: 8pt;
40
+    font-family: monospace;
41
+    overflow: auto;
42
+    margin: 1.2em;
43
+  }
44
+  pre.src {
45
+    position: relative;
46
+    overflow: visible;
47
+    padding-top: 1.2em;
48
+  }
49
+  pre.src:before {
50
+    display: none;
51
+    position: absolute;
52
+    background-color: white;
53
+    top: -10px;
54
+    right: 10px;
55
+    padding: 3px;
56
+    border: 1px solid black;
57
+  }
58
+  pre.src:hover:before { display: inline;}
59
+  /* Languages per Org manual */
60
+  pre.src-asymptote:before { content: 'Asymptote'; }
61
+  pre.src-awk:before { content: 'Awk'; }
62
+  pre.src-C:before { content: 'C'; }
63
+  /* pre.src-C++ doesn't work in CSS */
64
+  pre.src-clojure:before { content: 'Clojure'; }
65
+  pre.src-css:before { content: 'CSS'; }
66
+  pre.src-D:before { content: 'D'; }
67
+  pre.src-ditaa:before { content: 'ditaa'; }
68
+  pre.src-dot:before { content: 'Graphviz'; }
69
+  pre.src-calc:before { content: 'Emacs Calc'; }
70
+  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
71
+  pre.src-fortran:before { content: 'Fortran'; }
72
+  pre.src-gnuplot:before { content: 'gnuplot'; }
73
+  pre.src-haskell:before { content: 'Haskell'; }
74
+  pre.src-hledger:before { content: 'hledger'; }
75
+  pre.src-java:before { content: 'Java'; }
76
+  pre.src-js:before { content: 'Javascript'; }
77
+  pre.src-latex:before { content: 'LaTeX'; }
78
+  pre.src-ledger:before { content: 'Ledger'; }
79
+  pre.src-lisp:before { content: 'Lisp'; }
80
+  pre.src-lilypond:before { content: 'Lilypond'; }
81
+  pre.src-lua:before { content: 'Lua'; }
82
+  pre.src-matlab:before { content: 'MATLAB'; }
83
+  pre.src-mscgen:before { content: 'Mscgen'; }
84
+  pre.src-ocaml:before { content: 'Objective Caml'; }
85
+  pre.src-octave:before { content: 'Octave'; }
86
+  pre.src-org:before { content: 'Org mode'; }
87
+  pre.src-oz:before { content: 'OZ'; }
88
+  pre.src-plantuml:before { content: 'Plantuml'; }
89
+  pre.src-processing:before { content: 'Processing.js'; }
90
+  pre.src-python:before { content: 'Python'; }
91
+  pre.src-R:before { content: 'R'; }
92
+  pre.src-ruby:before { content: 'Ruby'; }
93
+  pre.src-sass:before { content: 'Sass'; }
94
+  pre.src-scheme:before { content: 'Scheme'; }
95
+  pre.src-screen:before { content: 'Gnu Screen'; }
96
+  pre.src-sed:before { content: 'Sed'; }
97
+  pre.src-sh:before { content: 'shell'; }
98
+  pre.src-sql:before { content: 'SQL'; }
99
+  pre.src-sqlite:before { content: 'SQLite'; }
100
+  /* additional languages in org.el's org-babel-load-languages alist */
101
+  pre.src-forth:before { content: 'Forth'; }
102
+  pre.src-io:before { content: 'IO'; }
103
+  pre.src-J:before { content: 'J'; }
104
+  pre.src-makefile:before { content: 'Makefile'; }
105
+  pre.src-maxima:before { content: 'Maxima'; }
106
+  pre.src-perl:before { content: 'Perl'; }
107
+  pre.src-picolisp:before { content: 'Pico Lisp'; }
108
+  pre.src-scala:before { content: 'Scala'; }
109
+  pre.src-shell:before { content: 'Shell Script'; }
110
+  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
111
+  /* additional language identifiers per "defun org-babel-execute"
112
+       in ob-*.el */
113
+  pre.src-cpp:before  { content: 'C++'; }
114
+  pre.src-abc:before  { content: 'ABC'; }
115
+  pre.src-coq:before  { content: 'Coq'; }
116
+  pre.src-groovy:before  { content: 'Groovy'; }
117
+  /* additional language identifiers from org-babel-shell-names in
118
+     ob-shell.el: ob-shell is the only babel language using a lambda to put
119
+     the execution function name together. */
120
+  pre.src-bash:before  { content: 'bash'; }
121
+  pre.src-csh:before  { content: 'csh'; }
122
+  pre.src-ash:before  { content: 'ash'; }
123
+  pre.src-dash:before  { content: 'dash'; }
124
+  pre.src-ksh:before  { content: 'ksh'; }
125
+  pre.src-mksh:before  { content: 'mksh'; }
126
+  pre.src-posh:before  { content: 'posh'; }
127
+  /* Additional Emacs modes also supported by the LaTeX listings package */
128
+  pre.src-ada:before { content: 'Ada'; }
129
+  pre.src-asm:before { content: 'Assembler'; }
130
+  pre.src-caml:before { content: 'Caml'; }
131
+  pre.src-delphi:before { content: 'Delphi'; }
132
+  pre.src-html:before { content: 'HTML'; }
133
+  pre.src-idl:before { content: 'IDL'; }
134
+  pre.src-mercury:before { content: 'Mercury'; }
135
+  pre.src-metapost:before { content: 'MetaPost'; }
136
+  pre.src-modula-2:before { content: 'Modula-2'; }
137
+  pre.src-pascal:before { content: 'Pascal'; }
138
+  pre.src-ps:before { content: 'PostScript'; }
139
+  pre.src-prolog:before { content: 'Prolog'; }
140
+  pre.src-simula:before { content: 'Simula'; }
141
+  pre.src-tcl:before { content: 'tcl'; }
142
+  pre.src-tex:before { content: 'TeX'; }
143
+  pre.src-plain-tex:before { content: 'Plain TeX'; }
144
+  pre.src-verilog:before { content: 'Verilog'; }
145
+  pre.src-vhdl:before { content: 'VHDL'; }
146
+  pre.src-xml:before { content: 'XML'; }
147
+  pre.src-nxml:before { content: 'XML'; }
148
+  /* add a generic configuration mode; LaTeX export needs an additional
149
+     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
150
+  pre.src-conf:before { content: 'Configuration File'; }
151
+
152
+  table { border-collapse:collapse; }
153
+  caption.t-above { caption-side: top; }
154
+  caption.t-bottom { caption-side: bottom; }
155
+  td, th { vertical-align:top;  }
156
+  th.org-right  { text-align: center;  }
157
+  th.org-left   { text-align: center;   }
158
+  th.org-center { text-align: center; }
159
+  td.org-right  { text-align: right;  }
160
+  td.org-left   { text-align: left;   }
161
+  td.org-center { text-align: center; }
162
+  dt { font-weight: bold; }
163
+  .footpara { display: inline; }
164
+  .footdef  { margin-bottom: 1em; }
165
+  .figure { padding: 1em; }
166
+  .figure p { text-align: center; }
167
+  .inlinetask {
168
+    padding: 10px;
169
+    border: 2px solid gray;
170
+    margin: 10px;
171
+    background: #ffffcc;
172
+  }
173
+  #org-div-home-and-up
174
+   { text-align: right; font-size: 70%; white-space: nowrap; }
175
+  textarea { overflow-x: auto; }
176
+  .linenr { font-size: smaller }
177
+  .code-highlighted { background-color: #ffff00; }
178
+  .org-info-js_info-navigation { border-style: none; }
179
+  #org-info-js_console-label
180
+    { font-size: 10px; font-weight: bold; white-space: nowrap; }
181
+  .org-info-js_search-highlight
182
+    { background-color: #ffff00; color: #000000; font-weight: bold; }
183
+  .org-svg { width: 90%; }
184
+  /*]]>*/-->
185
+</style>
186
+<link rel="stylesheet" type="text/css" href="freedombone.css" />
187
+<script type="text/javascript">
188
+/*
189
+@licstart  The following is the entire license notice for the
190
+JavaScript code in this tag.
191
+
192
+Copyright (C) 2012-2017 Free Software Foundation, Inc.
193
+
194
+The JavaScript code in this tag is free software: you can
195
+redistribute it and/or modify it under the terms of the GNU
196
+General Public License (GNU GPL) as published by the Free Software
197
+Foundation, either version 3 of the License, or (at your option)
198
+any later version.  The code is distributed WITHOUT ANY WARRANTY;
199
+without even the implied warranty of MERCHANTABILITY or FITNESS
200
+FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
201
+
202
+As additional permission under GNU GPL version 3 section 7, you
203
+may distribute non-source (e.g., minimized or compacted) forms of
204
+that code without the copy of the GNU GPL normally required by
205
+section 4, provided you include this license notice and a URL
206
+through which recipients can access the Corresponding Source.
207
+
208
+
209
+@licend  The above is the entire license notice
210
+for the JavaScript code in this tag.
211
+*/
212
+<!--/*--><![CDATA[/*><!--*/
213
+ function CodeHighlightOn(elem, id)
214
+ {
215
+   var target = document.getElementById(id);
216
+   if(null != target) {
217
+     elem.cacheClassElem = elem.className;
218
+     elem.cacheClassTarget = target.className;
219
+     target.className = "code-highlighted";
220
+     elem.className   = "code-highlighted";
221
+   }
222
+ }
223
+ function CodeHighlightOff(elem, id)
224
+ {
225
+   var target = document.getElementById(id);
226
+   if(elem.cacheClassElem)
227
+     elem.className = elem.cacheClassElem;
228
+   if(elem.cacheClassTarget)
229
+     target.className = elem.cacheClassTarget;
230
+ }
231
+/*]]>*///-->
232
+</script>
233
+</head>
234
+<body>
235
+<div id="preamble" class="status">
236
+<a name="top" id="top"></a>
237
+</div>
238
+<div id="content">
239
+<div class="org-center">
240
+
241
+<div class="figure">
242
+<p><img src="images/logo.png" alt="logo.png" />
243
+</p>
244
+</div>
245
+</div>
246
+
247
+<center>
248
+<h1>Icecast</h1>
249
+</center>
250
+
251
+<p>
252
+Icecast enables you to run something like an internet radio station. So if you have multiple audio files and want to be able to stream those in sequence from a web site then this can be useful.
253
+</p>
254
+
255
+<p>
256
+This system is available only via an onion address, which should mitigate the potential for copyright disputes over streamed content. By default it's only set up to stream to a small number of users so that it doesn't put too much stress on CPU or memory requirements, although you can increase the maximum limit if you have a more powerful system and enough bandwidth.
257
+</p>
258
+
259
+<div id="outline-container-org9fecb99" class="outline-2">
260
+<h2 id="org9fecb99">Installation</h2>
261
+<div class="outline-text-2" id="text-org9fecb99">
262
+<p>
263
+Log into your system with:
264
+</p>
265
+
266
+<div class="org-src-container">
267
+<pre class="src src-bash">ssh myusername@mydomain -p 2222
268
+</pre>
269
+</div>
270
+
271
+<p>
272
+Using cursor keys, space bar and Enter key select <b>Administrator controls</b> and type in your password.
273
+</p>
274
+
275
+<p>
276
+Select <b>Add/Remove Apps</b>. If Vim is selected then you might want to unselect and uninstall it first, then select <b>icecast</b>.
277
+</p>
278
+
279
+<p>
280
+If you then go to the <b>About</b> screen you'll see the onion address for Icecast and can navigate to it in a Tor compatible browser.
281
+</p>
282
+</div>
283
+</div>
284
+
285
+<div id="outline-container-orgf30a581" class="outline-2">
286
+<h2 id="orgf30a581">Adding files to be streamed</h2>
287
+<div class="outline-text-2" id="text-orgf30a581">
288
+<p>
289
+There are two ways to get files onto the system: either via ssh or via a USB drive. File types can be <b>ogg, ogv, mp3 or mp4</b> format.
290
+</p>
291
+
292
+<p>
293
+It may take a while for the files to import, especially on a low power single board computer, since any mp3 or mp4 files will be converted to ogg or ogv. If you want to speed this up then you could do this conversion manually on a laptop with ffmpeg before storing files onto the USB drive or uploading them via ssh.
294
+</p>
295
+</div>
296
+
297
+<div id="outline-container-org366fd74" class="outline-3">
298
+<h3 id="org366fd74">From a USB drive</h3>
299
+<div class="outline-text-3" id="text-org366fd74">
300
+<p>
301
+Create a directory on the USB drive named <b>icestream</b> and copy your files into there. Plug the drive into your server.
302
+</p>
303
+
304
+<p>
305
+Go to the <b>Administrator control panel</b>, select <b>App settings</b>, then <b>icecast</b>, then <b>Import stream files from USB drive</b>.
306
+</p>
307
+</div>
308
+</div>
309
+
310
+<div id="outline-container-orgbb75a88" class="outline-3">
311
+<h3 id="orgbb75a88">Via ssh</h3>
312
+<div class="outline-text-3" id="text-orgbb75a88">
313
+<p>
314
+Make a directory named <b>icestream</b> and copy your files into it. Then copy the directory to your server.
315
+</p>
316
+
317
+<div class="org-src-container">
318
+<pre class="src src-bash">scp -r -P 2222 icestream myusername@mydomain:/home/myusername
319
+</pre>
320
+</div>
321
+
322
+<p>
323
+Log into your server with:
324
+</p>
325
+
326
+<div class="org-src-container">
327
+<pre class="src src-bash">ssh myusername@mydomain -p 2222
328
+</pre>
329
+</div>
330
+
331
+<p>
332
+Select <b>Administrator controls</b>, enter your password, then go to <b>App settings</b> followed by <b>icecast</b> and <b>Import stream files</b>. Choose the directory with up and down cursors and space bar to select.
333
+</p>
334
+</div>
335
+</div>
336
+</div>
337
+
338
+<div id="outline-container-orgdc2e42f" class="outline-2">
339
+<h2 id="orgdc2e42f">Access controls</h2>
340
+<div class="outline-text-2" id="text-orgdc2e42f">
341
+<p>
342
+By default anyone who happens to find your Icecast onion address can listen to your stream. If you only want it to be available to a few friends or family then you can add an extra login password.
343
+</p>
344
+
345
+<p>
346
+Go to the <b>Administrator control panel</b>, select <b>App settings</b>, then <b>icecast</b>, then <b>Enable login for stream users</b>. Take a note of the password and you can give that out to whoever needs access, preferably via an encrypted chat app or sneakernet. If you need to copy and paste then hold the shift key while highlighting the password.
347
+</p>
348
+</div>
349
+</div>
350
+</div>
351
+<div id="postamble" class="status">
352
+
353
+<style type="text/css">
354
+.back-to-top {
355
+    position: fixed;
356
+    bottom: 2em;
357
+    right: 0px;
358
+    text-decoration: none;
359
+    color: #000000;
360
+    background-color: rgba(235, 235, 235, 0.80);
361
+    font-size: 12px;
362
+    padding: 1em;
363
+    display: none;
364
+}
365
+
366
+.back-to-top:hover {
367
+    background-color: rgba(135, 135, 135, 0.50);
368
+}
369
+</style>
370
+
371
+<div class="back-to-top">
372
+<a href="#top">Back to top</a> | <a href="mailto:bob@freedombone.net">E-mail me</a>
373
+</div>
374
+</div>
375
+</body>
376
+</html>

+ 121
- 109
website/EN/apps.html Ver fichero

3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
 <head>
5
 <head>
6
-<!-- 2017-11-08 Wed 14:34 -->
6
+<!-- 2017-11-27 Mon 12:30 -->
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
9
 <title>&lrm;</title>
9
 <title>&lrm;</title>
264
 </div>
264
 </div>
265
 </div>
265
 </div>
266
 
266
 
267
-<div id="outline-container-orge2d5b23" class="outline-2">
268
-<h2 id="orge2d5b23">CryptPad</h2>
269
-<div class="outline-text-2" id="text-orge2d5b23">
267
+<div id="outline-container-org6976750" class="outline-2">
268
+<h2 id="org6976750">CryptPad</h2>
269
+<div class="outline-text-2" id="text-org6976750">
270
 <p>
270
 <p>
271
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
271
 Collaborate on editing documents, presentations and source code, or vote on things. All with a good level of security.
272
 </p>
272
 </p>
276
 </p>
276
 </p>
277
 </div>
277
 </div>
278
 </div>
278
 </div>
279
-<div id="outline-container-org535af0a" class="outline-2">
280
-<h2 id="org535af0a">DLNA</h2>
281
-<div class="outline-text-2" id="text-org535af0a">
279
+<div id="outline-container-org034a81a" class="outline-2">
280
+<h2 id="org034a81a">DLNA</h2>
281
+<div class="outline-text-2" id="text-org034a81a">
282
 <p>
282
 <p>
283
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
283
 Enables you to use the system as a music server which any DLNA compatible devices can connect to within your home network.
284
 </p>
284
 </p>
288
 </p>
288
 </p>
289
 </div>
289
 </div>
290
 </div>
290
 </div>
291
-<div id="outline-container-org61623e3" class="outline-2">
292
-<h2 id="org61623e3">Dokuwiki</h2>
293
-<div class="outline-text-2" id="text-org61623e3">
291
+<div id="outline-container-orgd4981e7" class="outline-2">
292
+<h2 id="orgd4981e7">Dokuwiki</h2>
293
+<div class="outline-text-2" id="text-orgd4981e7">
294
 <p>
294
 <p>
295
 A databaseless wiki system.
295
 A databaseless wiki system.
296
 </p>
296
 </p>
300
 </p>
300
 </p>
301
 </div>
301
 </div>
302
 </div>
302
 </div>
303
-<div id="outline-container-orge0257ac" class="outline-2">
304
-<h2 id="orge0257ac">Emacs</h2>
305
-<div class="outline-text-2" id="text-orge0257ac">
303
+<div id="outline-container-org5c87cff" class="outline-2">
304
+<h2 id="org5c87cff">Emacs</h2>
305
+<div class="outline-text-2" id="text-org5c87cff">
306
 <p>
306
 <p>
307
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
307
 If you use the Mutt client to read your email then this will set it up to use emacs for composing new mail.
308
 </p>
308
 </p>
312
 </p>
312
 </p>
313
 </div>
313
 </div>
314
 </div>
314
 </div>
315
-<div id="outline-container-orgb24d6db" class="outline-2">
316
-<h2 id="orgb24d6db">Etherpad</h2>
317
-<div class="outline-text-2" id="text-orgb24d6db">
315
+<div id="outline-container-org8f6c5e6" class="outline-2">
316
+<h2 id="org8f6c5e6">Etherpad</h2>
317
+<div class="outline-text-2" id="text-org8f6c5e6">
318
 <p>
318
 <p>
319
 Collaborate on creating documents in real time. Maybe you're planning a holiday with other family members or creating documentation for a Free Software project along with other volunteers. Etherpad is hard to beat for simplicity and speed. Only users of the system will be able to access it.
319
 Collaborate on creating documents in real time. Maybe you're planning a holiday with other family members or creating documentation for a Free Software project along with other volunteers. Etherpad is hard to beat for simplicity and speed. Only users of the system will be able to access it.
320
 </p>
320
 </p>
324
 </p>
324
 </p>
325
 </div>
325
 </div>
326
 </div>
326
 </div>
327
-<div id="outline-container-orgb3d24df" class="outline-2">
328
-<h2 id="orgb3d24df">Friendica</h2>
329
-<div class="outline-text-2" id="text-orgb3d24df">
327
+<div id="outline-container-orgbda9945" class="outline-2">
328
+<h2 id="orgbda9945">Friendica</h2>
329
+<div class="outline-text-2" id="text-orgbda9945">
330
 <p>
330
 <p>
331
 Federated social network system.
331
 Federated social network system.
332
 </p>
332
 </p>
336
 </p>
336
 </p>
337
 </div>
337
 </div>
338
 </div>
338
 </div>
339
-<div id="outline-container-org80e709f" class="outline-2">
340
-<h2 id="org80e709f">Ghost</h2>
341
-<div class="outline-text-2" id="text-org80e709f">
339
+<div id="outline-container-orgfe1de94" class="outline-2">
340
+<h2 id="orgfe1de94">Ghost</h2>
341
+<div class="outline-text-2" id="text-orgfe1de94">
342
 <p>
342
 <p>
343
 Modern looking blogging system.
343
 Modern looking blogging system.
344
 </p>
344
 </p>
348
 </p>
348
 </p>
349
 </div>
349
 </div>
350
 </div>
350
 </div>
351
-<div id="outline-container-orge6cfb69" class="outline-2">
352
-<h2 id="orge6cfb69">GNU Social</h2>
353
-<div class="outline-text-2" id="text-orge6cfb69">
351
+<div id="outline-container-orgdd6af7e" class="outline-2">
352
+<h2 id="orgdd6af7e">GNU Social</h2>
353
+<div class="outline-text-2" id="text-orgdd6af7e">
354
 <p>
354
 <p>
355
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
355
 Federated social network based on the OStatus protocol. You can "<i>remote follow</i>" other users within the GNU Social federation.
356
 </p>
356
 </p>
360
 </p>
360
 </p>
361
 </div>
361
 </div>
362
 </div>
362
 </div>
363
-<div id="outline-container-org41197ed" class="outline-2">
364
-<h2 id="org41197ed">Gogs</h2>
365
-<div class="outline-text-2" id="text-org41197ed">
363
+<div id="outline-container-org8f2e173" class="outline-2">
364
+<h2 id="org8f2e173">Gogs</h2>
365
+<div class="outline-text-2" id="text-org8f2e173">
366
 <p>
366
 <p>
367
 Lightweight git project hosting system. You can mirror projects from Github, or if Github turns evil then just host your own projects while retaining the familiar <i>fork-and-pull</i> workflow. If you can use Github then you can also use Gogs.
367
 Lightweight git project hosting system. You can mirror projects from Github, or if Github turns evil then just host your own projects while retaining the familiar <i>fork-and-pull</i> workflow. If you can use Github then you can also use Gogs.
368
 </p>
368
 </p>
372
 </p>
372
 </p>
373
 </div>
373
 </div>
374
 </div>
374
 </div>
375
-<div id="outline-container-orgca785f7" class="outline-2">
376
-<h2 id="orgca785f7">HTMLy</h2>
377
-<div class="outline-text-2" id="text-orgca785f7">
375
+<div id="outline-container-org8fd1e52" class="outline-2">
376
+<h2 id="org8fd1e52">HTMLy</h2>
377
+<div class="outline-text-2" id="text-org8fd1e52">
378
 <p>
378
 <p>
379
 Databaseless blogging system. Quite simple and with a markdown-like format.
379
 Databaseless blogging system. Quite simple and with a markdown-like format.
380
 </p>
380
 </p>
384
 </p>
384
 </p>
385
 </div>
385
 </div>
386
 </div>
386
 </div>
387
-<div id="outline-container-org86037c8" class="outline-2">
388
-<h2 id="org86037c8">Hubzilla</h2>
389
-<div class="outline-text-2" id="text-org86037c8">
387
+<div id="outline-container-org70040fe" class="outline-2">
388
+<h2 id="org70040fe">Hubzilla</h2>
389
+<div class="outline-text-2" id="text-org70040fe">
390
 <p>
390
 <p>
391
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
391
 Web publishing platform with social network like features and good privacy controls so that it's possible to specify who can see which content. Includes photo albums, calendar, wiki and file storage.
392
 </p>
392
 </p>
396
 </p>
396
 </p>
397
 </div>
397
 </div>
398
 </div>
398
 </div>
399
-<div id="outline-container-org8a61ba6" class="outline-2">
400
-<h2 id="org8a61ba6">IRC Server (ngirc)</h2>
401
-<div class="outline-text-2" id="text-org8a61ba6">
399
+<div id="outline-container-org64ccd5e" class="outline-2">
400
+<h2 id="org64ccd5e">Icecast media stream</h2>
401
+<div class="outline-text-2" id="text-org64ccd5e">
402
+<p>
403
+Make your own internet radio station.
404
+</p>
405
+
406
+<p>
407
+<a href="./app_icecast.html">How to use it</a>
408
+</p>
409
+</div>
410
+</div>
411
+<div id="outline-container-org73319d7" class="outline-2">
412
+<h2 id="org73319d7">IRC Server (ngirc)</h2>
413
+<div class="outline-text-2" id="text-org73319d7">
402
 <p>
414
 <p>
403
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
415
 Run your own IRC chat channel which can be secured with a password and accessible via an onion address. A bouncer is included so that you can receive messages sent while you were offline. Works with Hexchat and other popular clients.
404
 </p>
416
 </p>
408
 </p>
420
 </p>
409
 </div>
421
 </div>
410
 </div>
422
 </div>
411
-<div id="outline-container-org5fb058b" class="outline-2">
412
-<h2 id="org5fb058b">Jitsi Meet</h2>
413
-<div class="outline-text-2" id="text-org5fb058b">
423
+<div id="outline-container-orgd03beb7" class="outline-2">
424
+<h2 id="orgd03beb7">Jitsi Meet</h2>
425
+<div class="outline-text-2" id="text-orgd03beb7">
414
 <p>
426
 <p>
415
 Experimental WebRTC video conferencing system, similar to Google Hangouts. This may not be fully functional, but is hoped to be in the near future.
427
 Experimental WebRTC video conferencing system, similar to Google Hangouts. This may not be fully functional, but is hoped to be in the near future.
416
 </p>
428
 </p>
417
 </div>
429
 </div>
418
 </div>
430
 </div>
419
 
431
 
420
-<div id="outline-container-org34dd27a" class="outline-2">
421
-<h2 id="org34dd27a">KanBoard</h2>
422
-<div class="outline-text-2" id="text-org34dd27a">
432
+<div id="outline-container-org4b6a6a3" class="outline-2">
433
+<h2 id="org4b6a6a3">KanBoard</h2>
434
+<div class="outline-text-2" id="text-org4b6a6a3">
423
 <p>
435
 <p>
424
 A simple kanban system for managing projects or TODO lists.
436
 A simple kanban system for managing projects or TODO lists.
425
 </p>
437
 </p>
429
 </p>
441
 </p>
430
 </div>
442
 </div>
431
 </div>
443
 </div>
432
-<div id="outline-container-orgd752c61" class="outline-2">
433
-<h2 id="orgd752c61">Key Server</h2>
434
-<div class="outline-text-2" id="text-orgd752c61">
444
+<div id="outline-container-orge157028" class="outline-2">
445
+<h2 id="orge157028">Key Server</h2>
446
+<div class="outline-text-2" id="text-orge157028">
435
 <p>
447
 <p>
436
 An OpenPGP key server for storing and retrieving GPG public keys.
448
 An OpenPGP key server for storing and retrieving GPG public keys.
437
 </p>
449
 </p>
441
 </p>
453
 </p>
442
 </div>
454
 </div>
443
 </div>
455
 </div>
444
-<div id="outline-container-orgd209174" class="outline-2">
445
-<h2 id="orgd209174">Koel</h2>
446
-<div class="outline-text-2" id="text-orgd209174">
456
+<div id="outline-container-org090bd37" class="outline-2">
457
+<h2 id="org090bd37">Koel</h2>
458
+<div class="outline-text-2" id="text-org090bd37">
447
 <p>
459
 <p>
448
 Access your music collection from any internet connected device.
460
 Access your music collection from any internet connected device.
449
 </p>
461
 </p>
453
 </p>
465
 </p>
454
 </div>
466
 </div>
455
 </div>
467
 </div>
456
-<div id="outline-container-orgfa62348" class="outline-2">
457
-<h2 id="orgfa62348">Lychee</h2>
458
-<div class="outline-text-2" id="text-orgfa62348">
468
+<div id="outline-container-org1c5934b" class="outline-2">
469
+<h2 id="org1c5934b">Lychee</h2>
470
+<div class="outline-text-2" id="text-org1c5934b">
459
 <p>
471
 <p>
460
 Make your photo albums available on the web.
472
 Make your photo albums available on the web.
461
 </p>
473
 </p>
465
 </p>
477
 </p>
466
 </div>
478
 </div>
467
 </div>
479
 </div>
468
-<div id="outline-container-org05fc470" class="outline-2">
469
-<h2 id="org05fc470">Mailpile</h2>
470
-<div class="outline-text-2" id="text-org05fc470">
480
+<div id="outline-container-org3cf360f" class="outline-2">
481
+<h2 id="org3cf360f">Mailpile</h2>
482
+<div class="outline-text-2" id="text-org3cf360f">
471
 <p>
483
 <p>
472
 Modern email client which supports GPG encryption.
484
 Modern email client which supports GPG encryption.
473
 </p>
485
 </p>
477
 </p>
489
 </p>
478
 </div>
490
 </div>
479
 </div>
491
 </div>
480
-<div id="outline-container-orga3887ed" class="outline-2">
481
-<h2 id="orga3887ed">Matrix</h2>
482
-<div class="outline-text-2" id="text-orga3887ed">
492
+<div id="outline-container-org62684b4" class="outline-2">
493
+<h2 id="org62684b4">Matrix</h2>
494
+<div class="outline-text-2" id="text-org62684b4">
483
 <p>
495
 <p>
484
 Multi-user chat with some security and moderation controls.
496
 Multi-user chat with some security and moderation controls.
485
 </p>
497
 </p>
489
 </p>
501
 </p>
490
 </div>
502
 </div>
491
 </div>
503
 </div>
492
-<div id="outline-container-org98a5590" class="outline-2">
493
-<h2 id="org98a5590">Mediagoblin</h2>
494
-<div class="outline-text-2" id="text-org98a5590">
504
+<div id="outline-container-org67c8d9c" class="outline-2">
505
+<h2 id="org67c8d9c">Mediagoblin</h2>
506
+<div class="outline-text-2" id="text-org67c8d9c">
495
 <p>
507
 <p>
496
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
508
 Publicly host video and audio files so that you don't need to use YouTube/Vimeo/etc.
497
 </p>
509
 </p>
501
 </p>
513
 </p>
502
 </div>
514
 </div>
503
 </div>
515
 </div>
504
-<div id="outline-container-orgf91b078" class="outline-2">
505
-<h2 id="orgf91b078">Mumble</h2>
506
-<div class="outline-text-2" id="text-orgf91b078">
516
+<div id="outline-container-org35f9d59" class="outline-2">
517
+<h2 id="org35f9d59">Mumble</h2>
518
+<div class="outline-text-2" id="text-org35f9d59">
507
 <p>
519
 <p>
508
 The popular VoIP and text chat system. Say goodbye to old-fashioned telephony conferences with silly dial codes. Also works well on mobile.
520
 The popular VoIP and text chat system. Say goodbye to old-fashioned telephony conferences with silly dial codes. Also works well on mobile.
509
 </p>
521
 </p>
513
 </p>
525
 </p>
514
 </div>
526
 </div>
515
 </div>
527
 </div>
516
-<div id="outline-container-orga31496f" class="outline-2">
517
-<h2 id="orga31496f">NextCloud</h2>
518
-<div class="outline-text-2" id="text-orga31496f">
528
+<div id="outline-container-org4e83692" class="outline-2">
529
+<h2 id="org4e83692">NextCloud</h2>
530
+<div class="outline-text-2" id="text-org4e83692">
519
 <p>
531
 <p>
520
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
532
 Store files on your server and sync them with laptops or mobile devices. Includes many plugins including videoconferencing and collaborative document editing.
521
 </p>
533
 </p>
525
 </p>
537
 </p>
526
 </div>
538
 </div>
527
 </div>
539
 </div>
528
-<div id="outline-container-org4565812" class="outline-2">
529
-<h2 id="org4565812">PI-Hole</h2>
530
-<div class="outline-text-2" id="text-org4565812">
540
+<div id="outline-container-org38f233d" class="outline-2">
541
+<h2 id="org38f233d">PI-Hole</h2>
542
+<div class="outline-text-2" id="text-org38f233d">
531
 <p>
543
 <p>
532
 The black hole for web adverts. Block adverts at the domain name level within your local network. It can significantly reduce bandwidth, speed up page load times and protect your systems from being tracked by spyware.
544
 The black hole for web adverts. Block adverts at the domain name level within your local network. It can significantly reduce bandwidth, speed up page load times and protect your systems from being tracked by spyware.
533
 </p>
545
 </p>
537
 </p>
549
 </p>
538
 </div>
550
 </div>
539
 </div>
551
 </div>
540
-<div id="outline-container-orgdb572b6" class="outline-2">
541
-<h2 id="orgdb572b6">Pleroma</h2>
542
-<div class="outline-text-2" id="text-orgdb572b6">
552
+<div id="outline-container-orgc0768d8" class="outline-2">
553
+<h2 id="orgc0768d8">Pleroma</h2>
554
+<div class="outline-text-2" id="text-orgc0768d8">
543
 <p>
555
 <p>
544
 Pleroma is an OStatus-compatible social networking server, compatible with GNU Social, PostActiv and Mastodon. It is high-performance and so is especially well suited for running on low power single board computers without much RAM.
556
 Pleroma is an OStatus-compatible social networking server, compatible with GNU Social, PostActiv and Mastodon. It is high-performance and so is especially well suited for running on low power single board computers without much RAM.
545
 </p>
557
 </p>
549
 </p>
561
 </p>
550
 </div>
562
 </div>
551
 </div>
563
 </div>
552
-<div id="outline-container-org5d51ff5" class="outline-2">
553
-<h2 id="org5d51ff5">PostActiv</h2>
554
-<div class="outline-text-2" id="text-org5d51ff5">
564
+<div id="outline-container-orgb849d85" class="outline-2">
565
+<h2 id="orgb849d85">PostActiv</h2>
566
+<div class="outline-text-2" id="text-orgb849d85">
555
 <p>
567
 <p>
556
 An alternative federated social networking system compatible with GNU Social, Pleroma and Mastodon. It includes some optimisations and fixes currently not available within the main GNU Social project.
568
 An alternative federated social networking system compatible with GNU Social, Pleroma and Mastodon. It includes some optimisations and fixes currently not available within the main GNU Social project.
557
 </p>
569
 </p>
561
 </p>
573
 </p>
562
 </div>
574
 </div>
563
 </div>
575
 </div>
564
-<div id="outline-container-org6e223d1" class="outline-2">
565
-<h2 id="org6e223d1">Profanity</h2>
566
-<div class="outline-text-2" id="text-org6e223d1">
576
+<div id="outline-container-org1eccd38" class="outline-2">
577
+<h2 id="org1eccd38">Profanity</h2>
578
+<div class="outline-text-2" id="text-org1eccd38">
567
 <p>
579
 <p>
568
 A shell based XMPP client which you can run on the Freedombone server via ssh.
580
 A shell based XMPP client which you can run on the Freedombone server via ssh.
569
 </p>
581
 </p>
573
 </p>
585
 </p>
574
 </div>
586
 </div>
575
 </div>
587
 </div>
576
-<div id="outline-container-orga15f077" class="outline-2">
577
-<h2 id="orga15f077">Riot Web</h2>
578
-<div class="outline-text-2" id="text-orga15f077">
588
+<div id="outline-container-org7ba8023" class="outline-2">
589
+<h2 id="org7ba8023">Riot Web</h2>
590
+<div class="outline-text-2" id="text-org7ba8023">
579
 <p>
591
 <p>
580
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
592
 A browser based user interface for the Matrix federated communications system, including WebRTC audio and video chat.
581
 </p>
593
 </p>
585
 </p>
597
 </p>
586
 </div>
598
 </div>
587
 </div>
599
 </div>
588
-<div id="outline-container-org1d66f8e" class="outline-2">
589
-<h2 id="org1d66f8e">SearX</h2>
590
-<div class="outline-text-2" id="text-org1d66f8e">
600
+<div id="outline-container-orge5ba7bf" class="outline-2">
601
+<h2 id="orge5ba7bf">SearX</h2>
602
+<div class="outline-text-2" id="text-orge5ba7bf">
591
 <p>
603
 <p>
592
 A metasearch engine for customised and private web searches.
604
 A metasearch engine for customised and private web searches.
593
 </p>
605
 </p>
597
 </p>
609
 </p>
598
 </div>
610
 </div>
599
 </div>
611
 </div>
600
-<div id="outline-container-org255b78b" class="outline-2">
601
-<h2 id="org255b78b">tt-rss</h2>
602
-<div class="outline-text-2" id="text-org255b78b">
612
+<div id="outline-container-org1ddca20" class="outline-2">
613
+<h2 id="org1ddca20">tt-rss</h2>
614
+<div class="outline-text-2" id="text-org1ddca20">
603
 <p>
615
 <p>
604
 Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "<i>the right to read</i>" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
616
 Private RSS reader. Pulls in RSS/Atom feeds via Tor and is only accessible via an onion address. Have "<i>the right to read</i>" without the Surveillance State knowing what you're reading. Also available with a user interface suitable for viewing on mobile devices via a browser such as OrFox.
605
 </p>
617
 </p>
609
 </p>
621
 </p>
610
 </div>
622
 </div>
611
 </div>
623
 </div>
612
-<div id="outline-container-orgf2f850c" class="outline-2">
613
-<h2 id="orgf2f850c">Syncthing</h2>
614
-<div class="outline-text-2" id="text-orgf2f850c">
624
+<div id="outline-container-org2602a28" class="outline-2">
625
+<h2 id="org2602a28">Syncthing</h2>
626
+<div class="outline-text-2" id="text-org2602a28">
615
 <p>
627
 <p>
616
 Possibly the best way to synchronise files across all of your devices. Once it has been set up it "just works" with no user intervention needed.
628
 Possibly the best way to synchronise files across all of your devices. Once it has been set up it "just works" with no user intervention needed.
617
 </p>
629
 </p>
621
 </p>
633
 </p>
622
 </div>
634
 </div>
623
 </div>
635
 </div>
624
-<div id="outline-container-org05328a6" class="outline-2">
625
-<h2 id="org05328a6">Tahoe-LAFS</h2>
626
-<div class="outline-text-2" id="text-org05328a6">
636
+<div id="outline-container-org80ed846" class="outline-2">
637
+<h2 id="org80ed846">Tahoe-LAFS</h2>
638
+<div class="outline-text-2" id="text-org80ed846">
627
 <p>
639
 <p>
628
 Robust and encrypted storage of files on one or more server.
640
 Robust and encrypted storage of files on one or more server.
629
 </p>
641
 </p>
633
 </p>
645
 </p>
634
 </div>
646
 </div>
635
 </div>
647
 </div>
636
-<div id="outline-container-orgf736869" class="outline-2">
637
-<h2 id="orgf736869">Tox</h2>
638
-<div class="outline-text-2" id="text-orgf736869">
648
+<div id="outline-container-orgdc397e9" class="outline-2">
649
+<h2 id="orgdc397e9">Tox</h2>
650
+<div class="outline-text-2" id="text-orgdc397e9">
639
 <p>
651
 <p>
640
 Client and bootstrap node for the Tox chat/VoIP system.
652
 Client and bootstrap node for the Tox chat/VoIP system.
641
 </p>
653
 </p>
645
 </p>
657
 </p>
646
 </div>
658
 </div>
647
 </div>
659
 </div>
648
-<div id="outline-container-orga2e1cdb" class="outline-2">
649
-<h2 id="orga2e1cdb">Turtl</h2>
650
-<div class="outline-text-2" id="text-orga2e1cdb">
660
+<div id="outline-container-org588d32f" class="outline-2">
661
+<h2 id="org588d32f">Turtl</h2>
662
+<div class="outline-text-2" id="text-org588d32f">
651
 <p>
663
 <p>
652
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
664
 A system for privately creating and sharing notes and images, similar to Evernote but without the spying.
653
 </p>
665
 </p>
657
 </p>
669
 </p>
658
 </div>
670
 </div>
659
 </div>
671
 </div>
660
-<div id="outline-container-org0fd91b2" class="outline-2">
661
-<h2 id="org0fd91b2">Vim</h2>
662
-<div class="outline-text-2" id="text-org0fd91b2">
672
+<div id="outline-container-org248d732" class="outline-2">
673
+<h2 id="org248d732">Vim</h2>
674
+<div class="outline-text-2" id="text-org248d732">
663
 <p>
675
 <p>
664
 If you use the Mutt client to read your email then this will set it up to use vim for composing new mail.
676
 If you use the Mutt client to read your email then this will set it up to use vim for composing new mail.
665
 </p>
677
 </p>
666
 </div>
678
 </div>
667
 </div>
679
 </div>
668
 
680
 
669
-<div id="outline-container-org378fc24" class="outline-2">
670
-<h2 id="org378fc24">Virtual Private Network (VPN)</h2>
671
-<div class="outline-text-2" id="text-org378fc24">
681
+<div id="outline-container-org880e1f3" class="outline-2">
682
+<h2 id="org880e1f3">Virtual Private Network (VPN)</h2>
683
+<div class="outline-text-2" id="text-org880e1f3">
672
 <p>
684
 <p>
673
 Set up a VPN on your server so that you can bypass local internet censorship.
685
 Set up a VPN on your server so that you can bypass local internet censorship.
674
 </p>
686
 </p>
678
 </p>
690
 </p>
679
 </div>
691
 </div>
680
 </div>
692
 </div>
681
-<div id="outline-container-orgf7ad415" class="outline-2">
682
-<h2 id="orgf7ad415">XMPP</h2>
683
-<div class="outline-text-2" id="text-orgf7ad415">
693
+<div id="outline-container-org3697e9f" class="outline-2">
694
+<h2 id="org3697e9f">XMPP</h2>
695
+<div class="outline-text-2" id="text-org3697e9f">
684
 <p>
696
 <p>
685
 Chat server which can be used together with client such as Gajim or Conversations to provide end-to-end content security and also onion routed metadata security. Includes advanced features such as <i>client state notification</i> to save battery power on your mobile devices, support for seamless roaming between networks and <i>message carbons</i> so that you can receive the same messages while being simultaneously logged in to your account on more than one device.
697
 Chat server which can be used together with client such as Gajim or Conversations to provide end-to-end content security and also onion routed metadata security. Includes advanced features such as <i>client state notification</i> to save battery power on your mobile devices, support for seamless roaming between networks and <i>message carbons</i> so that you can receive the same messages while being simultaneously logged in to your account on more than one device.
686
 </p>
698
 </p>

+ 1
- 1
website/EN/meshindex.html Ver fichero

3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
 <head>
5
 <head>
6
-<!-- 2017-11-24 Fri 16:00 -->
6
+<!-- 2017-11-24 Fri 18:14 -->
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
9
 <title>&lrm;</title>
9
 <title>&lrm;</title>