Arduino Code for my Gyrocar Toy

After so many requests of my code of my Gyrocar Toy on my YouTube channel. I decided to post my code here. This code is very primitive as I want to keep everything as simple as possible. Here is the complete code:

#include <Servo.h>

Servo myservo;
int potPin = 2; // select the input pin for the potentiometer
int val = 86;   // variable to store the value coming from the sensor
int outval = 86;
boolean pushedfront = false;
boolean pushedrear = false;
int lastval = 86;

void setup() {
 myservo.attach(9);
}

void loop() {
 val = analogRead(potPin); // read the value from the sensor
 val = map(val, 0, 1023, -80, 279);

 outval = val;
 if(val<70&&val>35)
 outval-=4;
 else if(val>120)
 outval+=3;

 if(val>136){
 outval=136;
 }
 else if(val<26){
 outval=26;
 }
 myservo.write(outval);

 if(outval>110 && pushedfront==false){
 myservo.write(140);
 delay(200);
 pushedfront=true;
 }
 else if(outval<70 && pushedrear==false){
 myservo.write(35);
 delay(200);
 pushedrear=true;
 }

 if(outval+lastval>=220){
 pushedrear=false;
 }
 else if(outval==50){
 pushedfront=false;
 }

 lastval=outval;
}

Please note that this toy is not yet finished. So maybe I have to make change of this code some time in the future.

LinuxMint LMDE2 64bit update kernel 4.8.8

Here is a very easy way to update kernel for LinuxMint 64 bit. I found the instruction here: https://mintguide.org/system/639-install-linux-kernel-4-7-stable-on-linux-mint.html
Basically what I did was following:

      1. Download linux-image and linux-headers:
$ mkdir temp
$ cd temp
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.8.8/linux-headers-4.8.8-040808_4.8.8-040808.201611150231_all.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.8.8/linux-headers-4.8.8-040808-generic_4.8.8-040808.201611150231_amd64.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.8.8/linux-image-4.8.8-040808-generic_4.8.8-040808.201611150231_amd64.deb
      2. Install all .deb files:
$ sudo dpkg -i *.deb
      3. Update GRUB:
$ sudo update-grub
      4. Reboot:
$ sudo reboot
      5. Check the kernel version:
$ uname -r
    That’s it!

Install Guacamole 0.9.9 on LMDE 2 MATE

Guacamole is a clientless Remote Desktop gateway. With this tool we can connect to a remote desktop using any modern webbrowser. Here is how I install the latest version (0.9.9) on an LMDE 2 MATE System.

1. Install dependencies:

$ sudo apt-get install libcairo2-dev libjpeg62-turbo-dev libpng12-dev libossp-uuid-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev

2. Download source code:

$ wget http://sourceforge.net/projects/guacamole/files/current/source/guacamole-server-0.9.9.tar.gz

3. Extract file and change directory:

$ tar -xzf guacamole-server-0.9.9.tar.gz
$ cd guacamole-server-0.9.9/

4. Configure:

$ ./configure --with-init-dir=/etc/init.d
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
...

------------------------------------------------
guacamole-server version 0.9.9
------------------------------------------------

 Library status:

 freerdp ............. yes
 pango ............... yes
 libssh2 ............. yes
 libssl .............. yes
 libtelnet ........... yes
 libVNCServer ........ yes
 libvorbis ........... yes
 libpulse ............ yes
 libwebp ............. yes

 Protocol support:

 RDP ....... yes
 SSH ....... yes
 Telnet .... yes
 VNC ....... yes

 Init scripts: /etc/init.d

Type "make" to compile guacamole-server.

5. Make:

$ make
make all-recursive
make[1]: Entering directory '/home/user/guacamole/guacamole-server-0.9.9'
Making all in src/libguac
make[2]: Entering directory '/home/user/guacamole/guacamole-server-0.9.9/src/libguac'
 CC libguac_la-audio.lo
...

 CCLD libguac-client-vnc.la
