using System; using System.Data; using System.Data.SqlClient; using System.Globalization; using System.IO; using System.Text; using System.Xml; namespace ipn_tool { static class Program { static int Main(string[] args) { switch (args.Length) { case 2: if (args[0] == "-export_wm") return ExportWatermarks(args[1]); break; case 3: switch (args[0]) { case "-export_bl": return MergeBlacklist(args[1], args[2]); case "-export_tasks": return ExportTasks(null, args[1], args[2]); case "-check_ssvtest": return CheckSsvTest.Result(args[1], args[2]); } break; case 4: if (args[0] == "-export_task") return ExportTasks(args[1], args[2], args[3]); if (args[0] == "-check_wm") return Watermarks.CheckIfPresent(args[1], args[2], args[3]); break; case 5: if (args[0] == "-register_result") return RegisterResult(args[1], args[2], args[3], args[4]); break; } Console.WriteLine("IPN database tool. USAGE:"); Console.WriteLine("a) Export watermarks: ipn_tool -export_wm "); Console.WriteLine("b) Merge project with blacklist: ipn_tool -export_bl "); Console.WriteLine("c) Prepare for all actual end-user builds: ipn_tool -export_tasks "); Console.WriteLine("d) Prepare for actual end-user build: ipn_tool -export_task "); Console.WriteLine("e) Register build result: ipn_tool -register_result "); Console.WriteLine("f) Parse and check ssvtest.log: ipn_tool -check_ssvtest "); Console.WriteLine("g) Check if watermark present: ipn_tool -check_wm "); return 1; } private static int RegisterResult(string licenseId, string bambooBuildUrl, string success, string version) { int ret; using (var con = IpnConn()) { using (var cmd = new SqlCommand("dbo.RegisterBuildTaskResult", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 600; cmd.Parameters.AddWithValue("@licenseID", int.Parse(licenseId)); cmd.Parameters.AddWithValue("@bambooBuildUrl", bambooBuildUrl); cmd.Parameters.AddWithValue("@success", bool.Parse(success)); cmd.Parameters.AddWithValue("@version", version); con.Open(); ret = (int)cmd.ExecuteScalar(); Console.WriteLine("RegisterResult (0 - OK): {0}.", ret); } } return ret; } private enum Platform { Windows, Linux, Mac } private static Platform RunningPlatform() { switch (Environment.OSVersion.Platform) { case PlatformID.Unix: // Well, there are chances MacOSX is reported as Unix instead of MacOSX. // Instead of platform check, we'll do a feature checks (Mac specific root folders) if (Directory.Exists("/Applications") & Directory.Exists("/System") & Directory.Exists("/Users") & Directory.Exists("/Volumes")) return Platform.Mac; else return Platform.Linux; case PlatformID.MacOSX: return Platform.Mac; default: return Platform.Windows; } } private static int ExportTasks(string licenseId, string rootPath, string version) { var ret = 1; if (!rootPath.EndsWith(Path.DirectorySeparatorChar + @"licenses")) { Console.WriteLine(@"RootPath '{0}' check failed (should ends with {1}licenses)", rootPath, Path.DirectorySeparatorChar); } else using (var con = IpnConn()) { using (var cmd = new SqlCommand("dbo.ExportBuildTaskInfo", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 600; cmd.Parameters.AddWithValue("@licenseID", licenseId == null ? DBNull.Value : (object)int.Parse(licenseId)); cmd.Parameters.AddWithValue("@filterOutVersion", version); cmd.Parameters.AddWithValue("@filterByOperatingSystem", RunningPlatform().ToString()); con.Open(); var cnt = 0; using (var r = cmd.ExecuteReader()) { if (licenseId == null) { Directory.Delete(rootPath, true); } while (r.Read()) { ++cnt; var lId = r.GetInt32(0); var task = r.GetString(1); var key = r.GetString(2); var taggant = r.GetString(3); Directory.CreateDirectory(Path.Combine(rootPath, lId.ToString(CultureInfo.InvariantCulture))); var taskIniName = Path.Combine(rootPath, lId.ToString(), "task.ini"); using (var taskIni = new StreamWriter(new FileStream(taskIniName, FileMode.OpenOrCreate, FileAccess.Write), new UTF8Encoding(false))) { var doc = new XmlDocument(); doc.LoadXml(task); // ReSharper disable once PossibleNullReferenceException foreach (XmlAttribute attr in doc.DocumentElement.Attributes) { taskIni.WriteLine("{0}={1}", attr.Name, attr.Value); } } var keyName = Path.Combine(rootPath, lId.ToString(), "VMProtect.key"); File.WriteAllText(keyName, key); var tagName = Path.Combine(rootPath, lId.ToString(), "taggant.pem"); File.WriteAllText(tagName, String.Join("\r\n", taggant.Split(new[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries))); } Console.WriteLine("ExportTasks: {0} item(s) exported.", cnt); if (cnt > 0) ret = 0; } } } return ret; } private static int MergeBlacklist(string filenameIn, string filenameOut) { var ret = 1; using (var con = IpnConn()) { using (var cmd = new SqlCommand("dbo.ExportBlacklist", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 600; con.Open(); var xml = new XmlDocument(); xml.Load(filenameIn); var lm = xml.SelectSingleNode("Document/LicenseManager"); if (lm != null) { lm.InnerXml = ""; var cnt = 0; using (var r = cmd.ExecuteReader()) { while (r.Read()) { XmlNode license = xml.CreateElement("License"); XmlAttribute adate = xml.CreateAttribute("Date"); adate.Value = r.GetDateTime(1).ToString("yyyy-MM-dd"); XmlAttribute aname = xml.CreateAttribute("CustomerName"); aname.Value = r.GetString(2); XmlAttribute aemail = xml.CreateAttribute("CustomerEmail"); aemail.Value = r.GetString(3); XmlAttribute akey = xml.CreateAttribute("SerialNumber"); akey.Value = r.GetString(4); if (license.Attributes != null) { license.Attributes.Append(adate); license.Attributes.Append(aname); license.Attributes.Append(aemail); license.Attributes.Append(akey); XmlAttribute ablocked = xml.CreateAttribute("Blocked"); ablocked.Value = "1"; license.Attributes.Append(ablocked); } lm.AppendChild(license); cnt++; } } xml.Save(filenameOut); Console.WriteLine("MergeBlacklist: {0} item(s) exported.", cnt); if (cnt > 0) ret = 0; } } } return ret; } private static int ExportWatermarks(string filenameOut) { var ret = 1; using (var con = IpnConn()) { using (var cmd = new SqlCommand("dbo.ExportWatermarks", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 600; con.Open(); var xml = new XmlDocument(); xml.InsertBefore(xml.CreateXmlDeclaration("1.0",null,null), xml.DocumentElement); XmlNode rootNode = xml.CreateElement("Document"); xml.AppendChild(rootNode); XmlNode wms = xml.CreateElement("Watermarks"); rootNode.AppendChild(wms); int cnt = 0; using (var r = cmd.ExecuteReader()) { while (r.Read()) { XmlNode wm = xml.CreateElement("Watermark"); XmlAttribute aid = xml.CreateAttribute("Id"); aid.Value = cnt.ToString(CultureInfo.InvariantCulture); XmlAttribute aname = xml.CreateAttribute("Name"); aname.Value = r.GetString(0); XmlAttribute areadablename = xml.CreateAttribute("ReadableName"); areadablename.Value = r.GetString(1); XmlAttribute aemail = xml.CreateAttribute("EMail"); aemail.Value = r.GetString(2); wm.InnerText = r.GetString(3); if (wm.Attributes != null) { wm.Attributes.Append(aid); wm.Attributes.Append(aname); wm.Attributes.Append(areadablename); wm.Attributes.Append(aemail); if (r.GetInt32(4) == 0) { XmlAttribute aenabled = xml.CreateAttribute("Enabled"); aenabled.Value = "0"; wm.Attributes.Append(aenabled); } } wms.AppendChild(wm); cnt++; } } XmlAttribute acnt = xml.CreateAttribute("Id"); acnt.Value = cnt.ToString(CultureInfo.InvariantCulture); if (wms.Attributes != null) wms.Attributes.Append(acnt); xml.Save(filenameOut); Console.WriteLine("ExportWatermarks: {0} item(s) exported.", cnt); if (cnt > 0) ret = 0; } } return ret; } private static SqlConnection IpnConn() { return new SqlConnection("server=scb-serv;database=ipn;user id=ipn_reader;password=rAqiEiGBOh39;Connection Timeout=300"); } } }