BYLAWS OF THE CINCINNATI LINUX USERS GROUP

September 27, 1998
ARTICLE I. NAME
The incorporated organization shall be named the Cincinnati GNU/Linux Users Group, Incorporated, also known as the Cincinnati Linux Users Group, hereinafter known as CLUG.
ARTICLE II. OBJECT
The object of CLUG is to bring together computer users who encourage the study of and use of the GNU/Linux operating system. Education of the members and the general public is a goal of the organization.
ARTICLE III. MEMBERS

Section 1. Membership in the organization shall be open to all who are interested in the GNU/Linux operating system.

Section 2. Classes of membership

Individual, shall pay full membership dues.
Family membership shall include all rights of membership with the understanding that a family membership shall be entitled to one vote, although those having family memberships shall be permitted to make motions and speak in debate, making a dues payment as established for an individual membership.
Student membership, which may result in a reduced dues rate.

Section 3. Dues shall be proposed by the Board of Directors to be approved by the general membership.

The Board of Directors may reduce the dues for a membership on request, determining such reduction in executive session.
Family memberships shall be available to those residing in the same household.

Section 4. The fiscal year begins annually on January 1.

Dues are to be paid on January 1. Dues shall be delinquent if not received by the treasurer by February 1. Members whose dues are delinquent shall be notified of delinquency within two weeks and members whose dues are delinquent after February 28 shall be dropped from membership.
Membership dues shall be prorated on a monthly basis.

ARTICLE IV. BOARD OF DIRECTORS/TRUSTEES

Section 1. The Board of Directors shall serve as trustees of the corporation.

Section 2. The officers shall be a president, vice- president, secretary, and treasurer.

Section 3. There shall be three directors who shall serve with the officers on the Board of Directors.

Section 4. Officers and directors shall be voting members of CLUG; they shall serve one-year terms or until their successors are elected and begin their terms of office. No officer shall serve more than two successive terms in the same position.

Section 5. Election shall take place in November with term of office to begin January 1.

Section 6. A nominating committee of three persons shall be selected by the Board with the chairman of the nominating committee not being a member of the Board. They shall nominate at least one person for each office and directorship and communicate the nominations by mail or electronic means to the membership by October 15. Nominations from the floor shall be accepted.

Section 7. Elections shall be held at the November meeting, with election by ballot unless there is only one nominee for a position when a voice vote may elect.

Section 8. The Board shall meet on call of the president or any two members with notice of at least seven days.

Section 9. The Board shall have general supervision of CLUG between meetings of the general membership and shall be authorized to determine issues which may be deliberated and voted on by electronic means. Quorum of the Board shall be four members.

Section 10. Vacancies in any position of the Board of Directors shall be filled by those remaining on the Board of Directors with the exception of the office of president which shall be filled by the vice-president should that office become vacant.

Section 11. Board of Directors meetings are open to members. The Board may go into executive session for deliberation of sensitive issues.
ARTICLE V. MEETINGS

Section 1. Regular meetings shall be held monthly with the location, time, and date to be determined by the Board of Directors who have the authority to postpone or cancel meetings upon the agreement of four members of the Board with notice by electronic means.

Section 2. The regular meeting in November shall be the annual meeting at which officer and committee reports shall be heard, and election held. Meeting notice of at least fourteen days shall be given to all members by mail or electronic means.

Section 3. Special meetings may be held on the call of four members of the Board, or ten members who request such a meeting with notice of at least seven days by mail or electronic means.

Section 4. The quorum for regular meetings of the membership is ten members.

Section 5. Regular meetings are open to the public.
ARTICLE VI. DUTIES OF OFFICERS

Section 1. Duties of the officers are as follows:

President: The President shall preside at all meetings of the membership and the Board of Directors. The President shall call the regular meetings and special meetings of the organization. The President shall enforce all rules of the organization and perform all duties of the presidents of like organizations. The President is a member ex-officio of all committees except the nominating committee.
Vice-president: The Vice-president shall perform all duties of the President in case of absence or disability of the President.
Secretary: The Secretary shall record minutes of all meetings of the general membership and the meetings of the Board of Directors.
Treasurer: The Treasurer shall assume responsibility for all funds and financial records of the organization. The Treasurer shall issue financial reports at meetings of the general membership and of the Board of Directors.

