public bool Mount(string repoRoot) { string error; string warning; if (!GvFltFilter.IsHealthy(out error, out warning, this.tracer)) { return(false); } this.CheckAntiVirusExclusion(this.tracer, repoRoot); string unusedMessage; if (!GvFltFilter.TryAttach(this.tracer, repoRoot, out unusedMessage)) { return(false); } if (!this.CallGVFSMount(repoRoot)) { this.tracer.RelatedError("Unable to start the GVFS.Mount process."); return(false); } string errorMessage; if (!GVFSEnlistment.WaitUntilMounted(repoRoot, out errorMessage)) { this.tracer.RelatedError(errorMessage); return(false); } return(true); }
protected void CheckGVFltHealthy() { string error; if (!GvFltFilter.IsHealthy(out error, tracer: null)) { this.ReportErrorAndExit(tracer: null, error: error); } }
private void LogGvFltTimeout() { int gvfltTimeoutMs; string error; if (GvFltFilter.TryGetTimeout(out gvfltTimeoutMs, out error)) { this.WriteMessage(string.Format("GvFlt timeout (ms) = {0}", gvfltTimeoutMs)); } else { this.WriteMessage(string.Format("Failed to GvFlt timeout, error: {0}", error)); } }
protected void CheckGVFltHealthy() { string error; string warning; if (!GvFltFilter.IsHealthy(out error, out warning, tracer: null)) { this.ReportErrorAndExit(error); } if (!string.IsNullOrEmpty(warning)) { this.Output.WriteLine(warning); } }
public void Run() { string errorMessage; NamedPipeMessages.CompletionState state = NamedPipeMessages.CompletionState.Success; if (!GvFltFilter.TryAttach(this.tracer, this.request.EnlistmentRoot, out errorMessage)) { state = NamedPipeMessages.CompletionState.Failure; this.tracer.RelatedError("Unable to attach filter to volume. Enlistment root: {0} \nError: {1} ", this.request.EnlistmentRoot, errorMessage); } this.WriteToClient(new NamedPipeMessages.AttachGvFltRequest.Response() { State = state, ErrorMessage = errorMessage }); }
public bool Mount(string repoRoot) { string error; if (!GvFltFilter.IsHealthy(out error, this.tracer)) { return(false); } // Ensure the repo is excluded from antivirus before calling 'gvfs mount' // to reduce chatter between GVFS.exe and GVFS.Service.exe string errorMessage; bool isExcluded; ExcludeFromAntiVirusHandler.CheckAntiVirusExclusion(this.tracer, repoRoot, out isExcluded, out errorMessage); string unusedMessage; if (!GvFltFilter.TryAttach(this.tracer, repoRoot, out unusedMessage)) { return(false); } if (!this.CallGVFSMount(repoRoot)) { this.tracer.RelatedError("Unable to start the GVFS.exe process."); return(false); } if (!GVFSEnlistment.WaitUntilMounted(repoRoot, false, out errorMessage)) { this.tracer.RelatedError(errorMessage); return(false); } return(true); }
protected override void Execute(GVFSEnlistment enlistment) { string errorMessage = null; if (!HooksInstaller.InstallHooks(enlistment, out errorMessage)) { this.ReportErrorAndExit("Error installing hooks: " + errorMessage); } string mountExeLocation = null; using (JsonEtwTracer tracer = new JsonEtwTracer(GVFSConstants.GVFSEtwProviderName, "PreMount")) { CacheServerInfo cacheServer = this.ResolvedCacheServer ?? CacheServerResolver.GetCacheServerFromConfig(enlistment); tracer.AddLogFileEventListener( GVFSEnlistment.GetNewGVFSLogFileName(enlistment.GVFSLogsRoot, GVFSConstants.LogFileTypes.MountVerb), EventLevel.Verbose, Keywords.Any); tracer.WriteStartEvent( enlistment.EnlistmentRoot, enlistment.RepoUrl, cacheServer.Url, new EventMetadata { { "Unattended", this.Unattended }, { "IsElevated", ProcessHelper.IsAdminElevated() }, }); // TODO 1050199: Once the service is an optional component, GVFS should only attempt to attach // GvFlt via the service if the service is present\enabled if (!GvFltFilter.TryAttach(tracer, enlistment.EnlistmentRoot, out errorMessage)) { if (!this.ShowStatusWhileRunning( () => { return(this.AttachGvFltThroughService(enlistment, out errorMessage)); }, "Attaching GvFlt to volume")) { this.ReportErrorAndExit(tracer, errorMessage); } } RetryConfig retryConfig = null; GVFSConfig gvfsConfig = this.DownloadedGVFSConfig; if (!this.SkipVersionCheck) { string authErrorMessage = null; if (!this.ShowStatusWhileRunning( () => enlistment.Authentication.TryRefreshCredentials(tracer, out authErrorMessage), "Authenticating")) { this.Output.WriteLine(" WARNING: " + authErrorMessage); this.Output.WriteLine(" Mount will proceed, but new files cannot be accessed until GVFS can authenticate."); } if (gvfsConfig == null) { if (retryConfig == null) { retryConfig = this.GetRetryConfig(tracer, enlistment); } gvfsConfig = this.QueryGVFSConfig(tracer, enlistment, retryConfig); } this.ValidateClientVersions(tracer, enlistment, gvfsConfig, showWarnings: true); CacheServerResolver cacheServerResolver = new CacheServerResolver(tracer, enlistment); cacheServer = cacheServerResolver.ResolveNameFromRemote(cacheServer.Url, gvfsConfig); this.Output.WriteLine("Configured cache server: " + cacheServer); } this.InitializeLocalCacheAndObjectsPaths(tracer, enlistment, retryConfig, gvfsConfig, cacheServer); if (!this.ShowStatusWhileRunning( () => { return(this.PerformPreMountValidation(tracer, enlistment, out mountExeLocation, out errorMessage)); }, "Validating repo")) { this.ReportErrorAndExit(tracer, errorMessage); } } if (!this.ShowStatusWhileRunning( () => { return(this.TryMount(enlistment, mountExeLocation, out errorMessage)); }, "Mounting")) { this.ReportErrorAndExit(errorMessage); } if (!this.Unattended) { if (!this.ShowStatusWhileRunning( () => { return(this.RegisterMount(enlistment, out errorMessage)); }, "Registering for automount")) { this.Output.WriteLine(" WARNING: " + errorMessage); } } }
protected override void Execute(GVFSEnlistment enlistment) { string errorMessage = null; if (!HooksInstaller.InstallHooks(enlistment, out errorMessage)) { this.ReportErrorAndExit("Error installing hooks: " + errorMessage); } if (!enlistment.TryConfigureAlternate(out errorMessage)) { this.ReportErrorAndExit("Error configuring alternate: " + errorMessage); } using (JsonEtwTracer tracer = new JsonEtwTracer(GVFSConstants.GVFSEtwProviderName, "PreMount")) { tracer.AddLogFileEventListener( GVFSEnlistment.GetNewGVFSLogFileName(enlistment.GVFSLogsRoot, GVFSConstants.LogFileTypes.Mount), EventLevel.Verbose, Keywords.Any); if (!this.SkipVersionCheck) { string authErrorMessage = null; if (!this.ShowStatusWhileRunning( () => enlistment.Authentication.TryRefreshCredentials(tracer, out authErrorMessage), "Authenticating")) { this.Output.WriteLine(" WARNING: " + authErrorMessage); this.Output.WriteLine(" Mount will proceed, but new files cannot be accessed until GVFS can authenticate."); } } RetryConfig retryConfig = null; string error; if (!RetryConfig.TryLoadFromGitConfig(tracer, enlistment, out retryConfig, out error)) { this.ReportErrorAndExit("Failed to determine GVFS timeout and max retries: " + error); } GVFSConfig gvfsConfig; CacheServerInfo cacheServer; using (ConfigHttpRequestor configRequestor = new ConfigHttpRequestor(tracer, enlistment, retryConfig)) { gvfsConfig = configRequestor.QueryGVFSConfig(); } if (!CacheServerInfo.TryDetermineCacheServer(null, enlistment, gvfsConfig.CacheServers, out cacheServer, out error)) { this.ReportErrorAndExit(error); } tracer.WriteStartEvent( enlistment.EnlistmentRoot, enlistment.RepoUrl, cacheServer.Url); if (!GvFltFilter.TryAttach(tracer, enlistment.EnlistmentRoot, out errorMessage)) { if (!this.ShowStatusWhileRunning( () => { return(this.AttachGvFltThroughService(enlistment, out errorMessage)); }, "Attaching GvFlt to volume")) { this.ReportErrorAndExit(errorMessage); } } this.ValidateClientVersions(tracer, enlistment, gvfsConfig); } if (!this.ShowStatusWhileRunning( () => { return(this.TryMount(enlistment, out errorMessage)); }, "Mounting")) { this.ReportErrorAndExit(errorMessage); } if (!this.ShowStatusWhileRunning( () => { return(this.RegisterMount(enlistment, out errorMessage)); }, "Registering for automount")) { this.Output.WriteLine(" WARNING: " + errorMessage); } }