Browse Source

initial commit

master
Nicolas Massé 6 years ago
commit
676f7bdc63
  1. 2
      .gitignore
  2. 255
      backup-mails-and-documents.pl
  3. 19
      certificates/auto-enroll.bat
  4. 91
      certificates/auto-enroll.vbs
  5. 23
      certificates/cleanup-store.vbs
  6. 15
      dump-sn.cmd
  7. 3
      file-conversion/convert-all-ppt-to-pdf.cmd
  8. 71
      file-conversion/convert-all-ppt-to-pdf.vbs
  9. 3
      file-conversion/convert-all-xls-to-csv.cmd
  10. 68
      file-conversion/convert-all-xls-to-csv.vbs
  11. 21
      file-conversion/ppt-to-pdf.vbs
  12. 7
      ldap/DB_CONFIG
  13. 44
      ldap/gen_ldif_users.pl
  14. 15
      ldap/ldap.sh
  15. 29
      ldap/slapd.conf
  16. 8
      ldap/users.csv
  17. 3
      list-tcp-connections-count.sh
  18. 158
      msi/include_config.vbs
  19. 83
      pap/papdb.pl
  20. 49
      soap_testbed/index.html
  21. 59
      stress-test/stress-test.sh
  22. 175
      sync.pl
  23. 41
      testbed_js/index.html

2
.gitignore

@ -0,0 +1,2 @@
.DS_Store
.vscode

255
backup-mails-and-documents.pl