make[2]: Leaving directory '/home/user/guacamole/guacamole-server-0.9.9/src/protocols/vnc'
make[2]: Entering directory '/home/user/guacamole/guacamole-server-0.9.9'
make[2]: Leaving directory '/home/user/guacamole/guacamole-server-0.9.9'
make[1]: Leaving directory '/home/user/guacamole/guacamole-server-0.9.9'

6. Create needed directories:

$ sudo mkdir -p /usr/local/share/man
$ sudo mkdir /etc/guacamole

7. Install guacamole-server using checkinstall:

$ sudo apt-get install checkinstall
$ sudo checkinstall

checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran
  Diese Software wurde unter der GNU GPL veröffentlicht


The package documentation directory ./doc-pak does not exist. 
Should I create a default set of package docs? [y]: 

Bereite Paket-Dokumentation vor...OK

Bitte geben Sie eine Beschreibung für das Paket ein.
Beenden Sie Ihre Beschreibung mit einer leeren Zeile oder EOF.
>> 

*****************************************
**** Debian package creation selected ***
*****************************************

Das Paket wird entsprechend dieser Vorgaben erstellt:

0 - Maintainer: [ root@lpmbox ]
1 - Summary: [ Package created with checkinstall 1.6.2 ]
2 - Name: [ guacamole-server ]
3 - Version: [ 0.9.9 ]
4 - Release: [ 1 ]
5 - License: [ GPL ]
6 - Group: [ checkinstall ]
7 - Architecture: [ amd64 ]
8 - Source location: [ guacamole-server-0.9.9 ]
9 - Alternate source location: [ ]
10 - Requires: [ ]
11 - Provides: [ guacamole-server ]
12 - Conflicts: [ ]
13 - Replaces: [ ]

Geben Sie die betreffende Nummer ein, um die Vorgaben zu ändern: 

Installing with make install...
...

====================== Installation erfolgreich ==========================

Copying documentation directory...
./
./doc/
./doc/Doxyfile
./ChangeLog
./LICENSE
./README
./AUTHORS

Kopiere Dateien in das temporäre Verzeichnis...OK

Stripping ELF binaries and libraries...OK

Komprimiere man-Seiten...OK

Erzeuge Datei-Liste...OK

Erstelle Debian-Paket...OK

Installiere Debian-Paket...OK

Lösche temporäre Dateien...OK

Schreibe Sicherungs-Paket...OK
OK

Lösche temporäres Verzeichnis...OK


**********************************************************************

 Done. The new package has been installed and saved to

 /home/user/guacamole/guacamole-server-0.9.9/guacamole-server_0.9.9-1_amd64.deb

 You can remove it from your system anytime using: 

 dpkg -r guacamole-server

**********************************************************************

8. Make guacd to start automatically at system start:

$ sudo update-rc.d guacd defaults

9. Install Tomcat8:

$ sudo apt-get install tomcat8

10. Download web application package and put it in tomcat8 webapps directory with another name:

$ cd ..
$ wget http://sourceforge.net/projects/guacamole/files/current/binary/guacamole-0.9.9.war
$ sudo cp guacamole-0.9.9.war /var/lib/tomcat8/webapps/guacamole.war

11. Configure guacamole. Edit “/etc/guacamole/user-mapping.xml”. Here is my “user-mapping.xml”:

<user-mapping>
 <authorize username="my_username"
 password="my_md5hash"
 encoding="md5">
  <connection name="my_connection_name">
   <protocol>vnc</protocol>
   <param name="hostname">localhost</param>
   <param name="port">5900</param>
  </connection>
 </authorize>
</user-mapping>

12. To get md5 hash from your password just type following line in terminal:

$ echo -n <your_password> | md5sum

13. Install “lightdm” and set it as default display manager:

$ sudo apt-get install lightdm lightdm-gtk-greeter

14. Configure “/etc/lightdm/lightdm.conf”. Here is my “lightdm.conf”:

[LightDM]
start-default-seat=true
 
[XDMCPServer]
enabled=true
port=177
 
[SeatDefaults]
allow-guest=false
user-session=mate
session-wrapper=mate-session
greeter-session=lightdm-gtk-greeter
greeter-hide-users=true
autologin-user=user
autologin-user-timeout=0

15. Download no-authentication package, extract and install it:

