142 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.IO;
 | 
						|
using System.Linq;
 | 
						|
using System.Text;
 | 
						|
using System.Threading.Tasks;
 | 
						|
using Newtonsoft.Json;
 | 
						|
 | 
						|
namespace ConsoleApplication1
 | 
						|
{
 | 
						|
	class Command
 | 
						|
	{
 | 
						|
		public string Name { get; set; }
 | 
						|
		public Dictionary<string, object>  Arguments { get; set; }
 | 
						|
	}
 | 
						|
	class ExecutionPlan
 | 
						|
	{
 | 
						|
		public List<string> Scripts { get; set; }
 | 
						|
		public List<Command> Commands { get; set; }
 | 
						|
		public int RebootOnCompletion { get; set; }
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	class Program
 | 
						|
	{
 | 
						|
		static void Main(string[] args)
 | 
						|
		{
 | 
						|
			if (args.Length < 1 || args.Length > 2)
 | 
						|
			{
 | 
						|
				Console.WriteLine("Usage: ExecutionPlanGenerator inputfile [outputfile]");
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			var outFile = args.Length == 2 ? args[1] : null;
 | 
						|
 | 
						|
			var plan = new ExecutionPlan {
 | 
						|
				Scripts = new List<string>(),
 | 
						|
				Commands = new List<Command>()
 | 
						|
			};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
			var lines = File.ReadAllLines(args[0]);
 | 
						|
 | 
						|
 | 
						|
			foreach (var statement in lines
 | 
						|
				.Select(t => t.Split(new[] { ' ', '\t' }, 2))
 | 
						|
				.Where(t => t.Length == 2)
 | 
						|
				.Select(t => new Tuple<string, string>(t[0].Trim().ToLower(), t[1].Trim())))
 | 
						|
			{
 | 
						|
				switch (statement.Item1)
 | 
						|
				{
 | 
						|
					case "include":
 | 
						|
						Include(statement.Item2, plan, args[0]);
 | 
						|
						break;
 | 
						|
					case "call":
 | 
						|
						Call(statement.Item2, plan);
 | 
						|
						break;
 | 
						|
					case "reboot":
 | 
						|
						plan.RebootOnCompletion = int.Parse(statement.Item2);
 | 
						|
						break;
 | 
						|
					case "out":
 | 
						|
						if (args.Length < 2)
 | 
						|
						{
 | 
						|
							var path = statement.Item2;
 | 
						|
							if (!Path.IsPathRooted(path))
 | 
						|
							{
 | 
						|
								path = Path.Combine(Path.GetDirectoryName(args[0]), path);
 | 
						|
							}
 | 
						|
							outFile = path;
 | 
						|
						}
 | 
						|
						break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			var data = JsonConvert.SerializeObject(plan, Formatting.Indented);
 | 
						|
			if (outFile == null)
 | 
						|
			{
 | 
						|
				Console.WriteLine(data);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				File.WriteAllText(outFile, data);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private static void Call(string line, ExecutionPlan plan)
 | 
						|
		{
 | 
						|
			var parts = line.Split(new[] { ' ', '\t'}, 2);
 | 
						|
			var command = new Command() {
 | 
						|
				Name = parts[0].Trim(),
 | 
						|
				Arguments = new Dictionary<string, object>()
 | 
						|
			};
 | 
						|
 | 
						|
 | 
						|
			if (parts.Length == 2)
 | 
						|
			{
 | 
						|
				foreach (var x in parts[1]
 | 
						|
					.Split(',')
 | 
						|
					.Select(t => t.Split('='))
 | 
						|
					.Where(t => t.Length == 2)
 | 
						|
					.Select(t => new KeyValuePair<string, string>(t[0].Trim(), t[1].Trim())))
 | 
						|
				{
 | 
						|
					object value = null;
 | 
						|
					long num;
 | 
						|
					bool boolean;
 | 
						|
					if (x.Value.StartsWith("\""))
 | 
						|
					{
 | 
						|
						value = x.Value.Substring(1, x.Value.Length - 2);
 | 
						|
					}
 | 
						|
					else if (long.TryParse(x.Value, out num))
 | 
						|
					{
 | 
						|
						value = num;
 | 
						|
					}
 | 
						|
					else if (bool.TryParse(x.Value, out boolean))
 | 
						|
					{
 | 
						|
						value = boolean;
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						continue;
 | 
						|
					}
 | 
						|
					command.Arguments.Add(x.Key, value);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			plan.Commands.Add(command);
 | 
						|
		}
 | 
						|
 | 
						|
		private static void Include(string file, ExecutionPlan plan, string dslPath)
 | 
						|
		{
 | 
						|
			var path = file;
 | 
						|
			if (!Path.IsPathRooted(file))
 | 
						|
			{
 | 
						|
				path = Path.Combine(Path.GetDirectoryName(dslPath), path);
 | 
						|
			}
 | 
						|
 | 
						|
			var text = File.ReadAllText(path, Encoding.UTF8);
 | 
						|
			plan.Scripts.Add(Convert.ToBase64String(Encoding.UTF8.GetBytes(text)));
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |