Setting up Samba on a Linux installation

Submitted by Jochus on Fri, 22/02/2013 - 23:21 | Posted in: Linux
Posted in

I just found this old article I've written down once to configure Samba on a Linux installation. This article was written in Dutch, but I didn't want it to get lost, so I added it to my blog.

Installatie Samba

  • Installatie pakket
  • $ sudo aptitude install samba

  • Ga naar /etc/samba/smb.conf en pas volgende wijzingen toe:
  • Toegang tot werkgroep:
  • # Change this to the workgroup/NT-domain name your Samba server will part of
       workgroup = MSHOME

  • Netwerknaam computer:
  • # server string is the equivalent of the NT Description field
       server string = %h server (Samba, Ubuntu)

  • Sharen van de home folder:
  • # Un-comment the following (and tweak the other settings below to suit)
    # to enable the default home directory shares.  This will share each
    # user's home directory as \\server\username
    [homes]
       comment = Home Directories
       browseable = yes
     
    # By default, \\server\username shares can be connected to by anyone
    # with access to the samba server.  Un-comment the following parameter
    # to make sure that only "username" can connect to \\server\username
    # This might need tweaking when using external authentication schemes
    ;   valid users = %S
     
    # By default, the home directories are exported read-only. Change next
    # parameter to 'yes' if you want to be able to write to them.
       writable = yes

  • Toevoegen gebruiker aan SMB PASSW DB:
  • $ sudo smbpasswd -a jochus
    New SMB password:
    Retype new SMB password:

  • Herstart Samba
  • $ sudo /etc/init.d/samba restart

Installatie SMBFS

  • Verder wil ik ook mijn windows-server data schijf kunnen mounten. Er zijn hiervoor 2 mogelijkheden. Ofwel gebruik je een commandline tooltje als ''smbclient'', ofwel ga je data schijf mounten alsof het echte harde schijven zijn
  • Installeer smbfs
  • $ sudo aptitude install smbfs

  • Om andere gebruikers de map te kunnen mounten, moeten we deze ook rechten geven
  • $ sudo chmod u+s /usr/bin/smbmnt /usr/bin/smbumount

  • Maak een mount point aan
  • $ sudo mkdir /mnt/data

  • Om aan de schijf te kunnen geraken moeten we inloggen met Windows credentials
  • $ sudo nano /etc/samba/user

  • Vul in
  • USERNAME
    PASSWORD

  • Voor de veiligheid
  • $ sudo chmod 0600 /etc/samba/user

  • Voeg aan /etc/fstab het volgende toe:
  • //server/share   /mnt/data   smbfs   credentials=/etc/samba/user,rw,uid=bob   0   0

  • Mounten gaat nu via:
  • $ mount /mnt/data

Testing the Graph API of Facebook

Submitted by Jochus on Thu, 21/02/2013 - 23:56 | Posted in: Java
Posted in


I just tested the "new" (already in Facebook since June 2011) Graph API of Facebook. Using the RestFB Java client (http://www.restfb.com/), I was able to get a list of my friends, update my status, ... etc, etc. For testing, I retrieved an access token using the Graph Explorer tool (https://developers.facebook.com/tools/explorer).

Java project setup (pom.xml)

<project>
	<modelVersion>4.0.0</modelVersion>
	<groupId>be.jochenhebbrecht</groupId>
	<artifactId>facebook-test</artifactId>
	<version>1.0.0-SNAPSHOT</version>
 
	<dependencies>
		<dependency>
			<groupId>com.restfb</groupId>
			<artifactId>restfb</artifactId>
			<version>1.6.11</version>
		</dependency>
	</dependencies>
</project>

Getting a list of friends

import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.types.User;
 
public class FacebookTest {
 
	private static final String MY_ACCESS_TOKEN = "##REPLACE_ME##";
 
	public static void main(String[] args) {
		FacebookClient facebookClient = new DefaultFacebookClient(MY_ACCESS_TOKEN);
		Connection<User> myFriends = facebookClient.fetchConnection("me/friends", User.class);
 
		for (User u : myFriends.getData()) {
			System.out.println(u.getName());
		}
        }
}

Updating my status

import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.types.FacebookType;
 
public class FacebookTest {
 
	private static final String MY_ACCESS_TOKEN = "##REPLACE_ME##";
 
	public static void main(String[] args) {
		FacebookClient facebookClient = new DefaultFacebookClient(MY_ACCESS_TOKEN);
		FacebookType publishMessageResponse = facebookClient.publish("me/feed", FacebookType.class, Parameter.with("message", "Test from Graph API"));
		System.out.println("Published message ID: " + publishMessageResponse.getId());
        }
}

Kerio Mail Server: Cannot access message 0000000x in folder ~someone@somedomain.com/INBOX

Submitted by Jochus on Thu, 21/02/2013 - 22:45 | Posted in: Windows
Posted in

Problem

The following error appeared in the error.log of my Kerio Mail server:

Cannot access message 0000000x in folder ~<a href="mailto:someone@somedomain.com">someone@somedomain.com</a>/INBOX

Solution

In most of the cases, Kerio Mail Server is smart enough to repair the errors by itself. But in some cases, it just doesn't work. Manual repair is required.

  • Make sure all your clients are disconnected from the server - so you won't have any active sessions left
  • Go to the folder: /store/mail/domain/user/folder_name/
  • Rename the file index.fld to index.fld.bad
  • Now connect again with your user. Kerio Mail Server will see the index file is missing and it will automatically rebuild it. This step can take a while for very large mail folders!

Automatic user login in Windows

Submitted by Jochus on Thu, 21/02/2013 - 22:06 | Posted in: Windows
Posted in

Problem

When you're having multiple users on your windows installation, the system will always ask you which user should be used to login. But in some cases, you always want to login automatically with the same user (because the 2nd, 3rd, ... user are almost not used). How to achieve the automatic login?

Solution

Go to:

  • Start > Run
  • Type: control userpasswords2
  • Unhceck: Users must enter a user name and password to use this computer
  • Press OK
  • The system will ask you now for the default username and password (2x). This user will be used to automatically log in

Linux bridging alternative

Submitted by Jochus on Wed, 20/02/2013 - 22:37 | Posted in: Linux
Posted in
I just found this old article I've written down once to simulate a Linux network bridging alternative. This article was written in Dutch, but I didn't want it to get lost, so I added it to my blog.

Probleem

Enkele jaren heb ik gretig gebruik gemaakt van een Windows 2003 serverke. Maar het toestel werd oud en traag en was dringend aan vervanging toe.
Bij het opzetten van een nieuwe server heb ik gekozen voor Ubuntu, omdat ik al veel positieve dingen gehoord/gelezen heb qua servers & Linux. Bovendien was het zeker niet slecht om mijn CV wat aan te vullen ;-)

