Kaynağa Gözat

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

Bob Mottram 6 yıl önce
ebeveyn
işleme
253c85d0a7
78 değiştirilmiş dosya ile 510 ekleme ve 198 silme
  1. 2
    0
      Makefile
  2. 0
    2
      doc/EN/app_dlna.org
  3. BIN
      img/android-app/akaunting.png
  4. BIN
      img/android-app/bludit.png
  5. BIN
      img/android-app/dlna.png
  6. BIN
      img/android-app/dokuwiki.png
  7. BIN
      img/android-app/edith.png
  8. BIN
      img/android-app/etherpad.png
  9. BIN
      img/android-app/fedwiki.png
  10. BIN
      img/android-app/friendica.png
  11. BIN
      img/android-app/gnusocial.png
  12. BIN
      img/android-app/gogs.png
  13. BIN
      img/android-app/htmly.png
  14. BIN
      img/android-app/hubzilla.png
  15. BIN
      img/android-app/irc.png
  16. BIN
      img/android-app/kanboard.png
  17. BIN
      img/android-app/koel.png
  18. BIN
      img/android-app/lychee.png
  19. BIN
      img/android-app/mailpile.png
  20. BIN
      img/android-app/matrix.png
  21. BIN
      img/android-app/mediagoblin.png
  22. BIN
      img/android-app/movim.png
  23. BIN
      img/android-app/mumble.png
  24. BIN
      img/android-app/nextcloud.png
  25. BIN
      img/android-app/peertube.png
  26. BIN
      img/android-app/pleroma.png
  27. BIN
      img/android-app/postactiv.png
  28. BIN
      img/android-app/privatebin.png
  29. BIN
      img/android-app/rocketchat.png
  30. BIN
      img/android-app/searx.png
  31. BIN
      img/android-app/syncthing.png
  32. BIN
      img/android-app/tahoelafs.png
  33. BIN
      img/android-app/turtl.png
  34. BIN
      img/android-app/xmpp.png
  35. 1
    0
      src/freedombone-addremove
  36. 4
    0
      src/freedombone-app-akaunting
  37. 4
    0
      src/freedombone-app-bludit
  38. 4
    0
      src/freedombone-app-dlna
  39. 4
    0
      src/freedombone-app-dokuwiki
  40. 4
    0
      src/freedombone-app-edith
  41. 4
    0
      src/freedombone-app-etherpad
  42. 4
    0
      src/freedombone-app-fedwiki
  43. 4
    0
      src/freedombone-app-friendica
  44. 4
    0
      src/freedombone-app-gnusocial
  45. 58
    55
      src/freedombone-app-gogs
  46. 4
    0
      src/freedombone-app-htmly
  47. 4
    0
      src/freedombone-app-hubzilla
  48. 4
    0
      src/freedombone-app-icecast
  49. 4
    0
      src/freedombone-app-irc
  50. 4
    0
      src/freedombone-app-jitsi
  51. 3
    0
      src/freedombone-app-kanboard
  52. 4
    0
      src/freedombone-app-koel
  53. 4
    0
      src/freedombone-app-lychee
  54. 4
    0
      src/freedombone-app-mailpile
  55. 4
    0
      src/freedombone-app-matrix
  56. 5
    1
      src/freedombone-app-mediagoblin
  57. 4
    0
      src/freedombone-app-movim
  58. 4
    0
      src/freedombone-app-mumble
  59. 4
    0
      src/freedombone-app-nextcloud
  60. 4
    0
      src/freedombone-app-peertube
  61. 4
    0
      src/freedombone-app-pleroma
  62. 4
    0
      src/freedombone-app-postactiv
  63. 4
    0
      src/freedombone-app-privatebin
  64. 4
    0
      src/freedombone-app-rocketchat
  65. 4
    0
      src/freedombone-app-syncthing
  66. 4
    0
      src/freedombone-app-turtl
  67. 4
    0
      src/freedombone-app-xmpp
  68. 2
    2
      src/freedombone-config
  69. 4
    0
      src/freedombone-syncthing
  70. 5
    0
      src/freedombone-template
  71. 8
    0
      src/freedombone-upgrade
  72. 167
    0
      src/freedombone-utils-android
  73. 28
    1
      src/freedombone-utils-avahi
  74. 2
    2
      src/freedombone-utils-onion
  75. 1
    1
      src/freedombone-utils-selector
  76. 3
    0
      src/freedombone-utils-setup
  77. 72
    7
      src/freedombone-utils-web
  78. 33
    127
      website/EN/app_dlna.html

+ 2
- 0
Makefile Dosyayı Görüntüle

20
 	mkdir -p ${DESTDIR}${PREFIX}/bin
20
 	mkdir -p ${DESTDIR}${PREFIX}/bin
21
 	mkdir -p ${DESTDIR}/usr/share/${APP}/base
21
 	mkdir -p ${DESTDIR}/usr/share/${APP}/base
22
 	mkdir -p ${DESTDIR}/usr/share/${APP}/apps
22
 	mkdir -p ${DESTDIR}/usr/share/${APP}/apps
23
+	mkdir -p ${DESTDIR}/usr/share/${APP}/android-app
23
 	mkdir -p ${DESTDIR}/usr/share/${APP}/utils
24
 	mkdir -p ${DESTDIR}/usr/share/${APP}/utils
24
 	mkdir -p ${DESTDIR}/usr/share/${APP}/avatars
25
 	mkdir -p ${DESTDIR}/usr/share/${APP}/avatars
25
 	mkdir -p ${DESTDIR}/etc/${APP}
26
 	mkdir -p ${DESTDIR}/etc/${APP}
