Howtos for Gentoo Linux (latest version created: 2021-12-08)

Up-to-date Howto(s) and Documentation(s) for Gentoo Linux.

The special thing of this is that the Documentation generates automatically from my running system, so it is every time up to date.
Further this Howto is build modular. The Howtos are sorted in alphabetical order. Every topic has its dependencies. For example: You have to finish Webserver Howto for building webbased statistics.

I hope to give something back to the community with this document.

Please enjoy and send any ideas, wishes or advancements to: doc<at>gabosh.net

License

Copyright (C) 2008-2021 Oliver Bohlen.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License".

Introduction

This documentation comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.

Howto listing

APC UPS
ARP monitoring
Asterisk as PJSIP PBX
Asterisk as SIP PBX
Automatic System Documentation
Backup
Basesystem
DHCP-Server
DNS
DynDNS
File deduplication
File-Server - Samba
Firewall
HD-Spindown
Horde Groupware Webmail
IMAP/POP3-Server
Instand Messaging alternative Jabber
Internet IPv6 Router
Internet Router (pppoe)
Mailinglists with MailMan
Mailserver
MySQL-Server
Network Sound Server
NextCloud
OpenLDAP
OpenLDAP System authentication
OpenLDAP WebGUI phpldapadmin
Printserver
Rename files recursively
SSL/TLS with self signed SSL Certificate
Sane Scanner Server
Save passwords encrypted
Server for thinclients
Sort files alphabetical
Statistics
Stopping brute-force-attacks with fail2ban
Thinclient - Basesystem
Thinclient - Kernel-based Virtual Machine - KVM
Thinclient - Mate
Thinclient - Profiling
Thinclient - Thinclient as Server
Thinclient - Thunderbird
Thinclient - Wireless LAN
Thinclient - X-Server
Time-Server
Two-factor authentication
WLAN Access Point
Webserver

APC UPS

Changes in /etc/apcupsd/apccontrol

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /etc/apcupsd/apccontrol

Changed on 16.05.18
Issued by olli
Beginning line 28

eMail notificvation


Before change
export SYSADMIN=root
After change
export SYSADMIN=root,user1

Changes in /etc/apcupsd/apcupsd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/apcupsd/apcupsd.conf

Changed on 16.05.18
Issued by olli
Beginning line 15

Optional UPS name


Before change
#UPSNAME
After change
UPSNAME usvxgabo

Changed on 16.05.18
Issued by olli
Beginning line 139

System shutdown below battery level


Before change
BATTERYLEVEL 0
After change
BATTERYLEVEL 5

Changed on 16.05.18
Issued by olli
Beginning line 148

System shutdown below remaining runtime on battery


Before change
MINUTES 0
After change
MINUTES 5

Changes in /etc/apcupsd/changeme

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /etc/apcupsd/changeme

Changed on 16.05.18
Issued by olli
Beginning line 20

Battery Change Notification

(
   /sbin/apcaccess status
   echo " "
   echo "$MSG"
) | /usr/local/sbin/xmppsend mail@example.com

Changes in /etc/apcupsd/commfailure

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /etc/apcupsd/commfailure

Changed on 16.05.18
Issued by olli
Beginning line 20

Communication failure Notification

(
   /sbin/apcaccess status
   echo " "
   echo "$MSG"
) | /usr/local/sbin/xmppsend mail@example.com

Changes in /etc/apcupsd/commok

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /etc/apcupsd/commok

Changed on 16.05.18
Issued by olli
Beginning line 20

Communication OK Notification

(
   /sbin/apcaccess status
   echo " "
   echo "$MSG"
) | /usr/local/sbin/xmppsend mail@example.com

Changes in /etc/apcupsd/offbattery

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /etc/apcupsd/offbattery

Changed on 16.05.18
Issued by olli
Beginning line 20

Power returned

(
   /sbin/apcaccess status
   echo " "
   echo "$MSG"
) | /usr/local/sbin/xmppsend mail@example.com

Changes in /etc/apcupsd/onbattery

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /etc/apcupsd/onbattery

Changed on 16.05.18
Issued by olli
Beginning line 20

Power loss

(
   /sbin/apcaccess status
   echo " "
   echo "$MSG"
) | /usr/local/sbin/xmppsend mail@example.com

Changes in /usr/local/sbin/powerconsumption.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/powerconsumption.sh

Changed on 16.05.18
Issued by olli
Beginning line 2

Powerconsumtion Statistics

#!/bin/bash
usvpower=20 # 20 Watt selfconsumtion
maxpower=`apcaccess status | perl -pe 's/ +/ /g;' | grep NOMPOWER | cut -d" " -f 3`
while true
do
 loadpct=`apcaccess status | perl -pe 's/ +/ /g;' | grep LOADPCT | cut -d" " -f 3`
 wattsconsumtion=`echo "scale=2; $loadpct/100*$maxpower+$usvpower" | bc -l | cut -d'.' -f1`
 echo "`date "+%Y-%m-%d %T"` $wattsconsumtion Watt" >>/var/log/powerconsumption-`date +%Y`
 sleep 60
done

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

ARP monitoring

This is a little tool that informs "root" about new MACs in the network via syslog and mail. This monitors the activities of computers in Your network.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-analyzer/arpwatch

Changes in /etc/conf.d/arpwatch

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/arpwatch

Changed on 09.03.08
Issued by olli
Beginning line 14

The interfaces arpwatch should watch.


Before change
ARPWATCH_IFACE=""
After change
ARPWATCH_IFACE="eth0"

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add arpwatch 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Asterisk as PJSIP PBX

Changes in /etc/asterisk/extensions.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/asterisk/extensions.conf

Changed on 07.09.17
Issued by olli
Beginning line 1

Call routing / Action plans


; General settings
[general]
static=yes
writeprotect=no

[local]
; Internal calls ^3[0-9]$
exten => _3X,1,NoOp(${CALLERID})
exten => _3X,n,Dial(PJSIP/${EXTEN},120)
exten => _3X,n,Hangup
; Internal calls ^4[0-9]$
exten => _4X,1,NoOp(${CALLERID})
exten => _4X,n,Dial(PJSIP/${EXTEN},120)
exten => _4X,n,Hangup


[1und1_out]
; local area code calls
exten => _ZX.,1,NoOp(${CALLERID})
; Optional: look up in the Horde addressbook for the caller name
;exten => _ZX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _ZX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _ZX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _ZX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _ZX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _ZX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _ZX.,n,Set(CALLERID(all)="PHONENUMBER" <PHONENUMBER>)
; Route to PJSIP-Provider
exten => _ZX.,n,Set(VOLUME(RX,p)=4)
exten => _ZX.,n,Dial(PJSIP/PHONENUMBER/0DIALPREFIX${EXTEN},120)
exten => _ZX,n,Hangup

; Other Outgoing calls 
exten => _[+0]XX.,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => _[+0]XX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _[+0]XX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _[+0]XX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _[+0]XX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _[+0]XX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _[+0]XX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _[+0]XX.,n,Set(CALLERID(all)="PHONENUMBER" <PHONENUMBER>)
; Route to PJSIP-Provider
exten => _[+0]XX.,n,Set(VOLUME(RX,p)=4)
exten => _[+0]XX.,n,Dial(PJSIP/PHONENUMBER/${EXTEN},120)
exten => _[+0]XX.,n,Hangup


[1und1_olb_out]
; local area code calls
exten => _ZX.,1,NoOp(${CALLERID})
; Optional: look up in the Horde addressbook for the caller name
;exten => _ZX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _ZX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "OLB Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _ZX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _ZX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _ZX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _ZX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _ZX.,n,Set(CALLERID(all)="PHONENUMBER2" <PHONENUMBER2>)
; Route to PJSIP-Provider
exten => _ZX.,n,Set(VOLUME(RX,p)=4)
exten => _ZX.,n,Dial(PJSIP/PHONENUMBER2/0DIALPREFIX${EXTEN},120)
exten => _ZX,n,Hangup

; Other Outgoing calls 
exten => _[+0]XX.,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => _[+0]XX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _[+0]XX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "OLB Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _[+0]XX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _[+0]XX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _[+0]XX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _[+0]XX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _[+0]XX.,n,Set(CALLERID(all)="PHONENUMBER2" <PHONENUMBER2>)
; Route to PJSIP-Provider
exten => _[+0]XX.,n,Set(VOLUME(RX,p)=4)
exten => _[+0]XX.,n,Dial(PJSIP/PHONENUMBER2/${EXTEN},120)
exten => _[+0]XX.,n,Hangup


[incoming]
; Incoming calls to PHONENUMBER
exten => PHONENUMBER,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => PHONENUMBER,n,Set(CALLERID(name)=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(num)})})
; Optional: Notify incoming call per eMail
exten => PHONENUMBER,n,System(echo "`date`: ${CALLERID(all)} ruft an." | mail -s 'Anrufbenachrichtigung ${CALLERID(all)}' mail@example.com)
; Optional: Block blackisted 
; blacklist administrated ober CLI ("asterisk -r")
; Adding a number to be blocked
; *CLI> database put blacklist 1234 "TEST"
; Removing a number from being blocked
; *CLI> database del blacklist 1234
; Listing current blocks
; pbx*CLI> databse show blacklist
exten => PHONENUMBER,n,GotoIf(${BLACKLIST()}?blacklisted)
; Optional: Don't ring in night time excluding numbers in phonebook
exten => PHONENUMBER,n,GotoIf($["${CALLERID(name)}" != ""]?ring)
exten => PHONENUMBER,n,GotoIfTime(23:00-23:59,sun-sat,*,*?noring)
exten => PHONENUMBER,n,GotoIfTime(00:00-05:00,sun-sat,*,*?noring)
; Optional: Record call
exten => PHONENUMBER,n(ring),System(mkdir -p "/home/asterisk/calls")
exten => PHONENUMBER,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => PHONENUMBER,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => PHONENUMBER,n,Monitor(wav,${FILENAME},mb)
; Route the call to local PJSIP-Phones - ringing (try for 60 seconds)
exten => PHONENUMBER,n,Set(VOLUME(TX,p)=4)
exten => PHONENUMBER,n,Dial(PJSIP/30&PJSIP/31&PJSIP/32&PJSIP/33&PJSIP/34&PJSIP/40,60)
; Set Language for Voicemail-Answer
exten => PHONENUMBER,n(noring),Set(CHANNEL(language)=de)
; Start Voicemail
exten => PHONENUMBER,n,Voicemail(30&31)
exten => PHONENUMBER,n,Playback(vm-goodbye)
exten => PHONENUMBER,n(blacklisted),Hangup()
; hangup
exten => PHONENUMBER,n,Hangup

; Incoming calls to PHONENUMBER2
exten => PHONENUMBER2,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => PHONENUMBER2,n,Set(CALLERID(name)=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(num)})})
; Optional: Notify incoming call per eMail
exten => PHONENUMBER2,n,System(echo "`date`: ${CALLERID(all)} ruft an." | mail -s 'Anrufbenachrichtigung ${CALLERID(all)}' mail@example.com)
; Optional: Block blackisted 
; blacklist administrated ober CLI ("asterisk -r")
; Adding a number to be blocked
; *CLI> database put blacklist 1234 "TEST"
; Removing a number from being blocked
; *CLI> database del blacklist 1234
; Listing current blocks
; pbx*CLI> databse show blacklist
exten => PHONENUMBER2,n,GotoIf(${BLACKLIST()}?blacklisted)
; Optional: Don't ring in night time excluding numbers in phonebook
exten => PHONENUMBER2,n,GotoIf($["${CALLERID(name)}" != ""]?ring)
exten => PHONENUMBER2,n,GotoIfTime(23:00-23:59,sun-sat,*,*?noring)
exten => PHONENUMBER2,n,GotoIfTime(00:00-05:00,sun-sat,*,*?noring)
; Optional: Record call
exten => PHONENUMBER2,n(ring),System(mkdir -p "/home/asterisk/calls")
exten => PHONENUMBER2,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => PHONENUMBER2,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => PHONENUMBER2,n,Monitor(wav,${FILENAME},mb)
; Route the call to local PJSIP-Phones - ringing (try for 60 seconds)
exten => PHONENUMBER2,n,Set(VOLUME(TX,p)=4)
exten => PHONENUMBER2,n,Dial(PJSIP/40,60)
; hangup
exten => PHONENUMBER2,n,Hangup

; Default rules Be careful: You have to block all IPs expect these of your PJSIP-Provider to use this option in a most secure way
[default]
include => incoming

; Only for internal phones
[phones]
include => local
include => 1und1_out

[olbworkphones]
include => local
include => 1und1_olb_out


Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Asterisk as SIP PBX

This will show how you can setup an Voice over IP (VoIP) phonebox

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-misc/asterisk

Changes in /etc/asterisk/ari.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/asterisk/ari.conf

Changed on 07.09.17
Issued by olli
Beginning line 2

SIP Phone and Provider settings


Before change
enabled = yes       ; When set to no, ARI support is disabled.
After change
enabled = no

Changes in /etc/asterisk/extensions.conf.ok

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/asterisk/extensions.conf.ok

Changed on 07.09.17
Issued by olli
Beginning line 1

Call routing / Action plans


; General settings
[general]
static=yes
writeprotect=no

[local]
; Internal calls ^3[0-9]$
exten => _3X,1,NoOp(${CALLERID})
exten => _3X,n,Dial(SIP/${EXTEN},120)
exten => _3X,n,Hangup

[1und1_out]
; local area code calls
exten => _ZX.,1,NoOp(${CALLERID})
; Optional: look up in the Horde addressbook for the caller name
exten => _ZX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _ZX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _ZX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _ZX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _ZX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _ZX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _ZX.,n,Set(CALLERID(all)="PHONENUMBER" <PHONENUMBER>)
; Route to SIP-Provider
exten => _ZX.,n,Set(VOLUME(RX,p)=4)
exten => _ZX.,n,Set(VOLUME(TX,p)=4)
exten => _ZX.,n,Dial(SIP/PHONENUMBER/0DIALPREFIX${EXTEN},120)
exten => _ZX,n,Hangup

; Other Outgoing calls 
exten => _[+0]XX.,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
exten => _[+0]XX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _[+0]XX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _[+0]XX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _[+0]XX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _[+0]XX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _[+0]XX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _[+0]XX.,n,Set(CALLERID(all)="PHONENUMBER" <PHONENUMBER>)
; Route to SIP-Provider
exten => _[+0]XX.,n,Set(VOLUME(RX,p)=4)
exten => _[+0]XX.,n,Set(VOLUME(TX,p)=4)
exten => _[+0]XX.,n,Dial(SIP/PHONENUMBER/${EXTEN},120)
exten => _[+0]XX.,n,Hangup

[incoming]
; Incoming calls to PHONENUMBER
exten => PHONENUMBER,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
exten => PHONENUMBER,n,Set(CALLERID(name)=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(num)})})
; Optional: Notify incoming call per eMail
exten => PHONENUMBER,n,System(echo "`date`: ${CALLERID(all)} ruft an." | mail -s 'Anrufbenachrichtigung ${CALLERID(all)}' mail@example.com)
; Optional: Block blackisted 
; blacklist administrated ober CLI ("asterisk -r")
; Adding a number to be blocked
; *CLI> database put blacklist 1234 "TEST"
; Removing a number from being blocked
; *CLI> database del blacklist 1234
; Listing current blocks
; pbx*CLI> databse show blacklist
exten => PHONENUMBER,n,GotoIf(${BLACKLIST()}?blacklisted)
; Optional: Don't ring in night time excluding numbers in phonebook
exten => PHONENUMBER,n,GotoIf($["${CALLERID(name)}" != ""]?ring)
exten => PHONENUMBER,n,GotoIfTime(23:00-23:59,sun-sat,*,*?noring)
exten => PHONENUMBER,n,GotoIfTime(00:00-05:00,sun-sat,*,*?noring)
; Optional: Record call
exten => PHONENUMBER,n(ring),System(mkdir -p "/home/asterisk/calls")
exten => PHONENUMBER,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => PHONENUMBER,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => PHONENUMBER,n,Monitor(wav,${FILENAME},mb)
; Route the call to local SIP-Phones - ringing (try for 60 seconds)
;exten => PHONENUMBER,n,Set(VOLUME(RX,p)=4)
exten => PHONENUMBER,n,Set(VOLUME(TX,p)=4)
exten => PHONENUMBER,n,Dial(SIP/30&SIP/31&SIP/32&SIP/33,60)
; Set Language for Voicemail-Answer
exten => PHONENUMBER,n(noring),Set(CHANNEL(language)=de)
; Start Voicemail
exten => PHONENUMBER,n,Voicemail(30&31)
exten => PHONENUMBER,n,Playback(vm-goodbye)
exten => PHONENUMBER,n(blacklisted),Hangup()
exten => PHONENUMBER,n,Hangup

; Default rules Be careful: You have to block all IPs expect these of your SIP-Provider to use this option in a most secure way
[default]
include => incoming

; Only for internal phones
[phones]
include => local
include => 1und1_out


Changes in /etc/asterisk/extensions.conf.old-sip

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/asterisk/extensions.conf.old-sip

Changed on 07.09.17
Issued by olli
Beginning line 1

Call routing / Action plans


; General settings
[general]
static=yes
writeprotect=no

[local]
; Internal calls ^3[0-9]$
exten => _3X,1,NoOp(${CALLERID})
exten => _3X,n,Dial(SIP/${EXTEN},120)
exten => _3X,n,Hangup
; Internal calls ^4[0-9]$
exten => _4X,1,NoOp(${CALLERID})
exten => _4X,n,Dial(SIP/${EXTEN},120)
exten => _4X,n,Hangup


[1und1_out]
; local area code calls
exten => _ZX.,1,NoOp(${CALLERID})
; Optional: look up in the Horde addressbook for the caller name
;exten => _ZX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _ZX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _ZX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _ZX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _ZX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _ZX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _ZX.,n,Set(CALLERID(all)="PHONENUMBER" <PHONENUMBER>)
; Route to SIP-Provider
exten => _ZX.,n,Set(VOLUME(RX,p)=4)
exten => _ZX.,n,Dial(SIP/PHONENUMBER/0DIALPREFIX${EXTEN},120)
exten => _ZX,n,Hangup

; Other Outgoing calls 
exten => _[+0]XX.,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => _[+0]XX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _[+0]XX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _[+0]XX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _[+0]XX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _[+0]XX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _[+0]XX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _[+0]XX.,n,Set(CALLERID(all)="PHONENUMBER" <PHONENUMBER>)
; Route to SIP-Provider
exten => _[+0]XX.,n,Set(VOLUME(RX,p)=4)
exten => _[+0]XX.,n,Dial(SIP/PHONENUMBER/${EXTEN},120)
exten => _[+0]XX.,n,Hangup


[1und1_olb_out]
; local area code calls
exten => _ZX.,1,NoOp(${CALLERID})
; Optional: look up in the Horde addressbook for the caller name
;exten => _ZX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _ZX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "OLB Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _ZX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _ZX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _ZX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _ZX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _ZX.,n,Set(CALLERID(all)="PHONENUMBER2" <PHONENUMBER2>)
; Route to SIP-Provider
exten => _ZX.,n,Set(VOLUME(RX,p)=4)
exten => _ZX.,n,Dial(SIP/PHONENUMBER2/0DIALPREFIX${EXTEN},120)
exten => _ZX,n,Hangup

; Other Outgoing calls 
exten => _[+0]XX.,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => _[+0]XX.,n,Set(CALLNAME=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(dnid)})})
; Optional: Notify outgoing call per eMail
exten => _[+0]XX.,n,System(echo "`date`: ${CALLERID(all)} ruft ${CALLNAME} <${CALLERID(dnid)}> an!" | mail -s "OLB Telefonat nach drau&szlig;en ${CALLERID(all)} -> ${CALLERID(dnid)}" mail@example.com )
; Optional: Record call
exten => _[+0]XX.,n,System(mkdir -p "/home/asterisk/calls")
exten => _[+0]XX.,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => _[+0]XX.,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => _[+0]XX.,n,Monitor(wav,${FILENAME},mb)
; Remove Name
exten => _[+0]XX.,n,Set(CALLERID(all)="PHONENUMBER2" <PHONENUMBER2>)
; Route to SIP-Provider
exten => _[+0]XX.,n,Set(VOLUME(RX,p)=4)
exten => _[+0]XX.,n,Dial(SIP/PHONENUMBER2/${EXTEN},120)
exten => _[+0]XX.,n,Hangup


[incoming]
; Incoming calls to PHONENUMBER
exten => PHONENUMBER,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => PHONENUMBER,n,Set(CALLERID(name)=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(num)})})
; Optional: Notify incoming call per eMail
exten => PHONENUMBER,n,System(echo "`date`: ${CALLERID(all)} ruft an." | mail -s 'Anrufbenachrichtigung ${CALLERID(all)}' mail@example.com)
; Optional: Block blackisted 
; blacklist administrated ober CLI ("asterisk -r")
; Adding a number to be blocked
; *CLI> database put blacklist 1234 "TEST"
; Removing a number from being blocked
; *CLI> database del blacklist 1234
; Listing current blocks
; pbx*CLI> databse show blacklist
exten => PHONENUMBER,n,GotoIf(${BLACKLIST()}?blacklisted)
; Optional: Don't ring in night time excluding numbers in phonebook
exten => PHONENUMBER,n,GotoIf($["${CALLERID(name)}" != ""]?ring)
exten => PHONENUMBER,n,GotoIfTime(23:00-23:59,sun-sat,*,*?noring)
exten => PHONENUMBER,n,GotoIfTime(00:00-05:00,sun-sat,*,*?noring)
; Optional: Record call
exten => PHONENUMBER,n(ring),System(mkdir -p "/home/asterisk/calls")
exten => PHONENUMBER,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => PHONENUMBER,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => PHONENUMBER,n,Monitor(wav,${FILENAME},mb)
; Route the call to local SIP-Phones - ringing (try for 60 seconds)
exten => PHONENUMBER,n,Set(VOLUME(TX,p)=4)
exten => PHONENUMBER,n,Dial(SIP/30&SIP/31&SIP/32&SIP/33&SIP/34&SIP/40,60)
; Set Language for Voicemail-Answer
exten => PHONENUMBER,n(noring),Set(CHANNEL(language)=de)
; Start Voicemail
exten => PHONENUMBER,n,Voicemail(30&31)
exten => PHONENUMBER,n,Playback(vm-goodbye)
exten => PHONENUMBER,n(blacklisted),Hangup()
; hangup
exten => PHONENUMBER,n,Hangup

; Incoming calls to PHONENUMBER2
exten => PHONENUMBER2,1,NoOp(${CALLERID})
; Optional: Look up in the Horde addressbook for the caller name
;exten => PHONENUMBER2,n,Set(CALLERID(name)=${SHELL(/etc/asterisk/hordelookup.sh ${CALLERID(num)})})
; Optional: Notify incoming call per eMail
exten => PHONENUMBER2,n,System(echo "`date`: ${CALLERID(all)} ruft an." | mail -s 'Anrufbenachrichtigung ${CALLERID(all)}' mail@example.com)
; Optional: Block blackisted 
; blacklist administrated ober CLI ("asterisk -r")
; Adding a number to be blocked
; *CLI> database put blacklist 1234 "TEST"
; Removing a number from being blocked
; *CLI> database del blacklist 1234
; Listing current blocks
; pbx*CLI> databse show blacklist
exten => PHONENUMBER2,n,GotoIf(${BLACKLIST()}?blacklisted)
; Optional: Don't ring in night time excluding numbers in phonebook
exten => PHONENUMBER2,n,GotoIf($["${CALLERID(name)}" != ""]?ring)
exten => PHONENUMBER2,n,GotoIfTime(23:00-23:59,sun-sat,*,*?noring)
exten => PHONENUMBER2,n,GotoIfTime(00:00-05:00,sun-sat,*,*?noring)
; Optional: Record call
exten => PHONENUMBER2,n(ring),System(mkdir -p "/home/asterisk/calls")
exten => PHONENUMBER2,n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M_%S)}-${EXTEN})
exten => PHONENUMBER2,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/home/asterisk/calls/")
exten => PHONENUMBER2,n,Monitor(wav,${FILENAME},mb)
; Route the call to local SIP-Phones - ringing (try for 60 seconds)
exten => PHONENUMBER2,n,Set(VOLUME(TX,p)=4)
exten => PHONENUMBER2,n,Dial(SIP/40,60)
; hangup
exten => PHONENUMBER2,n,Hangup

; Default rules Be careful: You have to block all IPs expect these of your SIP-Provider to use this option in a most secure way
[default]
include => incoming

; Only for internal phones
[phones]
include => local
include => 1und1_out

[olbworkphones]
include => local
include => 1und1_olb_out


Changes in /etc/asterisk/rtp.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/asterisk/rtp.conf

Changed on 04.03.17
Issued by olli
Beginning line 10

Only few rtp-Ports (Firewall has to be opened/forwarded for 5060/udp and these Ports/udp)


Before change
;rtpstart=10000
;rtpend=20000
After change
rtpstart=5000
rtpend=5040

Changes in /etc/asterisk/sip.conf.old

File permissions:
Owner: asterisk
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/asterisk/sip.conf.old

Changed on 07.09.17
Issued by olli
Beginning line 1

SIP Phone and Provider settings

; general settings
[general]
context=default
; listen generally to all on Port 5060
bindaddr=0.0.0.0
bindport=5060
; seems to halp in some cases
srvlookup=yes
; Lang
; cd /var/lib/asterisk/sounds/de
; wget -O core.zip https://www.asterisksounds.org/de/download/asterisk-sounds-core-de-sln16.zip
; wget -O extra.zip https://www.asterisksounds.org/de/download/asterisk-sounds-extra-de-sln16.zip
; unzip core.zip
; unzip extra.zip
; chown -R asterisk:asterisk /var/lib/asterisk/sounds/de
; find /var/lib/asterisk/sounds/de -type d -exec chmod 0775 {} \;
; rm core.zip extra.zip
language=de
; NAT
nat=force_rport,comedia
; No NAT for localnet
localnet=my.lan.network.ip/XXX.XXX.XXX.XXX
localnet=XXX.XXX.XXX.XXX/XXX.XXX.XXX.XXX
; General Video Support
videosupport=yes
; Be careful: You have to block all IPs expect these of your SIP-Provider to use this option in a most secure way
allowguest=yes
rtpkeepalive=5
rtptimeout=15
rtpholdtimeout=20
; Codecs
disallow=all
allow=alaw
allow=ulaw
; Provider SIP Account
registerattempts=60
registerattempts=0
trustrpid=yes
sendrpid=yes
register_retry_403=yes
registertimeout=200
register => PHONENUMBER:PASSWORDC+zq@SIP-PROVIDER-HOSTNAME/PHONENUMBER
register => PHONENUMBER2:PASSWORD2TIXx@SIP-PROVIDER-HOSTNAME/PHONENUMBER2

; outgoing calls
[PHONENUMBER]
type=peer
defaultuser=PHONENUMBER
fromuser=PHONENUMBER
secret=PASSWORD
extension=sipuid
host=SIP-PROVIDER-HOSTNAME
qualify=yes
directmedia=no
dtmfmode=rfc2833
nat=force_rport,comedia
insecure=invite,port
register_retry_403=yes
rtpkeepalive=5
rtptimeout=15
rtpholdtimeout=20

[PHONENUMBER2]
type=peer
defaultuser=PHONENUMBER2
fromuser=PHONENUMBER2
secret=PASSWORD
extension=sipuid
host=SIP-PROVIDER-HOSTNAME
qualify=yes
directmedia=no
dtmfmode=rfc2833
nat=force_rport,comedia
insecure=invite,port
register_retry_403=yes
rtpkeepalive=5
rtptimeout=15
rtpholdtimeout=20


; incoming calls
[1und1_de_in] 
type=peer
fromdomain=SIP-PROVIDER-HOSTNAME
allowguest=yes
qualify=yes
insecure=port,invite
context=incoming
nat=force_rport,comedia
allowguest=yes
rtpkeepalive=5


; local SIP-Phones
[30]
callerid=user1Phone <30>
host=dynamic
domain=my.lan.ip.addr
user=30
secret=PASSWORD
type=friend
language=de
canreinvite=no
context=phones
qualify=yes
rtpkeepalive=5

[31]
callerid=BeckyPhone <31>
host=dynamic
domain=my.lan.ip.addr
user=31
secret=PASSWORD
type=friend
language=de
canreinvite=no
context=phones
qualify=yes
rtpkeepalive=5

[32]
callerid=HomePhone <32>
host=dynamic
domain=my.lan.ip.addr
user=32
secret=PASSWORD
type=friend
language=de
canreinvite=no
context=phones
qualify=yes
rtpkeepalive=5

[33]
callerid=HeidiPhone <33>
host=dynamic
domain=my.lan.ip.addr
user=33
secret=PASSWORD
type=friend
language=de
canreinvite=no
context=phones
qualify=yes
rtpkeepalive=5

[40]
callerid=StationGabosh <40>
host=dynamic
domain=my.lan.ip.addr
user=40
secret=PASSWORD
type=friend
language=de
canreinvite=no
context=olbworkphones
qualify=yes
rtpkeepalive=5


Changes in /etc/asterisk/voicemail.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/asterisk/voicemail.conf

Changed on 07.09.17
Issued by olli
Beginning line 1

Voicemail setting

[general]
format=wav49
serveremail=asterisk
attach=yes
delete=yes
maxsilence=10
maxsecs=300
silencethreshold=128
maxlogins=3
emaildateformat=%A, %d %B %Y at %H:%M:%S
locale=de_DE.utf8 
fromstring=GaboshPBX
emailsubject=Neue Sprachnachricht von ${VM_CALLERID} (Anrufbeantworter)
emailbody=Hallo ${VM_NAME},\n\nEs ist eine neue Sprachnachricht (Nummer ${VM_MSGNUM}) vom Anrufbeantworter eingetroffen.\n\nDatum:    ${VM_DATE}\nAnrufer:  ${VM_CALLERID}\nDauer:    ${VM_DUR} Minuten\n\nDie Nachricht befindet sich im Anhang dieser eMail!
emaildateformat=%d.%m.%Y %H:%M:%S

[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM

[default]
30 => 1234,user1,mail@example.com
31 => 1234,user2,mail@example.com
40 => 1234,user1,mail@example.com

Changes in /usr/local/sbin/fire.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/fire.sh

Changed on 07.09.17
Issued by olli
Beginning line 323

Allow incomming SIP Connections only from my SIP Provider (1und1 Calls)

#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/24 --dport 5060 -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/24 --dport $RTPRANGE -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/24 --dport 5060 -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/24 --dport $RTPRANGE -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/32 --dport 5060 -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/32 --dport $RTPRANGE -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/32 --dport 5060 -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/32 --dport $RTPRANGE -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/24 --dport 5060 -m conntrack --ctstate NEW -j ACCEPT
#iptables -A gabosh-inet -p udp -s XXX.XXX.XXX.XXX/24 --dport $RTPRANGE -m conntrack --ctstate NEW -j ACCEPT
iptables -A gabosh-lan -p udp --dport 5060 -m conntrack --ctstate NEW -j ACCEPT
iptables -A gabosh-lan -p udp --dport $RTPRANGE -m conntrack --ctstate NEW -j ACCEPT


Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add asterisk 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Automatic System Documentation

This howto shows the perl-script(s) to automatically create my system-documentation with all changes in all config-files. So this has been generated with it as well.

If you want to use this solution you need the following howto(s) finished:

Changes in /etc/local.d/01_services.start

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/local.d/01_services.start

Changed on 13.01.09
Issued by olli
Beginning line 6

Start the changedocd-daemon at system boot.

#/usr/local/bin/changedocd.pl

Changes in /usr/local/bin/changedocd.pl

File permissions:
Owner: root
Group: apache
Permissions: -rwxr-x---

Click here for a download of the complete file: /usr/local/bin/changedocd.pl

Changed on 27.04.10
Issued by olli
Beginning line 2

This is the daemon for getting the data from the CGI and changeing the Comments directly in the Config-Files

#!/usr/bin/perl


# Daemon start
use Proc::Daemon;
Proc::Daemon::Init;
use Net::SMTP;

while (1) {
$before="";
$after="";
$intro="";
if (-f "/tmp/changedoc") {
 open(CHANGE, "</tmp/changedoc");
 @change=<CHANGE>;
 close(CHANGE);
 
 if ($change[0] =~ /^[0-9]+$/) {

 foreach $line (@change) {
   chomp ($line);
 }
  $linenr=$change[0];
  $file=$change[1];
  $comment=$change[2];
 
  open(FILE, "<$file");
  @file=<FILE>;
  close(FILE);
  $linecount=1;
  #print "<br>$linenr<br>";
  foreach $line (@file) {
   if (($line=~/\|\|\|/) && ($linenr==$linecount)) {
    $found=1;
    $before=$line;
    $line=~s/(.+)\|\|\|.+$/$1|||$comment/;
    $after=$line;
   }
   $linecount++;
  }
  #print "\n$file";
  open(NFILE, ">$file");
  print NFILE @file;
  close(NFILE);
  $mailtxt="Hi,

change in file $file on line $linenr
Before change: 
$before

------------------------------------------

After change:
$after

Bye $0
";
  $mail_pass=`gtc-crypt -a admin -p`;
  chomp($mail_pass);
  $smtp = Net::SMTP->new('localhost') || warn ("Could not connect to Mailserver on localhost\n$!");
  $smtp->auth('admin', $mail_pass ) || warn ("Could not authenticate to Mailserver\n$!");
  $mail_pass="";
  $smtp->mail('mail@example.com') || warn ("Could not enter sender address\n$!");
  $smtp->to('mail@example.com') || warn ("Could not enter recipient\n$!");
  $smtp->data() || warn ("Could not open data channel\n$!");
  $smtp->datasend("To: user1\@example.com\n") || warn ("Could not send header\n$!");
  $smtp->datasend("Subject: Change in $file\n") || warn ("Could not send header\n$!");
  $smtp->datasend("\n") || warn ("Could not send header\n$!");
  $smtp->datasend("$mailtxt") || warn ("Could not send body\n$!");
  $smtp->dataend() || warn ("Could not close data channel\n$!");
  $smtp->quit || warn ("Could not close connection\n$!");
 }
 else {
  $howto=$change[0];
  chomp($howto);
  $change[0]="";
  foreach $line (@change) {
   $intro=$intro . $line;
  }
  $after=$intro;

  open(INTRO, "</usr/local/etc/sysdoc/topics");
  @intro=<INTRO>;
  close(INTRO);
  $set=0;
  $next=0;
  $found=0;
  #print "$howto";
  foreach $line (@intro) {
   if ($next) {
    #print "Next gesetzt\n";
    #print "Zeile: $line";
    if ($line=~/\|\|\|/) {
     #print "next wird unwahr\n";
     $next=0;
     next;
    }
    if ($set) {
     #print "SET ist gesetzt\n";
     $before="$before$line";
     $line="";
     next;
    }
    else {
     #print "ELSE\n";
     $found=1;
     $before=$line;
     $line="$intro\n";
     #print "Zeile $line";
     $set=1;
    }
   }
   if ($line=~/^\|\|\|$howto\|\|\|/) {
    $next=1;
    #print "Howto gefunden";
   }
  }
  if ($found) {
   open(INTRO, ">/usr/local/etc/sysdoc/topics");
   foreach $line (@intro) {
#    while ($line =~ /\n$/) {
     $line=~s/^\n//;
     $line=~s/^\n$//;
#    }
    print INTRO $line;
   }
   close(INTRO);
  }
  $mailtxt="Hi,

change in Howto describtion for $howto
Before change:
$before

----------------------------

After change:
$after

Bye $0
";
  $mail_pass=`gtc-crypt -a admin -p`;
  chomp($mail_pass);
  $smtp = Net::SMTP->new('localhost') || warn ("Could not connect to Mailserver on localhost\n$!");
  $smtp->auth('admin', $mail_pass ) || warn ("Could not authenticate to Mailserver\n$!");
  $mail_pass="";
  $smtp->mail('mail@example.com') || warn ("Could not enter sender address\n$!");
  $smtp->to('mail@example.com') || warn ("Could not enter recipient\n$!");
  $smtp->data() || warn ("Could not open data channel\n$!");
  $smtp->datasend("To: user1\@example.com\n") || warn ("Could not send header\n$!");
  $smtp->datasend("Subject: Change in Howto describtion\n") || warn ("Could not send header\n$!");
  $smtp->datasend("\n") || warn ("Could not send header\n$!");
  $smtp->datasend("$mailtxt") || warn ("Could not send body\n$!");
  $smtp->dataend() || warn ("Could not close data channel\n$!");
  $smtp->quit || warn ("Could not close connection\n$!"); 
 }
 system("/usr/local/bin/sysdoc.pl fast");
 unlink("/tmp/changedoc");
}
sleep 1;
}

Changes in /usr/local/bin/sysdoc.pl

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/bin/sysdoc.pl

Changed on 27.04.10
Issued by olli
Beginning line 2

This is the script that creates the search engine optimized, W3C validated HTML-documentation incl. Google Sitemap, Meta-Tags from headline, robots.txt, complete.html with all docs in one page,...

#!/usr/bin/perl

# Pfad wo die Webseiten liegen sollen
$webpath="/var/www/doc.example.com/htdocs";

# Impressum:
$impr='<h1>About / Impressum</h1>
<a href="impr.html">Click here for About / Impressum</a>
<h1>Wishlist</h1>
If you want to support my work you can find my Amazon whishlist <a href="http://www.amazon.de/registry/wishlist/308SONKPDDDT2">here</a>
';


# Werbung
$ad="";

# Wenn als Argument fast &uuml;bergeben wird, dann nur die Dateien neu einlesen, die schon eigelesen wurden.
if ($ARGV[0] eq "fast") {
 print "Not searching for new files!!!\n";
 # Kopien der beim letzen Mal analysierten Dateien liegen im Verzeichnis $webpath/files - Sortieren nach Alphabet
 @files=`find $webpath/files/ -type f | sort`;
 # $webpath/files/ aus dem @files-Elementen rausschneiden um dort nur die Dateinamen drin zu haben.
 foreach $f (@files) {
  $f=~s/^$webpath\/files//;
 }
}
else {
# Wenn nicht fast &uuml;bergeben wurde, dann diese Suchpfade benutzen - sortieren nach Alphabet:
 @files=`find /boot/grub/grub.cfg /etc /var/bind /gtc/test/etc /usr/local/bin /usr/local/sbin /usr/local/etc /var/www/www.example.com/htdocs/intern/phpldapadmin/config /gtc/pxe/pxelinux.cfg /var/www/horde.example.com/htdocs/config /var/www/horde.example.com/htdocs/imp/config /var/www/horde.example.com/htdocs/ingo/config /var/www/horde.example.com/htdocs/kronolith/config /var/www/horde.example.com/htdocs/mnemo/config /var/www/horde.example.com/htdocs/nag/config /var/www/horde.example.com/htdocs/passwd/config /var/www/horde.example.com/htdocs/turba/config /var/www/doc.example.com/cgi-bin /var/www/doc.example.com/htdocs/howto.css /gtc/test/usr/lib64/thunderbird/distribution /gtc/test/usr/lib64/thunderbird/defaults/pref /gtc/test/usr/lib64/firefox/distribution /gtc/test/usr/lib64/firefox/defaults/pref -type f | grep -v 'etc/thinclient/profiles' | sort`;
}

# Daten f&uuml;r die Meta-Tags (Suchmaschinenoptimierung)
$metaauthor="Oliver Bohlen";
$metashortdescr="Up-to-date Howto(s) and Documentation(s) for Gentoo Linux.";
# URL &uuml;ber die die Webseite aufgerufen wird
$url="http://doc.example.com";


$jahr=`date +%Y`;
# Lizenz informationen
$license="
  <h1>License</h1>
  <p>Copyright (C) 2008-$jahr $metaauthor.</p>
  <p>Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.</p><p>
A copy of the license is included in the section entitled \"<a href=\"/license/fdl.html\">GNU Free Documentation License</a>\".</p>
  <h1>Introduction</h1>
  <p>This documentation comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.</p>
";

# Datum f&uuml;r die Google-Sitemap im speziellen Format. (Suchmaschinenoptimierung)
$sitemapdate=`date +\%Y-\%m-\%d`;
chomp($sitemapdate);
# Header f&uuml;r die Sitemap
$sitemap='<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
';
$sitemap.=" <url>
  <loc>$url/</loc>
  <lastmod>$sitemapdate</lastmod>
  <changefreq>monthly</changefreq>
  <priority>0.2</priority>
 </url>";

# Erstellungsdatum holen
$createdate=`date +\%Y-\%m-\%d`;
chomp($createdate);
# Erstellungsdatm f&uuml;r Metatags im speziellen Format (Suchmaschinenoptimierung)
$metadate=`date +\%Y-\%m-\%m:\%S\%:z`;
chomp($metadate);
# Ende des Titels f&uuml;r jede Seite
$htmltitle="for Gentoo Linux";
# Doctype f&uuml;r saubere HTML-Spezifikation
$doctype='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">';
# L&ouml;schen der "alten" Dateiversionen
`rm -rf $webpath/files/*`;
# Liste von Konfigurationsdateien durchgehen.
foreach $file (@files) {
 chomp($file);
 # libpicker.pl ignorieren ???
 if ($file =~ /libpicker.pl/) { next }
 # Dateien nur einlesen wenn der Dateityp am text, bzw. XML ist, also wenn es sich um Textdateien handelt
 if (`file -b $file` =~ /[text|XML|text, with very long lines]\n$/) {
  # Zeilenz&auml;hler auf 0 setzen. ( Wegen vorheriger durchl&auml;ufe)
  $linenr=0;
  # Konfigurationsdatei &ouml;ffnen und zeilenweise in Array @lines speichern
  open(CONF, "<$file");
  @lines=<CONF>;
  close(CONF);
  # Dateiinhaltsvariable initialisieren bzw. wegen ggf. vorheriger druchl&auml;ufe l&ouml;schen.
  $filecontent="";
  # Pr&uuml;fvariable ob es sich um den Anfang einer &Auml;nderung (before-Markierung) vom default handelt wegen ggf. vorheriger Druchl&auml;ufe auf false setzen.
  $ischangefile=0;
  # Zeilen der Konfigurationsdatei durchgehen.
  foreach $line (@lines) {
   # Wenn am Anfang der zeile keine before usw. -Markierung steht, dann bestimmte Schl&uuml;sselString filtern bzw. durch Dummy-Werte ersetzen
   unless ($line=~/before\|\|\|.*\|\|\|.*\|\|\|/) {
    # Filterungen von Passw&ouml;rtern, Telefonnummern usw. aus den Konfigurationsdateien. - Diese Filterungen ggf. in Extra Datei speichern
    #----------- FILTER -----------
    $line=~s/dyndns.kontent.com\/ipchange.php\?domain=example.com.*$/URL/g;
    $line=~s/PHONENUMBER:PASSWORD/PHONENUMBER:PASSWORD/g;
    $line=~s/PHONENUMBER2:PASSWORD2/PHONENUMBER2:PASSWORD2/g;
    $line=~s/SIP-PROVIDER-HOSTNAME/SIP-PROVIDER-HOSTNAME/g;
    $line=~s/PHONENUMBER/PHONENUMBER/g;
    $line=~s/PHONENUMBER2/PHONENUMBER2/g;
    $line=~s/DIALPREFIX/DIALPREFIX/g;
    $line=~s/PHONENUMBER/PHONENUMBER/g;
    $line=~s/PHONENUMBER2/PHONENUMBER2/g;
    $line=~s/MOBILEPHONENUMBER/MOBILEPHONENUMBER/g;
    $line=~s/secret=PASSWORD
    $line=~s/[a-z-]+\@[a-z-\.]+/mail\@example.com/g;
    $line=~s/relay.mail.server/relay.mail.server/g;
    $line=~s/DeviceURI smb\:\/\/.*$/DeviceURI smb\:\/\/user\:password\@server\/printername/;
    $line=~s/&auml;/&auml;/g;
    $line=~s/whitelist_from mail@example.com
    $line=~s/&ouml;/&ouml;/g;
    $line=~s/&uuml;/&uuml;/g;
    $line=~s/&Auml;/&Auml;/g;
    $line=~s/&Ouml;/&Ouml;/g;
    $line=~s/&Uuml;/&Uuml;/g;
    $line=~s/&szlig;/&szlig;/g;
    $line=~s/&/&amp;/g;
    $line=~s/^HOTP.+$/HOTP\/T30\/6 username - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/g;
    $line=~s/gabosh\.net/example\.com/g;
    $line=~s/dc=example,dc=com/dc=example,dc=com/g;
    $line=~s/my.lan.ip.addr/my.lan.ip.addr/g;
    $line=~s/my.lan.network.ip/my.lan.network.ip/g;
    $line=~s/my.default.route.ip/my.default.route.ip/g;
    $line=~s/my.dmz.ip.addr/my.dmz.ip.addr/g;
    $line=~s/my.dmz.network.ip/my.dmz.network.ip/g;
    $line=~s/conf_passwdkey="12345678901234567890123456789012";
    $line=~s/conf_passwdfile="/path/for/passwd/dbfile";
    $line=~s/conf_passwddiv='1234567890123456'
    $line=~s/wpa_passphrase=secret
    $line=~s/\{SSHA\}.*$/\{SSHA\}XXXXXXXXXXXXXXXXXXXXXXXXX/;
    $line=~s/^\$key\=\"31894.*/\$key\=\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\;/;
    $line=~s/psk="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    $line=~s/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/g;
    $line=~s/\/usr\/local\/sbin\/gentoolydyndns.sh/ez-ipupdate -q -a `wget -q -O - http:\/\/getip.dyndns.org | sed -e "s\/^.*: \/\/" -e "s\/<.*\$\/\/"` -S dyndns-custom -h yourhostname.dyndns.org -m yourmailmx.example.com -u dyndnsuser:dyndnspass`/g;
    $line=~s/password'] = 'XXXXXXXX'
    unless (($line=~/0.0.0.0/) || ($line=~/127.0.0.1/) || $line=~/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\./) {
     $line=~s/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/XXX\.XXX\.XXX\.XXX/g;
    }
    $line=~s/23\.172/XXX.XXX/g;
    $line=~s/1\.1\.10/XXX.XXX.XXX/g;
    $line=~s/1\.168\.192/XXX.XXX.XXX/g;
    if ($line=~/^[0-9]+\.[0-9]+.*IN.*PTR/) {
     $line=~s/^[0-9]+\.[0-9]+/XXX.XXX\t/;
    }
    if ($line=~/^[0-9]+.*IN.*PTR/) {
     $line=~s/^[0-9]+/XXX\t/;
    }
    if (($file=~/\/var\/bind\/zones\//) && ($line=~/^\;/) && ($line!~/^\; before/) && ($line!~/^\; after/) && ($line!~/^\; \-\-\-\-/)) { $line="" }
    $line=~s/..\:..\:..\:..\:..\:../XX\:XX\:XX\:XX\:XX\:XX/g;
    $line=~s/username_ppp0='provideruser'
    $line=~s/password_ppp0='providerpass'
    $line=~s/user1/user1/ig;
    $line=~s/user2/user2/ig;
    $line=~s/user3/user3/ig;
    #----------- FILTER ENDE -----------
   }
   # Zeile an Variable f&uuml;r Dateiinhalt nach der Filterung anf&uuml;gen.
   $filecontent.=$line;
   # Zeilennummer hochz&auml;hlen
   $linenr++;
   # Newline (\n) von Zeile entfernen
   chomp($line);
   # Zeile f&uuml;r weitere Pr&uuml;fungen kopieren...???
   $cline=$line;
   # Wenn es sim um eine Endmarkierung f&uuml;r eine &Auml;nderung handelt und die doc-Pr&uuml;fvariable gesetzt ist, es sich also tats&auml;chlich um eine &Auml;nderung handelt, dann die Ausgabe in der Doku hier beenden.
   if ((($line =~ /# \----/) || ($line =~ /; \----/) || ($line =~ / \----$/) || ($line =~ /\<!-- END --\>/) || ($line =~ /\%\% \----$/)) && ($doc)) {
    # HTML-Code zum beenden der &Auml;nderungsdarstellung.
    $topics{$topic}.="</pre>\n <br>\n";
    # Ab jetzt handelt es sich nicht mehr um einen Teil, der dokumentiert werden muss, da das Ende der &Auml;nderung erreicht ist.
    $doc=0;
    # Weiter mit der n&auml;chsten Zeile...
    next;
   }
   # Wenn wir uns in einer Zeile, die zu einem zu dokumentierenden Bereich, also nach der before-Zeile befinden, dann...
   if ($doc) {
    # ... und wenn in der Zeile ein after ohne das dahinter steht ...
    if ($line =~ / after$/) {
     # ... und wenn es sich um eine Datei&auml;nderung handelt, ohne dass sich eine vorhandene Zeile ge&auml;ndert hat ...
     if ($noprintafterchange) {
      # ... dann die After-Change-Markierung in die Doku einf&uuml;gen
      $topics{$topic}.="</pre>\n  After change<pre class=\"after\">\n";
     }
     else {
      # ansonsten ohne die After-Change-Markierung in die Doku einf&uuml;gen
      $topics{$topic}.="  <pre class=\"after\">\n";
     }
     # Pr&uuml;fvariable setzen um zu markieren, dass die After-Zeile durchlaufen wurde - Jetzt kommt also das Ge&auml;nderte, nicht mehr der alte Zustand.
     $nachher=1;
     # In der n&auml;chsten Zeile fortfahren...
     next;
    }
    # Hier handelt es sich also um den Bereich zwischen before und ----, aber nicht die after-Zeile
    # Ein paar HTML-Standarf-Konforme anpassungen f&uuml;r Sonderzeichen
    $line =~ s/</\&lt;/g;
    $line =~ s/>/\&gt;/g;
    # Wenn es sich um Inhalte zwischen before und after handelt, dann die zus&auml;tzlichen Kommentarzeichen am Zeilenanfang l&ouml;schen.
    unless ($nachher) {
     $line=~s/^# //;
     $line=~s/^; //;
    }
    # Zeile der Doku zu diesem Thema hinzuf&uuml;gen
    $topics{$topic}.="$line\n";
    # In der n&auml;chsten Zeile fortfahren....
    next;
   }
   # Wenn in der Zeile echo<IRGENDWAS>before steht, dann mit der n&auml;chsten Zeile fortfahren...???
   if ( $cline =~ /echo.*before/ ) { 
   # $topics{$topic}.="$line\n";
    next;
   }
   # Wenn es sich um eine before-Zeile handelt.
   if ( $cline =~ / before\|\|\|/) {
    # Markierung f&uuml;r die ver&auml;nderte Datei setzen.
    $ischangefile=1;
    # Markierung setzen, dass die After-Zeile noch nicht durchlaufen wurde.
    $nachher=0;
    # Die Zeile in an den |||-Trennern aufsplitten
    @line=split(/\|\|\|/, $cline);
    # &Auml;nderungsdatum dieser &Auml;nderung aus dem Split holen.
    $date=$line[1];
    # ggf. Leerzeichen in dem Datum entfernen
    $date=~s/[ ]+//g;
    # ggf. folgende Zeichen #, <!--, ; entfernen...?
    $date=~s/^[#|<!--|;]//; 
    # Person die diese &Auml;nderung vorgenommen hat aus dem Split holen.
    $editor=$line[2];
    # Thema zu dem diese &Auml;nderung geh&ouml;rt aus dem Split holen.
    $topic=$line[3];
    # Kommentar zu dieser &Auml;nderung aus dem Split holen.
    $comment=$line[4];
    # Falls topic nicht gesetzt ist auf "not defined" setzen
    $topic="not defined" unless $topic;
    # Datei und Thema zusammenf&uuml;gen um ...
    $filetopic=$file . $topic;
    # ... zu pr&uuml;fen ob schon eine &Auml;nderung zu diesem Topic in dieser Datei gab, damit die Daten &uuml;ber die Datei selbst nicht mehrmals pro Thema aufgef&uuml;hrt werden
    if ($oldfiletopic ne $filetopic) {
     # ... Daten &uuml;ber die datei ermitteln und als HTML-Code der Doku hinzuf&uuml;gen
     # Eigent&uuml;mer/Gruppe und Zugriffsrechte der Dtaei besorgen
     $rights=`ls -ld $file`;
     @rights=split(/ /, $rights);
     # Erstellen des Headers mit Infos &uuml;ber die Datei und dem link zur Ansicht der kompletten Datei 
     $topics{$topic}.="  <h2><a class=\"h2link\" name=\"$file-$topic\">Changes in $file</a></h2>
  <p><i>File permissions:</i> <br>
  <b>Owner</b>: $rights[2]<br>
  <b>Group</b>: $rights[3]<br>
  <b>Permissions</b>: $rights[0]<br>
  </p>
  <p><a download href=\"http://doc.example.com/files$file\">Click here for a download of the complete file: $file</a></p>\n";
     # Erstelle einen File-Eintrag auf der Startseite f&uuml;r den File Index
     $index .= "  <a href=\"#$file-$topic\">$file ($topic)</a><br>\n";
     # Da die HTML-Datei f&uuml;r das Thema wegen Suchmaschinenoptimierung m&ouml;glichst so heissen sollte wie das Thema selbst wird der Topic-Name mit ein paar Einschr&auml;nkungen (Sonderzeichen in internationalen-Browsern in Dateinamen sind ung&uuml;nstig) &uuml;bernommen 
     $topic_file=$topic;
     # ggf. alle nicht latein-alphanummerischen Zeichen in _ umwandeln
     $topic_file=~s/[^a-zA-Z0-9]/_/g;
     # ggf. mehrere _ hintereinander durch ein _ ersetzen.
     $topic_file=~s/_+/_/g;
     # Markierung in HTML-Code f&uuml;r direkte Links von der Startseite (index.html) auf die Datei in der entsprechenden Doku/Howto
     $pindex .= "  <a href=\"http://doc.example.com/howto_$topic_file.html#$file-$topic\">$file ($topic)</a><br>\n";
    }
    # HTML-Code mit Infos &uuml;ber die &Auml;nderung.
    $topics{$topic}.="  <i class=\"small\">Changed on $date</i><br>
  <i class=\"small\">Issued by $editor</i><br>
  <i class=\"small\">Beginning line $linenr</i><br>
  <!-- $file|||$linenr --><p class=\"comment\">$comment</p>\n";
    # Grunds&auml;tzlich davon ausgehen, dass es sich nicht um eine &Auml;nderung einer vorhandenen Zeile handelt
    $noprintafterchange=0;
    # Wenn in der n&ouml;chsten Zeile ein after steht, dann handelt es sich doch um eine hinzugef&uuml;gte Zeile und nicht um eine &auml;nderung einer vorhandenen Zeile
    unless ($lines[$linenr] =~ /after$/) {
     # ... Die Before change &Uuml;berschrift einf&uuml;gen um die Zeile(n) die ge&auml;ndert wurden auszugeben.
     $topics{$topic}.="  <br>Before change<pre class=\"before\">\n";
     # entsprechende MArkierung setzen also daf&uuml;r, dass es es sich un eine &Auml;nderung einer existierenden Zeile handelt.
     $noprintafterchange=1;
    } 
    # Oldfiletopic setzen um mit der n&auml;chsten Anderung zu vergleichen
    $oldfiletopic=$file . $topic;
    # Markierung, dass ab hier die Doku zur &Auml;nderung beginnt
    $doc=1;
   }
  }
  if ($ischangefile) {
   print "$file\n";
   $path=$file;
   @pathparts=split(/\//, $path);
   pop(@pathparts);
   $path="";
   foreach $pathpart (@pathparts) {
    $path.="/$pathpart";
   }
   $path=~s/^\/\//\//;
   `mkdir -p $webpath/files$path`;
   open(FILE, ">$webpath/files$file") || warn "Konnte Datei $webpath/files$file nicht &ouml;ffnen";
   print FILE $filecontent;
   close(FILE);
  }
 }
}

$topics="  <h1><a class=h1link name=howtos>Howto listing</a></h1>\n";
$itopics="  <h1><a class=h1link name=howtos>Howto listing</a></h1>\n";
#`rm -rf $webpath/howto_*`;
foreach $topic (sort keys %topics) {
 $content .= "  <h1><a class=\"h1link\" name=\"t-$topic\">$topic</a></h1>\n";
 $metakeywords.="$topic, ";
 $tfile="$doctype
<html>
 <head>
  <title>Howto: $topic $htmltitle</title>
  <meta name=\"description\" content=\"$topic - $metashortdescr\">
  <meta name=\"date\" content=\"$metadate\">
  <meta name=\"author\" content=\"$metaauthor\">
  <meta name=\"keywords\" content=\"$topic, howto, documentation, gentoo, linux, up to date, up-to-date, new\">
  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\">
  <meta name=\"robots\" content=\"all\">
  <meta http-equiv=\"expires\" content=\"0\">
  <link rel=\"stylesheet\" type=\"text/css\" href=\"/howto.css\">
 </head>
 <body><div class=\"frame\">
  $ad
  $license
  <h1>Howto: $topic $htmltitle</h1>\n ";
 open (TOPICSFILE, "</usr/local/etc/sysdoc/topics");
 @topicsfile=<TOPICSFILE>;
 close(TOPICSFILE);
 $topicfile_desc=0;
 $topicdesc="";
 $topicfile_deps="";
 $topicfile_hw="";
 $topicfile_sw="";
 $topicfile_service="";
 $topicfile_topic="";
 if ($topic =~ /^Thinclient - /) {
  $prefix="chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && ";
  $end="'";
 }
 else {
  $prefix="";
  $end="";
 }
 foreach $topicsfileline (@topicsfile) {
  if ($topicsfileline =~ /^\#/) { next }
  if ($topicsfileline =~ /^\|\|\|$topic/) {
   chomp($topicsfileline);
   @topicsfileline=split(/\|\|\|/, $topicsfileline);
   $topicfile_topic = $topicsfileline[1];
   $topicfile_deps = $topicsfileline[2];
   $topicfile_sw = $topicsfileline[3];
   $topicfile_service = $topicsfileline[4];
   $topicfile_hw = $topicsfileline[5];
   $topicfile_desc=1;
   $topicsfileline="";
   next;
  }
  if ($topicfile_desc) {
   if ($topicsfileline =~ /^\|\|\|/) {
    last;
   }
   $topicsfileline=~s/\n/\<br\>/g;
   $topicdesc.=$topicsfileline;
  }
 }
 $content .= $topicdesc;
 $topicdesc=~s/\n/<br>/g;
 $tfile .= "<!-- $topic --><p class=\"intro\">$topicdesc</p>\n";
 if ($topicfile_deps) {
  $content .= "  <p>If you want to use this solution you need the following howto(s) finished:</p>\n  <ul>";
  $tfile .= "  <p>If you want to use this solution you need the following howto(s) finished:</p>\n  <ul>";
  @needtopics=split(/\,/, $topicfile_deps);
  foreach $topicdep (@needtopics) {
   $content .= "   <li><a href=\"#t-$topicdep\">$topicdep</a></li>\n";
   $tfile .= "   <li><a href=\"index.html#howtos\">$topicdep</a></li>\n";
  }
  $content .= "  </ul>";
  $tfile .= "  </ul>";
 }
 if ($topicfile_hw) {
  $content .= "<h2>Required hardware</h2>
  For this topic you need the following hardware: $topicfile_hw";
  $tfile .= "<h2>Required hardware</h2>
  For this topic you need the following hardware: $topicfile_hw";
 }
 if ($topicfile_sw) {
  $content .= "<h2>Required software</h2>
  The required software has to be installed with the following command(s):<pre>";
  $tfile .= "<h2>Required software</h2>
  The required software has to be installed with the following command(s):<pre>";
  @needsw=split(/ /, $topicfile_sw);
  foreach $swdep (@needsw) {
   $content .= $prefix."emerge $swdep"."$end\n";
   $tfile .= $prefix."emerge $swdep"."$end\n";
  }
  $content .= "</pre>";
  $tfile .= "</pre>";
 }
 $content .= $ad;
 $content .= $topics{$topic};
 $tfile .= $topics{$topic};
 if ($topicfile_service) {
  $content .= "<h2>Setting up services</h2>\n<p>For starting the new service after system reboot you should add it to a runlevel with the following command(s):</p>\n <pre>";
  $tfile .= "<h2>Setting up services</h2>\n<p>For starting the new service after system reboot you should add it to a runlevel with the following command(s):</p>\n <pre>";
  @needservice=split(/ /, $topicfile_service);
  $runlevel="";
  foreach $service (@needservice) {
   $runlevel=`$prefix rc-update show | grep " $service |"$end`;
   chomp($runlevel);
   $runlevel=~s/^*.\|//;
   $runlevel=~s/$service//g;
   $runlevel=~s/ //g;
   $content .= $prefix."rc-update add $service $runlevel"."$end\n";
   $tfile .= $prefix."rc-update add $service $runlevel"."$end\n";
  }
  $content .= "</pre>";
  $tfile .= "</pre>";
 }
 $topics .= "  <a href=\"#t-$topic\">$topic</a><br>\n";
 $itopic=$topic;
 $itopic=~s/[^a-zA-Z0-9]/_/g;
 $itopic=~s/_+/_/g;
 $itopics .= "  <a href=\"howto_$itopic.html\">$topic</a><br>\n";
 $content .= "  <p>
Please send a feedback to: <b>doc&lt;at&gt;example.com</b></p>
  <a href=\"#howtos\">Howto listing</a><br>
  <a href=\"#Index\">File Index</a>\n";
 $tfile .= "  $ad
 <p>
Please send a feedback to: <b>doc&lt;at&gt;example.com</b></p>
  <a href=\"index.html#howtos\">Howto listing</a><br>
  <a href=\"index.html#Index\">File Index</a><br><br>
  <p><a href=\"http://forums.gentoo.org\">Here</a> you can find the official Gentoo Linux Forums where you can find a lot of answers.</p>
  <p><a href=\"http://www.gentoo.org\">Here</a> a link to the official Gentoo Linux Homepage.</p>
  <p><a href=\"https://doc.example.com/edit/howto_$itopic.html\">Edit Howto</a></p>
  $impr
  </div>
 </body>
</html>";
 $tfilename=$topic;
 $tfilename=~s/[^a-zA-Z0-9]/_/g;
 $tfilename=~s/_+/_/g;
 $tfilename .= ".html";
 $oldtfile="";
 open(OLDTFILE, "<$webpath/howto_$tfilename");
 @oldtfile=<OLDTFILE>;
 close(OLDTFILE);
 foreach $line (@oldtfile) {
  $oldtfile.=$line;
 }
 $newtfile=$tfile;
 $oldtfile=~s/meta name=\"date\" content=.*\"\>//;
 $newtfile=~s/meta name=\"date\" content=.*\"\>//;
 open(TMP, ">/tmp/t1");
 print TMP $oldtfile;
 close(TMP);
 open(TMP, ">/tmp/t2");
 print TMP $newtfile;
 close(TMP);
 $diff=system("diff /tmp/t1 /tmp/t2");
 if ($diff) {
  print "Updateing $webpath/howto_$tfilename\n";
  open(TFILE, ">$webpath/howto_$tfilename");
  print TFILE $tfile;
  close(TFILE);
 }
 push(@tfilelist,"howto_$tfilename");
 $sitemap.="\n <url>
  <loc>$url/howto_$tfilename</loc>
  <lastmod>$sitemapdate</lastmod>
  <changefreq>monthly</changefreq>
  <priority>0.7</priority>
 </url>";
}
@oldtfilelist=`ls $webpath/howto_*`;
foreach $checkoldfile (@oldtfilelist) {
 chomp($checkoldfile);
 $newtfile=0;
 $createdtfile="";
 foreach $createdtfile (@tfilelist) {
  $createdtfiletest="$webpath/$createdtfile";
  if ($checkoldfile eq $createdtfiletest) { $newtfile=1 }
 }
 unless ($newtfile) {
  print "Deleting $checkoldfile\n";
  `rm $checkoldfile`;
 }
}
$html="$doctype
<html>
 <head>
  <title>Howtos $htmltitle</title>
  <meta name=\"description\" content=\"$metashortdescr\">
  <meta name=\"date\" content=\"$metadate\">
  <meta name=\"author\" content=\"$metaauthor\">
  <meta name=\"keywords\" content=\"gentoo, howto, documentation, linux, traffic, shaping, firewall, ldap, thin, up-to-date, up to date, new\">
  <meta name=\"robots\" content=\"all\">
  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\">
  <meta http-equiv=\"expires\" content=\"0\">
  <link rel=\"stylesheet\" type=\"text/css\" href=\"/howto.css\">
 </head>
 <body><div class=\"frame\">
  <h1>Howtos $htmltitle (latest version created: $createdate)</h1>
  <p>$metashortdescr</p>
<p>The special thing of this is that the Documentation generates automatically from my running system, so it is <b>every time up to date</b>.<br>Further this Howto is build <b>modular</b>. The Howtos are sorted in alphabetical order. Every topic has its dependencies. For example: You have to finish Webserver Howto for building webbased statistics.</p>
  <p>I hope to give something back to the community with this document.</p>
  <p>Please enjoy and send any ideas, wishes or advancements to: <b>doc&lt;at&gt;example.com</b>";
$hindex=$html;
$clicense="
  <h1>License</h1>
  <p>Copyright (C) 2008-$jahr $metaauthor.</p>
  <p>Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.</p><p>
A copy of the license is included in the section entitled \"<a href=\"#FDL\">GNU Free Documentation License</a>\".</p>
  <h1>Introduction</h1>
  <p>This documentation comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.</p>
";
$html.=$clicense;
$html.=$topics;
$hindex.=$license;
$hindex.=$ad;
$hindex.="<h1>All in one page</h1>
 <a href=complete.html>Here</a> you can find the complete documentation in one page<br>
 $itopics";
$hindex.=$ad;
$html.=$content;
$html.="  <h1><a class=h1link name=Index>File Index</a></h1>" . $index . "\n";
open(LICENSE, "</usr/local/etc/sysdoc/license");
@license = <LICENSE>;
close(LICENSE);
$html .= "<h1><a class=h1link name=FDL>GNU Free Documentation License</a></h1>
@license";
$hindex .= "<h1><a class=h1link name=Index>File Index</a></h1>$pindex\n";
$html .= " </div></body>\n</html>";
$hindex .= "$impr\n</div></body>\n</html>";
open(DOC, ">$webpath/complete.html");
print DOC $html;
close(DOC);
$sitemap.="\n <url>
  <loc>$url/complete.html</loc>
  <lastmod>$sitemapdate</lastmod>
  <changefreq>weekly</changefreq>
  <priority>0.1</priority>
 </url>
</urlset>\n";

$oldifile="";
open(OLDIFILE, "<$webpath/index.html");
@oldifile=<OLDIFILE>;
close(OLDIFILE);
foreach $line (@oldifile) {
 $oldifile.=$line;
}
$newifile=$hindex;
$oldifile=~s/meta name=\"date\" content=.*\"\>//;
$newifile=~s/meta name=\"date\" content=.*\"\>//;
$oldifile=~s/created\:.*\>//;
$newifile=~s/created\:.*\>//;
open(TMP, ">/tmp/1");
print TMP $oldifile;
close(TMP);
open(TMP, ">/tmp/2");
print TMP $newifile;
close(TMP);
$diff=system("diff /tmp/1 /tmp/2");
if ($diff) {
 print "Updateing $webpath/index.html\n";
 open(IFILE, ">$webpath/index.html");
 print IFILE $hindex;
 close(IFILE);
}

`mkdir -p $webpath/license`;
open(LICENSE, ">$webpath/license/fdl.html");
print LICENSE "<html><head><title>FDL-License for example.com</title></head><body>@license</body></html>";

open(SITEMAP, ">$webpath/sitemap.xml");
print SITEMAP $sitemap;
close(SITEMAP);

# Create Editor
#system "/usr/local/bin/mkeditdoc.pl";
`rm $webpath/../edit/*`;
$howtodir=$webpath;
@howtos=`cd $howtodir; ls howto_*.html`;

foreach $howto (@howtos) {
 print $howto;
 chomp($howto);
 open(HOWTO, "<$howtodir/$howto") || die "Failed to open $howtodir/$howto";
 @howto=<HOWTO>;
 close(HOWTO);
 open(EHOWTO, ">$howtodir/../edit/$howto");
 foreach $howtoline (@howto) {
  if (($howtoline=~/<p class="comment"/) || ($howtoline=~/<p class="intro"/)) {
   if ($howtoline=~/-- .+ --./) {
    $target=$howtoline;
    @target=split(/--/, $howtoline);
    $target=$target[1];
    $target=~s/^ +//;
    $target=~s/ +$//;
   }
   $howtoline=~s/<br>/\n/g;
   $howtoline=~s/<p class=\"comment\">/<form action=\"\/cgi-bin\/changedoc.pl\" method=\"POST\"><textarea name=\"comment\" cols=\"115\" rows=\"25\">/;
   $howtoline=~s/<p class=\"intro\">/<form action=\"\/cgi-bin\/changedoc.pl\" method=\"POST\"><textarea name=\"intro\" cols=\"115\" rows=\"25\">/;
   if ($howtoline=~/textarea name="comment"/) {
    $howtoline=~s/<\/p>$/<\/textarea><input type="hidden" name="file" value="$target"><input type="submit" value="Submit"><\/form>/;
   }
   elsif ($howtoline=~/textarea name="intro"/) {
    $howtoline=~s/<\/p>$/<\/textarea><input type="hidden" name="howto" value="$target"><input type="submit" value="Submit"><\/form>/;
   }
   else {$howtoline=~s/<\/p>$/<\/textarea>/ }
   print EHOWTO $howtoline;
  }
  else {
   print EHOWTO $howtoline;
  }
 }
 close(EHOWTO);
}


`rsync -av --delete "$webpath"/ wlan-unten:/data/www/doc.example.com/htdocs/`;

unlink("/tmp/t1");
unlink("/tmp/t2");
unlink("/tmp/1");
unlink("/tmp/2");


Changes in /var/www/doc.gabosh.net/cgi-bin/changedoc.pl

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /var/www/doc.gabosh.net/cgi-bin/changedoc.pl

Changed on 27.04.10
Issued by olli
Beginning line 2

This is the CGI-script for editing the documentation

#!/usr/bin/perl

# Get the Data
read(STDIN, $line, $ENV{'CONTENT_LENGTH'});
@post = split(/&/, $line);

# Header for HTML output
print "Content-type:text/html\n\n";

$back=5;

if (-e "/tmp/changedoc") {
 $text="Working...</div></body></html>";
 $exit=1;
}
elsif ($ENV{HTTP_REFERER} !~ /https:\/\/doc\.gabosh\.net\/edit\/howto_/ ) {
 $text="</div><body></html>";
 $exit=1;
 $back="0;http://doc.example.com";
}


print "<html>
 <head>
  <title>Data submitted</title>
  <meta http-equiv=\"refresh\" content=\"$back\">
  <link rel=\"stylesheet\" type=\"text/css\" href=\"/howto.css\">
 </head>
 <body><div class=\"frame\"><h1>
 $text
 ";

if ($exit) {
 exit 0;
}

print "Hi $ENV{AUTHENTICATE_UID}, Working... Please wait...";

foreach $post (@post) {
 # Make + to Space
 $post=~s/\+/ /g;
 # Make Hex-Strings to ASCII
 $post=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 if ($post=~/^intro\=/) {
  $intro=1;
 }
 if ($post=~/^comment\=/) {
  $comment=1;
 }
}

if ($intro) {
 $intro=$post[0];
 $howto=$post[1];
 $howto=~s/^howto\=//;
 $intro=~s/^intro\=//;
 $intro=~s/\r\n/\n/g;

 open(FILE, ">/tmp/changedoc");
 print FILE "$howto\n";
 print FILE "$intro\n";
 close(FILE);
}	   

if ($comment) {
 $comment=$post[0];
 $fileline=$post[1];
 $fileline=~s/^file\=//;
 @fileline=split(/\|\|\|/, $fileline);
 $file=$fileline[0];
 $linenr=$fileline[1];
 $comment=~s/^comment\=//;
 $comment=~s/[\r]//g;
 $comment=~s/[\n]/<br>/g;
 chomp($comment);
 open(FILE, ">/tmp/changedoc");
 print FILE "$linenr\n";
 print FILE "$file\n";
 print FILE "$comment";
 close(FILE);
}

print "</div></body></html>\n";

Changes in /var/www/doc.gabosh.net/htdocs/howto.css

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /var/www/doc.gabosh.net/htdocs/howto.css

Changed on 27.04.10
Issued by olli
Beginning line 2

The Cascading Style Sheet for the design of the sysdoc HTML Output

*/
body {
 background-color:#dddaec;
 font-family: sans-serif, Verdana, Arial, Helvetica;
 font-size:small;
 color:#000000;
}
h1 {
 background-color:#7a5ada;
 color:#ffffff;
 padding-left:2px;
 font-size:large;
}
h2 {
 background-color:#dddaec;
 padding-left:2px;
 font-size:medium;
}
.h1link {
 color:#ffffff;
 text-decoration:none;
}
.h1link:visited {
 color:#ffffff;
 text-decoration:none;
}
.h1link:active {
 color:#ffffff;
 text-decoration:none;
}
.h1link:hover {
 color:#ffffff;
 text-decoration:underline;
}
.h2link:hover {
 color:#000000;
 text-decoration:none;
}
a:link {
 color:#7a5ada;
 text-decoration:none;
}
a:visited {
 color:#7a5ada;
 text-decoration:none;
}
a:active {
 color:#7a5ada;
 text-decoration:none;
}
a:hover {
 color:#7a5ada;
 text-decoration:underline;
}
.frame {
 width:950px;
 background-color:white;
 padding:10px;
}
.before {
 background-color:#FF8080;
}
.after {
 background-color:#80FF80;
}
.small {
 font-size:smaller;
}
pre {
 overflow:visible;
 background-color:#FFFF80;
 font-size:larger;
}
/* 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Backup

One of the most important things for a server are backups. I wrote a little script to automatically do this job dayly.
I create my backups on an external harddisk being mounted during the boot process to /srv/backups.
First set the profile and update the system:
rm /etc/make.profile && ln -s /usr/portage/profiles/hardened/x86 /etc/make.profile && emerge -uDvN world

If you want to use this solution you need the following howto(s) finished:

Required hardware

For this topic you need the following hardware: External harddisk

Changes in /etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/crontab

Changed on 15.11.10
Issued by olli
Beginning line 27

Run backup daily at 2:15 am

15 2 * * *      root    /usr/local/sbin/backup.sh 2>&1 | cat -vT | ifne mail -s "Daily Backup `date`" user1

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Basesystem

First of all you have to install a Gentoo basesystem on your computer. There are some great howtos on the Gentoo homepage (http://www.gentoo.org). Please use them.

The following is a list of config files I changed/created in the installation process. You can use this as an addition to the Gentoo Handbook.

If you install from a stage3 you should change the make.conf to fit your system needs after the installation and rebuild the world with the new settings:
emerge -e world

Required hardware

For this topic you need the following hardware: Linux compatiple computer

Required software

The required software has to be installed with the following command(s):
emerge sys-process/vixie-cron
emerge app-admin/rsyslog
emerge sys-process/at
emerge app-admin/logrotate
emerge net-misc/whois
emerge net-analyzer/nmap
emerge net-misc/netkit-telnetd
emerge app-editors/vim
emerge media-video/mplayer
emerge sys-apps/rename
emerge media-sound/id3v2
emerge dev-perl/MP3-Tag
emerge media-libs/exiftool
emerge media-sound/vorbis-tools

Changes in /boot/grub/grub.cfg

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /boot/grub/grub.cfg

Changed on 08.09.08
Issued by olli
Beginning line 1

The Grub-Bootloader configuration

set timeout=30
set default=0

menuentry 'Newest Kernel' {
        set root='(hd0,msdos1)'
        echo    'Loading kernel...'
        linux    /kernel root=/dev/sda2 rootfstype=ext4 lockd.udpport=32768 lockd.tcpport=32768 consoleblank=0 rt2800usb.nohwcrypt=1 cfg80211.ieee80211_regdom=DE
}

menuentry 'Last Kernel' {
        set root='(hd0,msdos1)'
        echo    'Loading kernel...'
        linux    /runningkernel root=/dev/sda2 rootfstype=ext4 lockd.udpport=32768 lockd.tcpport=32768 consoleblank=0 rt2800usb.nohwcrypt=1 cfg80211.ieee80211_regdom=DE
}

menuentry 'RAM Test' {
        set root='(hd0,msdos1)'
        linux16 /memtest86plus/memtest.bin
}


Changes in /etc/conf.d/consolefont

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/consolefont

Changed on 06.09.08
Issued by olli
Beginning line 8

consolefont secifies the default font that you'd like Linux to use on the console


Before change
#consolefont="default8x16"
After change
consolefont="lat9w-16"

Changes in /etc/conf.d/dhcpd-vnet0

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/dhcpd-vnet0

Changed on 28.03.20
Issued by olli
Beginning line 1

Virtual Networking DHCP

DHCPD_CONF="/etc/dhcp/dhcpd-vnet0.conf"
DHCPD_IFACE="vnet0"

Changes in /etc/conf.d/keymaps

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/keymaps

Changed on 06.09.08
Issued by olli
Beginning line 3

This setting is to specify the default console keymap


Before change
keymap="us"
After change
keymap="de-latin1"

Changes in /etc/conf.d/local

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/local

Changed on 17.05.18
Issued by olli
Beginning line 1

Allow console input/output in local-services

rc_verbose=yes

Changes in /etc/conf.d/net

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net

Changed on 06.09.08
Issued by olli
Beginning line 6

Network-Interface settings

#config_eth1="XXX.XXX.XXX.XXX/24"
#routes_eth1="default via XXX.XXX.XXX.XXX"

config_eth0="my.lan.ip.addr/16 fd23::200/64"
dns_servers_eth0="XXX.XXX.XXX.XXX"
dns_search_eth0="example.com"
#dns_domain_eth0="example.com"

Changes in /etc/conf.d/net

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net

Changed on 28.03.20
Issued by olli
Beginning line 56

Virtual Networking Bridge


Before change
bridge_vnet0=""
config_vnet0="XXX.XXX.XXX.XXX/24"
bridge_forward_delay_vnet0=0
bridge_hello_time_vnet0=1000
enable_ipv6_vnet0="false"
dad_timeout_vnet0=0

Changes in /etc/conf.d/net.bak

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net.bak

Changed on 06.09.08
Issued by olli
Beginning line 6

Network-Interface settings

#config_eth1="XXX.XXX.XXX.XXX/24"
#routes_eth1="default via XXX.XXX.XXX.XXX"

config_tap0="XXX.XXX.XXX.XXX/16"
mac_tap0="XX:XX:XX:XX:XX:XX"
rc_net_tap0_provide="!net"

config_eth0="my.lan.ip.addr/16"
dns_servers_eth0="127.0.0.1"
dns_search_eth0="example.com dmz"
dns_domain_eth0="example.com"

Changes in /etc/conf.d/net.bak

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net.bak

Changed on 13.10.15
Issued by olli
Beginning line 29

Optional Internet Connection via PPPOE (rp-pppoe)

config_eth1="XXX.XXX.XXX.XXX/24"
config_ppp0="ppp"
link_ppp0="eth1"
plugins_ppp0="pppoe"
username_ppp0='provideruser'
password_ppp0='providerpass'
pppd_ppp0="
noauth
defaultroute
persist
holdoff 10
child-timeout 60
lcp-echo-interval 15
lcp-echo-failure 3
maxfail 0
noaccomp
noccp
nobsdcomp
nodeflate
nopcomp
novj
novjccomp"
rc_net_ppp0_need="net.eth1"

#modules_wlan0="wpa_supplicant"
#config_wlan0="XXX.XXX.XXX.XXX/24"
#rc_net_wlan0_provide="!net"

Changes in /etc/cron.daily/clearat.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /etc/cron.daily/clearat.sh

Changed on 17.08.09
Issued by olli
Beginning line 2

Delete at spools older then two weeks

#!/bin/bash
find /var/spool/at/atspool -ctime +14 -exec rm {} \;

Changes in /etc/default/btrfsmaintenance

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/default/btrfsmaintenance

Changed on 08.01.19
Issued by olli
Beginning line 46

Auto find btrfs-Volumes


Before change
BTRFS_BALANCE_MOUNTPOINTS="/"
After change
BTRFS_BALANCE_MOUNTPOINTS="auto"

Changed on 08.01.19
Issued by olli
Beginning line 95

Auto find btrfs-Volumes


Before change
BTRFS_SCRUB_MOUNTPOINTS="/"
After change
BTRFS_SCRUB_MOUNTPOINTS="auto"

Changed on 08.01.19
Issued by olli
Beginning line 152

Auto find btrfs-Volumes


Before change
BTRFS_TRIM_MOUNTPOINTS="/"
After change
BTRFS_TRIM_MOUNTPOINTS="auto"

Changes in /etc/dhcp/dhcpd-vnet0.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd-vnet0.conf

Changed on 28.03.20
Issued by olli
Beginning line 1

Virtual Networking DHCP

option domain-name "vnet0";

default-lease-time 600;
max-lease-time 7200;

option subnet-mask XXX.XXX.XXX.XXX;
option broadcast-address XXX.XXX.XXX.XXX;
option domain-name-servers XXX.XXX.XXX.XXX;
option routers XXX.XXX.XXX.XXX;
default-lease-time 7200;
max-lease-time 14400;
ddns-update-style none;
subnet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX {
 range XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX;
}
next-server XXX.XXX.XXX.XXX;
option architecture-type code 93 = unsigned integer 16;
if option architecture-type = 00:09 {
filename "bootx64.efi";
} elsif option architecture-type = 00:07 {
 filename "bootx64.efi";
} else {
filename "pxelinux.0";
}

Changes in /etc/fstab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/fstab

Changed on 06.09.08
Issued by olli
Beginning line 27

List of local filesystems and mount options which are required for system boot or other mount operations.


Before change
/dev/BOOT             /boot           ext2            noauto,noatime  1 2
/dev/ROOT             /               ext3            noatime         0 1
/dev/SWAP             none            swap            sw              0 0
/dev/cdrom            /mnt/cdrom      auto            noauto,ro       0 0
After change
/dev/sda1		/boot		ext4		noatime,noexec,acl,nosuid,discard,nofail	1 2
/dev/sda2		/		ext4		noatime,acl,discard,nofail		0 1
/dev/sda3               /var            ext4            noatime,acl,discard,nofail         0 1
/dev/sda5               /var/log        ext4            noatime,acl,noexec,nosuid,discard,nofail         0 1
## RAM FSs
# Maximaler gesamter Speicher
none                     /dev/shm                        tmpfs   defaults,size=25G        0 0
# Einzelne Teile
tmpfs                   /tmp            		tmpfs   nodev,nosuid,size=2G,noatime          0  0
tmpfs                   /var/tmp        		tmpfs   nodev,nosuid,size=20G,noatime          0  0
tmpfs                   /var/spool/asterisk/monitor     tmpfs   nodev,nosuid,size=2G,uid=asterisk,mode=0750,size=2G,noatime          0  0

Changes in /etc/hosts

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/hosts

Changed on 06.09.08
Issued by olli
Beginning line 39

This entry is for the LAN IP of the Server. If the DNS fails the server can resolf at least himself.

my.lan.ip.addr xgabosh xgabosh.example.com silent-gabosh.example.com silent-gabosh gabosh example.com
# Some other Hostnames (VPNs/WLAN)
#XXX.XXX.XXX.XXX xgabosh-wlan xgabosh-wlan.example.com silent-wlan-gabosh.example.com silent-wlan-gabosh wlan-gabosh

Changes in /etc/logrotate.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/logrotate.conf

Changed on 13.01.15
Issued by olli
Beginning line 7

Logrotate daily


Before change
weekly
After change
daily

Changes in /etc/logrotate.d/gabosh

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/logrotate.d/gabosh

Changed on 19.09.14
Issued by olli
Beginning line 1

Logrotations

/opt/rsyncd.log {
        compress
        rotate 7
	daily
        notifempty
        missingok
        copytruncate
	postrotate
	        /usr/local/sbin/rsyncwatch > /dev/null 2>&1 || true
	endscript
}

/var/log/dmesgcron
/var/log/messages
/var/log/in.tftpd.log
/var/log/zyxelstatus.log
/var/log/arpwatch.log
/var/log/smartd.log
/var/log/sshd-rsyncbackup.log
/var/log/pppd.log
/var/log/backup-gabosh.log
/var/log/daemon.log
/var/log/maillog.log
/var/log/kontent.log
/var/log/nscd.log
/var/log/ntp.log
/var/log/bind.log
/var/log/xinetd.log
/var/log/cupsd.log
/var/log/usv-apcupsd.log
/var/log/backup-gabosh.sh.log
/var/log/docker.log
/var/log/user.log
/var/log/dms-inotifys.log
/var/log/emerge-fetch.log
/var/log/sshd.log
/var/log/slapd.log
/var/log/debug.log
/var/log/pulseaudio.log
/var/log/auth.log
/var/log/sa-update.log
/var/log/sshd-sftp.log
/var/log/hostapd.log
/var/log/emerge.log
/var/log/mail.log
/var/log/kern.log
/var/log/dyndns.log
/var/log/firewall.log
/var/log/GTC-Hosts.log
/var/log/cron.log
/var/log/nfs.log
/var/log/Raspberrys.log
/var/log/dhcpd.log
/var/log/gabosh-statushtml.log
/var/log/sshd-tunnel.log
/var/log/x.log
/var/log/lpr.log
/var/log/sshd-share.log
/var/log/nextcloud.log
/var/log/nextcloud-test.log
/var/log/auth-success.log
/var/log/g_bash-scripts.log
{
        rotate 7
        daily
        missingok
        notifempty
        copytruncate
	compress
        postrotate
	        test -r /run/rsyslogd.pid && kill -HUP $(cat /run/rsyslogd.pid) &>/dev/null
	endscript
}
/var/log/apache2/*log {
	rotate 7
	daily
	missingok
	notifempty
	copytruncate
	compress
	postrotate
		/etc/init.d/apache2 restart > /dev/null 2>&1 || true
	endscript
}
/opt/sftpaccess.log {
        compress
        maxage 365
        rotate 7
        size=+1024k
        notifempty
        missingok
        copytruncate
}
/opt/sftpuseraccess.log {
        compress
        maxage 365
        rotate 7
        size=+1024k
        notifempty
        missingok
        copytruncate
}


Changes in /etc/profile.d/root.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/profile.d/root.sh

Changed on 30.11.10
Issued by olli
Beginning line 1

Some (personal) special settings for the root shell.

EDITOR="/usr/bin/vim"
if [ "$EUID" = "0" ] || [ "$USER" = "root" ] 
then
 PATH=$PATH:/root/scripts
 HISTSIZE=10000
 HISTFILESIZE=10000
fi

Changes in /etc/rc.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/rc.conf

Changed on 05.03.17
Issued by olli
Beginning line 31

Network is up if one Interface starts

rc_depend_strict="NO"

Changes in /etc/rsyslog.d/00-gtc.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/rsyslog.d/00-gtc.conf

Changed on 19.09.14
Issued by olli
Beginning line 1

Remote Logging

# Listen for remote Logging (UDP)
module(load="imudp")
input(type="imudp" port="514")
# Hosts
if $hostname startswith 'my.default.route.ip' and $msg contains 'User admin login from XXX.XXX.XXX.XXX successful' then stop
if $hostname != 'xgabosh' and $msg contains 'wdGetDidSendCredentials not implemented' and $programname contains 'citrix-wfica' then stop
if $hostname != 'xgabosh' and $msg contains 'CGPrecv: socket 0x' and $programname contains 'citrix-wfica' then stop
if $hostname != 'xgabosh' and $msg contains 'doEncryptData inbuffersize: ' and $programname contains 'citrix-wfica' then stop
if $hostname != 'xgabosh' and $msg contains 'SSLPutDataFn inbuffersize: ' and $programname contains 'citrix-wfica' then stop
if $hostname != 'xgabosh' and $msg contains 'SRC=192.168.' and $programname contains 'kernel' then stop

if $hostname startswith 'my.default.route.ip' then /var/log/zyxel.log
if $hostname startswith 'my.default.route.ip' then stop
if $hostname startswith 'raspberry-' then /var/log/Raspberrys.log
if $hostname startswith 'raspberry-' then stop
if $hostname != 'xgabosh' and $hostname != 'share' and $hostname != 'backup-chroot' and $hostname != 'share' then /var/log/GTC-Hosts.log
if $hostname != 'xgabosh' and $hostname != 'share' and $hostname != 'backup-chroot' and $hostname != 'share' then stop

Changes in /etc/rsyslog.d/01-gabosh.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/rsyslog.d/01-gabosh.conf

Changed on 19.09.14
Issued by olli
Beginning line 1

Logfile definitions


# Additional Socket from chroot
input(type="imuxsock" HostName="backup-chroot" Socket="/srv/share/Backups/dev/log" CreatePath="on")
input(type="imuxsock" HostName="vpn-share" Socket="/srv/dev/log" CreatePath="on")
input(type="imuxsock" HostName="share" Socket="/srv/share/dev/log" CreatePath="on")
# Auth success (for share-auth 2FA)
if $programname == 'nextcloud-audit' and $msg contains 'Login successful:' then /var/log/auth-success.log
if $programname == 'imaps' and $msg contains 'TLS User logged in' then /var/log/auth-success.log
# Nextcloud
if $msg contains '","level":0,"time":"' and $programname contains 'nextcloud' then stop
if $msg contains '","level":1,"time":"' and $programname contains 'nextcloud' then stop
if $programname == 'nextcloud' then /var/log/nextcloud.log
if $programname == 'nextcloud' then stop
if $programname == 'nextcloud-audit' then /var/log/nextcloud.log
if $programname == 'nextcloud-audit' then stop
if $programname == 'nextcloud-test' then /var/log/nextcloud-test.log
if $programname == 'nextcloud-test' then stop
if $programname == 'nextcloud-test-audit' then /var/log/nextcloud-test.log
if $programname == 'nextcloud-test-audit' then stop
# USV
if $programname == 'apcupsd' and $syslogseverity <= '6' then /var/log/usv-apcupsd.log
if $programname == 'apcupsd' then stop
# SMART HDD &Uuml;berwachung
if $programname == 'smartd' and $syslogseverity <= '6' then /var/log/smartd.log
if $programname == 'smartd' then stop
# SSH TUNNEL
if $programname == 'sshd-tunnel' and $syslogseverity <= '6' then /var/log/sshd-tunnel.log
if $programname == 'sshd-tunnel' then stop
# SSH SFTP
if $programname == 'sshd-sftp' and $syslogseverity <= '6' then /var/log/sshd-sftp.log
if $programname == 'sshd-sftp' then stop
# SSH Share
if $programname == 'sshd-share' then /var/log/sshd-share.log
if $programname == 'sshd-share' then stop
# SSH rsyncbackup
if $programname == 'sshd-rsyncbackup' and $syslogseverity <= '6' then /var/log/sshd-rsyncbackup.log
if $programname == 'sshd-rsyncbackup' then stop
# SSH
if $programname == 'sshd' and $syslogseverity <= '6' then /var/log/sshd.log
if $programname == 'sshd' then stop
# SFTP
if $programname == 'internal-sftp' and $msg contains 'sent status ' then stop
if $programname == 'internal-sftp' and $msg contains 'lstat name ' then stop
if $programname == 'internal-sftp' and $msg contains '/.kodi/' then stop
if $programname == 'internal-sftp' then /opt/sftpaccess.log
if $programname == 'internal-sftp' then stop
# Cron
if $programname == 'cron' and $syslogseverity <= '6' then /var/log/cron.log
if $programname == 'cron' then stop
if $programname == 'run-crons' and $syslogseverity <= '6' then /var/log/cron.log
if $programname == 'run-crons' then stop
if $programname == 'crontab' and $syslogseverity <= '6' then /var/log/cron.log
if $programname == 'crontab' then stop
# rsync
if $programname == 'rsyncd' and $syslogseverity <= '6' then /opt/rsyncd.log
if $programname == 'rsyncd' then stop
# DNS
if $programname == 'named' and $msg contains ' 127.0.0.1#' then stop
if $programname == 'named' and $msg contains ': sending notifies' then stop
if $programname == 'named' and $msg contains ' loaded serial ' then stop
if $programname == 'named' and $syslogseverity <= '6' then /var/log/bind.log
if $programname == 'named' then stop
# DHCP
if $programname == 'dhcpd' and $syslogseverity <= '6' then /var/log/dhcpd.log
if $programname == 'dhcpd' then stop
# NFS
if $programname == 'rpc.mountd' and $syslogseverity <= '6' then /var/log/nfs.log
if $programname == 'rpc.mountd' then stop
if $programname == 'rpc.idmapd' and $syslogseverity <= '6' then /var/log/nfs.log
if $programname == 'rpc.idmapd' then stop
if $programname == 'rpc.statd' and $syslogseverity <= '6' then /var/log/nfs.log
if $programname == 'rpc.statd' then stop
if $programname == 'rpcbind' and $syslogseverity <= '6' then /var/log/nfs.log
if $programname == 'rpcbind' then stop
# NTP
if $programname == 'ntpd' and $syslogseverity <= '6' then /var/log/ntp.log
if $programname == 'ntpd' then stop
if $programname == 'ntpdate' and $syslogseverity <= '6' then /var/log/ntp.log
if $programname == 'ntpdate' then stop
# Mail
if $msg contains 'auxpropfunc error invalid parameter supplied' then stop
if $msg contains '_sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: ldapdb' then stop
if $msg contains 'seen_db: user ' then stop
if $msg contains 'SQUAT ' then stop
if $msg contains 'indexing mailbox ' then stop
if $msg contains 'fetching user_deny.db' then stop
if $programname == 'lmtpunix' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'lmtpunix' then stop
if $programname == 'imap' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'imap' then stop
if $programname == 'imaps' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'imaps' then stop
if $programname == 'master' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'master' then stop
if $programname == 'ctl_cyrusdb' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'ctl_cyrusdb' then stop
if $programname == 'pop3' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'pop3' then stop
if $programname == 'pop3s' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'pop3s' then stop
if $programname == 'squatter' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'squatter' then stop
if $programname == 'tls_prune' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'tls_prune' then stop
if $programname == 'cyr_expire' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'cyr_expire' then stop
if $programname == 'sieve' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'sieve' then stop
if $programname == 'deliver' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'deliver' then stop
if $programname == 'ipurge' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'ipurge' then stop
if $programname == 'saslauthd' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'saslauthd' then stop
if $programname == 'amavis' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'amavis' then stop
if $programname == 'clamd' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'clamd' then stop
if $programname == 'freshclam' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'freshclam' then stop
if $programname == 'fetchmail' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'fetchmail' then stop
if $programname == 'spamd' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'spamd' then stop
if $programname contains 'postfix' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname contains 'postfix' then stop
if $programname == 'reconstruct' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'reconstruct' then stop
if $programname == 'policyd-spf' and $syslogseverity <= '6' then /var/log/maillog.log
if $programname == 'policyd-spf' then stop
# slapd
if $programname == 'slapd' then /var/log/slapd.log
if $programname == 'slapd' then stop
# firewall
if $programname == 'kernel' and $msg contains 'fire.sh' then /var/log/firewall.log
if $programname == 'kernel' and $msg contains 'fire.sh' then stop
# PulseAudio
if $programname == 'pulseaudio' and $msg contains 'Denied access to client with invalid authentication data' then stop
if $programname == 'pulseaudio' then /var/log/pulseaudio.log
if $programname == 'pulseaudio' then stop
# hostapd
if $programname == 'hostapd' then /var/log/hostapd.log
if $programname == 'hostapd' then stop
# nscd
if $programname == 'nscd' then /var/log/nscd.log
if $programname == 'nscd' then stop
# arpwatch
if $programname == 'arpwatch' then /var/log/arpwatch.log
if $programname == 'arpwatch' then stop
# X
if $programname == 'mate-session' then /var/log/x.log
if $programname == 'mate-session' then stop
if $programname == 'Tor' then /var/log/x.log
if $programname == 'Tor' then stop
# xinetd
if $programname == 'xinetd' then /var/log/xinetd.log
if $programname == 'xinetd' then stop
# in.tftp
if $programname == 'in.tftpd' then /var/log/in.tftpd.log
if $programname == 'in.tftpd' then stop
# pppd
if $programname == 'dhcpcd' then /var/log/pppd.log
if $programname == 'dhcpcd' then stop
if $programname == 'radvd' then /var/log/pppd.log
if $programname == 'radvd' then stop
if $programname == 'pppd' then /var/log/pppd.log
if $programname == 'pppd' then stop
# wlan
if $programname == 'wpa_cli' then /var/log/messages
if $programname == 'wpa_cli' then stop
# cups
if $programname == 'cupsd' then /var/log/cupsd.log
if $programname == 'cupsd' then stop
# bash scripts using g-lib
if $programname contains 'g_bash-script' then /var/log/g_bash-scripts.log
if $programname contains 'g_bash-script' then stop

Changes in /etc/ssh/ssh_config

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/ssh/ssh_config

Changed on 07.06.10
Issued by olli
Beginning line 53

Security settings fpr SSH Client

## Ciphers Check https://sshcheck.com/server/example.com/8081
KexAlgorithms curve25519-sha256@libssh.org
HostKeyAlgorithms ssh-ed25519
Ciphers chacha20-poly1305@openssh.com,aes256mail@example.com,aes128mail@example.com,aes256-ctr
MACs hmac-sha2-512mail@example.com,hmac-sha2-256mail@example.com,umac-128mail@example.com,hmac-sha1,umac-64@openssh.com
#Ciphers chacha20-poly1305@openssh.com,aes256mail@example.com,aes128mail@example.com,aes256-ctr
#MACs hmac-sha2-512mail@example.com,hmac-sha2-256mail@example.com,umac-128mail@example.com,umac-64@openssh.com
Host *
 ConnectTimeout 10
 StrictHostKeyChecking accept-new

Changes in /etc/ssh/sshd_config

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/ssh/sshd_config

Changed on 07.06.10
Issued by olli
Beginning line 130

List of users who are allowed to login and allow only save chipers over ssh

PermitRootLogin no
PubkeyAuthentication no
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
## Ciphers Check https://sshcheck.com/server/example.com/
# nmap -p22 -n -sV --script ssh2-enum-algos localhost
KexAlgorithms curve25519-sha256@libssh.org
HostKeyAlgorithms ssh-ed25519
Ciphers chacha20-poly1305@openssh.com,aes256mail@example.com,aes128mail@example.com
MACs hmac-sha2-512mail@example.com,hmac-sha2-256mail@example.com,umac-128mail@example.com
IgnoreRhosts yes
LogLevel VERBOSE
AddressFamily inet

AllowUsers root user1 user2 jonah

# Login als Root aus lokalen Netzen und OLB/SFTP01+OLB-MAWLAN
Match User root Address 172.23.*,172.24.*,172.25.*,212.6.102.*,85.16.65.139,127.0.0.1,185.232.103.115
 PermitRootLogin yes
 # Needed by terraform/libvirt
 AllowTcpForwarding yes

# Backup/Sync &uuml;ber unison/ssh
Match User root,user1,user2,jonah Address 172.25.*,172.23.*,XXX.XXX.XXX.XXX,XXX.XXX.XXX.XXX
 PubkeyAuthentication yes

Changes in /etc/sysctl.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sysctl.conf

Changed on 06.09.08
Issued by olli
Beginning line 58

This reboots the computer 60 seconds after a kernel panic.


Before change
#kernel.panic = 3
After change
kernel.panic = 60

Changes in /etc/sysctl.d/gabosh.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sysctl.d/gabosh.conf

Changed on 06.09.17
Issued by olli
Beginning line 6

Network Optimazions for SSHFS/NFS

net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

Changed on 06.09.17
Issued by olli
Beginning line 16

Allow many inotify-watches per user

fs.inotify.max_user_watches=999999999

Changes in /gtc/test/etc/bash/bashrc.d/gabosh

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/bash/bashrc.d/gabosh

Changed on 30.11.10
Issued by olli
Beginning line 1

Some (personal) special settings for bash

# Eternal bash history.

Changes in /gtc/test/etc/profile.d/gtc.sh

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/profile.d/gtc.sh

Changed on 30.11.10
Issued by olli
Beginning line 1

Some (personal) special settings for bash

EDITOR="/usr/bin/vim"
PATH=$PATH:/etc/thinclient/scripts
HISTSIZE=10000
HISTFILESIZE=10000
PS1="GTC $PS1"

Changes in /usr/local/sbin/msgwatch

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/msgwatch

Changed on 02.03.11
Issued by olli
Beginning line 2

This is an optional script which sends en eMail if a ssh-User logs in or out.

#!/usr/bin/perl -w

# Load modules
use strict;
use File::Tail;
use Proc::Daemon;
use File::Basename;

# Stop running daemon if exists
my $me=basename("$0");
if (-f "/var/run/$me") {
 open(PID, "</var/run/$me");
 my $pid=<PID>;
 close(PID);
 chomp($pid);
 if (-d "/proc/$pid") {
  print "Killing old daemon with PID: $pid\n";
  kill 9, $pid;
 }
}

# Daemonize
Proc::Daemon::Init();

# Write PID file
open(PID, ">/var/run/$me");
print PID $$;
close(PID);

# The address where notification mails should go to
my $mailto='mail@example.com';
# Targetlogfile
my $logfile="/var/log/sshd.log";

my $file=File::Tail->new(name => $logfile, maxinterval => 1, adjustafter => 1, reset_tail => 0);
while (defined(my $line=$file->read)) {

### SSHD ###
 if ($line =~ / sshd.+ Accepted .+ for .+ from .+ port /) {
  $line=~s/  +/ /g;
  chomp($line);
  sleep 5;
  my $who=`who ; w`;
  my @line=split(/ /,$line);
  `echo "Hi,

$line[8] is logging in with $line[6] ($line[12]) from $line[10]:

# who ; w
$who
$line

Your $0 [$$]
" | mail -s "SSHWATCH: $line[8] is logging in from $line[10]" $mailto`;
 }
 if ($line =~ / sshd.+ session closed for user /) {
  $line=~s/  +/ /g;
  chomp($line);
  sleep 5;
  my $who=`who ; w`;
  my @line=split(/ /,$line);
  `echo "Hi,

$line[10] is closing the session:

# who ; w
$who
$line

Your $0 [$$]
" | mail -s "SSHWATCH: $line[10] is closing the session" $mailto`;
 }
}

Changes in /usr/local/sbin/rsyncwatch

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/rsyncwatch

Changed on 02.03.11
Issued by olli
Beginning line 2

This is an optional script which sends en eMail if there is a rsync connection.

#!/usr/bin/perl -w

# Load modules
use strict;
use File::Tail;
use Proc::Daemon;
use File::Basename;

# Stop running daemon if exists
my $me=basename("$0");
if (-f "/var/run/$me") {
 open(PID, "</var/run/$me");
 my $pid=<PID>;
 close(PID);
 chomp($pid);
 if (-d "/proc/$pid") {
  print "Killing old daemon with PID: $pid\n";
  kill 9, $pid;
 }
}

# Daemonize
Proc::Daemon::Init();

# Write PID file
open(PID, ">/var/run/$me");
print PID $$;
close(PID);

# The address where notification mails should go to
my $mailto='mail@example.com';
# Targetlogfile
my $logfile="/opt/rsyncd.log";

my $file=File::Tail->new(name => $logfile, maxinterval => 1, adjustafter => 1, reset_tail => 0);
while (defined(my $line=$file->read)) {
 if ($line =~ / rsyncd.+ connect from .+172.23/) { next; }
 if ($line =~ / rsyncd.+ connect from .+172.24/) { next; }
 if ($line =~ / rsyncd.+ connect from .+172.25/) { next; }
 if ($line =~ / rsyncd.+ connect from .+ewe-ip-backbone\.de/) { next; }
 if ($line =~ / rsyncd.+ connect from .+versanet\.de/) { next; }
 if ($line =~ / rsyncd.+ connect from .+dsl\.tropolys\.de/) { next; }
 if ($line =~ / rsyncd.+ connect from .+dynamic.kabel-deutschland.de/) { next; }
 if ($line =~ / rsyncd.+ connect from .+t-ipconnect.de./) { next; }
 if ($line =~ / rsyncd.+ connect from .+gabosh\.net/) { next; }
### RSYNCD ###
 if ($line =~ / rsyncd.+ connect from /) {
  $line=~s/  +/ /g;
  chomp($line);
  my @line=split(/ /,$line);
  $line[8]=~s/\(//g;
  $line[8]=~s/\)//g;
  my $country=`geoiplookup $line[8] | grep "GeoIP Country Edition"`;
  unless ( $country =~ / Germany/ ) {
   `iptables -I gabosh-inet -p tcp -s $line[8] -j DROP`;
   `iptables -I gabosh-inet -p udp -s $line[8] -j DROP`;
   `echo "Blocking  $line[7] $line[8] $country" | mail -s "RSYNCDWATCH: blocking $line[8]" $mailto`
  }

#  `echo "Hi,
#
#rsync connection from $line[7] $line[8]:
#@line
#
#Your $0 [$$]
#" | mail -s "RSYNCDWATCH: rsync connection from $line[7] $line[8]" $mailto`;
 }
}

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add sshd default
rc-update add atd default
rc-update add rsyslog default
rc-update add vixie-cron 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

DHCP-Server

If you want to manage your IPs in a central way you should use a DHCP-Server. This helps you to install and configure it.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-misc/dhcp

Changes in /etc/conf.d/dhcpd

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/dhcpd

Changed on 17.11.09
Issued by olli
Beginning line 20

Only change this if you want to store your DHCP-Settings in your LDAP. This sets the configuration file for LDAP.


Before change
# DHCPD_CONF="/etc/dhcp/dhcpd.conf"
After change
DHCPD_CONF="/etc/dhcp/dhcpd.conf"

Changed on 17.11.09
Issued by olli
Beginning line 29

The Listen Interface


Before change
# DHCPD_IFACE=""
After change
DHCPD_IFACE="eth0"

Changes in /etc/conf.d/dhcpd6

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/dhcpd6

Changed on 17.11.09
Issued by olli
Beginning line 20

Config File fpr DHCP in WLAN Network


Before change
# DHCPD_CONF="/etc/dhcp/dhcpd.conf"
After change
DHCPD_CONF="/etc/dhcp/dhcpd6.conf"

Changed on 17.11.09
Issued by olli
Beginning line 29

The Listen Interface


Before change
# DHCPD_IFACE=""
After change
DHCPD_IFACE="eth0"

Changes in /etc/conf.d/dhcpd-wlan

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/dhcpd-wlan

Changed on 17.11.09
Issued by olli
Beginning line 20

Config File fpr DHCP in WLAN Network


Before change
# DHCPD_CONF="/etc/dhcp/dhcpd.conf"
After change
DHCPD_CONF="/etc/dhcp/dhcpd-wlan.conf"

Changed on 17.11.09
Issued by olli
Beginning line 29

The Listen Interface


Before change
# DHCPD_IFACE=""
After change
DHCPD_IFACE="wlan0"

Changes in /etc/dhcp/dhcpd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd.conf

Changed on 06.09.08
Issued by olli
Beginning line 1

DHCP Base settings only if you want to use DHCP without LDAP. After some default definitions like gateway, DNS Server, domain name,... it defines a range of IPs for clients. Change it according to your environment if you dont use DHCP over LDAP.


option domain-name "example.com";

default-lease-time 600;
max-lease-time 7200;

option subnet-mask XXX.XXX.XXX.XXX;
option broadcast-address XXX.XXX.XXX.XXX;
option domain-name-servers my.lan.ip.addr;
option ntp-servers XXX.XXX.XXX.XXX;
option routers XXX.XXX.XXX.XXX;
default-lease-time 7200;
max-lease-time 14400;
ddns-update-style none;
subnet my.lan.network.ip netmask XXX.XXX.XXX.XXX {
 range XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX;
}

Changes in /etc/dhcp/dhcpd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd.conf

Changed on 06.09.08
Issued by olli
Beginning line 35

Here are some Examples for fixed IPs of some DHCP-Hosts. (only if you don't use DHCP over LDAP)


host heidiphone-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host homephone-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host beckyphone-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host user1phone-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host hometablet-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host beckykindle-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host small-gabosh-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host small-gabosh {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host knirps-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host ultra-gabosh-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host station-gabosh {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host epson-gabosh-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host gaboshberry {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host gaboshsleepberry {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host gaboshbeckyberry {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host lgtv {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host testberry {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}

host mirko-nas {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}



Changes in /etc/dhcp/dhcpd-ldap.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd-ldap.conf

Changed on 17.11.09
Issued by olli
Beginning line 1

This are the settings for connecting to the LDAP Server. It is only needed if you want to use LDAP as DHCP-Storage.

ldap-server "localhost";
ldap-port 389;
ldap-username "";
ldap-password "";
ldap-base-dn "ou=DHCP-Servers,dc=example,dc=com";
ldap-dhcp-server-cn "silent-gabosh.example.com";
ldap-method dynamic;
ldap-debug-file "/tmp/dhcp-ldap-startup-config";

Changes in /etc/dhcp/dhcpd-ldap-wlan.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd-ldap-wlan.conf

Changed on 17.11.09
Issued by olli
Beginning line 1

This are the settings for connecting to the LDAP Server. It is only needed if you want to use LDAP as DHCP-Storage.

ldap-server "localhost";
ldap-port 389;
ldap-username "";
ldap-password "";
ldap-base-dn "ou=DHCP-Servers,dc=example,dc=com";
ldap-dhcp-server-cn "silent-gabosh.example.com-wlan";
ldap-method dynamic;
ldap-debug-file "/tmp/dhcp-ldap-startup-config-wlan";

Changes in /etc/dhcp/dhcpd-wlan.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd-wlan.conf

Changed on 06.09.08
Issued by olli
Beginning line 1

Configuration for DHCP in WLAN Network

option subnet-mask XXX.XXX.XXX.XXX;
option broadcast-address XXX.XXX.XXX.XXX;
option domain-name-servers my.lan.ip.addr;
option domain-name "example.com";
option ntp-servers my.lan.ip.addr;
option routers XXX.XXX.XXX.XXX;
default-lease-time 7200;
max-lease-time 14400;
ddns-update-style none;
subnet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX {
 range XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX;
}

next-server XXX.XXX.XXX.XXX;
filename "bootx64.efi";

Changed on 06.09.08
Issued by olli
Beginning line 20

Hosts with fixed IP

host epson-gabosh-wlan {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host small-gabosh {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host knirps {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host ultra-gabosh {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host heidiphone {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host homephone {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host beckyphone {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host user1phone {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host hometablet {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}
host beckykindle {
 hardware ethernet XX:XX:XX:XX:XX:XX;
 fixed-address XXX.XXX.XXX.XXX;
}


Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add dhcpd 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

DNS

The goal of this topic is to use your own DNS. I use this setup for one zone (domain gabosh.net). Feel free to change the configuration to fit your needs.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-dns/bind
emerge net-dns/bind-tools

Changes in /etc/bind/named.conf

File permissions:
Owner: root
Group: named
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/bind/named.conf

Changed on 07.09.08
Issued by olli
Beginning line 37

Listen on localhost and the LAN and forward requests if they are not known by this DNS (for internet name resolution).


Before change
        listen-on { 127.0.0.1; };
After change
        // Listen
	listen-on { 127.0.0.1;
		    my.lan.network.ip/16;
		    XXX.XXX.XXX.XXX/16;
		    XXX.XXX.XXX.XXX/24;
	};

	listen-on-v6 { none; };
	// The way to the Internet (only for LAN/WLAN:  my.lan.network.ip/24, XXX.XXX.XXX.XXX/24, XXX.XXX.XXX.XXX/24 and XXX.XXX.XXX.XXX/24)
        allow-recursion { XXX.XXX.XXX.XXX/8;
                          my.lan.network.ip/24;
			  XXX.XXX.XXX.XXX/24;
			  XXX.XXX.XXX.XXX/24;
			  XXX.XXX.XXX.XXX/24;
			  XXX.XXX.XXX.XXX/24;
        };
	// Local zones
        allow-query { XXX.XXX.XXX.XXX/8;
		      my.lan.network.ip/16;
		      XXX.XXX.XXX.XXX/16;
		      XXX.XXX.XXX.XXX/24;
	};
	allow-notify { none; };

        allow-transfer {
                /* Zone tranfers are denied by default. */
                none;
        };

        allow-update {
                /* Don't allow updates, e.g. via nsupdate. */
                none;
        };



Changed on 24.03.09
Issued by olli
Beginning line 86

Log DNS-Queries

logging {
 channel queries {
  #file "/var/log/bind/dns-queries" versions 2 size 1m;
  syslog local1;
  #print-time yes;
 };
 category queries {
  queries;
 };
};

Changed on 07.09.08
Issued by olli
Beginning line 130

Zone definitions for some domains


# This is an entry for an LDAP Zone. Use this only if you want to use Bind with LDAP
#zone "example.com" IN {
#        type master;
#	database "ldap ldap://127.0.0.1/dc=example,dc=com 172800";
#	allow-update { none; };
#};

zone "example.com." IN {
       type master;
       file "zones/db.example.com";
       allow-update { none; };
};
zone "XXX.XXX.in-addr.arpa" {
        type master;
	file "zones/db.172.23";
	allow-update { none; };
};

zone "25.172.in-addr.arpa" {
        type master;
        file "zones/db.172.25";
        allow-update { none; };
};

#include "/var/bind/blacklisted.zones";

Changes in /etc/conf.d/named

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/named

Changed on 02.08.21
Issued by olli
Beginning line 3

IPv4 only. Prevents "error (network unreachable) resolving" log entries.


Before change
OPTIONS=""
After change
OPTIONS="-4"

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add named 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

DynDNS

I'm using the provider Kontent for syncing my daily changing IP with the Internet-DNS for my top-level-domain and DynDNS.org for syncing the Domain gentooly.homelinux.org.
Here is a little cron-job doing this work for me.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-dns/ez-ipupdate

Changes in /etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/crontab

Changed on 07.09.08
Issued by olli
Beginning line 20

My Provider offers an easier way to update my dynamic IP with my domain. Here you don't need ez-ipupdate. It is enough to use wget on a specific URL.

#*/30 * * * * 	root	/root/scripts/dyndns.sh 2>&1
# Internetverbindung aufbauen falls pppd nicht da
#*/30 * * * *    root    if ! ps ax | grep -v grep | grep -q pppd; then /etc/init.d/net.ppp0 zap ; /etc/init.d/net.ppp0 start ; fi

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

File deduplication

If you have a large fileserver or something else with many users some files could be saved multiple times in different locations which eats useless space.
With the following script you can find similar files and create automatically hardlinks on them for saving disk space. Please be very careful with this and think about if a file is hard linked and you cange it all other files linked to this file are changed too because they are the same file for the filesystem (same Inode).
I use this for for my complete system backups.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge app-misc/fdupes

Changes in /usr/local/sbin/deduplicate.pl

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/deduplicate.pl

Changed on 29.04.10
Issued by olli
Beginning line 2

This script finds duplicate files and creates hardlinks on them (file deduplication). Be very careful with this!
Think about that if you change one file the linked file will be changed too.

#!/usr/bin/perl -w

# Usage: deduplicate.pl <Dir1> [dir2] [...]

# ToDo: Add a DryRun (Print only the files which will be linked and not link them)

#foreach $a (@ARGV) {
# @dirlist=`find $a -type d`;
# foreach $b (@dirlist) {
#  chomp($b);
#  push(@list,$b);
# }
#}

@duplicates=`fdupes -q -r @ARGV`;
$new=1;
foreach $file (@duplicates) {
 chomp($file);
 unless ($file) {
  $new=1;
  next;
 }
 if ($new) {
  $sourcefile=$file;
  $new=0;
  next;
 }
 print "ln -f $sourcefile $file\n";
 `ln -f  $sourcefile $file`;
}

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

File-Server - Samba

Here is my configuration for the classic File-Server Samba. Whith this service you can access your shares from Windows, Linux and some other Operatingsystems which supports the CIFS-Protocol. With the share homes you can share the Home-Directories of your users over the network.
You want to use OpenLDAP for Samba authentication etc.? Then you should first finish the OpenLDAP Howto
If you don't use OpenLDAP, you have to create an additional password file for your Samba users with the following commands:
smbpasswd -a user1
smbpasswd -a user2
The usernames have to be identical with your system user names. This is necessary for mapping the UIDs to the Samba-users.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-fs/samba

Changes in /etc/pam.d/system-auth

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pam.d/system-auth

Changed on 20.05.09
Issued by olli
Beginning line 24

Sync a changed User password changed with the passwd command with the Samba Password if the User exists in Samba

#password        sufficient      pam_smbpass.so use_authtok nullok use_first_pass

Changes in /etc/security/limits.d/samba.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/security/limits.d/samba.conf

Changed on 18.06.10
Issued by olli
Beginning line 1

Allow 16384 opened files. This is for preventing the following warning:rlimit_max: rlimit_max (1024) below minimum Windows limit (16384)

* - nofile 16384 

Changes in /usr/local/sbin/smbwatch

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/smbwatch

Changed on 02.03.11
Issued by olli
Beginning line 2

This is a daemon which sends an eMail when a user loggs in.

#!/usr/bin/perl -w

# Load modules
use strict;
use File::Tail;
use Proc::Daemon;
use File::Basename;

# Stop running daemon if exists
my $me=basename("$0");
if (-f "/var/run/$me") {
 open(PID, "</var/run/$me");
 my $pid=<PID>;
 close(PID);
 chomp($pid);
 if (-d "/proc/$pid") {
  print "Killing old daemon with PID: $pid\n";
  kill 9, $pid;
 }
}

# Daemonize
Proc::Daemon::Init();

# Write PID file
open(PID, ">/var/run/$me");
print PID $$;
close(PID);

# The address where notification mails should go to
my $mailto='mail@example.com';
# Targetlogfile
my $logfile="/var/log/samba/samba.log";

my $file=File::Tail->new(name => $logfile, maxinterval => 1, adjustafter => 1, reset_tail => 0);
while (defined(my $line=$file->read)) {
 if ($line =~ /authentication for user/) {
  $line=~s/  +/ /g;
  $line=~s/\[//g;
  $line=~s/\]//g;
  $line=~s/^ +//;
  my $smbstatus=`smbstatus`;
  my @line=split(/ /,$line);
  `echo "Hi,

$line[4] is logging in:
$smbstatus
$line

Your $0 [$$]
" | mail -s "SMBWATCH: $line[4] is logging in" $mailto`;

 }

 if ($line =~ /closed connection/) {
  $line=~s/  +/ /g;
  $line=~s/\[//g;
  $line=~s/\]//g;
  $line=~s/^ +//;
  my $smbstatus=`smbstatus`;
  my @line=split(/ /,$line);
  `echo "Hi,

$line[0] is closing the connection to service $line[6]:

$line
$smbstatus

Your $0 [$$]
" | mail -s "SMBWATCH: $line[0] is closing the connection to service $line[6]" $mailto`;
 }
 $line="";
}

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add samba 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Firewall

Because of the complexity of my network-configuration, I decided to write my own firewall-script. Here it is.
Don't forget to make it executable... ;-)

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-firewall/iptables
emerge sys-apps/iproute2

Changes in /etc/local.d/01_services.start

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/local.d/01_services.start

Changed on 06.10.08
Issued by olli
Beginning line 1

Starting the firewall after system boot.

/usr/local/sbin/fire.sh

Changes in /etc/sysctl.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sysctl.conf

Changed on 06.09.08
Issued by olli
Beginning line 13

This allows kernel routing.


Before change
#net.ipv4.ip_forward = 0
After change
net.ipv4.ip_forward = 1
# IP spoofing protection
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

Changes in /etc/sysctl.d/gabosh.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sysctl.d/gabosh.conf

Changed on 06.09.08
Issued by olli
Beginning line 1

This ignores ipv4 ICMP-Broadcasts.

net.ipv4.icmp_echo_ignore_broadcasts = 1

Changes in /usr/local/sbin/fireoff.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/fireoff.sh

Changed on 10.06.09
Issued by olli
Beginning line 2

With this script you can deactivate everything you counfigured with the fire.sh-Script. This could be helpful if you want to test something without a firewall.

#!/bin/bash

# deactivate antispoofing
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
 echo 0 > $f
done

# deactivate antispoofing logging
for f in /proc/sys/net/ipv4/conf/*/log_martians; do
 echo 0 > $f
done

# allow ICMP redirects
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
 echo 1 > $f
done
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
 echo 1 > $f
done

# allow source routed packets
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
 echo 1 > $f
done

# recive ICMP broadcast echos
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# don't ignore wrong ICMP-F
echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# activate IP-Forwardig (routing)
echo 1 > /proc/sys/net/ipv4/ip_forward
#echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

echo 1 >/proc/sys/net/ipv4/tcp_timestamps
echo 1 >/proc/sys/net/ipv4/tcp_window_scaling


# reset/allow everything
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -F
ip6tables -X

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 


Changes in /usr/local/sbin/fire.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/fire.sh

Changed on 21.04.12
Issued by olli
Beginning line 2

This is my firewall script.

#!/bin/bash
/etc/init.d/fail2ban stop >/dev/null 2>&1
/etc/init.d/fail2ban zap >/dev/null 2>&1
sleep 2
while ps ax | grep -v grep | grep -q fail2ban 
do
 echo -n "."
 kill -9 $(pidof /usr/bin/python3.9 /usr/bin/fail2ban-server)
 sleep 1
done

### CONFIGURATION ###

WANIF="eth1"
WANUDP="123 514"

# Internet Interface
INETIF="ppp0"
# Opened INET Ports TCP/UDP 
# ssh, smtp, http, https, smtps, smtp/submission, rsync, imaps, pop3s, turn/stun, xmpp, xmpp, ssh-tunnel
INETTCP="22 25 28 80 443 465 587 873 993 995 3478 5222 5269 8081"
# syslog, turn/stun
INETUDP="514 3478"
# Portforwarding(s) for connections from INET-Devices: 
# Syntax: "SourceIP:Sourceport1:Destinationip1:Destinationport1:Protocol1 SourceIP2:Sourceport2:Destinationip2:Destinationport2:Protocol2"
# This enables routing on routed Networks too (but only for the destination-Port/IP)
#INETPORTFW="0.0.0.0/0:82:192.168.178.1:80:tcp"
INETPORTFW=""
#INETPORTFW="0.0.0.0/0:465:my.lan.ip.addr:25:tcp 0.0.0.0/0:587:my.lan.ip.addr:25:tcp"
# Here you can enter trusted IPs or whole networks for completely routing of them
#INETROUTED=""
# Deny (untrusted) MACs for ROUTING/FORWARDING to the Internet
# EPSON-Printer
NOINETMACS="XX:XX:XX:XX:XX:XX"
# Here you can add Domains in the Internet to be not routed
NOINETDOMAINS=""
# Disallow Internet DNS requests
NOINETDNS="no"
# Block IPs coming from Internet
BLOCKINETIPS="XXX.XXX.XXX.XXX/24 XXX.XXX.XXX.XXX/24 XXX.XXX.XXX.XXX/24 XXX.XXX.XXX.XXX/24 XXX.XXX.XXX.XXX/24 XXX.XXX.XXX.XXX/16 XXX.XXX.XXX.XXX/16 XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX"

# LAN Interface
LANIF="eth0"
# Opened LAN Ports TCP/UDP
# ssh-sftp, nfs, ldap, ipp-cups, ldaps, hugo-blog, nfs, nfs, pulseaudio, drbd , drbd
LANTCP="$INETTCP 24 111 222 389 587 631 636 1313 2049 3000 3128 32765:32768 4713 5901 7788 7789 7790 10102 5950 "
# dns, tftp, ntp, nfs-rpc, syslog, ipp-cups, nfs, squid, asterisk, asterisk, nfs
LANUDP="$INETUDP 53 69 123 111 514 631 2049 5000:5040 5060 32765:32768"
# Portforwarding(s):
# Syntax: "SourceIP:Sourceport1:Destinationip1:Destinationport1:Protocol1 SourceIP2:Sourceport2:Destinationip2:Destinationport2:Protocol2"
# This enables routing on routed Networks too (but only for the destination-Port/IP)
LANPORTFW=""
#LANPORTFW="0.0.0.0/0:10102:127.0.0.1:10102:tcp"
#LANPORTFW="0.0.0.0/0:5901:my.lan.ip.addr:5900:tcp 0.0.0.0/0:587:my.lan.ip.addr:25:tcp"

# WLAN Interface
WLANIF="wlan0"
WLANTCP="$LANTCP"
WLANUDP="$LANUDP"
# Portforwarding(s):
# Syntax: "SourceIP:Sourceport1:Destinationip1:Destinationport1:Protocol1 SourceIP2:Sourceport2:Destinationip2:Destinationport2:Protocol2"
# This enables routing on routed Networks too (but only for the destination-Port/IP)
WLANPORTFW=""
#WLANPORTFW="0.0.0.0/0:465:my.lan.ip.addr:25:tcp 0.0.0.0/0:587:my.lan.ip.addr:25:tcp"

VNETIF="vnet0"
VNETTCP="$LANTCP"
VNETUDP="$LANUDP"

DOCKERIF="docker0"
DOCKERTCP=""
DOCKERUDP=""

# Optional SIP GW for incoming calls
#SIPGWS="SIP-PROVIDER-HOSTNAME"
RTPRANGE="5000:5040"

### CONFIGURATION END ###



### Some kernel parameters ###

# Antispoofing
for FILTER in /proc/sys/net/ipv4/conf/*/rp_filter; do
 echo 1 > $FILTER
done
# Antispoofing Logging
#for f in /proc/sys/net/ipv4/conf/*/log_martians; do
# echo 1 > $f
#done
# ICMP Redirects Verweigern
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
 echo 0 > $f
done
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
 echo 0 > $f
done
# Deny Source Routed Packets
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
 echo 0 > $f
done
# Ignore ICMP broadcast echos
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Ignore Bogus ICMP-Errors
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Disable WLAN Power saving
iw dev $WLANIF set power_save off
# activate IP-Forwardig (routing)
echo 1 > /proc/sys/net/ipv4/ip_forward


### prepare iptables - Reset/Deny all ###

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Drop all zeroconf IPs
iptables -A INPUT -s XXX.XXX.XXX.XXX/16 -j DROP
iptables -A FORWARD -s XXX.XXX.XXX.XXX/16 -j DROP

# No Internet DNS
if echo $NOINETDNS | grep -q yes
then
 iptables -A FORWARD -p udp -o $INETIF --dport 53 -j DROP
 iptables -A FORWARD -p tcp -o $INETIF --dport 53 -j DROP
fi

# Drop Reset Packages
iptables -A INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP

### Routing the IPv4 networks ###

# Masquerade routing into the Internet
iptables -t nat -A POSTROUTING -o $INETIF -j MASQUERADE

# DOCKER will be routed everywhere
iptables -A FORWARD -i $DOCKERIF -m conntrack --ctstate NEW -j ACCEPT
# LAN will be routed everywhere
iptables -A FORWARD -i $LANIF -m conntrack --ctstate NEW -j ACCEPT
# VNET will be routed everywhere
iptables -A FORWARD -i $VNETIF -m conntrack --ctstate NEW -j ACCEPT
# WLAN will be routed everywhere
iptables -A FORWARD -i $WLANIF -m conntrack --ctstate NEW -j ACCEPT
# MACs not to be routed to the Internet
for NOINETMAC in $NOINETMACS
do
 iptables -A FORWARD -m mac --mac-source $NOINETMAC -o $INETIF -j DROP
done
# Block some domains to be routed to the Internet
for NOINETDOMAIN in $NOINETDOMAINS
do
 iptables -A FORWARD -m string --string "Host: $NOINETDOMAIN" --algo bm -o $INETIF -j REJECT
done
# Allow all routed-opened conections. This does not allow incomin/new connections to be routed. The connections has to be opened in the LAN or on a trusted/routed host
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# if you are using that node as a NAT router, the systems behind it have no way to know the real MTU of the PPPoE interface. Therefore the systems will try to use packets bigger than the maximum allowed, which will be dropped without warning by routers.
# The solution for that, unless you want to configure all your devices with a reduced MTU, is to instruct the routing host to intercept all the TCP handshake packets and correct in-fly the wrong MSS value requested by internal hosts.
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Allow trusted Hosts/Networks to be routed new connections from INETNET
for INETNETIP in $INETROUTED
do
 iptables -A FORWARD -i $INETIF -s $INETNETIP -m conntrack --ctstate NEW -j ACCEPT
done


### Portforwarding ###

# Portforwarding for INETLAN
for PFW in $INETPORTFW
do
 # Get DATA
 SRCIP=`echo "$PFW" | cut -d':' -f 1`
 SRCPORT=`echo "$PFW" | cut -d':' -f 2`
 DSTIP=`echo "$PFW" | cut -d':' -f 3`
 DSTPORT=`echo "$PFW" | cut -d':' -f 4`
 PROT=`echo "$PFW" | cut -d':' -f 5`
 # Rule for Portforwarding
 iptables -A PREROUTING -t nat -s $SRCIP -p $PROT -i $INETIF --dport $SRCPORT -j DNAT --to $DSTIP:$DSTPORT
 # Allow forwarding
 iptables -A FORWARD -s $SRCIP -p $PROT -i $INETIF -m conntrack --ctstate new -d $DSTIP --dport $DSTPORT -j ACCEPT
done

# Portforwarding for LAN
for PFW in $LANPORTFW
do
 # Get DATA
 SRCIP=`echo "$PFW" | cut -d':' -f 1`
 SRCPORT=`echo "$PFW" | cut -d':' -f 2`
 DSTIP=`echo "$PFW" | cut -d':' -f 3`
 DSTPORT=`echo "$PFW" | cut -d':' -f 4`
 PROT=`echo "$PFW" | cut -d':' -f 5`
 # Rule for Portorwarding
 iptables -A PREROUTING -t nat -s $SRCIP -p $PROT -i $LANIF --dport $SRCPORT -j DNAT --to $DSTIP:$DSTPORT
 # Allow forwarding
 iptables -A FORWARD -s $SRCIP -p $PROT -i $LANIF -m conntrack --ctstate new -d $DSTIP --dport $DSTPORT -j ACCEPT
done

# Portforwarding for WLAN
for PFW in $WLANPORTFW
do
 # Get DATA
 SRCIP=`echo "$PFW" | cut -d':' -f 1`
 SRCPORT=`echo "$PFW" | cut -d':' -f 2`
 DSTIP=`echo "$PFW" | cut -d':' -f 3`
 DSTPORT=`echo "$PFW" | cut -d':' -f 4`
 PROT=`echo "$PFW" | cut -d':' -f 5`
 # Rule for Portorwarding
 iptables -A PREROUTING -t nat -s $SRCIP -p $PROT -i $WLANIF --dport $SRCPORT -j DNAT --to $DSTIP:$DSTPORT
 # Allow forwarding
 iptables -A FORWARD -s $SRCIP -p $PROT -i $WLANIF -m conntrack --ctstate new -d $DSTIP --dport $DSTPORT -j ACCEPT
done

# Last forward rule is for logging. The policy is drop, so all traffig going through this rule are dropped packets
iptables -A FORWARD -j LOG --log-prefix "fire.sh: FORWARD4 DROP: "


### Outgoing traffic from the Server ###

# Allow all outgoing connections with valid state
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED,NEW -j ACCEPT
# Allow pong from ipv6ping
# Last output rule is for logging. The policy is drop, so all traffig going through this rule are dropped packets
iptables -A OUTPUT -j LOG --log-prefix "fire.sh: OUTPUT4 DROP: "

### Incoming traffic into the Server ###

# Hold built connections
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Allow all incoming connections from localhost
iptables -A INPUT -i lo -j ACCEPT

# Open Ports TCP/UDP
# Create Chains
iptables -N gabosh-inet
iptables -N gabosh-wan
iptables -N gabosh-lan
iptables -N gabosh-wlan
iptables -N gabosh-vnet
iptables -N gabosh-docker
# Predefine Chains
iptables -A INPUT -i $INETIF -j gabosh-inet
iptables -A INPUT -i $WANIF -j gabosh-wan
iptables -A INPUT -i $LANIF -j gabosh-lan
iptables -A INPUT -i $WLANIF -j gabosh-wlan
iptables -A INPUT -i $VNETIF -j gabosh-vnet
iptables -A INPUT -i $DOCKERIF -j gabosh-docker
# INET/UDP
for PORT in $INETUDP
do
 iptables -A gabosh-inet -p udp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# INET/TCP
for PORT in $INETTCP
do
 iptables -A gabosh-inet -p tcp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# LAN/TCP
for PORT in $LANTCP
do
 iptables -A gabosh-lan -p tcp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# LAN/UDP
for PORT in $LANUDP
do
 iptables -A gabosh-lan -p udp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# WLAN/TCP
for PORT in $WLANTCP
do
 iptables -A gabosh-wlan -p tcp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# WLAN/UDP
for PORT in $WLANUDP
do
 iptables -A gabosh-wlan -p udp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# VNET/TCP
for PORT in $VNETTCP
do
 iptables -A gabosh-vnet -p tcp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
# VNET/UDP
for PORT in $VNETUDP
do
 iptables -A gabosh-vnet -p udp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
for PORT in $DOCKERTCP
do
 iptables -A gabosh-docker -p tcp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done
for PORT in $DOCKERUDP
do
 iptables -A gabosh-docker -p udp --dport $PORT -m conntrack --ctstate NEW -j ACCEPT
done

# Allow ping from LAN
iptables -A gabosh-lan -p icmp --icmp-type echo-request -j ACCEPT
iptables -A gabosh-vnet -p icmp --icmp-type echo-request -j ACCEPT
iptables -A gabosh-wlan -p icmp --icmp-type echo-request -j ACCEPT
iptables -A gabosh-docker -p icmp --icmp-type echo-request -j ACCEPT
#iptables -A gabosh-inet -p icmp --icmp-type echo-request -j ACCEPT


# Last input rule is for logging. The policy is drop, so all traffig going through this rule are dropped packets
iptables -A INPUT -j LOG --log-prefix "fire.sh: INPUT4 DROP: "

# Fail2Ban restart for revert f2b iptables rules
#/etc/init.d/fail2ban start >/dev/null 2>&1


Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

HD-Spindown

You can check the current power state with
hdparm -C /dev/disk
Please be caraful with this solution. If you set the timeout to low it is possible that your disk is spinning up an down very often which is noch very good for your hardware...

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge sys-apps/hdparm

Changes in /etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/crontab

Changed on 30.11.10
Issued by olli
Beginning line 32

Shutdown /dev/sdb if it is inactive

*/5 * * * *     root    /usr/local/sbin/hdspindown.sh sdb

Changes in /usr/local/sbin/hdspindown.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/hdspindown.sh

Changed on 30.11.10
Issued by olli
Beginning line 2

This is a small script to observe the inactivity of given disk(s). If the given disks are longer then $inactive minutes inactive they will be spinned down and set to sleep (e.g. for powersaving). If a disk ist shutdown a mail will be sent to root.

#!/bin/bash

# Time of inactivity after which the disk is spinned down
inactive=30

# Get default profile
. /etc/profile

# Function for checking the disks state
function checkactive {
 # If the disk is not spinned down - shutdown the disk
 if hdparm -C /dev/$1 | grep active >/dev/null
 then
  echo "`date` Spinning down $1" >> /tmp/spinned-down
  echo "1" >/tmp/spindown$1
  spindown $1
# else
#  echo "`date` Already spinned down $1" >> /tmp/spinned-down
 fi
}

# Function for sending a mail and spindown the disk
function spindown {
 echo "Issuing sleep on disk $1:

`ls -l /sys/block/$1/stat`
`cat /sys/block/$1/stat`

`ls -l /tmp/$1-stat`
`cat /tmp/$1-stat`

Date: `date`

Issuing command: hdparm -y /dev/$1:
`hdparm -y /dev/$1 2>&1`
" | mail -s "Spinning down $1" root
}

# Check commandline
if [ $# -eq 0 ]
then
 echo "This is a small script to observe the inactivity of given disk(s). If the given disks are longer then $inactive minutes inactive they will be spinned down and set to sleep (e.g. for powersaving). If a disk ist shutdown a mail will be sent to root.
 
 Please enter the disk(s) you want do observe seperated with space. E.g for observing /dev/hdb and /dev/sda:
$0 hdb sda"
 exit 1
fi

# Go through the arguments
for disk in $*
do
 # If the disk exists
 if [ -L "/sys/block/$disk" ]
 then
  # Create diff-file if it dows not exist
  [ -f /tmp/$disk-stat ] || touch /tmp/$disk-stat
  # If there was nothing changed 
  if diff /sys/block/$disk/stat /tmp/$disk-stat >/dev/null 2>&1
  then
   # Check weather the disk is longer then $inactive inactive
   find /tmp/$disk-stat -mmin -$inactive | grep $disk >/dev/null || checkactive $disk
  # If the file is changed
  else
   # Save changed file
   cat /sys/block/$disk/stat > /tmp/$disk-stat
   if [ -f /tmp/spindown$disk ]
   then
    echo "Disk $disk active again" | mail -s "$disk active again" root
    echo "`date` Disk active: $disk" >> /tmp/spinned-down
    rm -f /tmp/spindown$disk
   fi
#   echo "`date` Disk active: $disk" >> /tmp/spinned-down
  fi
 # If the disk does not exist
 else
  echo "Disk $disk seems not to exist"
 fi
done

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Horde Groupware Webmail

This is a short Howto/Example how I set up my Horde with its applications like Webmail, Groupware, PGP (GnuPG), Sieve filters, LDAP Auth,...
Here are some commands for installing Horde 4 over PEAR.
# Set your paths
BASEDIR=/var/www/horde-test.gabosh.net
PEARDIR=$BASEDIR/pear
WEBDIR=$BASEDIR/htdocs

rm /usr/bin/phpize
ln -s /usr/lib/php*/bin/phpize /usr/bin/phpize

mkdir -p $PEARDIR/pear
mkdir -p $WEBDIR
pear config-create $PEARDIR $PEARDIR/pear.conf
pear -c $PEARDIR/pear.conf install pear

$PEARDIR/pear/pear -c $PEARDIR/pear.conf channel-discover pear.horde.org
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install horde/horde_role
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install run-scripts horde/Horde_Role

$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/imp
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/kronolith
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/ingo
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/nag
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/turba
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/mnemo
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/passwd
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/gollem
$PEARDIR/pear/pear -c $PEARDIR/pear.conf install -a -B horde/wicked

chown -R root:root $BASEDIR
find $BASEDIR -type d -exec chmod 755 {} \;
find $BASEDIR -type f -exec chmod 644 {} \;
chown apache:root $WEBDIR/static
chown apache:root $WEBDIR/config
chown apache:root $WEBDIR/*/config

After these steps you should be able to open your Horde installation into your Webbrowser and create the basic configurations.
Do this in the left menu under "Administration" -> "Configuration"
After that you can follow up with the configuration of the configfiles in the config-directories you see below.



Here some steps for upgrading your Horde:
# Set yout paths
BASEDIR=/var/www/horde-test.gabosh.net
PEARDIR=$BASEDIR/pear
WEBDIR=$BASEDIR/htdocs

rm /usr/bin/phpize
ln -s /usr/lib/php*/bin/phpize /usr/bin/phpize
chmod 755 $PEARDIR/pear/pear
$PEARDIR/pear/pear -c $PEARDIR/pear.conf upgrade -a -B -c horde

chown -R root:root $BASEDIR
find $BASEDIR -type d -exec chmod 755 {} \;
find $BASEDIR -type f -exec chmod 644 {} \;
chown apache:root $WEBDIR/static
chown apache:root $WEBDIR/config
chown apache:root $WEBDIR/*/config

If you want to use this solution you need the following howto(s) finished:

Changes in /usr/local/sbin/mkhordestable.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/mkhordestable.sh

Changed on 04.10.11
Issued by olli
Beginning line 2

This is an optional script for syncing/copying a Horde-Installation into an new path. E.g. for moving a test Horde into production.

#!/bin/bash

# Set paths

set -x

PEARDIR=/var/www/horde.example.com/pear
WEBDIR=/var/www/horde.example.com
TESTWEBDIR=/var/www/horde-test.example.com

mkdir -p /var/www/horde.example.com
rsync -av --delete --exclude=.gtc-crypt $TESTWEBDIR/ $WEBDIR/
BASEDIR=$WEBDIR
WEBDIR=$WEBDIR/htdocs

# Set pear config
rm -f $PEARDIR/pear.conf
pear -c $PEARDIR/pear.conf config-set bin_dir /var/www/horde.example.com/pear/pear
pear -c $PEARDIR/pear.conf config-set doc_dir /var/www/horde.example.com/pear/pear/docs
pear -c $PEARDIR/pear.conf config-set ext_dir /var/www/horde.example.com/pear/pear/ext
pear -c $PEARDIR/pear.conf config-set php_dir /var/www/horde.example.com/pear/pear/php
pear -c $PEARDIR/pear.conf config-set cache_dir /var/www/horde.example.com/pear/pear/cache
pear -c $PEARDIR/pear.conf config-set cfg_dir /var/www/horde.example.com/pear/pear/cfg
pear -c $PEARDIR/pear.conf config-set data_dir /var/www/horde.example.com/pear/pear/data
pear -c $PEARDIR/pear.conf config-set download_dir /var/www/horde.example.com/pear/pear/download
pear -c $PEARDIR/pear.conf config-set temp_dir /var/www/horde.example.com/pear/pear/temp
pear -c $PEARDIR/pear.conf config-set test_dir /var/www/horde.example.com/pear/pear/tests
pear -c $PEARDIR/pear.conf config-set www_dir /var/www/horde.example.com/pear/pear/www
pear -c $PEARDIR/pear.conf config-set horde_dir /var/www/horde.example.com/htdocs

# Horde-Config
# DB
sed -e 's/hordetest/horde/g' -i $WEBDIR/config/conf.php
# LOG
sed -e 's/horde-test/horde/g' -i $WEBDIR/config/conf.php
# LOGLEVEL
sed -e 's/DEBUG/INFO/g' -i $WEBDIR/config/conf.php

# Set some rights
echo "Setting File rights"
chown -R root:root $BASEDIR
find $BASEDIR -type d -exec chmod 755 {} \;
find $BASEDIR -type f -exec chmod 644 {} \;
chown -R horde:root $WEBDIR/static
chown -R horde. /var/www/horde.example.com/.gtc-crypt
chown horde. /var/www/horde.example.com
#chown -R horde:root $WEBDIR/config
#chown -R horde:root $WEBDIR/*/config

# Clean up Pear Registry with correct paths
cd $PEARDIR/pear/php/.registry
ls -1 | while read file
do
 echo "Cleaning up $file (horde-test -> horde)"
 cat "$file" | perl -pe 's/\n/OOXXOO/; s/(s\:[0-9]+\:)/\n$1/g' | while read line
 do
  if echo $line | grep -q horde-test
  then
   line=`echo $line | perl -pe 's/horde-test/horde/'`
   chars=`echo $line | cut -d'"' -f2 | wc -m`
   let chars--
   line=`echo $line | perl -pe "s/\:[0-9]+\:/:$chars:/;"`
  fi
  echo -n $line | perl -pe 's/OOXXOO/\n/g;'
 done >/tmp/nfile
 cat /tmp/nfile >"$file"
done
cd -

# Change paths in some pear files
for i in `grep -r horde-test $PEARDIR | cut -d: -f1`
do
 echo "Changing horde-test to horde in $i"
 sed -e 's/horde-test/horde/g' -i $i
done

# DB Update
cat /var/www/horde.example.com/pear/pear.conf >/etc/pear.conf
echo 'include_path="$include_path:/var/www/horde.example.com/pear/pear:/var/www/horde.example.com/pear/pear/php"' >/etc/php/cli-php7.3/ext-active/horde-cli.ini
chmod 644 /etc/php/cli-php7.3/ext-active/horde-cli.ini
su - horde -c "/usr/bin/php $PEARDIR/pear/horde-db-migrate"

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

IMAP/POP3-Server

Here is my IMAP/POP3-Server configuration. I'm using this in combination with postfix and the webmailer Horde. It is also possible to use a mailclient like thunderbird.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-mail/cyrus-imapd

Changes in /etc/cron.daily/cyrus-purge.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /etc/cron.daily/cyrus-purge.sh

Changed on 07.07.09
Issued by olli
Beginning line 2

This is a daily cron job that deletes all messages in of the admin-User older then 30 days.

#!/bin/bash
ipurge -d30 -X -f user/admin >/dev/null
ipurge -d30 -X -f user/admin/% >/dev/null
ipurge -d90 -X -f user/%/Spam >/dev/null
ipurge -d90 -X -f user/%/Junk >/dev/null
ipurge -d90 -X -f user/%/Papierkorb >/dev/null
ipurge -d90 -X -f user/%/Trash >/dev/null
ipurge -d3650 -X -f user/%/Sent >/dev/null
ipurge -d365 -X -f user/marco/Terminmails >/dev/null
ipurge -d90 -X -f user/user1/Server >/dev/null
find /var/spool/imap/*/user/*/Sent* -type f -name '*.' -size +1M -mtime +365 -delete
cyr_expire -D 60 -X 60
/usr/sbin/reconstruct -fGRr % >/dev/null

Changes in /etc/profile.d/cyrus.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/profile.d/cyrus.sh

Changed on 17.08.10
Issued by olli
Beginning line 1

Add the bin-path of the cyrus-progs to the default path-variable

PATH="$PATH:/usr/lib/cyrus"

Changes in /usr/local/sbin/cyr-create-mbox

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-create-mbox

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for creating cyrus mailboxes.

#!/usr/bin/perl


unless ($ARGV[0]=~/^[a-zA-Z0-9\/\.]+$/) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[0] ist kein gültiger MBOX-Name\nAufruf: $0 MBOXNAME MBOXGRÖßE") }
#unless (($ARGV[1]=~/\d{2}/) && ($ARGV[1]<=9999)) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[1] ist kein erlaubter Wert (Minimal 10 / Maximal 9999)\nAufruf: $0 MBOXNAME MBOXGRÖßE") }


chomp($ARGV[0], $ARGV[1]);
$mbox=$ARGV[0];
$spaceusage=$ARGV[1];
$mboxspace=$ARGV[1]*1024;
$space=$ARGV[1];

use Cyrus::IMAP::Admin;
$cyrus = Cyrus::IMAP::Admin->new("localhost");
$cyrpass=`gtc-crypt -a admin -p`;
chomp($cyrpass);
$cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass);

unless ($cyrus->listmailbox($mbox)) { 
 $cyrus->createmailbox($mbox) || error("Konnte Mailbox $mbox nicht erstellen: $!");
}
$recover=2;

if ($mbox=~/^user\/[a-zA-Z0-9]+$/) {
 $cyrus->createmailbox("$mbox/Drafts") || error("Konnte Mailbox $mbox.Drafts nicht erstellen: $!") unless ($cyrus->listmailbox("$mbox/Drafts"));
 $cyrus->createmailbox("$mbox/Sent") || error("Konnte Mailbox $mbox.Sent nicht erstellen: $!") unless ($cyrus->listmailbox("$mbox/Sent"));
 $cyrus->createmailbox("$mbox/Trash") || error("Konnte Mailbox $mbox.Trash nicht erstellen: $!") unless ($cyrus->listmailbox("$mbox/Trash"));;
 $cyrus->createmailbox("$mbox/Spam") || error("Konnte Mailbox $mbox.Spam nicht erstellen: $!") unless ($cyrus->listmailbox("$mbox/Spam"));
}
else {
 $cyrus->setacl($mbox, anyone => none) || error("Kann die Rechte nicht setzen: $@"); 
}

if ($ARGV[1]) {
 $cyrus->setquota($mbox, STORAGE, $mboxspace) || error("Konnte Quota von $mbox nicht auf $spaceusage setzen: $@");
}


exit 0;

sub error {
 $message=shift;
 if ($recover>=2) { 
  $cyrus = Cyrus::IMAP::Admin->new("localhost") || warn "Recovery: Keine Verbindung zu $cyrhost: $@";
  $cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass) || warn "Recovery: Keine Authentifizierung auf $cyrhost als $cyruser möglich: $@";
  $cyrus->setaclmailbox($mbox, $cyruser => "c") || warn "Recovery: Fehler beim setzen der lösch Rechte auf $mbox: $@";
  $cyrus->deletemailbox($mbox) || warn "Recovery: Konnte $mbox nicht wieder löschen: $@";
 }
 die "$message";
}

Changes in /usr/local/sbin/cyr-delete-mbox

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-delete-mbox

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for deleting cyrus mailboxes.

#!/usr/bin/perl

# Nötige Informationen:
# - MBOXName arg0

unless ($ARGV[0]=~/^[a-zA-Z0-9\/\.]+$/) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[0] ist kein gültiger MBOX-Name\nAufruf: $0 MBOXNAME") }


# Newlines entfernen
chomp($ARGV[0]);
# mbox setzen 
$mbox=$ARGV[0];

## Jetzt gehts aber wirklich los ##

use Cyrus::IMAP::Admin;

# Connect to Cyrus
$cyrus = Cyrus::IMAP::Admin->new("localhost");

# Authentifizieren
$cyrpass=`gtc-crypt -a admin -p`;
chomp($cyrpass);
$cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass);
$cyrpass="";

# Checken ob MBOX schon existiert existiert
unless ($cyrus->listmailbox($mbox)) { error("MBOX $mbox gibt es nicht") }

# Lösch-Rechte setzen
$cyrus->setaclmailbox($mbox, 'admin' => "c") || error("Konnte Mailboxrechte von $mbox nicht auf c ändern: $!");

# Mailbox löschen
$cyrus->deletemailbox($mbox) || error("Konnte Mailbox $mbox nicht löschen: $!");


exit 0;

sub error {
 $message=shift;
 die "$message";
}

Changes in /usr/local/sbin/cyr-resize-mailbox.pl

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-resize-mailbox.pl

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for changing quota on cyrus mailboxes.

#!/usr/bin/perl


##### Los gehts :-) #####

## Etwas Vorgeplänkel noch ##

# Übergabeparameter checken
unless ($ARGV[0]=~/^[a-zA-Z0-9\-\/\.]+$/) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[0] ist kein gültiger MBOX-Name\nAufruf: $0 MBOXNAME MBOXGRÖßE") }
unless (($ARGV[1]=~/\d{2}/) && ($ARGV[1]<=99999)) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[1] ist kein erlaubter Wert (Minimal 10 / Maximal 99999)\nAufruf: $0 MBOXNAME MBOXGRÖßE") }


# Newlines entfernen
chomp($ARGV[0], $ARGV[1]);
# mbox setzen
$mbox=$ARGV[0];
# Benötigter Speicherplatz der neuen MBOX
$spaceusage=$ARGV[1];
# MBox-Größe für DB-Eintrag
$space=$ARGV[1];
# Größe des mboxspaces für cyrus berechnen
$mboxspace=$ARGV[1]*1024;

## Jetzt gehts aber wirklich los ##
use Cyrus::IMAP::Admin;

# Connect to Cyrus
$cyrus = Cyrus::IMAP::Admin->new("localhost");
#
# # Authentifizieren
$cyrpass=`gtc-crypt -a admin -p`;
chomp($cyrpass);
$cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass);
$cyrpass="";
#

# Checken ob MBOX existiert
unless ($cyrus->listmailbox($mbox)) { error("MBOX $mbox gibt es nicht") }

# Prüfen ob Quote nicht zu klein für die Datenmenge in der Mailbox ist
# Quota der MAilbox holen
%quota = $cyrus->listquota("$mbox");
# Schlüssel entsprechend durchgehen
foreach (keys(%quota)) {
 if ($mboxspace < $quota{$_}[0]) {
  error("Neues Quota ($mboxspace) zu klein für Mailbox ($quota{$_}[0])");
 }
 # Benötigten Speicherplatz ermitteln
 $spaceusage=-$quota{$_}[1];
}

# Quota auf die Mailbox setzen
$cyrus->setquota($mbox, STORAGE, $mboxspace) || error("Konnte Quote von $mbox nicht auf $mboxspace setzen: $@");



exit 0;

sub error {
 $message=shift;
 die "$message";
}

Changes in /usr/local/sbin/cyr-set-acl

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-set-acl

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for changing rights on cyrus mailboxes.

#!/usr/bin/perl

unless ($ARGV[0]=~/^[a-zA-Z0-9\.\/\- \&]+$/) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[0] ist kein gültiger MBOX-Name\nAufruf: $0 MBOXNAME USER RECHT") }
unless ($ARGV[1]=~/^[a-zA-Z0-9\.]+$/) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[1] ist kein gültiger User-Name\nAufruf: $0 MBOXNAME USER RECHT") }
#unless ($ARGV[2]=~/^[lrswipkxtecdanoa]+$/) { error("Mit den übergebenen Daten stimmt was nicht!\n$ARGV[2] ist kein gültiges Recht\nAufruf: $0 MBOXNAME USER RECHT") }




# Newlines entfernen
chomp($ARGV[0], $ARGV[1], $ARGV[2]);
# mbox setzen 
$mbox=$ARGV[0];
# User
$user=$ARGV[1];
# Recht
$right=$ARGV[2];

## Jetzt gehts aber wirklich los ##

use Cyrus::IMAP::Admin;

# Connect to Cyrus
$cyrus = Cyrus::IMAP::Admin->new("localhost");

# Authentifizieren
$cyrpass=`gtc-crypt -a admin -p`;
chomp($cyrpass);
$cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass);
$cyrpass="";



# Checken ob MBOX  existiert
unless ($cyrus->listmailbox($mbox)) { error("MBOX gibt es nicht") }

# Rechte setzen
$cyrus->setacl($mbox, $user => $right) || error("Kann die Rechte nicht setzen: $@");


exit 0;

sub error {
 $message=shift;
 # Je nach Fehlerzeitpunkt (recover-wert) Recovery starten, wenn nötig.
 # Lockdatei löschen
 # Mit Fehlermeldung beenden
 die "$message";
}

Changes in /usr/local/sbin/cyr-set-sieve.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-set-sieve.sh

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for setting the default sieve-filter-script for a user. The script which is set is /usr/local/etc/sieve.script.default which you have to create.

#!/bin/bash
/usr/lib/cyrus/sievec /usr/local/etc/sieve.script.default /tmp/default.bc
chmod 600 /tmp/default.bc
chown cyrus:mail /tmp/default.bc
INITIAL=`echo $1 | cut -c1`
NAME=$1
cd /var/imap/sieve/$INITIAL/
mkdir -p $NAME
chown cyrus:mail $NAME
cd /var/imap/sieve/$INITIAL/$NAME/
cp /usr/local/etc/sieve.script.default default.script
mv /tmp/default.bc .
ln -sf default.bc defaultbc

Changes in /usr/local/sbin/cyr-show-dirs

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-show-dirs

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for listing all your cyrus directories.

#!/usr/bin/perl

use Cyrus::IMAP::Admin;

# Connect to Cyrus
$cyrus = Cyrus::IMAP::Admin->new("localhost");

# Authentifizieren
$cyrpass=`gtc-crypt -a admin -p`;
chomp($cyrpass);
$cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass);
$cyrpass="";

# Header ausgeben
print "Verzeichisse bzw. Mailboxes:\n\n";
# Mailbox- Infos holen
@acl=$cyrus->listmailbox('*');
# Ausgabe durchgehen
foreach (@acl) {
 $i++;
 if ($acl[$i][0]) {
  # Variable zum angenehmeren Lesen setzen
  $mbox=$acl[$i][0];
  # ACLs vom Server holen
  %acls = $cyrus->listacl("$mbox");
  # Alte ACL-Variable loeschen
  $acl="";
  # ACL-Variable zusammenbauen
  foreach (keys(%acls)) { $acl="$acl $_ -> $acls{$_}   " }
  # Quotas vom Server holen
  %quota = $cyrus->listquota("$mbox");
  # Ausgabe durchgehen
  foreach (keys(%quota)) {
   # Gibt es fuer die Box ein Quota?
   if ($quota{$_}[1]) {
    # in MB umrechnen
    $benutzt=$quota{$_}[0]/1024;
    $gesamt=$quota{$_}[1]/1024;
    # Werte ohne , runden.
    $benutzt=sprintf("%.0f", $benutzt);
    $gesamt=sprintf("%.0f", $gesamt);
    # % ausrechnen und %-Zeichen dran packen
    $prozent=(100/$gesamt)*$benutzt . "%";
    # Prozent runden
    $prozent=sprintf("%.0f", $prozent);
   }
  }
  # Dir mit Acl ausgeben
  print "$mbox\n  Quota: Benutzt: $benutzt\tGesamt: $gesamt\tProzent: $prozent\%\n  Rechte: $acl\n";
 }
 # Kommt mix mehr dann beenden
 else { last }
}

# LockDatei wieder loeschen
unlink $lockfile_file;

Changes in /usr/local/sbin/cyr-show-mailboxes

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/cyr-show-mailboxes

Changed on 10.06.09
Issued by olli
Beginning line 2

This is a script for listing all your cyrus mailboxes.

#!/usr/bin/perl
use Cyrus::IMAP::Admin;

# Connect to Cyrus
$cyrus = Cyrus::IMAP::Admin->new("localhost");

# Authentifizieren
$cyrpass=`gtc-crypt -a admin -p`;
chomp($cyrpass);
$cyrus->authenticate('login','imap','','admin','0','10000',$cyrpass);
$cyrpass="";

# Header ausgeben
print "Mailboxes und Quotas (in MB)\n";
print "Mailbox                     Used        Free        Percent  Rights\n";
print "-------------------------------------------------------------------------------------------------------->\n";
# Mailbox- Infos holen
@mboxes=$cyrus->listmailbox('*');
# Ausgabe durchgehen
foreach (@mboxes) {
 $i++;
 if ($mboxes[$i][0]) {
  # Variable zum angenehmeren Lesen setzen
  $mbox=$mboxes[$i][0];
  # Quotas vom Server holen
  %quota = $cyrus->listquota("$mbox");
  # Ausgabe durchgehen
  foreach (keys(%quota)) {
   #print "$mbox - $quota{$_}[1]\n";
   # Gibt es fuer die Box ein Quota?
   if ($quota{$_}[1]) {
    # ACLs vom Server holen
    %acls = $cyrus->listacl("$mbox");
    # Alte ACL-Variable löschen
    $acl="";
    # ACL-Variable zusammenbauen
    foreach (keys(%acls)) { $acl="$acl $_ -> $acls{$_}   " }
    # in MB umrechnen
    $benutzt=$quota{$_}[0]/1024;
    $gesamt=$quota{$_}[1]/1024;
    # Werte ohne , runden.
    $benutzt=sprintf("%.0f", $benutzt);
    $gesamt=sprintf("%.0f", $gesamt);
    # % ausrechnen und %-Zeichen dran packen
    $prozent=(100/$gesamt)*$benutzt . "%";
    # Prozent runden
    $prozent=sprintf("%.0f", $prozent);
    # Kram formatiert ausgeben
    format STDOUT =
@<<<<<<<<<<<<<<<<<<<<<<<    @<<<<<<<<<  @<<<<<<<<<  @<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$mbox, $benutzt, $gesamt, $prozent, $acl
.
    write;
   }
  }
 }
 # Kommt mix mehr dann beenden
 elsif ($i>=1000) { last }
}

# Quota der mailbox holen
@quota = $cyrus->listquota('*');
foreach $key (keys %quota) {
}

# LockDatei wieder loeschen
unlink $lockfile_file;

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add cyrus 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Instand Messaging alternative Jabber

In times of blackboxed/centralized/clouded "Instand Messagig" services with possibly bad security/encryption like WhatsApp & co. I would like to use my own Instand Messaging Service with data hold encrypted on my own Server. Here is the way I do it.
As an snartphone app for this service I suggest the App called "Conversations"

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-im/ejabberd

Changes in /etc/jabber/ejabberd.yml

File permissions:
Owner: root
Group: jabber
Permissions: -rw-r-----

Click here for a download of the complete file: /etc/jabber/ejabberd.yml

Changed on 09.11.15
Issued by olli
Beginning line 18

The Hostname(s) of the Server


Before change
 - localhost
After change
  - "example.com"

Changed on 09.11.15
Issued by olli
Beginning line 28

SSL-Encryption Chat Clients


Before change
 - /etc/ssl/ejabberd/server.pem
After change
  - /etc/ssl/example.com/example.com.pem

Changed on 09.11.15
Issued by olli
Beginning line 37

Listen ipv4


Before change
  ip: "::"
After change
    ip: "0.0.0.0"

Changed on 09.11.15
Issued by olli
Beginning line 47

SSL-Encryption Chat Clients

    starttls: true

Changed on 09.11.15
Issued by olli
Beginning line 53

Listen ipv4


Before change
  ip: "::"
After change
    ip: "0.0.0.0"

Changed on 09.11.15
Issued by olli
Beginning line 62

Listen ipv4


Before change
  ip: "::"
After change
    ip: "0.0.0.0"

Changed on 09.11.15
Issued by olli
Beginning line 78

Listen ipv4


Before change
  ip: "::"
After change
    ip: "0.0.0.0"

Changed on 09.11.15
Issued by olli
Beginning line 96

Listen ipv4


Before change
  ip: "::"
After change
    ip: "0.0.0.0"

Changed on 09.11.15
Issued by olli
Beginning line 104

SSL-Encryption other Jabber Servers


Before change
s2s_use_starttls: optional
After change
s2s_use_starttls: required

Changed on 09.11.15
Issued by olli
Beginning line 110

The Admin-User


Before change
auth_method: internal
After change
auth_method: pam
pam_service: "system-auth"
pam_userinfotype: "username"

Changed on 09.11.15
Issued by olli
Beginning line 119

The Admin-User

  admin:
      user:
            - "admin": "example.com"

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add ejabberd default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Internet IPv6 Router

Hosts in LAN will be (firewalled) Internet availabe through IPv6 and can directly connect to other IPv6-Hosts in the Internet!

Global IPv6 Addresses are splitted in multiple Subnets per selected Interface.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-misc/dhcpcd
emerge net-misc/radvd

Changes in /etc/dhcpcd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcpcd.conf

Changed on 18.08.21
Issued by olli
Beginning line 1

dhcpcd will allocate a /64 prefix from ISP to specified Interfaces in the router from the delegated prefix - except the WAN interface.


# Debug Logging to rsyslog
debug
# DHCP UID as identifier
duid
# disable routing solicitation
noipv6rs
# Wait for an ipv6 ip
waitip 6
# Only configure IPv6
ipv6only
# Do not overwrite resolv.conf or wpa_supplicant
nohook resolv.conf, wpa_supplicant
# Subsequent options are only parsed for ppp0
interface ppp0
  # enable routing solicitation fpr ppp0
  ipv6rs
  # Set the Interface Association Identifier (Interface ID) of ppp0 to 1
  iaid 1
  # Request a DHCPv6 Delegated Prefix (IPv6 Prefix) from ppp0 (ID 1) for eth0 and wlan0
  # so eth0 and wlan0 receive their own from/in the Internet available/routed IPv6-Subnet
  ia_pd 1 eth0
  ia_pd 1 wlan0

Changes in /etc/radvd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/radvd.conf

Changed on 18.08.21
Issued by olli
Beginning line 1

radvd allocates IPv6 addresses to the clients connected to the specified interfaces. ::/64 prefix for ISP and fd??::/64 prefix for ULA (Unique local addresses).

interface eth0
{
        AdvSendAdvert on;
	AdvLinkMTU 1280;
	MinRtrAdvInterval 3;
        MaxRtrAdvInterval 300;
        prefix ::/64 {
                AdvOnLink on;
                AdvAutonomous on;
        };
	prefix fd23::/64 {
	        AdvOnLink on;
                AdvAutonomous on;
	};
};

interface wlan0
{
        AdvSendAdvert on;
        AdvLinkMTU 1280;
        MinRtrAdvInterval 3;
        MaxRtrAdvInterval 10;
        prefix ::/64 {
                AdvOnLink on;
                AdvAutonomous on;
        };
	prefix fd25::/64 {
                AdvOnLink on;
                AdvAutonomous on;
        };
};

Changes in /etc/sysctl.d/gabosh.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sysctl.d/gabosh.conf

Changed on 18.08.21
Issued by olli
Beginning line 21

Enable/Disable IPv6 on specific Interfaces

net.ipv6.conf.eth0.disable_ipv6=0
net.ipv6.conf.eth1.disable_ipv6=1
net.ipv6.conf.wlan0.disable_ipv6=0
net.ipv6.conf.vnet0.disable_ipv6=1
net.ipv6.conf.docker0.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=0
net.ipv6.conf.lo.disable_ipv6=0

Changed on 18.08.21
Issued by olli
Beginning line 32

Get IPv6 from ISP

net.ipv6.conf.ppp0.disable_ipv6=0
net.ipv6.conf.ppp0.autoconf=1
net.ipv6.conf.ppp0.accept_ra=2
net.ipv6.conf.all.forwarding=1

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add dhcpcd default
rc-update add radvd default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Internet Router (pppoe)

Changes in /etc/conf.d/net

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net

Changed on 13.10.15
Issued by olli
Beginning line 26

Optional Internet Connection via PPPOE (rp-pppoe) e.g. with connected Zyxel VDSL-Bridge VMG1312-B30A to eth1

#config_eth1="XXX.XXX.XXX.XXX/24"
#config_ppp0="ppp"
#link_ppp0="eth1"
#plugins_ppp0="pppoe"
#username_ppp0='provideruser'
#password_ppp0='providerpass'
#pppd_ppp0="
#defaultroute
#replacedefaultroute
#+ipv6
#ipv6cp-accept-local
#novjccomp
#noccp
#persist
#holdoff 10
#child-timeout 60
#lcp-echo-interval 15
#lcp-echo-failure 3
#maxfail 0
##noipx
#"
#rc_net_ppp0_need="net.eth1"

#modules_wlan0="wpa_supplicant"
#config_wlan0="XXX.XXX.XXX.XXX/24"
#rc_net_wlan0_provide="!net"

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Mailinglists with MailMan

Here a little description how you can create Mailinglists in an easy way.
You have to insert the specific lines into your Webserver configuration for easy Web-Administration. See the Webserver topic for this.
After installing MailMan you have to create an admin password with
/usr/lib/mailman/bin/mmsitepass

Put mailman into the nobody group
usermod -G cron,mailman,nobody mailman

and you have to set the correct permissions for postfix
/usr/lib/mailman/bin/check_perms -f

Create the MailMan cron jobs with
su - mailman -c 'crontab cron/crontab.in'

Create initial MailMan list:
/usr/lib/mailman/bin/newlist mailman
/usr/lib/mailman/bin/config_list -i /var/lib/mailman/data/sitelist.cfg mailman

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-mail/mailman

Changes in /etc/mailman/mm_cfg.py

File permissions:
Owner: mailman
Group: mailman
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/mailman/mm_cfg.py

Changed on 18.03.09
Issued by olli
Beginning line 54

Some Settings for MailMan environment

MTA = 'Postfix'
DEFAULT_EMAIL_HOST = 'example.com'
DEFAULT_URL_HOST   = 'mailman.example.com'
DEFAULT_URL_PATTERN = 'https://%s/mailman/'
add_virtualhost('mailman.example.com')
POSTFIX_STYLE_VIRTUAL_DOMAINS =  ['example.com']
DEFAULT_ARCHIVE_PRIVATE = 1
DEFAULT_CHARSET = 'UTF-8'
add_language('de', 'Deutsch', 'utf-8')

Changes in /etc/profile.d/mailman.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/profile.d/mailman.sh

Changed on 09.06.10
Issued by olli
Beginning line 1

Add the bin-path of the mailman-progs to the default path-variable

PATH="$PATH:/usr/lib/mailman/bin"

Changes in /usr/local/sbin/maillists-2.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/maillists-2.sh

Changed on 17.11.2014
Issued by olli
Beginning line 2

Script for syncing LDAP-Groups with Mailinglists


#!/bin/bash

rm -f /tmp/liste-*
getent group | grep "^maillist-" >/tmp/maillists
cat /tmp/maillists | while read line
do
 list=`echo $line | cut -d: -f1 | perl -pe 's/^maillist-//'`
 # Erstelle liste falls nicht vorhanden...
 if list_lists | grep -iq $list
 then
  echo "Liste $list existiert" >/dev/null
 else
  echo "Erstelle Liste $list"
  newlist -u mailman.example.com -l de -q $list mail@example.com `gtc-crypt -a mailman -p`
  config_list -i /etc/mailman/defaultlistconfig $list
 fi
 # Pflege User
 list_members $list >/tmp/maillistmembers
 for i in `cat /tmp/maillistmembers`
 do
  echo whitelist_from mail@example.com
 done
 cat /etc/spamassassin/maillist-whitelist | sort -u >/tmp/maillist-whitelist
 cat /tmp/maillist-whitelist >/etc/spamassassin/maillist-whitelist
 # User aufnehmen
 for user in `echo $line | cut -d: -f4 | perl -pe 's/\,/ /g' ; cat /root/maillist-nongabosh-$list 2>/dev/null`
 do
  if grep -qi "^$user" /tmp/maillistmembers
  then
   echo "User $user ist in der Liste $list" >/dev/null
  else
   echo "User $user wird in die Liste $list aufgenommen"
   echo $user | grep -q '@' || user="$mail@example.com"
   echo "$user" >/tmp/maillistnew
   add_members -r /tmp/maillistnew -a y $list
  fi
 done
 # User rauswerfen
 for user in `cat /tmp/maillistmembers | perl -pe 's/\@example.com$//'`
 do
  if echo $line | cut -d: -f4 | grep -qi "$user"
  then
   echo "User $user ist in der Liste $list" >/dev/null
  elif cat /root/maillist-nongabosh-$list 2>/dev/null | grep -qi "$user"
  then
   echo "User $user ist in der Liste $list" >/dev/null
  else
   echo $user | grep -q '@' || user="$mail@example.com"
   echo "User $user wird aus der Liste $list gel&ouml;scht"
   remove_members -n $list $user
  fi
 done
 # Alle Nicht example.com-Mailadressen erlauben an Mailingliste zu senden (nicht lesen)
 
 echo -n "accept_these_nonmembers = [ 'mail@example.com', " >/tmp/maillistsendok
 for mail in `cat /etc/spamassassin/* 2>/dev/null | egrep "^whitelist_from mail@example.com
 do 
  echo -n " '$mail'," >>/tmp/maillistsendok
 done
 echo -n ' ]' >>/tmp/maillistsendok
 config_list -i /tmp/maillistsendok $list
done

# Aufr&auml;umen
#rm -f /tmp/maillists /tmp/maillistmembers /tmp/maillistnew


Changes in /usr/local/sbin/maillists.sh

File permissions:
Owner: mailman
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/maillists.sh

Changed on 17.11.2014
Issued by olli
Beginning line 2

Script for syncing LDAP-Groups with Mailinglists


#!/bin/bash

if ! whoami | grep -q mailman
then
 echo "Dieses Skript muss als mailman-User ausgef&uuml;hrt werden"
 exit 1
fi

rm -f /tmp/liste-*
getent group | grep "^maillist-" | perl -pe 's/$/,root,admin/' >/tmp/maillists
cat /tmp/maillists | while read line
do
 list=`echo $line | cut -d: -f1 | perl -pe 's/^maillist-//'`
 # Erstelle liste falls nicht vorhanden...
 if mailman lists -q  | grep -iq $list
 then
  echo "Liste $list existiert" >/dev/null
 else
  echo "Erstelle Liste $list"
  mailman create --language de -o mail@example.com ${list}@example.com 
  #config_list -i /etc/mailman/defaultlistconfig $list
 fi
 # Pflege User
 mailman members -e ${list}@example.com | grep '@' >/tmp/maillistmembers
 for i in `cat /tmp/maillistmembers`
 do
  echo whitelist_from mail@example.com
 done
 cat /etc/spamassassin/maillist-whitelist | sort -u >/tmp/maillist-whitelist
 cat /tmp/maillist-whitelist >/etc/spamassassin/maillist-whitelist
 # User aufnehmen
 for user in `echo $line | cut -d: -f4 | perl -pe 's/\,/ /g' ; cat ~/maillist-nongabosh-$list 2>/dev/null`
 do
  if grep -qi "^$user" /tmp/maillistmembers
  then
   echo "User $user ist in der Liste $list" >/dev/null
  else
   echo "User $user wird in die Liste $list aufgenommen"
   echo $user | grep -q '@' || user="$mail@example.com"
   echo "$user" >/tmp/maillistnew
   mailman addmembers -W /tmp/maillistnew ${list}@example.com
  fi
 done
 # User rauswerfen
 for user in `cat /tmp/maillistmembers | perl -pe 's/\@example.com$//'`
 do
  if echo $line | cut -d: -f4 | egrep -qi "$user"
  then
   echo "User $user ist in der Liste $list" >/dev/null
  elif cat ~/maillist-nongabosh-$list 2>/dev/null | egrep -qi "$user"
  then
   echo "User $user ist in der Liste $list" >/dev/null
  else
   echo $user | grep -q '@' || user="$mail@example.com"
   echo "User $user wird aus der Liste $list gel&ouml;scht"
   mailman delmembers -G -m $user -l ${list}@example.com
  fi
 done
 # Alle Nicht example.com-Mailadressen erlauben an Mailingliste zu senden (nicht lesen)
 
# echo -n "accept_these_nonmembers = [ 'mail@example.com', " >/tmp/maillistsendok
# for mail in `cat /etc/spamassassin/* 2>/dev/null | egrep "^whitelist_from mail@example.com
# do 
#  echo -n " '$mail'," >>/tmp/maillistsendok
# done
# echo -n ' ]' >>/tmp/maillistsendok
# config_list -i /tmp/maillistsendok $list
done

# Aufr&auml;umen
#rm -f /tmp/maillists /tmp/maillistmembers /tmp/maillistnew


Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add mailman 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Mailserver

In this topic is a full featured mailserver described. I comes with SMTP/TLS (postfix), PAM-authentification (saslauthd), Mail-Scanner (AMAVISD-NEW), Spam-Scanner (spamassassin) and Virus-Scanner (ClamAV).
Think about to run "newaliases" if you change the /etc/mail/aliases file.
Insert the valid recipient an sender addresses in /etc/postfix/virtual_recipient and /etc/postfix/virtual_sender (Syntax: "emailaddress@yourdomain.tld cyrusmailboxname" - one per line). Then create postfix mappings with
postmap /etc/postfix/virtual_sender
postmap /etc/postfix/virtual_recipient

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge mail-mta/postfix
emerge dev-libs/cyrus-sasl
emerge mail-filter/amavisd-new
emerge mail-filter/spamassassin
emerge app-antivirus/clamav

Changes in /etc/amavisd.conf

File permissions:
Owner: root
Group: amavis
Permissions: -rw-r-----

Click here for a download of the complete file: /etc/amavisd.conf

Changed on 11.09.08
Issued by olli
Beginning line 20

Amavis Domain


Before change
$mydomain = 'example.com';   # a convenient default for other settings
After change
$mydomain = 'example.com';
@local_domains_maps = ( [".$mydomain", "olmusic.de", "ol-music.de", "drachenrachen.de", "sangesfolk.de", "rockfolk.de"] );

Changed on 11.09.08
Issued by olli
Beginning line 113

Some spamassassin settings

$sa_tag_level_deflt  = -9999;
$sa_kill_level_deflt = undef;
$sa_dsn_cutoff_level = undef;

Changed on 11.09.08
Issued by olli
Beginning line 174

Deliver banned and spam mails.

$final_banned_destiny   = D_PASS;
$final_spam_destiny     = D_PASS;

Changed on 11.09.08
Issued by olli
Beginning line 194

Warns the reciver of getting a mail with banned or virus content.

$warnvirusrecip = 1;
$warnbannedrecip = 1;
$undecipherable_subject_tag = '';
$sa_spam_subject_tag = '';

Changed on 11.09.08
Issued by olli
Beginning line 212

Address where virus mails are delivered to.

$virus_quarantine_to  = "virus\@$mydomain";
$banned_quarantine_to     = undef;
$bad_header_quarantine_to = "virus\@$mydomain";
$spam_quarantine_to       = undef;

Changed on 11.09.08
Issued by olli
Beginning line 425

ClamAV Socket settings.

['ClamAV-clamd',
    \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
    qr/\bOK$/m, qr/\bFOUND$/m,
    qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],

Changes in /etc/amavisd.conf.bak

File permissions:
Owner: root
Group: root
Permissions: -rw-r-----

Click here for a download of the complete file: /etc/amavisd.conf.bak

Changed on 11.09.08
Issued by olli
Beginning line 504

Deliver banned and spam mails.


Before change
#$final_banned_destiny     = D_BOUNCE;  # (defaults to D_BOUNCE)
#$final_spam_destiny       = D_BOUNCE;  # (defaults to D_BOUNCE)
After change
$final_banned_destiny	= D_PASS;
$final_spam_destiny	= D_PASS;

Changed on 11.09.08
Issued by olli
Beginning line 610

Warns the reciver of getting a mail with banned or virus content.


Before change
#$warnvirusrecip = 1;	# (defaults to false (undef))
#$warnbannedrecip = 1;	# (defaults to false (undef))
After change
$warnvirusrecip = 1;
$warnbannedrecip = 1;

Changed on 11.09.08
Issued by olli
Beginning line 817

Address where virus mails are delivered to.


Before change
$virus_quarantine_to  = 'virus-quarantine';    # traditional local quarantine
After change
$virus_quarantine_to  = "virus\@$mydomain";

Changed on 11.09.08
Issued by olli
Beginning line 836

Only quaranteine virus mails.


Before change
$banned_quarantine_to     = 'banned-quarantine';     # local quarantine
$bad_header_quarantine_to = 'bad-header-quarantine'; # local quarantine
$spam_quarantine_to       = 'spam-quarantine';       # local quarantine
After change
$banned_quarantine_to     = undef;
$bad_header_quarantine_to = "virus\@$mydomain";
$spam_quarantine_to       = undef;

Changed on 11.09.08
Issued by olli
Beginning line 1776

Some spamassassin settings


Before change
$sa_local_tests_only = 0;   # only tests which do not require internet access?
#$sa_auto_whitelist = 1;    # turn on AWL in SA 2.63 or older (irrelevant
                            # for SA 3.0, its cf option is use_auto_whitelist)

$sa_mail_body_size_limit = 400*1024; # don't waste time on SA if mail is larger
			    # (less than 1% of spam is > 64k)
			    # default: undef, no limitations

# default values, customarily used in the @spam_*_level_maps as the last entry
$sa_tag_level_deflt  = 2.0; # add spam info headers if at, or above that level;
			    # undef is interpreted as lower than any spam level
$sa_tag2_level_deflt = 6.31;# add 'spam detected' headers at that level to
                            # passed mail, adding address extensions;
$sa_kill_level_deflt = $sa_tag2_level_deflt; # triggers spam evasive actions
			    # at or above that level: bounce/reject/drop,
			    # quarantine
$sa_dsn_cutoff_level = 9;   # spam level beyond which a DSN is not sent,
                            # effectively turning D_BOUNCE into D_DISCARD;
                            # undef disables this feature and is a default;
# see also $sa_quarantine_cutoff_level above, which only controls quarantining
After change
$sa_local_tests_only = 0;
#$sa_auto_whitelist = 1;
$sa_mail_body_size_limit = 257*1024;
$sa_tag_level_deflt  = -99;
$sa_tag2_level_deflt = 6.31;
$sa_kill_level_deflt = undef;
$sa_dsn_cutoff_level = undef;

Changed on 11.09.08
Issued by olli
Beginning line 1973

ClamAV Socket settings.


Before change
# ['ClamAV-clamd',
#   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
#   qr/\bOK$/m, qr/\bFOUND$/m,
#   qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
After change
['ClamAV-clamd',
    \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
    qr/\bOK$/m, qr/\bFOUND$/m,
    qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],

Changes in /etc/clamd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/clamd.conf

Changed on 10.09.08
Issued by olli
Beginning line 44

Log ClamAV to syslog

LogSyslog yes

Changes in /etc/cron.daily/spamassassinupdate

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/cron.daily/spamassassinupdate

Changed on 15.09.14
Issued by olli
Beginning line 2

Daily Spamassassin Update

date >>/var/log/sa-update.log 2>&1
sa-update -v >>/var/log/sa-update.log 2>&1
/etc/init.d/spamd restart >>/var/log/sa-update.log 2>&1
/etc/init.d/amavisd restart >>/var/log/sa-update.log 2>&1

Changes in /etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/crontab

Changed on 04.06.13
Issued by olli
Beginning line 42

Update Mail addresses for each User.

30 * * * *      root    /usr/local/sbin/mailaddresses.sh 2>&1 | ifne mail -s "Mail Adresses Update" root

Changes in /etc/freshclam.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/freshclam.conf

Changed on 10.09.08
Issued by olli
Beginning line 39

Log ClamAV to syslog

LogSyslog yes

Changes in /etc/mail/aliases

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/mail/aliases

Changed on 11.09.08
Issued by olli
Beginning line 35

This sends mails to root or virusadmin so the admin Users (This user has to esxist with a mailbox). Change it to your personal needs.

root:		admin
mailman:        admin
virusalert:	admin

Changes in /etc/postfix/master.cf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/postfix/master.cf

Changed on 10.09.08
Issued by olli
Beginning line 17

Allow Port 587 (submission)


Before change
#submission inet n       -       n       -       -       smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_tls_auth_only=yes
 -o smtpd_reject_unlisted_recipient=no
 -o smtpd_client_restrictions=$mua_client_restrictions
 -o smtpd_helo_restrictions=$mua_helo_restrictions
 -o smtpd_sender_restrictions=$mua_sender_restrictions
 -o smtpd_recipient_restrictions=
 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
 -o milter_macro_daemon_name=ORIGINATING
After change
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission

Changed on 10.09.08
Issued by olli
Beginning line 45

Allow Port 465 (smtps)

smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Changed on 10.09.08
Issued by olli
Beginning line 149

Deliver local incoming mails to Cyrus

cyrus     unix  -       n       n       -       -       pipe
  user=cyrus argv=/usr/sbin/deliver -e -r ${sender} -m ${extension} ${user}

Changed on 10.09.08
Issued by olli
Beginning line 154

Receive mails scanned by amavis

# amavisd-new

postfix-policyd-spf unix - n n - 0 spawn user=nobody argv=/usr/bin/policyd-spf

smtp-amavis unix -      -       n     -       2  smtp
    -o smtp_data_done_timeout=1200
    -o lmtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

127.0.0.1:10025 inet n  -       n     -       -  smtpd
    -o content_filter=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o smtpd_restriction_classes=
    -o mynetworks=XXX.XXX.XXX.XXX/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters,no_address_mappings
    -o local_header_rewrite_clients=
    -o smtpd_milters=
    -o local_recipient_maps=
    -o relay_recipient_maps=


Changes in /etc/sasl2/smtpd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sasl2/smtpd.conf

Changed on 25.03.09
Issued by olli
Beginning line 2

Add LOGIN mech - Needed by some clients


Before change
mech_list: PLAIN
After change
mech_list: PLAIN LOGIN

Changes in /usr/local/sbin/mailaddresses.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/mailaddresses.sh

Changed on 04.06.13
Issued by olli
Beginning line 2

Update Mail addresses for each User.

#!/bin/bash

. /etc/profile

>/tmp/mailaddresses-$$
for i in `getent group users | cut -d: -f4 | perl -pe 's/\,/ /g'` weg
do
 # Get Infos
 USER=`getent passwd $i | cut -d":" -f 1`
 LNAME="`getent passwd $i | cut -d':' -f 5`"
 echo "$USER@example.com $USER" >>/tmp/mailaddresses-$$
 LNAME=`echo "$LNAME" | tr '[A-Z]' '[a-z]' | perl -pe 's/&ouml;/oe/g; s/&auml;/ae/g; s/&uuml;/ue/g; s/&szlig;/ss/g; s/[^a-zA-Z0-9\.]/\./g; s/\.+/\./g; s/^\.//; s/\.$//;'`
 echo "$LNAME@example.com $USER" >>/tmp/mailaddresses-$$
 if id $USER | grep -q '2023(dms)'
 then
  echo "${USER}mail@example.com ${USER}dms" >>/tmp/mailaddresses-$$
 fi
done
find /tmp/mailaddresses-$$ -empty -delete
if [ -f /tmp/mailaddresses-$$ ]
then
 if [ `cat /tmp/mailaddresses-$$ | wc -l` -gt 5 ]
 then
  cat /tmp/mailaddresses-$$ /etc/postfix/mailaddresses | sort -u > /etc/postfix/mailaddresses.tmp
  cat /etc/postfix/mailaddresses.tmp >/etc/postfix/mailaddresses
  postmap /etc/postfix/mailaddresses
  rm /tmp/mailaddresses-$$ /etc/postfix/mailaddresses.tmp
 else
  echo "$0: /tmp/mailaddresses-$$ hat wegiger als 5 Zeilen: `cat /tmp/mailaddresses-$$` -> Breche Bearbeitung ab. " | mail -s "/tmp/mailaddresses-$$ hat weniger als 5 Zeilen" root
 fi
else
 echo "$0: Fehler beim Mailadressenupdate!!!"
fi

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add postfix 
rc-update add saslauthd default
rc-update add amavisd 
rc-update add spamd 
rc-update add clamd default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

MySQL-Server

This describes the installation of a MySQL-Server.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge dev-db/mysql

Changes in /etc/logrotate.d/mysql

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/logrotate.d/mysql

Changed on 09.09.08
Issued by olli
Beginning line 4

Optimazions


Before change
/var/log/mysql/mysql.err /var/log/mysql/mysql.log /var/log/mysql/mysqld.err {
After change
/var/log/mysql/mysql.err /var/log/mysql/mysql.log /var/log/mysql/mysqld.err /var/log/mysql/slow.log {

Changes in /etc/mysql/mysql.d/50-distro-server.cnf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/mysql/mysql.d/50-distro-server.cnf

Changed on 09.09.08
Issued by olli
Beginning line 21

MySQL should listen only on the socket


Before change
# skip-networking
bind-address                            = 127.0.0.1
After change
skip-networking
#bind-address                            = 127.0.0.1

Changed on 09.09.08
Issued by olli
Beginning line 29

This deactivetes bin-logging, because we don't want to use a MySQL cluster. Backups are made with the Backup-Script. (see Backup topic)


Before change
log-bin
server-id                                     = 1
After change
# log-bin
# server-id                                     = 1
skip-log-bin
disable_log_bin

Changed on 09.09.08
Issued by olli
Beginning line 45

Optimazions

secure-file-priv=NULL
default_authentication_plugin=mysql_native_password
innodb_file_per_table=1
innodb_buffer_pool_size = 1024MiB
innodb_log_file_size = 512MiB


[server]
skip_name_resolve = 1
innodb_buffer_pool_size = 128M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
tmp_table_size= 64M
max_heap_table_size= 64M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1


Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add mysql 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Network Sound Server

For sending Music or other Sounds over a Network I uns PulseAudio on my Server. So I can play e.g. Music from a mobile device and the Sound is transported over WLAN playing on my Sound-System connected to the Server.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge media-sound/pulseaudio

Changes in /etc/conf.d/pulseaudio

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/pulseaudio

Changed on 06.11.15
Issued by olli
Beginning line 9

Enable System Wide Startup for PulseAudio

PULSEAUDIO_SHOULD_NOT_GO_SYSTEMWIDE=1

Changes in /etc/portage/profile/use.mask

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/portage/profile/use.mask

Changed on 06.11.15
Issued by olli
Beginning line 1

Enable System wide PulseAudio for init-Scripts

-system-wide

Changes in /etc/pulse/system.pa

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pulse/system.pa

Changed on 06.11.15
Issued by olli
Beginning line 59

Listen on Server

load-module module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=127.0.0.1;172.25.0.0/16;my.lan.network.ip/16
#load-module module-alsa-sink

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add pulseaudio default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

NextCloud

Changes in /etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/crontab

Changed on 27.09.19
Issued by olli
Beginning line 47

CronJob for Nextcloud

*/5 * * * *     root   su - nextcloud -c "php -f /var/www/nextcloud.example.com/htdocs/cron.php"
15 0 * * *      root   su - nextcloud -c "/var/www/nextcloud.example.com/maintenance.sh"
*/5 * * * *     root   su - nextcloud-test -c "php -f /var/www/nextcloud-test.example.com/htdocs/cron.php"
15 0 * * *      root   su - nextcloud-test -c "/var/www/nextcloud-test.example.com/maintenance.sh"
15 1 * * *      root   scripts/nextcloud-test-update.sh 2>&1 | ifne mail -s "nextcloud-test Update" user1

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

OpenLDAP

Here a little howto to set up your own basic LDAP-Server
After emergeing openldap you should generate your encrypted LDAP-rootpw and set this later in LDAP-Server config file.
slappasswd
New password: my-password
Re-enter new password: my-password
{SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
You can create users, groups, computers,... with the WebGUI PHPLDAPAdmin. Have a look at the OpenLDAP WebGUI Howto.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-nds/openldap

Changes in /etc/openldap/ldap.ldif

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/openldap/ldap.ldif

Changed on 02.03.09
Issued by olli
Beginning line 1

LDAP DNs for basic structure. Insert this file with

ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /etc/openldap/ldap.ldif
when the slapd is started.

# Base DN
dn: dc=example,dc=com
dc: gabosh
objectClass: top
objectClass: domain

# Group DN (/etc/group)
dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

# User DN (/etc/passwd; /etc/shadow)
dn: ou=People,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

# User DN - Normal Users
dn: ou=People,ou=Users,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

# User DN - System Users
dn: ou=People,ou=SystemUsers,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

Changes in /etc/openldap/schema/dlz.schema

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/openldap/schema/dlz.schema

Changed on 01.12.15
Issued by olli
Beginning line 1

This is the LDAP-Schema for BIND DLZ-LDAP.

#
# 1.3.6.1.4.1.18420.1.1.X is reserved for attribute types declared by the DLZ project.
# 1.3.6.1.4.1.18420.1.2.X is reserved for object classes declared by the DLZ project.
# 1.3.6.1.4.1.18420.1.3.X is reserved for PRIVATE extensions to the DLZ attribute
#                     types and object classes that may be needed by end users
#                     to add security, etc.  Attributes and object classes using
#                     this OID MUST NOT be published outside of an organization
#                     except to offer them for consideration to become part of the
#                     standard attributes and object classes published by the DLZ project.

attributetype ( 1.3.6.1.4.1.18420.XXX.XXX.XXX
        NAME 'dlzZoneName'
        DESC 'DNS zone name - domain name not including host name'
        SUP name 
        SINGLE-VALUE )
        
attributetype ( 1.3.6.1.4.1.18420.1.1.20
	NAME 'dlzHostName'
        DESC 'Host portion of a domain name'
	SUP name
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.30
        NAME 'dlzData'
        DESC 'Data for the resource record'
        SUP name
        SINGLE-VALUE )       
        
attributetype ( 1.3.6.1.4.1.18420.1.1.40
	NAME 'dlzType'
        DESC 'DNS record type - A, SOA, NS, MX, etc...'
        SUP name
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.50
	NAME 'dlzSerial'
        DESC 'SOA record serial number'
        EQUALITY integerMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.60
	NAME 'dlzRefresh'
        DESC 'SOA record refresh time in seconds'
        EQUALITY integerMatch        
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.70
	NAME 'dlzRetry'
        DESC 'SOA retry time in seconds'
        EQUALITY integerMatch        
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.80
	NAME 'dlzExpire'
        DESC 'SOA expire time in seconds'
        EQUALITY integerMatch        
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.90
	NAME 'dlzMinimum'
        DESC 'SOA minimum time in seconds'
        EQUALITY integerMatch        
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.XXX.XXX.XXX0
        NAME 'dlzAdminEmail'
        DESC 'E-mail address of person responsible for this zone - @ should be replaced with . (period)'
	SUP name
        SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.18420.1.1.110
	NAME 'dlzPrimaryNS'
        DESC 'Primary name server for this zone - should be host name not IP address'
	SUP name
        SINGLE-VALUE )
        
attributetype ( 1.3.6.1.4.1.18420.1.1.120
	NAME 'dlzIPAddr'
        DESC 'IP address - IPV4 should be in dot notation xxx.xxx.xxx.xxx IPV6 should be in colon notation xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx'
	EQUALITY caseExactIA5Match 
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{40}
	SINGLE-VALUE )
        
attributetype ( 1.3.6.1.4.1.18420.1.1.130
	NAME 'dlzCName'
        DESC 'DNS cname'
	SUP name
        SINGLE-VALUE )
        
attributetype ( 1.3.6.1.4.1.18420.1.1.140
	NAME 'dlzPreference'
        DESC 'DNS MX record preference.  Lower numbers have higher preference'
        EQUALITY integerMatch        
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )
        
attributetype ( 1.3.6.1.4.1.18420.1.1.150
	NAME 'dlzTTL'
        DESC 'DNS time to live - how long this record can be cached by caching DNS servers'
        EQUALITY integerMatch        
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
        SINGLE-VALUE )
        
attributetype ( 1.3.6.1.4.1.18420.1.1.160
	NAME 'dlzRecordID'
	DESC 'Unique ID for each DLZ resource record'
	SUP name
	SINGLE-VALUE )

#------------------------------------------------------------------------------
# Object class definitions
#------------------------------------------------------------------------------

objectclass ( 1.3.6.1.4.1.18420.1.2.10
	NAME 'dlzZone'         
        DESC 'Zone name portion of a domain name'
        SUP top STRUCTURAL
	MUST ( objectclass $ dlzZoneName ) )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.20
	NAME 'dlzHost' 
        DESC 'Host name portion of a domain name'
        SUP top STRUCTURAL
	MUST ( objectclass $ dlzHostName ) )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.30
	NAME 'dlzAbstractRecord' 
        DESC 'Data common to all DNS record types'
        SUP top ABSTRACT
	MUST ( objectclass $ dlzRecordID $ dlzHostName $ dlzType $ dlzTTL ) )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.40
	NAME 'dlzGenericRecord' 
        DESC 'Generic DNS record - useful when a specific object class has not been defined for a DNS record'
        SUP dlzAbstractRecord STRUCTURAL
	MUST ( dlzData ) )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.50
        NAME 'dlzARecord'
        DESC 'DNS A record'
        SUP dlzAbstractrecord STRUCTURAL
        MUST ( dlzIPAddr ) )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.60
        NAME 'dlzNSRecord'
        DESC 'DNS NS record'
        SUP dlzGenericRecord STRUCTURAL )

objectclass ( 1.3.6.1.4.1.18420.1.2.70
        NAME 'dlzMXRecord'
        DESC 'DNS MX record'
        SUP dlzGenericRecord STRUCTURAL
        MUST ( dlzPreference ) )
                
objectclass ( 1.3.6.1.4.1.18420.1.2.80
        NAME 'dlzSOARecord'
        DESC 'DNS SOA record'
        SUP dlzAbstractRecord STRUCTURAL       
        MUST ( dlzSerial $ dlzRefresh $ dlzRetry
               $ dlzExpire $ dlzMinimum $ dlzAdminEmail $ dlzPrimaryNS ) )
               
objectclass ( 1.3.6.1.4.1.18420.1.2.90
	NAME 'dlzTextRecord' 
        DESC 'Text data with spaces should be wrapped in double quotes'
        SUP dlzGenericRecord STRUCTURAL )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.100
        NAME 'dlzPTRRecord'
        DESC 'DNS PTR record'
        SUP dlzGenericRecord STRUCTURAL )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.110
        NAME 'dlzCNameRecord'
        DESC 'DNS CName record'
        SUP dlzGenericRecord STRUCTURAL )
        
objectclass ( 1.3.6.1.4.1.18420.1.2.120
        NAME 'dlzXFR'
        DESC 'Host allowed to perform zone transfer'
        SUP top STRUCTURAL
        MUST ( objectclass $ dlzRecordID $ dlzIPAddr ) )


Changes in /etc/openldap/schema/dnszone.schema

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/openldap/schema/dnszone.schema

Changed on 02.04.10
Issued by olli
Beginning line 1

This is the LDAP-Schema for BIND SDB-LDAP.

# A schema for storing DNS zones in LDAP
#
attributetype ( 1.3.6.1.4.1.2428.20.0.0  NAME 'dNSTTL'
	DESC 'An integer denoting time to live'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.2428.20.0.1 NAME 'dNSClass'
	DESC 'The class of a resource record'
	EQUALITY caseIgnoreIA5Match
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.0.2 NAME 'zoneName'
	DESC 'The name of a zone, i.e. the name of the highest node in the zone'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.0.3 NAME 'relativeDomainName'
	DESC 'The starting labels of a domain name'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.12 NAME 'pTRRecord'
	DESC 'domain name pointer, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.13 NAME 'hInfoRecord'
	DESC 'host information, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.14 NAME 'mInfoRecord'
	DESC 'mailbox or mail list information, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.16 NAME 'tXTRecord'
	DESC 'text string, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.18 NAME 'aFSDBRecord'
	DESC 'for AFS Data Base location, RFC 1183'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.24 NAME 'SigRecord'
	DESC 'Signature, RFC 2535'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.25 NAME 'KeyRecord'
	DESC 'Key, RFC 2535'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.28 NAME 'aAAARecord'
	DESC 'IPv6 address, RFC 1886'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.29 NAME 'LocRecord'
	DESC 'Location, RFC 1876'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.30 NAME 'nXTRecord'
	DESC 'non-existant, RFC 2535'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.33 NAME 'sRVRecord'
	DESC 'service location, RFC 2782'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.35 NAME 'nAPTRRecord'
	DESC 'Naming Authority Pointer, RFC 2915'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.36 NAME 'kXRecord'
	DESC 'Key Exchange Delegation, RFC 2230'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.37 NAME 'certRecord'
	DESC 'certificate, RFC 2538'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.38 NAME 'a6Record'
	DESC 'A6 Record Type, RFC 2874'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.39 NAME 'dNameRecord'
	DESC 'Non-Terminal DNS Name Redirection, RFC 2672'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.43 NAME 'dSRecord'
	DESC 'Delegation Signer, RFC 3658'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.44 NAME 'sSHFPRecord'
	DESC 'SSH Key Fingerprint, draft-ietf-secsh-dns-05.txt'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.46 NAME 'rRSIGRecord'
	DESC 'RRSIG, RFC 3755'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.47 NAME 'nSECRecord'
	DESC 'NSEC, RFC 3755'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

objectclass ( 1.3.6.1.4.1.2428.20.3 NAME 'dNSZone'
        SUP top STRUCTURAL
	MUST ( zoneName $ relativeDomainName )
        MAY ( DNSTTL $ DNSClass $
              ARecord $ MDRecord $ MXRecord $ NSRecord $
	      SOARecord $ CNAMERecord $ PTRRecord $ HINFORecord $
              MINFORecord $ TXTRecord $ AFSDBRecord $ SIGRecord $
              KEYRecord $ AAAARecord $ LOCRecord $ NXTRecord $
              SRVRecord $ NAPTRRecord $ KXRecord $ CERTRecord $
              A6Record $ DNAMERecord $ DSRecord $ SSHFPRecord $
              RRSIGRecord $ NSECRecord ) )

Changes in /gtc/test/etc/thinclient/server-profile/etc/openldap/schema/dnszone.schema

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/openldap/schema/dnszone.schema

Changed on 02.04.10
Issued by olli
Beginning line 1

This is the LDAP-Schema for BIND SDB-LDAP.

# A schema for storing DNS zones in LDAP
#
attributetype ( 1.3.6.1.4.1.2428.20.0.0  NAME 'dNSTTL'
	DESC 'An integer denoting time to live'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.2428.20.0.1 NAME 'dNSClass'
	DESC 'The class of a resource record'
	EQUALITY caseIgnoreIA5Match
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.0.2 NAME 'zoneName'
	DESC 'The name of a zone, i.e. the name of the highest node in the zone'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.0.3 NAME 'relativeDomainName'
	DESC 'The starting labels of a domain name'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.12 NAME 'pTRRecord'
	DESC 'domain name pointer, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.13 NAME 'hInfoRecord'
	DESC 'host information, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.14 NAME 'mInfoRecord'
	DESC 'mailbox or mail list information, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.16 NAME 'tXTRecord'
	DESC 'text string, RFC 1035'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.18 NAME 'aFSDBRecord'
	DESC 'for AFS Data Base location, RFC 1183'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.24 NAME 'SigRecord'
	DESC 'Signature, RFC 2535'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.25 NAME 'KeyRecord'
	DESC 'Key, RFC 2535'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.28 NAME 'aAAARecord'
	DESC 'IPv6 address, RFC 1886'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.29 NAME 'LocRecord'
	DESC 'Location, RFC 1876'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.30 NAME 'nXTRecord'
	DESC 'non-existant, RFC 2535'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.33 NAME 'sRVRecord'
	DESC 'service location, RFC 2782'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.35 NAME 'nAPTRRecord'
	DESC 'Naming Authority Pointer, RFC 2915'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.36 NAME 'kXRecord'
	DESC 'Key Exchange Delegation, RFC 2230'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.37 NAME 'certRecord'
	DESC 'certificate, RFC 2538'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.38 NAME 'a6Record'
	DESC 'A6 Record Type, RFC 2874'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.39 NAME 'dNameRecord'
	DESC 'Non-Terminal DNS Name Redirection, RFC 2672'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.43 NAME 'dSRecord'
	DESC 'Delegation Signer, RFC 3658'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.44 NAME 'sSHFPRecord'
	DESC 'SSH Key Fingerprint, draft-ietf-secsh-dns-05.txt'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.46 NAME 'rRSIGRecord'
	DESC 'RRSIG, RFC 3755'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.2428.20.1.47 NAME 'nSECRecord'
	DESC 'NSEC, RFC 3755'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

objectclass ( 1.3.6.1.4.1.2428.20.3 NAME 'dNSZone'
        SUP top STRUCTURAL
	MUST ( zoneName $ relativeDomainName )
        MAY ( DNSTTL $ DNSClass $
              ARecord $ MDRecord $ MXRecord $ NSRecord $
	      SOARecord $ CNAMERecord $ PTRRecord $ HINFORecord $
              MINFORecord $ TXTRecord $ AFSDBRecord $ SIGRecord $
              KEYRecord $ AAAARecord $ LOCRecord $ NXTRecord $
              SRVRecord $ NAPTRRecord $ KXRecord $ CERTRecord $
              A6Record $ DNAMERecord $ DSRecord $ SSHFPRecord $
              RRSIGRecord $ NSECRecord ) )

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add slapd default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

OpenLDAP System authentication

This is an example how you can authenticate your System-Accounts over PAM or SASLAuthD against LDAP. Users can change their passwords in LDAP with the passwd command as usual.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge sys-auth/pam_ldap
emerge sys-auth/nss_ldap

Changes in /etc/conf.d/saslauthd

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/saslauthd

Changed on 18.05.09
Issued by olli
Beginning line 22

If you are using SASL for some authentications you should point to a configuration file with your LDAP settings.


Before change
SASLAUTHD_OPTS="-a pam"
After change
SASLAUTHD_OPTS="-O /etc/saslauthd.conf -a ldap"

Changes in /etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/crontab

Changed on 02.12.09
Issued by olli
Beginning line 37

Run the checkusers-script hourly

42 * * * *      root    /usr/local/sbin/checkusers.sh 2>&1 | ifne mail -s "Checkusers-Script" root

Changes in /etc/ldap.conf.old

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/ldap.conf.old

Changed on 18.05.09
Issued by olli
Beginning line 18

The LDAP BaesDN


Before change
base dc=padl,dc=com
After change
base dc=example,dc=com

Changed on 18.05.09
Issued by olli
Beginning line 137

This is for accepting a self-signed SSL/TLS certificate

pam_login_attribute uid:caseExactMatch:
tls_reqcert allow

Changes in /etc/nsswitch.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/nsswitch.conf

Changed on 18.05.09
Issued by olli
Beginning line 56

The order how to check for passwd, shadow and group


Before change
group:      files
gshadow:    files
After change
group:      files ldap
#gshadow:    files

Changed on 18.05.09
Issued by olli
Beginning line 68

The order how to check for passwd, shadow and group


Before change
#passwd:     files
After change
passwd:     files ldap

Changed on 18.05.09
Issued by olli
Beginning line 76

The order how to check for passwd, shadow and group


Before change
shadow:     files
After change
shadow:     files ldap

Changes in /etc/pam.d/system-auth

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pam.d/system-auth

Changed on 18.05.09
Issued by olli
Beginning line 2

Authenticate with LDAP


Before change
auth            required        pam_unix.so try_first_pass likeauth nullok
After change
auth            sufficient   	pam_unix.so try_first_pass likeauth nullok
auth       	sufficient   	pam_ldap.so use_first_pass
#auth            optional        pam_smbpass.so migrate use_first_pass
auth       	required     	pam_deny.so

Changed on 18.05.09
Issued by olli
Beginning line 16

Authenticate with LDAP

account    	sufficient   	pam_ldap.so

Changes in /etc/pam.d/system-auth

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pam.d/system-auth

Changed on 18.05.09
Issued by olli
Beginning line 29

Authenticate with LDAP


Before change
password        required      pam_unix.so try_first_pass use_authtok nullok sha512 shadow
After change
password        sufficient      pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password   	sufficient 	pam_ldap.so use_authtok use_first_pass
password   	required     	pam_deny.so

Changed on 18.05.09
Issued by olli
Beginning line 42

Authenticate with LDAP

session		optional     	pam_ldap.so

Changes in /etc/saslauthd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/saslauthd.conf

Changed on 18.05.09
Issued by olli
Beginning line 1

If you are using SASL for some authentications you should configure the LDAP access for SASL here.

ldap_servers: ldaps://127.0.0.1:636
ldap_search_base: ou=Users,ou=People,dc=example,dc=com
ldap_scope: one
ldap_uidattr: uid
ldap_filter: uid:caseExactMatch:=%U

Changes in /usr/local/sbin/checkusers.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/checkusers.sh

Changed on 02.12.09
Issued by olli
Beginning line 2

This is a script I use to create a HomeDir and a Mailbox if a new LDAP-User is created. I depends on your environment if you can use ist.

#!/bin/bash
. /etc/profile
nscd --invalidate=group
nscd --invalidate=passwd
for i in `getent passwd | cut -d":" -f 3`
do
 if [ $i -gt 999 ]
 then
  if [ $i -lt 8999 ]
  then
   # Get Infos
   USER=`getent passwd $i | cut -d":" -f 1`
   USERID=`getent passwd $i | cut -d":" -f 3`
   HOMEDIR=`getent passwd $i | cut -d":" -f 6`
   GROUP=`getent passwd $i | cut -d":" -f 4`
   LNAME="`getent passwd $i | cut -d':' -f 5`"
   #echo "Checking User $USER"
   # Check for non existing HomeDir
   if ! [ -d $HOMEDIR ]
   then
    echo "Creating Homedir $HOMEDIR for $USER ($i)"
    mkdir -p $HOMEDIR
    chown $USER:$GROUP $HOMEDIR
    chmod 0700 $HOMEDIR
   fi
   # Check for existing Backup-Dir
   if ! [ -d /srv/share/Backups/home/$USER ]
   then
    echo "Creating BackupDir /srv/share/Backups/home/$USER for $USER ($i)"
    mkdir -p /srv/share/Backups/home/$USER
    chown $USER:$GROUP /srv/share/Backups/home/$USER
    chmod 0700 /srv/share/Backups/home/$USER
   fi
   # SSH KEYs
   if ! [ -e $HOMEDIR/.ssh/id_ed25519 ]
   then
    echo "Generating openssh-key $USER for pubkey Auth e.g. for backups"
    su - $USER -c "ssh-keygen -q -t ed25519 -f $HOMEDIR/.ssh/id_ed25519 -N ''"
   fi
#   if ! [ -e $HOMEDIR/.ssh/dropbear.key ]
#   then
#    echo "Generating dropbear-key for pubkey Auth e.g. for syncopoli-backups"
#    mkdir -p $HOMEDIR/.ssh
#    su - $USER -c "dropbearkey -t ecdsa -f $HOMEDIR/.ssh/dropbear.key 2>/dev/null | grep ecdsa >>$HOMEDIR/.ssh/authorized_keys"
#    chown -R $USER:$GROUP $HOMEDIR/.ssh
#    chmod 644 $HOMEDIR/.ssh/authorized_keys
#    chmod 600 $HOMEDIR/.ssh/dropbear.key
#    chmod 700 $HOMEDIR/.ssh
#   fi
   # Check weather a mailbox exists
   if ! [ $USER = "admin" ]
   then
    if /usr/local/sbin/cyr-show-mailboxes | grep "^user.$USER" >/dev/null 
    then
     echo "Mailbox for User $USER OK" >/dev/null
    else
     echo "Creating Mailbox for $USER"
     /usr/local/sbin/cyr-create-mbox user/$USER 100
    fi
    # Check/Recreate removed folders like Trash
    /usr/local/sbin/cyr-create-mbox user/$USER
   fi
   # DMS User
   if id $USER | grep -q '2023(dms)'
   then
    if ! [ -d /home/${USER}/DMS ]
    then
     echo "Creating DMS mailbox/dirs/files for $USER"
     /usr/local/sbin/cyr-create-mbox user/${USER}dms
     mkdir -p /home/${USER}/DMS/Upload /home/${USER}/DMS/.done
     touch /home/${USER}/DMS/.dmsdel /home/${USER}/DMS/control
     chown -R ${USER} /home/${USER}/DMS
    fi
   fi
  fi
 fi
done

chmod 700 /home/*
su - mailman -c "/usr/local/sbin/maillists.sh >/dev/null 2>&1"


Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

OpenLDAP WebGUI phpldapadmin

Here a little WebGUI written in PHP for the administration of the OpenLDAP Server
After emerging phpldapadmin you have to copy the files from /usr/share/webapps/openldapadmin-<version>/htdocs into a Destination in your DocumentRoot. My Destination for example is /var/www/gabosh.net/htdocs/intern/phpldapadmin.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-nds/phpldapadmin

Changes in /var/www/www.gabosh.net/htdocs/intern/phpldapadmin/config/config.php

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /var/www/www.gabosh.net/htdocs/intern/phpldapadmin/config/config.php

Changed on 02.03.09
Issued by olli
Beginning line 283

The LDAP Base


Before change
// $servers->setValue('server','base',array(''));
After change
$servers->setValue('server','base',array('dc=example,dc=com'));

Changed on 02.03.09
Issued by olli
Beginning line 311

The LDAP Base


Before change
#  $servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');
After change
$servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Printserver

This is a little describtion how to install a CUPS-Printserver and share the printers over Samba.
You can configure your printers with the WebGUI on "http://:631".

If you want to use this solution you need the following howto(s) finished:

Required hardware

For this topic you need the following hardware: Linux/CUPS compatible printer

Required software

The required software has to be installed with the following command(s):
emerge net-print/cups

Changes in /etc/cups/cupsd.conf

File permissions:
Owner: root
Group: lp
Permissions: -rw-r-----

Click here for a download of the complete file: /etc/cups/cupsd.conf

Changed on 18.11.13
Issued by olli
Beginning line 12

Allow connections over the network


Before change
Listen localhost:631
After change
Listen *:631

Changed on 18.11.13
Issued by olli
Beginning line 32

Allow printing over the network

  Allow localhost
  Allow from 172.23.*
  Allow from 172.24.*
  Allow from 172.25.*

Changed on 18.11.13
Issued by olli
Beginning line 44

Allow administration from local networks

  Allow localhost
  Allow from 172.23.*
  Allow from 172.25.*

Changes in /etc/cups/cups-files.conf

File permissions:
Owner: root
Group: lp
Permissions: -rw-r-----

Click here for a download of the complete file: /etc/cups/cups-files.conf

Changed on 29.11.11
Issued by olli
Beginning line 35

Logging to syslog


Before change
AccessLog /var/log/cups/access_log
After change
AccessLog syslog

Changed on 29.11.11
Issued by olli
Beginning line 54

Logging to syslog


Before change
ErrorLog /var/log/cups/error_log
After change
ErrorLog syslog

Changed on 29.11.11
Issued by olli
Beginning line 70

Logging to syslog


Before change
PageLog /var/log/cups/page_log
After change
PageLog syslog

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add cupsd 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Rename files recursively

This is a perl script which I use to rename a mass of files recursively. It supports perl regex and of courrse your won perl code. There is an undo-function too for undoing a bad renaming.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge dev-perl/File-ReadBackwards

Changes in /gtc/test/etc/thinclient/scripts/gtc-rename

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-rename

Changed on 30.11.10
Issued by olli
Beginning line 2

This script renames all filesnames (and dirs) in a specified path with specified Regex'es in a specified regex-file.
For e.g. to rename change the character a in all filenames to b and y into z you can create a regex file e.g. /tmp/rename with the following lines:

s/a/b/g;
s/y/z/g;
# Then you run this command with the following options:
# $0 -p /path/in/which/you/want/to/rename -r /tmp/rename

#!/usr/bin/perl -w

# === Strict Perl ===
use strict;

# === Initialize vars ===
use vars qw/*name *dir *opt_h *opt_p *path *opt_v *verb *opt_r *regex *sim *opt_s *files *opt_u/;
*name=*File::Find::name;
*dir=*File::Find::dir;

# === Parse Commandline ===
# Clear vars
$opt_p="";
$opt_r="";
$opt_u="";
# Get the Options
use Getopt::Std;
getopts('hvp:r:su:');

# Run help/usage?
usage() if ($opt_h);

# Be verbose?
$verb=1 if ($opt_v);

# Simulating?
$sim=0;
if ($opt_s) {
 print "Only simulating - Not really renaming...\n";
 $sim=1;
}

# Shall I undo something?
if ($opt_u) {
 # Test if the undo-file is existing
 if (-f $opt_u) {
  # Open and read it
  use File::ReadBackwards;
  my $line = File::ReadBackwards->new($opt_u) || die "Could not open $opt_u: $!" ;
  until ( $line->eof ) {
   my $undo=$line->readline;
   # ...remove newline
   chomp($undo);
   # Get the two filenames
   my @undo=split(" \/\/\/ ", $undo);
   my $source=$undo[0];
   my $target=$undo[1];
   # Rename it
   print "Undo Renaming '$source' to '$target'\n";
   rename($source, $target) || warn "Could not rename $source to $target: $!\n" unless $sim;
  }
  # End prof if there are no more renamings
  exit 0 unless $opt_p;
 }
 else {
  die "You have to specify a valid unod-file if you want to undo a action\n";
 }
}


# Get path from cmdline
if (-d $opt_p) {
 $path=$opt_p;
 # Get absolute path
 chdir($path) || die "Count not change to $path: $!";
 use Cwd;
 $path=getcwd;
 print "Using path $path\n" if $verb;
}
else {
 print "ERROR: No or non existing Path $opt_p specified...\n\n";
 usage();
}

# Get regex file from cmdline
if (-f $opt_r) {
 $regex=$opt_r;
 print "Using regex-file $regex\n" if $verb;
}
else {
 print "ERROR: No or non existing regexfile $opt_r specified...\n\n";
 usage();
}

# === Prepare Undo/Log-File ===
# Create Undo/Log file
my $undo;
unless ($sim) {
 mkdir($ENV{HOME} . "/.gtc-rename",0700) unless ( -d $ENV{HOME} . "/.gtc-rename" );
 use POSIX qw/strftime/;
 $undo=$ENV{HOME} . '/.gtc-rename/gtc-rename-undo-' . strftime('%Y-%m-%d-%H-%M-%S',localtime) . '-PID-' . $$;
 open(UNDORENAME, ">$undo") || die "ERROR: Can't open Undo $undo file: $!";
}
# === Find files ===
use File::Find();
use File::Basename;
print "Searching files...\n" if $verb;
File::Find::find({wanted => \&files}, $path);
print "\n" if $verb;
@files=reverse(@files);
use File::Basename;
foreach my $file (@files) {
 s_rename($file);
}

# === Close Undo-Log ===
unless ($sim) {
 close(UNDORENAME);
 # Remove undo-file if it is empty
 unlink $undo unless (-s $undo);
}

# === Put files in array ===
sub files {
 print "." if $verb;
 return 0 if ($name eq $path);
 push(@files,$name);
}

# === Rename files ===
sub s_rename {
 # Get the name
 my $name=shift;
 print "thinking about '$name'...\n" if $verb;
 # Get the file ($_) and the path ($d) name
 $_=basename($name);
 our $d=dirname($name);
 # Run the regex-file
 do $regex;
 # Remove very bad newlines
 s/\n/_/g;
 # put the new path/name back together
 my $n=$d . "/" . $_;
 # If the filename has changed
 unless ($n eq $name) {
  # Check if the target file exists
  if (-e $n) {
   warn "ERROR: Can't rename file ($name) because the target ($n) already exists";
  }
  else {
   # Rename file and write the log
   print "Renaming '$name' to '$n'\n" if (($verb) || ($sim));
   rename($name, $n) || warn "ERROR: Renaming from $name to $n failed: $!\n" unless $sim;
   # remove bad newline in the old filename if exists
   $name=~s/\n/_/g;
   print UNDORENAME "$n /// $name\n" unless $sim; 
  }
 }
}

# === Help ===
sub usage {
 print "Overview:
=========
This renames all filesnames (and dirs) in a specified path with specified Regex'es in a specified regex-file.
For e.g. to rename change the character a in all filenames to b and y into z you can create a regex file e.g. /tmp/rename with the following lines:
s/a/b/g;
s/y/z/g;
Then you run this command with the following options:
$0 -p /path/in/which/you/want/to/rename -r /tmp/rename

To replace all special characters then the latin alphabet and numbers with _ you can put this in your regex-file:
s/[^a-zA-Z0-9]/_/g;

You can use all substitutions perl can do an of course your own per code in the regex file.

Options:
========
-h\t-> This help/usage
-p path\t-> The path in which you want to rename all files
-r file\t-> The file with your Substuitutions
-v\t-> Be verbose
-s\t-> Dry (simulation) run
-u file\t-> Undo a job. You have to specify an undo file. The undo-files are in the .gtc-rename in yout homedir: ~/.gtc-rename
";
 exit 1;
}

Changes in /usr/local/bin/gtc-rename

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/bin/gtc-rename

Changed on 30.11.10
Issued by olli
Beginning line 2

This script renames all filesnames (and dirs) in a specified path with specified Regex'es in a specified regex-file.
For e.g. to rename change the character a in all filenames to b and y into z you can create a regex file e.g. /tmp/rename with the following lines:

s/a/b/g;
s/y/z/g;
# Then you run this command with the following options:
# $0 -p /path/in/which/you/want/to/rename -r /tmp/rename

#!/usr/bin/perl -w

# === Strict Perl ===
#use strict;

# === Initialize vars ===
use vars qw/*name *dir *opt_h *opt_p *path *opt_v *verb *opt_r *regex *sim *opt_s *files *opt_u/;
*name=*File::Find::name;
*dir=*File::Find::dir;

# === Parse Commandline ===
# Clear vars
$opt_p="";
$opt_r="";
$opt_u="";
# Get the Options
use Getopt::Std;
getopts('hvp:r:su:');

# Run help/usage?
usage() if ($opt_h);

# Be verbose?
$verb=1 if ($opt_v);

# Simulating?
$sim=0;
if ($opt_s) {
 print "Only simulating - Not really renaming...\n";
 $sim=1;
}

# Shall I undo something?
if ($opt_u) {
 # Test if the undo-file is existing
 if (-f $opt_u) {
  # Open and read it
  use File::ReadBackwards;
  my $line = File::ReadBackwards->new($opt_u) || die "Could not open $opt_u: $!" ;
  until ( $line->eof ) {
   my $undo=$line->readline;
   # ...remove newline
   chomp($undo);
   # Get the two filenames
   my @undo=split(" \/\/\/ ", $undo);
   my $source=$undo[0];
   my $target=$undo[1];
   # Rename it
   print "Undo Renaming '$source' to '$target'\n";
   rename($source, $target) || warn "Could not rename $source to $target: $!\n" unless $sim;
  }
  # End prof if there are no more renamings
  exit 0 unless $opt_p;
 }
 else {
  die "You have to specify a valid unod-file if you want to undo a action\n";
 }
}


# Get path from cmdline
if (-d $opt_p) {
 $path=$opt_p;
 # Get absolute path
 chdir($path) || die "Count not change to $path: $!";
 use Cwd;
 $path=getcwd;
 print "Using path $path\n" if $verb;
}
else {
 print "ERROR: No or non existing Path $opt_p specified...\n\n";
 usage();
}

# Get regex file from cmdline
if (-f $opt_r) {
 $regex=$opt_r;
 print "Using regex-file $regex\n" if $verb;
}
else {
 print "ERROR: No or non existing regexfile $opt_r specified...\n\n";
 usage();
}

# === Prepare Undo/Log-File ===
# Create Undo/Log file
my $undo;
unless ($sim) {
 $ENV{HOME}="/tmp" unless ($ENV{HOME});
 mkdir($ENV{HOME} . "/.gtc-rename",0700) unless ( -d $ENV{HOME} . "/.gtc-rename" );
 use POSIX qw/strftime/;
 $undo=$ENV{HOME} . '/.gtc-rename/gtc-rename-undo-' . strftime('%Y-%m-%d-%H-%M-%S',localtime) . '-PID-' . $$;
 open(UNDORENAME, ">$undo") || die "ERROR: Can't open Undo $undo file: $!";
}
# === Find files ===
use File::Find();
use File::Basename;
print "Searching files...\n" if $verb;
File::Find::find({wanted => \&files}, $path);
print "\n" if $verb;
@files=reverse(@files);
use File::Basename;
foreach my $file (@files) {
 s_rename($file);
}

# === Close Undo-Log ===
unless ($sim) {
 close(UNDORENAME);
 # Remove undo-file if it is empty
 unlink $undo unless (-s $undo);
}

# === Put files in array ===
sub files {
 print "." if $verb;
 return 0 if ($name eq $path);
 push(@files,$name);
}

# === Rename files ===
sub s_rename {
 # Get the name
 my $name=shift;
 print "thinking about '$name'...\n" if $verb;
 # Get the file ($_) and the path ($d) name
 $_=basename($name);
 our $d=dirname($name);
 # Run the regex-file
 do $regex;
 # Remove very bad newlines
 s/\n/_/g;
 # put the new path/name back together
 my $n=$d . "/" . $_;
 # If the filename has changed
 unless ($n eq $name) {
  # Check if the target file exists
  if (-e $n) {
   warn "ERROR: Can't rename file ($name) because the target ($n) already exists";
  }
  else {
   # Rename file and write the log
   print "Renaming '$name' to '$n'\n" if (($verb) || ($sim));
   rename($name, $n) || warn "ERROR: Renaming from $name to $n failed: $!\n" unless $sim;
   # remove bad newline in the old filename if exists
   $name=~s/\n/_/g;
   print UNDORENAME "$n /// $name\n" unless $sim; 
  }
 }
}

# === Help ===
sub usage {
 print "Overview:
=========
This renames all filesnames (and dirs) in a specified path with specified Regex'es in a specified regex-file.
For e.g. to rename change the character a in all filenames to b and y into z you can create a regex file e.g. /tmp/rename with the following lines:
s/a/b/g;
s/y/z/g;
Then you run this command with the following options:
$0 -p /path/in/which/you/want/to/rename -r /tmp/rename

To replace all special characters then the latin alphabet and numbers with _ you can put this in your regex-file:
s/[^a-zA-Z0-9]/_/g;

You can use all substitutions perl can do an of course your own per code in the regex file.

Options:
========
-h\t-> This help/usage
-p path\t-> The path in which you want to rename all files
-r file\t-> The file with your Substuitutions
-v\t-> Be verbose
-s\t-> Dry (simulation) run
-u file\t-> Undo a job. You have to specify an undo file. The undo-files are in the .gtc-rename in yout homedir: ~/.gtc-rename
";
 exit 1;
}

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

SSL/TLS with self signed SSL Certificate

If you want to use valid SSL/TLS you can sign your certificate by your self. Here some steps you have to do on your Server here als wildcard for gabosh.net.
First create a directory for Your keys:
mkdir -p /etc/ssl/gabosh.net

and change into it
cd /etc/ssl/gabosh.net

generate the privatekey
openssl genrsa -out gabosh.net.key 4096

and change to appropriate rights
chmod 600 gabosh.net.key

Generate the Certificate
openssl req -new -x509 -nodes -sha256 -days 3650 -key gabosh.net.key > gabosh.net.crt
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) :
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) :
--> !!!!! Next line is vital (for all gabosh.net subdomains)!!!!!!!!!
Common Name (eg, YOUR name) :*.gabosh.net
Email Address :
Please enter the following extra attributes
to be sent with your certificate request
A challenge password :
An optional company name :

Then change the apache, postfix... config files
Lines in a apache-virtual-host-config-file could reveal like this:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/gabosh.net/gabosh.net.crt
SSLCertificateKeyFile /etc/apache2/ssl/gabosh.net/gabosh.net.key

Restart the appropriate services for example:
/etc/init.d/apache2 restart

And thats it...

If you want to use this solution you need the following howto(s) finished:

Changes in /etc/ssl/gabosh.net/readme

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/ssl/gabosh.net/readme

Changed on 13.03.09
Issued by olli
Beginning line 1

This is the directory for the SSL Certificates

To install and trust the Certificate run:

cd /etc/ssl/certs
ln -s ../example.com/example.com.crt `openssl x509 -hash -noout -in /etc/ssl/example.com/example.com.crt`.0

Changes in /gtc/test/etc/ssl/gabosh.net/readme

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/ssl/gabosh.net/readme

Changed on 13.03.09
Issued by olli
Beginning line 1

This is the directory for the SSL Certificates

To install and trust the Certificate run:

cd /etc/ssl/certs
ln -s ../example.com/example.com.crt `openssl x509 -hash -noout -in ../example.com/example.com.crt`.0

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Sane Scanner Server

Here a little documentation how I offer my Scanner in the network.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge media-gfx/sane-backends
emerge sys-apps/xinetd

Changes in /etc/sane.d/saned.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/sane.d/saned.conf

Changed on 26.11.08
Issued by olli
Beginning line 33

This allows scanning over the network by saned

my.lan.network.ip/16

Changes in /etc/xinetd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/xinetd.conf

Changed on 26.11.08
Issued by olli
Beginning line 28

This allows my local network to connect the xinetd. Change the IP according to your network.


Before change
      #only_from       = XXX.XXX.XXX.XXX
After change
        only_from       = my.lan.network.ip

Changes in /etc/xinetd.d/sane-stream

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/xinetd.d/sane-stream

Changed on 26.11.08
Issued by olli
Beginning line 1

This allows scanning over the network with xinetd.

service sane-port
{
	socket_type = stream
        server = /usr/sbin/saned
        protocol = tcp
        user = root
        group = root
        wait = no
        disable = no
}     

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add xinetd 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Save passwords encrypted

Often you have cases where you need a clear text password in a file e.g. in a script for logging in somehere. This is a potential security risk. For this case I store my passwords encrypted in a special password file located over an alias. This isn't much saver but it is a additional barrier.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge dev-perl/crypt-cbc
emerge dev-perl/Crypt-DES

Changes in /gtc/test/etc/thinclient/scripts/gtc-crypt

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-crypt

Changed on 30.11.10
Issued by olli
Beginning line 2

This is a small app for storing strings encrypted on your harddisk. E.g. for using passwords in scripts running without interaction in the background. It is not (very) save but maybe better then storing plain text passwords on the harddisk.

#!/usr/bin/perl -w

use strict;
use Getopt::Std;

use vars qw/*opt_h *opt_a *opt_p *opt_r *opt_d *opt_b/;
# ==== Parse the commandline ====
$opt_h="";
$opt_a="";
$opt_p="";
$opt_r="";
$opt_d="";
$opt_b="";
getopts('ha:prdb');
# Run help/usage?
usage() if ($opt_h);

my $alias="";
if ($opt_a) {
 if ($opt_a=~/[ \:\n]/) {
  print "ERROR: newlines, : or spaces are not supported in the alias\n";
  exit 1;
 }
 else {
  $alias=$opt_a;
 }
}
else {
 unless ($opt_d) {
  print "ERROR: No alias (-a) specified\n\n";
  usage();
 }
}

unless ($ENV{HOME}) {
 my $user=`whoami`;
 chomp($user);
 $ENV{HOME}=`getent passwd $user | cut -d: -f6`;
 chomp($ENV{HOME});
}
# Get or encrypt the key
mkdir($ENV{HOME} . "/.gtc-crypt",0700) unless ( -d $ENV{HOME} . "/.gtc-crypt" );
# Get the key if it is existing
my $key;
if (-f "$ENV{HOME}/.gtc-crypt/.key") {
 open(KEY, "<$ENV{HOME}/.gtc-crypt/.key") || die "Could not open the keyfile $ENV{HOME}/.gtc-crypt/.key for reading: $!";
 $key=<KEY>;
 close(KEY);
}
# Generate a random key if it is not existing
else {
 my $i=1;
 while ($i <= 32) {
  $key=$key . int(rand(10));
  $i++;
 }
 # write key to keyfile
 open(KEY, ">$ENV{HOME}/.gtc-crypt/.key") || die "Could not open the keyfile $ENV{HOME}/.gtc-crypt/.key for writing: $!";
 print KEY $key;
 close(KEY);
 chmod 0600, "$ENV{HOME}/.gtc-crypt/.key"
}

# Read the crypt file
my @crypt;
if (-f "$ENV{HOME}/.gtc-crypt/crypt") {
 open(CRYPT, "<$ENV{HOME}/.gtc-crypt/crypt") || die "Could not open the cryptfile $ENV{HOME}/.gtc-crypt/crypt for reading: $!";
 @crypt=<CRYPT>;
 close(CRYPT);
}

# preparde en or decryption
use Crypt::CBC -pbkdf;
use MIME::Base64;
my $cipher=new Crypt::CBC(-key => $key,
-pbkdf => 'pbkdf2');
#-nodeprecate => '1');

# Decrypt the string and print it out if wished
if (($opt_p) || ($opt_d)) {
 my $decrypt;
 foreach my $line (@crypt) {
  if ($opt_d) {
   my $name=$line;
   $name=~s/\:.+$//;
   print $name;
  }
  if ($line=~/^$alias\:/) {
   chomp($line);
   $decrypt=$line;
   $decrypt=~s/^$alias\://;
  }
 }
 if ($opt_p) {
  die "Alias not found in cryptfile" unless $decrypt;
  print $cipher->decrypt(decode_base64($decrypt));
  print "\n" unless $opt_b;
 }
 exit 0;
}

my $cstring="";
unless (($opt_p) || ($opt_r)) {
 # Get the string
 print "Please enter your string to encrypt: " unless $opt_b;
 my $string=<STDIN>;
 chomp($string);
 die "ERROR: String is empty" unless ($string);
 # Crypt it!
 $cstring=encode_base64($cipher->encrypt($string));
 # chomp($cstring);
 $cstring=~s/\n//g;
}

# ==== Write to the cryptfile ====
# Open the crypt file for writing
open(CRYPT, ">$ENV{HOME}/.gtc-crypt/crypt") || die "Could not open the cryptfile $ENV{HOME}/.gtc-crypt/crypt for writing: $!";
my $changed=0;
foreach my $line (@crypt) {
 chomp($line);
 # Is the alias existing?
 if ($line=~/^$alias\:/) {
  # Remove / ignore alias if wanted
  if ($opt_r) {
   print "Removing Alias $alias\n";
   $changed=1;
   next;
  }
  # Shall the existing alias been overwritten?
  else {
   unless ($opt_b) {
    print "A string for the alias $alias is already existing! Shall I overwrite it? [y/n] ";
    my $yn=<STDIN>;
    chomp($yn);
    $line=$alias . ":" . $cstring if ($yn eq "y");
   }
   else {
    $line=$alias . ":" . $cstring;
   }
   $changed=1;
  }
 }
 # Write the line
 print CRYPT $line . "\n" if $line;
}
# Write new line if the alias is new and should not be removed
print CRYPT $alias . ":" . $cstring . "\n" unless (($changed) || ($opt_r));

sub usage {
 print "Overview:
=========
This is a small app for storing strings encrypted on your harddisk. E.g. for using passwords in scripts running without interaction in the background. It is not (very) save but maybe better then storing plain text passwords on the harddisk.

Options:
========
-h\t\t-> This help/usage.
-a alias\t-> The alias under which you store your string (No newlines, : or spaces supported).
-p\t\t-> Print out the decrypted string for the given alias (needs -a).
-r\t\t-> Remove the given alias (needs -a).
-d\t\t-> Dump all existing aliases
-b\t\t-> Batch mode\n";
 exit 1;
}

Changes in /usr/local/sbin/gtc-crypt

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/sbin/gtc-crypt

Changed on 30.11.10
Issued by olli
Beginning line 2

This is a small app for storing strings encrypted on your harddisk. E.g. for using passwords in scripts running without interaction in the background. It is not (very) save but maybe better then storing plain text passwords on the harddisk.

#!/usr/bin/perl -w

use strict;
use Getopt::Std;

use vars qw/*opt_h *opt_a *opt_p *opt_r *opt_d *opt_b/;
# ==== Parse the commandline ====
$opt_h="";
$opt_a="";
$opt_p="";
$opt_r="";
$opt_d="";
$opt_b="";
getopts('ha:prdb');
# Run help/usage?
usage() if ($opt_h);

my $alias="";
if ($opt_a) {
 if ($opt_a=~/[ \:\n]/) {
  print "ERROR: newlines, : or spaces are not supported in the alias\n";
  exit 1;
 }
 else {
  $alias=$opt_a;
 }
}
else {
 unless ($opt_d) {
  print "ERROR: No alias (-a) specified\n\n";
  usage();
 }
}

unless ($ENV{HOME}) {
 my $user=`whoami`;
 chomp($user);
 $ENV{HOME}=`getent passwd $user | cut -d: -f6`;
 chomp($ENV{HOME});
}
# Get or encrypt the key
mkdir($ENV{HOME} . "/.gtc-crypt",0700) unless ( -d $ENV{HOME} . "/.gtc-crypt" );
# Get the key if it is existing
my $key;
if (-f "$ENV{HOME}/.gtc-crypt/.key") {
 open(KEY, "<$ENV{HOME}/.gtc-crypt/.key") || die "Could not open the keyfile $ENV{HOME}/.gtc-crypt/.key for reading: $!";
 $key=<KEY>;
 close(KEY);
}
# Generate a random key if it is not existing
else {
 my $i=1;
 while ($i <= 32) {
  $key=$key . int(rand(10));
  $i++;
 }
 # write key to keyfile
 open(KEY, ">$ENV{HOME}/.gtc-crypt/.key") || die "Could not open the keyfile $ENV{HOME}/.gtc-crypt/.key for writing: $!";
 print KEY $key;
 close(KEY);
 chmod 0600, "$ENV{HOME}/.gtc-crypt/.key"
}

# Read the crypt file
my @crypt;
if (-f "$ENV{HOME}/.gtc-crypt/crypt") {
 open(CRYPT, "<$ENV{HOME}/.gtc-crypt/crypt") || die "Could not open the cryptfile $ENV{HOME}/.gtc-crypt/crypt for reading: $!";
 @crypt=<CRYPT>;
 close(CRYPT);
}

# preparde en or decryption
use Crypt::CBC -pbkdf;
use MIME::Base64;
my $cipher=new Crypt::CBC(-key => $key,
-pbkdf => 'pbkdf2');
#-nodeprecate => '1');

# Decrypt the string and print it out if wished
if (($opt_p) || ($opt_d)) {
 my $decrypt;
 foreach my $line (@crypt) {
  if ($opt_d) {
   my $name=$line;
   $name=~s/\:.+$//;
   print $name;
  }
  if ($line=~/^$alias\:/) {
   chomp($line);
   $decrypt=$line;
   $decrypt=~s/^$alias\://;
  }
 }
 if ($opt_p) {
  die "Alias not found in cryptfile" unless $decrypt;
  print $cipher->decrypt(decode_base64($decrypt));
  print "\n" unless $opt_b;
 }
 exit 0;
}

my $cstring="";
unless (($opt_p) || ($opt_r)) {
 # Get the string
 print "Please enter your string to encrypt: " unless $opt_b;
 my $string=<STDIN>;
 chomp($string);
 die "ERROR: String is empty" unless ($string);
 # Crypt it!
 $cstring=encode_base64($cipher->encrypt($string));
 # chomp($cstring);
 $cstring=~s/\n//g;
}

# ==== Write to the cryptfile ====
# Open the crypt file for writing
open(CRYPT, ">$ENV{HOME}/.gtc-crypt/crypt") || die "Could not open the cryptfile $ENV{HOME}/.gtc-crypt/crypt for writing: $!";
my $changed=0;
foreach my $line (@crypt) {
 chomp($line);
 # Is the alias existing?
 if ($line=~/^$alias\:/) {
  # Remove / ignore alias if wanted
  if ($opt_r) {
   print "Removing Alias $alias\n";
   $changed=1;
   next;
  }
  # Shall the existing alias been overwritten?
  else {
   unless ($opt_b) {
    print "A string for the alias $alias is already existing! Shall I overwrite it? [y/n] ";
    my $yn=<STDIN>;
    chomp($yn);
    $line=$alias . ":" . $cstring if ($yn eq "y");
   }
   else {
    $line=$alias . ":" . $cstring;
   }
   $changed=1;
  }
 }
 # Write the line
 print CRYPT $line . "\n" if $line;
}
# Write new line if the alias is new and should not be removed
print CRYPT $alias . ":" . $cstring . "\n" unless (($changed) || ($opt_r));

sub usage {
 print "Overview:
=========
This is a small app for storing strings encrypted on your harddisk. E.g. for using passwords in scripts running without interaction in the background. It is not (very) save but maybe better then storing plain text passwords on the harddisk.

Options:
========
-h\t\t-> This help/usage.
-a alias\t-> The alias under which you store your string (No newlines, : or spaces supported).
-p\t\t-> Print out the decrypted string for the given alias (needs -a).
-r\t\t-> Remove the given alias (needs -a).
-d\t\t-> Dump all existing aliases
-b\t\t-> Batch mode\n";
 exit 1;
}

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Server for thinclients

This part describes how I boot client-PCs over the network. For this I use PXE, DHCP, TFTP and NFS.
For UEFI Grub do
cd /gtc/pxe ; grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --fonts="unicode" -o bootx64.efi boot/grub/grub.cfg

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-fs/nfs-utils
emerge sys-boot/syslinux
emerge net-ftp/tftp-hpa

Changes in /etc/conf.d/in.tftpd

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/in.tftpd

Changed on 04.04.10
Issued by olli
Beginning line 15

Path for PXE files and necessary bootoptions for tftpd.


Before change
INTFTPD_OPTS="-R 4096:32767 -s ${INTFTPD_PATH}"
After change
INTFTPD_PATH="/gtc/pxe"
#INTFTPD_OPTS="-R 4096:32767 -s ${INTFTPD_PATH} --refuse blksize --refuse tsize --refuse blksize2 --user nobody -vvv"
INTFTPD_OPTS="-p -u nobody -s ${INTFTPD_PATH} -vvv"

Changes in /etc/dhcp/dhcpd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/dhcp/dhcpd.conf

Changed on 06.09.08
Issued by olli
Beginning line 22

This is for starting the syslinux (pxelinux) bootmanager for thinclients booting over pxe.

next-server my.lan.ip.addr;
option architecture-type code 93 = unsigned integer 16;
if option architecture-type = 00:09 {
filename "bootx64.efi";
} elsif option architecture-type = 00:07 {
 filename "bootx64.efi";
} else {
filename "pxelinux.0";
}

Changes in /etc/exports

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/exports

Changed on 23.12.08
Issued by olli
Beginning line 2

NFS4-configuration for test and production environment of the Thinclients.

#/gtc            XXX.XXX.XXX.XXX/XXX.XXX.XXX.XXX(fsid=0,no_subtree_check,async,ro,no_root_squash,insecure)
/gtc/test	my.lan.network.ip/XXX.XXX.XXX.XXX(fsid=1,no_subtree_check,async,ro,no_root_squash,insecure) XXX.XXX.XXX.XXX/XXX.XXX.XXX.XXX(fsid=1,no_subtree_check,async,ro,no_root_squash,insecure)
/gtc/stable	my.lan.network.ip/XXX.XXX.XXX.XXX(fsid=2,no_subtree_check,async,ro,no_root_squash,insecure) XXX.XXX.XXX.XXX/XXX.XXX.XXX.XXX(fsid=1,no_subtree_check,async,ro,no_root_squash,insecure)
/srv/vms        XXX.XXX.XXX.XXX/XXX.XXX.XXX.XXX(fsid=3,no_subtree_check,async,rw,no_root_squash,insecure)

Changes in /gtc/pxe/pxelinux.cfg/default

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/pxe/pxelinux.cfg/default

Changed on 06.09.08
Issued by olli
Beginning line 1

Boot menu configuration for PXE boots.

default menu.c32
prompt 0
	    
menu title GTC-PXELinux Boot Menu
NOESCAPE 1
ALLOWOPTIONS 1
MENU AUTOBOOT Starting Gentoo Thinclient in # seconds

label stable
 timeout 100
 menu default
 menu label ^Gentoo Stable Thinclient 5.10.61
 kernel /kernel-genkernel-x86_64-5.10.61-gentoo
 append initrd=/initramfs-genkernel-x86_64-5.10.61-gentoo root=/dev/nfs nfsroot=my.lan.ip.addr:/gtc/stable ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs raid=noautodetect consoleblank=0 clocksource=hpet
 ipappend 3

label test
 menu label ^Gentoo Test Thinclient 5.10.76
 kernel /kernel-genkernel-x86_64-5.10.76-gentoo-r1
 append initrd=/initramfs-genkernel-x86_64-5.10.76-gentoo-r1 root=/dev/nfs nfsroot=my.lan.ip.addr:/gtc/test ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs raid=noautodetect consoleblank=0 clocksource=hpet
 ipappend 3

label bootlocal
 menu label ^Boot from local Disk
 localboot 0

Changes in /gtc/test/etc/conf.d/nfs

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/nfs

Changed on 23.12.08
Issued by olli
Beginning line 19

The rpc mountd should listen on port 32767 (needed for some firewall settings).


Before change
#OPTS_RPC_MOUNTD=""
After change
OPTS_RPC_MOUNTD="-p 32767"

Changed on 23.12.08
Issued by olli
Beginning line 27

The rpc statd should listen on port 32765 and send outgoing connections over port 32766 (needed for some firewall settings).


Before change
#OPTS_RPC_STATD=""
After change
OPTS_RPC_STATD="-p 32765 -o 32766"

Changes in /gtc/test/etc/thinclient/server-profile/etc/exports

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/exports

Changed on 23.12.08
Issued by olli
Beginning line 2

NFS(4)-configuration for test and production environment of the Thinclients.

/opt/gtcroot	*(fsid=0,crossmnt,no_subtree_check,async,ro,no_root_squash,insecure,nohide)

Changes in /usr/local/sbin/mkgtcstable.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /usr/local/sbin/mkgtcstable.sh

Changed on 29.06.09
Issued by olli
Beginning line 2

This is a small script for creating the stable environment from the test environment.

#!/bin/bash
set -x
/etc/init.d/rsyncd stop
#mv /gtc/test/usr/portage/distfiles/jre* /srv/tmp
rm -rf /gtc/test/usr/portage/distfiles/*
#mv /srv/tmp/jre* /gtc/test/usr/portage/distfiles/
if mount | grep -q "on /gtc type btrfs"
then
 btrfs subvolume delete /gtc/stable
 btrfs subvolume snapshot /gtc/test /gtc/stable
 btrfs property set /gtc/stable ro false
 rsync -aXAH --delete --exclude=distfiles /gtc/test/usr/portage/ /gtc/stable/usr/portage/
else
 rsync -aXAH --delete /gtc/test/ /gtc/stable/ --exclude=/_gtcroot/ --exclude=/gtcdvd/ --exclude=/proc/ --exclude=/sys/ --exclude=/tmp/ --exclude=/var/tmp --exclude=/root
fi
mkdir -p /gtc/stable/proc
mkdir -p /gtc/stable/sys
mkdir -p /gtc/stable/tmp
mkdir -p /gtc/stable/root
chmod 0700 /gtc/stable/root
chmod 1777 /gtc/stable/tmp
mkdir -p /gtc/stable/var/tmp/portage
chmod 1777 /gtc/stable/var/tmp
mkdir -p /gtc/stable/_gtcroot
for i in `find /gtc/stable/var/log/ -type f` 
do
 >$i
done
rm -r /gtc/stable/usr/share/doc
rm -r /gtc/stable/usr/share/gtk-doc
for i in `find /gtc/stable/usr/src -maxdepth 1 -type d | grep linux`
do
 cd $i
 # Rest needed for Kernel modules eg nvidia-drivers
 make clean
 cd -
done
btrfs property set /gtc/stable ro true
/etc/init.d/rsyncd start
/etc/init.d/nfs restart
/gtc/pxe/linkkernel.sh

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add nfs 
rc-update add in.tftpd 
rc-update add rpc.idmapd default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Sort files alphabetical

Here a script which sorts file alphabetical. So a file (or directory) beginning with an "a" (e.g. apple) will be moved into the directory "a" and so on.
Please be careful with it. This process can not be undone.

If you want to use this solution you need the following howto(s) finished:

Changes in /gtc/test/etc/thinclient/scripts/az

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/az

Changed on 05.05.10
Issued by olli
Beginning line 2

This is a small script which sorts files (or directories) in directories called a-z and 0-9

#!/bin/bash
if [ -z "$1" ]
then
 echo "No directory argument"
 exit 1
fi

cd "$1" || exit 1

# Sort alphabetical
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 
do
 ls -1d $i?* 2>/dev/null | while read j
 do
  mkdir -p "$i"
  if [ -d "$i/$j" ]
  then
   cp -lr "$j"/* "$i/$j"/ && rm -r "$j"
  else
   echo "mv \"$j\" \"$i\"/"
   mv "$j" "$i"/
  fi
 done
done

# Sort non-Alphabetical Characters to _
if [ -n "`ls ??* 2>/dev/null `" ]
then
 mkdir -p _
 mv ??* _
fi

# Ignore Case sensitive
if [ "$2" = "-i" ]
then
 for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
 do
  j=`echo "$i" | awk '{$1=toupper($1);print}'`
  if [ -d "$i" ]
  then
   mv "$i"/* "$j"/
   rmdir "$i"
  fi
 done
fi


Changes in /usr/local/bin/az

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /usr/local/bin/az

Changed on 05.05.10
Issued by olli
Beginning line 2

This is a small script which sorts files (or directories) in directories called a-z and 0-9

#!/bin/bash
if [ -z "$1" ]
then
 echo "No directory argument"
 exit 1
fi

cd "$1" || exit 1

# Sort alphabetical
for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 
do
 ls -1d $i?* 2>/dev/null | while read j
 do
  mkdir -p "$i"
  if [ -d "$i/$j" ]
  then
   cp -lr "$j"/* "$i/$j"/ && rm -r "$j"
  else
#   echo "mv \"$j\" \"$i\"/"
   mv "$j" "$i"/
  fi
 done
done

# Sort non-Alphabetical Characters to _
if [ -n "`ls ??* 2>/dev/null `" ]
then
 mkdir -p _
 mv ??* _
fi

# Ignore Case sensitive
if [ "$2" = "-i" ]
then
 for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
 do
  j=`echo "$i" | awk '{$1=toupper($1);print}'`
  if [ -d "$i" ]
  then
   mv "$i"/* "$j"/
   rmdir "$i"
  fi
 done
fi


Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Statistics

Here is how I create statistics about my web accesses and my mailtraffic. For this I use AWstats.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-www/awstats

Changes in /etc/awstats/awstats.gabosh.net.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/awstats/awstats.gabosh.net.conf

Changed on 18.02.09
Issued by olli
Beginning line 1

This is the AWstats-configuration for my gabosh.net Apache-vHost

LogFile="/var/log/apache2/access_log"
LogType=W
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
LogSeparator=" "
SiteDomain="example.com"
HostAliases="example.com smtp.example.com pop.example.com pop3.example.com mail.example.com silent-gabosh.example.com silent.example.com gabosh.example.com imap.example.com ns1.example.com"
DNSLookup=1
DirData="/var/lib/awstats"
DirCgi="/cgi-bin"
DirIcons="/intern/awstats/icon"
AllowToUpdateStatsFromBrowser=0
AllowFullYearView=2
EnableLockForUpdate=0
DNSStaticCacheFile="dnscache.txt"
DNSLastUpdateCacheFile="dnscachelastupdate.txt"
SkipDNSLookupFor=""
AllowAccessFromWebToAuthenticatedUsersOnly=0
AllowAccessFromWebToFollowingAuthenticatedUsers=""
AllowAccessFromWebToFollowingIPAddresses=""
CreateDirDataIfNotExists=0
BuildHistoryFormat=text
BuildReportFormat=html
SaveDatabaseFilesWithPermissionsForEveryone=0
PurgeLogFile=0
ArchiveLogRecords=0
KeepBackupOfHistoricFiles=0
DefaultFile="index.html"
SkipHosts="194.127.8.17 194.127.8.18 194.127.8.19 194.127.8.20 172.23.0.50 my.lan.ip.addr 127.0.0.1"
SkipUserAgents=""
SkipFiles=""
SkipReferrersBlackList=""
OnlyHosts=""
OnlyUserAgents=""
OnlyUsers=""
OnlyFiles=""
NotPageList="css js class gif jpg jpeg png bmp ico rss xml swf"
ValidHTTPCodes="200 304"
ValidSMTPCodes="1 250"
AuthenticatedUsersNotCaseSensitive=0
URLNotCaseSensitive=0
URLWithAnchor=0
URLWithQuery=0
URLWithQueryWithOnlyFollowingParameters=""
URLWithQueryWithoutFollowingParameters=""
URLReferrerWithQuery=0
WarningMessages=1
ErrorMessages=""
DebugMessages=0
NbOfLinesForCorruptedLog=50
WrapperScript=""
DecodeUA=0
MiscTrackerUrl="/js/awstats_misc_tracker.js"
UseFramesWhenCGI=1
DetailedReportsOnNewWindows=1
Expires=0
MaxRowsInHTMLOutput=1000
Lang="auto"
DirLang="./lang"
ShowMenu=1					
ShowSummary=UVPHB
ShowMonthStats=UVPHB
ShowDaysOfMonthStats=VPHB
ShowDaysOfWeekStats=PHB
ShowHoursStats=PHB
ShowDomainsStats=PHB
ShowHostsStats=PHBL
ShowAuthenticatedUsers=0
ShowRobotsStats=HBL
ShowWormsStats=0
ShowEMailSenders=0
ShowEMailReceivers=0
ShowSessionsStats=1
ShowPagesStats=PBEX
ShowFileTypesStats=HB
ShowFileSizesStats=0		
ShowOSStats=1
ShowBrowsersStats=1
ShowScreenSizeStats=0
ShowOriginStats=PH
ShowKeyphrasesStats=1
ShowKeywordsStats=1
ShowMiscStats=a
ShowHTTPErrorsStats=1
ShowSMTPErrorsStats=0
ShowClusterStats=0
AddDataArrayMonthStats=1
AddDataArrayShowDaysOfMonthStats=1
AddDataArrayShowDaysOfWeekStats=1
AddDataArrayShowHoursStats=1
IncludeInternalLinksInOriginSection=0
MaxNbOfDomain = 10
MinHitDomain  = 1
MaxNbOfHostsShown = 10
MinHitHost    = 1
MaxNbOfLoginShown = 10
MinHitLogin   = 1
MaxNbOfRobotShown = 10
MinHitRobot   = 1
MaxNbOfPageShown = 10
MinHitFile    = 1
MaxNbOfOsShown = 10
MinHitOs      = 1
MaxNbOfBrowsersShown = 10
MinHitBrowser = 1
MaxNbOfScreenSizesShown = 5
MinHitScreenSize = 1
MaxNbOfWindowSizesShown = 5
MinHitWindowSize = 1
MaxNbOfRefererShown = 10
MinHitRefer   = 1
MaxNbOfKeyphrasesShown = 10
MinHitKeyphrase = 1
MaxNbOfKeywordsShown = 10
MinHitKeyword = 1
MaxNbOfEMailsShown = 20
MinHitEMail   = 1
FirstDayOfWeek=1
ShowFlagLinks=""
ShowLinksOnUrl=1
UseHTTPSLinkForUrl=""
MaxLengthOfShownURL=64
HTMLHeadSection=""
HTMLEndSection=""
Logo="awstats_logo6.png"
LogoLink="http://awstats.sourceforge.net"
BarWidth   = 260
BarHeight  = 90
StyleSheet=""
ExtraTrackedRowsLimit=500

Changes in /etc/awstats/awstats.mailserver.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/awstats/awstats.mailserver.conf

Changed on 18.02.09
Issued by olli
Beginning line 1

This is the AWstats-configuration for my Mailserver

SiteDomain="silent-gabosh.example.com"
HostAliases="localhost 127.0.0.1 example.com"
LogFile="/usr/bin/awstats_maillogconvert.pl standard < /var/log/maillog.log |" 
LogType=M
LogFormat="%time2 %email %email_r %host %host_r %method %url %code %bytesd"
DirIcons="/intern/awstats/icon"
DirData="/var/lib/awstats"
DNSLookup=1
LevelForBrowsersDetection=0
LevelForOSDetection=0
LevelForRefererAnalyze=0
LevelForRobotsDetection=0
LevelForWormsDetection=0
LevelForSearchEnginesDetection=0
LevelForFileTypesDetection=0
ShowMenu=1
ShowSummary=HB
ShowMonthStats=HB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=0
ShowHostsStats=HBL
ShowAuthenticatedUsers=0
ShowRobotsStats=0
ShowEMailSenders=HBML
ShowEMailReceivers=HBML
ShowSessionsStats=0
ShowPagesStats=0
ShowFileTypesStats=0
ShowFileSizesStats=0
ShowBrowsersStats=0
ShowOSStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
ShowSMTPErrorsStats=1 

Changes in /usr/local/bin/awstats

File permissions:
Owner: root
Group: root
Permissions: -rwxr-x---

Click here for a download of the complete file: /usr/local/bin/awstats

Changed on 03.02.09
Issued by olli
Beginning line 2

Create statistics every day and write them into the webserver path

# Directory for static statistics
#!/bin/bash

WEBDIR=/var/www/www.example.com/htdocs/intern/awstats
MONTH=$(date +%B-%Y)

# Create Mailserverstatistics
WPATH=$WEBDIR/mailserver/$MONTH
mkdir -p $WPATH
/usr/bin/awstats_buildstaticpages.pl -config=mailserver -update -dir=$WPATH >/dev/null
ln -f $WPATH/awstats.mailserver.html $WPATH/index.html

DOMS=`ls -1 /etc/apache2/vhosts.d/vhosts/ | perl -pe 's/\.vhost$//; s/\.sslvhost$//;' | sort -u`
DOMS="$DOMS `getent group share | cut -d: -f4 | perl -pe 's/,/.example.com /g; s/$/.example.com/g;'`"

for DOM in $DOMS
do
 echo "
LogFile=\"/var/log/apache2/access_log\"
LogType=W
LogFormat = \"%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot\"
LogSeparator=\" \"
SiteDomain=\"$DOM\"
DNSLookup=1
DirData=\"/var/lib/awstats\"
DirCgi=\"/cgi-bin\"
DirIcons=\"/intern/awstats/icon\"
AllowToUpdateStatsFromBrowser=0
AllowFullYearView=2
EnableLockForUpdate=0
DNSStaticCacheFile=\"dnscache.txt\"
DNSLastUpdateCacheFile=\"dnscachelastupdate.txt\"
SkipDNSLookupFor=\"\"
AllowAccessFromWebToAuthenticatedUsersOnly=0
AllowAccessFromWebToFollowingAuthenticatedUsers=\"\"
AllowAccessFromWebToFollowingIPAddresses=\"\"
CreateDirDataIfNotExists=0
BuildHistoryFormat=text
BuildReportFormat=html
SaveDatabaseFilesWithPermissionsForEveryone=0
PurgeLogFile=0
ArchiveLogRecords=0
KeepBackupOfHistoricFiles=0
DefaultFile=\"index.html\"
SkipHosts=\"194.127.8.17 194.127.8.18 66.133.109.36 64.78.149.164 127.0.0.1 REGEX[^212\.6\.102\.] REGEX[^192\.168\.] REGEX[^10\.] REGEX[^172\.23\.] REGEX[^172\.25\.]\"
SkipUserAgents=\"\"
SkipFiles=\"\"
SkipReferrersBlackList=\"\"
OnlyHosts=\"\"
OnlyUserAgents=\"\"
OnlyUsers=\"\"
OnlyFiles=\"\"
NotPageList=\"css js class gif jpg jpeg png bmp ico rss xml swf\"
ValidHTTPCodes=\"200 304\"
ValidSMTPCodes=\"1 250\"
AuthenticatedUsersNotCaseSensitive=0
URLNotCaseSensitive=0
URLWithAnchor=0
URLWithQuery=0
URLWithQueryWithOnlyFollowingParameters=\"\"
URLWithQueryWithoutFollowingParameters=\"\"
URLReferrerWithQuery=0
WarningMessages=1
ErrorMessages=\"\"
DebugMessages=0
NbOfLinesForCorruptedLog=50
WrapperScript=\"\"
DecodeUA=0
MiscTrackerUrl=\"/js/awstats_misc_tracker.js\"
UseFramesWhenCGI=1
DetailedReportsOnNewWindows=1
Expires=0
MaxRowsInHTMLOutput=1000
Lang=\"auto\"
DirLang=\"./lang\"
ShowMenu=1
ShowSummary=UVPHB
ShowMonthStats=UVPHB
ShowDaysOfMonthStats=VPHB
ShowDaysOfWeekStats=PHB
ShowHoursStats=PHB
ShowDomainsStats=PHB
ShowHostsStats=PHBL
ShowAuthenticatedUsers=0
ShowRobotsStats=HBL
ShowWormsStats=0
ShowEMailSenders=0
ShowEMailReceivers=0
ShowSessionsStats=1
ShowPagesStats=PBEX
ShowFileTypesStats=HB
ShowFileSizesStats=0
ShowOSStats=1
ShowBrowsersStats=1
ShowScreenSizeStats=0
ShowOriginStats=PH
ShowKeyphrasesStats=1
ShowKeywordsStats=1
ShowMiscStats=a
ShowHTTPErrorsStats=1
ShowSMTPErrorsStats=0
ShowClusterStats=0
AddDataArrayMonthStats=1
AddDataArrayShowDaysOfMonthStats=1
AddDataArrayShowDaysOfWeekStats=1
AddDataArrayShowHoursStats=1
IncludeInternalLinksInOriginSection=0
MaxNbOfDomain = 10
MinHitDomain  = 1
MaxNbOfHostsShown = 10
MinHitHost    = 1
MaxNbOfLoginShown = 10
MinHitLogin   = 1
MaxNbOfRobotShown = 10
MinHitRobot   = 1
MaxNbOfPageShown = 10
MinHitFile    = 1
MaxNbOfOsShown = 10
MinHitOs      = 1
MaxNbOfBrowsersShown = 10
MinHitBrowser = 1
MaxNbOfScreenSizesShown = 5
MinHitScreenSize = 1
MaxNbOfWindowSizesShown = 5
MinHitWindowSize = 1
MaxNbOfRefererShown = 10
MinHitRefer   = 1
MaxNbOfKeyphrasesShown = 10
MinHitKeyphrase = 1
MaxNbOfKeywordsShown = 10
MinHitKeyword = 1
MaxNbOfEMailsShown = 20
MinHitEMail   = 1
FirstDayOfWeek=1
ShowFlagLinks=\"\"
ShowLinksOnUrl=1
UseHTTPSLinkForUrl=\"\"
MaxLengthOfShownURL=64
HTMLHeadSection=\"\"
HTMLEndSection=\"\"
Logo=\"awstats_logo6.png\"
LogoLink=\"http://awstats.sourceforge.net\"
BarWidth   = 260
BarHeight  = 90
StyleSheet=\"\"
ExtraTrackedRowsLimit=500
" >/etc/awstats/awstats.$DOM.conf
 WPATH=$WEBDIR/$DOM/$MONTH
 mkdir -p $WPATH
 /usr/bin/awstats_buildstaticpages.pl -config=$DOM -update -dir=$WPATH >/dev/null
 ln -f $WPATH/awstats.$DOM.html $WPATH/index.html
done

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Stopping brute-force-attacks with fail2ban

If you allow services like ssh in the internet, probably you now log-entries like
[...]
Jul 17 15:18:56 silent-gabosh sshd[4401]: Invalid user test4 from XXX.XXX.XXX.XXX
Jul 17 15:18:58 silent-gabosh sshd[4405]: Invalid user test5 from XXX.XXX.XXX.XXX
Jul 17 15:19:00 silent-gabosh sshd[4411]: Invalid user test6 from XXX.XXX.XXX.XXX
Jul 17 15:19:02 silent-gabosh sshd[4417]: Invalid user test7 from XXX.XXX.XXX.XXX
Jul 17 15:19:04 silent-gabosh sshd[4421]: Invalid user test8 from XXX.XXX.XXX.XXX
Jul 17 15:19:05 silent-gabosh sshd[4427]: Invalid user test9 from XXX.XXX.XXX.XXX
Jul 17 15:19:07 silent-gabosh sshd[4431]: Invalid user test10 from XXX.XXX.XXX.XXX
Jul 17 15:19:09 silent-gabosh sshd[4435]: Invalid user admin1 from XXX.XXX.XXX.XXX
Jul 17 15:19:11 silent-gabosh sshd[4439]: Invalid user admin2 from XXX.XXX.XXX.XXX
Jul 17 15:19:13 silent-gabosh sshd[4443]: Invalid user admin3 from XXX.XXX.XXX.XXX
Jul 17 15:19:15 silent-gabosh sshd[4447]: Invalid user admin4 from XXX.XXX.XXX.XXX
Jul 17 15:19:17 silent-gabosh sshd[4451]: Invalid user admin5 from XXX.XXX.XXX.XXX
Jul 17 15:19:19 silent-gabosh sshd[4455]: Invalid user admin6 from XXX.XXX.XXX.XXX
[...]

fail2ban is a piece of software which blocks this attacking IPs after some failed tries and enables them a after some time again. It works not only for ssh, so you can use it for FTP and Mailservers too. fail2ban blocks IPs with iptables commands.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-analyzer/fail2ban
emerge net-firewall/iptables

Changes in /etc/cron.hourly/f2bcheck

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /etc/cron.hourly/f2bcheck

Changed on 07.06.10
Issued by olli
Beginning line 2

I realized that fail2ban stops working sometimes (why ever). So built this small check CronJob

#!/bin/bash
if ! ps ax | grep fail2ban | grep -v grep >/dev/null
then
 echo "NOT RUNNING `date`" >>/var/log/fail2bancheck.log
 /etc/init.d/fail2ban stop >/dev/null 2>/dev/null
 /etc/init.d/fail2ban zap >/dev/null 2>/dev/null
 sleep 2
 while ps ax | grep -v grep | grep -q fail2ban
 do
  echo -n "."
  sleep 1
 done
 rm -f /var/run/fail2ban/fail2ban.sock
 /etc/init.d/fail2ban start >/dev/null 2>/dev/null
fi

Changes in /etc/fail2ban/action.d/sendmail-common.local

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/fail2ban/action.d/sendmail-common.local

Changed on 25.02.14
Issued by olli
Beginning line 1

No mail at startup/shutdown

[Definition]
actionstart =
actionstop =

Changes in /etc/fail2ban/jail.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/fail2ban/jail.conf

Changed on 25.02.14
Issued by olli
Beginning line 92

Ignore local Networks


Before change
#ignoreip = 127.0.0.1/8 ::1
After change
ignoreip = 127.0.0.1/8 my.lan.network.ip/16 172.24.0.0/16 172.25.0.0/16 79.255.254.199 2003:f2:d7ff:a2:548f:10f7:f60f:6006

Changed on 25.02.14
Issued by olli
Beginning line 183

Destination eMail


Before change
destemail = mail@example.com
After change
destemail = mail@example.com

Changed on 25.02.14
Issued by olli
Beginning line 190

Sender eMail


Before change
sender = root@<fq-hostname>
After change
sender = fail2mail@example.com

Changed on 25.02.14
Issued by olli
Beginning line 281

Sets Default action to Mail, Whois, Logs


Before change
action = %(action_)s
After change
action = %(action_mwl)s

Changes in /etc/fail2ban/jail.d/gabosh.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/fail2ban/jail.d/gabosh.conf

Changed on 25.02.14
Issued by olli
Beginning line 1

Some jails for different services


#### SSH ####

[sshd]
enabled = true
port = ssh
logpath = /var/log/sshd.log
bantime  = 5m

#### MAIL ####

#[postfix]
#enabled = true
#port = smtp,465,submission,imap3,imaps,pop3,pop3s,2000
#logpath = /var/log/maillog.log
#bantime  = 60m

[postfix-rbl]
enabled = true
port = smtp,465,submission,imap3,imaps,pop3,pop3s,2000
logpath = /var/log/maillog.log
maxretry = 1
bantime  = 60m

[postfix-sasl]
enabled = true
port = smtp,465,submission,imap3,imaps,pop3,pop3s,2000
logpath  = /var/log/maillog.log
bantime  = 60m

[cyrus-imap]
enabled = true
port = smtp,465,submission,imap3,imaps,pop3,pop3s,2000
logpath  = /var/log/maillog.log
bantime  = 60m

[sieve]
port   = smtp,465,submission,imap3,imaps,pop3,pop3s,2000
logpath = /var/log/maillog.log
bantime  = 60m

#### WEB ####

[apache-auth]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
bantime  = 60m

[apache-badbots]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[apache-botsearch]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[apache-fakegooglebot]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[apache-overflows]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[apache-pass]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[apache-shellshock]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[php-url-fopen]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 1
bantime  = 60m

[apache-noscript]
enabled = true
port = http,https
logpath = /var/log/apache2/*log
maxretry = 6
bantime  = 60m



#### CHAT ####

[ejabberd-auth]
enabled = true
port = 5222
logpath = /var/log/jabber/ejabberd.log
bantime  = 60m


Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add fail2ban 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Basesystem

Here a little documentation how I installed the basesystem for my thinclients. The special thing of these clients is that they are booted from a read only nfs filesystem. The goal of this is that the system can be booted at the same time from more different computers.

I installed it in a chroot on my Server. You can use the Gentoo Handbook for the basic installation. Here are some changes I used to make it to a read only thinclient.
This is the profile I use:
rm /etc/make.profile
ln -s /usr/portage/profiles/default/linux/x86/2008.0/desktop /etc/make.profile

I installed some additional software for me and my users. Here is what I installed:
chroot /srv/thinclient/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge app-arch/p7zip sys-apps/sdparm sys-apps/hdparm app-arch/unace app-arch/unarj app-arch/unlzx app-arch/rar app-arch/arj app-arch/lha app-arch/unadf app-misc/mc app-cdr/k3b app-editors/vim app-office/openoffice app-portage/genlop app-portage/gentoolkit app-text/acroread dev-util/strace media-sound/alsa-tools media-sound/alsa-utils media-sound/musescore media-sound/timidity++ media-video/dvdrip net-im/licq net-wireless/ipw2100-firmware net-wireless/ipw2200-firmware sys-kernel/gentoo-sources sys-libs/libstdc++-v3 sys-process/vixie-cron virtual/libstdc++ www-client/mozilla-firefox www-plugins/adobe-flash sys-power/acpid app-laptop/radeontool sys-fs/dosfstools app-text/unix2dos app-text/dos2unix net-analyzer/nmap net-misc/netkit-telnetd sys-apps/parted sys-block/gparted mail-client/mozilla-thunderbird net-wireless/bluez-firmware net-wireless/bluez-hcidump sys-apps/ethtool sys-kernel/linux-firmware media-gfx/gimp net-misc/rdate net-misc/ntp net-nds/yp-tools net-nds/ypbind app-emulation/wine sys-process/htop media-video/kino media-sound/audacity games-action/chromium net-print/foomatic-filters-ppds net-im/skype net-analyzer/iptraf app-mobilephone/wammu app-mobilephone/gnokii net-fs/curlftpfs sys-fs/sshfs-fuse net-fs/fusesmb sys-power/acpid app-office/qbankmanager app-office/grisbi app-cdr/xfburn x11-terms/terminal app-editors/mousepad app-office/orage media-gfx/ristretto media-sound/grip media-gfx/gqview media-plugins/mytharchive media-plugins/mythbrowser media-plugins/mythcontrols media-plugins/mythflix media-plugins/mythgallery media-plugins/mythgame media-plugins/mythmovies media-plugins/mythmusic media-plugins/mythnews media-plugins/mythphone media-plugins/mythvideo media-plugins/mythweather media-plugins/mythzoneminder dev-python/imdbpy net-im/pidgin media-sound/tagtool media-sound/audacious media-plugins/audacious-plugins media-plugins/audacious-xosd x11-themes/audacious-themes app-arch/xarchiver media-gfx/inkscape app-office/dia app-misc/fdupes dev-util/geany media-sound/id3v2 media-libs/exiftool dev-perl/MP3-Tag'

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge app-admin/rsyslog'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-fs/nfs-utils'

Changes in /etc/cron.weekly/gtcupdate

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /etc/cron.weekly/gtcupdate

Changed on 05.01.09
Issued by olli
Beginning line 2

Update the thinclient system automatically once a week

#!/bin/bash

. /etc/bash/gaboshlib.include

g_lockfile
g_nice


# Hibiscus
g_echo_ok "Hibiscus Update"
ARCH=`uname -m | grep -o '64'`
JAMEICAVERSION=`wget -q -O - http://www.willuhn.de/products/jameica/releases/version-nightly`
HIBISCUSVERSION=`wget -q -O - http://www.willuhn.de/products/hibiscus/releases/version-nightly`
cd $g_tmp
wget -q http://www.willuhn.de/products/jameica/releases/current/jameica/jameica-linux64.zip
wget -q http://www.willuhn.de/products/hibiscus/releases/current/hibiscus.zip
hibiscusfile="hibiscus.zip"
jameicafile="jameica-linux64.zip"

cd /opt
rm -rf /opt/jameica
unzip -q $g_tmp/${jameicafile}
cd jameica/plugins
unzip -q $g_tmp/${hibiscusfile}

umg=test
rm -rf /gtc/$umg/opt/jameica
cd /gtc/$umg/opt
unzip -q $g_tmp/${jameicafile}
cd jameica/plugins
unzip -q $g_tmp/${hibiscusfile}
echo -e "[Desktop Entry]\n"\
"Name=Hibiscus\n"\
"Comment=Hibiscus die freie Homebanking-Anwendung\n"\
"Exec=/opt/jameica/jameica.sh\n"\
"Terminal=false\n"\
"Encoding=UTF-8\n"\
"Type=Application\n"\
"Icon=/opt/jameica/jameica-icon.png\n"\
"Categories=Office;Finance\n"\
> /gtc/$umg/usr/share/applications/Hibiscus.desktop
cat /gtc/$umg/usr/share/applications/Hibiscus.desktop >/usr/share/applications/Hibiscus.desktop
rm $g_tmp/${jameicafile}
rm $g_tmp/${hibiscusfile}

# Apache Config
cp -p /etc/apache2/vhosts.d/00_gabosh.conf /gtc/test/etc/apache2/vhosts.d/
cp -p /etc/apache2/vhosts.d/letsencrypt.include /gtc/test/etc/apache2/vhosts.d/

# Update GTC
g_echo_ok "Gentoo-GTC-Update in detached tmux"
cp -p /etc/bash/gaboshlib.include /gtc/$umg/etc/bash/gaboshlib.include
cat <<EOF > /gtc/$umg/root/Gentoo-GTC-Update.sh
#!/bin/bash

. /etc/bash/gaboshlib.include

g_portagesync

# Kernel
emerge gentoo-sources
gtc-buildkernel

g_gentooupdate

# JavaScript dlc-decypter per npmjs.com (MIT License)
npm update -g decrypt-dlc-cli

# Icons
rm -f /usr/share/applications/hp-uiscan.desktop /etc/xdg/autostart/hplip-systray.desktop
rm -f /etc/xdg/autostart/._cfg0000_hplip-systray.desktop /usr/share/applications/._cfg0000_hp-uiscan.desktop

# Start(Sub)menu
echo '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">
<Menu>
 <Name>Applications</Name>
 <Menu>
  <Name>GTC</Name>
  <Directory>GTC.directory</Directory>
  <Include>
   <Category>GTC</Category>
  </Include>
  <Menu>
   <Name>GTC-System</Name>
   <Directory>GTC.directory</Directory>
   <Include>
    <Category>GTC-System</Category>
   </Include>
  </Menu> 
  <Menu>
   <Name>GTC-Tools</Name>
   <Directory>GTC.directory</Directory>
   <Include>
    <Category>GTC-Programs-Accessories</Category>
   </Include>
  </Menu>
 </Menu>
</Menu>
' >/etc/xdg/menus/applications-merged/gtc.menu

echo '[Desktop Entry]
Type=Directory
Name=GTC
Icon=/usr/share/icons/gentoo/64x64/gentoo.png
' >/usr/share/desktop-directories/GTC.directory

echo "[Desktop Entry]
Name=GTC Desktopfreigabe
Comment=X11VNC &uuml;ber SSH-Tunnel
Exec=mate-terminal --window --command=/etc/thinclient/scripts/gtc-x11vnc
Path=
Icon=help-browser
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Network;
">/usr/share/applications/gtc-x11vnc.desktop

echo "[Desktop Entry]
Name=GTC Desktopfreigabe beenden
Comment=X11VNC &uuml;ber SSH-Tunnel
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/gtc-x11vnc STOP\"
Path=
Icon=help-browser
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Network;
">/usr/share/applications/gtc-x11vnc-stop.desktop

echo "[Desktop Entry]
Name=GTC Config editieren
Comment=
Exec=mate-terminal --window --command=\"sudo -i leafpad /etc/current-gtc-profile/thinclient.conf\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-editprofile.desktop

echo "[Desktop Entry]
Name=GTC Startscrit editieren
Comment=
Exec=mate-terminal --window --command=\"sudo -i leafpad /etc/current-gtc-profile/start.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-editstartsh.desktop

echo "[Desktop Entry]
Name=GTC NVIDIA Legacy Treiber aktivieren
Comment=
Exec=mate-terminal --window --command=\"sudo -i /etc/thinclient/scripts/gtc-nvidia-legacy-driver\"
Path=
Icon=nvidia-settings
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-nvidialegacy.desktop

echo "[Desktop Entry]
Name=GTC NVIDIA OpenSource Treiber aktivieren
Comment=
Exec=mate-terminal --window --command=\"sudo -i /etc/thinclient/scripts/gtc-nouveau\"
Path=
Icon=nvidia-settings
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-nvidianouveau.desktop

echo "[Desktop Entry]
Name=GTC NVIDIA Treiber aktivieren
Comment=
Exec=mate-terminal --window --command=\"sudo -i /etc/thinclient/scripts/gtc-nvidia\"
Path=
Icon=nvidia-settings
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-nvidia.desktop

echo "[Desktop Entry]
Name=GTC Druckerverwaltung
Comment=
Exec=firefox localhost:631
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-printconfig.desktop

echo "[Desktop Entry]
Name=GTC Update
Comment=Linux Update
Exec=mate-terminal --window --command=\"sudo -i /etc/thinclient/scripts/gtc-update\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-update.desktop

echo "[Desktop Entry]
Name=GTC Update erzwingen
Comment=Linux Update erzwingen
Exec=mate-terminal --window --command=\"sudo -i /etc/thinclient/scripts/gtc-update-force\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-update-force.desktop

echo "[Desktop Entry]
Name=GTC Release Notes
Comment=GTC Release Notes
Exec=mate-terminal --window --command=\"leafpad /etc/thinclient/gtc-release-notes\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-release-notes.desktop

echo "[Desktop Entry]
Name=GTC Passwort von root &auml;ndern
Comment=Root/Admin Passwort &auml;ndern
Exec=mate-terminal --window --command=\"sudo -i passwd || sleep 30\"
Path=
Icon=user-available
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
" >/usr/share/applications/gtc-rootpasswd.desktop

echo "[Desktop Entry]
Name=GTC Passwort von User &auml;ndern
Comment=Passwort &auml;ndern
Exec=mate-terminal --window --command=\"passwd || sleep 30\"
Path=
Icon=avatar-default
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
" >/usr/share/applications/gtc-passwd.desktop

echo "[Desktop Entry]
Name=GTC Samba Passwort von User &auml;ndern
Comment=Passwort &auml;ndern
Exec=mate-terminal --window --command=\"smbpasswd || sleep 30\"
Path=
Icon=avatar-default
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
" >/usr/share/applications/gtc-smbpasswd.desktop

echo "[Desktop Entry]
Name=Brave Browser
Comment=
Exec=/etc/thinclient/scripts/brave-browser.sh
Path=
Icon=/usr/share/icons/gabosh/brave-browser.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
" >/usr/share/applications/gtc-brave-browser.desktop

echo "[Desktop Entry]
Name=Geotag for Images
Comment=
Exec=/usr/bin/java -jar /usr/local/lib/geotag-0.103.jar
Path=
Icon=/usr/share/icons/gabosh/geotag.gif
Terminal=false
StartupNotify=false
Type=Application
Categories=Graphics;2DGraphics;RasterGraphics;GTK;
" >/usr/share/applications/geotag.desktop

echo "[Desktop Entry]
Name=GTC Speichermedium verschl&uuml;sseln
Comment=Device verschl&uuml;sseln
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/gtc-cryptdevice\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
" >/usr/share/applications/gtc-cryptdevice.desktop

echo "[Desktop Entry]
Name=GTC Passwort von verschl&uuml;sseltem Speichermedium &auml;ndern
Comment=GTC Passwort von verschl&uuml;sseltem Speichermedium &auml;ndern
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/gtc-cryptdevice-chpass\"
Path=
Icon=avatar-default
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
" >/usr/share/applications/gtc-cryptdevice-chpass.desktop


echo "[Desktop Entry]
Name=Zippyshare DLC in Downloads
Comment=Decrypten und herunterladen von DLC-Dateien in Downloads mit plowdown
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/dlcdown.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Network;
" >/usr/share/applications/gtc-dlcdown.desktop

echo "[Desktop Entry]
Name=Download Video per URL
Comment=Herunterladen von Videos per youtube-dl per URL nach Downloads
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/youtube-dl.sh --proxy localhost:8118\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Network;
" >/usr/share/applications/gtc-youtube-dl.desktop

echo "[Desktop Entry]
Name=Download Video per URL ohne Tor
Comment=Herunterladen von Videos per youtube-dl per URL nach Downloads ohne Tor
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/youtube-dl.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Network;
" >/usr/share/applications/gtc-youtube-dl-wotor.desktop

echo "[Desktop Entry]
Name=Install/Update Nextcloud
Comment=Install/Update Nextcloud in docker container
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/docker-nextcloud.sh\"
Path=
Icon=/usr/share/icons/gabosh/nextcloud.ico
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;
" >/usr/share/applications/gtc-nextcloud.desktop

echo "[Desktop Entry]
Name=Install/Update Wordpress
Comment=Install/Update Wordpress in docker container
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/docker-wordpress.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;
" >/usr/share/applications/gtc-wordpress.desktop



echo "[Desktop Entry]
Name=Komprimiere Mediendateien
Comment=Komprimiere Videos, Audios, Bilder
Exec=mate-terminal --window --command=\"/etc/thinclient/scripts/media-compress.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;AudioVideo;Audio;Video;
" >/usr/share/applications/gtc-media-compress.desktop

echo "[Desktop Entry]
Name=Alfaview
Comment=Alfaview Conference Tool
Exec=/opt/alfaview/alfaview
Path=/opt/alfaview
Icon=/opt/alfaview/alfaview-Icon.jpg
Terminal=false
StartupNotify=false
Type=Application
Categories=Network;
" >/usr/share/applications/gtc-alfaview.desktop

# Netmount starts NetworkManager/Network whick should be startet by GTC-Scripts apfter Profile-Rollout
rc-update del netmount default 

# Damit Bildschirm entsperren geht
chmod u+s /sbin/unix_chkpwd

# Steam Lib links
ln -sf /usr/lib/libva.so /usr/lib/libva.so.1
ln -sf /usr/lib/libva-x11.so /usr/lib/libva-x11.so.1
ln -sf /usr/lib/libva-glx.so /usr/lib/libva-glx.so.1
ln -sf /usr/lib/libva-drm.so /usr/lib/libva-drm.so.1

# Apache
rm -f /etc/apache2/vhosts.d/00_default_*vhost.conf
rm -f /etc/apache2/vhosts.d/._cfg0000_00_default_*vhost.conf
ln -sf /usr/lib64/apache2 /usr/lib/apache2

# PXE
mkdir -p /gtc/pxe
cp -p /usr/share/syslinux/pxelinux.0 /gtc/pxe/
cp -p /usr/share/syslinux/menu.c32 /gtc/pxe/
cp -p /usr/share/syslinux/ldlinux.c32 /gtc/pxe
cp -p /usr/share/syslinux/libutil.c32 /gtc/pxe
ln -f /boot/kernel /gtc/pxe/kernel
ln -f /boot/initrd /gtc/pxe/initrd
mkdir -p /gtc/pxe/pxelinux.cfg
echo '
default menu.c32
prompt 0
	    
menu title GTC-PXELinux Boot Menu
NOESCAPE 1
ALLOWOPTIONS 1
MENU AUTOBOOT Starting GTC Linux in # seconds

label GTC
 timeout 100
 menu default
 menu label ^GTC Linux
 kernel /kernel
 append initrd=/initrd root=/dev/nfs nfsroot=XXX.XXX.XXX.XXX:/_gtcroot ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs raid=noautodetect consoleblank=0 clocksource=hpet
 ipappend 3

label bootlocal
 menu label ^Boot from local Disk
 localboot 0
' >/gtc/pxe/pxelinux.cfg/default


# Damit nicht &uuml;berall die Nvidia Incons im Startmen&uuml; sind
etc-update --automode -3 /usr/share/applications/nvidia-settings.desktop
etc-update --automode -7 /etc/xdg/autostart/blueman.desktop
mv /usr/share/applications/nvidia-settings.desktop /usr/share/applications/nvidia-settings.gtc-unused >/dev/null 2>&1

EOF

chmod 700 /gtc/$umg/root/Gentoo-GTC-Update.sh
tmux new-session -d -s "Gentoo-GTC-Update" "chroot /gtc/$umg /bin/bash -c /root/Gentoo-GTC-Update.sh ; /gtc/pxe/linkkernel.sh"


Changes in /gtc/test/etc/chromium/default

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/chromium/default

Changed on 29.06.20
Issued by olli
Beginning line 5

Default Start Options fpr Chromium


Before change
CHROMIUM_FLAGS=""
After change
CHROMIUM_FLAGS="--password-store=basic --ignore-gpu-blacklist --enable-gpu-rasterization --enable-zero-copy"

Changes in /gtc/test/etc/conf.d/apache2

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/apache2

Changed on 02.04.20
Issued by olli
Beginning line 36

Apache startoptions for enabling PHP5 and SSL


Before change
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
After change
APACHE2_OPTS="-D DAV -D DAV_FS -D PHP -D SSL -D LANGUAGE -D PROXY -D MPM_ITK -D AUTHNZ_EXTERNAL"

Changes in /gtc/test/etc/conf.d/dhcpd-tornet0

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/dhcpd-tornet0

Changed on 28.03.20
Issued by olli
Beginning line 1

Tor Net DHCP

DHCPD_CONF="/etc/dhcp/dhcpd-tornet0.conf"
DHCPD_IFACE="tornet0"

Changes in /gtc/test/etc/conf.d/dhcpd-vnet0

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/dhcpd-vnet0

Changed on 28.03.20
Issued by olli
Beginning line 1

Virtual Networking DHCP

DHCPD_CONF="/etc/dhcp/dhcpd-vnet0.conf"
DHCPD_IFACE="vnet0"

Changes in /gtc/test/etc/conf.d/display-manager

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/display-manager

Changed on 09.10.09
Issued by olli
Beginning line 10

Configure the Thinclient


Before change
DISPLAYMANAGER="xdm"
After change
DISPLAYMANAGER="lightdm"

Changes in /gtc/test/etc/conf.d/docker

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/docker

Changed on 28.03.20
Issued by olli
Beginning line 29

Docker Data Dir noch in RAMDISK

DOCKER_OPTS="-g /home/data/docker"

Changes in /gtc/test/etc/conf.d/hwclock

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/hwclock

Changed on 06.09.08
Issued by olli
Beginning line 5

Local Clock


Before change
clock="UTC"
After change
clock="local"

Changes in /gtc/test/etc/conf.d/in.tftpd

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/in.tftpd

Changed on 09.10.09
Issued by olli
Beginning line 15

Configure the Thinclient


Before change
INTFTPD_OPTS="-R 4096:32767 -s ${INTFTPD_PATH}"
After change
INTFTPD_PATH="/gtc/pxe"
INTFTPD_OPTS="-p -u nobody -s ${INTFTPD_PATH} -vvv"

Changes in /gtc/test/etc/conf.d/local

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/local

Changed on 09.10.09
Issued by olli
Beginning line 1

Allow console input/output in local-services

rc_verbose=yes

Changes in /gtc/test/etc/conf.d/net

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/net

Changed on 28.03.20
Issued by olli
Beginning line 1

Virtual Networking Bridge

bridge_vnet0=""
config_vnet0="XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX"
bridge_forward_delay_vnet0=0
bridge_hello_time_vnet0=1000
enable_ipv6_vnet0="false"
dad_timeout_vnet0=0

Changed on 28.03.20
Issued by olli
Beginning line 11

Bridge for transparent Tor Proxy

bridge_tornet0=""
config_tornet0="XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX"
bridge_forward_delay_tornet0=0
bridge_hello_time_tornet0=1000
enable_ipv6_tornet0="false"
dad_timeout_tornet0=0

Changes in /gtc/test/etc/conf.d/NetworkManager

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/NetworkManager

Changed on 11.01.18
Issued by olli
Beginning line 4

Configure the Thinclient Networkíng


Before change
INACTIVE_TIMEOUT=1
After change
INACTIVE_TIMEOUT=0
# ---
# /etc/conf.d/nfs

# If you wish to set the port numbers for lockd,
# please see /etc/sysctl.conf

# Optional services to include in default `/etc/init.d/nfs start`
# For NFSv4 users, you'll want to add "rpc.idmapd" here.
NFS_NEEDED_SERVICES="rpc.idmapd"

# Options to pass to rpc.nfsd
# before|||23.12.08|||olli|||Server for thinclients|||Allow a maximum of 20 Clients at the same time on your NFS Server
#OPTS_RPC_NFSD="8"
After change
OPTS_RPC_NFSD="-u 20"

Changes in /gtc/test/etc/conf.d/sshd

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/sshd

Changed on 28.11.12
Issued by olli
Beginning line 35

Do not start dhcp at boot

rc_need="!net"

Changes in /gtc/test/etc/conf.d/xdm

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/conf.d/xdm

Changed on 09.10.09
Issued by olli
Beginning line 10

Configure the Thinclient


Before change
DISPLAYMANAGER="xdm"
After change
DISPLAYMANAGER="lightdm"

Changes in /gtc/test/etc/crontab

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/crontab

Changed on 19.07.13
Issued by olli
Beginning line 18

System health checks

# Check Disk Usage
*/5 * * * *    root     [ -e /etc/thinclient/scripts/check-hdd.sh ] && /etc/thinclient/scripts/check-hdd.sh
30 * * * *     root	rm -rf /tmp/df-?d??
# Check Memory
*/5 * * * *    root     [ -e /etc/thinclient/scripts/check-mem.sh ] && /etc/thinclient/scripts/check-mem.sh
# Check Swap
*/5 * * * *    root     [ -e /etc/thinclient/scripts/check-swap.sh ] && /etc/thinclient/scripts/check-swap.sh
# Check temperature
*/5 * * * *    root     [ -e /etc/thinclient/scripts/check-temperature.sh ] && /etc/thinclient/scripts/check-temperature.sh
# Check time
*/5 * * * *    root     ntpdate -s 0.de.pool.ntp.org >/dev/null 2>&1 || ntpdate -s 1.de.pool.ntp.org >/dev/null 2>&1

Changes in /gtc/test/etc/default/btrfsmaintenance

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/default/btrfsmaintenance

Changed on 03.01.19
Issued by olli
Beginning line 7

Auto find btrfs-Volumes


Before change
BTRFS_LOG_OUTPUT="stdout"
After change
BTRFS_LOG_OUTPUT="syslog"

Changed on 03.01.19
Issued by olli
Beginning line 46

Auto find btrfs-Volumes


Before change
BTRFS_BALANCE_MOUNTPOINTS="/"
After change
BTRFS_BALANCE_MOUNTPOINTS="auto"

Changed on 03.01.19
Issued by olli
Beginning line 90

Auto find btrfs-Volumes


Before change
BTRFS_SCRUB_MOUNTPOINTS="/"
After change
BTRFS_SCRUB_MOUNTPOINTS="auto"

Changed on 03.01.19
Issued by olli
Beginning line 138

Auto find btrfs-Volumes


Before change
BTRFS_TRIM_MOUNTPOINTS="/"
After change
BTRFS_TRIM_MOUNTPOINTS="auto"

Changes in /gtc/test/etc/dhcpcd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/dhcpcd.conf

Changed on 30.10.09
Issued by after
Beginning line 50

Timeout for dhcpcd

timeout 20

Changes in /gtc/test/etc/dhcp/dhcpd-tornet0.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/dhcp/dhcpd-tornet0.conf

Changed on 28.03.20
Issued by olli
Beginning line 1

Tor Networking DHCP

option domain-name "tornet0";

default-lease-time 600;
max-lease-time 7200;

option subnet-mask XXX.XXX.XXX.XXX;
option broadcast-address XXX.XXX.XXX.XXX;
option domain-name-servers XXX.XXX.XXX.XXX;
option routers XXX.XXX.XXX.XXX;
default-lease-time 7200;
max-lease-time 14400;
ddns-update-style none;
subnet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX {
 range XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX;
}
next-server XXX.XXX.XXX.XXX;
option architecture-type code 93 = unsigned integer 16;
if option architecture-type = 00:09 {
filename "bootx64.efi";
} elsif option architecture-type = 00:07 {
 filename "bootx64.efi";
} else {
filename "pxelinux.0";
}

Changes in /gtc/test/etc/dhcp/dhcpd-vnet0.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/dhcp/dhcpd-vnet0.conf

Changed on 28.03.20
Issued by olli
Beginning line 1

Virtual Networking DHCP


Before change

 

Changes in /gtc/test/etc/etc-update.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/etc-update.conf

Changed on 28.03.20
Issued by olli
Beginning line 16

Automerge without asking


Before change
rm_opts="-i"
After change
rm_opts=""

Changes in /gtc/test/etc/exports

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/exports

Changed on 09.10.09
Issued by olli
Beginning line 2

Configure the Thinclient

/_gtcroot    XXX.XXX.XXX.XXX/XXX.XXX.XXX.XXX(fsid=1,no_subtree_check,async,no_root_squash,ro,insecure)

Changes in /gtc/test/etc/init.d/checkroot

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/init.d/checkroot

Changed on 19.03.10
Issued by olli
Beginning line 10

This stops remounting/mounting the root. Mounting stuff for is done in the initrd.

if cat /proc/cmdline | grep -i root=/dev/nfs >/dev/null
then
 exit 0
fi

Changes in /gtc/test/etc/init.d/procfs

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/init.d/procfs

Changed on 17.11.19
Issued by olli
Beginning line 27

Get rid of "binfmt-misc module needs to be loaded" message on boot


Before change
#		if ! grep -qs binfmt_misc /proc/filesystems &&
#			modprobe -q binfmt-misc; then
#			ewarn "The binfmt-misc module needs to be loaded by" \
#				"the modules service or built in."
#		fi
After change
#               if ! grep -qs binfmt_misc /proc/filesystems &&
#                       modprobe -q binfmt-misc; then
#                       ewarn "The binfmt-misc module needs to be loaded by" \
#                               "the modules service or built in."
#               fi

Changes in /gtc/test/etc/local.d/gtc.start

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/local.d/gtc.start

Changed on 09.10.09
Issued by olli
Beginning line 1

Configure the Thinclient

/etc/thinclient/startup/gtc-startupconfig 2>&1 | tee -a /var/log/thinclient.log
/etc/init.d/xdm zap >/dev/null 2>&1

Changes in /gtc/test/etc/local.d/gtc.stop

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/local.d/gtc.stop

Changed on 19.09.12
Issued by olli
Beginning line 2

Store Passwords and Mixer settings if the BGTC is local

#!/bin/bash
if mount | grep "/_gtcroot type nfs" >/dev/null
then
 echo "This GTC is network booted"
else
 echo "Savin printer settings"
 mkdir -p /_gtcroot/etc/thinclient/profiles/`hostname`/etc/cups
 [ -f /etc/cups/printers.conf ] && cp -p /etc/cups/printers.conf /_gtcroot/etc/thinclient/profiles/`hostname`/etc/cups/
 [ -d /etc/cups/ppd ] && cp -rp /etc/cups/ppd /_gtcroot/etc/thinclient/profiles/`hostname`/etc/cups/
 echo "Saving NetworkManager settings"
 mkdir -p /_gtcroot/etc/thinclient/profiles/`hostname`/etc/NetworkManager/
 rsync -aXAh --delete /etc/NetworkManager/ /_gtcroot/etc/thinclient/profiles/`hostname`/etc/NetworkManager/
 . /etc/thinclient/scripts/gtc-confs.sh
 mkdir -p /_gtcroot/etc/thinclient/profiles/`hostname`/local
 echo "Saving mixersettings"
 alsactl store -f /_gtcroot/etc/thinclient/profiles/`hostname`/local/mixersettings
 echo "Saving passwords"
 cat /etc/shadow | grep -a "^root" > /_gtcroot/etc/thinclient/profiles/`hostname`/local/shadow
 for LU in $LOCALUSER
 do
  cat -vT /etc/shadow | grep -a "^$LU" >> /_gtcroot/etc/thinclient/profiles/`hostname`/local/shadow
 done
 # sync
 sync
fi

Changes in /gtc/test/etc/modprobe.d/iwl4965.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/modprobe.d/iwl4965.conf

Changed on 09.10.09
Issued by olli
Beginning line 1

Speed UP WLAN

options iwl4965 swcrypto=1 11n_disable=1

Changes in /gtc/test/etc/modprobe.d/iwlagn.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/modprobe.d/iwlagn.conf

Changed on 09.10.09
Issued by olli
Beginning line 1

Speed UP WLAN


Before change
after 
options iwlagn swcrypto=1 11n_disable=1

Changes in /gtc/test/etc/modprobe.d/iwlwifi.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/modprobe.d/iwlwifi.conf

Changed on 09.10.09
Issued by olli
Beginning line 1

Speed UP WLAN

#options iwlwifi swcrypto=1
options iwlwifi 11n_disable=8
options iwlwifi bt_coex_active=0
#options iwlwifi led_mode=2

Changes in /gtc/test/etc/modprobe.d/snd-hda-intel.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/modprobe.d/snd-hda-intel.conf

Changed on 09.10.09
Issued by olli
Beginning line 1

ThinkPad Sound

options snd_hda_intel model=thinkpad

Changes in /gtc/test/etc/NetworkManager/nm-system-settings.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/NetworkManager/nm-system-settings.conf

Changed on 28.03.20
Issued by olli
Beginning line 1

Ignore vnet0 by NetworkManager

[keyfile]
unmanaged-devices=interface-name:vnet0;interface-name:tornet0

Changes in /gtc/test/etc/pam.d/login

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/pam.d/login

Changed on 03.01.19
Issued by olli
Beginning line 6

Start gnome-keyring-daemon at login

session    optional     pam_gnome_keyring.so        auto_start
auth       optional     pam_gnome_keyring.so

Changes in /gtc/test/etc/postfix/main.cf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/postfix/main.cf

Changed on 02.07.12
Issued by olli
Beginning line 681

Mailsettings

inet_protocols = ipv4
myorigin = $myhostname
mydestination =
mynetworks_style = subnet
smtpd_relay_restrictions = permit_mynetworks, defer
relay_domains = $myhostname
relayhost = $mydomain
local_recipient_maps =
inet_interfaces = all
local_transport = error:local delivery is disabled

Changes in /gtc/test/etc/profile

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/profile

Changed on 09.10.09
Issued by olli
Beginning line 19

All in group should have gegerally rwx permission others none


Before change
umask 022
After change
umask 007
if [ "$EUID" -eq 0 ]
then
 umask 022
fi

Changes in /gtc/test/etc/ssh/ssh_config

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/ssh/ssh_config

Changed on 05.01.09
Issued by olli
Beginning line 54

Some SSH security settings

## Ciphers Check https://sshcheck.com/server/example.com/8081
KexAlgorithms curve25519-sha256@libssh.org
HostKeyAlgorithms ssh-ed25519
Ciphers chacha20-poly1305@openssh.com,aes256mail@example.com,aes128mail@example.com
MACs hmac-sha2-512mail@example.com,hmac-sha2-256mail@example.com,umac-128mail@example.com

Changes in /gtc/test/etc/ssh/sshd_config

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /gtc/test/etc/ssh/sshd_config

Changed on 05.01.09
Issued by olli
Beginning line 124

Some SSH security settings

# Ciphers Check https://sshcheck.com/server/
# nmap -p22 -n -sV --script ssh2-enum-algos localhost
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
HostKeyAlgorithms ssh-ed25519
Ciphers chacha20-poly1305@openssh.com,aes256mail@example.com,aes128mail@example.com
MACs hmac-sha2-512mail@example.com,hmac-sha2-256mail@example.com,umac-128mail@example.com
PermitRootLogin yes

Changes in /gtc/test/etc/sysctl.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/sysctl.conf

Changed on 06.09.08
Issued by olli
Beginning line 62

Network Optimazions for SSHFS/NFS

net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

Changed on 28.03.20
Issued by olli
Beginning line 72

Virtual Networking Routing

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.ip_dynaddr = 1

Changes in /gtc/test/etc/thinclient/scripts/check-hdd.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-x---

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/check-hdd.sh

Changed on 19.07.13
Issued by olli
Beginning line 1

Cron-Check Script for disk usage

#!/bin/bash
df -l /dev/?d?? 2>/dev/null | grep "^/dev/" | perl -pe 's/[ \%]+/ /g' | cut -d" " -f1,5 2>/dev/null | while read i
do  
 disk=`echo $i | cut -d" " -f1 | cut -d"/" -f3`
 usa=`echo $i | cut -d" " -f2`
 lock="/tmp/df-$disk"
 if [ $usa -gt 95 ]
 then
  if [ -f $lock ]
  then 
   date >>$lock
  else 
   echo -e "Disk usage $disk at $usa%:\n`df -l /dev/?d?? | grep $usa\%`\n\n `ps aux`\n\n`free -m`" | mail -s "`hostname`: Disk usage $disk at $usa% - CRITICAL" `ls -1 /home/ | egrep -v 'lost.found|man|data'| while read m; do echo -n $m,; done`root
   date >$lock
  fi
 else 
  if [ -f $lock ]
  then 
   echo -e "Disk usage $disk at $usa%:\n`cat $lock`" | mail -s "`hostname`: Disk usage $disk at $usa% - OK" `ls -1 /home/ | egrep -v 'lost.found|man|data' | while read m; do echo -n $m,; done`root
   rm -f $lock
  fi
 fi
done

Changes in /gtc/test/etc/thinclient/scripts/check-mem.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-x---

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/check-mem.sh

Changed on 19.07.13
Issued by olli
Beginning line 2

Cron Check script for memory usage

#!/bin/bash
mem=`free -m | grep "^Mem:" | perl -pe 's/[ ]+/ /g' | cut -d" " -f 6`
if [ $mem -lt 32 ]
then 
 if [ -f "/tmp/memlow" ]
 then
  echo "`date` --> $mem" >>/tmp/memlow
 else
  echo -e "Free Mem low ($mem MB):\n`free -m`\n\n`ps aux`" | mail -s "`hostname`: Free mem low ($mem MB)" `ls -1 /home/ | egrep -v 'lost.found|man|data' | while read m; do echo -n $m,; done`root 
  echo "`date` --> $mem" >>/tmp/memlow
 fi
else
 rm -f /tmp/memlow
fi


Changes in /gtc/test/etc/thinclient/scripts/check-swap.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-x---

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/check-swap.sh

Changed on 19.07.13
Issued by olli
Beginning line 2

Cron Check script for swap usage

#!/bin/bash
blkid | grep GTCSWAP >/dev/null || exit 0
if [ `free -m | grep "^Swap:" | perl -pe 's/[ ]+/ /g' | cut -d" " -f 4` -lt 64 ]
then 
 echo -e "Free Swap low:\n`free -m`\n\n`ps aux`" | mail -s "`hostname`: Free swap low (under 256MB)" `ls -1 /home/ | egrep -v 'lost.found|man|data' | while read m; do echo -n $m,; done`root
fi

Changes in /gtc/test/etc/thinclient/scripts/check-temperature.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-x---

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/check-temperature.sh

Changed on 19.07.13
Issued by olli
Beginning line 2

Cron Check script for system temperature sensors

#!/bin/bash
ls -1 /sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_input >/dev/null 2>&1 || exit 0
for sensor in `ls -1 /sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_input`
do
 sens=`basename $sensor`
 if [ `cat $sensor` -gt 85000 ]
 then
  sleep 300
  if [ `cat $sensor` -gt 85000 ]
  then
   if [ -f /tmp/sensor-$sens ]
   then 
    date >>/tmp/sensor-$sens
   else 
    let temp=`cat $sensor`/1000
    echo -e "Temperature of $sens up to $temp degree Centigrade...\n\n`sensors`\n\n`ps aux`\n\n`free -m`\n\n`df -lh | cat -vT `" | cat -vT | mail -s "`hostname`: Temperature up to $temp degree Centigrade" `ls -1 /home/ | egrep -v 'lost.found|man|data' | while read m; do echo -n $m,; done`root
   date >/tmp/sensor-$sens
   fi
  fi
 else 
  if [ -f /tmp/sensor-$sens ]
  then 
   let temp=`cat $sensor`/1000
   echo -e "Temperature OK - $temp degree Centigrade...\n\n`cat /tmp/sensor-$sens`" | mail -s "`hostname`: Temperature OK again $temp" `ls -1 /home/ | egrep -v 'lost.found|man|data' | while read m; do echo -n $m,; done`root
   rm -f /tmp/sensor-$sens
  fi
 fi
done

Changes in /gtc/test/etc/thinclient/scripts/gtc-additional-sw-add

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-additional-sw-add

Changed on 15.02.10
Issued by olli
Beginning line 2

This script installs additional/optional software defined in the thinclient.conf[.local]

#!/bin/bash

# Insert make.conf
source /etc/portage/make.conf

source /etc/thinclient/scripts/gtc-confs.sh

if [ -z "$PACKAGES" ] 
then
 echo "No PACKAGES to install!"
 exit 0
fi

# Mount proc for compiling
mount -t proc proc /proc 2>/dev/null 



# Create /_additionalsw-Dir and remove possible old DB entries
if [ ! -d /_additionalsw ] 
then 
 mkdir -p /_additionalsw
 chmod 0755 /_additionalsw
 for i in `echo $PACKAGES`
 do
  if [ -d /var/db/pkg/$i* ]
  then
   rm -r /var/db/pkg/$i*
  fi
 done
fi

# Link package database
if [ ! -L /_additionalsw/var/db/pkg ]
then
 mkdir -p /_additionalsw/var/db/
 ln -sf /var/db/pkg /_additionalsw/var/db/pkg
fi
mkdir -p /_additionalsw/var/cache/edb
ln -sf /var/cache/edb/counter /_additionalsw/var/cache/edb/counter

# Optionally source a user defined script for doing things before emerge
if [ -f "/etc/gtc-preupdate.sh" ]
then
 . /etc/gtc-preupdate.sh
fi

# Install the packages in an other root
KERNEL_DIR="/usr/src/linux" ACCEPT_LICENSE="*" ROOT="/_additionalsw" emerge -uq --keep-going --config-root=/ $PACKAGES

# Remove probably old links
echo "Searching for old /_additionalsw-SymLinks"
for i in `find / -xdev -type l -printf "%h/%f;%l\n" | grep ";/_additionalsw/" | cut -d";" -f1`
do
 echo "Removing old /_additionalsw-SymLink $i"
 rm -f $i
done

# Search for nonexisting directories
find /_additionalsw -type d | sed 's/^\/_additionalsw//' | while read i
do
 if [ ! -e "$i" ]
 then
  echo "Linking Directory $i"
  ln -s "/_additionalsw$i" "$i"
 fi
done

# Search for nonexisting files
find /_additionalsw -type f | sed 's/^\/_additionalsw//' | while read i
do
 if [ ! -e "$i" ]
 then
  echo "Linking File $i"
  ln -s "/_additionalsw$i" "$i"
 fi
done

# Search for nonexisting links
find /_additionalsw -type l | sed 's/^\/_additionalsw//' | while read i
do
 if [ ! -e "$i" ]
 then
  echo "Linking Link $i"
  ln -s "/_additionalsw/$i" "$i"
 fi
done

echo "Running some environment-updates"
env-update
source /etc/profile
depmod -a
ldconfig

echo "Putting the packages into the world-file"
ACCEPT_LICENSE="*" emerge -nq $PACKAGES

echo "

The following packages have been linked in: $PACKAGES"


Changes in /gtc/test/etc/thinclient/scripts/gtc-additional-sw-del

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-additional-sw-del

Changed on 15.02.10
Issued by olli
Beginning line 2

This script deletes all additional/optional installed software


Before change
#!/bin/bash

source /etc/thinclient/scripts/gtc-confs.sh

[ -n $PACKAGES ] &&

if ! [ -z "$PACKAGES" ]
then
 echo "Cleaning world file"
 emerge --deselect $PACKAGES
 echo "Cleaning portage"
 emerge --depclean
fi

echo "Searching for /_additionalsw-SymLinks"
find / -xdev -type l -printf "%h/%f;%l\n" | grep ";/_additionalsw" | cut -d";" -f1 | while read i
do
 echo "Removing SymLink $i"
 rm -f "$i"
done

echo "Deleting /_additionalsw"
rm -rf /_additionalsw

Changes in /gtc/test/etc/thinclient/scripts/gtc-ieurl

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-ieurl

Changed on 21.11.09
Issued by olli
Beginning line 2

Script for starting Firefox with URLs/Links/Bookmarks/Favorites from the Internet Explorer (*.url-files)

#!/bin/bash
firefox `cat "$1" | grep "^URL" | cut -d"=" -f2`

Changes in /gtc/test/etc/thinclient/scripts/gtc-info

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-info

Changed on 02.12.10
Issued by olli
Beginning line 2

Script for collecting systeminformations. This maybe for supportmails.

#!/bin/bash
#
# Script for getting system informations:

echo '
set -x

# boot and hardware
cat /proc/cmdline
cat /proc/cpuinfo
dmesg -T
free -m
lspci
lsusb

# network
ifconfig -a
route -n
brctl show
brctl show | while read bridge
do 
 br=`echo $bridge | grep "8000\." | cut -d" " -f1`
 if [ -n "$br" ]
 then 
  brctl showstp $br
 fi
done

# tasks and user
who
ps aux

# time
ls -ld /etc/localtime
date

# hdds
mount
df -h
cat /proc/mounts

# logs
find /var/log -type f | grep -v emerge.log | while read log
do
 if file $log | grep text
 then
  ls -l $log
  cat $log
 fi
done

# configs
find /etc -type f | while read conf
do
 if file -b $conf | grep text
  then
  ls -l $conf
  cat $conf
 fi
done

' >/tmp/gtc-info
date=`date +%Y-%m-%d-%H-%M-%S`
sh /tmp/gtc-info > ~/gtc-info-$date-$$.log 2>&1

echo "Informations are in /root/gtc-info-*"

echo -n  "Please enter an eMail-Address to send the info: "
read mail
cat ~/gtc-info-$date-$$.log | mail -s "GTC-Info `hostname` $date-$$" $mail


Changes in /gtc/test/etc/thinclient/scripts/gtc-install

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-install

Changed on 08.11.10
Issued by olli
Beginning line 2

Userinteractive Installationscript for the GTC on a disk.

#!/bin/bash
echo "Welcome to the GTC installer!"

# Choosing a Disk
echo "
This will guide you through the installation on a local disk or USB device."
if blkid | grep 'LABEL="GTC"' >/dev/null
then
 if blkid | grep 'LABEL="GTCDATA"' >/dev/null
 then 
  if blkid | grep 'LABEL="GTCSWAP"' >/dev/null
  then
   gtcdisk=`blkid | grep 'LABEL="GTC"' | tail -n1 | cut -d ":" -f1` 
   gtcdata=`blkid | grep 'LABEL="GTCDATA"' | tail -n1 | cut -d ":" -f1`
   gtcswap=`blkid | grep 'LABEL="GTCSWAP"' | tail -n1 | cut -d ":" -f1`
   dev=`echo $gtcdisk | sed 's/[0-9]//g'`
   echo "Found Partition-Labels for the GTC-Partitions:
GTC-Systemdisk is $gtcdisk
GTC-Datadisk is $gtcdata
GTC-Swapdisk is $gtcswap
Shall we install/update on this partitions and overwrite the bootsector (MBR) on $dev? If yes please enter \"yes\""
   read partitions
  fi 
 fi
fi

if [ "$partitions" = "yes" ]
then
 umount -lf $gtcdata
 umount -lf $gtcdisk
 echo "Disks selected."
else
 echo "Here is a list of devices the GTC can be installed:
"
 fdisk -l | grep " /dev/" | egrep -v "t contain|ram"
 echo "
WARNING: ALL DATA ON THE DISK YOU CHOOSE WILL BE DELETED!!!!
Please enter the devicname name e.g. /dev/sdb you want to install the GTC."
 echo "Device: "
 read dev
 dev=`echo $dev | sed 's/^\/dev\///'`
 dev="/dev/$dev"
 if cat /proc/mounts | grep $dev
 then
  echo "
$dev is already mounted - Cannot install on a mounted disk"
  exit 1
 fi

 if [ -b "$dev" ] 
 then
  echo "WARNING: ALL DATA ON $dev WILL BE DELETED!!!!"
  echo "If you are absolutely sure you want to delete all data in $dev and install the GTC in it enter \"yes\": "
  read sure
  if [ "$sure" = "yes" ]
  then
   echo "OK, so let's install GTC on $dev!"
  else
   echo "Installation canceld!"
   exit 1
  fi
 else
  echo "$dev does not exist or is not a valid block device!"
  exit 1
 fi
fi

for i in `cat /proc/mounts | grep $dev | cut -d" " -f1` 
do
 echo "
 $i is already mounted - Umounting..."
 umount -lf $i
done


# Choosing the systems role
echo "

What system role do you want to install?

- Server (A Server for the Gentoo ThinClients)
- Live (A Livesystem e.g.: for testing the GTC)
- Profile (A System with a specified profile)

Please enter Server, Profile or Live: "
read role
if echo "$role" | grep -i "^s"
then
 inst="gtc-srvinst"
elif echo "$role" | grep -i "^p"
then
 inst="gtc-profileinst"
elif  echo "$role" | grep -i "^l"
then
 inst="gtc-liveinst"
else
 echo "No valid role entered!"
 exit 1
fi
inst="/etc/thinclient/scripts/$inst"

if [ "$partitions" = "yes" ]
then
 $inst $gtcdisk $dev
else
 # Create a partition and a filesystem
 echo "Preparing $dev"
 echo "Creating partitions on $dev"
 sfdisk --delete $dev
 sfdisk $dev <<__EOF__
2048,81140000,L
,2480000,S
,,L
__EOF__
 sleep 5
 echo "Setting bootable flag on ${dev}1"
 sfdisk -A ${dev} 1
 sleep 5
 echo "Formating partitions on $dev"
 mkfs.ext4 -m1 -F -L "GTC" ${dev}1 || exit 1
 mkswap ${dev}2 -f -L "GTCSWAP" || exit 1
 mkfs.ext4 -m1 -F -L "GTCDATA" ${dev}3 || exit 1
 
 # Start installation
 echo "Starting the installation"
 $inst ${dev}1 $dev
fi

Changes in /gtc/test/etc/thinclient/scripts/gtc-mkiso

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-mkiso

Changed on 08.11.09
Issued by olli
Beginning line 2

Script for creating the GTC DVD-Image

#!/bin/bash
rm -rf /gtcdvd
mkdir -p /gtcdvd/boot
KERN=`basename \`ls -tr1 /boot/kernel-genkernel-* | tail -n1\``
INITRD=`basename \`ls -tr1 /boot/initramfs-genkernel-* | tail -n1\``
cp /boot/$KERN /gtcdvd/boot/kernel
cp /boot/$INITRD /gtcdvd/boot/initrd
cp /usr/share/syslinux/isolinux.bin /gtcdvd/
cp /usr/share/syslinux/menu.c32 /gtcdvd/

version=`head /etc/thinclient/gtc-release-notes -n1 | cut -d" " -f2`

echo "default menu.c32
prompt 0
menu title GTC LiveDVD $version
ALLOWOPTIONS 1
MENU AUTOBOOT Starting GTC DVD in # seconds

label GTC-$KERN
 menu label ^GTC - Livesystem - $version
 timeout 150
 kernel /boot/kernel
 append initrd=/boot/initrd ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs gtcdvd dokeymap i915.modeset=1 radeon.modeset=1

label GTC-$KERN
 menu label ^GTC - Server with XXX.XXX.XXX.XXX/24 - $version
 kernel /boot/kernel
 append initrd=/boot/initrd ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs gtcdvd gtcserver i915.modeset=1 radeon.modeset=1 dokeymap ip=XXX.XXX.XXX.XXX:XXX.XXX.XXX.XXX:XXX.XXX.XXX.XXX:XXX.XXX.XXX.XXX BOOTIF=eth


label GTC-$KERN
 menu label ^GTC - Installation - $version
 kernel /boot/kernel
 append initrd=/boot/initrd ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs gtcdvd gtcinstall dokeymap i915.modeset=1 radeon.modeset=1
" > /gtcdvd/isolinux.cfg

if [ -d "/_gtcroot" ]
then
 echo "Using /_gtcroot"
else
 mkdir -p /_gtcroot 
 mount --bind / /_gtcroot
fi
cp /etc/thinclient/gtc-release-notes /gtcdvd/`date +%Y%m%d`
mksquashfs /_gtcroot/ /gtcdvd/gtc -e gtcdvd.iso -e gtcdvd -e _gtcroot -e etc/thinclient/profiles -e _additionalsw -e usr/portage/distfiles -e usr/src -e etc/thinclient/thinclient.conf.local
umount /_gtcroot 2>/dev/null ; rmdir /_gtcroot 2>/dev/null

mkisofs -R -V "GTC DVD" -o /gtcdvd.iso -b isolinux.bin -c boot.catalog -no-emul-boot -boot-load-size 4 -boot-info-table /gtcdvd/

Changes in /gtc/test/etc/thinclient/scripts/gtc-update

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-update

Changed on 08.12.09
Issued by olli
Beginning line 2

GTC-Systemupdate Update script

#!/bin/bash

if mount | grep -q "/_gtcroot type nfs"
then
 echo "No update on an NFS-Client possible!"
 exit 1
fi

if ! mount | grep -q /_gtcroot
then 
 echo "No GTC System"
 exit 1
fi

find /_gtcroot/update-down -mtime +3 -exec rm -f {} \; >/dev/null 2>&1

. /etc/thinclient/scripts/gtc-confs.sh
if [ "$UPDATECHANNEL" = "test" ]
then
 chan="-test"
 echo "WARNING: Using Test-Channel"
fi

rm -rf /var/log/emerge.log /var/log/portage
for syncpath in /etc/thinclient/scripts /etc/thinclient/share
do
 until RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --timeout=300 rsync://mail@example.com/thinclient$chan/$syncpath/ /$syncpath/
 do
  echo "!!! ERROR downloading System-Update Update - Retrying in 30 seconds"
  sleep 30
 done
 rsync -aH /$syncpath/ /_gtcroot/$syncpath/
done
cat /etc/thinclient/scripts/gaboshlib.include >/etc/bash/gaboshlib.include

RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --delete --timeout=300 rsync://mail@example.com/thinclient$chan/etc/thinclient/login/ /_gtcroot/etc/thinclient/login/
RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --timeout=300 rsync://mail@example.com/thinclient$chan/etc/thinclient/startup/ /_gtcroot/etc/thinclient/startup/
RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --timeout=300 rsync://mail@example.com/thinclient$chan/etc/local.d/ /_gtcroot/etc/local.d/
RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --timeout=300 rsync://mail@example.com/thinclient$chan/etc/bash/ /_gtcroot/etc/bash/
rsync -aH /_gtcroot/etc/local.d/ /etc/local.d/
rsync -aH /_gtcroot/etc/bash/ /etc/bash/

until RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --timeout=300 rsync://mail@example.com/thinclient$chan/etc/thinclient/gtc-release-notes /etc/thinclient/gtc-release-notes-new
do
 echo "!!! ERROR downloading GTC Release-Information - Retrying"
 sleep 30
done
if [ "`cat /_gtcroot/etc/thinclient/gtc-release-notes | head -n1`" = "`cat /etc/thinclient/gtc-release-notes-new | head -n1`" ]
then
 echo "No Update from `cat /etc/thinclient/gtc-release-notes | head -n1` available"
 exit 0
else
 echo "Updateing from `cat /etc/thinclient/gtc-release-notes | head -n1` to `cat /etc/thinclient/gtc-release-notes-new | head -n1`"
fi

sync
echo ">>> System-Update Update successfully finished"

sh /etc/thinclient/scripts/gtc-update-fetch


Changes in /gtc/test/etc/thinclient/scripts/gtc-update-post

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-update-post

Changed on 02.01.12
Issued by olli
Beginning line 2

GTC-Systemupdate Update script

#!/bin/bash

if mount | grep "/_gtcroot type nfs"
then
 echo "No update on an NFS-Client possible!"
 exit 1
fi

. /etc/thinclient/scripts/gtc-confs.sh

if [ "$UPDATECHANNEL" = "test" ]
then
 chan="-test"
fi

# Resync unimportant parts
mkdir -p /_gtcroot/usr/portage /_gtcroot/opt
echo ">>> Resyncing /opt"
RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --info=progress2 --no-i-r -h --timeout=300 --contimeout=300 --delete --numeric-ids rsync://mail@example.com/thinclient$chan/opt/ /_gtcroot/opt/
echo ">>> Resyncing /usr/portage"
RSYNC_PASSWORD="UHexWfBzJjCfwgwTUaUPN2ryYmXIp92j" rsync -aH --info=progress2 --no-i-r -h --timeout=300 --contimeout=300 --delete --numeric-ids --exclude=.tmp* --exclude=distfiles rsync://mail@example.com/thinclient$chan/usr/portage/ /_gtcroot/usr/portage/

echo ">>> Renewing additional Software"
mkdir -p /_gtcroot/proc /_gtcroot/dev
cp -p /etc/resolv.conf /_gtcroot/etc/resolv.conf
mount -t devtmpfs udev /_gtcroot/dev
mount -t proc proc /_gtcroot/proc
chroot /_gtcroot /bin/bash -c "env-update &>/dev/null && source /etc/profile && gtc-additional-sw-del ; gtc-additional-sw-add"
sudo umount /_gtcroot/dev /_gtcroot/proc

# Remove unwanted Software
if [ "$SWPROFILE" == "binredisonly" ]
then
 /etc/thinclient/scripts/gtc-binredisonly
fi

if [ "$SWPROFILE" == "ossonly" ]
then
 /etc/thinclient/scripts/gtc-ossonly
fi

if lspci | egrep -q "NVIDIA.+G86M"
then
 /etc/thinclient/scripts/gtc-nvidia-legacy-driver
fi

if lspci | egrep -q "NVIDIA"
then
 echo 'modules="nvidia nvidia-drm"' >>/_gtcroot/etc/conf.d/modules
fi

if ! grep -q "RAM Test" /boot/grub/grub.cfg
then
 g_boot=$(grep "set uuid_root" /boot/grub/grub.cfg | head -n1)
 echo "
menuentry 'RAM Test' {
$g_boot
	search --no-floppy --fs-uuid \$uuid_root --set=root
        set root=\$root
	linux16 /boot/memtest86plus/memtest.bin
}
" >>/_gtcroot/boot/grub/grub.cfg
fi


sync

echo "

Update is finished!!! System will reboot now...

"

sleep 10
reboot


Changes in /gtc/test/etc/thinclient/startup/gtc-startupconfig

File permissions:
Owner: root
Group: root
Permissions: -r-x------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/gtc-startupconfig

Changed on 27.10.09
Issued by olli
Beginning line 21

This runs all the scripts for configuring global and individual settings for all thinclients..

g_echo_ok "Loading VirtualBox modules"
modprobe vboxdrv >/dev/null 2>&1
modprobe vboxnetadp >/dev/null 2>&1
modprobe vboxnetflt >/dev/null 2>&1
modprobe vboxpci >/dev/null 2>&1

# Swappiness
echo 10 >/proc/sys/vm/swappiness

# Disable ipv6 for bridges (parameter in /etc/conf.d/net doesn't work)
echo 1 >/proc/sys/net/ipv6/conf/vnet0/disable_ipv6
echo 1 >/proc/sys/net/ipv6/conf/tornet0/disable_ipv6

#g_echo_ok "Loading snd-pcm-oss module for getting /dev/dsp i.e. for old games"
##modprobe snd-pcm-oss 2>/dev/null
#
#g_echo_ok "Loading snd_seq module needed e.g. by dosbox"
#modprobe snd_seq

g_echo_ok "Loading new microcode e.g. because of Spectre/Meltdown"
[ -e /sys/devices/system/cpu/microcode/reload ] && echo 1 > /sys/devices/system/cpu/microcode/reload

g_echo_ok "Disabling power_save of wlan0 if present"
iw dev wlan0 set power_save off >/dev/null 2>&1

g_echo_ok "Enabling ip_forward for network routing of spectial networks like vlan0 or tornet0"
echo 1 > /proc/sys/net/ipv4/ip_forward

g_echo_ok "Creating /dev/dvd,cdrom,cdrecorder Symlinks needed by some apps like xine"
ln -sf /dev/sr0 /dev/dvd
ln -sf /dev/sr0 /dev/cdrom
ln -sf /dev/sr0 /dev/cdrecorder

g_echo_ok "Setting rights of /"
chmod 755 /

g_echo_ok "Linking GTC-Profile"
ln -s /_gtcroot/etc/thinclient/profiles/`hostname` /etc/current-gtc-profile

# No log send?
if [ -f /etc/thinclient/profiles/`hostname`/local/send-no-log ] 
then
 g_echo_ok "Disabling Sending of Logs"
 if [ -f /_gtcroot/etc/rsyslog.d/00-gtc.conf ]
 then
  rm -f /_gtcroot/etc/rsyslog.d/00-gtc.conf
  /etc/init.d/rsyslog restart
 fi
fi

g_echo_ok "Pipe Xorg log to syslog"
touch /var/log/Xorg.0.log
chown root:root /var/log/Xorg.0.log
chmod 644 /var/log/Xorg.0.log
echo 'tail -F /var/log/Xorg.0.log | logger -i -t "Xorg"' | at now >/dev/null 2>&1 

g_echo_ok "Disabling console blanking"
setterm -blank 0

g_echo_ok "Cleaning up sudo-io logs"
rm -rf /var/log/sudo-io/*

g_echo_ok "Reset AccountsService"
rm -f /var/lib/AccountsService/users/*

g_echo_ok "Mounting GTCDATA and GTCSWAP-Partitions"
mkdir -p /srv
mount LABEL=GTCDATA /srv >/dev/null 2>&1 || rmdir /srv
swapon LABEL=GTCSWAP >/dev/null 2>&1

### GTC-Server?
#if [ -d /srv/config ]
#then
# rsync -a --exclude=thinclient.conf.local --exclude=profiles --exclude=global-profile --delete /etc/thinclient/ /srv/config/
# mount -B /srv/config /etc/thinclient
#fi
#if [ -d /srv/profiles ]
#then
# mount -B /srv/profiles /etc/thinclient/profiles
#fi
#if [ -d /srv/global-profile ]
#then
# mount -B /srv/global-profile /etc/thinclient/global-profile
#fi

#g_echo_ok "Adding `hostname` to /etc/hosts"
#echo "127.0.0.1 `hostname`" >>/etc/hosts
. /etc/thinclient/scripts/gtc-confs.sh

g_echo_ok "Create smb.conf needed by cups in some cases"
touch /etc/samba/smb.conf

# Check for enabled Debug-Mode
if [ $DEBUG == "yes" ]
then
 g_echo_warn "Enabling Debug output"
 set -x
fi

g_echo_ok "Enable wheel group for sudo to root"
echo '%wheel	ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

g_echo_ok "Creating user(s)"
if [ -z "$LOCALUSER" ]
then
 g_echo "Creating no local User"
else
 for LU in $LOCALUSER
 do
  g_echo_ok "Creating user $LU"
  cp -p /etc/shadow /etc/shadow.bak
  useradd -g users -G wheel,root -d /home/$LU $LU 2>&1 | egrep -vi 'already exists|Not copying any file from skel directory into it'
  for grp in docker games sambashare wheel root audio video cdrom vboxusers cdrw usb disk lpadmin lp scanner sys adm floppy plugdev dialout libvirt
  do
   usermod -aG $grp $LU
  done
  if grep -q -a "^$LU" /etc/thinclient/profiles/`hostname`/local/shadow
  then
   if [ -f /etc/thinclient/profiles/`hostname`/local/shadow ]
   then
    g_echo_ok "Restoring $LU password"
    grep -a "^$LU" /etc/thinclient/profiles/`hostname`/local/shadow > /etc/shadow2
    cat -vT /etc/shadow | grep -a -v "^$LU" >> /etc/shadow2
    mv /etc/shadow2 /etc/shadow
    chmod 0600 /etc/shadow
   fi
  else
   g_echo_ok "Setting $LU password to default gtc"
   echo $LU:GTCL1nux | chpasswd
  fi
  if ! [ -d /home/$LU ]
  then
   g_echo_ok "Creating homedir for $LU"
   mkdir -p /home/$LU
   chown $LU:users /home/$LU
   chmod 0700 /home/$LU
  fi
 done
 if [ -f /etc/thinclient/profiles/`hostname`/local/shadow ]
 then
  if grep -q -a "^root" /etc/thinclient/profiles/`hostname`/local/shadow
  then
   g_echo_ok "Restoring root password"
   grep -a "^root" /etc/thinclient/profiles/`hostname`/local/shadow > /etc/shadow2
   cat -vT /etc/shadow |  grep -a -v "^root" >> /etc/shadow2
   mv /etc/shadow2 /etc/shadow
    chmod 0600 /etc/shadow
  else
   echo root:GTCL1nux | chpasswd
  fi
 fi
fi

# If this is a local GTC
if mount | grep "/_gtcroot type nfs" >/dev/null
then
 g_echo_ok "This GTC seems to be network booted - doing network jobs"
 g_echo_ok "NET: Disabling network and loop uounts and remount,ro during shutdown which may cause hangs"
 echo '
stop()
{
 return 0
}
' >> /etc/init.d/localmount
 cat /etc/init.d/localmount >>/etc/init.d/netmount
 # No remount,ro while shutdown:
 echo "#!/bin/bash
exit 0
" > /etc/init.d/mount-ro
else
 g_echo_ok "This GTC seems to be local booted - doing local jobs"
 g_echo_ok "LOCAL: Creating Update Switch button depending on actual update channel"
 if [ $UPDATECHANNEL = "test" ]
 then
  echo "[Desktop Entry]
Name=GTC Update von stable-Kanal
Comment=GTC Update von stable-Kanal
Exec=mate-terminal --window --command=\"sudo /etc/thinclient/scripts/gtc-update-switch-test-stable.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-update-switch-test-stable.desktop
  else
  echo "[Desktop Entry]
Name=GTC Update von test-Kanal
Comment=GTC Update von test-Kanal
Exec=mate-terminal --window --command=\"sudo /etc/thinclient/scripts/gtc-update-switch-test-stable.sh\"
Path=
Icon=/usr/share/icons/gabosh/linux.png
Terminal=false
StartupNotify=false
Type=Application
Categories=GTC;Core;Utility;
">/usr/share/applications/gtc-update-switch-test-stable.desktop
 fi
 g_echo_ok "LOCAL: Starting Firewall (UFW)"
 /etc/init.d/ufw start
 # Restore mixer settings
 if [ -f /etc/thinclient/profiles/`hostname`/local/mixersettings ]
 then
  g_echo_ok "LOCAL: Restoring Mixer settings"
  alsactl restore -f /etc/thinclient/profiles/`hostname`/local/mixersettings || rm -f /_gtcroot/etc/thinclient/profiles/`hostname`/local/mixersettings
 fi
 g_echo_ok "LOCAL: Use homedirs from disk"
 mount --bind /_gtcroot/root /root
 mkdir -p /srv/home /home
 mount --bind /srv/home /home
 g_echo_ok "LOCAL: Storing SSH keys"
 mkdir -p /_gtcroot/etc/thinclient/profiles/`hostname`/etc/ssh
 cp -p /etc/ssh/*_key* /_gtcroot/etc/thinclient/profiles/`hostname`/etc/ssh/
 g_echo_ok "LOCAL: Copying this profiles thinclient.conf to default-profile for PXE boots"
 cat /_gtcroot/etc/thinclient/profiles/`hostname`/thinclient.conf >/_gtcroot/etc/thinclient/default-profile/thinclient.conf
 echo "LOCALUSER=gtc" >>/_gtcroot/etc/thinclient/default-profile/thinclient.conf
fi

## Now in initrd?
#g_echo_ok  "====== Loading global profile ====="
## Sync global profile
#rsync -a$RSYNC_OPT /etc/thinclient/global-profile/etc/ /etc/

## Now in initrd?
#if [ -d "/etc/thinclient/profiles/`hostname`/etc" ]
#then
# g_echo_ok "====== Loading individual profile ====="
# rsync -a$RSYNC_OPT /etc/thinclient/profiles/`hostname`/etc/ /etc/
#fi

## Now in default runlevel becaus profile in initrd
#for service in rsyslog nscd haveged acpid sshd
#do
# g_echo_ok "Starting service $service"
# /etc/init.d/$service start >/dev/null 2>&1
#done

# Now in initrd 5 default runlevel
if ! ps ax | grep -v grep | grep -q NetworkManager
then
# Local Network?
if ! mount | grep "/_gtcroot type nfs" >/dev/null
then
 echo -e "\n==============================\nLoading Network Manager\n==============================\n"
 # NetworkManager
 iw dev wlan0 set power_save off >/dev/null 2>&1
 find /etc/thinclient/profiles/*/etc/NetworkManager/system-connections -type f ! -name '\.*' ! -iname "GTC*" ! -empty | while read netfile
 do
  if egrep -q "^ssid|^psk" "$netfile"
  then
   bnetfile=`basename $netfile`
   egrep -v "^mac-address=" "$netfile" >"/etc/NetworkManager/system-connections/$bnetfile" 2>/dev/null
  fi
 done
 sed -i 's/^permissions=.*/permissions=/;' /etc/NetworkManager/system-connections/*
 fdupes -q -d -N /etc/NetworkManager/system-connections
 chmod 600 /etc/NetworkManager/system-connections/*
 /etc/init.d/NetworkManager start 2>&1 | egrep -iv '\.pid.: No such file or directory|dispatcher'
fi
fi
#sleep 5

if lsmod | grep -q bluetooth
then
 echo '[Desktop Entry]
Name=Blueman Applet
Name[de]=Blueman Applet
Comment=Blueman Bluetooth Manager
Comment[de]=Blueman Bluetooth Manager
Icon=blueman
Exec=blueman-applet
Terminal=false
Type=Application
Categories=' >/etc/xdg/autostart/blueman.desktop
 chmod 644 /etc/xdg/autostart/blueman.desktop
fi

for i in `find /etc/thinclient/startup/jobs/ -type f | sort`
do
 g_echo_ok "Running $i"
 . $i
done

Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-anonproxy

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-anonproxy

Changed on 30.10.09
Issued by olli
Beginning line 2

Start Privoxy/Tor Services

#!/bin/bash
if [ $ANONPROXY == "yes" ]
then
 echo '
listen-address  0.0.0.0:3128
forward-socks5t / 127.0.0.1:9050 .
' >> /etc/privoxy/config
 echo 'User tor
PIDFile /var/run/tor/tor.pid
Log notice syslog
DataDirectory /var/lib/tor/data
BridgeRelay 0
SOCKSPort 0.0.0.0:9050
ExitPolicy reject *:*
ControlPort 9051
HashedControlPassword 16:F7222A0CBC254E536056DCBBD27A7D051D68BCF1E9020681C0A3656B84
# Seting up TOR transparent proxy for tor-router
VirtualAddrNetwork XXX.XXX.XXX.XXX/10
AutomapHostsOnResolve 1
TransPort 0.0.0.0:9040
DNSPort 0.0.0.0:5353
' >/etc/tor/torrc
 touch /var/run/tor.pid
 chmod 777 /var/run/tor.pid
 echo "/usr/bin/tor -f /etc/tor/torrc --runasdaemon 1 --PidFile /var/run/tor.pid >/dev/null" | at now >/dev/null 2>&1
 echo "/usr/sbin/privoxy --pidfile /var/run/privoxy.pid --user privoxy.privoxy /etc/privoxy/config >/dev/null" | at now >/dev/null 2>&1
fi

Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-autologin

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-autologin

Changed on 30.10.09
Issued by olli
Beginning line 2

Script for enabling Autologin

#!/bin/bash

# Check if AUTOLOGIN is set
#if [ $AUTOLOGIN == "yes" ]
#then
# echo "Enabling Autologin for user gtc (Password: gtc)"
# # Create gtc-User for Autologin
# useradd gtc -d /var/gtcdummy -m -g users -G wheel,root,audio,video,cdrom,vboxusers,cdrw,usb,disk,lpadmin,lp,scanner,sys,adm,floppy,plugdev
# echo "gtc:gtc" | chpasswd >/dev/null 2>&1
# echo "Starting X"
# echo 'su - gtc -c "XSESSION=MATE startx ; init 0"' | at now >/dev/null 2>&1
#fi

Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-ldap

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-ldap

Changed on 13.10.09
Issued by olli
Beginning line 2

Script for enabling LDAP.

#!/bin/bash

# Check LDAP
# Check if LDAP is set
if [ $LDAP == "yes" ]
then
 # LDAP and NIS aren't allowed together
 if [ $NIS == "yes" ]
 then
  echo "You can not use LDAP and NIS! Please change your configuration in your thinclient.conf."
  exit 1
 fi
 # Configuring LDAP
 echo "Configuring LDAP"
 if [ $LDAP_TLS == "yes" ]
 then
  LDAP_PORT=636
  LDAP_CONNECT="ldaps://$LDAP_SERVER:636
tls_reqcert allow"
 else
  LDAP_PORT=389
  LDAP_CONNECT="ldap://$LDAP_SERVER:389"
 fi
 echo "Setting up /etc/ldap.conf"
 echo "suffix $LDAP_BASEDN
uri $LDAP_CONNECT
pam_password exop
#ldap_version 3
#pam_filter objectclass=posixAccount
#pam_login_attribute uid
#pam_member_attribute memberuid
#nss_base_passwd ou=People,$LDAP_BASEDN
#nss_base_shadow ou=People,$LDAP_BASEDN
#nss_base_group  ou=Group,$LDAP_BASEDN
#scope one
pam_login_attribute uid:caseExactMatch:
tls_reqcert allow
NETWORK_TIMEOUT 3
timeout 3
timelimit 3
bind_timelimit 3
nss_reconnect_tries 0
nss_reconnect_sleeptime 1
nss_reconnect_maxsleeptime 2
nss_reconnect_maxconntries 1
" > /etc/ldap.conf
 
 echo "Setting up /etc/openldap/ldap.conf"
 echo "BASE $LDAP_BASEDN
URI $LDAP_CONNECT
pam_login_attribute uid:caseExactMatch:
TLS_REQCERT   allow
NETWORK_TIMEOUT 3
timeout 3
timelimit 3
bind_timelimit 3
nss_reconnect_tries 0
nss_reconnect_sleeptime 1
nss_reconnect_maxsleeptime 2
nss_reconnect_maxconntries 1
" > /etc/openldap/ldap.conf
 
 nmap -p $LDAP_PORT $LDAP_SERVER | grep open >/dev/null
 if [ $? == "0" ]
 then
  echo "Setting up /etc/nsswitch.conf"
  cp /etc/nsswitch.conf /tmp/nsswitch.conf.tcorig
  cat /tmp/nsswitch.conf.tcorig | \
  sed 's/^passwd:.*/passwd: ldap files/' | \
  sed 's/^shadow:.*/shadow: ldap files/' | \
  sed 's/^group:.*/group: ldap files/' > /etc/nsswitch.conf
 
  echo "Setting up /etc/pam.d/system-auth"
  cp /etc/pam.d/system-auth /tmp/system-auth.tcorig
  cat /tmp/system-auth.tcorig | \
  sed 's/^auth.*required.*pam_unix.so/auth sufficient pam_unix.so/' | \
  sed 's/nullok $/nullok\nauth sufficient pam_ldap.so use_first_pass\nauth required pam_deny.so/' | \
  sed 's/^account.*required.*pam_unix.so/account sufficient pam_ldap.so\naccount required pam_unix.so/' | \
  sed 's/^password.*required.*pam_unix.so/password sufficient pam_unix.so/' | \
  sed 's/shadow $/shadow\npassword sufficient pam_ldap.so use_authtok use_first_pass\npassword required pam_deny.so/' | \
  sed 's/^session.*optional.*pam_permit.so/session optional pam_ldap.so\nsession optional pam_permit.so/' > /etc/pam.d/system-auth
  
  echo "
auth            include  system-auth
account         include  system-auth
password        include  system-auth
session	        include  system-auth
" >/etc/pam.d/lightdm
  
  # Restart nscd
  /etc/init.d/nscd restart >/dev/null 2>&1

  # Workaround for programms which are searching directly in /etc/passwd and/or /etc/group (lightdm/dbus)
  getent passwd > /tmp/passwd
  getent group > /tmp/group
  cat /tmp/passwd > /etc/passwd
  cat /tmp/group > /etc/group
 else
  echo "LDAP-Server doesn't seem to be reachable. Skipping editing of nsswitch.conf"
 fi

else
 echo "LDAP is not set to yes in your $conf"
fi

Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-local

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-local

Changed on 25.10.09
Issued by olli
Beginning line 2

Script to run individual things on every thinclient

#!/bin/bash

if [ -f $LOCAL_SCRIPT ]
then
 echo "Running $LOCAL_SCRIPT"
 chmod 755 $LOCAL_SCRIPT
 $LOCAL_SCRIPT
fi

Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-localization

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-localization

Changed on 13.10.09
Issued by olli
Beginning line 2

Script for localization

#!/bin/bash

if [ -n "$LOC_KEYMAP" ]
then
 echo "Setting Keymap to $LOC_KEYMAP"
 loadkeys --unicode $LOC_KEYMAP
 #cp /etc/conf.d/keymaps /tmp/keymaps.tcorig
 #cat /tmp/keymaps.tcorig | sed 's/^KEYMAP=.*/KEYMAP=$LOC_KEYMAP/' >/etc/conf.d/keymaps
 #/etc/init.d/keymaps restart
fi

if [ -n "$LOC_LANG" ]
then
 echo "Setting Language to $LOC_LANG"
 echo "LANG=\"$LOC_LANG\"" >>/etc/env.d/02locale
 echo "export LANG=\"$LOC_LANG\"" >>/etc/profile.env
fi

if [ -n "$LOC_TIMEZONE" ]
then
 echo "Setting Timezone to $LOC_TIMEZONE"
 rm /etc/localtime
 ln -sf /usr/share/zoneinfo/$LOC_TIMEZONE /etc/localtime
fi

if [ -z "$LOC_HWCLOCK" ]
then
 HWCKOCK=localtime
fi

#if [ "$LOC_MOZLANG" != "" ]
#then
# mkdir -p /etc/firefoxlang
# mkdir -p /etc/thunderbirdlang
# cp -rp "/usr/lib/firefox/extensions/langpack-$LOC_MOZLANG@firefox.mozilla.org" /etc/firefoxlang/
# mount --bind /etc/firefoxlang /usr/lib/firefox/extensions
# cp -rp "/usr/lib/thunderbird/extensions/langpack-$LOC_MOZLANG@thunderbird.mozilla.org" /etc/thunderbirdlang/
# mount --bind /etc/thunderbirdlang /usr/lib/thunderbird/extensions
#fi

# time
#hwclock --hctosys --$LOC_HWCLOCK >/dev/null 2>&1 &
#source /etc/profile

# xorg lang
if [ -z $LOC_XKBLANG ]
then
 LOC_XKBLANG="us"
else
 echo "
Section \"InputClass\"
    Identifier             \"Keyboard Defaults\"
    MatchIsKeyboard       \"yes\"
    Option               \"XkbLayout\" \"$LOC_XKBLANG\"
EndSection
 " >> /etc/X11/xorg.conf
fi




Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-nfsmount

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-nfsmount

Changed on 30.10.09
Issued by olli
Beginning line 2

Script for mounting NFS-Share(s)

#!/bin/bash

for i in $NFSMOUNT
do
 SERVER=`echo "$i" | cut -d":" -f1`
 SHARE=`echo "$i" | cut -d":" -f2`
 MOUNTPOINT=`echo "$i" | cut -d":" -f3`
 echo "Mounting $SERVER:$SHARE to $MOUNTPOINT"
 mkdir -p $MOUNTPOINT
 mount -t nfs $SERVER:$SHARE $MOUNTPOINT
done


Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-thinkpad

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-thinkpad

Changed on 20.02.18
Issued by olli
Beginning line 2

Special Things for ThinkPads

#!/bin/bash

if lshw | grep -q ThinkPad
then
 echo "This seems to be a ThinkPad"

 modprobe "thinkpad_acpi"
 
 # ACPI SLEEP
 echo '#Fn+F4 button/sleep SBTN 00000080 00000000 K
event=button/sleep
action=/etc/acpi/actions/FnF4-sleep.sh' >/etc/acpi/events/FnF4-sleep
 echo '#!/bin/sh
hibernate-ram
/sbin/hwclock --adjust
/sbin/hwclock --hctosys
' >/etc/acpi/actions/FnF4-sleep.sh
 
 # ACPI SLEEP DISPLAY/LID CLOSED
 echo '#Display/LID close
event=button/lid
action=/etc/acpi/actions/LID-sleep.sh' >/etc/acpi/events/LID-sleep
 echo '#!/bin/sh
sleep 5
cat /proc/acpi/button/lid/LID/state | grep -q open && exit 0
hibernate-ram
/sbin/hwclock --adjust
/sbin/hwclock --hctosys
' >/etc/acpi/actions/LID-sleep.sh

 # ACPI HIBERNATE
 echo '#Fn+F12 button/sleep SBTN 00000080 00000000 K
event=button/suspend
action=/etc/acpi/actions/FnF12-suspend.sh' >/etc/acpi/events/FnF12-suspend
 echo '#!/bin/sh
logger "[ACPI] Fn+F12 pressed suspend to disk"
hibernate
/sbin/hwclock --adjust
/sbin/hwclock --hctosys
' >/etc/acpi/actions/FnF12-suspend.sh
 
 # WIFI Button
 echo '#Fn+F5 button/wlan WLAN 00000080 00000000 K
event=button/wlan
action=/etc/acpi/actions/FnF5-wifi.sh' >/etc/acpi/events/FnF5-wifi
 echo '#!/bin/sh
logger "[ACPI] Fn+F5 pressed, WiFi rfkill state toggled"
rf=/sys/class/rfkill/rfkill0
case $(< $rf/state) in
    0) echo 1 >$rf/state;;
    1) echo 0 >$rf/state;;
esac
' >/etc/acpi/actions/FnF5-wifi.sh
 
 chmod 755 /etc/acpi/actions/*.sh
 /etc/init.d/acpid restart >/dev/null 2>&1
 
 # GPS
 echo '
DEVICES="ttyUSB2"
' >>/etc/conf.d/gpsd
 /etc/init.d/gpsd start >/dev/null 2>&1

 # WWAN
 echo 'ttyUSB0
921600
lock
crtscts
modem
passive
novj
defaultroute
noipdefault
usepeerdns
noauth
hide-password
persist
holdoff 10
maxfail 0
debug
' >/etc/ppp/options-mobile
 echo

# Fan
/etc/init.d/thinkfan start >/dev/null 2>&1

# Thermal-Control
/etc/init.d/thermald start >/dev/null 2>&1

# LMT
/etc/init.d/laptop_mode start >/dev/null 2>&1

fi

Changes in /gtc/test/etc/thinclient/startup/jobs/gtc-zautoupdate

File permissions:
Owner: root
Group: root
Permissions: -r--------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/jobs/gtc-zautoupdate

Changed on 02.04.12
Issued by olli
Beginning line 2

Start Update

#!/bin/bash

if mount | grep "/_gtcroot type nfs" >/dev/null
then
  echo 'No update on network boot!'
else
 echo " /etc/cron.daily/gtc-service" | at now+2minutes >/dev/null 2>&1
 if [ $AUTOUPDATE == "yes" ]
 then
  if [ -f /_gtcroot/update-down ]
  then
   /etc/thinclient/scripts/gtc-update-do
  else
   echo "/etc/thinclient/scripts/gtc-update >/_gtcroot/tmp/gtc-update 2>&1" | at now+5minutes >/dev/null 2>&1
  fi
 fi
fi

Changes in /gtc/test/etc/thinclient/thinclient.conf.local

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/thinclient.conf.local

Changed on 13.10.09
Issued by olli
Beginning line 1

This is the local central configuration file for default thinclient settings. Settings of the thinclient.conf are overwritten.


# DNS Settings
NAMESERVER=my.lan.ip.addr
NAMESERVERBACKUP=""
SEARCH="example.com"

# Some localization settings
LOC_LANG="de_DE.UTF-8" 
LOC_KEYMAP="de-latin1"
LOC_TIMEZONE="Europe/Berlin"
LOC_HWCLOCK="localtime"
LOC_XKBLANG="de"

# Autologin as gtc-User
AUTOLOGIN="no"

# Settings for LDAP Authentication
LDAP=yes
LDAP_SERVER=my.lan.ip.addr
LDAP_TLS=yes
LDAP_BASEDN="dc=example,dc=com"

# Settings for NIS Authentication
NIS=no
NIS_SERVER=XXX.XXX.XXX.XXX
NIS_DOMAIN=domainname

# Run local script on all thinclients
#LOCAL_SCRIPT="/path/to/my/local/script"

#UPDATECHANNEL=test

DEBUG=no

#PACKAGES="www-plugins/adobe-flash dev-util/android-sdk-update-manager"
PACKAGES=""


Changes in /gtc/test/etc/ufw/after.rules

File permissions:
Owner: root
Group: root
Permissions: -rw-r-----

Click here for a download of the complete file: /gtc/test/etc/ufw/after.rules

Changed on 28.03.20
Issued by olli
Beginning line 18

Virtual/Tor Networking Routing vnet0 and tornet0

# Allow SSH
-A ufw-after-input -p tcp --dport 22 -j ACCEPT
-A ufw-after-input -p udp --dport 22 -j ACCEPT

# Allow docker sending mails
-A ufw-after-input -p tcp -d XXX.XXX.XXX.XXX --dport 25 -j ACCEPT
-A ufw-after-input -p udp -d XXX.XXX.XXX.XXX --dport 25 -j ACCEPT

# Allow DNS/TorDNS(5353) Requests from vnet0 and tornet0
-A ufw-after-input -p udp --dport 53 -i vnet0 -j ACCEPT
-A ufw-after-input -p udp --dport 53 -i tornet0 -j ACCEPT
-A ufw-after-input -p udp --dport 5353 -i tornet0 -j ACCEPT

# Allow Tor/Privoxy Requests from tornet0,vnet0 (9040 for transparent proxy in tornet0 only)
-A ufw-after-input -p tcp --dport 3128 -i tornet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 3128 -i vet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 9040 -i tornet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 9050 -i tornet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 9050 -i vnet0 -j ACCEPT


# Allow NTP TFTP and NFS from vnet0 and tornet0
-A ufw-after-input -p udp --dport 69 -i vnet0 -j ACCEPT
-A ufw-after-input -p udp --dport 69 -i tornet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 111 -i vnet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 111 -i tornet0 -j ACCEPT
-A ufw-after-input -p udp --dport 111 -i vnet0 -j ACCEPT
-A ufw-after-input -p udp --dport 111 -i tornet0 -j ACCEPT
-A ufw-after-input -p udp --dport 123 -i vnet0 -j ACCEPT
-A ufw-after-input -p udp --dport 123 -i tornet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 2049 -i vnet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 2049 -i tornet0 -j ACCEPT
-A ufw-after-input -p udp --dport 2049 -i vnet0 -j ACCEPT
-A ufw-after-input -p udp --dport 2049 -i tornet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 32765:32768 -i vnet0 -j ACCEPT
-A ufw-after-input -p tcp --dport 32765:32768 -i tornet0 -j ACCEPT
-A ufw-after-input -p udp --dport 32765:32768 -i vnet0 -j ACCEPT
-A ufw-after-input -p udp --dport 32765:32768 -i tornet0 -j ACCEPT

# Allow Samba
-A ufw-after-input -p tcp --dport 445 -j ACCEPT
-A ufw-after-input -p udp --dport 445 -j ACCEPT

# Allow http/https
-A ufw-after-input -p tcp --dport 443 -j ACCEPT
-A ufw-after-input -p tcp --dport 80 -j ACCEPT

Changes in /gtc/test/etc/ufw/before.rules

File permissions:
Owner: root
Group: root
Permissions: -rw-r-----

Click here for a download of the complete file: /gtc/test/etc/ufw/before.rules

Changed on 28.03.20
Issued by olli
Beginning line 11

Virtual/Tor Networking Routing vnet0 and tornet0

*nat
:POSTROUTING ACCEPT - [0:0]
# Route network XXX.XXX.XXX.XXX/24 (vnet0)
-A POSTROUTING -s XXX.XXX.XXX.XXX/24 -j MASQUERADE
# Route network XXX.XXX.XXX.XXX/24 (tornet0) to transparent Tor-Proxy (udp not supported by Tor)
# Activate "normal" routing for non-Internet Networks
-A POSTROUTING -s XXX.XXX.XXX.XXX/24 -j MASQUERADE
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/8 -j RETURN
-A PREROUTING -i tornet0 -d 10.0.0.0/8 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/16 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/12 -j RETURN
-A PREROUTING -i tornet0 -d 0.0.0.0/8 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/10 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/16 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/24 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/24 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/24 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/15 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/24 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/24 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/4 -j RETURN
-A PREROUTING -i tornet0 -d 240.0.0.0/4 -j RETURN
-A PREROUTING -i tornet0 -d XXX.XXX.XXX.XXX/32 -j RETURN
# Redirect all TCP-Connections to transparent Tor-Proxy
-A PREROUTING -i tornet0 -s XXX.XXX.XXX.XXX/24 -p tcp --syn -j REDIRECT --to-ports 9040
# Redirect DNS to TorDNS
-A PREROUTING -i tornet0 -s XXX.XXX.XXX.XXX/24 -d XXX.XXX.XXX.XXX -p udp --dport 53 -j REDIRECT --to-ports 5353
# Redirect all non TCP-Connections into nirvana because Tor only speaks TCP
-A PREROUTING -i tornet0 -s 192.168.43.0/24 ! -p tcp -j DNAT --to 127.0.0.1:1

COMMIT

Changed on 28.03.20
Issued by olli
Beginning line 54

Virtual/Tor Networking Routing vnet0 and tornet0

-A ufw-before-forward -i vnet0 -m conntrack --ctstate NEW -j ACCEPT
-A ufw-before-forward -i tornet0 -m conntrack --ctstate NEW -j ACCEPT

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && rc-update add sshd default'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && rc-update add rsyslog default'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && rc-update add nscd default'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && rc-update add dbus default'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && rc-update add hald '
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && rc-update add udev-postmount '

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Kernel-based Virtual Machine - KVM

This is a small documentation how I added the Kernel-based Virtual Machine (KVM) Support to the Thinclient.
Before you emerge the software you should make the chages in make.conf and package.keywords.
For creating a 10GB harddiskimage for KVM you can use the following command:
qemu-img create /path/to/your/vmimage.img 10G

For booting a CD/DVD from the physical CD/DVD-Drive i a VM with networking and 1GB RAM you can use the following command
kvm -hda /path/to/your/vmimage.img -cdrom /dev/cdrom -m 1024 -net nic,macaddr=00:1d:92:ab:cd:ef -net tap,ifname=tap0,script=no,downscript=no -name myvm1 -boot d

For Passthrough an USB Device you can add e.g. "-usb -usbdevice host:aaaa:bbbb" to the commandline.
kvm -hda /path/to/your/vmimage.img -cdrom /dev/cdrom -m 1024 -net nic,macaddr=00:1d:92:ab:cd:ef -net tap,ifname=tap0,script=no,downscript=no -name myvm1 -boot d -usb -usbdevice host:aaaa:bbbb

For getting the correct USB ID you cal use the lsusb-command.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge app-emulation/qemu-kvm'

Changes in /gtc/test/etc/thinclient/startup/gtc-startupconfig

File permissions:
Owner: root
Group: root
Permissions: -r-x------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/gtc-startupconfig

Changed on 20.04.10
Issued by olli
Beginning line 13

This is for loading the KVM-Drivers automatically at system startup

g_echo_ok "Loading KVM modules"
modprobe kvm >/dev/null 2>&1
modprobe kvm-amd >/dev/null 2>&1
modprobe kvm-intel >/dev/null 2>&1

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Mate

Changes in /gtc/test/etc/dconf/readme.txt

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/dconf/readme.txt

Changed on 14.10.19
Issued by olli
Beginning line 1

generate default configurations for Mate Desktop

# as user in clean $HOME
dconf dump / >/etc/dconf/db/local.d/gabosh
# as root
rm /etc/dconf/db/local
echo "user-db:user
system-db:local
" >/etc/dconf/profile/user
dconf update

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Profiling

If you have multiple, different diskless clients running from the same NFS-Share you have to find a way to add different Startup profiles for the clients.
Here is an example how I manage this problem.

If you want to use this solution you need the following howto(s) finished:

Changes in /gtc/test/etc/thinclient/default-profile/start.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/default-profile/start.sh

Changed on 13.10.09
Issued by olli
Beginning line 2

Default script for configuring, the system

chmod 755 /home

Changes in /gtc/test/etc/thinclient/global-profile/start.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/global-profile/start.sh

Changed on 13.10.09
Issued by olli
Beginning line 2

User defineable script for the global GTC profile

#!/bin/bash
if ping -c1 gabosh | grep "64 bytes from" >/dev/null 2>&1
then
 echo "Netzwerkdrucker"
 lpadmin -p "EPSON_WF_4740" -E -v ipp://XXX.XXX.XXX.XXX/ipp/print -m lsb/usr/epson-inkjet-printer-escpr/Epson-WF-4640_Series-epson-escpr-en.ppd -D "EPSON WorkForce-4740" -L "bei Becky, user1 und Jonah"
fi

Changes in /gtc/test/etc/thinclient/startup/gtc-startupconfig

File permissions:
Owner: root
Group: root
Permissions: -r-x------

Click here for a download of the complete file: /gtc/test/etc/thinclient/startup/gtc-startupconfig

Changed on 16.06.09
Issued by olli
Beginning line 320

Start the individual startscript for this host.

#if cat /proc/cmdline | grep " gtcserver" >/dev/null
#then
# echo -e "\n==============================\nLoading Server profile\n==============================\n"
# rsync -a$RSYNC_OPT /etc/thinclient/server-profile/etc/ /etc/
# . /etc/thinclient/server-profile/start.sh
#fi
g_echo_ok "Running /etc/thinclient/global-profile/start.sh"
# Switching from xdm -> display-manager
sed -i 's/xdm start/display-manager start/' /etc/thinclient/profiles/*/start.sh /_gtcroot/etc/thinclient/profiles/*/start.sh >/dev/null 2>&1
# Run global Start script
. /etc/thinclient/global-profile/start.sh
if [ -d "/etc/thinclient/profiles/`hostname`" ]
then
 # Run individual start-Script if exists
 if [ -f "/etc/thinclient/profiles/`hostname`/start.sh" ]
 then
 g_echo_ok "Running /etc/thinclient/profiles/`hostname`/start.sh"
  . /etc/thinclient/profiles/`hostname`/start.sh
 fi
# # Don't run the default profile if this is a Server
# if cat /proc/cmdline | grep " gtcserver" >/dev/null
# then
#  exit 0
# fi
else
# # Don't run the default profile if this is a Server
# if cat /proc/cmdline | grep " gtcserver" >/dev/null
# then
#  exit 0
# fi
# if cat /proc/cmdline | grep " gtcinstall"  >/dev/null
# then
#  echo -e "\n==============================\nStarting GTC installation\n==============================\n"
#  /etc/thinclient/scripts/gtc-install
# else
 g_echo_ok "Running default profile start script"
  # now in initrd
  #rsync -a$RSYNC_OPT /etc/thinclient/default-profile/etc/ /etc/
 . /etc/thinclient/default-profile/start.sh
# fi
fi

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Thinclient as Server

This is a Howto which describes how you can extend your Thinclient to a Thinclient-Server.
For easier administrative handling I decided to use LDAP for Services like DHCP and DNS.
After emerging the packages copy the default configurations to the Server Profile:
cp /etc/openldap/slapd.conf /etc/thinclient/server-profile/etc/openldap/slapd.conf
cp /usr/share/webapps/phpldapadmin/*/htdocs/config/config.php /etc/thinclient/server-profile/etc/phpldapadmin.conf
cp /etc/conf.d/nfs /etc/thinclient/server-profile/etc/conf.d/nfs
cp /etc/conf.d/in.tftpd /etc/thinclient/server-profile/etc/conf.d/in.tftpd
cp /etc/conf.d/apache2 /etc/thinclient/server-profile/etc/conf.d/apache2
cp /etc/bind/named.conf /etc/thinclient/server-profile/etc/bind/named.conf

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-fs/nfs-utils'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge sys-boot/syslinux'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-ftp/tftp-hpa'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-misc/dhcp'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-dns/bind'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-dns/bind-tools'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-nds/openldap'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-fs/samba'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-nds/phpldapadmin'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge www-servers/apache'

Changes in /gtc/test/etc/thinclient/server-profile/etc/apache2/vhosts.d/vhosts.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/apache2/vhosts.d/vhosts.conf

Changed on 28.04.10
Issued by olli
Beginning line 1

The Webserver configuration fpr the GTC-Server

# Some default settings
Listen 80
Listen 443
NameVirtualHost *:80
NameVirtualHost *:443
# ServerName
ServerName localhost
# Directory Index
DirectoryIndex index.html

# Some security settings
Timeout 60
# Allow a maximum of 100MB for upload.
LimitRequestBody 104857600
# Mallow a maximum of 50 headersites
LimitRequestFields 50
# Sets maximum length of the from client sent HTTP-Request-Headers
LimitRequestFieldsize 4094
# Maximum leght of HTTP request line
LimitRequestLine 8190
# Allow a maximum of 100MB for upload. per webdav
LimitXMLRequestBody 104857600

# VHost logging
CustomLog /var/log/apache2/access_log vhost

# Load LDAP Auth modules
LoadModule ldap_module /usr/lib/apache2/modules/mod_ldap.so
Loadmodule authnz_ldap_module /usr/lib/apache2/modules/mod_authnz_ldap.so

<Directory />
 Order Deny,Allow
 Deny from all
 Options None
 AllowOverride None
</Directory>
<Directory /var/www>
  Order Allow,Deny
  Allow from all
  Options None
  AllowOverride None
</Directory>
ServerSignature Off
TraceEnable off

# The default vHost
<VirtualHost *:80>
 ServerName default
 ServerAdmin gtc
 DocumentRoot /var/www/default/htdocs
</VirtualHost>
<VirtualHost *:443>
 ServerName default
 ServerAdmin gtc
 DocumentRoot /var/www/default/htdocs
 SSLEngine on
 SSLCertificateFile /etc/ssl/apache2/server.crt
 SSLCertificateKeyFile /etc/ssl/apache2/server.key
</VirtualHost>

Changes in /gtc/test/etc/thinclient/server-profile/etc/bind/named.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/bind/named.conf

Changed on 23.04.10
Issued by olli
Beginning line 13

Listen on localhost and the LAN and forward requests if they are not known by this DNS (for internet name resolution).


Before change
        listen-on { 127.0.0.1; };
After change
        // Listen
	listen-on { 127.0.0.1/8;
	            0.0.0.0/0;
	};
	// The way to the Internet
        allow-recursion { 127.0.0.1/8;
                          0.0.0.0/0;
        };
	// Local zones
        allow-query { 127.0.0.1/8;
	              0.0.0.0/0;
	};
	allow-notify { none; };
	allow-transfer { none; };

Changed on 23.04.10
Issued by olli
Beginning line 73

Zone definitions for some domains


# This is an entry for an LDAP Zone. Use this only if you want to use Bind with LDAP
zone "gtc" IN {
        type master;
	database "ldap ldap://127.0.0.1/cn=Computers,dc=gtc 172800";
	allow-update { none; };
};

zone "in-addr.arpa" {
        type master;
	database "ldap ldap://127.0.0.1/cn=Computers,dc=gtc 172800";
	allow-update { none; };
};

Changes in /gtc/test/etc/thinclient/server-profile/etc/conf.d/apache2

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/conf.d/apache2

Changed on 28.04.10
Issued by olli
Beginning line 35

Apache startoptions for enabling PHP5 and SSL


Before change
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D SSL -D SSL_DEFAULT_VHOST -D PHP5"
After change
APACHE2_OPTS="-D SSL -D PHP5"

Changes in /gtc/test/etc/thinclient/server-profile/etc/dhcp/dhcpd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/dhcp/dhcpd.conf

Changed on 23.04.10
Issued by olli
Beginning line 1

This are the DHCP settings for connecting to the LDAP Server.

ldap-server "127.0.0.1";
ldap-port 389;
ldap-username "";
ldap-password "";
ldap-base-dn "ou=DHCP-Servers,dc=gtc";
ldap-dhcp-server-cn "gtc-server";
ldap-method dynamic;
ldap-debug-file "/tmp/dhcp-ldap-startup-config";

Changes in /gtc/test/etc/thinclient/server-profile/etc/phpldapadmin.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/etc/phpldapadmin.conf

Changed on 23.04.10
Issued by olli
Beginning line 283

Basedn for phpldapadmin


Before change
// $servers->setValue('server','base',array(''));
After change
$servers->setValue('server','base',array('dc=gtc'));

Changed on 23.04.10
Issued by olli
Beginning line 311

Login for phpldapadmin


Before change
#  $servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');
After change
$servers->setValue('login','bind_id','cn=Manager,dc=gtc');

Changes in /gtc/test/etc/thinclient/server-profile/start.sh

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/server-profile/start.sh

Changed on 23.04.10
Issued by olli
Beginning line 2

Create data and start the Services

#!/bin/bash

# Get network informations
IP=`cat /proc/cmdline | perl -pe 's/^.+ip=//; s/ .+$//'` 
SRV_IP=`echo $IP | cut -d: -f1`
SRV_GATEWAY=`echo $IP | cut -d: -f3`
SRV_SUBNET=`echo $IP | cut -d: -f4`
SRV_NETWORK=`ipcalc $SRV_IP/$SRV_SUBNET -b -n | grep Network | perl -pe 's/ +/ /g' | cut -d" " -f2 | cut -d"/" -f1`
SRV_BROADCAST=`ipcalc $SRV_IP/$SRV_SUBNET -b -n | grep Broadcast | perl -pe 's/ +/ /g' | cut -d" " -f2`

# Setup pxelinux-Bootloader-Files
mkdir -p /srv/pxe/pxelinux.cfg
cp /usr/share/syslinux/pxelinux.0 /srv/pxe/
cp /usr/share/syslinux/menu.c32 /srv/pxe/
cp /boot/kernel-genkernel-x86-`uname -r` /srv/pxe/
cp /boot/initramfs-genkernel-x86-`uname -r` /srv/pxe/

# LDAP
if [ -d "/srv/ldap" ]
then
 rm -r /var/lib/openldap-data
 ln -sf /srv/ldap /var/lib/openldap-data
 /etc/init.d/slapd start
else
 echo "Creating initial LDAP Database"
 SRV_REVIP=`echo "$SRV_IP" | awk 'BEGIN{FS=".";ORS="."} {for (i = NF; i > 0; i--){print $i}}' | sed 's/\.$//'` 
echo "
# Create LDAP DB and start it
# The basic structure
dn: dc=gtc
dc: gtc
objectClass: top
objectClass: domain

# The DHCP Object with some default settings. filename and next-server are only needed if you want to boot with PXE.
# The entriees for your DHCP-Server(s)
dn: ou=DHCP-Servers,dc=gtc
objectClass: organizationalUnit
objectClass: top
ou: DHCP-Servers

dn: cn=gtc-server,ou=DHCP-Servers,dc=gtc
objectClass: top
objectClass: dhcpServer
cn: gtc-server
dhcpServiceDN: cn=Computers,dc=gtc
dhcpStatements: next-server $SRV_IP
dhcpOption: routers $SRV_GATEWAY
dhcpOption: domain-name-servers $SRV_IP
dhcpOption: ntp-servers $SRV_IP

# The global settings for all your DHCP-Server(s)
dn: cn=Computers,dc=gtc
cn: Computers
dhcpOption: subnet-mask $SRV_SUBNET
dhcpOption: broadcast-address $SRV_BROADCAST
dhcpOption: domain-name \"gtc\"
dhcpStatements: ddns-update-style none
dhcpStatements: get-lease-hostnames true
dhcpStatements: use-host-decl-names true
dhcpStatements: filename \"/pxelinux.0\"
dhcpStatements: default-lease-time 7200
dhcpStatements: max-lease-time 14400
objectClass: dhcpService
objectClass: top
dhcpSecondaryDN: cn=gtc-server,ou=DHCP-Servers,dc=gtc

# The DHCP-Subnet entry:
dn: cn=$SRV_NETWORK,cn=Computers,dc=gtc
objectClass: top
objectClass: dhcpSubnet
objectClass: dhcpOptions
dhcpNetMask: 24
#dhcpRange: XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX
cn: $SRV_NETWORK

# The GTC/DHCP-Server
dn: pTRRecord=gtc-server.gtc.,cn=Computers,dc=gtc
aRecord: $SRV_IP
pTRRecord: gtc-server.gtc.
zoneName: gtc
zoneName: in-addr.arpa
objectClass: dNSZone
objectClass: top
sOARecord: gtc hostmaster 2010033001 8H 4H 4W 3H
nSRecord: localhost.
relativeDomainName: $SRV_REVIP
relativeDomainName: @

# Gouups
dn: ou=Group,dc=gtc
objectclass: top
objectclass: organizationalUnit
ou: Group

# Admin group
dn: cn=admins,ou=Group,dc=gtc
cn: admins
gidnumber: 12345
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=Ad min,ou=Users,ou=People,dc=gtc

# System groups
dn: cn=audio,ou=Group,dc=gtc
cn: audio
gidnumber: 18
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=cdrom,ou=Group,dc=gtc
cn: cdrom
gidnumber: 19
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=cdrw,ou=Group,dc=gtc
cn: cdrw
gidnumber: 80
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=disk,ou=Group,dc=gtc
cn: disk
gidnumber: 6
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=games,ou=Group,dc=gtc
cn: games
gidnumber: 35
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=root,ou=Group,dc=gtc
cn: root
gidnumber: 0
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=admins,ou=Group,dc=gtc

dn: cn=usb,ou=Group,dc=gtc
cn: usb
gidnumber: 85
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=vboxusers,ou=Group,dc=gtc
cn: vboxusers
gidnumber: 1008
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=video,ou=Group,dc=gtc
cn: video
gidnumber: 27
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=users,ou=Group,dc=gtc

dn: cn=wheel,ou=Group,dc=gtc
cn: wheel
gidnumber: 10
objectclass: posixGroup
objectclass: top
objectclass: gaboshGroup
uniquemember: cn=admins,ou=Group,dc=gtc

# Users group
dn: cn=users,ou=Group,dc=gtc
cn: users
gidnumber: 100
objectclass: gaboshGroup
objectclass: posixGroup
objectclass: top
uniquemember: cn=Ad min,ou=Users,ou=People,dc=gtc
uniquemember: cn=Te St,ou=Users,ou=People,dc=gtc

# Users section:
dn: ou=People,dc=gtc
objectclass: top
objectclass: organizationalUnit
ou: People

dn: ou=SystemUsers,ou=People,dc=gtc
objectclass: organizationalUnit
objectclass: top
ou: SystemUsers

dn: ou=Users,ou=People,dc=gtc
objectclass: organizationalUnit
objectclass: top
ou: Users

# Admin User
dn: cn=Ad Min,ou=Users,ou=People,dc=gtc
cn: Ad Min
gidnumber: 100
givenname: Ad
homedirectory: /home/admin
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: sambaSamAccount
objectclass: posixAccount
objectclass: top
sambaacctflags: [U          ]
sambalmpassword: 69B3E05FE457CAAAAAD3B435B51404EE
sambantpassword: 8F6D7AB8FE0B9B159A50FE4F1174AFAF
sambapasswordhistory: 000000000000000000000000000000000000000000000000000000
 0000000000
sambaprimarygroupsid: S-1-5-21-130334517-3066763751-205333941-3002-
sambapwdlastset: 1243432646
sambasid: S-1-5-21-130334517-3066763751-205333941-3004
sn: Min
uid: admin
uidnumber: 1000
userpassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXX

# Test User
dn: cn=Te St,ou=Users,ou=People,dc=gtc
cn: Te St
gidnumber: 100
givenname: Te
homedirectory: /home/test
loginshell: /bin/false
objectclass: inetOrgPerson
objectclass: sambaSamAccount
objectclass: posixAccount
objectclass: top
sambaacctflags: [U          ]
sambalmpassword: 69B3E05FE457CAAAAAD3B435B51404EE
sambantpassword: 8F6D7AB8FE0B9B159A50FE4F1174AFAF
sambapasswordhistory: 000000000000000000000000000000000000000000000000000000
 0000000000
sambaprimarygroupsid: S-1-5-21-130334517-3066763751-205333941-3002-
sambapwdlastset: 1243432646
sambasid: S-1-5-21-130334517-3066763751-205333941-3005
sn: St
uid: test
uidnumber: 1001
userpassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXX

# Sambadomain
dn: sambaDomainName=GTCSERVER,dc=gtc
objectclass: sambaDomain
sambaalgorithmicridbase: 1000
sambadomainname: GTC
sambaforcelogoff: -1
sambalockoutduration: 30
sambalockoutobservationwindow: 30
sambalockoutthreshold: 0
sambalogontochgpwd: 0
sambamaxpwdage: -1
sambaminpwdage: 0
sambaminpwdlength: 5
sambanextuserrid: 1000
sambapwdhistorylength: 0
sambarefusemachinepwdchange: 0
sambasid: S-1-5-21-130334517-3066763751-205333941


" > /tmp/ldapinit.ldif
 mv /var/lib/openldap-data /srv/ldap
 ln -sf /srv/ldap /var/lib/openldap-data
 mv /srv/ldap/DB_CONFIG.example /srv/ldap/DB_CONFIG
 /etc/init.d/slapd start
 /etc/init.d/slapd stop
 slapadd < /tmp/ldapinit.ldif
 chown -R ldap:ldap /srv/ldap
 /etc/init.d/slapd start
fi
cp /etc/nsswitch.conf /tmp/nsswitch.conf.tcorig
cat /tmp/nsswitch.conf.tcorig | \
sed 's/^passwd:.*/passwd: ldap compat/' | \
sed 's/^shadow:.*/shadow: ldap compat/' | \
sed 's/^group:.*/group: ldap compat/' > /etc/nsswitch.conf
/etc/init.d/nscd restart

# Copy up-to-date default configs
if [ -d "/srv/config" ]
then
 rsync -a --exclude=thinclient.conf.local --exclude=profiles --exclude=global-profile --delete /etc/thinclient/ /srv/config/
else
 mkdir -p /srv/config
 rsync -a /etc/thinclient/ /srv/config/
fi

# Prepare Server gtcroot
mkdir -p /opt/gtcroot
mount -B /_gtcroot /opt/gtcroot
mount -B /srv/config /opt/gtcroot/etc/thinclient
mkdir -p /opt/gtcroot/etc/thinclient/profiles
mkdir -p /srv/profiles
mount -B /srv/profiles /opt/gtcroot/etc/thinclient/profiles
mkdir -p /srv/global-profile
mount -B /srv/profiles /opt/gtcroot/etc/thinclient/global-profile

# Configure phpldapadmin
mkdir -p /var/www/default/htdocs/phpldapadmin
rsync -a --delete /usr/share/webapps/phpldapadmin/*/htdocs/ /var/www/default/htdocs/phpldapadmin
cp /etc/phpldapadmin.conf /var/www/default/htdocs/phpldapadmin/config/config.php
chown -R apache:apache /var/www/default/htdocs

# DNS
echo "nameserver 127.0.0.1
search gtc" >/etc/resolv.conf
chmod 644 /etc/resolv.conf

# Start the other Services
/etc/init.d/named start
/etc/init.d/dhcpd start
killall -9 portmap 2>/dev/null
umount -lf /var/lib/nfs/rpc_pipefs 2>/dev/null
sleep 5
/etc/init.d/portmap start
/etc/init.d/rpc.statd start

/etc/init.d/nfs start
/etc/init.d/atftp start
/etc/init.d/apache2 start
mkdir -p /srv/log /srv/share/home/test /srv/share/home/admin
chown test:users /srv/share/home/test 
chown admin:admins /srv/share/home/admin
chmod 750 /srv/share/home/test
chmod 750 /srv/share/home/admin
mount -B /srv/share/home /home
/etc/init.d/samba start

# Write the Bootmanager-Config
mkdir -p /srv/pxe/pxelinux.cfg
echo "
default menu.c32
prompt 0
	    
menu title GTC Boot Menu
NOESCAPE 1
ALLOWOPTIONS 0
MENU AUTOBOOT Starting Gentoo Stable Thinclient in # seconds

label gtc
 menu default
 menu label ^GTC
 timeout 100
 kernel /kernel-genkernel-x86-`uname -r`
 append initrd=/initramfs-genkernel-x86-`uname -r` root=/dev/nfs nfsroot=$SRV_IP:/opt/gtcroot ramdisk_size=256000 acpi_sleep=s3_bios real_root=/dev/nfs
 ipappend 3

label bootlocal
 menu label ^Boot from local Disk
 localboot 0
" > /srv/pxe/pxelinux.cfg/default


Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Thunderbird

Changes in /gtc/test/usr/lib64/thunderbird/defaults/pref/gabosh.js

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/usr/lib64/thunderbird/defaults/pref/gabosh.js

Changed on 14.10.19
Issued by olli
Beginning line 1

Default Configurations for Thunderbird

pref("mail.html_compose", false);
pref("mail.compose.default_to_paragraph", false);
pref("spellchecker.dictionary", "de-DE");
pref("mail.collect_email_address_outgoing", false);
pref("msgcompose.default_colors", false);
pref("mailnews.default_sort_order", 2);

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - Wireless LAN

Here a Howto how you can connect to WLAN Access Points (over WPA/wpa_supplicant) with yout Thinclient.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge net-wireless/wpa_supplicant'

Changes in /gtc/test/etc/wpa_supplicant/wpa_supplicant.conf

File permissions:
Owner: root
Group: root
Permissions: -rwxr--r--

Click here for a download of the complete file: /gtc/test/etc/wpa_supplicant/wpa_supplicant.conf

Changed on 24.09.09
Issued by after
Beginning line 1

Configure these parameters to fit in your environment.

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
eapol_version=1
#ap_scan=2
fast_reauth=1

network={
        ssid="home"
        scan_ssid="0"
        mode=0
        #bssid=XX:XX:XX:XX:XX:XX
        #bssid=XX:XX:XX:XX:XX:XX
        proto=WPA RSN
        key_mgmt=WPA-PSK
        #phase1="peaplabel=1"
        #phase2="auth=MSCHAPV2"
        priority=10
        pairwise=CCMP TKIP
        group=CCMP TKIP
        identity="username"
        psk="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Thinclient - X-Server

This topic describes how I installed the X Server for my thinclient.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge x11-base/xorg-x11'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge mate-base/mate'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge mate-base/mate-control-center'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge mate-extra/caja-extensions'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge ate-extra/mate-media'
chroot /gtc/test /bin/bash -c 'env-update &>/dev/null && source /etc/profile && emerge mate-extra/mate-sensors-applet'

Changes in /gtc/test/etc/env.d/90xsession

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/env.d/90xsession

Changed on 01.09.10
Issued by olli
Beginning line 1

Sets the default display manager which starts when you use startx for starting the X-Server. Possible Values can be found with:

ls /etc/X11/Sessions/

XSESSION="MATE"

Changes in /gtc/test/etc/lightdm/lightdm.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/lightdm/lightdm.conf

Changed on 01.09.10
Issued by olli
Beginning line 131

LightDM-Settings

user-session=mate
greeter-hide-users=false
greeter-show-manual-login=true
allow-guest=false
xserver-command=X -core -dpi 96

Changes in /gtc/test/etc/lightdm/lightdm-gtk-greeter.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /gtc/test/etc/lightdm/lightdm-gtk-greeter.conf

Changed on 01.09.10
Issued by olli
Beginning line 22

LightDM-Settings

disable_user_list=false

Changes in /gtc/test/etc/thinclient/scripts/gtc-compiz

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-compiz

Changed on 01.09.10
Issued by olli
Beginning line 2

Startscript for Compiz-Fusion 3D-Desktop

#!/bin/bash
LIBGL_ALWAYS_INDIRECT=true compiz --replace --ignore-desktop-hints ccp &
emerald --replace

Changes in /gtc/test/etc/thinclient/scripts/gtc-xconfig

File permissions:
Owner: root
Group: root
Permissions: -rwxr-xr-x

Click here for a download of the complete file: /gtc/test/etc/thinclient/scripts/gtc-xconfig

Changed on 07.10.09
Issued by olli
Beginning line 2

A script for starting Xorg and setting XkbLayout

#!/bin/bash

. /etc/thinclient/thinclient.conf
if [ -f "/etc/thinclient/thinclient.conf.local" ]
then
 . /etc/thinclient/thinclient.conf.local
fi
if [ -f "/etc/thinclient/profiles/`hostname`/thinclient.conf" ]
then
 . /etc/thinclient/profiles/`hostname`/thinclient.conf
fi
if [ -z $LOC_XKBLANG ]
then
 LOC_XKBLANG="us"
else
 echo "
Section \"InputClass\"
    Identifier             \"Keyboard Defaults\"
    MatchIsKeyboard       \"yes\"
    Option               \"XkbLayout\" \"$LOC_XKBLANG\"
EndSection
 " > /etc/X11/xorg.conf
fi

/etc/init.d/display-manager restart


Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Time-Server

Here a litte configuration for a timeserver in the LAN.
For this you need to get the specific certificates from the Server Admin.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-misc/ntp

Changes in /etc/cron.hourly/ntpdate.sh

File permissions:
Owner: root
Group: root
Permissions: -rwx------

Click here for a download of the complete file: /etc/cron.hourly/ntpdate.sh

Changed on 11.09.08
Issued by olli
Beginning line 2

Set the system and BIOS time/date daily from the internet.

#!/bin/bash
ntpdate -us 0.de.pool.ntp.org || ntpdate -us 1.de.pool.ntp.org
hwclock --systohc

Changes in /etc/ntp.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/ntp.conf

Changed on 08.09.08
Issued by olli
Beginning line 44

Allow the LAN to connect to the timeserver. Set this to your network ip and subnet mask.


Before change
restrict default nomodify nopeer noquery limited kod
restrict 127.0.0.1
After change
restrict default nomodify
restrict my.lan.network.ip mask XXX.XXX.XXX.XXX
restrict my.dmz.network.ip mask XXX.XXX.XXX.XXX
restrict 127.0.0.1

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add ntpd default

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Two-factor authentication

Generate new seed (Each user should have an unique one):
head -10 /dev/urandom | sha512sum | cut -b 1-30

To get Base32 secret do
oathtool -v -d6 GENERATED-SEED

For generating QRCode-Imagefile for an OTP Smartphone App like FreeOTP+
qrencode -o qrcode.png 'otpauth://totp/user@machine?secret=BASE32-SECRET'

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge media-gfx/qrencode
emerge sys-auth/oath-toolkit

Changes in /etc/otp.users

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/otp.users

Changed on 19.09.2019
Issued by olli
Beginning line 1

File with Users and seed. Seed can be generated with "head -10 /dev/urandom | sha512sum | cut -b 1-30"

# Option User Prefix Seed
HOTP/T30/6 username - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
HOTP/T30/6 username - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Changes in /etc/pam.d/horde

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pam.d/horde

Changed on 19.09.2019
Issued by olli
Beginning line 1

PAM-Config for pam_oath.so

#auth       requisite     pam_oath.so usersfile=/etc/otp.users window=30 digits=6

Changes in /etc/pam.d/sshd

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pam.d/sshd

Changed on 19.09.2019
Issued by olli
Beginning line 1

PAM-Config for pam_oath.so

auth       sufficient     pam_oath.so usersfile=/etc/otp.users window=30 digits=6

Changes in /etc/pam.d/su

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/pam.d/su

Changed on 19.09.2019
Issued by olli
Beginning line 2

PAM-Config for pam_oath.so

auth       requisite     pam_oath.so usersfile=/etc/otp.users window=30 digits=6

Changes in /etc/ssh/sshd_config

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/ssh/sshd_config

Changed on 19.09.2019
Issued by olli
Beginning line 124

SSH needs

ChallengeResponseAuthentication yes
UsePAM yes

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

WLAN Access Point

This is a small howto for setting up yout own WLAN-Accesspoint. For this you need a WLAN-Card which can be put into "managed mode".
You have to link net.wlan0 against net.lo fpor getting it into a runlevel
ln -s /etc/init.d/net.lo /etc/init.d/net.wlan0

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge net-wireless/hostapd
emerge net-wireless/iw

Changes in /etc/conf.d/net

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net

Changed on 13.10.15
Issued by olli
Beginning line 17

Configuration of the Interface

modules_wlan0="!iwconfig !wpa_supplicant"
config_wlan0="XXX.XXX.XXX.XXX/16 fd25::200/64"
#config_wlan0="XXX.XXX.XXX.XXX/16"
rc_net_wlan0_provide="!net"
#mtu_wlan0="2304"

Changes in /etc/conf.d/net.bak

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/net.bak

Changed on 13.10.15
Issued by olli
Beginning line 21

Configuration of the Interface

modules_wlan0="!iwconfig !wpa_supplicant"
config_wlan0="XXX.XXX.XXX.XXX/16"
rc_net_wlan0_provide="!net"
#mtu_wlan0="2304"

Changes in /etc/hostapd/hostapd.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/hostapd/hostapd.conf

Changed on 13.10.15
Issued by olli
Beginning line 2710

Config for a WLAN Access Point with hostapd

interface=wlan0
driver=nl80211
# g means 2.4GHz
hw_mode=g
# the channel to use, 0 means the AP will search for the channel with the least interferences
channel=3
# limit the frequencies used to those allowed in the country
ieee80211d=1
country_code=DE
# 802.11n support
ieee80211n=1
#ht_capab=[SHORT-GI-40][HT40+][HT40-][DSSS_CCK-40]
# 802.11ac support
#ieee80211ac=1
# QOS
wme_enabled=1
# WLAN
ssid=WLAN
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=secret
# MAC Filter
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/hostapd.macaccept
# Logging
logger_syslog=1
logger_syslog_level=1

Changes in /etc/hostapd/hostapd.conf-2.4

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/hostapd/hostapd.conf-2.4

Changed on 13.10.15
Issued by olli
Beginning line 2401

Config for a WLAN Access Point with hostapd

interface=wlan0
driver=nl80211
# g means 2.4GHz
hw_mode=g
# the channel to use, 0 means the AP will search for the channel with the least interferences
channel=1
# limit the frequencies used to those allowed in the country
ieee80211d=1
country_code=DE
# 802.11n support
ieee80211n=1
#ht_capab=[SHORT-GI-40][HT40+][HT40-][DSSS_CCK-40]
# 802.11ac support
#ieee80211ac=1
# QOS
wme_enabled=1
# WLAN
ssid=WLAN
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=secret
# MAC Filter
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/hostapd.macaccept
# Logging
logger_syslog=1
logger_syslog_level=1

Changes in /etc/hostapd/hostapd.conf-5

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/hostapd/hostapd.conf-5

Changed on 13.10.15
Issued by olli
Beginning line 2401

Config for a WLAN Access Point with hostapd

interface=wlan0
driver=nl80211
# g means 2.4GHz
hw_mode=a
# the channel to use, 0 means the AP will search for the channel with the least interferences
channel=0
# limit the frequencies used to those allowed in the country
ieee80211d=1
country_code=DE
# 802.11n support
ieee80211n=1
#ht_capab=[SHORT-GI-40][HT40+][HT40-][DSSS_CCK-40]
# 802.11ac support
ieee80211ac=1
# QOS
wme_enabled=1
# WLAN
ssid=WLAN
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=secret
# MAC Filter
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/hostapd.macaccept
# Logging
logger_syslog=1
logger_syslog_level=1

Changes in /etc/hostapd/hostapd.macaccept

File permissions:
Owner: root
Group: root
Permissions: -rw-------

Click here for a download of the complete file: /etc/hostapd/hostapd.macaccept

Changed on 13.10.15
Issued by olli
Beginning line 1

List of allowed Client-MACs

# Epson Drucker
XX:XX:XX:XX:XX:XX
# gabosh-droid
XX:XX:XX:XX:XX:XX
# paddy
XX:XX:XX:XX:XX:XX
# luettje
XX:XX:XX:XX:XX:XX
# groot
XX:XX:XX:XX:XX:XX
# small-gabosh
XX:XX:XX:XX:XX:XX
# Eltern Smartphone
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
# Pias Notebook
XX:XX:XX:XX:XX:XX
# user2s Nexus 5
XX:XX:XX:XX:XX:XX
# think-gabosh
XX:XX:XX:XX:XX:XX
# Katrins (Flo) Smartphone
XX:XX:XX:XX:XX:XX
# TEST/BACKUP HTCs
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
# Flos Smartphone
XX:XX:XX:XX:XX:XX
# Ingo iPhone
XX:XX:XX:XX:XX:XX
# Philips Handy
XX:XX:XX:XX:XX:XX
# Stephan OLB
XX:XX:XX:XX:XX:XX
# Knirps
XX:XX:XX:XX:XX:XX
# Heike
XX:XX:XX:XX:XX:XX
# Tablet
XX:XX:XX:XX:XX:XX
# Nexus 5 user1
XX:XX:XX:XX:XX:XX
# Nexus 5
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
# Bettinas Nexus 5
XX:XX:XX:XX:XX:XX
#  Flos Horst Thinkpad
XX:XX:XX:XX:XX:XX
# Tim Smartphone
XX:XX:XX:XX:XX:XX
# delllaptop
XX:XX:XX:XX:XX:XX
# Janna iPhone
XX:XX:XX:XX:XX:XX
# Philip 
XX:XX:XX:XX:XX:XX
# user1 Bremer Smartphone
XX:XX:XX:XX:XX:XX
# user1 Bremer Notebook
XX:XX:XX:XX:XX:XX
# LG v500 Tablet Bettina
XX:XX:XX:XX:XX:XX
# Nexus 5 am Server
XX:XX:XX:XX:XX:XX
# HomePhone
XX:XX:XX:XX:XX:XX
# Teresas Smartphone
XX:XX:XX:XX:XX:XX
# Becky Kindle
XX:XX:XX:XX:XX:XX
# Flos Nexus 5
XX:XX:XX:XX:XX:XX
# Getrut Volkerts Smartphone
XX:XX:XX:XX:XX:XX
# Hero Notebook
XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX
# Krey
XX:XX:XX:XX:XX:XX
# Krey Dell-Notebook Celina (erna)
XX:XX:XX:XX:XX:XX
# Krey Dell-Notebook Carolin (liselotte)
XX:XX:XX:XX:XX:XX


Changes in /etc/udev/rules.d/10-wlan-stick.rules

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/udev/rules.d/10-wlan-stick.rules

Changed on 13.10.15
Issued by olli
Beginning line 1

Disable Power saving - May cause problems like "Warning - Data pending for entry X 4 in queue"

KERNEL=="wlan0", ACTION=="add", RUN+="/usr/sbiniw dev wlan0 set power_save off"
KERNEL=="wlan1", ACTION=="add", RUN+="/usr/sbiniw dev wlan1 set power_save off"

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add hostapd default
rc-update add net.wlan0 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

Webserver

I use name based virtual hosts for multiple domains under the same IP. Here is my Webserver and PHP configuration.
Before installing (emergeing) apache, change the /etc/make.conf as shown below.

If you want to use this solution you need the following howto(s) finished:

Required software

The required software has to be installed with the following command(s):
emerge www-servers/apache

Changes in /etc/apache2/modules.d/00_mod_log_config.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/apache2/modules.d/00_mod_log_config.conf

Changed on 13.01.09
Issued by olli
Beginning line 24

This activates apache logging for with vhost names in the log file


Before change
CustomLog /var/log/apache2/access_log common
After change
CustomLog /var/log/apache2/access_log vhost

Changes in /etc/apache2/vhosts.d/02_vhosts.conf

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/apache2/vhosts.d/02_vhosts.conf

Changed on 13.01.09
Issued by olli
Beginning line 1

Here are some settings for name based virtual hosts and some security settings before.


# ServerName
ServerName xgabosh.example.com

# Generate VHosts from Macro
Use VHost www.example.com
Use VHost fbofl.example.com
Use VHost drucker-ofl.example.com
Use VHost get.example.com
Use VHost doc.example.com
Use VHost gtc.example.com
Use VHost camofl.example.com
Use VHost epson.example.com
Use VHost status.example.com
Use VHost www.olmusic.de
Use VHost olmusic.example.com
Use VHost www.drachenrachen.de
Use VHost nextcloud.example.com
Use VHost nextcloud-test.example.com
Use VHost autoconfig.example.com
Use VHost vnc.example.com
Use VHost share.example.com
Use VHost media.example.com
Use VHost rss-bridge.example.com
Use VHost nextcloud-talk-signaling.example.com
Use VHost blog.example.com
Use VHost phpmyadmin.example.com
Use VHost shop.olmusic.de
Use VHost friendica.example.com

<Location /favicon.ico>
 Require all granted
</Location>

Changes in /etc/conf.d/apache2

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/conf.d/apache2

Changed on 09.09.08
Issued by olli
Beginning line 36

Apache startoptions for enabling PHP5 and SSL


Before change
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
After change
APACHE2_OPTS="-D DAV -D DAV_FS -D PHP -D SSL -D LANGUAGE -D PROXY -D MPM_ITK -D AUTHNZ_EXTERNAL"

Changes in /etc/php/gabosh-php.ini

File permissions:
Owner: root
Group: root
Permissions: -rw-r--r--

Click here for a download of the complete file: /etc/php/gabosh-php.ini

Changed on 23.02.11
Issued by olli
Beginning line 1

PHP-Configuration

; Don't log deprecated errors
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
; Don't display errors
display_errors = Off
display_startup_errors = Off
track_errors = Off
html_errors = Off
; Log errors to file
error_log = /var/log/apache2/php_errors.log
; Maximum post size of 20MB
post_max_size = 100M
; Maximum of 20MB upload
upload_max_filesize = 100M
; Default timezone for PHP
date.timezone = "Europe/Berlin"
; Maximum of 200 MySQL active connections at the same time
mysql.max_persistent = 200
; Maximum of 300 MySQL connections at the same time
mysql.max_links = 300
; Set max memory
memory_limit = 2048M
; INotify (pecl install inotify)
extension=inotify.so
; enable APC-Cache in CLI
apc.enable_cli=1
output_buffering = Off

Setting up services

For starting the new service after system reboot you should add it to a runlevel with the following command(s):

rc-update add apache2 

Please send a feedback to: doc<at>gabosh.net

Howto listing
File Index

File Index

/boot/grub/grub.cfg (Basesystem)
/etc/amavisd.conf (Mailserver)
/etc/amavisd.conf.bak (Mailserver)
/etc/apache2/modules.d/00_mod_log_config.conf (Webserver)
/etc/apache2/vhosts.d/02_vhosts.conf (Webserver)
/etc/apcupsd/apccontrol (APC UPS)
/etc/apcupsd/apcupsd.conf (APC UPS)
/etc/apcupsd/changeme (APC UPS)
/etc/apcupsd/commfailure (APC UPS)
/etc/apcupsd/commok (APC UPS)
/etc/apcupsd/offbattery (APC UPS)
/etc/apcupsd/onbattery (APC UPS)
/etc/asterisk/ari.conf (Asterisk as SIP PBX)
/etc/asterisk/extensions.conf (Asterisk as PJSIP PBX)
/etc/asterisk/extensions.conf.ok (Asterisk as SIP PBX)
/etc/asterisk/extensions.conf.old-sip (Asterisk as SIP PBX)
/etc/asterisk/rtp.conf (Asterisk as SIP PBX)
/etc/asterisk/sip.conf.old (Asterisk as SIP PBX)
/etc/asterisk/voicemail.conf (Asterisk as SIP PBX)
/etc/awstats/awstats.gabosh.net.conf (Statistics)
/etc/awstats/awstats.mailserver.conf (Statistics)
/etc/bind/named.conf (DNS)
/etc/clamd.conf (Mailserver)
/etc/conf.d/apache2 (Webserver)
/etc/conf.d/arpwatch (ARP monitoring)
/etc/conf.d/consolefont (Basesystem)
/etc/conf.d/dhcpd (DHCP-Server)
/etc/conf.d/dhcpd6 (DHCP-Server)
/etc/conf.d/dhcpd-vnet0 (Basesystem)
/etc/conf.d/dhcpd-wlan (DHCP-Server)
/etc/conf.d/in.tftpd (Server for thinclients)
/etc/conf.d/keymaps (Basesystem)
/etc/conf.d/local (Basesystem)
/etc/conf.d/named (DNS)
/etc/conf.d/net (Basesystem)
/etc/conf.d/net (WLAN Access Point)
/etc/conf.d/net (Internet Router (pppoe))
/etc/conf.d/net (Basesystem)
/etc/conf.d/net.bak (Basesystem)
/etc/conf.d/net.bak (WLAN Access Point)
/etc/conf.d/net.bak (Basesystem)
/etc/conf.d/pulseaudio (Network Sound Server)
/etc/conf.d/saslauthd (OpenLDAP System authentication)
/etc/cron.daily/clearat.sh (Basesystem)
/etc/cron.daily/cyrus-purge.sh (IMAP/POP3-Server)
/etc/cron.daily/spamassassinupdate (Mailserver)
/etc/cron.hourly/f2bcheck (Stopping brute-force-attacks with fail2ban)
/etc/cron.hourly/ntpdate.sh (Time-Server)
/etc/crontab (DynDNS)
/etc/crontab (Backup)
/etc/crontab (HD-Spindown)
/etc/crontab (OpenLDAP System authentication)
/etc/crontab (Mailserver)
/etc/crontab (NextCloud)
/etc/cron.weekly/gtcupdate (Thinclient - Basesystem)
/etc/cups/cupsd.conf (Printserver)
/etc/cups/cups-files.conf (Printserver)
/etc/default/btrfsmaintenance (Basesystem)
/etc/dhcpcd.conf (Internet IPv6 Router)
/etc/dhcp/dhcpd.conf (DHCP-Server)
/etc/dhcp/dhcpd.conf (Server for thinclients)
/etc/dhcp/dhcpd.conf (DHCP-Server)
/etc/dhcp/dhcpd-ldap.conf (DHCP-Server)
/etc/dhcp/dhcpd-ldap-wlan.conf (DHCP-Server)
/etc/dhcp/dhcpd-vnet0.conf (Basesystem)
/etc/dhcp/dhcpd-wlan.conf (DHCP-Server)
/etc/exports (Server for thinclients)
/etc/fail2ban/action.d/sendmail-common.local (Stopping brute-force-attacks with fail2ban)
/etc/fail2ban/jail.conf (Stopping brute-force-attacks with fail2ban)
/etc/fail2ban/jail.d/gabosh.conf (Stopping brute-force-attacks with fail2ban)
/etc/freshclam.conf (Mailserver)
/etc/fstab (Basesystem)
/etc/hostapd/hostapd.conf (WLAN Access Point)
/etc/hostapd/hostapd.conf-2.4 (WLAN Access Point)
/etc/hostapd/hostapd.conf-5 (WLAN Access Point)
/etc/hostapd/hostapd.macaccept (WLAN Access Point)
/etc/hosts (Basesystem)
/etc/jabber/ejabberd.yml (Instand Messaging alternative Jabber)
/etc/ldap.conf.old (OpenLDAP System authentication)
/etc/local.d/01_services.start (Firewall)
/etc/local.d/01_services.start (Automatic System Documentation)
/etc/logrotate.conf (Basesystem)
/etc/logrotate.d/gabosh (Basesystem)
/etc/logrotate.d/mysql (MySQL-Server)
/etc/mail/aliases (Mailserver)
/etc/mailman/mm_cfg.py (Mailinglists with MailMan)
/etc/mysql/mysql.d/50-distro-server.cnf (MySQL-Server)
/etc/nsswitch.conf (OpenLDAP System authentication)
/etc/ntp.conf (Time-Server)
/etc/openldap/ldap.ldif (OpenLDAP)
/etc/openldap/schema/dlz.schema (OpenLDAP)
/etc/openldap/schema/dnszone.schema (OpenLDAP)
/etc/otp.users (Two-factor authentication)
/etc/pam.d/horde (Two-factor authentication)
/etc/pam.d/sshd (Two-factor authentication)
/etc/pam.d/su (Two-factor authentication)
/etc/pam.d/system-auth (OpenLDAP System authentication)
/etc/pam.d/system-auth (File-Server - Samba)
/etc/pam.d/system-auth (OpenLDAP System authentication)
/etc/php/gabosh-php.ini (Webserver)
/etc/portage/profile/use.mask (Network Sound Server)
/etc/postfix/master.cf (Mailserver)
/etc/profile.d/cyrus.sh (IMAP/POP3-Server)
/etc/profile.d/mailman.sh (Mailinglists with MailMan)
/etc/profile.d/root.sh (Basesystem)
/etc/pulse/system.pa (Network Sound Server)
/etc/radvd.conf (Internet IPv6 Router)
/etc/rc.conf (Basesystem)
/etc/rsyslog.d/00-gtc.conf (Basesystem)
/etc/rsyslog.d/01-gabosh.conf (Basesystem)
/etc/sane.d/saned.conf (Sane Scanner Server)
/etc/sasl2/smtpd.conf (Mailserver)
/etc/saslauthd.conf (OpenLDAP System authentication)
/etc/security/limits.d/samba.conf (File-Server - Samba)
/etc/ssh/ssh_config (Basesystem)
/etc/ssh/sshd_config (Two-factor authentication)
/etc/ssh/sshd_config (Basesystem)
/etc/ssl/gabosh.net/readme (SSL/TLS with self signed SSL Certificate)
/etc/sysctl.conf (Firewall)
/etc/sysctl.conf (Basesystem)
/etc/sysctl.d/gabosh.conf (Firewall)
/etc/sysctl.d/gabosh.conf (Basesystem)
/etc/sysctl.d/gabosh.conf (Internet IPv6 Router)
/etc/udev/rules.d/10-wlan-stick.rules (WLAN Access Point)
/etc/xinetd.conf (Sane Scanner Server)
/etc/xinetd.d/sane-stream (Sane Scanner Server)
/gtc/pxe/pxelinux.cfg/default (Server for thinclients)
/gtc/test/etc/bash/bashrc.d/gabosh (Basesystem)
/gtc/test/etc/chromium/default (Thinclient - Basesystem)
/gtc/test/etc/conf.d/apache2 (Thinclient - Basesystem)
/gtc/test/etc/conf.d/dhcpd-tornet0 (Thinclient - Basesystem)
/gtc/test/etc/conf.d/dhcpd-vnet0 (Thinclient - Basesystem)
/gtc/test/etc/conf.d/display-manager (Thinclient - Basesystem)
/gtc/test/etc/conf.d/docker (Thinclient - Basesystem)
/gtc/test/etc/conf.d/hwclock (Thinclient - Basesystem)
/gtc/test/etc/conf.d/in.tftpd (Thinclient - Basesystem)
/gtc/test/etc/conf.d/local (Thinclient - Basesystem)
/gtc/test/etc/conf.d/net (Thinclient - Basesystem)
/gtc/test/etc/conf.d/NetworkManager (Thinclient - Basesystem)
/gtc/test/etc/conf.d/nfs (Server for thinclients)
/gtc/test/etc/conf.d/sshd (Thinclient - Basesystem)
/gtc/test/etc/conf.d/xdm (Thinclient - Basesystem)
/gtc/test/etc/crontab (Thinclient - Basesystem)
/gtc/test/etc/dconf/readme.txt (Thinclient - Mate)
/gtc/test/etc/default/btrfsmaintenance (Thinclient - Basesystem)
/gtc/test/etc/dhcpcd.conf (Thinclient - Basesystem)
/gtc/test/etc/dhcp/dhcpd-tornet0.conf (Thinclient - Basesystem)
/gtc/test/etc/dhcp/dhcpd-vnet0.conf (Thinclient - Basesystem)
/gtc/test/etc/env.d/90xsession (Thinclient - X-Server)
/gtc/test/etc/etc-update.conf (Thinclient - Basesystem)
/gtc/test/etc/exports (Thinclient - Basesystem)
/gtc/test/etc/init.d/checkroot (Thinclient - Basesystem)
/gtc/test/etc/init.d/procfs (Thinclient - Basesystem)
/gtc/test/etc/lightdm/lightdm.conf (Thinclient - X-Server)
/gtc/test/etc/lightdm/lightdm-gtk-greeter.conf (Thinclient - X-Server)
/gtc/test/etc/local.d/gtc.start (Thinclient - Basesystem)
/gtc/test/etc/local.d/gtc.stop (Thinclient - Basesystem)
/gtc/test/etc/modprobe.d/iwl4965.conf (Thinclient - Basesystem)
/gtc/test/etc/modprobe.d/iwlagn.conf (Thinclient - Basesystem)
/gtc/test/etc/modprobe.d/iwlwifi.conf (Thinclient - Basesystem)
/gtc/test/etc/modprobe.d/snd-hda-intel.conf (Thinclient - Basesystem)
/gtc/test/etc/NetworkManager/nm-system-settings.conf (Thinclient - Basesystem)
/gtc/test/etc/pam.d/login (Thinclient - Basesystem)
/gtc/test/etc/postfix/main.cf (Thinclient - Basesystem)
/gtc/test/etc/profile (Thinclient - Basesystem)
/gtc/test/etc/profile.d/gtc.sh (Basesystem)
/gtc/test/etc/ssh/ssh_config (Thinclient - Basesystem)
/gtc/test/etc/ssh/sshd_config (Thinclient - Basesystem)
/gtc/test/etc/ssl/gabosh.net/readme (SSL/TLS with self signed SSL Certificate)
/gtc/test/etc/sysctl.conf (Thinclient - Basesystem)
/gtc/test/etc/thinclient/default-profile/start.sh (Thinclient - Profiling)
/gtc/test/etc/thinclient/global-profile/start.sh (Thinclient - Profiling)
/gtc/test/etc/thinclient/scripts/az (Sort files alphabetical)
/gtc/test/etc/thinclient/scripts/check-hdd.sh (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/check-mem.sh (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/check-swap.sh (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/check-temperature.sh (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-additional-sw-add (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-additional-sw-del (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-compiz (Thinclient - X-Server)
/gtc/test/etc/thinclient/scripts/gtc-crypt (Save passwords encrypted)
/gtc/test/etc/thinclient/scripts/gtc-ieurl (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-info (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-install (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-mkiso (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-rename (Rename files recursively)
/gtc/test/etc/thinclient/scripts/gtc-update (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-update-post (Thinclient - Basesystem)
/gtc/test/etc/thinclient/scripts/gtc-xconfig (Thinclient - X-Server)
/gtc/test/etc/thinclient/server-profile/etc/apache2/vhosts.d/vhosts.conf (Thinclient - Thinclient as Server)
/gtc/test/etc/thinclient/server-profile/etc/bind/named.conf (Thinclient - Thinclient as Server)
/gtc/test/etc/thinclient/server-profile/etc/conf.d/apache2 (Thinclient - Thinclient as Server)
/gtc/test/etc/thinclient/server-profile/etc/dhcp/dhcpd.conf (Thinclient - Thinclient as Server)
/gtc/test/etc/thinclient/server-profile/etc/exports (Server for thinclients)
/gtc/test/etc/thinclient/server-profile/etc/openldap/schema/dnszone.schema (OpenLDAP)
/gtc/test/etc/thinclient/server-profile/etc/phpldapadmin.conf (Thinclient - Thinclient as Server)
/gtc/test/etc/thinclient/server-profile/start.sh (Thinclient - Thinclient as Server)
/gtc/test/etc/thinclient/startup/gtc-startupconfig (Thinclient - Kernel-based Virtual Machine - KVM)
/gtc/test/etc/thinclient/startup/gtc-startupconfig (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/gtc-startupconfig (Thinclient - Profiling)
/gtc/test/etc/thinclient/startup/jobs/gtc-anonproxy (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-autologin (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-ldap (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-local (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-localization (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-nfsmount (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-thinkpad (Thinclient - Basesystem)
/gtc/test/etc/thinclient/startup/jobs/gtc-zautoupdate (Thinclient - Basesystem)
/gtc/test/etc/thinclient/thinclient.conf.local (Thinclient - Basesystem)
/gtc/test/etc/ufw/after.rules (Thinclient - Basesystem)
/gtc/test/etc/ufw/before.rules (Thinclient - Basesystem)
/gtc/test/etc/wpa_supplicant/wpa_supplicant.conf (Thinclient - Wireless LAN)
/gtc/test/usr/lib64/thunderbird/defaults/pref/gabosh.js (Thinclient - Thunderbird)
/usr/local/bin/awstats (Statistics)
/usr/local/bin/az (Sort files alphabetical)
/usr/local/bin/changedocd.pl (Automatic System Documentation)
/usr/local/bin/gtc-rename (Rename files recursively)
/usr/local/bin/sysdoc.pl (Automatic System Documentation)
/usr/local/sbin/checkusers.sh (OpenLDAP System authentication)
/usr/local/sbin/cyr-create-mbox (IMAP/POP3-Server)
/usr/local/sbin/cyr-delete-mbox (IMAP/POP3-Server)
/usr/local/sbin/cyr-resize-mailbox.pl (IMAP/POP3-Server)
/usr/local/sbin/cyr-set-acl (IMAP/POP3-Server)
/usr/local/sbin/cyr-set-sieve.sh (IMAP/POP3-Server)
/usr/local/sbin/cyr-show-dirs (IMAP/POP3-Server)
/usr/local/sbin/cyr-show-mailboxes (IMAP/POP3-Server)
/usr/local/sbin/deduplicate.pl (File deduplication)
/usr/local/sbin/fireoff.sh (Firewall)
/usr/local/sbin/fire.sh (Firewall)
/usr/local/sbin/fire.sh (Asterisk as SIP PBX)
/usr/local/sbin/gtc-crypt (Save passwords encrypted)
/usr/local/sbin/hdspindown.sh (HD-Spindown)
/usr/local/sbin/mailaddresses.sh (Mailserver)
/usr/local/sbin/maillists-2.sh (Mailinglists with MailMan)
/usr/local/sbin/maillists.sh (Mailinglists with MailMan)
/usr/local/sbin/mkgtcstable.sh (Server for thinclients)
/usr/local/sbin/mkhordestable.sh (Horde Groupware Webmail)
/usr/local/sbin/msgwatch (Basesystem)
/usr/local/sbin/powerconsumption.sh (APC UPS)
/usr/local/sbin/rsyncwatch (Basesystem)
/usr/local/sbin/smbwatch (File-Server - Samba)
/var/www/doc.gabosh.net/cgi-bin/changedoc.pl (Automatic System Documentation)
/var/www/doc.gabosh.net/htdocs/howto.css (Automatic System Documentation)
/var/www/www.gabosh.net/htdocs/intern/phpldapadmin/config/config.php (OpenLDAP WebGUI phpldapadmin)

GNU Free Documentation License

GNU Free Documentation License

Version 1.3, 3 November 2008

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

The "publisher" means any person or entity that distributes copies of the Document to the public.

A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition.

The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies.

3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements".

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

11. RELICENSING

"Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site.

"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

"Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document.

An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.