Section 2. In addition to described duties, officers shall perform other duties customary to the office.
ARTICLE VII. COMMITTEES AND SPECIAL INTEREST GROUPS
The Board of Directors or the general membership gathered in meetings are each empowered to establish committees and special interest groups as needed.
ARTICLE VIII. PARLIAMENTARY AUTHORITY
The rules contained in the current edition of Robert’s Rules of Order Newly Revised shall govern CLUG in all cases to which they are applicable and in which they are not inconsistent with these bylaws and any special rules of order CLUG shall adopt.
ARTICLE IX. AMENDMENTS
These bylaws may be amended at any meeting by a two-thirds vote provided notice of proposed changes, additions, or deletions shall have been submitted in writing thirty days before the meeting. Notice shall be mailed or be sent by email or FAX to all members, at least two weeks before the meeting.

Backing up VirtualBox VMs

This script below is what I use to make backups of running Windows VMs, they are put into hibernation, then the drive is imaged, then the machine is woken back up. There is downtime with this method, but not much and it is easy to schedule as a low use-time service.


#!/bin/bash
##
## Destination of backup files
## Script won't run if directory doesn't exist, and please note that this runs with a normal
## users privileges, so the $BACKUPDEST must be writable by the user running the VM.
BACKUPDEST="/Backup/VMs/${USER}"

## How many days a compressed version will be left on server
DAYS_TO_KEEP_TAR="+7"

## Exempt VMs - Place each VM with a space seperating them
## Example: ( linux winxp win7 ) or
## ( "Ubuntu 8.04" "Windows XP" ) or
## ( None )
## More here: http://www.cyberciti.biz/faq/bash-for-loop-array/
## Run Command to find list of VMS:
## VBoxManage list vms | grep '"' | cut -d'"' -f2 2>/dev/null
EXEMPTION_ARRAY=( None )

## No need to modify below here
IFS=$'\n'
HOST=`hostname`
DATEFILE=`/bin/date +%Y%m%d`
VMLIST=`VBoxManage list vms | grep '"' | cut -d'"' -f2 2>/dev/null`

#################################################################
## Functions

##
## Notify the starting time of backup
##
function startScript {
echo "-----------------------------------------------------"
echo "START - ${VM}"
echo "Host: ${HOST}"
echo "Date: `date`"
echo "-----------------------------------------------------"
echo
}

##
## Create the backup directories if they do not exist
##
function doCheckDirectories {
## Check to see if BACKUPDEST exist
if [ ! -d ${BACKUPDEST} ]; then
echo "BACKUPDEST does not exist!! Exiting Program."
exit 0
fi
## If the archives directory does not exist, create it
if [ ! -d ${BACKUPDEST}/archives ]; then
echo "${BACKUPDEST}/archives directory does not exist, creating . . ."
mkdir "${BACKUPDEST}/archives"
echo
fi
## If the directories directory does not exist, create it
if [ ! -d ${BACKUPDEST}/directories ]; then
echo "${BACKUPDEST}/directories directory does not exist, creating . . ."
mkdir "${BACKUPDEST}/directories"
echo
fi
}

##
## If this VM is in our exempt array, set VM_EXEMPT to skip entirely.
##
function doCheckExempt {
VM_EXEMPT=false
## array, if we get a match, set VM_EXEMPT to true
for check_vm in "${EXEMPTION_ARRAY[@]}"; do
if [ "${check_vm}" = "${VM}" ]; then
echo "${VM} is on the exception list, skipping."
echo
VM_EXEMPT=true
fi
done
}