46
 	cp man/*.1.gz ${DESTDIR}${PREFIX}/share/man/man1
47
 	cp man/*.1.gz ${DESTDIR}${PREFIX}/share/man/man1
47
 	cp man/${APP}-backup-local.1.gz ${DESTDIR}${PREFIX}/share/man/man1/backup.1.gz
48
 	cp man/${APP}-backup-local.1.gz ${DESTDIR}${PREFIX}/share/man/man1/backup.1.gz
48
 	cp man/${APP}-restore-local.1.gz ${DESTDIR}${PREFIX}/share/man/man1/restore.1.gz
49
 	cp man/${APP}-restore-local.1.gz ${DESTDIR}${PREFIX}/share/man/man1/restore.1.gz
50
+	cp img/android-app/*.png ${DESTDIR}/usr/share/${APP}/android-app
49
 	chown -R root: /usr/share/${APP}
51
 	chown -R root: /usr/share/${APP}
50
 	chmod -R +r /usr/share/${APP}
52
 	chmod -R +r /usr/share/${APP}
51
 #	bash -c "./translate install"
53
 #	bash -c "./translate install"

+ 0
- 2
doc/EN/app_dlna.org Dosyayı Görüntüle

23
 
23
 
24
 The system will scan the /Music/ directory, which could take a while if there are thousands of files, but you don't need to do anything further other than perhaps to log out by selecting *Exit* a couple of times.
24
 The system will scan the /Music/ directory, which could take a while if there are thousands of files, but you don't need to do anything further other than perhaps to log out by selecting *Exit* a couple of times.
25
 
25
 
26
-If you have an Android device then go to F-Droid (if you don't already have it installed then it can be [[https://f-droid.org/][downloaded here]]) and search for *ControlDLNA*. On running the app you should see a red Debian icon which you can press on, then you may need to select "local". After a few seconds the list of albums or tracks should then appear and you can browse and play them.
27
-
28
 The DLNA service will only work within your local home network, and isn't remotely accessible from other locations via the internet. That can be both a good and a bad thing. Another consideration is that there are /no access controls/ on DLNA services, so any music or videos on the USB drive will be playable by anyone within your home network.
26
 The DLNA service will only work within your local home network, and isn't remotely accessible from other locations via the internet. That can be both a good and a bad thing. Another consideration is that there are /no access controls/ on DLNA services, so any music or videos on the USB drive will be playable by anyone within your home network.

BIN
img/android-app/akaunting.png Dosyayı Görüntüle


BIN
img/android-app/bludit.png Dosyayı Görüntüle


BIN
img/android-app/dlna.png Dosyayı Görüntüle


BIN
img/android-app/dokuwiki.png Dosyayı Görüntüle


BIN
img/android-app/edith.png Dosyayı Görüntüle


BIN
img/android-app/etherpad.png Dosyayı Görüntüle


BIN
img/android-app/fedwiki.png Dosyayı Görüntüle


BIN
img/android-app/friendica.png Dosyayı Görüntüle


BIN
img/android-app/gnusocial.png Dosyayı Görüntüle


BIN
img/android-app/gogs.png Dosyayı Görüntüle


BIN
img/android-app/htmly.png Dosyayı Görüntüle


BIN
img/android-app/hubzilla.png Dosyayı Görüntüle


BIN
img/android-app/irc.png Dosyayı Görüntüle


BIN
img/android-app/kanboard.png Dosyayı Görüntüle


BIN
img/android-app/koel.png Dosyayı Görüntüle


BIN
img/android-app/lychee.png Dosyayı Görüntüle


BIN
img/android-app/mailpile.png Dosyayı Görüntüle


BIN
img/android-app/matrix.png Dosyayı Görüntüle


BIN
img/android-app/mediagoblin.png Dosyayı Görüntüle


BIN
img/android-app/movim.png Dosyayı Görüntüle


BIN
img/android-app/mumble.png Dosyayı Görüntüle


BIN
img/android-app/nextcloud.png Dosyayı Görüntüle


BIN
img/android-app/peertube.png Dosyayı Görüntüle


BIN
img/android-app/pleroma.png Dosyayı Görüntüle


BIN
img/android-app/postactiv.png Dosyayı Görüntüle


BIN
img/android-app/privatebin.png Dosyayı Görüntüle


BIN
img/android-app/rocketchat.png Dosyayı Görüntüle


BIN
img/android-app/searx.png Dosyayı Görüntüle


BIN
img/android-app/syncthing.png Dosyayı Görüntüle


BIN
img/android-app/tahoelafs.png Dosyayı Görüntüle


BIN
img/android-app/turtl.png Dosyayı Görüntüle


BIN
img/android-app/xmpp.png Dosyayı Görüntüle


+ 1
- 0
src/freedombone-addremove Dosyayı Görüntüle

267
 else
267
 else
268
     install_apps_selected
268
     install_apps_selected
269
 fi
269
 fi
270
+android_update_apps
270
 
271
 
271
 exit 0
272
 exit 0

+ 4
- 0
src/freedombone-app-akaunting Dosyayı Görüntüle

40
 
40
 
41
 AKAUNTING_BACKGROUND_IMAGE_URL=
41
 AKAUNTING_BACKGROUND_IMAGE_URL=
42
 
42
 
43
+AKAUNTING_SHORT_DESCRIPTION=$'Personal accounting'
44
+AKAUNTING_DESCRIPTION=$'Personal or small business accounting'
45
+AKAUNTING_MOBILE_APP_URL=
46
+
43
 akaunting_variables=(ONION_ONLY
47
 akaunting_variables=(ONION_ONLY
44
                      AKAUNTING_DOMAIN_NAME
48
                      AKAUNTING_DOMAIN_NAME
45
                      AKAUNTING_CODE
49
                      AKAUNTING_CODE

+ 4
- 0
src/freedombone-app-bludit Dosyayı Görüntüle

35
 BLUDIT_REPO="https://github.com/bludit/bludit"
35
 BLUDIT_REPO="https://github.com/bludit/bludit"
36
 BLUDIT_COMMIT='0e27e31a84421b3e6bd000a77bc89c2dff3c446a'
36
 BLUDIT_COMMIT='0e27e31a84421b3e6bd000a77bc89c2dff3c446a'
37
 
37
 
38
+BLUDIT_SHORT_DESCRIPTION=$'Bludit Blog'
39
+BLUDIT_DESCRIPTION=$'Simple Markdown blogging'
40
+BLUDIT_MOBILE_APP_URL=
41
+
38
 bludit_variables=(ONION_ONLY
42
 bludit_variables=(ONION_ONLY
39
                   BLUDIT_DOMAIN_NAME
43
                   BLUDIT_DOMAIN_NAME
40
                   BLUDIT_CODE
44
                   BLUDIT_CODE

+ 4
- 0
src/freedombone-app-dlna Dosyayı Görüntüle

31
 IN_DEFAULT_INSTALL=0
31
 IN_DEFAULT_INSTALL=0
32
 SHOW_ON_ABOUT=0
32
 SHOW_ON_ABOUT=0
33
 
33
 
34
+DLNA_SHORT_DESCRIPTION=$'DLNA media'
35
+DLNA_DESCRIPTION=$'DLNA media'
36
+DLNA_MOBILE_APP_URL=
37
+
34
 dlna_variables=(SYSTEM_TYPE
38
 dlna_variables=(SYSTEM_TYPE
35
                 USB_MOUNT_DLNA
39
                 USB_MOUNT_DLNA
36
                 INSTALLED_WITHIN_DOCKER
40
                 INSTALLED_WITHIN_DOCKER

+ 4
- 0
src/freedombone-app-dokuwiki Dosyayı Görüntüle

40
 DOKUWIKI_REPO="https://github.com/splitbrain/dokuwiki"
40
 DOKUWIKI_REPO="https://github.com/splitbrain/dokuwiki"
41
 DOKUWIKI_COMMIT='be15c01c0b982cf1a75b5af031bf077143c63f39'
41
 DOKUWIKI_COMMIT='be15c01c0b982cf1a75b5af031bf077143c63f39'
42
 
42
 
43
+DOKUWIKI_SHORT_DESCRIPTION=$'Dokuwiki'
44
+DOKUWIKI_DESCRIPTION=$'Dokuwiki databaseless wiki'
45
+DOKUWIKI_MOBILE_APP_URL=
46
+
43
 dokuwiki_variables=(ONION_ONLY
47
 dokuwiki_variables=(ONION_ONLY
44
                     MY_USERNAME
48
                     MY_USERNAME
45
                     DOKUWIKI_TITLE
49
                     DOKUWIKI_TITLE

+ 4
- 0
src/freedombone-app-edith Dosyayı Görüntüle

38
 EDITH_ONION_PORT=8278
38
 EDITH_ONION_PORT=8278
39
 EDITH_LOGIN_TEXT=$"Edith login"
39
 EDITH_LOGIN_TEXT=$"Edith login"
40
 
40
 
41
+EDITH_SHORT_DESCRIPTION=$'Edith Notes'
42
+EDITH_DESCRIPTION=$'Extremely simple note taking'
43
+EDITH_MOBILE_APP_URL=
44
+
41
 edith_variables=(MY_USERNAME
45
 edith_variables=(MY_USERNAME
42
                  MY_EMAIL_ADDRESS
46
                  MY_EMAIL_ADDRESS
43
                  ONION_ONLY
47
                  ONION_ONLY

+ 4
- 0
src/freedombone-app-etherpad Dosyayı Görüntüle

42
 ETHERPAD_TITLE=$'Freedombone Docs'
42
 ETHERPAD_TITLE=$'Freedombone Docs'
43
 ETHERPAD_WELCOME_MESSAGE=$"Welcome to ${ETHERPAD_TITLE}!\\n\\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!"
43
 ETHERPAD_WELCOME_MESSAGE=$"Welcome to ${ETHERPAD_TITLE}!\\n\\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!"
44
 
44
 
45
+ETHERPAD_SHORT_DESCRIPTION=$'Etherpad'
46
+ETHERPAD_DESCRIPTION=$'Etherpad'
47
+ETHERPAD_MOBILE_APP_URL=
48
+
45
 etherpad_variables=(ONION_ONLY
49
 etherpad_variables=(ONION_ONLY
46
                     DEFAULT_DOMAIN_NAME
50
                     DEFAULT_DOMAIN_NAME
47
                     ETHERPAD_DOMAIN_NAME
51
                     ETHERPAD_DOMAIN_NAME

+ 4
- 0
src/freedombone-app-fedwiki Dosyayı Görüntüle

42
 FEDWIKI_DATA=/var/lib/fedwiki
42
 FEDWIKI_DATA=/var/lib/fedwiki
43
 FEDWIKI_COOKIE=
43
 FEDWIKI_COOKIE=
44
 
44
 
45
+FEDWIKI_SHORT_DESCRIPTION=$'FedWiki'
46
+FEDWIKI_DESCRIPTION=$'Federated Wiki'
47
+FEDWIKI_MOBILE_APP_URL=
48
+
45
 fedwiki_variables=(FEDWIKI_DOMAIN_NAME
49
 fedwiki_variables=(FEDWIKI_DOMAIN_NAME
46
                    FEDWIKI_CODE
50
                    FEDWIKI_CODE
47
                    FEDWIKI_COOKIE
51
                    FEDWIKI_COOKIE

+ 4
- 0
src/freedombone-app-friendica Dosyayı Görüntüle

40
 FRIENDICA_COMMIT='b5a42c5b31fae5315bacd37769eba20ab2345aaa'
40
 FRIENDICA_COMMIT='b5a42c5b31fae5315bacd37769eba20ab2345aaa'
41
 FRIENDICA_ADDONS_COMMIT='7cb9dbdda7f227462895c07be3c968405561d40e'
41
 FRIENDICA_ADDONS_COMMIT='7cb9dbdda7f227462895c07be3c968405561d40e'
42
 
42
 
43
+FRIENDICA_SHORT_DESCRIPTION=$'Friendica'
44
+FRIENDICA_DESCRIPTION=$'Friendica federated social network'
45
+FRIENDICA_MOBILE_APP_URL=
46
+
43
 friendica_variables=(ONION_ONLY
47
 friendica_variables=(ONION_ONLY
44
                      FRIENDICA_DOMAIN_NAME
48
                      FRIENDICA_DOMAIN_NAME
45
                      FRIENDICA_CODE
49
                      FRIENDICA_CODE

+ 4
- 0
src/freedombone-app-gnusocial Dosyayı Görüntüle

46
 # Number of months after which posts expire
46
 # Number of months after which posts expire
47
 GNUSOCIAL_EXPIRE_MONTHS=3
47
 GNUSOCIAL_EXPIRE_MONTHS=3
48
 
48
 
49
+GNUSOCIAL_SHORT_DESCRIPTION=$'GNU Social'
50
+GNUSOCIAL_DESCRIPTION=$'GNU Social federated microblogging'
51
+GNUSOCIAL_MOBILE_APP_URL='https://f-droid.org/packages/org.mariotaku.twidere/'
52
+
49
 gnusocial_variables=(ONION_ONLY
53
 gnusocial_variables=(ONION_ONLY
50
                      GNUSOCIAL_DOMAIN_NAME
54
                      GNUSOCIAL_DOMAIN_NAME
51
                      GNUSOCIAL_CODE
55
                      GNUSOCIAL_CODE

+ 58
- 55
src/freedombone-app-gogs Dosyayı Görüntüle

34
 GOGS_USERNAME='gogs'
34
 GOGS_USERNAME='gogs'
35
 GOGS_VERSION='0.11.29'
35
 GOGS_VERSION='0.11.29'
36
 
36
 
37
-GIT_DOMAIN_NAME=
38
-GIT_CODE=
37
+GOGS_DOMAIN_NAME=
38
+GOGS_CODE=
39
 GIT_ONION_PORT=8090
39
 GIT_ONION_PORT=8090
40
 GIT_ADMIN_PASSWORD=
40
 GIT_ADMIN_PASSWORD=
41
 GOGS_BIN=
41
 GOGS_BIN=
42
 GOGS_PORT=3145
42
 GOGS_PORT=3145
43
 
43
 
44
+GOGS_SHORT_DESCRIPTION=$'Gogs'
45
+GOGS_DESCRIPTION=$'Gogs git repo management'
46
+GOGS_MOBILE_APP_URL=
47
+
44
 gogs_variables=(ONION_ONLY
48
 gogs_variables=(ONION_ONLY
45
                 GIT_ADMIN_PASSWORD
49
                 GIT_ADMIN_PASSWORD
46
-                GIT_DOMAIN_NAME
47
-                GIT_CODE
48
-                GIT_ONION_PORT
50
+                GOGS_DOMAIN_NAME
51
+                GOGS_CODE
49
                 MY_USERNAME
52
                 MY_USERNAME
50
                 DDNS_PROVIDER
53
                 DDNS_PROVIDER
51
                 ARCHITECTURE)
54
                 ARCHITECTURE)
65
 
68
 
66
 function install_interactive_gogs {
69
 function install_interactive_gogs {
67
     if [[ $ONION_ONLY != "no" ]]; then
70
     if [[ $ONION_ONLY != "no" ]]; then
68
-        GIT_DOMAIN_NAME='gogs.local'
69
-        write_config_param "GIT_DOMAIN_NAME" "$GIT_DOMAIN_NAME"
71
+        GOGS_DOMAIN_NAME='gogs.local'
72
+        write_config_param "GOGS_DOMAIN_NAME" "$GOGS_DOMAIN_NAME"
70
     else
73
     else
71
         function_check interactive_site_details
74
         function_check interactive_site_details
72
         interactive_site_details git
75
         interactive_site_details git
156
     # Change port number if necessary
159
     # Change port number if necessary
157
     if ! grep -q "HTTP_PORT = ${GOGS_PORT}" "${GOGS_CONFIG_FILE}"; then
160
     if ! grep -q "HTTP_PORT = ${GOGS_PORT}" "${GOGS_CONFIG_FILE}"; then
158
         sed -i "s|HTTP_PORT =.*|HTTP_PORT = ${GOGS_PORT}|g" "${GOGS_CONFIG_FILE}"
161
         sed -i "s|HTTP_PORT =.*|HTTP_PORT = ${GOGS_PORT}|g" "${GOGS_CONFIG_FILE}"
159
-        read_config_param GIT_DOMAIN_NAME
160
-        sed -i "s|proxy_pass .*|proxy_pass http://localhost:${GOGS_PORT};|g" "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
162
+        read_config_param GOGS_DOMAIN_NAME
163
+        sed -i "s|proxy_pass .*|proxy_pass http://localhost:${GOGS_PORT};|g" "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
161
         systemctl restart gogs
164
         systemctl restart gogs
162
         systemctl restart nginx
165
         systemctl restart nginx
163
     fi
166
     fi
268
         return
271
         return
269
     fi
272
     fi
270
 
273
 
271
-    if [ ${#GIT_DOMAIN_NAME} -gt 2 ]; then
274
+    if [ ${#GOGS_DOMAIN_NAME} -gt 2 ]; then
272
         function_check gogs_create_database
275
         function_check gogs_create_database
273
         gogs_create_database
276
         gogs_create_database
274
 
277
 
276
         GOGS_CONFIG_FILE="${GOGS_CONFIG_PATH}/app.ini"
279
         GOGS_CONFIG_FILE="${GOGS_CONFIG_PATH}/app.ini"
277
 
280
 
278
         function_check restore_database
281
         function_check restore_database
279
-        restore_database gogs "${GIT_DOMAIN_NAME}"
282
+        restore_database gogs "${GOGS_DOMAIN_NAME}"
280
         temp_restore_dir=/root/tempgogs
283
         temp_restore_dir=/root/tempgogs
281
         if [ -d "${USB_MOUNT}/backup/gogs" ]; then
284
         if [ -d "${USB_MOUNT}/backup/gogs" ]; then
282
             echo $"Restoring Gogs settings"
285
             echo $"Restoring Gogs settings"
350
 function backup_remote_gogs {
353
 function backup_remote_gogs {
351
     if [ -d /home/$GOGS_USERNAME ]; then
354
     if [ -d /home/$GOGS_USERNAME ]; then
352
         function_check suspend_site
355
         function_check suspend_site
353
-        suspend_site ${GIT_DOMAIN_NAME}
356
+        suspend_site ${GOGS_DOMAIN_NAME}
354
 
357
 
355
         function_check backup_database_to_friend
358
         function_check backup_database_to_friend
356
         backup_database_to_friend gogs
359
         backup_database_to_friend gogs
379
 
382
 
380
 function restore_remote_gogs {
383
 function restore_remote_gogs {
381
     if grep -q "gogs domain" "$COMPLETION_FILE"; then
384
     if grep -q "gogs domain" "$COMPLETION_FILE"; then
382
-        GIT_DOMAIN_NAME=$(get_completion_param "gogs domain")
385
+        GOGS_DOMAIN_NAME=$(get_completion_param "gogs domain")
383
 
386
 
384
         function_check gogs_create_database
387
         function_check gogs_create_database
385
         gogs_create_database
388
         gogs_create_database
388
         GOGS_CONFIG_FILE=${GOGS_CONFIG_PATH}/app.ini
391
         GOGS_CONFIG_FILE=${GOGS_CONFIG_PATH}/app.ini
389
 
392
 
390
         function_check restore_database_from_friend
393
         function_check restore_database_from_friend
391
-        restore_database_from_friend gogs "${GIT_DOMAIN_NAME}"
394
+        restore_database_from_friend gogs "${GOGS_DOMAIN_NAME}"
392
         if [ -d "${SERVER_DIRECTORY}/backup/gogs" ]; then
395
         if [ -d "${SERVER_DIRECTORY}/backup/gogs" ]; then
393
             if [ ! -d $GOGS_CONFIG_PATH ]; then
396
             if [ ! -d $GOGS_CONFIG_PATH ]; then
394
                 mkdir -p $GOGS_CONFIG_PATH
397
                 mkdir -p $GOGS_CONFIG_PATH
445
 }
448
 }
446
 
449
 
447
 function remove_gogs {
450
 function remove_gogs {
448
-    if [ ${#GIT_DOMAIN_NAME} -eq 0 ]; then
451
+    if [ ${#GOGS_DOMAIN_NAME} -eq 0 ]; then
449
         return
452
         return
450
     fi
453
     fi
451
     systemctl stop gogs
454
     systemctl stop gogs
452
     systemctl disable gogs
455
     systemctl disable gogs
453
 
456
 
454
-    nginx_dissite "${GIT_DOMAIN_NAME}"
455
-    remove_certs "${GIT_DOMAIN_NAME}"
456
-    if [ -d "/var/www/${GIT_DOMAIN_NAME}" ]; then
457
-        rm -rf "/var/www/${GIT_DOMAIN_NAME}"
457
+    nginx_dissite "${GOGS_DOMAIN_NAME}"
458
+    remove_certs "${GOGS_DOMAIN_NAME}"
459
+    if [ -d "/var/www/${GOGS_DOMAIN_NAME}" ]; then
460
+        rm -rf "/var/www/${GOGS_DOMAIN_NAME}"
458
     fi
461
     fi
459
-    if [ -f "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}" ]; then
460
-        rm "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
462
+    if [ -f "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}" ]; then
463
+        rm "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
461
     fi
464
     fi
462
     function_check drop_database
465
     function_check drop_database
463
     drop_database gogs
466
     drop_database gogs
473
     userdel -r gogs
476
     userdel -r gogs
474
 
477
 
475
     function_check remove_ddns_domain
478
     function_check remove_ddns_domain
476
-    remove_ddns_domain "$GIT_DOMAIN_NAME"
479
+    remove_ddns_domain "$GOGS_DOMAIN_NAME"
477
 }
480
 }
478
 
481
 
479
 function install_gogs {
482
 function install_gogs {
480
-    if [ ! "$GIT_DOMAIN_NAME" ]; then
483
+    if [ ! "$GOGS_DOMAIN_NAME" ]; then
481
         return
484
         return
482
     fi
485
     fi
483
 
486
 
580
     systemctl daemon-reload
583
     systemctl daemon-reload
581
     systemctl start gogs
584
     systemctl start gogs
582
 
585
 
583
-    if [ ! -d "/var/www/${GIT_DOMAIN_NAME}" ]; then
584
-        mkdir "/var/www/${GIT_DOMAIN_NAME}"
586
+    if [ ! -d "/var/www/${GOGS_DOMAIN_NAME}" ]; then
587
+        mkdir "/var/www/${GOGS_DOMAIN_NAME}"
585
     fi
588
     fi
586
-    if [ -d "/var/www/${GIT_DOMAIN_NAME}/htdocs" ]; then
587
-        rm -rf "/var/www/${GIT_DOMAIN_NAME}/htdocs"
589
+    if [ -d "/var/www/${GOGS_DOMAIN_NAME}/htdocs" ]; then
590
+        rm -rf "/var/www/${GOGS_DOMAIN_NAME}/htdocs"
588
     fi
591
     fi
589
 
592
 
590
     if [[ "${ONION_ONLY}" == "no" ]]; then
593
     if [[ "${ONION_ONLY}" == "no" ]]; then
591
         function_check nginx_http_redirect
594
         function_check nginx_http_redirect
592
-        nginx_http_redirect "${GIT_DOMAIN_NAME}"
595
+        nginx_http_redirect "${GOGS_DOMAIN_NAME}"
593
         { echo 'server {';
596
         { echo 'server {';
594
           echo '    listen 443 ssl;';
597
           echo '    listen 443 ssl;';
595
           echo '    #listen [::]:443 ssl;';
598
           echo '    #listen [::]:443 ssl;';
596
-          echo "    root /var/www/${GIT_DOMAIN_NAME}/htdocs;";
597
-          echo "    server_name ${GIT_DOMAIN_NAME};";
599
+          echo "    root /var/www/${GOGS_DOMAIN_NAME}/htdocs;";
600
+          echo "    server_name ${GOGS_DOMAIN_NAME};";
598
           echo '    access_log /dev/null;';
601
           echo '    access_log /dev/null;';
599
           echo "    error_log /dev/null;";
602
           echo "    error_log /dev/null;";
600
-          echo ''; } >> "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
603
+          echo ''; } >> "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
601
         function_check nginx_ssl
604
         function_check nginx_ssl
602
-        nginx_ssl "${GIT_DOMAIN_NAME}"
605
+        nginx_ssl "${GOGS_DOMAIN_NAME}"
603
         function_check nginx_security_options
606
         function_check nginx_security_options
604
-        nginx_security_options "${GIT_DOMAIN_NAME}"
607
+        nginx_security_options "${GOGS_DOMAIN_NAME}"
605
         { echo '    add_header Strict-Transport-Security max-age=0;';
608
         { echo '    add_header Strict-Transport-Security max-age=0;';
606
           echo '';
609
           echo '';
607
-          echo '    location / {'; } >> "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
610
+          echo '    location / {'; } >> "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
608
         function_check nginx_limits
611
         function_check nginx_limits
609
-        nginx_limits "${GIT_DOMAIN_NAME}" '10G'
612
+        nginx_limits "${GOGS_DOMAIN_NAME}" '10G'
610
         { echo "        proxy_pass http://localhost:${GOGS_PORT};";
613
         { echo "        proxy_pass http://localhost:${GOGS_PORT};";
611
           echo '    }';
614
           echo '    }';
612
           echo '';
615
           echo '';
621
           echo '        access_log /dev/null;';
624
           echo '        access_log /dev/null;';
622
           echo '    }';
625
           echo '    }';
623
           echo '}';
626
           echo '}';
624
-          echo ''; } >> "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
627
+          echo ''; } >> "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
625
     else
628
     else
626
-        echo -n '' > "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
629
+        echo -n '' > "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
627
     fi
630
     fi
628
     { echo 'server {';
631
     { echo 'server {';
629
       echo "    listen 127.0.0.1:${GIT_ONION_PORT} default_server;";
632
       echo "    listen 127.0.0.1:${GIT_ONION_PORT} default_server;";
630
-      echo "    root /var/www/$GIT_DOMAIN_NAME/htdocs;";
631
-      echo "    server_name $GIT_DOMAIN_NAME;";
633
+      echo "    root /var/www/$GOGS_DOMAIN_NAME/htdocs;";
634
+      echo "    server_name $GOGS_DOMAIN_NAME;";
632
       echo '    access_log /dev/null;';
635
       echo '    access_log /dev/null;';
633
       echo "    error_log /dev/null;";
636
       echo "    error_log /dev/null;";
634
-      echo ''; } >> "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
637
+      echo ''; } >> "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
635
     function_check nginx_security_options
638
     function_check nginx_security_options
636
-    nginx_security_options "${GIT_DOMAIN_NAME}"
639
+    nginx_security_options "${GOGS_DOMAIN_NAME}"
637
     { echo '    add_header Strict-Transport-Security max-age=0;';
640
     { echo '    add_header Strict-Transport-Security max-age=0;';
638
       echo '';
641
       echo '';
639
-      echo '    location / {'; } >> "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
642
+      echo '    location / {'; } >> "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
640
     function_check nginx_limits
643
     function_check nginx_limits
641
-    nginx_limits "${GIT_DOMAIN_NAME}" '10G'
644
+    nginx_limits "${GOGS_DOMAIN_NAME}" '10G'
642
     { echo "        proxy_pass http://localhost:${GOGS_PORT};";
645
     { echo "        proxy_pass http://localhost:${GOGS_PORT};";
643
       echo '    }';
646
       echo '    }';
644
       echo '';
647
       echo '';
652
       echo '        log_not_found off;';
655
       echo '        log_not_found off;';
653
       echo '        access_log /dev/null;';
656
       echo '        access_log /dev/null;';
654
       echo '    }';
657
       echo '    }';
655
-      echo '}'; } >> "/etc/nginx/sites-available/${GIT_DOMAIN_NAME}"
658
+      echo '}'; } >> "/etc/nginx/sites-available/${GOGS_DOMAIN_NAME}"
656
 
659
 
657
     function_check configure_php
660
     function_check configure_php
658
     configure_php
661
     configure_php
659
 
662
 
660
     function_check create_site_certificate
663
     function_check create_site_certificate
661
-    create_site_certificate "${GIT_DOMAIN_NAME}" 'yes'
664
+    create_site_certificate "${GOGS_DOMAIN_NAME}" 'yes'
662
 
665
 
663
-    nginx_ensite "${GIT_DOMAIN_NAME}"
666
+    nginx_ensite "${GOGS_DOMAIN_NAME}"
664
 
667
 
665
     if [ ! -d /var/lib/tor ]; then
668
     if [ ! -d /var/lib/tor ]; then
666
         echo $'No Tor installation found. Gogs onion site cannot be configured.'
669
         echo $'No Tor installation found. Gogs onion site cannot be configured.'
685
     systemctl restart php7.0-fpm
688
     systemctl restart php7.0-fpm
686
     systemctl restart nginx
689
     systemctl restart nginx
687
 
690
 
688
-    set_completion_param "gogs domain" "$GIT_DOMAIN_NAME"
691
+    set_completion_param "gogs domain" "$GOGS_DOMAIN_NAME"
689
     set_completion_param "gogs onion domain" "$GIT_ONION_HOSTNAME"
692
     set_completion_param "gogs onion domain" "$GIT_ONION_HOSTNAME"
690
 
693
 
691
     function_check add_ddns_domain
694
     function_check add_ddns_domain
692
-    add_ddns_domain "${GIT_DOMAIN_NAME}"
695
+    add_ddns_domain "${GOGS_DOMAIN_NAME}"
693
 
696
 
694
     # obtain the secret key
697
     # obtain the secret key
695
     GOGS_SECRET_KEY="$(create_password "${MINIMUM_PASSWORD_LENGTH}")"
698
     GOGS_SECRET_KEY="$(create_password "${MINIMUM_PASSWORD_LENGTH}")"
718
       echo '';
721
       echo '';
719
       echo '[server]'; } >> ${GOGS_CONFIG_FILE}
722
       echo '[server]'; } >> ${GOGS_CONFIG_FILE}
720
     if [[ ${ONION_ONLY} == 'no' ]]; then
723
     if [[ ${ONION_ONLY} == 'no' ]]; then
721
-        echo "DOMAIN = ${GIT_DOMAIN_NAME}" >> ${GOGS_CONFIG_FILE}
722
-        echo "ROOT_URL = https://$GIT_DOMAIN_NAME/" >> ${GOGS_CONFIG_FILE}
724
+        echo "DOMAIN = ${GOGS_DOMAIN_NAME}" >> ${GOGS_CONFIG_FILE}
725
+        echo "ROOT_URL = https://$GOGS_DOMAIN_NAME/" >> ${GOGS_CONFIG_FILE}
723
     else
726
     else
724
         echo "DOMAIN = ${GIT_ONION_HOSTNAME}" >> ${GOGS_CONFIG_FILE}
727
         echo "DOMAIN = ${GIT_ONION_HOSTNAME}" >> ${GOGS_CONFIG_FILE}
725
-        echo "ROOT_URL = http://$GIT_DOMAIN_NAME/" >> ${GOGS_CONFIG_FILE}
728
+        echo "ROOT_URL = http://$GOGS_DOMAIN_NAME/" >> ${GOGS_CONFIG_FILE}
726
     fi
729
     fi
727
     { echo "HTTP_PORT = ${GOGS_PORT}";
730
     { echo "HTTP_PORT = ${GOGS_PORT}";
728
       echo "SSH_PORT = $SSH_PORT";
731
       echo "SSH_PORT = $SSH_PORT";
729
       echo 'SSH_DOMAIN = %(DOMAIN)s';
732
       echo 'SSH_DOMAIN = %(DOMAIN)s';
730
-      echo "CERT_FILE = /etc/ssl/certs/${GIT_DOMAIN_NAME}.pem";
731
-      echo "KEY_FILE = /etc/ssl/private/${GIT_DOMAIN_NAME}.key";
733
+      echo "CERT_FILE = /etc/ssl/certs/${GOGS_DOMAIN_NAME}.pem";
734
+      echo "KEY_FILE = /etc/ssl/private/${GOGS_DOMAIN_NAME}.key";
732
       echo 'DISABLE_ROUTER_LOG = true';
735
       echo 'DISABLE_ROUTER_LOG = true';
733
       echo '';
736
       echo '';
734
       echo '[session]';
737
       echo '[session]';
758
     systemctl restart gogs
761
     systemctl restart gogs
759
 
762
 
760
     if ! grep -q "gogs domain:" "${COMPLETION_FILE}"; then
763
     if ! grep -q "gogs domain:" "${COMPLETION_FILE}"; then
761
-        echo "gogs domain:${GIT_DOMAIN_NAME}" >> "${COMPLETION_FILE}"
764
+        echo "gogs domain:${GOGS_DOMAIN_NAME}" >> "${COMPLETION_FILE}"
762
     else
765
     else
763
-        sed -i "s|gogs domain.*|gogs domain:${GIT_DOMAIN_NAME}|g" "${COMPLETION_FILE}"
766
+        sed -i "s|gogs domain.*|gogs domain:${GOGS_DOMAIN_NAME}|g" "${COMPLETION_FILE}"
764
     fi
767
     fi
765
 
768
 
766
     function_check configure_firewall_for_git
769
     function_check configure_firewall_for_git

+ 4
- 0
src/freedombone-app-htmly Dosyayı Görüntüle

39
 HTMLY_TITLE="My Blog"
39
 HTMLY_TITLE="My Blog"
40
 HTMLY_SUBTITLE="Another ${PROJECT_NAME} blog"
40
 HTMLY_SUBTITLE="Another ${PROJECT_NAME} blog"
41
 
41
 
42
+HTMLY_SHORT_DESCRIPTION=$'HTMLy'
43
+HTMLY_DESCRIPTION=$'HTMLy databaseless blogging'
44
+HTMLY_MOBILE_APP_URL=
45
+
42
 htmly_variables=(HTMLY_REPO
46
 htmly_variables=(HTMLY_REPO
43
                  HTMLY_DOMAIN_NAME
47
                  HTMLY_DOMAIN_NAME
44
                  HTMLY_CODE
48
                  HTMLY_CODE

+ 4
- 0
src/freedombone-app-hubzilla Dosyayı Görüntüle

41
 HUBZILLA_ADDONS_COMMIT='be9dcd044b9326c3bd9301d7c4b375a2c2f54663'
41
 HUBZILLA_ADDONS_COMMIT='be9dcd044b9326c3bd9301d7c4b375a2c2f54663'
42
 HUBZILLA_ADMIN_PASSWORD=
42
 HUBZILLA_ADMIN_PASSWORD=
43
 
43
 
44
+HUBZILLA_SHORT_DESCRIPTION=$'Hubzilla'
45
+HUBZILLA_DESCRIPTION=$'Hubzilla'
46
+HUBZILLA_MOBILE_APP_URL=
47
+
44
 hubzilla_variables=(ONION_ONLY
48
 hubzilla_variables=(ONION_ONLY
45
                     HUBZILLA_DOMAIN_NAME
49
                     HUBZILLA_DOMAIN_NAME
46
                     HUBZILLA_CODE
50
                     HUBZILLA_CODE

+ 4
- 0
src/freedombone-app-icecast Dosyayı Görüntüle

44
 ICECAST_PLAYLIST_FILE=/etc/ices2/playlist.txt
44
 ICECAST_PLAYLIST_FILE=/etc/ices2/playlist.txt
45
 ICECAST_LOGIN_TEXT=$"Icecast login"
45
 ICECAST_LOGIN_TEXT=$"Icecast login"
46
 
46
 
47
+ICECAST_SHORT_DESCRIPTION=$'Icecast'
48
+ICECAST_DESCRIPTION=$'Icecast'
49
+ICECAST_MOBILE_APP_URL=
50
+
47
 icecast_variables=(MY_USERNAME
51
 icecast_variables=(MY_USERNAME
48
                    MY_EMAIL_ADDRESS
52
                    MY_EMAIL_ADDRESS
49
                    ONION_ONLY
53
                    ONION_ONLY

+ 4
- 0
src/freedombone-app-irc Dosyayı Görüntüle

41
 # Number of entries for the bouncer to buffer
41
 # Number of entries for the bouncer to buffer
42
 IRC_BUFFER_LENGTH=300
42
 IRC_BUFFER_LENGTH=300
43
 
43
 
44
+IRC_SHORT_DESCRIPTION=$'IRC'
45
+IRC_DESCRIPTION=$'IRC'
46
+IRC_MOBILE_APP_URL='https://f-droid.org/packages/org.yaaic'
47
+
44
 irc_variables=(MY_USERNAME
48
 irc_variables=(MY_USERNAME
45
                MY_NAME
49
                MY_NAME
46
                IRC_PORT
50
                IRC_PORT

+ 4
- 0
src/freedombone-app-jitsi Dosyayı Görüntüle

44
 JITSI_CODE=
44
 JITSI_CODE=
45
 JITSI_ONION_HOSTNAME=
45
 JITSI_ONION_HOSTNAME=
46
 
46
 
47
+JITSI_SHORT_DESCRIPTION=$'Jitsi'
48
+JITSI_DESCRIPTION=$'Jitsi'
49
+JITSI_MOBILE_APP_URL=
50
+
47
 jitsi_variables=(ONION_ONLY
51
 jitsi_variables=(ONION_ONLY
48
                  JITSI_DOMAIN_NAME
52
                  JITSI_DOMAIN_NAME
49
                  JITSI_ONION_HOSTNAME
53
                  JITSI_ONION_HOSTNAME

+ 3
- 0
src/freedombone-app-kanboard Dosyayı Görüntüle

38
 KANBOARD_COMMIT='7a6b1bc3da0af442e02b5a2dc430a4ded8e7c4ee'
38
 KANBOARD_COMMIT='7a6b1bc3da0af442e02b5a2dc430a4ded8e7c4ee'
39
 KANBOARD_ADMIN_PASSWORD=
39
 KANBOARD_ADMIN_PASSWORD=
40
 
40
 
41
+KANBOARD_SHORT_DESCRIPTION=$'Kanboard'
42
+KANBOARD_DESCRIPTION=$'Kanboard kanban'
43
+KANBOARD_MOBILE_APP_URL=
41
 
44
 
42
 kanboard_variables=(ONION_ONLY
45
 kanboard_variables=(ONION_ONLY
43
                     KANBOARD_DOMAIN_NAME
46
                     KANBOARD_DOMAIN_NAME

+ 4
- 0
src/freedombone-app-koel Dosyayı Görüntüle

40
 KOEL_COMMIT='8e9b021aa09f2b1460977bdd52fff14ea2bc1607'
40
 KOEL_COMMIT='8e9b021aa09f2b1460977bdd52fff14ea2bc1607'
41
 KOEL_ADMIN_PASSWORD=
41
 KOEL_ADMIN_PASSWORD=
42
 
42
 
43
+KOEL_SHORT_DESCRIPTION=$'Koel music'
44
+KOEL_DESCRIPTION=$'Koel music player'
45
+KOEL_MOBILE_APP_URL=
46
+
43
 koel_variables=(ONION_ONLY
47
 koel_variables=(ONION_ONLY
44
                 KOEL_DOMAIN_NAME
48
                 KOEL_DOMAIN_NAME
45
                 KOEL_CODE
49
                 KOEL_CODE

+ 4
- 0
src/freedombone-app-lychee Dosyayı Görüntüle

37
 LYCHEE_REPO="https://github.com/electerious/Lychee"
37
 LYCHEE_REPO="https://github.com/electerious/Lychee"
38
 LYCHEE_COMMIT='27f207dcbac8488629ffc3b5a9cac78ae123bee9'
38
 LYCHEE_COMMIT='27f207dcbac8488629ffc3b5a9cac78ae123bee9'
39
 
39
 
40
+LYCHEE_SHORT_DESCRIPTION=$'Lychee photos'
41
+LYCHEE_DESCRIPTION=$'Lychee photos'
42
+LYCHEE_MOBILE_APP_URL=
43
+
40
 lychee_variables=(LYCHEE_REPO
44
 lychee_variables=(LYCHEE_REPO
41
                   LYCHEE_DOMAIN_NAME
45
                   LYCHEE_DOMAIN_NAME
42
                   LYCHEE_CODE
46
                   LYCHEE_CODE

+ 4
- 0
src/freedombone-app-mailpile Dosyayı Görüntüle

38
 MAILPILE_COMMIT='4f28f1bb55b3b9985f22ab6372d539b1087482dd'
38
 MAILPILE_COMMIT='4f28f1bb55b3b9985f22ab6372d539b1087482dd'
39
 MAILPILE_PORT=33411
39
 MAILPILE_PORT=33411
40
 
40
 
41
+MAILPILE_SHORT_DESCRIPTION=$'Mailpile'
42
+MAILPILE_DESCRIPTION=$'Mailpile email client'
43
+MAILPILE_MOBILE_APP_URL=
44
+
41
 mailpile_variables=(MAILPILE_REPO
45
 mailpile_variables=(MAILPILE_REPO
42
                     MAILPILE_DOMAIN_NAME
46
                     MAILPILE_DOMAIN_NAME
43
                     MAILPILE_CODE
47
                     MAILPILE_CODE

+ 4
- 0
src/freedombone-app-matrix Dosyayı Görüntüle

53
 MATRIX_SECRET=
53
 MATRIX_SECRET=
54
 MATRIX_EXPIRE_MONTHS=1
54
 MATRIX_EXPIRE_MONTHS=1
55
 
55
 
56
+MATRIX_SHORT_DESCRIPTION=$'Matrix chat'
57
+MATRIX_DESCRIPTION=$'Matrix chat'
58
+MATRIX_MOBILE_APP_URL='https://f-droid.org/packages/im.vector.alpha'
59
+
56
 matrix_variables=(ONION_ONLY
60
 matrix_variables=(ONION_ONLY
57
                   MY_USERNAME
61
                   MY_USERNAME
58
                   MATRIX_SECRET
62
                   MATRIX_SECRET

+ 5
- 1
src/freedombone-app-mediagoblin Dosyayı Görüntüle

35
 MEDIAGOBLIN_ADMIN_PASSWORD=
35
 MEDIAGOBLIN_ADMIN_PASSWORD=
36
 MEDIAGOBLIN_CODE=
36
 MEDIAGOBLIN_CODE=
37
 MEDIAGOBLIN_ONION_PORT=8108
37
 MEDIAGOBLIN_ONION_PORT=8108
38
-MEDIAGOBLIN_REPO="http://git.savannah.gnu.org/r/mediagoblin.git"
38
+MEDIAGOBLIN_REPO="https://git.savannah.gnu.org/git/mediagoblin.git"
39
 MEDIAGOBLIN_COMMIT='c4d3293dfa4076719e60fe9e052add07426f9a9a'
39
 MEDIAGOBLIN_COMMIT='c4d3293dfa4076719e60fe9e052add07426f9a9a'
40
 MEDIAGOBLIN_BASE_DIR=/var/www/mediagoblin.local/htdocs
40
 MEDIAGOBLIN_BASE_DIR=/var/www/mediagoblin.local/htdocs
41
 MEDIAGOBLIN_PORT=6543
41
 MEDIAGOBLIN_PORT=6543
42
 
42
 
43
+MEDIAGOBLIN_SHORT_DESCRIPTION=$'Mediagoblin'
44
+MEDIAGOBLIN_DESCRIPTION=$'Mediagoblin'
45
+MEDIAGOBLIN_MOBILE_APP_URL=
46
+
43
 mediagoblin_variables=(ONION_ONLY
47
 mediagoblin_variables=(ONION_ONLY
44
                        MY_USERNAME
48
                        MY_USERNAME
45
                        MEDIAGOBLIN_DOMAIN_NAME
49
                        MEDIAGOBLIN_DOMAIN_NAME

+ 4
- 0
src/freedombone-app-movim Dosyayı Görüntüle

39
 MOVIM_ADMIN_PASSWORD=
39
 MOVIM_ADMIN_PASSWORD=
40
 MOVIM_DAEMON_PORT=8880
40
 MOVIM_DAEMON_PORT=8880
41
 
41
 
42
+MOVIM_SHORT_DESCRIPTION=$'Movim'
43
+MOVIM_DESCRIPTION=$'Movim'
44
+MOVIM_MOBILE_APP_URL='https://f-droid.org/packages/com.movim.movim'
45
+
42
 movim_variables=(ONION_ONLY
46
 movim_variables=(ONION_ONLY
43
                  MOVIM_DOMAIN_NAME
47
                  MOVIM_DOMAIN_NAME
44
                  MOVIM_CODE
48
                  MOVIM_CODE

+ 4
- 0
src/freedombone-app-mumble Dosyayı Görüntüle

40
 MUMBLE_DATABASE="mumble-server.sqlite"
40
 MUMBLE_DATABASE="mumble-server.sqlite"
41
 MUMBLE_CONFIG_FILE="mumble-server.ini"
41
 MUMBLE_CONFIG_FILE="mumble-server.ini"
42
 
42
 
43
+MUMBLE_SHORT_DESCRIPTION=$'Mumble'
44
+MUMBLE_DESCRIPTION=$'Mumble'
45
+MUMBLE_MOBILE_APP_URL='https://f-droid.org/packages/com.morlunk.mumbleclient'
46
+
43
 mumble_variables=(MY_USERNAME
47
 mumble_variables=(MY_USERNAME
44
                   DEFAULT_DOMAIN_NAME
48
                   DEFAULT_DOMAIN_NAME
45
                   MUMBLE_PORT
49
                   MUMBLE_PORT

+ 4
- 0
src/freedombone-app-nextcloud Dosyayı Görüntüle

42
 NEXTCLOUD_ADMIN_PASSWORD=
42
 NEXTCLOUD_ADMIN_PASSWORD=
43
 NEXTCLOUD_SERVER_SIDE_ENCRYPTION=1
43
 NEXTCLOUD_SERVER_SIDE_ENCRYPTION=1
44
 
44
 
45
+NEXTCLOUD_SHORT_DESCRIPTION=$'NextCloud'
46
+NEXTCLOUD_DESCRIPTION=$'NextCloud'
47
+NEXTCLOUD_MOBILE_APP_URL='https://f-droid.org/packages/com.nextcloud.client'
48
+
45
 nextcloud_variables=(ONION_ONLY
49
 nextcloud_variables=(ONION_ONLY
46
                      NEXTCLOUD_DOMAIN_NAME
50
                      NEXTCLOUD_DOMAIN_NAME
47
                      NEXTCLOUD_CODE
51
                      NEXTCLOUD_CODE

+ 4
- 0
src/freedombone-app-peertube Dosyayı Görüntüle

44
 MESH_PEERTUBE_PORT=8500
44
 MESH_PEERTUBE_PORT=8500
45
 PEERTUBE_DIR=/etc/peertube
45
 PEERTUBE_DIR=/etc/peertube
46
 
46
 
47
+PEERTUBE_SHORT_DESCRIPTION=$'PeerTube'
48
+PEERTUBE_DESCRIPTION=$'PeerTube'
49
+PEERTUBE_MOBILE_APP_URL=
50
+
47
 peertube_variables=(PEERTUBE_DOMAIN_NAME
51
 peertube_variables=(PEERTUBE_DOMAIN_NAME
48
                     PEERTUBE_CODE
52
                     PEERTUBE_CODE
49
                     PEERTUBE_ADMIN_PASSWORD
53
                     PEERTUBE_ADMIN_PASSWORD

+ 4
- 0
src/freedombone-app-pleroma Dosyayı Görüntüle

51
 pleroma_expire_posts_script=/usr/bin/pleroma-expire-posts
51
 pleroma_expire_posts_script=/usr/bin/pleroma-expire-posts
52
 blocking_script_file=/usr/bin/pleroma-blocking
52
 blocking_script_file=/usr/bin/pleroma-blocking
53
 
53
 
54
+PLEROMA_SHORT_DESCRIPTION=$'Pleroma'
55
+PLEROMA_DESCRIPTION=$'Pleroma federated microblogging'
56
+PLEROMA_MOBILE_APP_URL='https://f-droid.org/packages/com.keylesspalace.tusky'
57
+
54
 pleroma_variables=(ONION_ONLY
58
 pleroma_variables=(ONION_ONLY
55
                    PLEROMA_DOMAIN_NAME
59
                    PLEROMA_DOMAIN_NAME
56
                    PLEROMA_CODE
60
                    PLEROMA_CODE

+ 4
- 0
src/freedombone-app-postactiv Dosyayı Görüntüle

45
 # Number of months after which posts expire
45
 # Number of months after which posts expire
46
 POSTACTIV_EXPIRE_MONTHS=3
46
 POSTACTIV_EXPIRE_MONTHS=3
47
 
47
 
48
+POSTACTIV_SHORT_DESCRIPTION=$'PostActiv'
49
+POSTACTIV_DESCRIPTION=$'PostActiv federated microblogging'
50
+POSTACTIV_MOBILE_APP_URL='https://f-droid.org/packages/org.mariotaku.twidere/'
51
+
48
 postactiv_variables=(ONION_ONLY
52
 postactiv_variables=(ONION_ONLY
49
                      POSTACTIV_DOMAIN_NAME
53
                      POSTACTIV_DOMAIN_NAME
50
                      POSTACTIV_CODE
54
                      POSTACTIV_CODE

+ 4
- 0
src/freedombone-app-privatebin Dosyayı Görüntüle

38
 PRIVATEBIN_COMMIT='9c132cd839fd5e91da18e4a1e8ebef64fce605fb'
38
 PRIVATEBIN_COMMIT='9c132cd839fd5e91da18e4a1e8ebef64fce605fb'
39
 PRIVATEBIN_ADMIN_PASSWORD=
39
 PRIVATEBIN_ADMIN_PASSWORD=
40
 
40
 
41
+PRIVATEBIN_SHORT_DESCRIPTION=$'PrivateBin'
42
+PRIVATEBIN_DESCRIPTION=$'PrivateBin zero knowledge pastebin'
43
+PRIVATEBIN_MOBILE_APP_URL=
44
+
41
 privatebin_variables=(ONION_ONLY
45
 privatebin_variables=(ONION_ONLY
42
                       PRIVATEBIN_DOMAIN_NAME
46
                       PRIVATEBIN_DOMAIN_NAME
43
                       PRIVATEBIN_CODE
47
                       PRIVATEBIN_CODE

+ 4
- 0
src/freedombone-app-rocketchat Dosyayı Görüntüle

36
 ROCKETCHAT_ONION_PORT=9722
36
 ROCKETCHAT_ONION_PORT=9722
37
 ROCKETCHAT_PORT_INTERNAL=3000
37
 ROCKETCHAT_PORT_INTERNAL=3000
38
 
38
 
39
+ROCKETCHAT_SHORT_DESCRIPTION=$'Rocketchat'
40
+ROCKETCHAT_DESCRIPTION=$'Rocketchat'
41
+ROCKETCHAT_MOBILE_APP_URL=
42
+
39
 rocketchat_variables=(ONION_ONLY
43
 rocketchat_variables=(ONION_ONLY
40
                       ROCKETCHAT_DOMAIN_NAME
44
                       ROCKETCHAT_DOMAIN_NAME
41
                       ROCKETCHAT_CODE
45
                       ROCKETCHAT_CODE

+ 4
- 0
src/freedombone-app-syncthing Dosyayı Görüntüle

40
 SYNCTHING_SHARED_DATA=/var/lib/syncthing/SyncShared
40
 SYNCTHING_SHARED_DATA=/var/lib/syncthing/SyncShared
41
 SYNCTHING_USER_IDS_FILE='.syncthingids'
41
 SYNCTHING_USER_IDS_FILE='.syncthingids'
42
 
42
 
43
+SYNCTHING_SHORT_DESCRIPTION=$'Syncthing'
44
+SYNCTHING_DESCRIPTION=$'Syncthing file synchronization'
45
+SYNCTHING_MOBILE_APP_URL='https://f-droid.org/packages/com.nutomic.syncthingandroid'
46
+
43
 syncthing_variables=(SYNCTHING_ID
47
 syncthing_variables=(SYNCTHING_ID
44
                      SYNCTHING_CONFIG_PATH
48
                      SYNCTHING_CONFIG_PATH
45
                      SYNCTHING_CONFIG_FILE
49
                      SYNCTHING_CONFIG_FILE

+ 4
- 0
src/freedombone-app-turtl Dosyayı Görüntüle

48
 TURTL_SIGNUP_STRING='Signup a new user'
48
 TURTL_SIGNUP_STRING='Signup a new user'
49
 turtl_users_file=$TURTL_BASE_DIR/api/controllers/users.lisp
49
 turtl_users_file=$TURTL_BASE_DIR/api/controllers/users.lisp
50
 
50
 
51
+TURTL_SHORT_DESCRIPTION=$'Turtl'
52
+TURTL_DESCRIPTION=$'Turtl notes'
53
+TURTL_MOBILE_APP_URL=
54
+
51
 turtl_variables=(ONION_ONLY
55
 turtl_variables=(ONION_ONLY
52
                  DEFAULT_DOMAIN_NAME
56
                  DEFAULT_DOMAIN_NAME
53
                  TURTL_DOMAIN_NAME
57
                  TURTL_DOMAIN_NAME

+ 4
- 0
src/freedombone-app-xmpp Dosyayı Görüntüle

53
 prosody_modules_hash='982d0dfcef98e9cb9cee4cc3801b8ce9a503a32e44c32b99df6fe94545b90072'
53
 prosody_modules_hash='982d0dfcef98e9cb9cee4cc3801b8ce9a503a32e44c32b99df6fe94545b90072'
54
 xmpp_encryption_warning=$"For security reasons, OMEMO or PGP encryption is required for conversations on this server."
54
 xmpp_encryption_warning=$"For security reasons, OMEMO or PGP encryption is required for conversations on this server."
55
 
55
 
56
+XMPP_SHORT_DESCRIPTION=$'XMPP chat'
57
+XMPP_DESCRIPTION=$'XMPP chat'
58
+XMPP_MOBILE_APP_URL='https://f-droid.org/packages/eu.siacs.conversations'
59
+
56
 xmpp_variables=(ONION_ONLY
60
 xmpp_variables=(ONION_ONLY
57
                 INSTALLED_WITHIN_DOCKER
61
                 INSTALLED_WITHIN_DOCKER
58
                 XMPP_CIPHERS
62
                 XMPP_CIPHERS

+ 2
- 2
src/freedombone-config Dosyayı Görüntüle

74
 GNUSOCIAL_CODE=
74
 GNUSOCIAL_CODE=
75
 GNUSOCIAL_WELCOME_MESSAGE=$"<h1>Welcome to \$GNUSOCIAL_DOMAIN_NAME  a federated social network</h1><p>Another $PROJECT_NAME site</p>"
75
 GNUSOCIAL_WELCOME_MESSAGE=$"<h1>Welcome to \$GNUSOCIAL_DOMAIN_NAME  a federated social network</h1><p>Another $PROJECT_NAME site</p>"
76
 GNUSOCIAL_BACKGROUND_IMAGE_URL=
76
 GNUSOCIAL_BACKGROUND_IMAGE_URL=
77
-GIT_DOMAIN_NAME=
78
-GIT_CODE=
77
+GOGS_DOMAIN_NAME=
78
+GOGS_CODE=
79
 USB_DRIVE=/dev/sdb1
79
 USB_DRIVE=/dev/sdb1
80
 HWRNG_TYPE=
80
 HWRNG_TYPE=
81
 ENABLE_SOCIAL_KEY_MANAGEMENT=
81
 ENABLE_SOCIAL_KEY_MANAGEMENT=

+ 4
- 0
src/freedombone-syncthing Dosyayı Görüntüle

55
 CHANGED=
55
 CHANGED=
56
 TEMP_IDS_FILE=/root/.synthingids
56
 TEMP_IDS_FILE=/root/.synthingids
57
 
57
 
58
+SYNCTHING_SHORT_DESCRIPTION=$'File Synchronization'
59
+SYNCTHING_DESCRIPTION=$'File Synchronization'
60
+SYNCTHING_MOBILE_APP_URL='https://f-droid.org/packages/com.nutomic.syncthingandroid'
61
+
58
 function remove_user_syncthing {
62
 function remove_user_syncthing {
59
     remove_username="$1"
63
     remove_username="$1"
60
 
64
 

+ 5
- 0
src/freedombone-template Dosyayı Görüntüle

280
     fi
280
     fi
281
 fi
281
 fi
282
 echo ''
282
 echo ''
283
+echo $'# These parameters are used by the FreedomBox mobile app'
284
+echo "${app_name_upper}_SHORT_DESCRIPTION="
285
+echo "${app_name_upper}_DESCRIPTION="
286
+echo "${app_name_upper}_MOBILE_APP_URL="
287
+echo ''
283
 echo "${app_name}_variables=(ONION_ONLY"
288
 echo "${app_name}_variables=(ONION_ONLY"
284
 echo "                       ${app_name_upper}_DOMAIN_NAME"
289
 echo "                       ${app_name_upper}_DOMAIN_NAME"
285
 echo "                       ${app_name_upper}_CODE"
290
 echo "                       ${app_name_upper}_CODE"

+ 8
- 0
src/freedombone-upgrade Dosyayı Görüntüle

111
         rm /etc/exim4/exim4.conf.template.bak*
111
         rm /etc/exim4/exim4.conf.template.bak*
112
         email_update_onion_domain
112
         email_update_onion_domain
113
         prevent_mail_process_overrun
113
         prevent_mail_process_overrun
114
+        android_update_apps yes
114
         #defrag_filesystem
115
         #defrag_filesystem
115
 
116
 
116
         # reinstall tor from backports
117
         # reinstall tor from backports
125
 # If logging was left on then turn it off
126
 # If logging was left on then turn it off
126
 ${PROJECT_NAME}-logging off
127
 ${PROJECT_NAME}-logging off
127
 
128
 
129
+# This is a hack to fix nginx failures which happen sometimes
130
+# when matrix is installed
131
+if [ -d /etc/matrix ]; then
132
+    systemctl restart matrix
133
+    systemctl restart nginx
134
+fi
135
+
128
 # upgrading file prevents USB canary from activating
136
 # upgrading file prevents USB canary from activating
129
 if [ -f /tmp/.upgrading ]; then
137
 if [ -f /tmp/.upgrading ]; then
130
     rm /tmp/.upgrading
138
     rm /tmp/.upgrading

+ 167
- 0
src/freedombone-utils-android Dosyayı Görüntüle

1
+#!/bin/bash
2
+#  _____               _           _
3
+# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
4
+# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
5
+# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
6
+#
7
+#                              Freedom in the Cloud
8
+#
9
+# Integration with the FreedomBox android app
10
+#
11
+# License
12
+# =======
13
+#
14
+# Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
15
+#
16
+# This program is free software: you can redistribute it and/or modify
17
+# it under the terms of the GNU Affero General Public License as published by
18
+# the Free Software Foundation, either version 3 of the License, or
19
+# (at your option) any later version.
20
+#
21
+# This program is distributed in the hope that it will be useful,
22
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
23
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
+# GNU Affero General Public License for more details.
25
+#
26
+# You should have received a copy of the GNU Affero General Public License
27
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
28
+
29
+function android_update_apps {
30
+    if [ "$1" ]; then
31
+        detect_installable_apps
32
+    fi
33
+
34
+    local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
35
+    plinth_api="/var/www/${local_hostname}/htdocs/plinth/api.json"
36
+
37
+    # Create a self-signed cert if needed
38
+    # The FreedomBox app assumes a self-signed cert
39
+    if [ ! -f "/etc/ssl/certs/${local_hostname}.crt" ]; then
40
+        install_web_local_user_interface
41
+        systemctl restart nginx
42
+    fi
43
+
44
+    if [ ! -d "/var/www/${local_hostname}/htdocs/plinth" ]; then
45
+        mkdir -p "/var/www/${local_hostname}/htdocs/plinth"
46
+    fi
47
+    if [ ! -d "/var/www/${local_hostname}/htdocs/icons" ]; then
48
+        mkdir -p "/var/www/${local_hostname}/htdocs/icons"
49
+    fi
50
+
51
+    echo '{' > "$plinth_api"
52
+    echo '  "shortcuts": [' >> "$plinth_api"
53
+
54
+    android_ctr=0
55
+    app_index=0
56
+    # shellcheck disable=SC2068,SC2034
57
+    for a in ${APPS_INSTALLED[@]}
58
+    do
59
+        app_name=${APPS_INSTALLED_NAMES[$app_index]}
60
+        if [ "$app_name" ]; then
61
+            app_filename="/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-${app_name}"
62
+            if [ -f "$app_filename" ]; then
63
+                # get the icon for the app
64
+                icon_filename="/usr/share/${PROJECT_NAME}/android-app/${app_name}.png"
65
+                if [ -f "$icon_filename" ]; then
66
+                    cp "$icon_filename" "/var/www/${local_hostname}/htdocs/icons/${app_name}.png"
67
+                else
68
+                    icon_filename=
69
+                fi
70
+
71
+                app_name_upper=$(echo "$app_name" | awk '{print toupper($0)}')
72
+                SHORT_DESCRIPTION=
73
+                DESCRIPTION=
74
+                MOBILE_APP_URL=
75
+
76
+                if ! grep -q "${app_name_upper}_SHORT_DESCRIPTION=" "$app_filename"; then
77
+                    app_index=$((app_index+1))
78
+                    continue
79
+                fi
80
+                if grep -q "#${app_name_upper}_SHORT_DESCRIPTION=" "$app_filename"; then
81
+                    app_index=$((app_index+1))
82
+                    continue
83
+                fi
84
+                SHORT_DESCRIPTION="$(grep "${app_name_upper}_SHORT_DESCRIPTION=" "$app_filename" | head -n 1 | sed 's|\$||g' | sed "s|'||g" | sed 's|\"||g' | awk -F '=' '{print $2}')"
85
+
86
+                if grep -q "${app_name_upper}_DESCRIPTION=" "$app_filename"; then
87
+                    DESCRIPTION="$(grep "${app_name_upper}_DESCRIPTION=" "$app_filename" | head -n 1 | sed 's|\$||g' | sed "s|'||g" | sed 's|\"||g' | awk -F '=' '{print $2}')"
88
+                fi
89
+                if grep -q "${app_name_upper}_MOBILE_APP_URL=" "$app_filename"; then
90
+                    MOBILE_APP_URL="$(grep "${app_name_upper}_MOBILE_APP_URL=" "$app_filename" | head -n 1 | sed 's|\$||g' | sed 's|\$||g' | sed "s|'||g" | sed 's|\"||g' | awk -F '=' '{print $2}')"
91
+                fi
92
+
93
+                if [ $android_ctr -gt 0 ]; then
94
+                    echo ',' >> "$plinth_api"
95
+                fi
96
+
97
+                { echo '    {';
98
+                  echo "      \"name\": \"${app_name}\",";
99
+                  echo "      \"short_description\": \"$SHORT_DESCRIPTION\",";
100
+                  echo "      \"description\": [";
101
+                  echo "        \"$DESCRIPTION\"";
102
+                  echo '      ],';
103
+                  echo "      \"icon_url\": \"/icons/${app_name}.png\",";
104
+                  echo "      \"clients\": ["; } >> "$plinth_api"
105
+
106
+                read_config_param "${app_name_upper}_DOMAIN_NAME"
107
+                test_domain_name="${app_name_upper}_DOMAIN_NAME"
108
+                domain_name=${!test_domain_name}
109
+                if [ "$domain_name" ]; then
110
+                    if [[ "$domain_name" != *'.onion' ]]; then
111
+                        domain_name="https://${!test_domain_name}"
112
+                    else
113
+                        domain_name="http://${!test_domain_name}"
114
+                    fi
115
+                fi
116
+                if [[ "$domain_name" && "$app_name" != 'matrix' ]]; then
117
+                    { echo '        {';
118
+                      echo "          \"name\": \"${app_name}\",";
119
+                      echo "          \"platforms\": [";
120
+                      echo '            {';
121
+                      echo '              "type": "web",';
122
+                      echo "              \"url\": \"$domain_name\"";
123
+                      echo -n '            }'; } >> "$plinth_api"
124
+                fi
125
+
126
+                if [ "$MOBILE_APP_URL" ]; then
127
+                    if [[ "$domain_name" && "$app_name" != 'matrix' ]]; then
128
+                        echo ',' >> "$plinth_api"
129
+                    else
130
+                        { echo '        {';
131
+                          echo "          \"name\": \"${app_name}\",";
132
+                          echo "          \"platforms\": ["; } >> "$plinth_api"
133
+                    fi
134
+                    store_name='f-droid'
135
+                    if [[ "$MOBILE_APP_URL" == *'google'* ]]; then
136
+                        store_name='google-play'
137
+                    fi
138
+                    { echo '            {';
139
+                      echo '              "type": "store",';
140
+                      echo '              "os": "android",';
141
+                      echo "              \"store_name\": \"$store_name\",";
142
+                      echo "              \"url\": \"$MOBILE_APP_URL\"";
143
+                      echo '            }'; } >> "$plinth_api"
144
+                else
145
+                    echo '' >> "$plinth_api"
146
+                fi
147
+
148
+                { echo '          ]';
149
+                  echo '        }';
150
+                  echo '      ]';
151
+                  echo -n '    }'; } >> "$plinth_api"
152
+
153
+                android_ctr=$((android_ctr+1))
154
+            fi
155
+        fi
156
+        app_index=$((app_index+1))
157
+    done
158
+
159
+    { echo '';
160
+      echo '  ]';
161
+      echo '}'; } >> "$plinth_api"
162
+
163
+    chown -R www-data:www-data "/var/www/${local_hostname}/htdocs/plinth"
164
+    chown -R www-data:www-data "/var/www/${local_hostname}/htdocs/icons"
165
+}
166
+
167
+# NOTE: deliberately no exit 0

+ 28
- 1
src/freedombone-utils-avahi Dosyayı Görüntüle

111
     WATCHDOG_SCRIPT_NAME="keepon"
111
     WATCHDOG_SCRIPT_NAME="keepon"
112
     { echo '';
112
     { echo '';
113
       echo '# keep avahi daemon running';
113
       echo '# keep avahi daemon running';
114
-      echo "AVAHI_RUNNING=\$(pgrep avahi-daemon > /dev/null && echo Running)";
114
+      echo "AVAHI_RUNNING=\$(systemctl is-active avahi-daemon >/dev/null 2>&1 && echo Running)";
115
       echo "if [ ! \$AVAHI_RUNNING ]; then";
115
       echo "if [ ! \$AVAHI_RUNNING ]; then";
116
       echo '  systemctl start avahi-daemon';
116
       echo '  systemctl start avahi-daemon';
117
       echo "  echo -n \$CURRENT_DATE >> \$LOGFILE";
117
       echo "  echo -n \$CURRENT_DATE >> \$LOGFILE";
120
     chmod +x "$rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME"
120
     chmod +x "$rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME"
121
 }
121
 }
122
 
122
 
123
+function keep_avahi_running {
124
+    WATCHDOG_SCRIPT_NAME="keepon"
125
+
126
+    if grep -q "avahi daemon" "/usr/bin/$WATCHDOG_SCRIPT_NAME"; then
127
+        return
128
+    fi
129
+
130
+    { echo '';
131
+      echo '# keep avahi daemon running';
132
+      echo "AVAHI_RUNNING=\$(systemctl is-active avahi-daemon >/dev/null 2>&1 && echo Running)";
133
+      echo "if [ ! \$AVAHI_RUNNING ]; then";
134
+      echo '  systemctl start avahi-daemon';
135
+      echo "  echo -n \$CURRENT_DATE >> \$LOGFILE";
136
+      echo "  echo \" Avahi daemon restarted\" >> \$LOGFILE";
137
+      echo 'fi';
138
+      echo '# End of avahi'; } >> "/usr/bin/$WATCHDOG_SCRIPT_NAME"
139
+    chmod +x "/usr/bin/$WATCHDOG_SCRIPT_NAME"
140
+
141
+    # This is a bit of a hack to ensure that avahi services get broadcast
142
+    # Without this some other systems may not be able to see the server
143
+    { echo '#!/bin/bash';
144
+      echo 'systemctl restart avahi-daemon'; } > /usr/bin/restartavahi
145
+    chmod +x /usr/bin/restartavahi
146
+
147
+    cron_add_mins 10 /usr/bin/restartavahi
148
+}
149
+
123
 function install_avahi {
150
 function install_avahi {
124
     if [ "$INSTALLING_MESH" ]; then
151
     if [ "$INSTALLING_MESH" ]; then
125
         mesh_avahi
152
         mesh_avahi

+ 2
- 2
src/freedombone-utils-onion Dosyayı Görüntüle

211
     BLUDIT_DOMAIN_NAME='bludit.local'
211
     BLUDIT_DOMAIN_NAME='bludit.local'
212
     DOKUWIKI_DOMAIN_NAME='dokuwiki.local'
212
     DOKUWIKI_DOMAIN_NAME='dokuwiki.local'
213
     DEFAULT_DOMAIN_NAME="${LOCAL_NAME}.local"
213
     DEFAULT_DOMAIN_NAME="${LOCAL_NAME}.local"
214
-    GIT_DOMAIN_NAME='gogs.local'
214
+    GOGS_DOMAIN_NAME='gogs.local'
215
 }
215
 }
216
 
216
 
217
 function create_avahi_onion_domains {
217
 function create_avahi_onion_domains {
229
         function_check create_avahi_service
229
         function_check create_avahi_service
230
         create_avahi_service blog http tcp "$HTMLY_ONION_PORT"
230
         create_avahi_service blog http tcp "$HTMLY_ONION_PORT"
231
     fi
231
     fi
232
-    if [ $GIT_DOMAIN_NAME ]; then
232
+    if [ $GOGS_DOMAIN_NAME ]; then
233
         function_check create_avahi_service
233
         function_check create_avahi_service
234
         create_avahi_service git http tcp "$GIT_ONION_PORT"
234
         create_avahi_service git http tcp "$GIT_ONION_PORT"
235
     fi
235
     fi

+ 1
- 1
src/freedombone-utils-selector Dosyayı Görüntüle

584
         if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
584
         if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
585
             if [[ "$USERNAME" != "$ADMIN_USERNAME" ]]; then
585
             if [[ "$USERNAME" != "$ADMIN_USERNAME" ]]; then
586
                 if [[ $(user_added_to_app "${USERNAME}" "${app_name}") == "0" ]]; then
586
                 if [[ $(user_added_to_app "${USERNAME}" "${app_name}") == "0" ]]; then
587
-                    valstr=$"Login for user ${USERNAME}="
587
+                    #valstr=$"Login for user ${USERNAME}="
588
                     app_password="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
588
                     app_password="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
589
                     "add_user_${app_name}" "${USERNAME}" "${app_password}"
589
                     "add_user_${app_name}" "${USERNAME}" "${app_password}"
590
                     echo "${app_name}_${USERNAME}" >> "$APP_USERS_FILE"
590
                     echo "${app_name}_${USERNAME}" >> "$APP_USERS_FILE"

+ 3
- 0
src/freedombone-utils-setup Dosyayı Görüntüle

1055
     function_check install_avahi
1055
     function_check install_avahi
1056
     install_avahi
1056
     install_avahi
1057
 
1057
 
1058
+    function_check keep_avahi_running
1059
+    keep_avahi_running
1060
+
1058
     function_check create_avahi_onion_domains
1061
     function_check create_avahi_onion_domains
1059
     create_avahi_onion_domains
1062
     create_avahi_onion_domains
1060
 
1063
 

+ 72
- 7
src/freedombone-utils-web Dosyayı Görüntüle

1143
     # similar to Plinth or the yunohost admin interface
1143
     # similar to Plinth or the yunohost admin interface
1144
     local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
1144
     local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
1145
 
1145
 
1146
-    mkdir -p "/var/www/${local_hostname}/htdocs"
1146
+    if [ ! -d "/var/www/${local_hostname}/htdocs" ]; then
1147
+        mkdir -p "/var/www/${local_hostname}/htdocs"
1148
+    fi
1149
+
1147
     { echo '<html>';
1150
     { echo '<html>';
1148
       echo '  <body>';
1151
       echo '  <body>';
1149
-      echo "  This is a test on $local_hostname";
1152
+      echo "  This is a test on ${local_hostname}";
1150
       echo '  </body>';
1153
       echo '  </body>';
1151
       echo '</html>'; } > "/var/www/${local_hostname}/htdocs/index.html"
1154
       echo '</html>'; } > "/var/www/${local_hostname}/htdocs/index.html"
1152
-    chown -R www-data:www-data "/var/www/${local_hostname}/htdocs"
1153
 
1155
 
1154
     nginx_file=/etc/nginx/sites-available/$local_hostname
1156
     nginx_file=/etc/nginx/sites-available/$local_hostname
1155
     { echo 'server {';
1157
     { echo 'server {';
1156
-      echo '  listen 80;';
1157
-      echo '  listen [::]:80;';
1158
+      echo '  listen 80 default_server;';
1159
+      echo '  #listen [::]:80;';
1158
       echo "  server_name ${local_hostname};";
1160
       echo "  server_name ${local_hostname};";
1159
       echo "  root /var/www/${local_hostname}/htdocs;";
1161
       echo "  root /var/www/${local_hostname}/htdocs;";
1160
       echo '  index index.html;';
1162
       echo '  index index.html;';
1161
-      echo '}'; } > "$nginx_file"
1162
-    nginx_ensite "$local_hostname"
1163
+      echo '';
1164
+      echo '  access_log /dev/null;';
1165
+      echo '  error_log /dev/null;';
1166
+      echo '';
1167
+      echo '  location /icons {';
1168
+      echo '    autoindex on;';
1169
+      echo '    break;';
1170
+      echo '  }';
1171
+      echo '';
1172
+      echo '  rewrite ^/plinth/(.*)$ /api.json last;';
1173
+      echo '';
1174
+      echo '  location / {';
1175
+      echo "    root /var/www/${local_hostname}/htdocs/plinth;";
1176
+      echo '    index api.json /api.json;';
1177
+      echo "    error_page 405 = \$uri;";
1178
+      echo '  }';
1179
+      echo '}';
1180
+      echo '';
1181
+      echo 'server {';
1182
+      echo '  listen 443 default_server ssl;';
1183
+      echo '  #listen [::]:443 ssl;';
1184
+      echo "  server_name ${local_hostname};";
1185
+      echo "  root /var/www/${local_hostname}/htdocs;";
1186
+      echo '  index index.html;';
1187
+      echo '';
1188
+      echo '  access_log /dev/null;';
1189
+      echo '  error_log /dev/null;';
1190
+      echo ''; } > "$nginx_file"
1191
+
1192
+    nginx_ssl "${local_hostname}"
1193
+    nginx_security_options "${local_hostname}"
1194
+
1195
+    { echo '  add_header Strict-Transport-Security max-age=0;';
1196
+      echo '';
1197
+      echo '  location /icons {';
1198
+      echo '    autoindex on;';
1199
+      echo '    break;';
1200
+      echo '  }';
1201
+      echo '';
1202
+      echo '  rewrite ^/plinth/(.*)$ /api.json last;';
1203
+      echo '';
1204
+      echo '  location / {';
1205
+      echo "    root /var/www/${local_hostname}/htdocs/plinth;";
1206
+      echo '    index api.json /api.json;';
1207
+      echo "    error_page 405 = \$uri;";
1208
+      echo '  }';
1209
+      echo '}'; } >> "$nginx_file"
1210
+
1211
+    if [ ! -f "/etc/ssl/certs/${local_hostname}.crt" ]; then
1212
+        "${PROJECT_NAME}-addcert" -h "${local_hostname}" --dhkey "${DH_KEYLENGTH}"
1213
+    fi
1214
+
1215
+    sed -i "s|ssl_certificate .*|ssl_certificate /etc/ssl/certs/${local_hostname}.crt;|g" "$nginx_file"
1216
+    sed -i "s|ssl_certificate_key .*|ssl_certificate_key /etc/ssl/private/${local_hostname}.key;|g" "$nginx_file"
1217
+
1218
+    nginx_ensite "${local_hostname}"
1219
+
1220
+    # Compatibility with FreedomBox android app
1221
+    # The installed apps get published to a json file called api.json
1222
+    # in this directory
1223
+    if [ ! -d "/var/www/${local_hostname}/htdocs/plinth" ]; then
1224
+        mkdir -p "/var/www/${local_hostname}/htdocs/plinth"
1225
+    fi
1226
+
1227
+    chown -R www-data:www-data "/var/www/${local_hostname}/htdocs"
1163
 }
1228
 }
1164
 
1229
 
1165
 # NOTE: deliberately no exit 0
1230
 # NOTE: deliberately no exit 0

+ 33
- 127
website/EN/app_dlna.html Dosyayı Görüntüle

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
-<!-- 2016-11-12 Sat 20:17 -->
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></title>
6
 <title></title>
10
-<meta name="generator" content="Org mode" />
11
-<meta name="author" content="Bob Mottram" />
12
-<meta name="description" content="How to use DLNA"
7
+<!-- 2018-05-25 Fri 23:15 -->
8
+<meta  http-equiv="Content-Type" content="text/html;charset=utf-8" />
9
+<meta  name="generator" content="Org-mode" />
10
+<meta  name="author" content="Bob Mottram" />
11
+<meta  name="description" content="How to use DLNA"
13
  />
12
  />
14
-<meta name="keywords" content="freedombone, dlna" />
13
+<meta  name="keywords" content="freedombone, dlna" />
15
 <style type="text/css">
14
 <style type="text/css">
16
  <!--/*--><![CDATA[/*><!--*/