$ wget http://sourceforge.net/projects/guacamole/files/current/extensions/guacamole-auth-noauth-0.9.9.tar.gz
$ tar -xzf guacamole-auth-noauth-0.9.9.tar.gz
$ sudo mkdir /etc/guacamole/extensions
$ sudo cp guacamole-auth-noauth-0.9.9/guacamole-auth-noauth-0.9.9.jar /etc/guacamole/extensions/.

16. Configure no-authentication package. Here is my “/etc/guacamole/noauth-config.xml”:

<configs>
 <config name="myconfig" protocol="vnc">
  <param name="hostname" value="localhost" />
  <param name="port" value="5900" />
 </config>
</configs>

17. Save following text as “/etc/guacamole/guacamole.properties”:

# Guacamole - Clientless Remote Desktop
# Copyright (C) 2010 Michael Jumper
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# 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/>.

# Hostname and port of guacamole proxy
guacd-hostname: localhost
guacd-port: 4822

# Auth provider class (authenticates user/pass combination, needed if using the provided login screen)
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml

18. Add no authentication configuration to “/etc/guacamole/guacamole.properties” by executing following command:

$ sudo bash -c 'printf "\n%s\n%s\n" "# NoAuth properties" "noauth-config: /etc/guacamole/noauth-config.xml" >> /etc/guacamole/guacamole.properties'

19. Create symbolic link to tomcat8 directory:

$ sudo ln -s /etc/guacamole /usr/share/tomcat8/.guacamole

20. Install VNC Server and xinetd:

$ sudo apt-get install vnc4server xinetd

21. Configure xinetd to start vnc4server. Here is my “/etc/xinetd.d/vnc”:

service vnc
{
 disable = no
 socket_type = stream
 protocol = tcp
 wait = no
 user = nobody
 server = /usr/bin/Xvnc4
 server_args = -inetd -once -query localhost -geometry 1920x1080 -depth 24 -securitytypes=none
 type = UNLISTED
 port = 5900
}

22. Restart the system and connect to this system from another computer using a webbrowser by typing in “<ip-address>:8080/guacamole”.

guacamole-0.9.9

23. That’s it. Happy remote desktopping!

Synchronizing system clock without ntp

I have a very small system running on Busybox and I need to maintain the correctness of system time within a few seconds. Without synchronization this system clock would drift around 10 seconds every 24 hours. My solution was to create two shell scipts, one on server and the other one on the target system (system with Busybox).

The script on the server executes command “date” and save the output as a text file and send that file using ftp to the target system. And the script on target system will read that file and set the system time accordingly. Unfortunately with wireless network I could not predict the file transfer delay time so I had to build a mechanism to add time compensation.

Here is the script on server:

#!/bin/bash
##########################################################################
#This script writes an actual time as a text file on target system.
#This text file will be read by the script on target system
#and be used to synchronize the system time.
#Created by Okki on 07-Dec-2015
##########################################################################

HOST=my.target.system.ip #This is the FTP servers host or IP address.
USER=username            #This is the FTP user that has access to the server.
PASS=password            #This is the password for the FTP user.
ADDSEC=10                #Additional seconds for FTP delay compensation.

#Split the date information into "hh:mm:ss" and write it in file.
#date | awk '{split($0,array," ")} END{print array[4]}' > time.txt
#echo "10:10:10" > time.txt

TIME=$(date | awk '{split($0,array," ")} END{print array[4]}')
HH1=$(echo $TIME | awk '{print substr($0,1,1)}')
HH2=$(echo $TIME | awk '{print substr($0,2,1)}')
MM1=$(echo $TIME | awk '{print substr($0,4,1)}')
MM2=$(echo $TIME | awk '{print substr($0,5,1)}')
SS1=$(echo $TIME | awk '{print substr($0,7,1)}')
SS2=$(echo $TIME | awk '{print substr($0,8,1)}')

HH=$(echo $HH1$HH2)
if [ $HH1 -le 0 ]
then
  HH=$(echo $HH2)
fi

MM=$(echo $MM1$MM2)
if [ $MM1 -le 0 ]
then
  MM=$(echo $MM2)
fi