##
## Suspend VM if its running, skip it if not
##
function suspendVM {
## Check state of VM
VMSTATE=`VBoxManage showvminfo "${VM}" --machinereadable | grep "^\(VMState=\)" | cut -d'"' -f2 2>/dev/null`

echo "${VM} state is currently: ${VMSTATE}"

## If VM is running, suspend it, otherwise, move on
if [ "${VMSTATE}" = "running" ]; then
echo "Suspending ${VM} . . ."
## Stop vm by saving current state (pause|resume|reset|poweroff|savestate)
VBoxManage controlvm ${VM} savestate 2>/dev/null
[ $? ] && echo Success || echo Failure
echo "${VM} Suspended on `date`"
echo
else
echo "${VM} was not running, not suspending - `date`"
echo
fi
}

##
## Backup VM
##
function doBackup {
## Display location of XML file
XMLFILE=`VBoxManage showvminfo "${VM}" --machinereadable \
| grep "^\(CfgFile=\)" \
| cut -d'"' -f2 2>/dev/null`
## Display location of vdi file
## LOCATION=`VBoxManage showvminfo "${VM}" --machinereadable | grep ".vdi" | cut -d'"' -f4 2>/dev/null`
## Display location of vdi or vmdk file
LOCATION=`VBoxManage showvminfo "${VM}" --machinereadable \
| grep -e ".vdi" -e ".vmdk" \
| cut -d'"' -f4 2>/dev/null`

## If the directories directory does not exist, create it
if [ ! -d ${BACKUPDEST}/directories/${VM} ]; then
echo "${BACKUPDEST}/directories/${VM} does not exist, creating . . ."
mkdir "${BACKUPDEST}/directories/${VM}"
echo
fi
## Backup VM (clonehd)
echo "Backing up "${VM}" to ${BACKUPDEST}/directories/${VM}/"
rsync --inplace -a --stats "${XMLFILE}" "${BACKUPDEST}/directories/${VM}/"
[ $? ] && echo Success || echo Failure
rsync --inplace -a --stats "${LOCATION}" "${BACKUPDEST}/directories/${VM}/"
[ $? ] && echo Success || echo Failure
echo
}

##
## Start VM if suspened
##
function doStart {
if [ "${VMSTATE}" = "running" ]; then
echo "Starting ${VM} . . ."
## Resume VMs which were running [--type gui|sdl|vrdp|headless]
VBoxManage startvm ${VM} --type headless
echo "${VM} Resumed on `date`"
[ $? ] && echo Success || echo Failure
else
echo "${VM} was not running, not resuming - `date`"
fi
echo
}

##
## Making a compressed and mobile backup
##
function doTar {
fileName="backup_${VM}-${DATEFILE}.tgz"
echo "taring up ${VM} to ${BACKUPDEST}/archives/${fileName}"
tar -czf "${BACKUPDEST}/archives/${fileName}" "${BACKUPDEST}/directories/${VM}" 2>/dev/null
[ $? ] && echo Success || echo Failure
echo
}

##
## Clean up any tars or logs that are older than DAYS_TO_KEEP_TAR
##
function doCleanTar {
echo "Cleaning up tars older than ${DAYS_TO_KEEP_TAR} day(s) old"
find "${BACKUPDEST}/archives" -name "backup_${VM}*.tgz" -mtime ${DAYS_TO_KEEP_TAR} -exec rm -vf {} \;
[ $? ] && echo Success || echo Failure
echo "Cleaning up logs older than ${DAYS_TO_KEEP_TAR} day(s) old"
find "${BACKUPDEST}/" -name "*-log" -mtime ${DAYS_TO_KEEP_TAR} -exec rm -vf {} \;
[ $? ] && echo Success || echo Failure
}

##
## Notify the finishing time of backup
##
function finishScript {
echo
echo "-----------------------------------------------------"
echo "FINISH - ${VM}"
echo "Host: ${HOST}"
echo "Date: `date`"
echo "-----------------------------------------------------"
}

#################################################################
## Script

