This commit is contained in:
Bob Mottram 2017-12-15 16:29:26 +00:00
commit cbe2e5a401
32 changed files with 1220 additions and 280 deletions

View File

@ -16,7 +16,7 @@
</center>
#+END_EXPORT
With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as /webm/, /ogv/ and /ogg/.
With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as /webm/, /ogv/ and /ogg/. Another similar system which might be better fitted for small servers is [[./app_peertube.html][PeerTube]], since it uses webtorrent to distribute video files. Webtorrent will only work with WebRTC enabled browsers though.
When hosting media files you should take into consideration that since anyone on the internet can view your content then this could significantly increase your bandwidth usage and overall strain on the server. Also unless you are just hosting images then hardware such as the Beaglebone Black won't be powerful enough for a good user experience when either uploading or playing back videos. It's recommended that you use one of the more powerful quad (or more) core single board computers or an old laptop if you want to run Mediagoblin on it.

View File

@ -45,7 +45,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.x
wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
gpg --verify freedombone-meshclient-i386.img.xz.sig
sha256sum freedombone-meshclient-i386.img.xz
376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8
3e88205461bb2061dc172ff0a1e65e5cae1013f8f7dc26c6d5cbe1c986c98555
unxz freedombone-meshclient-i386.img.xz
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync
@ -61,7 +61,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i
wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
sha256sum freedombone-meshclient-insecure-i386.img.xz
81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf
09c059664daf56d210134735d37e8117bb7b755acc8b9b253cdfa42052249ccb
unxz freedombone-meshclient-insecure-i386.img.xz
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync

View File

@ -28,6 +28,10 @@
When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.
#+BEGIN_CENTER
[[file:images/mesh_initial_login.jpg]]
#+END_CENTER
After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as /Other Users/ and /Chat/.
* Boot trouble
@ -77,7 +81,7 @@ Maybe the internet exists, but you don't care about getting any content from it
In your home directory on a system connected via ethernet to an internet router you'll find a file called *vpn.tar.gz*. If you want another mesh to be able to connect to yours then send them this file and get them to uncompress it into their home directory also on an internet gateway machine. If they have an external IP address or domain name for your router then they will be able to VPN connect using the *Connect Meshes* icon. They should also forward port 653 from their internet router to the mesh gateway machine.
#+BEGIN_CENTER
[[file:images/mesh_connect.jpg]]
[[file:images/mesh_connect.png]]
#+END_CENTER
You should create a new *vpn.tar.gz* file for every other mesh which wants to be able to connect to yours. If you are prompted for a password it is 'freedombone'.
@ -101,7 +105,15 @@ On a typical Android device go to *Settings* then *Security* and ensure that *Un
On some android devices you may need to move the downloaded APK file from the *Downloads* directory to your *home* directory before you can install it.
* Chat System
Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the /Chat/ and /Other Users/ icons appear. Select the users icon and you should see a list of users on the mesh. Select the /Chat/ icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.
Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the /Chat/ and /Other Users/ icons appear. Select the users icon and you should see a list of users on the mesh.
#+BEGIN_CENTER
[[file:images/mesh_peerslist.png]]
#+END_CENTER
Selecting a user followed by the Ok button will copy their Tox ID to the clipboard.
Now select the /Chat/ icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then paste in a Tox ID.
#+BEGIN_CENTER
[[file:images/mesh_paste_tox_id.jpg]]
@ -170,10 +182,10 @@ You can make files publicly available on the network simply by dragging and drop
#+END_CENTER
* Blogging
To create a blog post select the /Blog/ icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the *CreateBlog/content/images* directory and then link to them as shown.
To create a blog post select the /Blog/ icon on the desktop and then select *New blog entry* and *Ok*. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the *CreateBlog/content/images* directory and then link to them as shown.
#+BEGIN_CENTER
[[file:images/mesh_new_blog.jpg]]
[[file:images/mesh_blog.png]]
#+END_CENTER
To finish your blog entry just select /Save/ and then close the editor. On older hardware it may take a while to publish the results, and this depends upon the amount of computation needed by IPFS to create file hashes. If you make no changes to the default text then the new blog entry will not be saved.
@ -186,4 +198,8 @@ To finish your blog entry just select /Save/ and then close the editor. On older
[[file:images/mesh_view_blog.jpg]]
#+END_CENTER
You can also visit other blogs, edit or delete your previous entry and also change your blog theme.
You can also visit other blogs, edit or delete your previous entry and change your blog theme.
#+BEGIN_CENTER
[[file:images/mesh_select_blog_theme.png]]
#+END_CENTER

BIN
img/icon_kdenlive.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
img/icon_photos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/mesh_blog.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
img/mesh_connect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
img/mesh_initial_login.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

