netprofiles0.2 - use this to install the core scripts (it will untar to / unless otherwise told)
netprofiles0.2-NMcaller - This contains the NM caller (no bash script)
MyProfiles - My sample profiles (full,home,public,hidden)
you will also need to add a script to /etc/NetworkManger/dispatcher.d/ such as
#!/bin/sh pkill chooseprofile.py /etc/netprofiles/callers/NetworkManager/chooseprofile.py $2 exit 0or netprofiles0.2-full - Everything including the bash script (it will untar /)
once installed you may want to make a link for set_uuid_profile.py as it is a program to be used by humans.
sudo ln -sv /etc/NetworkManager/callers/NetworkManager/set_uuid_profile.py /usr/bin/set_uuid_netprofileI'm using and testing it on my computer but I haven't done extensive tests as I don't use all the features and don't know if anybody else is going to use it so consider the software untested.
License:
Do little scripts like this need a license? Is it worth GPLing something that is by its very nature open? I've assumed that its public domain on account of them being small scripts however if they can be licensed then the main script is derived from my /etc/rc so my code is under the same license.
Documentation:
I will add manpages in v0.3 if people start using it.
Code (in order of execution):
/etc/NetworkManager/dispatcher.d/80-profilechanger
#!/bin/sh pkill chooseprofile.py /etc/netprofiles/callers/NetworkManager/chooseprofile.py $2 exit 0/etc/netprofiles/callers/NetworkManager/chooseprofile.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
log = open("/var/log/netprofiles.log",'a')
profilemap = "/etc/netprofiles/callers/NetworkManager/profilemap"
settings = "/etc/netprofiles/callers/NetworkManager/settings"
executable ="/etc/netprofiles/run-netprofile"
try:
from sys import exit,argv
from os import system,EX_OK,EX_DATAERR,EX_USAGE
from time import sleep
import dbus
except:
log.write("ERROR:modules not loaded correctly, dbus,sys,os,time may be missing or python maybe misconfigured\n")
log.close()
exit()
def getUuid():
bus = dbus.SystemBus()
proxy = bus.get_object("org.freedesktop.NetworkManager","/org/freedesktop/NetworkManager") #find the active connection
active_cons = proxy .Get("org.freedesktop.NetworkManager", "ActiveConnections")
if len(active_cons) == 0: leave("ERROR:profilechanger called when not connected to a network\n",EX_DATAERR)
active_con = active_cons[0]
proxy = bus.get_object("org.freedesktop.NetworkManager", active_con) #move the proxy to the active connetion
con = proxy .Get("org.freedesktop.NetworkManager", "Connection") #get info on connection object
service = proxy .Get("org.freedesktop.NetworkManager", "ServiceName")
proxy = bus.get_object(service,con) #move the proxy to the real deal
settings = proxy .GetSettings() #get a dict of dicts
consettings = settings['connection']
uuid = consettings['uuid']
return uuid
def getProfile(uuid):
profile = ""
try:
f = open(profilemap, 'r')
except IOError:
log.write("ERROR:profilemap file could not be opened\n")
else:
for line in f:
if line.startswith("#"): continue #allow comments
line = line.split("#")[0]
linelst = line.strip("\n").split(',')
if uuid == linelst[0]:
profile = linelst[1]
break
log.write("LOG: "+uuid+" judged to be "+profile+"\n")
f.close()
if profile == "":
log.write("LOG: "+uuid+" is an unkown network\n")
dAction, dProfile, dDelay, uCmd, profile = getSettings()
if uCmd != "":
log.write("LOG: calling "+uCmd+" "+uuid+" "+profile+"\n")
system(uCmd+" "+uuid+" "+profile)
return profile
def getSettings():
dAction = "change" #hardcode defaults incase of errors
dProfile = "offline"
dDelay = 0
uProfile = "unkown"
uCmd = ""
try:
f = open(settings,'r')
except IOError:
log.write("ERROR:settings file could not be opened\n")
else:
for line in f:
if line.startswith("#"): continue #allow comments
line = line.split("#")[0]
linelst = line.strip("\n").split(' ',1)
if len(linelst)>1:
if linelst[0] == "onDisconnect": dAction = str(linelst[1])
elif linelst[0] == "disconnectProfile": dProfile = str(linelst[1])
elif linelst[0] == "disconnectDelay": dDelay = float(linelst[1])
elif linelst[0] == "unkownProfile": uProfile = str(linelst[1])
elif linelst[0] == "uCmd": uCmd = str(linelst[1])
f.close()
return dAction, dProfile, dDelay, uCmd, uProfile
def run():
if len(argv) != 2:
leave("ERROR:"+argv[0]+" called with "+str(len(argv)-1)+" arguments but takes exactly 1\n",EX_USAGE)
if argv[1] == "up":
uuid = getUuid()
profile = getProfile(uuid)
elif argv[1] == "down":
dAction, profile, dDelay, uCmd, uProfile = getSettings()
if dAction == "change":
sleep(dDelay)
else:
leave("LOG: no action taken on network shutdown\n",EX_OK)
system(executable+" "+profile)
leave("LOG: Switching to "+profile+"\n",EX_OK)
def leave(message="",code=EX_OK):
log.write(message)
log.close()
exit(code)
run()
/etc/netprofiles/run-netprofile#! /bin/bash
#
# netrc This file is responsible for starting/stopping net services when the netprofile changes.
# Authors:
# Juan Canham <juan.canham@googlemail.co.uk>
# Miquel van Smoorenburg, (of RC not netrc DO NOT CONTACT HIM FOR SUPPORT)
# set -m
# check a file to be a correct runlevel script
check_runlevel ()
{
# Check if the file exists at all.
[ -x "$1" ] || return 1
is_ignored_file "$1" && return 1
return 0
}
. /etc/init.d/functions
export CONSOLETYPE
UPSTART=
[ -x /sbin/initctl ] && UPSTART=yes
# Get first argument. Set new netprofile to this argument.
[ -n $1 ] && netprofile=$1
profiledir=/etc/netprofiles/profiles/$netprofile
export netprofile
# Set language, vc settings once to avoid doing it for every init script
if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then
. /etc/profile.d/lang.sh
export LANGSH_SOURCED=1
fi
#run early scripts
for i in $profiledir/scripts/[0-2]* ; do
[ -x $i ] && . $i $1
done
# First, run the KILL scripts.
for i in $profiledir/rc/[K,R]* ; do #kill then restart
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#$profiledir/rc/[K,R]??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue
# Bring the subsystem down.
[ -n "$UPSTART" ] && initctl emit --quiet "stopping $subsys"
$i stop
[ -n "$UPSTART" ] && initctl emit --quiet "stopped $subsys"
done
# move configs (external python script for now)
[ -d $profiledir/etc ] && /etc/netprofiles/linkswap.py $profiledir/etc
for i in iptables ip6tables arptables ; do
[ -f $profiledir/$i ] && $i-restore < $profiledir/$i
done
# run additional scripts
for i in $profiledir/scripts/[3-6]* ; do
[ -x $i ] && . $i $1
done
# Iterate over the restart/start scripts
for n in {0..99}; do
for i in $profiledir/rc/[S,R]$n* ; do #start then restart in sync
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#$profiledir/rc/[S,R]??} # figureout this line
[ -f /var/lock/subsys/$subsys ] && continue
[ -f /var/lock/subsys/$subsys.init ] && continue
# Bring the subsystem up.
[ -n "$UPSTART" ] && initctl emit --quiet "starting $subsys"
$i start
[ -n "$UPSTART" ] && initctl emit --quiet "started $subsys"
done
done
#run late scripts
for i in $profiledir/scripts/[7-9]* ; do
[ -x $i ] && . $i $1
done
echo $netprofile > /var/run/netprofile
exit 0
/etc/netprofiles/linkswap.py#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import datetime
from sys import argv
newdir=argv[1]
offdir="/etc/netprofiles/profile/offline/etc"
def changelinks(top,ndir,fnames):
rdir = "/"+ndir.strip(top)+"/"
odir = "/etc"+rdir
for fname in fnames:
if os.path.isdir(ndir+fname): continue
if not os.path.islink(odir+fname):
if not exists(offdir+rdir): os.makedirs(offdir+rdir)
if not lexists(offdir+rdir+fname):
os.rename(odir+fname,offdir+rdir+fname)
os.link(offdir+rdir+fname,odir+fname)
else: #TODO: do a diff to save all this work
i=0
while lexists(offdir+rdir+fname+"-"+datetime.date.today().strftime("%Y%m%d")+"-"+i):
i +=1
os.rename(odir+fname,offdir+rdir+fname+"-"+datetime.date.today().strftime("%Y%m%d")+"-"+i)
os.link(offdir+rdir+fname+"-"+datetime.date.today().strftime("%Y%m%d")+"-"+i,odir+fname)
if islink(odir+fname): os.link(odir+fname,ndir+fname) #should i be messing with hardlinks?
os.path.walk(newdir,changelinks,newdir)
the default config fileonDisconnect change disconnectProfile public disconnectDelay 15 uProfile public uCmdmy profiles (as on fedora 11)
| sshd | rpcbind | rpcsvcgssd | rpcgssdsc | rpcidmapd | winbind | nmb | smb | vsftpd | avahi-deamon | nfs | nfslock | netfs | ntpd | portreserve | |
| start | 75 | 13 | 31 | 17 | 17 | 27 | 65 | 65 | 50 | 98 | 80 | 17 | 25 | 58 | 11 |
| stop | 25 | 87 | 69 | 83 | 83 | 73 | 35 | 35 | 50 | 2 | 20 | 83 | 75 | 42 | 88 |
| full | on | on | on | on | on | restart | restart | restart | restart | on | on | on | on | on | on |
| home | off | on | on | on | on | restart | restart | restart | restart | on | on | on | on | on | on |
| public | off | off | off | off | off | off | off | off | off | off | off | off | off | on | off |
| hidden | off | off | off | off | off | off | off | off | off | off | off | off | off | off | off |
unfortunately as I couldn't find what a default Ubuntu or fedora install looks like without messing around with liveCDs, the offline profile is empty
Access:
I'm not sure on the best way to give access to the code, if people start using it I will look into git/svn hosting or hosting it locally.
No comments:
Post a Comment