## Make sure we have the appropriate directories for backups
doCheckDirectories
## Start loop
for VM in ${VMLIST}; do
sleep 1
## Check exempt list
doCheckExempt
if [ "$VM_EXEMPT" = "false" ]; then
startScript
## Suspend VM
suspendVM
sleep 3
## Do Backup
doBackup
## Start if suspended
doStart
## Compressing backup
doTar
sleep 3
## Clean old backups
doCleanTar
sleep 3
finishScript
fi
## Reset exemption
shift
done >> ${BACKUPDEST}/${DATEFILE}-log
################################################################

Rsync to Fat32 drives

I regularly provide one of my clients with a backup of his data in the form of an external hard drive. Since his server runs CentOS Linux and his computer is a Windows machine, I need to provide a drive formatted Fat32 so he can plug it into his computer and access the data without problem.

# mount -t vfat /dev/sdc1 /mnt/usb -o shortname=mixed -o utf8

The “shortname=mixed” keeps the case preserved, as otherwise vfat will convert any filename that’s 8 characters or less to lower case (default behavior is “shortname=lowercase”) and cause problems for rsync. UTF8 is what Windows uses when mounting filesystems, so we specify that to ensure that we’re mounting it the same way (default is to mount iso-8859-1, even though the underlying vfat filesystem will store filenames in UTF8 format).

My normal mirror command, “rsync -az /home /mnt/usb“, doesn’t work because -a is a shortcut for the following options:

-a, –archive archive mode; same as -rlptgoD (no -H)
-r, –recursive recurse into directories
-l, –links copy symlinks as symlinks
-p, –perms preserve permissions
-t, –times preserve times
-o, –owner preserve owner (super-user only)
-D same as –devices –specials
-g, –group preserve group

Using -o will cause errors, as rsync will copy the file and then chown (change owner) the file. Fat32 doesn’t support Unix owership or permissions, so rsycn will error on every file that is copied. Ditto for -p and -g. Symlinks aren’t supported either, and we don’t want -L to copy the destination file of the symlink (that will produce multiple copies of a file/directory, not desirable in this particular instance). The -D option is irrelevant because we are only copying website data, so we don’t need special devices (/dev/*).

That leaves -r (recursive), -t (preserve times) for our vfat options. There’s no need to use compression (-z) since we’re not syncing across the network.

So the best command to copy form ext3 to Fat32 drive is something like this:

rsync -rtv /home /mnt/usb

I like using -v for verbosity, unless I’m running this within a shell script.

A good reference for further reading on Fat32 with Linux:
http://www.osnews.com/story/9681/The_vfat_file_system_and_Linux/

Meeting-2013-04-27

There will be a meeting Saturday, April 27th, 2013, 10:00am, at the Pleasant Ridge Branch of the Cincinnati Public Library, located at 6233 Montgomery Road, Cincinnati, OH

Google Maps Goodness

This is the first page of the current Cincinnati Linux User Group (CLUG) website. I am parsing the last backup of the old site to restore as much as I can.

This month’s meeting will be a talk about our website!

Think about what you want it to look like, what it should contain, what sort of content would make you return again and again.

Thank you and hope to see you at the meeting!

Steve Jones

PS, I told a couple people that this meeting would be about something else, sorry about that!

Future Edits

About Us page
Library page
After meeting social
Membership page
Meeting location
Calendar
Links page
Funny Pictures page

Backup and restore all your packages on Debian based machines.

So, you’re somebody that plays a lot with Linux?
Create a script that runs weekly or so with the commands below, and you’ll always be prepared for the worst that life can toss your direction!
Okay, that might be overly optimistic, but it can’t hurt, and can save you a ton of time when you rebuild a machine.


#!/bin/bash
# SRJ 2008-09-03
mkdir SourcesAndPackages
cd SourcesAndPackages
dpkg --get-selections | grep -v deinstall > InstalledPackages.txt
cp -a /etc/apt .
# Comment out the lines above and uncomment the lines below to restore.
# cd SourcesAndPackages
# sudo cp -a apt /etc/
# sudo apt-get update
# sudo apt-get dist-upgrade
# sudo dpkg --set-selections < InstalledPackages.txt # sudo apt-get dselect-upgrade