15
  <!--/*--><![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; }
16
+  .title  { text-align: center; }
23
   .todo   { font-family: monospace; color: red; }
17
   .todo   { font-family: monospace; color: red; }
24
-  .done   { font-family: monospace; color: green; }
25
-  .priority { font-family: monospace; color: orange; }
18
+  .done   { color: green; }
26
   .tag    { background-color: #eee; font-family: monospace;
19
   .tag    { background-color: #eee; font-family: monospace;
27
             padding: 2px; font-size: 80%; font-weight: normal; }
20
             padding: 2px; font-size: 80%; font-weight: normal; }
28
   .timestamp { color: #bebebe; }
21
   .timestamp { color: #bebebe; }
29
   .timestamp-kwd { color: #5f9ea0; }
22
   .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; }
23
+  .right  { margin-left: auto; margin-right: 0px;  text-align: right; }
24
+  .left   { margin-left: 0px;  margin-right: auto; text-align: left; }
25
+  .center { margin-left: auto; margin-right: auto; text-align: center; }
33
   .underline { text-decoration: underline; }
26
   .underline { text-decoration: underline; }
34
   #postamble p, #preamble p { font-size: 90%; margin: .2em; }
27
   #postamble p, #preamble p { font-size: 90%; margin: .2em; }
35
   p.verse { margin-left: 3%; }
28
   p.verse { margin-left: 3%; }
56
     border: 1px solid black;
49
     border: 1px solid black;
57
   }
50
   }
58
   pre.src:hover:before { display: inline;}
51
   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'; }
52
+  pre.src-sh:before    { content: 'sh'; }
53
+  pre.src-bash:before  { content: 'sh'; }
70
   pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
54
   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-java:before { content: 'Java'; }
75
-  pre.src-js:before { content: 'Javascript'; }
76
-  pre.src-latex:before { content: 'LaTeX'; }
77
-  pre.src-ledger:before { content: 'Ledger'; }
78
-  pre.src-lisp:before { content: 'Lisp'; }
79
-  pre.src-lilypond:before { content: 'Lilypond'; }
80
-  pre.src-lua:before { content: 'Lua'; }
81
-  pre.src-matlab:before { content: 'MATLAB'; }
82
-  pre.src-mscgen:before { content: 'Mscgen'; }
83
-  pre.src-ocaml:before { content: 'Objective Caml'; }
84
-  pre.src-octave:before { content: 'Octave'; }
85
-  pre.src-org:before { content: 'Org mode'; }
86
-  pre.src-oz:before { content: 'OZ'; }
87
-  pre.src-plantuml:before { content: 'Plantuml'; }
88
-  pre.src-processing:before { content: 'Processing.js'; }
89
-  pre.src-python:before { content: 'Python'; }
90
-  pre.src-R:before { content: 'R'; }
91
-  pre.src-ruby:before { content: 'Ruby'; }
92
-  pre.src-sass:before { content: 'Sass'; }
93
-  pre.src-scheme:before { content: 'Scheme'; }
94
-  pre.src-screen:before { content: 'Gnu Screen'; }
95
-  pre.src-sed:before { content: 'Sed'; }
96
-  pre.src-sh:before { content: 'shell'; }
97
-  pre.src-sql:before { content: 'SQL'; }
98
-  pre.src-sqlite:before { content: 'SQLite'; }
99
-  /* additional languages in org.el's org-babel-load-languages alist */
100
-  pre.src-forth:before { content: 'Forth'; }
101
-  pre.src-io:before { content: 'IO'; }
102
-  pre.src-J:before { content: 'J'; }
103
-  pre.src-makefile:before { content: 'Makefile'; }
104
-  pre.src-maxima:before { content: 'Maxima'; }
105
-  pre.src-perl:before { content: 'Perl'; }
106
-  pre.src-picolisp:before { content: 'Pico Lisp'; }
107
-  pre.src-scala:before { content: 'Scala'; }
108
-  pre.src-shell:before { content: 'Shell Script'; }
109
-  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
110
-  /* additional language identifiers per "defun org-babel-execute"
111
-       in ob-*.el */
112
-  pre.src-cpp:before  { content: 'C++'; }
113
-  pre.src-abc:before  { content: 'ABC'; }
114
-  pre.src-coq:before  { content: 'Coq'; }
115
-  pre.src-groovy:before  { content: 'Groovy'; }
116
-  /* additional language identifiers from org-babel-shell-names in
117
-     ob-shell.el: ob-shell is the only babel language using a lambda to put
118
-     the execution function name together. */
119
-  pre.src-bash:before  { content: 'bash'; }
120
-  pre.src-csh:before  { content: 'csh'; }
121
-  pre.src-ash:before  { content: 'ash'; }
122
-  pre.src-dash:before  { content: 'dash'; }
123
-  pre.src-ksh:before  { content: 'ksh'; }
124
-  pre.src-mksh:before  { content: 'mksh'; }
125
-  pre.src-posh:before  { content: 'posh'; }
126
-  /* Additional Emacs modes also supported by the LaTeX listings package */
127
-  pre.src-ada:before { content: 'Ada'; }
128
-  pre.src-asm:before { content: 'Assembler'; }
129
-  pre.src-caml:before { content: 'Caml'; }
130
-  pre.src-delphi:before { content: 'Delphi'; }
131
-  pre.src-html:before { content: 'HTML'; }
132
-  pre.src-idl:before { content: 'IDL'; }
133
-  pre.src-mercury:before { content: 'Mercury'; }
134
-  pre.src-metapost:before { content: 'MetaPost'; }
135
-  pre.src-modula-2:before { content: 'Modula-2'; }
136
-  pre.src-pascal:before { content: 'Pascal'; }
137
-  pre.src-ps:before { content: 'PostScript'; }
138
-  pre.src-prolog:before { content: 'Prolog'; }
139
-  pre.src-simula:before { content: 'Simula'; }
140
-  pre.src-tcl:before { content: 'tcl'; }
141
-  pre.src-tex:before { content: 'TeX'; }
142
-  pre.src-plain-tex:before { content: 'Plain TeX'; }
143
-  pre.src-verilog:before { content: 'Verilog'; }
144
-  pre.src-vhdl:before { content: 'VHDL'; }
145
-  pre.src-xml:before { content: 'XML'; }
146
-  pre.src-nxml:before { content: 'XML'; }
147
-  /* add a generic configuration mode; LaTeX export needs an additional
148
-     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
149
-  pre.src-conf:before { content: 'Configuration File'; }
55
+  pre.src-R:before     { content: 'R'; }
56
+  pre.src-perl:before  { content: 'Perl'; }
57
+  pre.src-java:before  { content: 'Java'; }
58
+  pre.src-sql:before   { content: 'SQL'; }
150
 
59
 
151
   table { border-collapse:collapse; }
60
   table { border-collapse:collapse; }
152
   caption.t-above { caption-side: top; }
61
   caption.t-above { caption-side: top; }
153
   caption.t-bottom { caption-side: bottom; }
62
   caption.t-bottom { caption-side: bottom; }
154
   td, th { vertical-align:top;  }
63
   td, th { vertical-align:top;  }
155
-  th.org-right  { text-align: center;  }
156
-  th.org-left   { text-align: center;   }
157
-  th.org-center { text-align: center; }
158
-  td.org-right  { text-align: right;  }
159
-  td.org-left   { text-align: left;   }
160
-  td.org-center { text-align: center; }
64
+  th.right  { text-align: center;  }
65
+  th.left   { text-align: center;   }
66
+  th.center { text-align: center; }
67
+  td.right  { text-align: right;  }
68
+  td.left   { text-align: left;   }
69
+  td.center { text-align: center; }
161
   dt { font-weight: bold; }
70
   dt { font-weight: bold; }
162
-  .footpara { display: inline; }
71
+  .footpara:nth-child(2) { display: inline; }
72
+  .footpara { display: block; }
163
   .footdef  { margin-bottom: 1em; }
73
   .footdef  { margin-bottom: 1em; }
164
   .figure { padding: 1em; }
74
   .figure { padding: 1em; }
165
   .figure p { text-align: center; }
75
   .figure p { text-align: center; }
179
     { font-size: 10px; font-weight: bold; white-space: nowrap; }
89
     { font-size: 10px; font-weight: bold; white-space: nowrap; }
180
   .org-info-js_search-highlight
90
   .org-info-js_search-highlight
181
     { background-color: #ffff00; color: #000000; font-weight: bold; }
91
     { background-color: #ffff00; color: #000000; font-weight: bold; }
182
-  .org-svg { width: 90%; }
183
   /*]]>*/-->