BIN
img/mesh_peerslist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -329,12 +329,30 @@ function matrix_generate {
matrix_configure_homeserver_yaml "${turnkey}" $homeserver_config
}
function create_matrix_user_removal_script {
read_config_param MY_USERNAME
read_config_param MATRIX_DOMAIN_NAME
matrix_remove_user=/usr/bin/matrix-remove-user
echo '#!/bin/bash' > $matrix_remove_user
echo "cd $MATRIX_DATA_DIR" >> $matrix_remove_user
echo 'remove_username=$1' >> $matrix_remove_user
echo "ADMIN=\"@${MY_USERNAME}:$MATRIX_DOMAIN_NAME\"" >> $matrix_remove_user
echo 'BUSY="pragma busy_timeout=20000"' >> $matrix_remove_user
echo "BUFFER=\$(sqlite3 homeserver.db \"\$BUSY;select token from access_tokens where user_id like '\$ADMIN' order by id desc limit 1;\")" >> $matrix_remove_user
echo "TOKEN=\$(echo \$BUFFER|awk '{print \$2}')" >> $matrix_remove_user
echo 'set -x' >> $matrix_remove_user
echo "curl -X POST 'https://$MATRIX_DOMAIN_NAME/_matrix/client/r0/admin/deactivate/%40\$remove_username%3A$MATRIX_DOMAIN_NAME?access_token=\$TOKEN' --data '{}'" >> $matrix_remove_user
chmod +x $matrix_remove_user
}
function remove_user_matrix {
remove_username="$1"
create_matrix_user_removal_script
${PROJECT_NAME}-pass -u $remove_username --rmapp matrix
# TODO: There is no user removal script within synapse
$matrix_remove_user "$remove_username"
}
function add_user_matrix {
@ -780,6 +798,7 @@ function install_matrix {
echo $'Failed to add matrix admin user';
exit 879352
fi
create_matrix_user_removal_script
set_completion_param "matrix domain" "$MATRIX_DOMAIN_NAME"

View File

@ -10,6 +10,9 @@
#
# PeerTube server
#
# There's a problem with installing this onto mesh images, which is
# that qemu appears to run out of RAM when using yarn to add webpack.
#
# License
# =======
#
@ -39,6 +42,7 @@ PEERTUBE_REPO="https://github.com/Chocobozzz/PeerTube"
PEERTUBE_COMMIT='fef2c7164e025b12a64185dbab058ef4129733c6'
PEERTUBE_ONION_PORT=8136
PEERTUBE_PORT=9004
MESH_PEERTUBE_PORT=8500
PEERTUBE_DIR=/etc/peertube
peertube_variables=(PEERTUBE_DOMAIN_NAME
@ -479,21 +483,83 @@ function peertube_setup_web {
nginx_ensite $PEERTUBE_DOMAIN_NAME
}
function mesh_peertube_setup_web {
peertube_nginx_file=$rootdir/etc/nginx/sites-available/peertube
echo 'server {' >> $peertube_nginx_file
echo " listen $MESH_PEERTUBE_PORT http2;" >> $peertube_nginx_file
echo ' listen [::]:$MESH_PEERTUBE_PORT http2;' >> $peertube_nginx_file
echo ' server_name $HOSTNAME;' >> $peertube_nginx_file
echo '' >> $peertube_nginx_file
echo ' location / {' >> $peertube_nginx_file
echo " proxy_pass http://localhost:${PEERTUBE_PORT};" >> $peertube_nginx_file
echo ' proxy_set_header X-Real-IP $remote_addr;' >> $peertube_nginx_file
echo ' proxy_set_header Host $host;' >> $peertube_nginx_file
echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $peertube_nginx_file
echo '' >> $peertube_nginx_file
echo ' # For the video upload' >> $peertube_nginx_file
echo ' client_max_body_size 2G;' >> $peertube_nginx_file
echo ' }' >> $peertube_nginx_file
echo '' >> $peertube_nginx_file
echo ' location /static/webseed {' >> $peertube_nginx_file
echo " if (\$request_method = 'OPTIONS') {" >> $peertube_nginx_file
echo " add_header 'Access-Control-Allow-Origin' '*';" >> $peertube_nginx_file
echo " add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';" >> $peertube_nginx_file
echo " add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';" >> $peertube_nginx_file
echo " add_header 'Access-Control-Max-Age' 1728000;" >> $peertube_nginx_file
echo " add_header 'Content-Type' 'text/plain charset=UTF-8';" >> $peertube_nginx_file
echo " add_header 'Content-Length' 0;" >> $peertube_nginx_file
echo ' return 204;' >> $peertube_nginx_file
echo ' }' >> $peertube_nginx_file
echo '' >> $peertube_nginx_file
echo " if (\$request_method = 'GET') {" >> $peertube_nginx_file
echo " add_header 'Access-Control-Allow-Origin' '*';" >> $peertube_nginx_file
echo " add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';" >> $peertube_nginx_file
echo " add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';" >> $peertube_nginx_file
echo ' }' >> $peertube_nginx_file
echo '' >> $peertube_nginx_file
echo " alias $PEERTUBE_DIR/videos;" >> $peertube_nginx_file
echo ' }' >> $peertube_nginx_file
echo '' >> $peertube_nginx_file
echo ' # Websocket tracker' >> $peertube_nginx_file
echo ' location /tracker/socket {' >> $peertube_nginx_file
echo ' # Peers send a message to the tracker every 15 minutes' >> $peertube_nginx_file
echo ' # Dont close the websocket before this time' >> $peertube_nginx_file
echo ' proxy_read_timeout 1200s;' >> $peertube_nginx_file
echo ' proxy_set_header Upgrade $http_upgrade;' >> $peertube_nginx_file
echo ' proxy_set_header Connection "upgrade";' >> $peertube_nginx_file
echo ' proxy_http_version 1.1;' >> $peertube_nginx_file
echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $peertube_nginx_file
echo ' proxy_set_header Host $host;' >> $peertube_nginx_file
echo " proxy_pass http://localhost:${PEERTUBE_PORT};" >> $peertube_nginx_file
echo ' }' >> $peertube_nginx_file
echo '}' >> $peertube_nginx_file
}
function peertube_create_config {
peertube_config_file=$PEERTUBE_DIR/config/production.yaml
peertube_prefix=$1
peertube_config_file=$peertube_prefix$PEERTUBE_DIR/config/production.yaml
echo 'listen:' > $peertube_config_file
echo " port: $PEERTUBE_PORT" >> $peertube_config_file
echo '' >> $peertube_config_file
echo '# Correspond to your reverse proxy "listen" configuration' >> $peertube_config_file
echo 'webserver:' >> $peertube_config_file
if [[ $ONION_ONLY == 'no' ]]; then
echo ' https: true' >> $peertube_config_file
echo " hostname: '$PEERTUBE_DOMAIN_NAME'" >> $peertube_config_file
echo ' port: 443' >> $peertube_config_file
if [ ! $peertube_prefix ]; then
if [[ $ONION_ONLY == 'no' ]]; then
echo ' https: true' >> $peertube_config_file
echo " hostname: '$PEERTUBE_DOMAIN_NAME'" >> $peertube_config_file
echo ' port: 443' >> $peertube_config_file
else
echo ' https: false' >> $peertube_config_file
echo " hostname: '$PEERTUBE_ONION_HOSTNAME'" >> $peertube_config_file
echo ' port: 80' >> $peertube_config_file
fi
else
echo ' https: false' >> $peertube_config_file
echo " hostname: '$PEERTUBE_ONION_HOSTNAME'" >> $peertube_config_file
echo ' port: 80' >> $peertube_config_file
echo " hostname: ''" >> $peertube_config_file
echo " port: $MESH_PEERTUBE_PORT" >> $peertube_config_file
fi
echo '' >> $peertube_config_file
echo '# Your database name will be "peertube"+database.suffix' >> $peertube_config_file
@ -502,7 +568,11 @@ function peertube_create_config {
echo ' port: 5432' >> $peertube_config_file
echo " suffix: ''" >> $peertube_config_file
echo " username: 'peertube'" >> $peertube_config_file
echo " password: '$PEERTUBE_ADMIN_PASSWORD'" >> $peertube_config_file
if [ ! $peertube_prefix ]; then
echo " password: '$PEERTUBE_ADMIN_PASSWORD'" >> $peertube_config_file
else
echo " password: ''" >> $peertube_config_file
fi
echo '' >> $peertube_config_file
echo '# From the project root directory' >> $peertube_config_file
echo 'storage:' >> $peertube_config_file
@ -519,7 +589,7 @@ function peertube_create_config {
echo ' size: 10 # Max number of previews you want to cache' >> $peertube_config_file
echo '' >> $peertube_config_file
echo 'admin:' >> $peertube_config_file
echo " email: '$MY_EMAIL_ADDRESS'" >> $peertube_config_file
echo " email: 'root@local'" >> $peertube_config_file
echo '' >> $peertube_config_file
echo 'signup:' >> $peertube_config_file
echo ' enabled: true' >> $peertube_config_file
@ -543,7 +613,118 @@ function peertube_create_config {
echo ' 1080p: false' >> $peertube_config_file
}
function mesh_install_peertube {
if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then
return
fi
if [[ $ARCHITECTURE != 'x86_64' && $ARCHITECTURE != 'amd64' ]]; then
return
fi
chroot "$rootdir" apt-get -yq install ffmpeg curl
function_check install_postgresql
install_postgresql
if [ -d $rootdir$PEERTUBE_DIR ]; then
rm -rf $rootdir$PEERTUBE_DIR
fi
git clone $PEERTUBE_REPO $rootdir$PEERTUBE_DIR
chroot "$rootdir" groupadd peertube
chroot "$rootdir" useradd -c "PeerTube system account" -d $PEERTUBE_DIR -m -r -g peertube peertube
cd $rootdir$PEERTUBE_DIR
git checkout $PEERTUBE_COMMIT -b $PEERTUBE_COMMIT
get_npm_arch
cat <<EOF > $rootdir/usr/bin/install_peertube
#!/bin/bash
cd $PEERTUBE_DIR
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
apt-get -y update
apt-get -yq install yarn
#npm install --arch=$NPM_ARCH -g yarn
#if [ ! "\$?" = "0" ]; then
# echo $'PeerTube Failed to install yarn'
# exit 79353234
#fi
#npm install --arch=$NPM_ARCH webpack@3.10.0 --no-optional
#if [ ! "\$?" = "0" ]; then
# echo $'PeerTube failed to install webpack'
# exit 68386353
#fi
yarn install
yarn run build:prod
yarn add -D webpack
if [ ! "\$?" = "0" ]; then
echo $'PeerTube failed to add webpack'
exit 67342823
fi
yarn install --ignore-optional
if [ ! "\$?" = "0" ]; then
echo $'PeerTube failed to run yarn install'
exit 63754235
fi
npm install --arch=$NPM_ARCH
if [ ! "\$?" = "0" ]; then
echo $'PeerTube failed to install peertube'
exit 7835243
fi
npm run build --arch=$NPM_ARCH
if [ ! "\$?" = "0" ]; then
echo $'PeerTube failed to build peertube'
exit 5293593
fi
EOF
chmod +x $rootdir/usr/bin/install_peertube
chroot "$rootdir" /usr/bin/install_peertube
if [ ! "$?" = "0" ]; then
echo $'PeerTube install failed'
exit 735638
fi
echo '[Unit]' > $rootdir/etc/systemd/system/peertube.service
echo 'Description=PeerTube Decentralized video streaming platform' >> $rootdir/etc/systemd/system/peertube.service
echo 'After=syslog.target' >> $rootdir/etc/systemd/system/peertube.service
echo 'After=network.target' >> $rootdir/etc/systemd/system/peertube.service
echo '' >> $rootdir/etc/systemd/system/peertube.service
echo '[Service]' >> $rootdir/etc/systemd/system/peertube.service
echo 'User=peertube' >> $rootdir/etc/systemd/system/peertube.service
echo 'Group=peertube' >> $rootdir/etc/systemd/system/peertube.service
echo "WorkingDirectory=$PEERTUBE_DIR" >> $rootdir/etc/systemd/system/peertube.service
echo "ExecStart=/usr/local/bin/npm start" >> $rootdir/etc/systemd/system/peertube.service
echo "ExecStop=/usr/local/bin/npm stop" >> $rootdir/etc/systemd/system/peertube.service
echo 'StandardOutput=syslog' >> $rootdir/etc/systemd/system/peertube.service
echo 'StandardError=syslog' >> $rootdir/etc/systemd/system/peertube.service
echo 'SyslogIdentifier=peertube' >> $rootdir/etc/systemd/system/peertube.service
echo 'Restart=always' >> $rootdir/etc/systemd/system/peertube.service
echo "Environment=NODE_ENV=production" >> $rootdir/etc/systemd/system/peertube.service
echo '' >> $rootdir/etc/systemd/system/peertube.service
echo '[Install]' >> $rootdir/etc/systemd/system/peertube.service
echo 'WantedBy=multi-user.target' >> $rootdir/etc/systemd/system/peertube.service
peertube_create_config $rootdir
chroot "$rootdir" chown -R peertube:peertube $PEERTUBE_DIR
mesh_peertube_setup_web
}
function install_peertube {
if [[ $VARIANT == "mesh"* ]]; then
mesh_install_peertube
return
fi
if [[ $ARCHITECTURE != 'x86_64' && $ARCHITECTURE != 'amd64' ]]; then
return
fi
if [ ! $ONION_ONLY ]; then
ONION_ONLY='no'
fi

View File

@ -275,6 +275,13 @@ function pelican_delete_blog {
esac
}
function pelican_remove_bad_blog_links {
current_theme=$1
if [ -f $PELICAN_BLOG_INSTALL_DIR/themes/$current_theme/static/css/style.css ]; then
sed -i '/googleapi/d' $PELICAN_BLOG_INSTALL_DIR/themes/$current_theme/static/css/style.css
fi
}
function pelican_change_theme {
THEMES=()
for d in $PELICAN_BLOG_INSTALL_DIR/themes/*/ ; do
@ -323,6 +330,7 @@ function pelican_change_theme {
CHOSEN_THEME_INDEX=$((CHOSEN_THEME_INDEX - 1))
CHOSEN_THEME=${THEMES[$CHOSEN_THEME_INDEX]}
pelican_remove_bad_blog_links $CHOSEN_THEME
if grep -q "THEME=" $PELICAN_BLOG_INSTALL_DIR/pelicanconf.py; then
sed -i "s|THEME=.*|THEME='themes/${CHOSEN_THEME}'|g" $PELICAN_BLOG_INSTALL_DIR/pelicanconf.py
else
@ -733,6 +741,14 @@ function pelican_themes {
git clone https://github.com/samael500/w3-personal-blog
git clone https://github.com/jarv/water-iris
git clone https://github.com/kplaube/yapeme
# remove any dubious css
for d in */ ; do
THEME_NAME=$(echo "$d" | awk -F '/' '{print $1}')
if [ -d $d/static/css/style.css ]; then
sed -i '/googleapi/d' $d/static/css/style.css
fi
done
}
function mesh_install_pelican {

View File

@ -33,9 +33,9 @@ VARIANTS='full full-vim chat'
IN_DEFAULT_INSTALL=0
SHOW_ON_ABOUT=1
RIOT_VERSION='0.13.0'
RIOT_VERSION='0.13.3'
RIOT_FILENAME="riot-v${RIOT_VERSION}"
RIOT_HASH='b65535c4c3bfe6407b491f55df238847884ab83a9d5cbdd1f8b4d6e31cbb5870'
RIOT_HASH='bcd6c2f4be018612ac76a71b58749a5edab1e02de7d145a22d9b9aa6e6a89129'
RIOT_DOWNLOAD_URL="https://github.com/vector-im/riot-web/releases/download/v${RIOT_VERSION}"
RIOT_ONION_PORT=8115
RIOT_ONION_HOSTNAME=

View File

@ -35,10 +35,17 @@ IN_DEFAULT_INSTALL=0
SHOW_ON_ABOUT=0
SHOW_ICANN_ADDRESS_ON_ABOUT=0
SCUTTLEBOT_DOMAIN_NAME=
SCUTTLEBOT_CODE=
SCUTTLEBOT_VERSION='10.4.6'
SCUTTLEBOT_PORT=8010
SCUTTLEBOT_ONION_PORT=8623
GIT_SSB_PORT=7718
NGINX_GIT_SSB_PORT=7719
scuttlebot_variables=(MY_USERNAME
SCUTTLEBOT_DOMAIN_NAME
SCUTTLEBOT_CODE
DEFAULT_DOMAIN_NAME
SYSTEM_TYPE)
@ -91,7 +98,13 @@ function add_user_scuttlebot {
}
function install_interactive_scuttlebot {
echo -n ''
if [[ $ONION_ONLY != "no" ]]; then
SCUTTLEBOT_DOMAIN_NAME='scuttlebot.local'
write_config_param "SCUTTLEBOT_DOMAIN_NAME" "$SCUTTLEBOT_DOMAIN_NAME"
else
function_check interactive_site_details
interactive_site_details scuttlebot
fi
APP_INSTALLED=1
}
@ -180,9 +193,18 @@ function restore_remote_scuttlebot {
function remove_scuttlebot {
firewall_remove ${SCUTTLEBOT_PORT}
firewall_remove ${GIT_SSB_PORT}
if [ $SCUTTLEBOT_DOMAIN_NAME ]; then
nginx_dissite ${SCUTTLEBOT_DOMAIN_NAME}
rm /etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME}
fi
systemctl stop git_ssb
systemctl stop scuttlebot
systemctl disable git_ssb
systemctl disable scuttlebot
rm /etc/systemd/system/git_ssb.service
rm /etc/systemd/system/scuttlebot.service
systemctl daemon-reload
@ -191,15 +213,142 @@ function remove_scuttlebot {
if [ -d /etc/scuttlebot ]; then
rm -rf /etc/scuttlebot
fi
if [ -f /usr/bin/git-ssb-create ]; then
rm /usr/bin/git-ssb-create
fi
remove_completion_param install_scuttlebot
sed -i '/scuttlebot /d' $COMPLETION_FILE
}
function git_ssb_script {
if [[ "$1" == "mesh" ]]; then
git_ssb_script_name=$rootdir/usr/bin/git-ssb-create
else
git_ssb_script_name=/usr/bin/git-ssb-create
fi
echo '#!/bin/bash' > $git_ssb_script_name
echo 'reponame="$1"' >> $git_ssb_script_name
echo '' >> $git_ssb_script_name
echo 'if [[ "$reponame" != "" ]]; then' >> $git_ssb_script_name
echo ' mkdir $reponame' >> $git_ssb_script_name
echo ' cd $reponame' >> $git_ssb_script_name
echo ' git init' >> $git_ssb_script_name
echo ' git ssb create ssb $reponame' >> $git_ssb_script_name
echo ' git push --tags ssb master' >> $git_ssb_script_name
echo 'fi' >> $git_ssb_script_name
echo 'exit 0' >> $git_ssb_script_name
chmod +x $git_ssb_script_name
}
function scuttlebot_git_setup {
if [[ "$1" == "mesh" ]]; then
if [ ! -d $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight ]; then
mkdir $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight
fi
if [ ! -f $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css ]; then
echo $'Could not find foundation.css'
exit 347687245
fi
cp $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight/foundation.css
git_ssb_nginx_site=$rootdir/etc/nginx/sites-available/git_ssb
echo 'server {' > $git_ssb_nginx_site
echo " listen $NGINX_GIT_SSB_PORT default_server;" >> $git_ssb_nginx_site
echo " server_name P${PEER_ID}.local;" >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' access_log /dev/null;' >> $git_ssb_nginx_site
echo ' error_log /dev/null;' >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' add_header X-XSS-Protection "1; mode=block";' >> $git_ssb_nginx_site
echo ' add_header X-Content-Type-Options nosniff;' >> $git_ssb_nginx_site
echo ' add_header X-Frame-Options SAMEORIGIN;' >> $git_ssb_nginx_site
else
if [ ! $SCUTTLEBOT_DOMAIN_NAME ]; then
exit 7357225
fi
if [ ! -d /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight ]; then
mkdir /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight
fi
if [ ! -f /usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css ]; then
echo $'Could not find foundation.css'
exit 347687245
fi
cp /usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight/foundation.css
git_ssb_nginx_site=/etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME}
function_check nginx_http_redirect
nginx_http_redirect $SCUTTLEBOT_DOMAIN_NAME "index index.html"
echo 'server {' >> $git_ssb_nginx_site
echo ' listen 443 ssl;' >> $git_ssb_nginx_site
echo ' listen [::]:443 ssl;' >> $git_ssb_nginx_site
echo " server_name $SCUTTLEBOT_DOMAIN_NAME;" >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
function_check nginx_compress
nginx_compress $SCUTTLEBOT_DOMAIN_NAME
echo '' >> $git_ssb_nginx_site
echo ' # Security' >> $git_ssb_nginx_site
function_check nginx_ssl
nginx_ssl $SCUTTLEBOT_DOMAIN_NAME
function_check nginx_disable_sniffing
nginx_disable_sniffing $SCUTTLEBOT_DOMAIN_NAME
fi
echo '' >> $git_ssb_nginx_site
echo ' root /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web;' >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' location = / {' >> $git_ssb_nginx_site
echo " proxy_pass http://localhost:${GIT_SSB_PORT};" >> $git_ssb_nginx_site
echo ' proxy_set_header X-Real-IP $remote_addr;' >> $git_ssb_nginx_site
echo ' proxy_set_header Host $host;' >> $git_ssb_nginx_site
echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $git_ssb_nginx_site
echo ' proxy_http_version 1.1;' >> $git_ssb_nginx_site
echo ' proxy_set_header Upgrade $http_upgrade;' >> $git_ssb_nginx_site
echo ' proxy_set_header Connection upgrade;' >> $git_ssb_nginx_site
echo ' }' >> $git_ssb_nginx_site
echo '}' >> $git_ssb_nginx_site
if [ $SCUTTLEBOT_ONION_HOSTNAME ]; then
echo '' >> $git_ssb_nginx_site
echo 'server {' >> $git_ssb_nginx_site
echo " listen 127.0.0.1:${SCUTTLEBOT_ONION_PORT} default_server;" >> $git_ssb_nginx_site
echo " server_name ${SCUTTLEBOT_ONION_HOSTNAME};" >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' access_log /dev/null;' >> $git_ssb_nginx_site
echo ' error_log /dev/null;' >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' add_header X-XSS-Protection "1; mode=block";' >> $git_ssb_nginx_site
echo ' add_header X-Content-Type-Options nosniff;' >> $git_ssb_nginx_site
echo ' add_header X-Frame-Options SAMEORIGIN;' >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' root /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web;' >> $git_ssb_nginx_site
echo '' >> $git_ssb_nginx_site
echo ' location = / {' >> $git_ssb_nginx_site
echo " proxy_pass http://localhost:${GIT_SSB_PORT};" >> $git_ssb_nginx_site
echo ' proxy_set_header X-Real-IP $remote_addr;' >> $git_ssb_nginx_site
echo ' proxy_set_header Host $host;' >> $git_ssb_nginx_site
echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $git_ssb_nginx_site
echo ' proxy_http_version 1.1;' >> $git_ssb_nginx_site
echo ' proxy_set_header Upgrade $http_upgrade;' >> $git_ssb_nginx_site
echo ' proxy_set_header Connection upgrade;' >> $git_ssb_nginx_site
echo ' }' >> $git_ssb_nginx_site
echo '}' >> $git_ssb_nginx_site
fi
nginx_ensite git_ssb
}
function mesh_install_scuttlebot {
SCUTTLEBOT_ONION_HOSTNAME=
get_npm_arch
cat <<EOF > $rootdir/usr/bin/install_scuttlebot
#!/bin/bash
npm install -g scuttlebot@${SCUTTLEBOT_VERSION}
npm install --arch=$NPM_ARCH -g scuttlebot@${SCUTTLEBOT_VERSION}
npm install --arch=$NPM_ARCH -g git-ssb
npm install --arch=$NPM_ARCH -g git-remote-ssb
EOF
chroot "$rootdir" /bin/chmod +x /usr/bin/install_scuttlebot
chroot "$rootdir" /usr/bin/install_scuttlebot
@ -234,6 +383,9 @@ EOF
echo '' >> $rootdir/etc/systemd/system/scuttlebot.service
echo '[Install]' >> $rootdir/etc/systemd/system/scuttlebot.service
echo 'WantedBy=multi-user.target' >> $rootdir/etc/systemd/system/scuttlebot.service
scuttlebot_git_setup mesh
git_ssb_script mesh
}
function install_scuttlebot {
@ -245,6 +397,9 @@ function install_scuttlebot {
exit 528253
fi
npm install -g git-ssb
npm install -g git-remote-ssb
if [ ! -d /etc/scuttlebot ]; then
mkdir -p /etc/scuttlebot
fi
@ -270,6 +425,24 @@ function install_scuttlebot {
echo '[Install]' >> /etc/systemd/system/scuttlebot.service
echo 'WantedBy=multi-user.target' >> /etc/systemd/system/scuttlebot.service
echo '[Unit]' > /etc/systemd/system/git_ssb.service
echo 'Description=Git SSB (SSB git web interface)' >> /etc/systemd/system/git_ssb.service
echo 'After=syslog.target' >> /etc/systemd/system/git_ssb.service
echo 'After=network.target' >> /etc/systemd/system/git_ssb.service
echo 'After=scuttlebot.target' >> /etc/systemd/system/git_ssb.service
echo '' >> /etc/systemd/system/git_ssb.service
echo '[Service]' >> /etc/systemd/system/git_ssb.service
echo 'Type=simple' >> /etc/systemd/system/git_ssb.service
echo 'User=scuttlebot' >> /etc/systemd/system/git_ssb.service
echo 'Group=scuttlebot' >> /etc/systemd/system/git_ssb.service
echo "WorkingDirectory=/etc/scuttlebot" >> /etc/systemd/system/git_ssb.service
echo "ExecStart=/usr/bin/git ssb web --public localhost:$GIT_SSB_PORT" >> /etc/systemd/system/git_ssb.service
echo 'Restart=always' >> /etc/systemd/system/git_ssb.service
echo 'Environment="USER=scuttlebot"' >> /etc/systemd/system/git_ssb.service
echo '' >> /etc/systemd/system/git_ssb.service
echo '[Install]' >> /etc/systemd/system/git_ssb.service
echo 'WantedBy=multi-user.target' >> /etc/systemd/system/git_ssb.service
chown -R scuttlebot:scuttlebot /etc/scuttlebot
# files gw_name myhostname mdns4_minimal [NOTFOUND=return] dns
@ -279,6 +452,9 @@ function install_scuttlebot {
systemctl enable scuttlebot.service
systemctl daemon-reload
systemctl start scuttlebot.service
systemctl enable git_ssb.service
systemctl daemon-reload
systemctl start git_ssb.service
sleep 3
@ -309,6 +485,17 @@ function install_scuttlebot {
systemctl restart scuttlebot.service
firewall_add scuttlebot ${SCUTTLEBOT_PORT}
firewall_add git_ssb ${GIT_SSB_PORT}
SCUTTLEBOT_ONION_HOSTNAME=$(add_onion_service scuttlebot 80 ${SCUTTLEBOT_ONION_PORT})
scuttlebot_git_setup
git_ssb_script
function_check create_site_certificate
create_site_certificate ${SCUTTLEBOT_DOMAIN_NAME} 'yes'
systemctl restart nginx
if ! grep -q "scuttlebot version:" ${COMPLETION_FILE}; then
echo "scuttlebot version:${SCUTTLEBOT_VERSION}" >> ${COMPLETION_FILE}

View File

@ -28,7 +28,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
VARIANTS='full full-vim social'
VARIANTS=''
IN_DEFAULT_INSTALL=0
SHOW_ON_ABOUT=1

View File

@ -645,9 +645,9 @@ function xmpp_onion_addresses {
echo ' ["jabber-germany.de"] = "dbbrphko5tqcpar3.onion";' >> $filename
echo ' ["kode.im"] = "ihkw7qy3tok45dun.onion";' >> $filename
echo ' ["im.koderoot.net"] = "ihkw7qy3tok45dun.onion";' >> $filename
echo ' ["adb-centralen.se"] = "37x6i3wgr2jyublb.onion";' >> $filename
echo ' ["adb-centralen.se"] = "qai7jjjnhbrdiexf.onion";' >> $filename
echo ' ["joelpurra.se"] = "37x6i3wgr2jyublb.onion";' >> $filename
echo ' ["nordberg.se"] = "37x6i3wgr2jyublb.onion";' >> $filename
echo ' ["nordberg.se"] = "qai7jjjnhbrdiexf.onion";' >> $filename
echo ' ["jabber.lqdn.fr"] = "jabber63t4r2qi57.onion";' >> $filename
echo ' ["jabber.otr.im"] = "5rgdtlawqkcplz75.onion";' >> $filename
echo ' ["otromundo.cf"] = "arauemwe2utqqzye.onion";' >> $filename

View File

@ -69,7 +69,7 @@ TEMPBUILD_DIR=~/.tmp_${PROJECT_NAME}_build
VMDEBOOTSTRAP_REPO=git://git.liw.fi/vmdebootstrap
VMDEBOOTSTRAP_VERSION=0.8
MAKEFILE=${PROJECT_NAME}-image-makefile
IMAGE_SIZE=7.8G
IMAGE_SIZE=7.9G
IMAGE_SIZE_SPECIFIED=
IMAGE_NAME='full'
@ -544,7 +544,7 @@ if [[ $VARIANT == 'meshclient' || $VARIANT == 'meshusb' ]]; then
fi
if [ ! $IMAGE_SIZE_SPECIFIED ]; then
IMAGE_SIZE=7.5G
IMAGE_SIZE=7.9G
fi
fi

View File

@ -99,7 +99,8 @@ INSECURE='no'
MESH_DESKTOP_BACKGROUND_IMAGE=/usr/local/share/${PROJECT_NAME}_mesh_initial_background.png
# The browser application to use
BROWSER=midori
BROWSER=firefox
BROWSER_OPTIONS='-url'
MESH_INSTALL_DIR=/var/lib
@ -587,7 +588,8 @@ cd /etc/patchwork
npm install --arch=$NPM_ARCH --build-from-source
npm install --arch=$NPM_ARCH --save-dev electron-rebuild
./node_modules/.bin/electron-rebuild
npm install --arch=$NPM_ARCH git-ssb
npm install --arch=$NPM_ARCH -g git-ssb --registry=http://localhost:8043/
#npm install --arch=$NPM_ARCH git-ssb
EOF
chroot "$rootdir" /bin/chmod +x /usr/bin/install_patchwork
chroot "$rootdir" /usr/bin/install_patchwork
@ -704,6 +706,7 @@ initialise_mesh() {
install_web_server
install_pelican
mesh_install_cryptpad
#mesh_install_peertube
if [ $ENABLE_ZERONET ]; then
install_zeronet
fi
@ -787,7 +790,7 @@ function mesh_client_startup_applications {
echo '' >> $START_DESKTOP
echo 'INITIAL_TOX_USERNAME=""' >> $START_DESKTOP
echo 'while [ ${#INITIAL_TOX_USERNAME} -eq 0 ]; do' >> $START_DESKTOP
echo " data=\$(zenity --forms --title=\"$MESH_TITLE\" --text=\"$MESH_SET_USERNAME\" --separator=\",\" --add-entry=\"Username\")" >> $START_DESKTOP
echo " data=\$(zenity --entry --title=\"$MESH_TITLE\" --text=\"$MESH_SET_USERNAME\")" >> $START_DESKTOP
echo ' accepted=$?' >> $START_DESKTOP
echo ' if ((accepted == 0)); then' >> $START_DESKTOP
echo " INITIAL_TOX_USERNAME=\$(awk -F, '{print \$1}' <<<\$data)" >> $START_DESKTOP
@ -878,8 +881,10 @@ function configure_user_interface {
# clipboard
chroot "$rootdir" apt-get -yq install xclip
# audio recording
# multimedia recording and editing
chroot "$rootdir" apt-get -yq install audacity
chroot "$rootdir" apt-get -yq install shotwell
chroot "$rootdir" apt-get -yq install kdenlive breeze-icon-theme
# for gtk dialog entry
chroot "$rootdir" apt-get -yq install zenity
@ -887,6 +892,9 @@ function configure_user_interface {
# Produce a text file on the desktop listing users on the mesh
cat <<EOF > $rootdir/usr/bin/list-tox-users
#!/bin/bash
StrMeshUsers=\$"Mesh Users"
StrUsername=\$'Username'
StrToxID=\$'Tox ID'
ethernet_connected=\$(cat /sys/class/net/eth0/carrier)
users_list=\$(lstox | awk -F ' ' '{\$1=""; print \$0}' | sed -e 's/^[[:space:]]*//' | sort -d | uniq)
if [ \${#users_list} -eq 0 ]; then
@ -898,13 +906,25 @@ if [ \$no_of_users -gt 0 ]; then
echo "\$users_list" > /tmp/Users.txt
chown $MY_USERNAME:$MY_USERNAME /tmp/Users.txt
echo 'showing_users=\$(ps aux | grep $MESH_TEXT_EDITOR | grep "Users.txt")' > /home/$MY_USERNAME/showusers
echo 'if [ \${#showing_users} -eq 0 ]; then' >> /home/$MY_USERNAME/showusers
echo ' $MESH_TEXT_EDITOR /tmp/Users.txt' >> /home/$MY_USERNAME/showusers
echo 'fi' >> /home/$MY_USERNAME/showusers
echo 'exit 0' >> /home/$MY_USERNAME/showusers
chmod +x /home/$MY_USERNAME/showusers
chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/showusers
if [ ! -f /home/$MY_USERNAME/showusers ]; then
echo '#!/bin/bash' > /home/$MY_USERNAME/showusers
echo 'data=\$(' >> /home/$MY_USERNAME/showusers
echo 'cat /tmp/Users.txt | \' >> /home/$MY_USERNAME/showusers
echo " awk -F ' ' '{" >> /home/$MY_USERNAME/showusers
echo ' for(i=1;i<=NF;i++){' >> /home/$MY_USERNAME/showusers
echo ' print \$i;' >> /home/$MY_USERNAME/showusers
echo ' }' >> /home/$MY_USERNAME/showusers
echo "}' | \\\\" >> /home/$MY_USERNAME/showusers
echo ' zenity --list \' >> /home/$MY_USERNAME/showusers
echo " --title='\$StrMeshUsers' \\\\" >> /home/$MY_USERNAME/showusers
echo " --column='\$StrUsername' --column='\$StrToxID' \\\\" >> /home/$MY_USERNAME/showusers
echo ' --print-column=2 --hide-column=2 --width=250 --height=400)' >> /home/$MY_USERNAME/showusers
echo 'if [ ! \$data ]; then' >> /home/$MY_USERNAME/showusers
echo ' exit 0' >> /home/$MY_USERNAME/showusers
echo 'fi' >> /home/$MY_USERNAME/showusers
echo 'echo "\$data" | xclip -selection clipboard' >> /home/$MY_USERNAME/showusers
chmod +x /home/$MY_USERNAME/showusers
fi
echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/Users.desktop
if [ \$no_of_users -lt 2 ]; then
@ -946,7 +966,7 @@ if [ \$no_of_users -gt 0 ]; then
echo 'Comment[it]=Editing collaborativo di documenti in tempo reale' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo 'Comment[ru]=Совместное редактирование документов в режиме реального времени' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo 'Comment[zh]=实时协同编辑文件' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo "Exec=$BROWSER http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo "Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
@ -954,7 +974,38 @@ if [ \$no_of_users -gt 0 ]; then
chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop
else
if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then
sed -i "s|Exec=.*|Exec=$BROWSER http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop
sed -i "s|Exec=.*|Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop
fi
fi
fi
if [ -d /etc/peertube ]; then
if [ ! -f /home/$MY_USERNAME/.peertube.desktop ]; then
if [ ! -f /home/$MY_USERNAME/Desktop/peertube.desktop ]; then
echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Name=PeerTube' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment=Upload and view videos on the mesh' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[el]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[ar]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[ca]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[hi]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[fr]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[de]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[es]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[it]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[ru]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Comment[zh]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo "Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT" >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_peertube.png" >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/peertube.desktop
echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/peertube.desktop
chmod +x /home/$MY_USERNAME/Desktop/peertube.desktop
chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/peertube.desktop
else
if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/peertube.desktop; then
sed -i "s|Exec=.*|Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT|g" /home/$MY_USERNAME/Desktop/peertube.desktop
fi
fi
fi
fi
@ -1030,7 +1081,7 @@ if [ \$no_of_users -gt 0 ]; then
echo "Comment[it]=Collegarsi ad un'altra rete di maglie via internet" >> /home/$MY_USERNAME/Desktop/vpn.desktop
echo 'Comment[ru]=Подключение к другой сети с сетью через Интернет' >> /home/$MY_USERNAME/Desktop/vpn.desktop
echo 'Comment[zh]=通过互联网连接到另一个网状网络' >> /home/$MY_USERNAME/Desktop/vpn.desktop
echo 'Exec=mate-terminal --full-screen -e /usr/local/bin/${PROJECT_NAME}-mesh-connect' >> /home/$MY_USERNAME/Desktop/vpn.desktop
echo 'Exec=/usr/local/bin/${PROJECT_NAME}-mesh-connect' >> /home/$MY_USERNAME/Desktop/vpn.desktop
echo 'Icon=/usr/share/$PROJECT_NAME/avatars/icon_connect.png' >> /home/$MY_USERNAME/Desktop/vpn.desktop
echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/vpn.desktop
chmod +x /home/$MY_USERNAME/Desktop/vpn.desktop
@ -1062,7 +1113,7 @@ if [ \$no_of_users -gt 0 ]; then
echo "Comment[it]=Visita un sito" >> /home/$MY_USERNAME/Desktop/sites.desktop
echo "Comment[ru]=Посетите сайт" >> /home/$MY_USERNAME/Desktop/sites.desktop
echo "Comment[zh]=访问网站" >> /home/$MY_USERNAME/Desktop/sites.desktop
echo 'Exec=mate-terminal --full-screen -e /usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop
echo 'Exec=/usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop
echo 'Icon=/usr/share/$PROJECT_NAME/avatars/icon_sites.png' >> /home/$MY_USERNAME/Desktop/sites.desktop
echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/sites.desktop
chmod +x /home/$MY_USERNAME/Desktop/sites.desktop
@ -1092,7 +1143,7 @@ if [ \$no_of_users -gt 0 ]; then
echo 'Comment[it]=Visualizza o crea voci di blog' >> /home/$MY_USERNAME/Desktop/blog.desktop
echo 'Comment[ru]=Просмотр или создание записей в блоге' >> /home/$MY_USERNAME/Desktop/blog.desktop
echo 'Comment[zh]=查看或创建博客条目' >> /home/$MY_USERNAME/Desktop/blog.desktop
echo 'Exec=mate-terminal --full-screen -e /usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop
echo 'Exec=/usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop
echo 'Icon=/usr/share/$PROJECT_NAME/avatars/icon_blog.png' >> /home/$MY_USERNAME/Desktop/blog.desktop
echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/blog.desktop
chmod +x /home/$MY_USERNAME/Desktop/blog.desktop
@ -1250,7 +1301,7 @@ EOF
fi
# browser
chroot "$rootdir" apt-get -yq install $BROWSER
chroot "$rootdir" apt-get -yq install firefox-esr
# help
mkdir -p $rootdir/home/${MY_USERNAME}/help/images

View File

@ -32,8 +32,8 @@ export TEXTDOMAIN=${PROJECT_NAME}-image-mesh
export TEXTDOMAINDIR="/usr/share/locale"
# The browser application to use
BROWSER=midori
BROWSER_OPTIONS='-p'
BROWSER=firefox
BROWSER_OPTIONS='-private -url'
MY_USERNAME='fbone'
PEER_ID=
@ -88,6 +88,59 @@ SCUTTLEBOT_PORT=8010
CRYPTPAD_PORT=9003
CRYPTPAD_DIR=/etc/cryptpad
PEERTUBE_DIR=/etc/peertube
function run_system_query_postgresql {
query=$1
cd /etc/postgresql
sudo -u postgres psql -c "$query"
}
function create_password {
openssl rand -base64 32 | tr -dc A-Za-z0-9 | head -c ${1} ; echo -n ''
}
function enable_peertube {
if [ ! -d $PEERTUBE_DIR ]; then
return
fi
PEERTUBE_ADMIN_PASSWORD="$(create_password 10)"
if [ -d $PEERTUBE_DIR/videos ]; then
rm -rf $PEERTUBE_DIR/videos/*
fi
if [ -d $PEERTUBE_DIR/thumbnails ]; then
rm -rf $PEERTUBE_DIR/thumbnails/*
fi
systemctl restart postgresql
run_system_query_postgresql "DROP DATABASE peertube;"
run_system_query_postgresql "CREATE USER peertube WITH PASSWORD '$PEERTUBE_ADMIN_PASSWORD';"
run_system_query_postgresql "CREATE DATABASE peertube OWNER peertube;"
run_system_query_postgresql "GRANT ALL PRIVILEGES ON DATABASE peertube to peertube;"
run_system_query_postgresql "set statement_timeout to 40000;"
peertube_config_file=$PEERTUBE_DIR/config/production.yaml
sed -i "s|hostname:.*|hostname: 'P$PEER_ID.local'|g" $peertube_config_file
sed -i "s|password:.*|password: '$PEERTUBE_ADMIN_PASSWORD'|g" $peertube_config_file
peertube_nginx_file=/etc/nginx/sites-available/peertube
sed -i "s|server_name.*|server_name P$PEER_ID.local;|g" $peertube_nginx_file
chown -R peertube:peertube $PEERTUBE_DIR
# Set up the web server
ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube
if [ -f /etc/nginx/sites-enabled/default ]; then
rm /etc/nginx/sites-enabled/default
fi
systemctl enable peertube
systemctl daemon-reload
systemctl start peertube
}
function enable_cryptpad {
if [ ! -d $CRYPTPAD_DIR ]; then
return
@ -95,7 +148,9 @@ function enable_cryptpad {
# Set up the web server
ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/cryptpad
rm /etc/nginx/sites-enabled/default
if [ -f /etc/nginx/sites-enabled/default ]; then
rm /etc/nginx/sites-enabled/default
fi
if [ ! -d $CRYPTPAD_DIR/customize/api ]; then
mkdir -p $CRYPTPAD_DIR/customize/api
@ -391,7 +446,7 @@ function show_desktop_icons {
echo "Comment[it]=Crea una nuova identità" >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo "Comment[ru]=Создайте новое удостоверение личности" >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo "Comment[zh]=创建一个新的身份" >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo "Exec=mate-terminal --full-screen -e ${PROJECT_NAME}-mesh-reset" >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo "Exec=${PROJECT_NAME}-mesh-reset" >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo "Icon=/usr/share/${PROJECT_NAME}/avatars/icon_new_identity.png" >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/new_identity.desktop
echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/new_identity.desktop
@ -425,6 +480,324 @@ function show_desktop_icons {
echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/social.desktop
echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/social.desktop
cp /root/${PROJECT_NAME}/img/icon_kdenlive.png /usr/share/${PROJECT_NAME}/avatars/icon_kdenlive.png
echo '#!/usr/bin/env xdg-open' > /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo '# KDE Config File' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo '' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo '[Desktop Entry]' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ast]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[bs]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ca]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ca@valencia]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[cs]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[da]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[de]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[el]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[en_GB]=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[es]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[et]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[fi]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[fr]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ga]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[gl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[hu]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[it]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ja]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[km]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[lt]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[lv]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[mr]=के-डि-एनलाइव्ह' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[nb]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[nds]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[nl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[nn]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[pl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[pt]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[pt_BR]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ro]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ru]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[sk]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[sl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[sv]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[tr]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[ug]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[uk]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[x-test]=xxKdenlivexx' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[zh_CN]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Name[zh_TW]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ar]=محرّر فيديوهات' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ast]=Editor de videu' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[bs]=Video uređivač' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ca]=Editor de vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ca@valencia]=Editor de vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[cs]=Editor videí' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[da]=Videoredigering' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[de]=Video-Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[el]=Επεξεργαστής βίντεο' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[en_GB]=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[es]=Editor de video' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[et]=Videoredaktor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[fi]=Videomuokkain' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[fr]=Éditeur vidéo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ga]=Eagarthóir Físe' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[gl]=Editor de vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[hu]=Videoszerkesztő' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[it]=Editor video' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ja]=ビデオエディタ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[km]=កម្មវិធី​កែសម្រួល​វីដេអូ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[lt]=Video redaktorius' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[lv]=Video redaktors' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[mr]=व्हिडीओ संपादक' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[nb]=Videoredigeringsprogram' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[nl]=Video-bewerker' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[nn]=Videoredigering' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[pl]=Edytor wideo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[pt]=Editor de Víde' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[pt_BR]=Editor de Vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ro]=Redactor de imagini' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[ru]=Видеоредактор' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[sk]=Editor videa' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[sl]=Urejevalnik videa' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[sv]=Videoeditor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[tr]=Video Düzenleyici' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[uk]=Відеоредактор' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[x-test]=xxVideo Editorxx' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[zh_CN]=视频编辑器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'GenericName[zh_TW]=影像編輯器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment=Nonlinear video editor for KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ar]=محرّر فيديوهات غير خطّيّ لكدي' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ast]=Editor de videu non llinial pa KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[bs]=Nelinearni video uređivač za KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ca]=Editor de vídeo no lineal per al KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ca@valencia]=Editor de vídeo no lineal per al KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[cs]=Nelineární editor videí pro KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[da]=Ikke-lineær videoredigering til KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[de]=Nichtlinearer Video-Editor für KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[el]=Μη γραμμικός επεξεργαστής βίντεο για το KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[en_GB]=Nonlinear video editor for KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[es]=Editor no lineal de video para KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[et]=KDE mittelineaarne videoredaktor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[fi]=Epälineaarinen videomuokkain KDE:lle' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[fr]=Éditeur vidéo non linéaire pour KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[gl]=Editor de vídeo non linear para KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[hu]=Nemlineáris videoszerkesztő a KDE-hez' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[it]=Editor di video non lineare per KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ja]=KDE 向けノンリニアビデオエディタ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[km]=កម្មវិធី​កែសម្រួល​វីដេអូ​មិន​លីនេអ៊ែរ​សម្រាប់ KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[lt]=Nelinijinis veido redaktorius skirtas KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[lv]=Nelineārais video redaktors KDE videi' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[mr]=केडीई करिता अरेषीय व्हिडीओ संपादक' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[nb]=Videoredigeringsprogram for KDE med dataklipping' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[nl]=Niet-lineaire video-bewerker voor KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[nn]=Program for ikkje-lineær videoredigering' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[pl]=Nieliniowy edytor wideo dla KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[pt]=Editor de vídeo não-linear para o KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[pt_BR]=Editor de vídeo não-linear para o KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ro]=Redactor de imagini neliniar pentru KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ru]=Нелинейный видеоредактор от KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[sk]=Nelineárny editor videa pre KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[sl]=Ne-linearni urejevalnik videa za KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[sv]=Icke-linjär videoeditor för KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[tr]=KDE için doğrusal olmayan video düzenleyici' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[ug]=KDE ئۈچۈن سىزىقسىز سىن تەھرىرلىگۈچ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[uk]=Нелінійний редактор відео для KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[x-test]=xxNonlinear video editor for KDExx' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[zh_CN]=KDE 的非线性视频编辑器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Comment[zh_TW]=KDE 上的非線性影像編輯器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Exec=kdenlive %U' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo "Icon=/usr/share/${PROJECT_NAME}/avatars/icon_kdenlive.png" >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'X-DocPath=kdenlive/index.html' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'X-DocPath[cs]=http://cs.wikibooks.org/wiki/Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'MimeType=application/x-kdenlive;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Categories=Qt;KDE;AudioVideo;AudioVideoEditing;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[ca]=edició;vídeo;àudio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[ca@valencia]=edició;vídeo;àudio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[da]=redigering;video;lyd;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[de]=Editing;Bearbeitung;Schnitt;Videoschnitt;Video;Audio;MLT;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[en_GB]=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[es]=edición;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[et]=redigeerimine;muutmine;video;audio;heli;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[fi]=editing;video;audio;mlt;kde;editointi;ääni;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[fr]=montage;vidéo;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[gl]=editing;edición;video;vídeo;audio;son;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[it]=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[nl]=bewerken;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[nn]=redigering;video;lyd;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[pl]=edytowanie;video;wideo;filmy;audio;dźwięk;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[pt]=edição;vídeo;áudio;MLT;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[pt_BR]=edição;vídeo;áudio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[sk]=editovanie;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[sl]=urejanje;video;zvok;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[sv]=redigering;video;ljud;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[uk]=editing;video;audio;mlt;kde;редагування;відео;звук;аудіо;млт;кдє;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[x-test]=xxeditingxx;xxvideoxx;xxaudioxx;xxmltxx;xxkdexx;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[zh_CN]=editing;video;audio;mlt;kde;编辑;视频;音频;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'Keywords[zh_TW]=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
echo 'X-DBUS-ServiceName=org.kde.kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop
cp /root/${PROJECT_NAME}/img/icon_photos.png /usr/share/${PROJECT_NAME}/avatars/icon_photos.png
echo '#!/usr/bin/env xdg-open' > /home/$MY_USERNAME/Desktop/photos.desktop
echo '[Desktop Entry]' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Version=1.0' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ar]=شُتْ‌وِل' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[as]=Photos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[bn_IN]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[bs]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ca]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[cs]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[da]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[de]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[el]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[en_GB]=Photos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[es]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[et]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[eu]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[fi]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[fr]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[gd]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[gl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[gu]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[he]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[hi]=शॉटवेल' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[hr]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[hu]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[id]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[it]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ja]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[kk]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[kn]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ko]=샷웰' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[lt]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[lv]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ml]=ഷോട്ട്‌‌വെല്‍' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[mr]=शॉटवेल' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[nb]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[nl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[oc]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[or]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[pa]=ਸ਼ੂਟਵੈੱਲ' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[pl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[pt]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[pt_BR]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ro]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ru]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[sk]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[sl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[sr]=Фото-бунар' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[sr@latin]=Foto-bunar' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[sv]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[ta]=ஷாட்வெல்' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[te]=షాట్‌వెల్' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[tr]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[uk]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[vi]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[zh_CN]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[zh_HK]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name[zh_TW]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Name=Photos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[af]=Foto Organiseerder' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ar]=مدير الصور' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo "GenericName[as]=ফ'টো ব্যৱস্থাপক" >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ast]=Xestor de semeyes' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[bg]=Мениджър на снимки' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[bn]=ফটো ম্যানেজার' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[bn_IN]=ছবি পরিচালন ব্যবস্থা' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[bs]=Organizator Slika' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ca]=Gestor fotogràfic' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[cs]=Správce fotografií' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[da]=Billedhåndtering' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[de]=Fotoverwaltung' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[el]=Διαχειριστής εικόνων' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[en_GB]=Photo Manager' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[es]=Gestor de fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[et]=Fotohaldur' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[eu]=Argazki-kudeatzailea' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[fi]=Valokuvien hallinta' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[fr]=Gestionnaire de photos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[gd]=Manaidsear dhealbhan' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[gl]=Xestor de fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[gu]=ફોટો સંચાલક' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[he]=מנהל תמונות' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[hi]=फ़ोटो प्रबंधक' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[hr]=Upravitelj fotografija' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[hu]=Fényképkezelő' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ia]=Administrator de photos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[id]=Manajer Foto' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[it]=Gestore di fotografie' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ja]=Shotwell 写真管理ツール' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[kk]=Фотосуреттерді басқару қолданбасы' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[km]=កម្ម​វិធី​គ្រប់​គ្រង​រូប​ថត' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[kn]=ಫೋಟೊ ವ್ಯವಸ್ಥಾಪಕ' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ko]=사진 관리자' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ky]=Фотография менеджери' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[lt]=Nuotraukų tvarkytuvė' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[lv]=Fotogrāfiju pārvaldnieks' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[mk]=Менаџер на фотографии' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ml]=ചിത്ര പാലകന്‍' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[mr]=छायाचित्र व्यवस्थापक' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[nb]=Fotobehandler' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[nl]=Fotobeheerder' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[oc]=Gestionari de fòtos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[or]=ଫୋଟୋ ପରିଚାଳକ' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[pa]=ਫੋਟੋ ਮੈਨੇਜਰ' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[pl]=Menedżer zdjęć' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[pt]=Gestor de fotografias' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[pt_BR]=Organizador de fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ro]=Administrator de fotografii' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ru]=Менеджер фотографий' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[sk]=Správca fotografií' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[sl]=Upravljalnik fotografij' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[sr]=Управник фотографија' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[sr@latin]=Upravnik fotografija' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[sv]=Bildhanterare' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[ta]=புகைப்பட அடுக்கு' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[te]=ఫోటో నిర్వాహకం' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[th]=ตัวจัดการภาพถ่าย' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[tr]=Fotoğraf Yöneticisi' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[uk]=Впорядник фотографій' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[vi]=Trình quản lý ảnh' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[zh_CN]=照片管理器' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[zh_HK]=相片管理員' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName[zh_TW]=相片管理員' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'GenericName=Photo Manager' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[cs]=Roztřiďte si své fotografie' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[da]=Organisér dine billeder' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[de]=Ihre Fotos organisieren' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[es]=Organice sus fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[fi]=Hallitse kuviasi' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[gd]=Cuir rian air na dealbhan agad' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[he]=ארגון התמונות שלך' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[hr]=Organizirajte svoje fotografije' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[hu]=Rendszerezze a fényképeit' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[id]=Organisasikan foto Anda' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[kk]=Фотосуреттеріңізді реттеңіз' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[kn]=ನಿಮ್ಮ ಚಿತ್ರಗಳನ್ನು ವ್ಯವಸ್ಥಿತವಾಗಿ ಜೋಡಿಸಿ' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[ko]=사진을 정리합니다.' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[lv]=Organizē savas fotogrāfijas' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[pl]=Organizowanie zdjęć' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[pt]=Organize as suas fotografias' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[pt_BR]=Organize suas fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[sk]=Organizuje vaše fotografie' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[sr]=Организујте ваше фотографије' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[sr@latin]=Organizujte vaše fotografije' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[sv]=Organisera dina bilder' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment[uk]=Впорядкуйте ваші фотографії' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Comment=Organize your photos' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo "Icon=/usr/share/${PROJECT_NAME}/avatars/icon_photos.png" >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Exec=shotwell %U' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'MimeType=x-content/image-dcf;' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'Categories=Graphics;Photography;GNOME;GTK;' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'X-GIO-NoFuse=true' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'X-GNOME-Gettext-Domain=shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop
echo 'X-GNOME-FullName=Shotwell Photo Manager' >> /home/$MY_USERNAME/Desktop/photos.desktop
#echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/audio.desktop
#echo 'Name=Audio/Music' >> /home/$MY_USERNAME/Desktop/audio.desktop
#echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/audio.desktop
@ -680,7 +1053,11 @@ function setup_ipfs {
TOX_ID='none'
if [ -d /home/$MY_USERNAME/Desktop ]; then
if [ ! -d /home/$MY_USERNAME/Public ]; then
mkdir /home/$MY_USERNAME/Public
mkdir -p /home/$MY_USERNAME/Public/Videos
mkdir -p /home/$MY_USERNAME/Public/Music
mkdir -p /home/$MY_USERNAME/Public/Podcasts
mkdir -p /home/$MY_USERNAME/Public/Documents
mkdir -p /home/$MY_USERNAME/Public/Pictures
echo $'Files within this directory will be publicly visible on the network' > /home/$MY_USERNAME/Public/README.txt
chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Public
ln -s /home/$MY_USERNAME/Public /home/$MY_USERNAME/Desktop/Public
@ -915,10 +1292,11 @@ function initialise_scuttlebot_pub {
systemctl daemon-reload
systemctl start scuttlebot.service
sleep 3
sleep 10
if [ ! -d /etc/scuttlebot/.ssb ]; then
echo $'Scuttlebot config not generated' >> /var/log/${PROJECT_NAME}.log
systemctl status scuttlebot -l >> /var/log/${PROJECT_NAME}.log
exit 73528
fi
@ -943,6 +1321,7 @@ function initialise_scuttlebot_pub {
echo '}' >> /etc/scuttlebot/.ssb/config
chown scuttlebot:scuttlebot /etc/scuttlebot/.ssb/config
systemctl restart scuttlebot.service
echo "scuttlebot pub started" >> /var/log/${PROJECT_NAME}.log
}
# whether to reset the identity
@ -1038,6 +1417,7 @@ if [ -f $MESH_INSTALL_SETUP ]; then
initialise_scuttlebot_pub
setup_ipfs
enable_cryptpad
enable_peertube
mesh_amnesic
make_root_read_only

View File

@ -71,6 +71,8 @@ TOX_PORT=33445
TRACKER_PORT=6969
LIBREVAULT_PORT=42345
TAHOELAFS_PORT=50213
GIT_SSB_PORT=7718
NGINX_GIT_SSB_PORT=7719
# Ethernet bridge definition (bridged to bat0)
BRIDGE=br-mesh
@ -178,6 +180,7 @@ function stop {
iptables -D INPUT -p udp --dport $LIBREVAULT_PORT -j ACCEPT
iptables -D INPUT -p tcp --dport $TAHOELAFS_PORT -j ACCEPT
# SSB/Scuttlebot/Patchwork
iptables -D INPUT -p tcp --dport $GIT_SSB_PORT -j ACCEPT
iptables -D INPUT -p udp --dport 8008 -j ACCEPT
iptables -D INPUT -p tcp --dport 8008 -j ACCEPT
iptables -D INPUT -p udp --dport 8010 -j ACCEPT
@ -450,26 +453,27 @@ function start {
iptables -A INPUT -p udp --dport $LIBREVAULT_PORT -j ACCEPT
iptables -A INPUT -p tcp --dport $TAHOELAFS_PORT -j ACCEPT
# SSB/Scuttlebot/Patchwork
iptables -A INPUT -p tcp --dport $GIT_SSB_PORT -j ACCEPT
iptables -A INPUT -p udp --dport 8008 -j ACCEPT
iptables -A INPUT -p tcp --dport 8008 -j ACCEPT
iptables -A INPUT -p udp --dport 8010 -j ACCEPT
iptables -A INPUT -p tcp --dport 8010 -j ACCEPT
if [[ "$ethernet_connected" != "0" ]]; then
# vpn over the internet
iptables -A INPUT -p tcp --dport 653 -j ACCEPT
iptables -A INPUT -p udp --dport 653 -j ACCEPT
iptables -A INPUT -i ${EIFACE} -m state --state NEW -p tcp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o ${EIFACE} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ${EIFACE} -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ${EIFACE} -j MASQUERADE
iptables -A OUTPUT -o tun+ -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' /etc/sysctl.conf
fi
# vpn over the internet
# Note: the vpn firewall settings are needed in order for Patchwork
# to discover local peers
iptables -A INPUT -p tcp --dport 653 -j ACCEPT
iptables -A INPUT -p udp --dport 653 -j ACCEPT
iptables -A INPUT -i ${EIFACE} -m state --state NEW -p tcp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o ${EIFACE} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ${EIFACE} -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ${EIFACE} -j MASQUERADE
iptables -A OUTPUT -o tun+ -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' /etc/sysctl.conf
systemctl restart avahi-daemon

View File

@ -41,6 +41,13 @@ CURRENT_BLOG_INDEX=/home/$USER/.blog-index
BLOG_EDITOR='pluma'
DEFAULT_BLOG_TITLE=$"Freedombone Blog"
function remove_bad_blog_links {
current_theme=$1
if [ -f $BLOG_PATH/themes/$current_theme/static/css/style.css ]; then
sed -i '/googleapi/d' $BLOG_PATH/themes/$current_theme/static/css/style.css
fi
}
function ipfs_publish {
DIR_TO_CHECK=/home/$USER/Public
if [ ! -d $DIR_TO_CHECK ]; then
@ -146,22 +153,16 @@ function delete_blog {
return
fi
dialog --title $"Delete the previous blog entry" \
--backtitle $"Freedombone Mesh" \
--defaultno \
--yesno $"\nAre you sure that you wish to delete the previous blog entry?" 8 60
sel=$?
case $sel in
0) rm $LAST_BLOG_ENTRY
if [ $CURRENT_INDEX -gt 0 ]; then
CURRENT_INDEX=$PREVIOUS_INDEX
echo "$CURRENT_INDEX" > $CURRENT_BLOG_INDEX
else
rm -f $CURRENT_BLOG_INDEX
fi
regenerate_blog
;;
esac
if ! zenity --question --title=$'Delete the previous blog entry' --text=$"\nAre you sure that you wish to delete the previous blog entry?" --ok-label=No --cancel-label=Yes --width=300; then
rm $LAST_BLOG_ENTRY
if [ $CURRENT_INDEX -gt 0 ]; then
CURRENT_INDEX=$PREVIOUS_INDEX
echo "$CURRENT_INDEX" > $CURRENT_BLOG_INDEX
else
rm -f $CURRENT_BLOG_INDEX
fi
regenerate_blog
fi
}
function change_theme {
@ -171,48 +172,41 @@ function change_theme {
THEMES+=("$THEME_NAME")
done
themelist=""
n=1
theme_index=0
curr_theme_index=
if [ -f /home/$USER/.blog-theme-index ]; then
curr_theme_index=$(cat /home/$USER/.blog-theme-index)
fi
if [ -f /tmp/.blog-themes ]; then
rm /tmp/.blog-themes
fi
for a in "${THEMES[@]}"
do
is_selected='off'
if [ $curr_theme_index ]; then
if [ $n -eq $curr_theme_index ]; then
is_selected='on'
fi
else
if [[ "$a" == 'nice-blog' ]]; then
is_selected='on'
fi
fi
themelist="$themelist $n $a $is_selected"
echo "$n $a" >> /tmp/.blog-themes
n=$[n+1]
theme_index=$[theme_index+1]
done
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --backtitle $"Freedombone Mesh" \
--title $"Select Blog Theme" \
--radiolist $'Choose:' \
80 40 20 $themelist 2> $data
CHOSEN_THEME_INDEX=$(
cat /tmp/.blog-themes | \
awk -F ' ' '{
for(i=1;i<=NF;i++){
print $i;
}
}' | \
zenity --list \
--title=$'Select Blog Theme' \
--column=$'Index' --column=$'Theme' \
--print-column=1 --hide-column=1 --width=300 --height=400)
rm /tmp/.blog-themes
if [ ! $CHOSEN_THEME_INDEX ]; then
exit 1
fi
sel=$?
case $sel in
1) exit 1;;
255) exit 1;;
esac
CHOSEN_THEME_INDEX=$(cat $data)
echo "$CHOSEN_THEME_INDEX" > /home/$USER/.blog-theme-index
CHOSEN_THEME_INDEX=$((CHOSEN_THEME_INDEX - 1))
CHOSEN_THEME=${THEMES[$CHOSEN_THEME_INDEX]}
remove_bad_blog_links $CHOSEN_THEME
if grep -q "THEME=" $BLOG_PATH/pelicanconf.py; then
sed -i "s|THEME=.*|THEME='themes/${CHOSEN_THEME}'|g" $BLOG_PATH/pelicanconf.py
else
@ -222,29 +216,18 @@ function change_theme {
}
function menu_blog {
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --backtitle $"Freedombone Mesh" \
--title $"Blogging" \
--radiolist $"Choose an operation:" 19 50 12 \
1 $"View a blog" on \
2 $"New blog entry" off \
3 $"Edit the previous blog entry" off \
4 $"Delete the previous blog entry" off \
5 $"Change theme" off \
6 $"Exit" off 2> $data
data=$(zenity --list 1 $"View a blog" 2 $"New blog entry" 3 $"Edit the previous blog entry" 4 $"Delete the previous blog entry" 5 $"Change theme" --column="id" --title $"Blogging" --column=$"Choose an operation:" --hide-column=1 --print-column=1 --height=250)
sel=$?
case $sel in
1) exit 1;;
255) exit 1;;
esac
case $(cat $data) in
case $data in
1) view_blog;;
2) new_blog;;
3) edit_blog;;
4) delete_blog;;
5) change_theme;;
6) break;;
esac
}

View File

@ -152,8 +152,7 @@ function mesh_setup_vpn {
chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/vpn.tar.gz
if [ -f vpn.tar.gz ]; then
dialog --title $"Generate VPN client keys" \
--msgbox $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, forward port $VPN_MESH_TLS_PORT then connect using your IP address or domain name." 15 70
zenity --info --title $"Generate VPN client keys" --text $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, forward port $VPN_MESH_TLS_PORT then connect using your IP address or domain name." --width 600
fi
}
@ -164,15 +163,11 @@ function connect_to_mesh {
connect_title=$"Connect from $(cat $HIDDEN_SERVICE_PATH) to another mesh network"
fi
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --title "$connect_title" \
--backtitle $"Freedombone Mesh" \
--inputbox $'Enter the IP address or domain name of the other mesh.' 10 60 2>$data
data=$(zenity --entry --title "$connect_title" --text $'Enter the IP address or domain name of the other mesh')
sel=$?
case $sel in
0)
ip_or_domain=$(<$data)
ip_or_domain="$data"
if [ ${#ip_or_domain} -gt 1 ]; then
if [[ "$ip_or_domain" == *'.'* ]]; then
@ -188,9 +183,7 @@ function connect_to_mesh {
fi
if [ $connect_failed ]; then
dialog --title $"Connect to another mesh network" \
--msgbox $"\nObtain the vpn.tar.gz file from the other mesh administrator, uncompress it into the /home/fbone directory and also forwarded port $VPN_MESH_TLS_PORT from your internet router to this system." 10 50
rm $data
zenity --info --title $"Connect to another mesh network" --text $"\nObtain the vpn.tar.gz file from the other mesh administrator, uncompress it into the /home/fbone directory and also forwarded port $VPN_MESH_TLS_PORT from your internet router to this system." --width 400
exit 1
fi
@ -204,27 +197,17 @@ function connect_to_mesh {
fi
;;
esac
rm $data
}
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --backtitle $"Freedombone Mesh" \
--title $"Connect to another mesh network" \
--radiolist $"Choose an operation:" 10 75 2 \
1 $"Connect to another mesh network" on \
2 $"Generate VPN keys for another mesh network to connect to me" off 2> $data
data=$(zenity --list 1 $"Connect to another mesh network" 2 $"Generate VPN keys for another mesh network to connect to me" --column="id" --title $"Connect to another mesh network" --column=$"Choose an operation:" --hide-column=1 --print-column=1 --width=500 --height=100)
sel=$?
case $sel in
1) exit 1;;
255) exit 1;;
esac
case $(cat $data) in
1) rm $data
connect_to_mesh;;
2) rm $data
mesh_setup_vpn;;
case $data in
1) connect_to_mesh;;
2) mesh_setup_vpn;;
esac
exit 0

View File

@ -33,7 +33,7 @@ export TEXTDOMAINDIR="/usr/share/locale"
MESH_INSTALL_COMPLETED=/root/.mesh_setup_completed
if ! zenity --question --title='New Identity' --text="Do you want to reset your identity? This will reset ALL data for this peer, and you will not be able to recover it." --ok-label=No --cancel-label=Yes --width=300; then
if ! zenity --question --title=$'New Identity' --text=$"Do you want to reset your identity? This will reset ALL data for this peer, and you will not be able to recover it." --ok-label=No --cancel-label=Yes --width=300; then
sudo batman stop
sudo pkill qtox
sudo pkill firefox

View File

@ -34,8 +34,8 @@ export TEXTDOMAINDIR="/usr/share/locale"
IPFS_URL='http://127.0.0.1:8080/ipns'
# The browser application to use
BROWSER=midori
BROWSER_OPTIONS='-p'
BROWSER=firefox
BROWSER_OPTIONS='-url'
# An optional suffix to be appended to the URL
SUFFIX=$1
@ -49,42 +49,61 @@ if [ ! -f $USERS_FILE ]; then
exit 0
fi
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --title $"Visit IPFS site" \
--backtitle $"Freedombone mesh" \
--inputbox $"Enter the username or Tox ID for the site you wish to visit" 8 70 2>$data
sel=$?
case $sel in
USERS_FILE_LINES=$(wc -l $USERS_FILE | awk -F ' ' '{print $1}')
if [ $USERS_FILE_LINES -gt 200 ]; then
# If there are more than a Dunbar number of peers then ask for the peer name or ID
data=$(zenity --entry --title="Visit IPFS site" --text="Enter the username or Tox ID for the site you wish to visit")
sel=$?
case $sel in
0)
TOX_USERNAME_OR_ID=$(<$data)
if [ ${#TOX_USERNAME_OR_ID} -gt 0 ]; then
if ! grep -q "$TOX_USERNAME_OR_ID" $USERS_FILE; then
TOX_ID="$TOX_USERNAME_OR_ID"
else
TOX_ID=$(cat "$USERS_FILE" | grep "$TOX_USERNAME_OR_ID" | head -n 1 | sed "s|$TOX_USERNAME_OR_ID ||g" | sed -e 's/^[[:space:]]*//')
fi
if [ ${#TOX_ID} -gt 5 ]; then
if ! grep -q "$TOX_ID" $IPFS_USERS_FILE; then
dialog --title $"Visit IPFS site" \
--backtitle $"Freedombone mesh" \
--msgbox $"An IPFS site was not found for the user '$TOX_USERNAME_OR_ID'" 8 60
exit 3
fi
IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}')
clear
echo $'Opening browser. Please wait...'
pkill $BROWSER
setsid sh -c "$BROWSER $BROWSER_OPTIONS $IPFS_FULL_URL$SUFFIX" > /dev/null 2>&1 < /dev/null &
# Need to wait a while for the browser to begin opening
sleep 3
fi
TOX_USERNAME_OR_ID="$data"
if [ ${#TOX_USERNAME_OR_ID} -gt 0 ]; then
if ! grep -q "$TOX_USERNAME_OR_ID" $USERS_FILE; then
TOX_ID="$TOX_USERNAME_OR_ID"
else
exit 1
TOX_ID=$(cat "$USERS_FILE" | grep "$TOX_USERNAME_OR_ID" | head -n 1 | sed "s|$TOX_USERNAME_OR_ID ||g" | sed -e 's/^[[:space:]]*//')
fi
;;
esac
if [ ${#TOX_ID} -gt 5 ]; then
if ! grep -q "$TOX_ID" $IPFS_USERS_FILE; then
zenity --info --title $"Visit a site" --text $"An IPFS site was not found for the user '$TOX_USERNAME_OR_ID'" --width 500
exit 3
fi
IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}')
pkill $BROWSER
setsid sh -c "$BROWSER $BROWSER_OPTIONS $IPFS_FULL_URL$SUFFIX" > /dev/null 2>&1 < /dev/null &
# Need to wait a while for the browser to begin opening
sleep 3
fi
else
exit 1
fi
;;
esac
else
# If there are a relatively small number of users then choose from a list
TOX_ID=$(
cat $USERS_FILE | \
awk -F ' ' '{
for(i=1;i<=NF;i++){
print $i;
}
}' | \
zenity --list \
--title='Visit the site of another user' \
--column='Username' --column='Tox ID' \
--print-column=2 --hide-column=2 --width=300 --height=400)
if [ ! $TOX_ID ]; then
exit 0
fi
IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}')
pkill $BROWSER
setsid sh -c "$BROWSER $BROWSER_OPTIONS $IPFS_FULL_URL$SUFFIX" > /dev/null 2>&1 < /dev/null &
# Need to wait a while for the browser to begin opening
sleep 3
fi
exit 0

View File

@ -127,6 +127,35 @@ function mesh_install_nodejs {
$mesh_install_nodejs_prefix npm install --arch=$NPM_ARCH -g n@${NODEJS_N_VERSION} --save
$mesh_install_nodejs_prefix n --arch $N_ARCH ${NODEJS_VERSION}
cp $rootdir/root/npm $rootdir/usr/bin/npm
# deliberate second install of npm
$mesh_install_nodejs_prefix npm install --arch=$NPM_ARCH -g npm@${NPM_VERSION} --save
if [ -f $rootdir/usr/local/bin/npm ]; then
cp $rootdir/usr/local/bin/npm /usr/bin/npm
fi
cp $rootdir/usr/bin/npm $rootdir/root/npm
# check the version numbers
cat <<EOF > $rootdir/usr/bin/test_nodejs_install
#!/bin/bash
node_version=\$(node -v)
if [[ "\$node_version" != "v${NODEJS_VERSION}" ]]; then
echo $"nodejs version expected to be ${NODEJS_VERSION} but found \$node_version"
exit 1
fi
npm_version=\$(npm -v)
if [[ "\$npm_version" != "${NPM_VERSION}" ]]; then
echo $"npm version expected to be ${NPM_VERSION} but found \$npm_version"
exit 2
fi
EOF
chmod +x $rootdir/usr/bin/test_nodejs_install
chroot "$rootdir" /usr/bin/test_nodejs_install
if [ ! "$?" = "0" ]; then
echo $"nodejs version numbers did not match. Architecture is $NPM_ARCH."
exit 76835282
fi
rm $rootdir/usr/bin/test_nodejs_install
}
function remove_nodejs {

View File

@ -30,6 +30,7 @@
# Set this when calling backup and restore commands
USE_POSTGRESQL=
POSTGRESQL_PACKAGES='postgresql-9.6 postgresql-contrib-9.6 postgresql-client'
function store_original_postgresql_password {
if [ ! -f /root/.postgresqloriginal ]; then
@ -48,7 +49,26 @@ function get_postgresql_password {
fi
}
function mesh_install_postgresql {
chroot "$rootdir" apt-get -yq install $POSTGRESQL_PACKAGES
if [ ! -d $rootdir/etc/postgresql ]; then
echo $"ERROR: postgresql does not appear to have installed."
exit 78352
fi
if [ ! -f $rootdir/usr/bin/psql ]; then
echo $"ERROR: psql command does not appear to have installed."
exit 835290
fi
}
function install_postgresql {
if [[ $VARIANT == "mesh"* ]]; then
mesh_install_postgresql
return
fi
if [[ $(is_completed $FUNCNAME) == "1" ]]; then
return
fi
@ -64,7 +84,7 @@ function install_postgresql {
fi
${PROJECT_NAME}-pass -u root -a postgresql -p "$POSTGRESQL_PASSWORD"
apt-get -yq install postgresql-9.6 postgresql-contrib-9.6 postgresql-client
apt-get -yq install $POSTGRESQL_PACKAGES
apt-get -yq remove --purge apache2-bin*
if [ -d /etc/apache2 ]; then
rm -rf /etc/apache2
@ -72,12 +92,12 @@ function install_postgresql {
fi
if [ ! -d /etc/postgresql ]; then
echo $"ERROR: postgresql does not appear to have installed. $CHECK_MESSAGE"
echo $"ERROR: postgresql does not appear to have installed."
exit 78352
fi
if [ ! -f /usr/bin/psql ]; then
echo $"ERROR: psql command does not appear to have installed. $CHECK_MESSAGE"
echo $"ERROR: psql command does not appear to have installed."
exit 835290
fi

View File

@ -68,6 +68,25 @@ function ipfs_publish {
NEW_STAT=$(stat -t $DIR_TO_CHECK)
# include some subdirectories
for dir in $DIR_TO_CHECK/*/
do
REALLY_NEW_STAT="$NEW_STAT$(stat -t $dir)"
NEW_STAT="$REALLY_NEW_STAT"
for dir2 in "$dir"/*/
do
REALLY_NEW_STAT="$NEW_STAT$(stat -t $dir2)"
NEW_STAT="$REALLY_NEW_STAT"
for dir3 in "$dir2"/*/
do
REALLY_NEW_STAT="$NEW_STAT$(stat -t $dir3)"
NEW_STAT="$REALLY_NEW_STAT"
done
done
done
if [ "$OLD_STAT" != "$NEW_STAT" ]; then
su -c "echo \$($IPFS_COMMAND add -rq /home/$MY_USERNAME/Public | tail -n 1) > $IPFS_PUBLIC" - $MY_USERNAME
echo "$NEW_STAT" > $OLD_STAT_FILE

View File

@ -3,10 +3,10 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2016-12-26 Mon 11:03 -->
<!-- 2017-12-03 Sun 12:49 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
<title>&lrm;</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Bob Mottram" />
<meta name="description" content="How to use Mediagoblin"
@ -71,6 +71,7 @@
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
@ -188,7 +189,7 @@
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2013 Free Software Foundation, Inc.
Copyright (C) 2012-2017 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
@ -248,7 +249,7 @@ for the JavaScript code in this tag.
</center>
<p>
With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as <i>webm</i>, <i>ogv</i> and <i>ogg</i>.
With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as <i>webm</i>, <i>ogv</i> and <i>ogg</i>. Another similar system which might be better fitted for small servers is <a href="./app_peertube.html">PeerTube</a>, since it uses webtorrent to distribute video files. Webtorrent will only work with WebRTC enabled browsers though.
</p>
<p>
@ -263,9 +264,9 @@ When hosting media files you should take into consideration that since anyone on
</div>
</div>
<div id="outline-container-orgc887b0f" class="outline-2">
<h2 id="orgc887b0f">Installation</h2>
<div class="outline-text-2" id="text-orgc887b0f">
<div id="outline-container-org9311cd2" class="outline-2">
<h2 id="org9311cd2">Installation</h2>
<div class="outline-text-2" id="text-org9311cd2">
<p>
Log into your system with:
</p>
@ -290,9 +291,9 @@ After the install has completed go to <b>Security settings</b> and select <b>Cre
</div>
<div id="outline-container-orga0efefa" class="outline-2">
<h2 id="orga0efefa">Initial setup</h2>
<div class="outline-text-2" id="text-orga0efefa">
<div id="outline-container-orgefeb8cc" class="outline-2">
<h2 id="orgefeb8cc">Initial setup</h2>
<div class="outline-text-2" id="text-orgefeb8cc">
<p>
If you have just obtained a Lets Encrypt certificate as above then go to <b>About</b> on the administrator control panel and you should see your Mediagoblin domain listed there along with an onion address. You can then navigate to your site in a browser.
</p>
@ -308,9 +309,9 @@ You should repeat that for however many accounts you want on the system and then
</div>
<div id="outline-container-org1e39c39" class="outline-2">
<h2 id="org1e39c39">File formats</h2>
<div class="outline-text-2" id="text-org1e39c39">
<div id="outline-container-org801bff8" class="outline-2">
<h2 id="org801bff8">File formats</h2>
<div class="outline-text-2" id="text-org801bff8">
<p>
It's a good idea to upload videos in <i>webm</i> format. In that case Mediagoblin will skip the transcoding step (which can take hours for videos of non-trivial length) and the whole process will be quicker. Transcoding just converts whatever file format you submit into a standard resolution and file type. On your local system you can convert a video to webm with:
</p>

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2017-12-01 Fri 10:41 -->
<!-- 2017-12-03 Sun 12:48 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>&lrm;</title>
@ -249,7 +249,7 @@ for the JavaScript code in this tag.
</center>
<p>
This is a video hosting system similar to Mediagoblin but using <a href="https://webtorrent.io/">webtorrent</a> to help distribute the files to or between clients. This should be more practical for situations where a video becomes popular because the load is then spread across the network, with performance increasing with the number of nodes.
This is a video hosting system similar to Mediagoblin but using <a href="https://webtorrent.io/">webtorrent</a> to help distribute the files to or between clients. This should be more practical for situations where a video becomes popular because the load is then spread across the network, with performance increasing with the number of nodes. However, the torrenting aspect of it only works with WebRTC enabled browsers and so this means it's unlikely to fully work with a Tor browser. Without WebRTC then from a user point of view it's effectively the same thing as Mediagoblin.
</p>
<div class="org-center">
@ -260,9 +260,9 @@ This is a video hosting system similar to Mediagoblin but using <a href="https:/
</div>
</div>
<div id="outline-container-org89b3d26" class="outline-2">
<h2 id="org89b3d26">Installation</h2>
<div class="outline-text-2" id="text-org89b3d26">
<div id="outline-container-orgd4e2d94" class="outline-2">
<h2 id="orgd4e2d94">Installation</h2>
<div class="outline-text-2" id="text-orgd4e2d94">
<p>
Log into your system with:
</p>
@ -282,9 +282,9 @@ Select <b>Add/Remove Apps</b> then <b>peertube</b>. You will then be asked for a
</div>
</div>
<div id="outline-container-orgc6d8e67" class="outline-2">
<h2 id="orgc6d8e67">Initial setup</h2>
<div class="outline-text-2" id="text-orgc6d8e67">
<div id="outline-container-org50ab03b" class="outline-2">
<h2 id="org50ab03b">Initial setup</h2>
<div class="outline-text-2" id="text-org50ab03b">
<p>
Navigate to your site and select <b>Signup</b> to create a new account. By default the maximum number of accounts on your system is limited to a small number so that millions of random internet users can't then begin uploading dubious content. After that it's pretty straightforward.
</p>

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2017-11-10 Fri 13:13 -->
<!-- 2017-12-09 Sat 23:07 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>&lrm;</title>
@ -246,13 +246,13 @@ for the JavaScript code in this tag.
<center><h1>Mesh Network: Images</h1></center>
<div id="outline-container-org6d0027e" class="outline-2">
<h2 id="org6d0027e">Pre-built Disk Images</h2>
<div class="outline-text-2" id="text-org6d0027e">
<div id="outline-container-org59e2a01" class="outline-2">
<h2 id="org59e2a01">Pre-built Disk Images</h2>
<div class="outline-text-2" id="text-org59e2a01">
</div>
<div id="outline-container-orgaaf029b" class="outline-3">
<h3 id="orgaaf029b">Writing many images quickly</h3>
<div class="outline-text-3" id="text-orgaaf029b">
<div id="outline-container-org58cbb17" class="outline-3">
<h3 id="org58cbb17">Writing many images quickly</h3>
<div class="outline-text-3" id="text-org58cbb17">
<p>
There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the <b>dd</b> command is used for writing to the target drive, but to write to multiple drives you can use a tool such as <a href="https://wiki.gnome.org/Apps/MultiWriter">GNOME MultiWriter</a>.
</p>
@ -280,9 +280,9 @@ The MultiWriter tool is also available within mesh client images, so that you ca
</p>
</div>
</div>
<div id="outline-container-orgc0ddf07" class="outline-3">
<h3 id="orgc0ddf07">Client images</h3>
<div class="outline-text-3" id="text-orgc0ddf07">
<div id="outline-container-orgbec0fc8" class="outline-3">
<h3 id="orgbec0fc8">Client images</h3>
<div class="outline-text-3" id="text-orgbec0fc8">
<div class="org-center">
<div class="figure">
@ -301,7 +301,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.x
wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
gpg --verify freedombone-meshclient-i386.img.xz.sig
sha256sum freedombone-meshclient-i386.img.xz
376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8
3e88205461bb2061dc172ff0a1e65e5cae1013f8f7dc26c6d5cbe1c986c98555
unxz freedombone-meshclient-i386.img.xz
sudo dd <span class="org-variable-name">if</span>=/dev/zero <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">count</span>=8
sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-meshclient-i386.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
@ -322,7 +322,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i
wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
sha256sum freedombone-meshclient-insecure-i386.img.xz
81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf
09c059664daf56d210134735d37e8117bb7b755acc8b9b253cdfa42052249ccb
unxz freedombone-meshclient-insecure-i386.img.xz
sudo dd <span class="org-variable-name">if</span>=/dev/zero <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">count</span>=8
sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-meshclient-insecure-i386.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
@ -331,16 +331,16 @@ sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-n
</div>
</div>
<div id="outline-container-org8eb2396" class="outline-3">
<h3 id="org8eb2396">Router images</h3>
<div class="outline-text-3" id="text-org8eb2396">
<div id="outline-container-org6f3a05a" class="outline-3">
<h3 id="org6f3a05a">Router images</h3>
<div class="outline-text-3" id="text-org6f3a05a">
<p>
Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.
</p>
</div>
<div id="outline-container-orgd7fdd98" class="outline-4">
<h4 id="orgd7fdd98">Beaglebone Black</h4>
<div class="outline-text-4" id="text-orgd7fdd98">
<div id="outline-container-org0387979" class="outline-4">
<h4 id="org0387979">Beaglebone Black</h4>
<div class="outline-text-4" id="text-org0387979">
<div class="org-center">
<div class="figure">
@ -377,9 +377,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
</div>
</div>
<div id="outline-container-org6584d9d" class="outline-2">
<h2 id="org6584d9d">Building Disk Images</h2>
<div class="outline-text-2" id="text-org6584d9d">
<div id="outline-container-org0db60a2" class="outline-2">
<h2 id="org0db60a2">Building Disk Images</h2>
<div class="outline-text-2" id="text-org0db60a2">
<p>
It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.
</p>

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2017-10-27 Fri 14:28 -->
<!-- 2017-12-09 Sat 17:57 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>&lrm;</title>
@ -247,30 +247,38 @@ for the JavaScript code in this tag.
<center><h1>Mesh Network: How to use it</h1></center>
<ul class="org-ul">
<li><a href="#org6a43d4d">Boot trouble</a></li>
<li><a href="#org03f4d8a">Set the Date</a></li>
<li><a href="#org55f29f9">Check network status</a></li>
<li><a href="#org802070f">Connecting to the internet</a></li>
<li><a href="#orgd9dffae">Connecting two meshes over the internet via a VPN tunnel</a></li>
<li><a href="#org62a60b3">Mobile devices (phones, etc)</a></li>
<li><a href="#org216d212">Chat System</a></li>
<li><a href="#orgfe4d63b">Collaborative document editing</a></li>
<li><a href="#org76f234d">Social Network</a></li>
<li><a href="#org6154f04">Sharing Files</a></li>
<li><a href="#orga4dae6b">Blogging</a></li>
<li><a href="#orgdec778b">Boot trouble</a></li>
<li><a href="#org92b8992">Set the Date</a></li>
<li><a href="#org5854462">Check network status</a></li>
<li><a href="#orga9a6d4b">Connecting to the internet</a></li>
<li><a href="#org5fe4cbd">Connecting two meshes over the internet via a VPN tunnel</a></li>
<li><a href="#org0f9ab05">Mobile devices (phones, etc)</a></li>
<li><a href="#orgf44bf0d">Chat System</a></li>
<li><a href="#org6940994">Collaborative document editing</a></li>
<li><a href="#orgdcb8a5f">Social Network</a></li>
<li><a href="#orga1bfc4a">Sharing Files</a></li>
<li><a href="#orgfbceae4">Blogging</a></li>
</ul>
<p>
When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.
</p>
<div class="org-center">
<div class="figure">
<p><img src="images/mesh_initial_login.jpg" alt="mesh_initial_login.jpg" />
</p>
</div>
</div>
<p>
After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as <i>Other Users</i> and <i>Chat</i>.
</p>
<div id="outline-container-org6a43d4d" class="outline-2">
<h2 id="org6a43d4d">Boot trouble</h2>
<div class="outline-text-2" id="text-org6a43d4d">
<div id="outline-container-orgdec778b" class="outline-2">
<h2 id="orgdec778b">Boot trouble</h2>
<div class="outline-text-2" id="text-orgdec778b">
<p>
If the system doesn't boot and reports an error which includes <b>/dev/mapper/loop0p1</b> then reboot with <b>Ctrl-Alt-Del</b> and when you see the grub menu press <b>e</b> and manually change <b>/dev/mapper/loop0p1</b> to <b>/dev/sdb1</b>, then press <b>Ctrl-x</b>. If that doesn't work then reboot and try <b>/dev/sdc1</b> instead.
</p>
@ -280,9 +288,9 @@ After the system has booted successfully the problem should resolve itself on su
</p>
</div>
</div>
<div id="outline-container-org03f4d8a" class="outline-2">
<h2 id="org03f4d8a">Set the Date</h2>
<div class="outline-text-2" id="text-org03f4d8a">
<div id="outline-container-org92b8992" class="outline-2">
<h2 id="org92b8992">Set the Date</h2>
<div class="outline-text-2" id="text-org92b8992">
<p>
On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.
</p>
@ -292,9 +300,9 @@ On the ordinary internet the date and time of your system would be set automatic
</p>
</div>
</div>
<div id="outline-container-org55f29f9" class="outline-2">
<h2 id="org55f29f9">Check network status</h2>
<div class="outline-text-2" id="text-org55f29f9">
<div id="outline-container-org5854462" class="outline-2">
<h2 id="org5854462">Check network status</h2>
<div class="outline-text-2" id="text-org5854462">
<p>
Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.
</p>
@ -317,9 +325,9 @@ When you are finished close the window and then select the <i>Network Restart</i
</p>
</div>
</div>
<div id="outline-container-org802070f" class="outline-2">
<h2 id="org802070f">Connecting to the internet</h2>
<div class="outline-text-2" id="text-org802070f">
<div id="outline-container-orga9a6d4b" class="outline-2">
<h2 id="orga9a6d4b">Connecting to the internet</h2>
<div class="outline-text-2" id="text-orga9a6d4b">
<div class="org-center">
<div class="figure">
@ -350,9 +358,9 @@ Where <i>myclient.ovpn</i> comes from your VPN provider and with the password "<
</p>
</div>
</div>
<div id="outline-container-orgd9dffae" class="outline-2">
<h2 id="orgd9dffae">Connecting two meshes over the internet via a VPN tunnel</h2>
<div class="outline-text-2" id="text-orgd9dffae">
<div id="outline-container-org5fe4cbd" class="outline-2">
<h2 id="org5fe4cbd">Connecting two meshes over the internet via a VPN tunnel</h2>
<div class="outline-text-2" id="text-org5fe4cbd">
<div class="org-center">
<div class="figure">
@ -372,7 +380,7 @@ In your home directory on a system connected via ethernet to an internet router
<div class="org-center">
<div class="figure">
<p><img src="images/mesh_connect.jpg" alt="mesh_connect.jpg" />
<p><img src="images/mesh_connect.png" alt="mesh_connect.png" />
</p>
</div>
</div>
@ -387,9 +395,9 @@ From a deep packet inspection point of view the traffic going over the internet
</div>
</div>
<div id="outline-container-org62a60b3" class="outline-2">
<h2 id="org62a60b3">Mobile devices (phones, etc)</h2>
<div class="outline-text-2" id="text-org62a60b3">
<div id="outline-container-org0f9ab05" class="outline-2">
<h2 id="org0f9ab05">Mobile devices (phones, etc)</h2>
<div class="outline-text-2" id="text-org0f9ab05">
<div class="org-center">
<div class="figure">
@ -419,11 +427,27 @@ On some android devices you may need to move the downloaded APK file from the <b
</p>
</div>
</div>
<div id="outline-container-org216d212" class="outline-2">
<h2 id="org216d212">Chat System</h2>
<div class="outline-text-2" id="text-org216d212">
<div id="outline-container-orgf44bf0d" class="outline-2">
<h2 id="orgf44bf0d">Chat System</h2>
<div class="outline-text-2" id="text-orgf44bf0d">
<p>
Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the <i>Chat</i> and <i>Other Users</i> icons appear. Select the users icon and you should see a list of users on the mesh. Select the <i>Chat</i> icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.
Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the <i>Chat</i> and <i>Other Users</i> icons appear. Select the users icon and you should see a list of users on the mesh.
</p>
<div class="org-center">
<div class="figure">
<p><img src="images/mesh_peerslist.png" alt="mesh_peerslist.png" />
</p>
</div>
</div>
<p>
Selecting a user followed by the Ok button will copy their Tox ID to the clipboard.
</p>
<p>
Now select the <i>Chat</i> icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then paste in a Tox ID.
</p>
<div class="org-center">
@ -480,9 +504,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
</div>
</div>
<div id="outline-container-orgfe4d63b" class="outline-2">
<h2 id="orgfe4d63b">Collaborative document editing</h2>
<div class="outline-text-2" id="text-orgfe4d63b">
<div id="outline-container-org6940994" class="outline-2">
<h2 id="org6940994">Collaborative document editing</h2>
<div class="outline-text-2" id="text-org6940994">
<p>
The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.
</p>
@ -513,9 +537,9 @@ If you have the chat system running you can then copy and paste the URL for your
</div>
</div>
<div id="outline-container-org76f234d" class="outline-2">
<h2 id="org76f234d">Social Network</h2>
<div class="outline-text-2" id="text-org76f234d">
<div id="outline-container-orgdcb8a5f" class="outline-2">
<h2 id="orgdcb8a5f">Social Network</h2>
<div class="outline-text-2" id="text-orgdcb8a5f">
<p>
Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.
</p>
@ -550,9 +574,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
</div>
</div>
<div id="outline-container-org6154f04" class="outline-2">
<h2 id="org6154f04">Sharing Files</h2>
<div class="outline-text-2" id="text-org6154f04">
<div id="outline-container-orga1bfc4a" class="outline-2">
<h2 id="orga1bfc4a">Sharing Files</h2>
<div class="outline-text-2" id="text-orga1bfc4a">
<p>
You can make files publicly available on the network simply by dragging and dropping them into the <i>Public</i> folder on the desktop. To view the files belonging to another user select the desktop icon called <i>Visit a site</i> and enter the username or Tox ID of the other user.
</p>
@ -567,17 +591,17 @@ You can make files publicly available on the network simply by dragging and drop
</div>
</div>
<div id="outline-container-orga4dae6b" class="outline-2">
<h2 id="orga4dae6b">Blogging</h2>
<div class="outline-text-2" id="text-orga4dae6b">
<div id="outline-container-orgfbceae4" class="outline-2">
<h2 id="orgfbceae4">Blogging</h2>
<div class="outline-text-2" id="text-orgfbceae4">
<p>
To create a blog post select the <i>Blog</i> icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the <b>CreateBlog/content/images</b> directory and then link to them as shown.
To create a blog post select the <i>Blog</i> icon on the desktop and then select <b>New blog entry</b> and <b>Ok</b>. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the <b>CreateBlog/content/images</b> directory and then link to them as shown.
</p>
<div class="org-center">
<div class="figure">
<p><img src="images/mesh_new_blog.jpg" alt="mesh_new_blog.jpg" />
<p><img src="images/mesh_blog.png" alt="mesh_blog.png" />
</p>
</div>
</div>
@ -603,8 +627,16 @@ To finish your blog entry just select <i>Save</i> and then close the editor. On
</div>
<p>
You can also visit other blogs, edit or delete your previous entry and also change your blog theme.
You can also visit other blogs, edit or delete your previous entry and change your blog theme.
</p>
<div class="org-center">
<div class="figure">
<p><img src="images/mesh_select_blog_theme.png" alt="mesh_select_blog_theme.png" />
</p>
</div>
</div>
</div>
</div>
</div>