@ -0,0 +1,255 @@
#!/usr/bin/perl -w
use strict;
#use IO::Socket::SSL qw/debug3/; # SSL Debug
use Mail::IMAPClient;
use Data::Dumper;
use File::Temp;
use POSIX qw/ strftime /;
use POSIX ":sys_wait_h";
use Getopt::Long;
my $target;
my $mail = 1;
my $docs = 0;
my $svn = 0;
GetOptions("to=s" => \$target,
"mail" => \$mail,
"docs" => \$docs);
die "Wrong target directory"
unless defined $target and -d $target;
# Slup SAMBA Credentials File...
open SMB_FILE, '<', $ENV{HOME}."/.smbpasswd-z"
or die "open: .smbpasswd-z: $!";
my $holdTerminator = $/;
undef $/;
my $credentials = <SMB_FILE>;
$/ = $holdTerminator;
my ($username, $password);
($username) = $credentials =~ m/username\s*=\s*(\S+)\s*\n/;
($password) = $credentials =~ m/password\s*=\s*(\S+)\s*\n/;
close SMB_FILE;
die "missing username in ~/.smbpasswd-z"
unless defined $username;
die "missing password in ~/.smbpasswd-z"
unless defined $password;
# Create temp folder to store data
my $tmp = File::Temp->newdir(CLEANUP => 0); # So that childs do not try to remove temp dir while the father is still using it...
print "Using '$tmp' as temp dir...\n";
my $imap_dir = "Backup Mails";
my $target_filename = "mail-backup-".strftime("%Y%m%d-%H%M%S", localtime).".cpio.bz2";
print "Storing backup to '$target/$target_filename'...\n";
open BACKUP, ">", "$target/$target_filename"
or die "open: $target/$target_filename: $!";
# Launch CPIO to store data
pipe FROM_FATHER, TO_CPIO0;
pipe FROM_CPIO2, TO_DELETE;
pipe FROM_CPIO1, TO_ZIP;
my $pid_cpio = fork();
die "fork: $!" unless defined $pid_cpio;
if ($pid_cpio == 0) { # Child: CPIO
close TO_CPIO0;
close FROM_CPIO1;
close FROM_CPIO2;
close BACKUP;
open STDIN, '<&', \*FROM_FATHER;
open STDOUT, '>&', \*TO_ZIP;
open STDERR, '>&', \*TO_DELETE;
chdir $tmp
or die "chdir: $tmp: $!";
exec "cpio", "-ov"
or die "exec: cpio: $!";
# Child stops here
} # The father continues...
my $pid_zip = fork();
die "fork: $!" unless defined $pid_zip;
if ($pid_zip == 0) { # Child: ZIP
close TO_ZIP;
close TO_DELETE;
close FROM_FATHER;
close TO_CPIO0;
close FROM_CPIO2;
open STDIN, '<&', \*FROM_CPIO1;
open STDOUT, '>&', \*BACKUP;
exec "bzip2", "--compress", "--force", "--stdout"
or die "exec: bzip2: $!";
# Child stops here
} # The father continues...
my $pid_delete = fork();
die "fork: $!" unless defined $pid_delete;
if ($pid_delete == 0) { # Child: DELETE
close TO_ZIP;
close TO_DELETE;
close FROM_FATHER;
close TO_CPIO0;
close FROM_CPIO1;
close BACKUP;
chdir $tmp
or die "chdir: $tmp: $!";
while (<FROM_CPIO2>) {
chomp;
# The goal is to free space, so we do not delete directories...
if (-e $_) {
if ($_ =~ m/^$imap_dir\// and -f $_) {
print "CLEANUP: Removing useless file '$_'...\n";
unlink $_;
}
} else {
print "CPIO: $_\n";
}
}
# Child stops here
exit 0;
} # The father continues...
# Clean up...
close TO_ZIP;
close TO_DELETE;
close FROM_FATHER;
close FROM_CPIO2;
close FROM_CPIO1;
close BACKUP;
# Childs will not clean up the temp folder. The father has to do it !
$tmp->unlink_on_destroy(1);
# Avoid warning of File::Temp cleanup process...
END {
chdir $ENV{'HOME'};
}
chdir $tmp
or die "chdir: $tmp: $!";
# Backup mails
if ($mail) {
my $imap = Mail::IMAPClient->new;
$imap->Server('zimbra.example.test');
$imap->Port(993);
$imap->Ssl(1);
$imap->Uid(1);
$imap->Peek(1);
$imap->connect or die "IMAP: Could not connect: $@";
print "IMAP: Logging in as $username\n";
$imap->User($username);
$imap->Password($password);
$imap->login or die "IMAP: Could not login: $@";
my $folders = $imap->folders
or die "IMAP: Could not list folders: $@";
mkdir $imap_dir
or die "mkdir: $imap_dir: $!";
print "IMAP: Using '$tmp/$imap_dir' to backup mails...\n";
foreach my $folder (@$folders) {
my @components = split /\//, $folder;
my $mbox_name = delete $components[$#components];
my $mbox_path = "$imap_dir/";
foreach my $component (@components) {
unless (-e "$mbox_path$component") {
mkdir "$mbox_path$component"
or die "mkdir: $mbox_path$component: $!"
}
$mbox_path .= "$component/";
}
$imap->select($folder)
or die "IMAP: Could not select $folder: $@";
my $msgcount = $imap->message_count($folder);
die "IMAP: Could not message_count: $@"
if not defined $msgcount;
if ($msgcount == 0) {
print "IMAP: Skipping empty folder '$folder'...\n";
next;
}
print "IMAP: Backing up $msgcount messages in '$folder'...\n";
my @msgs = $imap->messages
or die "IMAP: Could not messages: $@";
my $mbox_file = "$mbox_path$mbox_name.mbox";
my $mbox_fh;
$imap->message_to_file($mbox_file, @msgs)
or die "IMAP: Could not backup messages of folder '$folder': $@";
# Remove \r to have a valid MBOX file.
system("fromdos", "$mbox_file") == 0 # fromdos = dos2unix
or warn "system: fromdos: $?";
# Backup this file !
print TO_CPIO0 "$mbox_file\n";
}
$imap->disconnect()
or die "IMAP: Could not logout: $@";
}
# Sends filenames to CPIO
sub compress_files {
my ($dir) = @_;
my $pid = fork();
die "fork: $!" unless defined $pid;
if ($pid == 0) { # Child: FIND
open STDOUT, '>&', \*TO_CPIO0;
exec "find", "$dir", "-print"
or die "exec: find: $!";
}
waitpid $pid, 0;
}
# Backup Own Data
if ($docs) {
my @files =
(
".ssh/",
".bashrc",
".bash_aliases",
".vimrc",
".mozilla/",
"Documents/",
);
@files = map { "home/$_" } @files;
symlink $ENV{'HOME'}, "home"
or die "symlink: home: $!";
foreach my $file (@files) {
compress_files $file;
}
}
# No more file to backup, notify CPIO...
close TO_CPIO0;
print "FINISH: Waiting for CPIO (pid = $pid_cpio) to complete...\n";
waitpid $pid_cpio, 0;
print "FINISH: Waiting for BZIP2 (pid = $pid_zip) to complete...\n";
waitpid $pid_zip, 0;
print "FINISH: Waiting for the cleanup process (pid = $pid_delete) to complete...\n";
waitpid $pid_delete, 0;

19
certificates/auto-enroll.bat

@ -0,0 +1,19 @@
@ECHO OFF
C:
CD \
ECHO. >> C:\auto-enroll.log
ECHO ------------------------------------------------------------------ >> C:\auto-enroll.log
ECHO AUTO ENROLLMENT LOGS >> C:\auto-enroll.log
ECHO ------------------------------------------------------------------ >> C:\auto-enroll.log
ECHO. >> C:\auto-enroll.log
ECHO CURRENT DATE: >> C:\auto-enroll.log
DATE /T >> C:\auto-enroll.log
TIME /T >> C:\auto-enroll.log
ECHO. >> C:\auto-enroll.log
ECHO CURRENT USER: >> C:\auto-enroll.log
WHOAMI >> C:\auto-enroll.log
ECHO. >> C:\auto-enroll.log
CSCRIPT C:\auto-enroll.vbs >> c:\auto-enroll.log

91
certificates/auto-enroll.vbs

@ -0,0 +1,91 @@
'
' Download CAPICOM from http://www.microsoft.com/downloads/en/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&displaylang=en
' Install it
' Register it (regsrv32 capicom.dll)
'
Const CAPICOM_LOCAL_MACHINE_STORE = 1
Const CAPICOM_MY_STORE = "My"
Const CAPICOM_STORE_OPEN_READ_ONLY = 0
Const CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME = 4
Const CRYPT_EXPORTABLE = 1
Const CR_IN_BASE64 = &H1
Const CR_IN_PKCS10 = &H100
Const CR_OUT_BASE64 = &H1
Const CR_OUT_CHAIN = &H100
Const CERT_SYSTEM_STORE_LOCAL_MACHINE = &H20000
Const CRYPT_MACHINE_KEYSET = &H20
Const strTemplate = "Machine"
Const strProviderName = "Microsoft Enhanced Cryptographic Provider v1.0"
Const intKeySize = 1024
Const strTargetCA = "adcs-trial.acme.tld\Root CA"
Dim objStore
Set objStore = CreateObject("CAPICOM.Store")
objStore.Open CAPICOM_LOCAL_MACHINE_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY
Dim bFoundCert : bFoundCert = vbFalse
WScript.Echo "Begin Cert Store enumeration"
WScript.Echo
Dim objCerts : Set objCert = objStore.Certificates
Set objCerts = objCert.Find(CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME, strTemplate, vbTrue)
Dim objCert
For Each objCert in objCerts
If objCert.HasPrivateKey And Not IsNull(objCert.PrivateKey) Then
WScript.Echo "Found certificate " & objCert.SerialNumber & ":"
WSCript.Echo " Issuer DN: " & objCert.IssuerName
WScript.Echo " Subject DN: " & objCert.SubjectName
WSCript.Echo " Not Before: " & objCert.ValidFromDate
WSCript.Echo " Not After: " & objCert.ValidToDate
WScript.Echo
bFoundCert = vbTrue
End If
Next
WScript.Echo "End of Cert Store enumeration: found = " & bFoundCert
If Not bFoundCert Then
WScript.Echo "Starting Auto-Enrollment"
WScript.Echo
Dim objCEnroll
Set objCEnroll = CreateObject("CEnroll.CEnroll")
objCEnroll.GenKeyFlags = intKeySize * (256*256) + CRYPT_EXPORTABLE
objCEnroll.UseExistingKeySet = 0
objCEnroll.addCertTypeToRequest(strTemplate)
objCEnroll.ProviderName = strProviderName
objCEnroll.MyStoreFlags = CERT_SYSTEM_STORE_LOCAL_MACHINE
objCEnroll.RequestStoreFlags = CERT_SYSTEM_STORE_LOCAL_MACHINE
objCEnroll.ProviderFlags = CRYPT_MACHINE_KEYSET
Dim strP10
strP10 = objCEnroll.createPKCS10("CN=Dummy", "1.3.6.1.5.5.7.3.2")
WScript.Echo "PKCS#10 Request:"
WScript.Echo strP10
Dim objCARequest
Set objCARequest = CreateObject("CertificateAuthority.Request")
Dim intReqFlags
intReqFlags = CR_IN_BASE64 OR CR_IN_PKCS10
Dim intReqStatus
intReqStatus = objCARequest.Submit(intReqFlags, strP10, "", strTargetCA)
WScript.Echo "Request Sent. Status = " & intReqStatus
Dim strCertificate
strCertificate = objCARequest.GetCertificate(CR_OUT_BASE64 Or CR_OUT_CHAIN)
WScript.Echo "Issued Certificate:"
WScript.Echo strCertificate
objCEnroll.acceptPKCS7(strCertificate)
WScript.Echo
WScript.Echo "End of Auto-Enrollment"
End If

23
certificates/cleanup-store.vbs

@ -0,0 +1,23 @@
'
' http://www.microsoft.com/downloads/en/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&displaylang=en
'
Dim store
Set store = CreateObject("CAPICOM.Store")
store.Open ,,2
MsgBox "Begin Cert Store cleanup"
Dim cert
For Each cert in store.Certificates
If cert.HasPrivateKey And Not IsNull(cert.PrivateKey) Then
Dim privateKey
Set privateKey = cert.PrivateKey
If privateKey.IsHardwareDevice And privateKey.IsRemovable And Not privateKey.IsAccessible Then
cert.Display
' store.Remove cert
End If
End If
Next
MsgBox "End of Cert Store cleanup"

15
dump-sn.cmd

@ -0,0 +1,15 @@
@ECHO OFF
setlocal enableDelayedExpansion
set SN="c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\sn.exe"
echo. > sn_dump.txt
for /F %%x in ('dir /B/D *.DLL') do (
echo. >> sn_dump.txt
echo ==================================================================== >> sn_dump.txt
echo. >> sn_dump.txt
echo Working on %%x >> sn_dump.txt
echo. >> sn_dump.txt
%SN% -Tp %%x >> sn_dump.txt
)

3
file-conversion/convert-all-ppt-to-pdf.cmd

@ -0,0 +1,3 @@
@ECHO OFF
CSCRIPT.EXE convert-all-ppt-to-pdf.vbs
PAUSE

71
file-conversion/convert-all-ppt-to-pdf.vbs

@ -0,0 +1,71 @@
Option Explicit
Const ppWindowMinimized = 2
Const ppSaveAsPDF = 32
Const msoTrue = -1
Dim CurrentDir, Files, File, FsObj
' Get the Current Folder
Set FsObj = CreateObject("Scripting.FileSystemObject")
Set CurrentDir = FsObj.GetFolder(FsObj.GetAbsolutePathName("."))
' Process all files in the current dir
Set Files = CurrentDir.Files
For Each File in Files
Dim inputFile : inputFile = File.Path
Dim Ext : Ext = FsObj.GetExtensionName(inputFile)
' Process only supported files
If Ext = "pptx" Or Ext = "ppt" Or Ext = "pps" Then
Dim outputFile : outputFile = FsObj.BuildPath(FsObj.GetParentFolderName(inputFile), FsObj.GetBaseName(inputFile) & ".pdf")
If Not FsObj.FileExists(outputFile) Then
WScript.Echo "Processing file '" & File.Name & "..."
' Launch PowerPoint
Dim PowerPointApp : Set PowerPointApp = CreateObject("PowerPoint.Application")
PowerPointApp.Visible = vbTrue
PowerPointApp.WindowState = ppWindowMinimized
' Custom Error Handler
On Error Resume Next
Dim PowerPointPres : Set PowerPointPres = PowerPointApp.Presentations.Open(inputFile)
If Err <> 0 Then
WScript.Echo "ERR: Cannot open '" & File.Name & "' !"
Else
PowerPointPres.SaveAs outputFile, ppSaveAsPDF, msoTrue
If Err <> 0 Then
WScript.Echo "ERR: Cannot save PDF version of '" & File.Name & "' !"
End If
PowerPointPres.Close
End If
' Standard Error Handler
On Error Goto 0
' Wait a little bit and close PowerPoint
Wscript.Sleep 500
PowerPointApp.Quit
Wscript.Sleep 1000
' Kill remaining instances of PowerPoint
Dim strComputer : strComputer = "."
Dim objWMIService, colProcessList, objProcess
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name = 'powerpnt.exe'")
For Each objProcess in colProcessList
WScript.Echo "Killing remaining PowerPoint process !"
objProcess.Terminate()
Next
Else
WScript.Echo "Skipping file '" & File.Name & "' since the PDF version already exists !"
End If
Else
WScript.Echo "Skipping unsupported file '" & File.Name & " !"
End If
Next

3
file-conversion/convert-all-xls-to-csv.cmd

@ -0,0 +1,3 @@
@ECHO OFF
CSCRIPT.EXE convert-all-xls-to-csv.vbs
PAUSE

68
file-conversion/convert-all-xls-to-csv.vbs

@ -0,0 +1,68 @@
Option Explicit
Const xlWindowMinimized = 2
Const xlCSV = 6
Const msoTrue = -1
Dim CurrentDir, Files, File, FsObj
' Get the Current Folder
Set FsObj = CreateObject("Scripting.FileSystemObject")
Set CurrentDir = FsObj.GetFolder(FsObj.GetAbsolutePathName("."))
' Process all files in the current dir
Set Files = CurrentDir.Files
For Each File in Files
Dim inputFile : inputFile = File.Path
Dim Ext : Ext = FsObj.GetExtensionName(inputFile)
' Process only supported files
If Ext = "xlsx" Or Ext = "xls" Then
WScript.Echo "Processing file '" & File.Name & "..."
Dim outputFile : outputFile = FsObj.BuildPath(FsObj.GetParentFolderName(inputFile), FsObj.GetBaseName(inputFile) & ".csv")
' Launch Excel
Dim ExcelApp : Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = vbTrue
ExcelApp.DisplayAlerts = False
ExcelApp.WindowState = xlWindowMinimized
' Custom Error Handler
On Error Resume Next
Dim ExcelWB : Set ExcelWB = ExcelApp.Workbooks.Open(inputFile)
If Err <> 0 Then
WScript.Echo "ERR: Cannot open '" & File.Name & "' !"
Else
WScript.Echo "Saving CSV copy to '" & outputFile & "'..."
ExcelWB.ActiveSheet.SaveAs outputFile, xlCSV
If Err <> 0 Then
WScript.Echo "ERR: Cannot save '" & outputFile & "' !"
End If
ExcelWB.Close
End If
' Standard Error Handler
On Error Goto 0
' Wait a little bit and close Excel
Wscript.Sleep 500
ExcelApp.Application.Quit
ExcelApp.Quit
Wscript.Sleep 1000
' Kill remaining instances of Excel
Dim strComputer : strComputer = "."
Dim objWMIService, colProcessList, objProcess
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name = 'excel.exe'")
For Each objProcess in colProcessList
WScript.Echo "Killing remaining Excel process !"
objProcess.Terminate()
Next
Else
WScript.Echo "Skipping unsupported file '" & File.Name & " !"
End If
Next

21
file-conversion/ppt-to-pdf.vbs

@ -0,0 +1,21 @@
Option Explicit
Const ppWindowMinimized = 2
Const ppSaveAsPDF = 32
Const msoTrue = -1
Dim FsObj : Set FsObj = CreateObject("Scripting.FileSystemObject")
Dim inputFile : inputFile = WScript.Arguments.Item(0)
inputFile = FsObj.GetAbsolutePathName(inputFile)
Dim outputFile : outputFile = FsObj.BuildPath(FsObj.GetParentFolderName(inputFile), FsObj.GetBaseName(inputFile) & ".pdf")
Dim PowerPointApp : Set PowerPointApp = CreateObject("PowerPoint.Application")
PowerPointApp.Visible = vbTrue
PowerPointApp.WindowState = ppWindowMinimized
Dim PowerPointPres : Set PowerPointPres = PowerPointApp.Presentations.Open(inputFile)
PowerPointPres.SaveAs outputFile, ppSaveAsPDF, msoTrue
PowerPointPres.Close
PowerPointApp.Quit

7
ldap/DB_CONFIG

@ -0,0 +1,7 @@
# one 0.25 GB cache
set_cachesize 0 268435456 1
# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152

44
ldap/gen_ldif_users.pl

@ -0,0 +1,44 @@
#!/usr/bin/perl -w
use strict;
my %o = ();
while (<>) {
chomp;
my ($cn, $short_uid, $long_uid, $ou, $org) = split /;/;
my ($first_name, $family_name) = split / /, $cn;
if (not exists $o{$org}) {
print <<LDIF;
dn: o=$org
o: $org
objectClass: organization
LDIF
$o{$org} = {};
}
if (not exists $o{$org}->{$ou}) {
print <<LDIF;
dn: ou=$ou, o=$org
ou: $ou
objectClass: organizationalUnit
LDIF
$o{$org}->{$ou} = 1;
}
print <<LDIF;
dn: cn=$cn,ou=$ou,o=$org
givenName: $first_name
sn: $family_name
userPassword: changem
mail: $long_uid\@example.test
telephoneNumber: 123456
objectClass: top
objectClass: inetOrgPerson
objectClass: pkiUser
uid: $short_uid
cn: $cn
LDIF
}

15
ldap/ldap.sh

@ -0,0 +1,15 @@
#!/bin/sh
cd ~/bin/ldap || exit 1
./gen_ldif_users.pl < users.csv > data.ldif
if [ -f slapd.pid ] ; then
kill `cat slapd.pid` ;
fi
mkdir -p /tmp/ldap_data
rm -f /tmp/ldap_data/*
cp DB_CONFIG /tmp/ldap_data/
/usr/sbin/slapadd -f slapd.conf -l data.ldif
/usr/sbin/slapd -h ldap://0.0.0.0:12345 -f slapd.conf

29
ldap/slapd.conf

@ -0,0 +1,29 @@
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/openldap.schema
moduleload back_bdb.so
modulepath /usr/lib/ldap
pidfile slapd.pid
argsfile slapd.args
defaultsearchbase ""
logfile /tmp/ldap.log
loglevel 256
database bdb
suffix ""
rootdn "CN=admin,O=ACME,C=FR"
rootpw changeme
directory /tmp/ldap_data
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index mail,surname,givenname eq,subinitial
index cn pres,eq,sub

8
ldap/users.csv

@ -0,0 +1,8 @@
Kate DAVIES;kdavies;kate.davies;Administrators;ACME
Bill EVANS;bevans;bill.evans;Accounting;ACME
Jane GREEN;jgreen;jane.green;Accounting;ACME
Jack ROBERTS;jroberts;jack.roberts;Marketing;GoodTimes Inc.
John SMITH;jsmith;john.smith;Administration;ACME
Jim WALKER;jwalker;jim.walker;Marketing;GoodTimes Inc.
Olivia WILSON;owilson;olivia.wilson;Accounting;GoodTimes Inc.
Pamella WRIGHT;pwright;pamella.wright;Administration;ACME

3
list-tcp-connections-count.sh

@ -0,0 +1,3 @@
#!/bin/bash
netstat -tnp |tail -n +3 | tr -s " " |cut -d " " -f 6 |sort |uniq -c

158
msi/include_config.vbs

@ -0,0 +1,158 @@
' +---------------------------------------------------------------------+
' | Requirements |
' +---------------------------------------------------------------------+
'
' - CScript.exe
' - Windows Installer
' - Microsoft Cabinet Software Development Kit (See KB 310618)
'
' Safe coding
Option Explicit
' +---------------------------------------------------------------------+
' | Adjust the following settings to your needs |
' +---------------------------------------------------------------------+
' The MSI file to modify
Dim databasePath : databasePath = "installer.msi"
' The Properties to set
Dim Properties : Set Properties = CreateObject("Scripting.Dictionary")
Properties.Add "PROPERTY1", "FOO"
Properties.Add "PROPERTY2", "BAR"
' MSI Release (numeric value)
Dim Release : Release = "1"
' Machine Install ?
Dim machineInstall : machineInstall = vbTrue
' =======================================================================
'
' WARNING ! WARNING ! WARNING ! WARNING ! WARNING !
'
'
' -= DO NOT MODIFY ANYTHING BELOW ! =-
'
' =======================================================================
' Custom Error Handling (see below)
On Error Resume Next
' Machine installation needs the "ALLUSERS" property
If machineInstall Then
Properties.Add "ALLUSERS", "1"
End If
' Update Product Version
Properties.Add "ProductVersion", "1.2.3." & Release
Const msiOpenDatabaseModeTransact = 1
Dim openMode : openMode = msiOpenDatabaseModeTransact
' Connect to Windows installer object
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError "Cannot instanciate WindowsInstaller.Installer. Check the script's requirements !"
' Open database
Dim database
Set database = installer.OpenDatabase(databasePath, openMode) : CheckError "Unable to open the MSI database '" & databasePath & "'"
' Process SQL statements
Dim query, view, prop, value, record, errMessage
For Each prop in Properties
value = Properties.Item(prop)
errMessage = "Cannot create/update property '" & prop & "'"
query = "SELECT Property, Value FROM Property"
Set record = installer.CreateRecord(2) : CheckError errMessage
record.StringData(1) = prop
record.StringData(2) = value
InsertOrUpdate database, query, record, errMessage
Next
Dim Dialogs(4)
Dialogs(1) = "ExitDialog"
Dialogs(2) = "PrepareDlg"
Dialogs(3) = "ProgressDlg"
Dialogs(4) = "WelcomeEulaDlg"
Dim Dialog
For Each Dialog in Dialogs
errMessage = "Cannot disable UI Dialog '" & Dialog & "'"
query = "UPDATE InstallUISequence SET Condition = 0 WHERE Action = ?"
Set record = installer.CreateRecord(1) : CheckError errMessage
record.StringData(1) = Dialog
Set view = database.OpenView(query) : CheckError errMessage
view.Execute record : CheckError errMessage
view.Close : CheckError errMessage
Next
' Handle Machine Install
If machineInstall Then
' Update the Word Count Property of the Summary Information Stream
Dim infoStream, wordCount
errMessage = "Cannot update the Word Count Property of the Summary Information Stream"
Set infoStream = database.SummaryInformation(1) : CheckError errMessage ' we will modify 1 property...
Const PID_WORDCOUNT = 15
wordCount = infoStream.Property(PID_WORDCOUNT) : CheckError errMessage
wordCount = wordCount And Not 8
infoStream.Property(PID_WORDCOUNT) = wordCount : CheckError errMessage
infoStream.Persist : CheckError errMessage
End If
' Final Step: Commit !
database.Commit : CheckError "Cannot commit !"
MsgBox "Successfully updated the MSI file '" & databasePath & "' !" & vbLf & "You can now deploy '" & databasePath & "' to Workstations.", 64, "Status"
Wscript.Quit 0
'
' Helper functions
'
Sub InsertOrUpdate(db, query, record, errorMessage)
Const msiViewModifyAssign = 3
Dim view
Set view = db.OpenView(query) : CheckError errorMessage
view.Modify msiViewModifyAssign, record : CheckError errorMessage
view.Close : CheckError errorMessage
End Sub
'
' Error Handling
'
Sub Error(userMessage)
Dim message, msiErr
message = ""
' VB Errors
If Err <> 0 Then
message = Err.Source & " " & Hex(Err) & ": " & Err.Description & vbLf
End If
' MSI Errors
If Not installer Is Nothing Then
Set msiErr = installer.LastErrorRecord
If Not msiErr Is Nothing Then message = message & msiErr.FormatText & vbLf End If
End If
' Optional Error message
If userMessage = "" Then
Fail "Unexpected Error. Details Follow: " & vbLf & message
Else
Fail userMessage & vbLf & "Error: " & message
End If
End Sub
Sub CheckError(userMessage)
If Err <> 0 Then
Error userMessage
End If
End Sub
Sub Fail(message)
MsgBox message, 48, "Status"
Wscript.Quit 2
End Sub

83
pap/papdb.pl

@ -0,0 +1,83 @@
#!/usr/bin/perl -w
use strict;
use XML::LibXML;
use Data::Dumper;
use LWP::UserAgent;
use File::Temp qw/tempdir/;
use DBI;
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
my $tmp = tempdir(DIR => "tmp");
my $parser = XML::LibXML->new;
my $dbh = DBI->connect("dbi:Pg:dbname=immodb;host=/var/run/postgresql/", "john", "", {'RaiseError' => 1});
sub slurp_p2p_db {
my $filename = shift;
my %data;
my $dom = $parser->parse_file($filename);
my $root = $dom->getDocumentElement();
my @placemarks = $root->getElementsByTagNameNS("http://www.opengis.net/kml/2.2", "Placemark");
foreach my $placemark (@placemarks) {
my $desc = $placemark->getElementsByTagNameNS("http://www.opengis.net/kml/2.2", "description")->[0]->firstChild->data;
my $name = $placemark->getElementsByTagNameNS("http://www.opengis.net/kml/2.2", "name")->[0]->firstChild->data;
my $gps = $placemark->getElementsByTagNameNS("http://www.opengis.net/kml/2.2", "coordinates")->[0]->firstChild->data;
my $id = "$name|$gps";
my ($prix_appartement) = $desc =~ m/<span class='label'>Appartement<\/span> <span class='prix'>([^<]+)<\/span>/g;
$prix_appartement =~ tr/ //d
if defined $prix_appartement;
my ($prix_maison) = $desc =~ m/<span class='label'>Maison<\/span> <span class='prix'>([^<]+)<\/span>/g;
$prix_maison =~ tr/ //d
if defined $prix_maison;
unless (defined $prix_appartement or defined $prix_maison) {
warn "no price for '$id'";
next;
}
$data{$id} = { appartement => $prix_appartement, maison => $prix_maison };
}
return \%data;
}
warn "Parsing XML files";
my $ventes = slurp_p2p_db("tmp/kml-vente.xml");
my $locations = slurp_p2p_db("tmp/kml-location.xml");
warn "Updating database";
my $sth_update = $dbh->prepare('UPDATE ville SET pap_prix_vente_appartement_m2 = ?, pap_prix_vente_maison_m2 = ? WHERE nom = ? AND coordonnees_gps = ?')
or die "could not prepare: ".$dbh->errstr;
my $sth_insert = $dbh->prepare('INSERT INTO ville (nom, coordonnees_gps) VALUES (?, ?)')
or die "could not prepare: ".$dbh->errstr;
foreach my $id (sort keys %{$ventes}) {
my ($nom, $gps) = split /[|]/, $id;
my $prix = $ventes->{$id};
my $nb = $sth_update->execute($prix->{appartement}, $prix->{maison}, $nom, $gps);
unless ($nb > 0) {
$sth_insert->execute($nom, $gps)
or warn "could not insert $id: ".$sth_insert->errstr;
$sth_update->execute($prix->{appartement}, $prix->{maison}, $nom, $gps)
or warn "could not update $id: ".$sth_update->errstr;
}
}
$sth_update = $dbh->prepare('UPDATE ville SET pap_prix_location_appartement_m2 = ?, pap_prix_location_maison_m2 = ? WHERE nom = ? AND coordonnees_gps = ?')
or die "could not prepare: ".$dbh->errstr;
foreach my $id (sort keys %{$locations}) {
my ($nom, $gps) = split /[|]/, $id;
my $prix = $locations->{$id};
my $nb = $sth_update->execute($prix->{appartement}, $prix->{maison}, $nom, $gps);
unless ($nb > 0) {
$sth_insert->execute($nom, $gps)
or warn "could not insert $id: ".$sth_insert->errstr;
$sth_update->execute($prix->{appartement}, $prix->{maison}, $nom, $gps)
or warn "could not update $id: ".$sth_update->errstr;
}
}
$dbh->commit()
or die "could not commit: ".$dbh->errstr;
$dbh->disconnect();

49
soap_testbed/index.html

@ -0,0 +1,49 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Web Services TestBed</title>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.4/dojo/dojo.xd.js"
type="text/javascript"></script>
<script type="text/javascript">
dojo.addOnLoad(function () {
dojo.connect(dojo.byId("test"), "onclick", null, function() {
try {
if (window.XMLHttpRequest) {
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
httpRequest.open("POST", dojo.attr(dojo.byId("ws_url"), "value"), true);
if (httpRequest.overrideMimeType) {
httpRequest.overrideMimeType("text/xml");
}
httpRequest.onreadystatechange = function () { if (httpRequest.readyState == 4) { dojo.byId("ws_response").innerHTML = httpRequest.responseText; } };
httpRequest.setRequestHeader("MessageType", "CALL");
httpRequest.setRequestHeader("Content-Type", "text/xml");
httpRequest.send(dojo.attr(dojo.byId("ws_request"));
} catch (err) {
dojo.byId("ws_response").innerHTML = err;
}
});
});
</script>
</head>
<body>
<table>
<tr>
<td colspan='3'>Web Service URL:<input type='text' id='ws_url' value='http://server.example.test' size='120'></td>
</tr><tr>
<td>Login:<input type='text' id='login' value='john'></td>
<td>Password:<input type='password' id='password' value='changeme'></td>
<td>Domain:<input type='text' id='domain' value='test'></td>
</tr>
</table>
<table>
<tr><td>Request:<br><textarea id='ws_request' cols='80' rows='25'>
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header></soapenv:Header><soapenv:Body></soapenv:Body></soapenv:Envelope>
</textarea></td><td>Response:<br><textarea id='ws_response' cols='80' rows='25'></textarea></td></tr>
</table>
<input type='button' value='Test !' id='test' name='test'>
</body>
</html>

59
stress-test/stress-test.sh

@ -0,0 +1,59 @@
#!/bin/bash
# In case of problem with TIME_WAIT connections
# echo -n 1 > /proc/sys/net/ipv4/tcp_tw_recycle
P=10
N=5
function do_job {
echo "$(date -R): Worker $i forked..."
if [ $(($1 % 2)) -eq 0 ]; then
url="http://urla/"
else
url="http://urlb/"
fi
# rendez-vous !
read line < "$target/rdv"
echo "$(date -R): Worker $i started on $url..."
for ((j=0;j<N; j++)); do
wget -q -O /dev/null -o "$2/wrk-$j.err" --server-response "$url"
done
echo "$(date -R): Worker $i stopping..."
}
echo "Forking $P workers..."
target="$(date "+%Y-%m-%d_%H-%M-%S")"
mkdir "$target"
mkfifo "$target/rdv"
for ((i=0;i<P; i++)); do
mkdir -p "$target/$i"
(do_job $i "$target/$i") > "$target/$i/out.log" 2> "$target/$i/err.log" &
done
wait_time=30
echo "Waiting $wait_time sec for all childs to initialize..."
sleep $wait_time
echo "Starting workers for $N requests..."
echo -n > "$target/rdv"
echo "Waiting for childs..."
wait
for file in "$target"/*/wrk-*.err; do
exec < $file
read prot code resp
echo $code
done | sort |uniq -c | ( sum=0; while read amount code; do
sum=$((sum + amount))
echo "$code $amount"
done; echo "total $sum" )
exit 0

175
sync.pl

@ -0,0 +1,175 @@
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use File::Temp;
use POSIX qw/ strftime /;
use POSIX ":sys_wait_h";
my $sync_dir = $ENV{HOME}."/sync/";
my $doclib_path = "/path/to/products";
my $homes = "rsync.server.example.test";
sub version_compare {
my ($a, $b) = @_;
my @left = split( /\./, $a );
my @right = split( /\./, $b );
my $i = 0;
while ((defined $left[$i]) and (defined $right[$i])) {
my $cmp = $left[$i] <=> $right[$i];
return $cmp if $cmp;
$i++;
}
return ($left[$i] || 0) <=> ($right[$i] || 0);
}
sub split_path_with_prefix {
my ($path, $prefix) = @_;
my ($product, $version, $file);
if (($product, $version, $file) = $path =~ m#^${prefix}([A-Z]+)/(?:[-a-z]+[- ])?\1[- v]([0-9]+\.[0-9]+(?:\.[0-9]+)?)(/.+)?$#i) {
return ($product, $version, $file);
}
return;
}
print "\n+".("-"x76)."+\n";
print "|".(" "x31)."ACME Data Sync".(" "x31)."|\n";
print "+".("-"x76)."+\n\n";
open FIND_PRODUCTS, "-|", "ssh $homes find $doclib_path -maxdepth 2 -type d"
or die "open: ssh: $!";
my %keep = map { $_ => 1 } qw/PRODUCTA PRODUCTB PRODUCTC/;
my %available_products;
while (my $path = <FIND_PRODUCTS>) {
chomp $path;
my ($product, $version, $file) = split_path_with_prefix($path, $doclib_path);
next unless defined $product and $keep{$product};
$path = substr $path, length $doclib_path;
$available_products{$product}->{$version} = $path;
}
close FIND_PRODUCTS;
my %remote_major_versions;
while (my ($product, $versions) = each(%available_products)) {
my @versions = keys %{$versions};
# Compute major versions
@versions = sort {version_compare($a, $b)} @versions;
my %versions = map { m/^([0-9]+\.[0-9]+)/; $1 => $_ } @versions;
$remote_major_versions{$product} = \%versions;
}
my %local_versions;
open FIND_LOCAL_PRODUCTS, "-|", "find $sync_dir -maxdepth 2 -type d"
or die "open: find: $!";
while (my $path = <FIND_LOCAL_PRODUCTS>) {
chomp $path;
my ($product, $version, $file) = split_path_with_prefix($path, $sync_dir);
next unless defined $product;
$path = substr $path, length $sync_dir;
push @{$local_versions{$product}}, { version => $version, path => $path };
}
close FIND_LOCAL_PRODUCTS;
my %local_major_versions;
while (my ($product, $versions) = each(%local_versions)) {
my @versions = sort {version_compare($a, $b)} map { $_->{version} } @{$versions};
my %versions = map { m/^([0-9]+\.[0-9]+)/; $1 => $_ } @versions;
$local_major_versions{$product} = \%versions;
}
my %upgrades;
my %new_versions;
while (my ($product, $versions) = each(%remote_major_versions)) {
# Upgrade already fetched major versions
while (my ($major_version, $minor_version) = each(%{$versions})) {
if (exists $local_major_versions{$product} and exists $local_major_versions{$product}->{$major_version}) {
# Upgrade ?
if (version_compare($remote_major_versions{$product}->{$major_version}, $local_major_versions{$product}->{$major_version}) > 0) {
# Upgrade needed
$upgrades{$product}->{$local_major_versions{$product}->{$major_version}} = $minor_version;
}
}
}
# Fetch the last version of new products
my @sorted_versions = sort {-version_compare($a, $b)} keys %{$versions};
unless (defined $local_major_versions{$product}) {
push @{$new_versions{$product}}, $remote_major_versions{$product}->{$sorted_versions[0]};
next;
}
# Fetch new major versions of existing products
foreach my $version (@sorted_versions) {
last if exists $local_major_versions{$product}->{$version};
push @{$new_versions{$product}}, $remote_major_versions{$product}->{$version};
}
}
unless ((scalar keys %new_versions) + (scalar keys %upgrades)) {
print "Nothing to do !\n";
exit;
}
print "New Versions: \n";
foreach my $product (sort keys %keep) {
if (exists $upgrades{$product}) {
while (my ($major, $minor) = each(%{$upgrades{$product}})) {
print " $product".(" "x(16 - length $product))."$minor\n";
}
}
if (exists $new_versions{$product}) {
foreach my $version (@{$new_versions{$product}}) {
print " $product".(" "x(16 - length $product))."$version\n";
}
}
}
print "\nSync is starting...\n\n";
# Start RSYNC
pipe FROM_FATHER, TO_RSYNC0;
my $pid_rsync = fork();
die "fork: $!" unless defined $pid_rsync;
if ($pid_rsync == 0) { # Child: RSYNC
close TO_RSYNC0;
open STDIN, '<&', \*FROM_FATHER;
exec "rsync", "-aizy", "--progress", "--filter=. -", "$homes:$doclib_path", $sync_dir
or die "exec: rsync: $!";
# Child stops here
} # The father continues...
# Clean up...
close FROM_FATHER;
# Dump files to sync
my %seen_product_path;
while (my ($product, $versions) = each(%new_versions)) {
foreach my $version (@{$versions}) {
my $path = $available_products{$product}->{$version};
my ($product_path, @remaining_items) = split "/", $path;
unless (defined $seen_product_path{$product_path}) {
print TO_RSYNC0 "+ /$product_path\n";
$seen_product_path{$product_path} = 1;
}
print TO_RSYNC0 "+ /$path\n";
print TO_RSYNC0 "+ /$path/**\n";
}
}
print TO_RSYNC0 "- *\n";
# No more file to sync, notify RSYNC...
close TO_RSYNC0;
# Wait for RSYNC
waitpid $pid_rsync, 0;

41
testbed_js/index.html

@ -0,0 +1,41 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Dojo Testbed</title>
<script type="text/javascript"
src="dojo-release-1.3.3/dojo/dojo.js.uncompressed.js"
djConfig="parseOnLoad: true, isDebug: true"></script>
<script type="text/javascript">
function process() {
dojo.byId("stacktrace").innerHTML = "";
var code = dojo.byId('code').value;
try {
eval(code);
} catch (x) {
dojo.byId("stacktrace").innerHTML = x;
}
}
</script>
<style type="text/javascript">
#screen {
background-color: #AAAAAA;
}
</style>
</head>
<body>
<p>Your code</p>
<textarea rows="25" cols="80" id="code">
dojo.byId("screen").innerHTML = "";
dojo.require("dijit.form.TextBox");
new dijit.form.TextBox({style: "width: 100px"}, dojo.create("input", {}, dojo.byId("screen")));
</textarea>
<br><input type="button" onclick="process();" value="Execute !">
<p>Screen:</p>
<div id='screen'></div>
<p>Stacktrace (if any):</p>
<pre id='stacktrace'></pre>
</body>
</html>
Loading…
Cancel
Save