SS=$(echo $SS1$SS2)
if [ $SS1 -le 0 ]
then
  SS=$(echo $SS2)
fi

let "SS += $ADDSEC"

if [ $SS -ge 60 ]
then
  let "SS -= 60"
  let "MM += 1"
fi

if [ $MM -ge 60 ]
then
  let "MM -= 60"
  let "HH += 1"
fi

if [ $HH -ge 24 ]
then
  let "HH -= 24"
fi

if [ $SS -lt 10 ]
then
  SS=0$SS
fi

if [ $MM -lt 10 ]
then
  MM=0$MM
fi

if [ $HH -lt 10 ]
then
  HH=0$HH
fi

# Write compensated time into text file
echo "$HH:$MM:$SS" > time.txt

# FTP function calls:
# Call 1: Uses the ftp command with the -inv switches.
#-i turns off interactive prompting.
#-n Restrains FTP from attempting the auto-login feature.
#-v enables verbose and progress.
ftp -inv $HOST << EOF

# Call 2: Here the login credentials are supplied by calling the variables.
user $USER $PASS

# Call 3: Here you will change to the directory where you want to put or get.
cd /system/target/path

# Call 4: Here you will tell FTP to put or get the file.
put time.txt

# End FTP Connection.
bye

EOF

And here is the script on target system:

#!/bin/sh

while true ; do
  TIME=$(date | awk '{split($0,array," ")} END{print array[4]}' | sed 's/:/-/g')
  TIME_OLD=$TIME
  # Wait until time changes
  while [ "$TIME_OLD" == "$TIME" ] ; do
    # Check if timesync file from linux server exists
    # and has size greater than zero (ftp copy delay!)
    # Time format hh:mm:ss
    if [ -s time.txt ]
    then
      date -s $(cat time.txt)
      rm time.txt
      # Set system time
      hwclock -w
    fi
    TIME=$(date | awk '{split($0,array," ")} END{print array[4]}' | sed 's/:/-/g')
  done
done # Endlosschleife...

To make this process automatically executes every day, I added following line on Crontab:

10 12 * * * root /path/to/script.sh > /dev/null 2>&1

Line above tells crontab to execute script.sh every day on 12:10.

Display special characters for html

Sometimes we need to create a static html page which displays words with special characters like Ä, ä, Ö, ö, Ü, ü and ß. In order to make these characters can be displayed correctly by webbrowser, we need to convert them in html special character format. I use awk to convert all of those characters into html format.

In this example I need to list file names in a folder and save it as html file. Here is my code:

ls -la /path/to/folder/ | awk '{ 
 gsub (/ /,"\\&nbsp;")
 gsub (/ä/,"\\&auml;")
 gsub (/ö/,"\\&ouml;")
 gsub (/ü/,"\\&uuml;")
 gsub (/ß/,"\\&szlig;")
 gsub (/Ä/,"\\&Auml;")
 gsub (/Ö/,"\\&Ouml;")
 gsub (/Ü/,"\\&Uuml;") ;print $0"<br>"}' >> /path/to/filename.html

With that code above I can see a list of files using webbrowser and get appearance as if I would list it using linux terminal.

Linux Mint 17.1: Navit (Car Navigation) Installation

I have been using Navit for car navigation around six years now. It is a very useful piece of software if you are like me (don’t have a normal navigation system hehe..). I have been traveling around Europe using this program. My first Navit setup ran on Pentium 3 Laptop. It was a little bit slow, but it worked. My second Navit run on Intel i3 Laptop with Debian Squeeze. It worked very good. Now I use the same Laptop with Linux Mint 17.1. My hardware consists of a Laptop and a Navilock Bluetooth BT-413 GPS receiver. And here is my software installation:

1. Install Navit:

$ sudo apt-get install navit
$ sudo apt-get install maptool

2. Install gpsd:

$ sudo apt-get install gpsd

3. Configure Bluetooth Device.

3.1. Here is my “/etc/bluetooth/rfcomm.conf”:

#
# RFCOMM configuration file.
#

rfcomm0 {
    # Automatically bind the device at startup
    bind yes;

    # Bluetooth address of the device
    device 00:09:DD:10:37:7A;

    # RFCOMM channel for the connection
    channel    1;

    # Description of the connection
    comment "BT-GPS";
}

