From d2270fcedf70fffb08803e61d22ceca5e5aa5c81 Mon Sep 17 00:00:00 2001 From: Michael Giagnocavo Date: Wed, 29 Jul 2009 02:18:57 +0000 Subject: [PATCH] First pass at F# easyroute; appears to work on Windows and Linux git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14406 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- .../managed/examples/easyroute/App.config | 10 ++ .../examples/easyroute/EasyRoute.fsproj | 87 +++++++++++++++++ .../managed/examples/easyroute/EasyRoute.sln | 20 ++++ .../managed/examples/easyroute/EasyRoute.suo | Bin 0 -> 9728 bytes .../managed/examples/easyroute/easyroute.dll | Bin 0 -> 19968 bytes .../examples/easyroute/easyroute.dll.config | 10 ++ .../managed/examples/easyroute/easyroute.fs | 91 ++++++++++++++++++ .../managed/examples/easyroute/easyroute.pdb | Bin 0 -> 22016 bytes 8 files changed, 218 insertions(+) create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/App.config create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.fsproj create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.sln create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.suo create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll.config create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.fs create mode 100644 src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.pdb diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/App.config b/src/mod/languages/mod_managed/managed/examples/easyroute/App.config new file mode 100644 index 0000000000..214f616f9e --- /dev/null +++ b/src/mod/languages/mod_managed/managed/examples/easyroute/App.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.fsproj b/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.fsproj new file mode 100644 index 0000000000..3008e6f083 --- /dev/null +++ b/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.fsproj @@ -0,0 +1,87 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {7b5259d4-eaa0-4bcc-9eac-8dc054a4a092} + Library + fs_easyroute + easyroute + v3.5 + EasyRoute + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + + + false + + + + + 4 + + + + + + + + FreeSWITCH.Managed + FreeSWITCH.Managed.dll + False + ..\..\FreeSWITCH.Managed.dll + True + + + FSharp.PowerPack + FSharp.PowerPack.dll + False + + + + + + System.Configuration + System.configuration.dll + False + + + 3.5 + + + System.Data + System.Data.dll + False + + + System.Transactions + System.Transactions.dll + False + + + + + \ No newline at end of file diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.sln b/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.sln new file mode 100644 index 0000000000..3d2b6acdae --- /dev/null +++ b/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "EasyRoute", "EasyRoute.fsproj", "{7B5259D4-EAA0-4BCC-9EAC-8DC054A4A092}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7B5259D4-EAA0-4BCC-9EAC-8DC054A4A092}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B5259D4-EAA0-4BCC-9EAC-8DC054A4A092}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B5259D4-EAA0-4BCC-9EAC-8DC054A4A092}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B5259D4-EAA0-4BCC-9EAC-8DC054A4A092}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.suo b/src/mod/languages/mod_managed/managed/examples/easyroute/EasyRoute.suo new file mode 100644 index 0000000000000000000000000000000000000000..354e68d20154e37c13f57bad4f5f347db8854ed7 GIT binary patch literal 9728 zcmeI1&u>&!6vuBt5by^-)T)R&A|fi(f>wSh(hemWXn?j9Oh$2-UzAQ~Ci4TRV1f%5 zE=-IYH-=z>2@4k*H<}pZf|W7C!ao2LSFVhEsh{tC@6tEZ>CEf2R+{uq&bvR}efQjZ z?m6Fc?wuRgSKs{No3+22nzY9(Hn+x?o27yFHp(KKRvEL1g6g-%$H%=!V<;}9c_e{< znCo5s9%`?bK+B-Jq2R> z^yL~^1G;-lPie+MYmsGh$Q023oVAcq%6T+D4h^IIW4ulC%TmkHYoE26xYb~dBTYPJ zzZk)yb0$$`J6XO+PWnb(P8gW9V-Hv?^lVcjPL+OptN;AvKYuxJ>8p=_8oYA(Q*Sj> z^}h4k2arv|N8vL_GifoWpJ&D#;MvR@2>+y3!W89URwx^F{T%+Mm_?aANrAt^@Yb#t zU8e?l1pdO7b|@@=#W=z(r6KqYq8-B2lRVFv0n1skNKk5)))NH_^Mrq4`76#6)++5Z zThZN4^D@uvpx72lX%H=8ODWnC<^ zhMy#U%vw^yoTApu_lb+-FWy1{HANhD3M4E&DHKnbI!7kGP6HLYss!7MwF8WUt(BVoPEu(zPQ!85^dhQ6Xbg5 zwX1J!UHhYWslX`W69cmq!HpS3vK4ryXbYd59fbd)eou`fyh>O(c&L`4MRSc1-N|ct z^X;?9B6}`DX=WS&g%o{C9$9MgJryLSC@=y-bbt>r`b2pq7_&_7WNOUCIpC_8G|NiT z@SouA>i_2)yqRgo=Uxs%rv!4*UQJKym~J5XrWk1P?pCTAsD$lT`(2~@)c7;Te#;|H zoHgo=(+d6t{eLb0J|rnD&^h!N7NB@651LGc!kb&bU&RW8{$hkD!i=Itoov8Tt0NP4 z`cgz1^hlh)Ebi+36c&H0*Plm+Dy-QXIk@J-tX$EMI}g^AL8tG3btVhTU*~ki07}98 zJ+EbY&zXKNzum|Bvv!q2KE?RLzryXi0b^d{Hd1Lf(UCFdiHdqm7g16d=(vxzEqH-$ zew{XI>H#UEly=%ym3Gi8%G)mbc3bM??Kbm1*qTJUs`={VQHIY1SDkjN`&4U(`YyBQ z*4dofZst1Mt5sw#Pb8n2G8d4`)cWV{Lfq+!$xKQezWz%>Vf9ba`ao8v~@!#oAd+$=bef=P%v2gykQ^pKkDMj3^_DwH?J8(pZ*cuE?#2 zxg{BQ!VX@iHk%sW5s1GppzYI{i=y6c<|+L+gDyvzd&bUonZ2E=)%5DochghpNW_@0 z`SwnVUMEMi+LscjI~-Za7=zsF||CeyrGA7@{Em>^iTFAdk(9A8|eF^ zKdf$N#5HbXsN`+T_fER?Jf8odpUM8j*QM&W^=m=>e*^7FTHZO)mLA9Q zv!HIA6_4=LEua_wdjCO%wLjgSSC1@S^;0L!H|oD?snzXDSpF?BY4Fi}<}d7)W*>>} zilvLGRO#$+IdLjhDkfs1`D82`&t)p{Osb^XiP3nDax&)f-gEKMLY9}k@zPj-zEV!b zx(kJlL_U`umf4u4ujVS*>>d?4K+O`16wHcZ){(Z_S;fR-HFwXswPEel{6I|U)k3=S GCGaoVSo}Qz literal 0 HcmV?d00001 diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll b/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll new file mode 100644 index 0000000000000000000000000000000000000000..3665f8c6bba282d007f029cdacfe23dc19df8883 GIT binary patch literal 19968 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 S7C57}k+`q?kI(;y7Wm&fI(fDL literal 0 HcmV?d00001 diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll.config b/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll.config new file mode 100644 index 0000000000..214f616f9e --- /dev/null +++ b/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.dll.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.fs b/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.fs new file mode 100644 index 0000000000..d3806b4711 --- /dev/null +++ b/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.fs @@ -0,0 +1,91 @@ +// To get unixodbc to work on Mono Linux, you may need to create an odbc32.dll link: ln -s /lib64/libodbc.so /lib64/odbc32.dll +open System +open System.Data +open FreeSWITCH + +type QueryResult = { dialstring: string; group: string; acctcode: string; limit: int; translated: string } + +module easyroute = + let getAppSetting (name:string) = match Configuration.ConfigurationManager.AppSettings.Get name with null -> "" | x -> x + let connString = getAppSetting "connectionString" + let defaultProfile = getAppSetting "defaultProfile" + let defaultGateway = getAppSetting "defaultGateway" + let query = match getAppSetting "customQuery" with + | "" -> "SELECT gateways.gateway_ip, gateways.group, gateways.limit, gateways.techprofile, numbers.acctcode, numbers.translated from gateways, numbers where numbers.number = %number% and numbers.gateway_id = gateways.gateway_id;" + | x -> x + let configOk = [ connString; defaultProfile; defaultGateway; query; ] |> List.forall (String.IsNullOrEmpty >> not) + + let formatDialstring number gateway profile separator = + match separator with + | None -> sprintf "%s/%s%s" profile number gateway + | Some s -> sprintf "%s/%s%s%s" profile number s gateway + + let getDefaultResult number sep = { + dialstring = formatDialstring number defaultGateway defaultProfile sep; + limit = 9999; group = ""; acctcode = ""; translated = number; } + + let readResult (r: IDataReader) number sep = + let defString def = function null | "" -> def | s -> s + let gw = defString defaultGateway <| r.GetString(0) + let group = r.GetString(1) + let limit = match r.GetInt32(2) with 0 -> 9999 | x -> x + let profile = defString defaultProfile <| r.GetString(3) + let acctcode = r.GetString(4) + let translated = r.GetString(5) + let dialstring = formatDialstring number gw profile sep + { dialstring = dialstring; limit = limit; group = group; acctcode = acctcode; translated = translated; } + + let lookup (number: string) sep = + try + let query = query.Replace("%number%", sprintf "'%s'" (number.Replace(@"\'", "'").Replace("'", "''"))) // Don't use params cause some odbc drivers are awesome + Log.WriteLine(LogLevel.Debug, "EasyRoute query prepared: {0}", query) + use conn = new Odbc.OdbcConnection(connString) + use comm = new Odbc.OdbcCommand(query, conn) + conn.Open() + use reader = comm.ExecuteReader CommandBehavior.SingleRow + match reader.Read() with + | true -> readResult reader number sep + | false -> Log.WriteLine(LogLevel.Error, "No records for {0}; setting default route.", number) + getDefaultResult number sep + with ex -> Log.WriteLine(LogLevel.Error, "Exception getting route for {0}. Setting default route. Exception: {1}", number, ex.ToString()) + getDefaultResult number sep + + // Returns tuple: number * separator option * field option + let parseArgs args = + let args = String.split [' '] args + let num = List.hd args + let opt = Map.of_list (List.tl args |> List.map (fun x -> match x.Split([|'='|], 2) with + | [|n;v|] -> n, Some v + | arr -> arr.[0], None)) + (num, defaultArg (opt.TryFind "separator") (Some "@"), defaultArg (opt.TryFind "field") (None)) +open easyroute + +type EasyRoute() = + interface ILoadNotificationPlugin with + member x.Load() = + if not configOk then Log.WriteLine(LogLevel.Alert, "EasyRoute configuration is missing values.") + configOk + + interface IApiPlugin with + member x.ExecuteBackground ctx = + Log.WriteLine(LogLevel.Error, "Background execution not supported for EasyRoute.") + member x.Execute ctx = + let num, sep, field = parseArgs ctx.Arguments + let res = lookup num sep + let sw = ctx.Stream.Write + match field with + | None -> sw "Number \tLimit \tGroup \tAcctCode \tDialstring\n" + sw (sprintf "%-10s\t%-10d\t%-10s\t%-10s\t%s\n" res.translated res.limit res.group res.acctcode res.dialstring) + | Some "dialstring" -> sw res.dialstring + | Some "translated" -> sw res.translated + | Some "limit" -> sw (string res.limit) + | Some "group" -> sw res.group + | Some "acctcode" -> sw res.acctcode + | _ -> sw "Invalid input!\n" + + interface IAppPlugin with + member x.Run ctx = + let num, sep, field = parseArgs ctx.Arguments + let res = lookup num sep + [ "easy_destnum", res.translated; "easy_dialstring", res.dialstring; "easy_group", res.group; "easy_limit", string res.limit; "easy_acctcode", res.acctcode] + |> List.iter ctx.Session.SetVariable diff --git a/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.pdb b/src/mod/languages/mod_managed/managed/examples/easyroute/easyroute.pdb new file mode 100644 index 0000000000000000000000000000000000000000..010b2d60fd33ccad51ea54039855380610add9f5 GIT binary patch literal 22016 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 jR3s`MsCb~_frdJ7%xC literal 0 HcmV?d00001