Goed, 1 van de vereisten is dat mijn server als netwerk brug functioneert. Waarom? Dat valt hier eigenlijk buiten de scope van het document, maar het is bedoeld om een printer en andere DHCP clients te voorzien via HUB en de server richting het internet (en ook andere DHCP clients in het gebouw)

Bij de windows server ging dat perfect. Je selecteert 2 verbindingen: de wired en de wireless, en je kiest voor Netwerk brug maken...
De rest gebeurt van zelf, en klaar is kees :-).

Bij Linux was dit probleem precies iets anders. Er is genoeg documentatie te vinden over het bridgen van 2 wired interfaces, maar niet zo veel voor wireless en wired.

Dagen heb ik zitten prutsen om de brug in orde te brengen, maar ik kreeg ze maar niet werkend.
Het probleem is als volgt: mijn Linksys WRT54GS stuurt pakketten uit die WDS informatie bevatten. Die informatie zorgt ervoor dat pakketten hetzelfde MAC adres blijven behouden over verschillende access points heen. Nu moet mijn driver van mijn netwerkkaart wel die WDS pakketten verstaan om ze deftig te kunnen doorgeven aan mijn eth0 zijde => MAC spoofing!

En dit was dus niet mogelijk, het MAC adres kon niet gespoofd worden, waardoor mijn pakketten verloren gingen ...
Met andere woorden: ik ben gesjost. Ik kon geen netwerk brug maken onder Linux en dat was voor mij wel een redelijk pain-in-the-ass.
Maar Jochus zou Jochus niet zijn, moest hij daarvoor geen oplossing hebben ...

Getroffen systemen

ROUTER

  • systeem: WRT54GS

SERVER

  • OS: Ubuntu 8.10 Intrepid
  • wireless interface: WMP54G
  • wired interface: RealTek RTL8139

CLIENTS

  • OS: Windows XP SP3
  • wired/wireless interface: doeterniettoe :-)

Oplossing

Alle clients die aangesloten zijn op mijn router, zitten het in het 192.168.1.0/32 netwerk. Ook mijn server heeft verbinding met mijn router op interface wlan0

auto wlan0
iface wlan0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1

Nu heb ik op mijn eth0 interface een 2e subnet geconfigureerd: 192.168.0.0/32. Mijn server zal instaan voor het verkeer tussen de 2 subnetten.
Maar hoe zet je zoiets op?

Configureren eth0 onder Ubuntu

  • Configureren wired connectie (eth0) in een ander subnet
  • Voeg volgende sectie toe aan: /etc/network/interfaces
  • Tip! gebruik geen gateway, want dan zal je standaard verkeer telkens naar eth0 vliegen, ipv wlan0

auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0

Toestaan dat IP pakketten van interface wlan0 doorgegeven worden aan eth0 en vice versa

  • Pas volgende file aan: /etc/sysctl.conf

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