3.2. Here is my “/etc/rc.local”:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# BT GPS Maus mit rfcomm0 binden
/usr/bin/rfcomm bind 0

exit 0

4. Download map (maps.navit-project.org):

planetextractor5. Configure navit.xml. Change the Map filename in xml file with the one you have downloaded. Mine is “osm_bbox_-5.1,45.5,10.9,53.6.bin”.

<map type="binfile" enabled="yes" data="~/.navit/maps/osm_bbox_-5.1,45.5,10.9,53.6.bin"/>

6. I found out that voice produced by Mbrola sounds better than directly from Espeak. Here is how to install Mbrola:

$ sudo apt-get install mbrola
$ sudo apt-get install mbrola-de7

7. Set the speech in navit.xml. Here is my setting:

<speech type="cmdline" data="espeak -vmb-de7 -s130 -a150 '%s' &amp;"/>

8. Start Navit:

navit29. Happy driving!

Linux Mint LMDE Mate: Missing Menu Button

I have experienced disappearing Mate Menu Button. I could solve the problem using solution on this page.

1. Press Alt-F2. And you will get following window.

run2. Type in following command, click run and you will get a terminal console.

$ mate-terminal

3. Type in following command and press enter.

$ mate-panel --reset

That’s it. Enjoy!

Linux Mint LMDE: Manually Create 70-persistent-net.rules

I have installed Linux Mint LMDE on a PC with 2 LAN ports and a WLAN card. And I realized that there is no file “70-persistent-net.rules” in directory “/etc/udev/rules.d”. This file is important for keeping the same name of network adapters across boots. After googling for a while, I have found the solution on this page.

Basically what I have done was executing this command:

$ sudo udevadm trigger --action=add

Thats it!

LTSP Client: Install PXE-Boot on Harddisk

Here is an easy way to create an LTSP Client without LAN Boot ROM.

1. Start computer using Tiny Core Linux CD.

2. Install Firefox:

screenshot-20150310@223212cropped3. Start Firefox and go to “http://rom-o-matic.net/gpxe/gpxe-1.0.1/contrib/rom-o-matic/”
and download “USB Keychain disk image”.

screenshot-20150310@2238264. From command line type following command:

$ sudo dd if=gpxe-1.0.1-gpxe.usb of=/dev/sda

5. Connect LAN cable to LTSP Server and reboot computer.
6. That’s it. Enjoy!

Linux Mint LMDE Server Setup #5: Public file sharing

I use two types of directory/file sharing: Samba and Ftp server

1. Samba

1.1. Mount drive to share:

$ sudo mkdir /mnt/drive
$ sudo mount -t ext4 /dev/<drive> /mnt/drive

1.2. To make the drive automatically mounted on boot, put following text to the end of “/etc/fstab”:

/dev/<drive>	/mnt/drive	ext4	defaults	0	2

1.3. Create folder to share:

$ sudo mkdir /mnt/drive/share

1.4. Change folder permission:

$ sudo chmod 777 /mnt/drive/share

1.5. Edit “/etc/samba/smb.conf”.

1.5.1. In order to make .exe files executable on samba share, put following line in section “global”:

[global]
   acl allow execute always = True

1.5.2. Put following text to the end of smb.conf file:

[share]
   comment = Freigabe Ordner
   path = /mnt/drive/share
   browseable = yes
   read only = no
   guest ok = yes
   create mask = 0777
   directory mask = 0777

1.5.3. Here is my complete smb.conf:

#
# Sample configuration file for the Samba suite for Debian GNU/Linux.
#
#
# This is the main Samba configuration file. You should read the
# smb.conf(5) manual page in order to understand the options listed
# here. Samba has a huge number of configurable options most of which 
# are not shown in this example
#
# Some options that are often worth tuning have been included as
# commented-out examples in this file.
#  - When such options are commented with ";", the proposed setting
#    differs from the default Samba behaviour
#  - When commented with "#", the proposed setting is the default
#    behaviour of Samba but the option is considered important
#    enough to be mentioned here
#
# NOTE: Whenever you modify this file you should run the command
# "testparm" to check that you have not made any basic syntactic 
# errors. 