92
   /*]]>*/-->
184
 </style>
93
 </style>
185
 <link rel="stylesheet" type="text/css" href="freedombone.css" />
94
 <link rel="stylesheet" type="text/css" href="freedombone.css" />
235
 <a name="top" id="top"></a>
144
 <a name="top" id="top"></a>
236
 </div>
145
 </div>
237
 <div id="content">
146
 <div id="content">
238
-<div class="org-center">
147
+<h1 class="title"></h1>
239
 
148
 
240
 <div class="figure">
149
 <div class="figure">
241
-<p><img src="images/logo.png" alt="logo.png" />
150
+<p><img src="images/logo.png" alt="logo.png" width="80%" height="10%" align="center" />
242
 </p>
151
 </p>
243
 </div>
152
 </div>
244
-</div>
245
-
246
-<center>
247
-<h1>DLNA</h1>
248
-</center>
249
 
153
 
154
+<div id="outline-container-sec-1" class="outline-2">
155
+<h2 id="sec-1">DLNA</h2>
156
+<div class="outline-text-2" id="text-1">
250
 <p>
157
 <p>
251
 An easy way to play music on any mobile device in your home is to use the DLNA service. Copy your music into a directory called "<i>Music</i>" on an unencrypted USB thumb drive and then insert it into a USB socket on the Freedombone system.