IP pakketten herzien van bron- en doelbestemming, zodat pakketten aan de juiste PC teruggegeven worden

$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Aanpassen printerconfiguratie

Op de printer zelf heb ik dan volgende configuratie ingesteld:

address: 192.168.0.2
submask: 255.255.255.0
gateway: 192.168.0.1

Op de clients moest ik ook de printer- en scannerpoort veranderen naar 192.168.0.2

===========
= PRINTER =
===========
* rechts klikken op je printer 
* Eigenschappen
* Tabblad: Poorten
* Selecteer de bestaande poort en druk op Poort configureren
* Stel IP-adres in op : 192.168.0.2
 
===========
= SCANNER =
===========
* Start
* Configuratiescherm
* Scanners & Camera's
* rechts klikken op je scanner
* Eigenschappen
* Tabblad: Netwerkinstellingen
* Stel IP-adres in op : 192.168.0.2

Aanpassen clients

Nu zijn we er nog niet. Want de pakketten zullen op de clients telkens naar 192.168.1.1 gestuurd worden (juist ja de router!). Hoe krijgen we die tot bij de server?

  • a) ... ofwel configureer je een extra route in de router, zodat via de DHCP offers de route ook wordt meegegeven
  • b) ... ofwel configureer je dit manueel op iedere client

Aangezien al mijn clients statisch ingesteld zijn, moest ik wel voor optie b) gaan.
Je moet op elke client het volgende ingeven:

$ route -p ADD 192.168.0.0 MASK 255.255.255.0 192.168.1.100

Customising your terminal with colors

Submitted by Jochus on Wed, 20/02/2013 - 22:11 | Posted in: Mac
Posted in

Problem

In my terminal, I like to have the words username@machinename colored. This makes it more easy to separate different commands.

Solution

Add following rule(s) to ~/.bashrc:

User

  • Linux

PS1='\[\033[01;32m\]\u@\h \[\033[01;34m\]\w \$ \[\033[00m\]'

  • Mac OS X

PS1='\[\033[1;32m\]\u@\h\[\033[0m\] \[\033[1;36m\]\w\[\033[0m\] $ '
CLICOLOR=1
LSCOLORS=ExFxBxDxCxegedabagacad

root

PS1='\[\033[01;31m\]\u@\h \[\033[01;34m\]\w \$ \[\033[00m\]'

Running tests through JUnit SwingUI Test Runner and JDeveloper 10g

Submitted by Jochus on Wed, 20/02/2013 - 21:13 | Posted in: Java
Posted in

Problem

The following error occurred when running a JUni test

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [com/psws/psbilling/test/spring/dataSourceContext.xml]; nested exception is java.lang.IllegalArgumentException: Class [org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler] does not implement the NamespaceHandler interface
Caused by: java.lang.IllegalArgumentException: Class [org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler] does not implement the NamespaceHandler interface
	at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.initHandlerMappings(DefaultNamespaceHandlerResolver.java:119)
	at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.<init>(DefaultNamespaceHandlerResolver.java:96)
	at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.<init>(DefaultNamespaceHandlerResolver.java:82)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.createDefaultNamespaceHandlerResolver(XmlBeanDefinitionReader.java:526)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.createReaderContext(XmlBeanDefinitionReader.java:515)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:495)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:340)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:125)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:141)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:167)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:79)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:94)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:292)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
	at org.springframework.test.AbstractSingleSpringContextTests.loadContextLocations(AbstractSingleSpringContextTests.java:182)
	at org.springframework.test.AbstractSingleSpringContextTests.loadContext(AbstractSingleSpringContextTests.java:152)
	at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:105)
	at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:83)
	at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)

Solution

After Googling a while, I noticed some classes are cached inside the Spring context. Theses classes cannot be accessed from the classloader which is used to startup the JUnit Testrunner. So the dependency injection fails.

The following step solved this issue:

  • Add in your home folder (e.g.: /Users/jochen/) the file: junit.properties
  • Provide the following file contents:
    loading=false

MySQL table names always converted to lowercase

Submitted by Jochus on Thu, 14/02/2013 - 16:58 | Posted in: Mac
Posted in

Problem

When I execute DDL statements to my MySQL database on my Mac installation, every table is converted to lowercase letters - even if the name is in uppercase letters in my script. This leads to errors in ALTER TABLE operations to add foreign keys (because of case sensitive).

Solution

According to this page:

How table and database names are stored on disk and used in MySQL is affected by the lower_case_table_names system variable, which you can set when starting mysqld. lower_case_table_names can take the values shown in the following table. This variable does not affect case sensitivity of trigger identifiers. On Unix, the default value of lower_case_table_names is 0. On Windows the default value is 1. On Mac OS X, the default value is 2.

I updated my my.cnf file:

$ sudo nano /private/etc/my.cnf

... by adding the following line:

lower_case_table_names=0