#======================= Global Settings =======================

[global]
# Enable file execution
   acl allow execute always = True

## Browsing/Identification ###

# Change this to the workgroup/NT-domain name your Samba server will part of
#   workgroup = WORKGROUP
   workgroup = ARBEITSGRUPPE
   server string = MintServer
# Windows Internet Name Serving Support Section:
# WINS Support - Tells the NMBD component of Samba to enable its WINS Server
#   wins support = no

# WINS Server - Tells the NMBD components of Samba to be a WINS Client
# Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
;   wins server = w.x.y.z

# This will prevent nmbd to search for NetBIOS names through DNS.
   dns proxy = no

#### Networking ####

# The specific set of interfaces / networks to bind to
# This can be either the interface name or an IP address/netmask;
# interface names are normally preferred
;   interfaces = 127.0.0.0/8 eth0

# Only bind to the named interfaces and/or networks; you must use the
# 'interfaces' option above to use this.
# It is recommended that you enable this feature if your Samba machine is
# not protected by a firewall or is a firewall itself.  However, this
# option cannot handle dynamic or non-broadcast interfaces correctly.
;   bind interfaces only = yes



#### Debugging/Accounting ####

# This tells Samba to use a separate log file for each machine
# that connects
   log file = /var/log/samba/log.%m

# Cap the size of the individual log files (in KiB).
   max log size = 1000

# If you want Samba to only log through syslog then set the following
# parameter to 'yes'.
#   syslog only = no

# We want Samba to log a minimum amount of information to syslog. Everything
# should go to /var/log/samba/log.{smbd,nmbd} instead. If you want to log
# through syslog you should set the following parameter to something higher.
   syslog = 0

# Do something sensible when Samba crashes: mail the admin a backtrace
   panic action = /usr/share/samba/panic-action %d


####### Authentication #######

# Server role. Defines in which mode Samba will operate. Possible
# values are "standalone server", "member server", "classic primary
# domain controller", "classic backup domain controller", "active
# directory domain controller". 
#
# Most people will want "standalone sever" or "member server".
# Running as "active directory domain controller" will require first
# running "samba-tool domain provision" to wipe databases and create a
# new domain.
   server role = standalone server

# If you are using encrypted passwords, Samba will need to know what
# password database type you are using.  
   passdb backend = tdbsam

   obey pam restrictions = yes

# This boolean parameter controls whether Samba attempts to sync the Unix
# password with the SMB password when the encrypted SMB password in the
# passdb is changed.
   unix password sync = yes

# For Unix password sync to work on a Debian GNU/Linux system, the following
# parameters must be set (thanks to Ian Kahan <<kahan@informatik.tu-muenchen.de> for
# sending the correct chat script for the passwd program in Debian Sarge).
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .

# This boolean controls whether PAM will be used for password changes
# when requested by an SMB client instead of the program listed in
# 'passwd program'. The default is 'no'.
   pam password change = yes

# This option controls how unsuccessful authentication attempts are mapped
# to anonymous connections
   map to guest = bad user

########## Domains ###########

#
# The following settings only takes effect if 'server role = primary
# classic domain controller', 'server role = backup domain controller'
# or 'domain logons' is set 
#

# It specifies the location of the user's
# profile directory from the client point of view) The following
# required a [profiles] share to be setup on the samba server (see
# below)
;   logon path = \\%N\profiles\%U
# Another common choice is storing the profile in the user's home directory
# (this is Samba's default)
#   logon path = \\%N\%U\profile

# The following setting only takes effect if 'domain logons' is set
# It specifies the location of a user's home directory (from the client
# point of view)
;   logon drive = H:
#   logon home = \\%N\%U

# The following setting only takes effect if 'domain logons' is set
# It specifies the script to run during logon. The script must be stored
# in the [netlogon] share
# NOTE: Must be store in 'DOS' file format convention
;   logon script = logon.cmd

# This allows Unix users to be created on the domain controller via the SAMR
# RPC pipe.  The example command creates a user account with a disabled Unix
# password; please adapt to your needs
; add user script = /usr/sbin/adduser --quiet --disabled-password --gecos "" %u