158
 An easy way to play music on any mobile device in your home is to use the DLNA service. Copy your music into a directory called "<i>Music</i>" on an unencrypted USB thumb drive and then insert it into a USB socket on the Freedombone system.
252
 </p>
159
 </p>
256
 </p>
163
 </p>
257
 
164
 
258
 <div class="org-src-container">
165
 <div class="org-src-container">
166
+
259
 <pre class="src src-bash">ssh myusername@mydomain.com -p 2222
167
 <pre class="src src-bash">ssh myusername@mydomain.com -p 2222
260
 </pre>
168
 </pre>
261
 </div>
169
 </div>
269
 </p>
177
 </p>
270
 
178
 
271
 <p>
179
 <p>
272
-If you have an Android device then go to F-Droid (if you don't already have it installed then it can be <a href="https://f-droid.org/">downloaded here</a>) and search for <b>ControlDLNA</b>. On running the app you should see a red Debian icon which you can press on, then you may need to select "local". After a few seconds the list of albums or tracks should then appear and you can browse and play them.
273
-</p>
274
-
275
-<p>
276
 The DLNA service will only work within your local home network, and isn't remotely accessible from other locations via the internet. That can be both a good and a bad thing. Another consideration is that there are <i>no access controls</i> on DLNA services, so any music or videos on the USB drive will be playable by anyone within your home network.
180
 The DLNA service will only work within your local home network, and isn't remotely accessible from other locations via the internet. That can be both a good and a bad thing. Another consideration is that there are <i>no access controls</i> on DLNA services, so any music or videos on the USB drive will be playable by anyone within your home network.
277
 </p>
181
 </p>
278
 </div>
182
 </div>
183
+</div>
184
+</div>
279
 <div id="postamble" class="status">
185
 <div id="postamble" class="status">
280
 
186
 
281
 <style type="text/css">
187
 <style type="text/css">