# This allows machine accounts to be created on the domain controller via the 
# SAMR RPC pipe.  
# The following assumes a "machines" group exists on the system
; add machine script  = /usr/sbin/useradd -g machines -c "%u machine account" -d /var/lib/samba -s /bin/false %u

# This allows Unix groups to be created on the domain controller via the SAMR
# RPC pipe.  
; add group script = /usr/sbin/addgroup --force-badname %g

############ Misc ############

# Using the following line enables you to customise your configuration
# on a per machine basis. The %m gets replaced with the netbios name
# of the machine that is connecting
;   include = /home/samba/etc/smb.conf.%m

# Some defaults for winbind (make sure you're not using the ranges
# for something else.)
;   idmap uid = 10000-20000
;   idmap gid = 10000-20000
;   template shell = /bin/bash

# Setup usershare options to enable non-root users to share folders
# with the net usershare command.

# Maximum number of usershare. 0 (default) means that usershare is disabled.
;   usershare max shares = 100

# Allow users who've been granted usershare privileges to create
# public shares, not just authenticated ones
   usershare allow guests = yes

#======================= Share Definitions =======================

[homes]
   comment = Home Directories
   browseable = no

# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
   read only = yes

# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
   create mask = 0700

# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
   directory mask = 0700

# By default, \\server\username shares can be connected to by anyone
# with access to the samba server.
# The following parameter makes sure that only "username" can connect
# to \\server\username
# This might need tweaking when using external authentication schemes
   valid users = %S

# Un-comment the following and create the netlogon directory for Domain Logons
# (you need to configure Samba to act as a domain controller too.)
;[netlogon]
;   comment = Network Logon Service
;   path = /home/samba/netlogon
;   guest ok = yes
;   read only = yes

# Un-comment the following and create the profiles directory to store
# users profiles (see the "logon path" option above)
# (you need to configure Samba to act as a domain controller too.)
# The path below should be writable by all users so that their
# profile directory may be created the first time they log on
;[profiles]
;   comment = Users profiles
;   path = /home/samba/profiles
;   guest ok = no
;   browseable = no
;   create mask = 0600
;   directory mask = 0700

[printers]
   comment = All Printers
   browseable = no
   path = /var/spool/samba
   printable = yes
   guest ok = no
   read only = yes
   create mask = 0700

# Windows clients look for this share name as a source of downloadable
# printer drivers
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
# Uncomment to allow remote administration of Windows print drivers.
# You may need to replace 'lpadmin' with the name of the group your
# admin users are members of.
# Please note that you also need to set appropriate Unix permissions
# to the drivers directory for these users to have write rights in it
;   write list = root, @lpadmin

[share]
   comment = Freigabe Ordner
   path = /mnt/drive/share
   browseable = yes
   read only = no
   guest ok = yes
   create mask = 0777
   directory mask = 0777

1.6. Restart samba service:

$ sudo service samba restart

2. vsftpd

2.1. Install vsftpd:

$ sudo apt-get install vsftpd

2.2. Edit “/etc/vsftpd.conf”:

listen=NO
seccomp_sandbox=NO
anonymous_enable=YES
#allow_writeable_chroot=YES
anon_root=/mnt/drive
anon_umask=022
hide_ids=YES
local_enable=NO
write_enable=YES
chmod_enable=YES
dirlist_enable=YES
lock_upload_files=NO
virtual_use_local_privs=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=NO
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=YES
chown_username=ftp
guest_username=ftp
chown_upload_mode=0777
file_open_mode=0777
async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to Linux Mint FTP service.
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=YES
force_dot_files=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
ssl_ciphers=HIGH
require_ssl_reuse=NO

2.3. Create self-signed SSL Certificate:

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

2.4. Create file “/etc/xinetd.d/vsftpd” and put following text into that file:

service ftp
{
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/vsftpd
        log_on_success  += HOST DURATION
        log_on_failure  += HOST
        disable                 = no
}

2.5. Restart xinetd:

$ sudo service xinetd restart

That’s it. Enjoy!